顯示具有 Mitsubishi PLC 三菱Ethernet protocol C# coding系列 標籤的文章。 顯示所有文章
顯示具有 Mitsubishi PLC 三菱Ethernet protocol C# coding系列 標籤的文章。 顯示所有文章

2016年12月2日 星期五

SLMP通訊一:PLC的設定

首先你先要有顆PLC能支援Ethernet(廢話), 本系列都是以FX5U為範例

因為使用FX5U所以還需要安裝GX Works 3

在你的PLC專案內,開啟左邊的"參數" -> FX5UCPU -> 模組參數 -> 乙太網路端口  視窗
在"對象設備連接配置設置" 點選 <詳細設置> ,會開啟下圖的視窗
並新增SLMP連接設備加入列表中 ,記得選取"TCP"協議 (這是我們要用的通訊方式) ,然後設定Port 9000, (這是我的設定) ,如圖內No.2 項目.
其他的項目可以不用管,這樣SLMP的設定就完成了! 輕鬆簡單

存檔後,記得要將剛剛改好了參數寫入PLC,  寫完之後PLC還要作 Reset(切記切記!!)
這樣你的PLC算大功告成!

另外一提的是GX Works 3有乙太網路診斷的功能,可以監控PLC的連線狀況,非常方便

以上就是PLC的SLMP設定啦!!收工!

PLC Ethernet SLMP通訊格式 C#

前言.
    開始講解前先說明這系列(SLMP)的說明,主要是紀錄自己在寫protocol時碰到的問題或想法.
人老了很容易忘記事情,只好記錄下來了.
如果你對c#是完全陌生的話,此系列並不會講解太詳細(抱歉,人很懶).
當然如果您發現有錯誤的地方,也非常歡迎糾正喔!
以上是廢話.

這系列大致會分成幾篇
1.PLC的設定方法
2.TCP的編寫
3.SLMP的編寫
4.測試

使用的PLC是:Mitsubishi FX5U
通訊格式是:SLMP (廢話)

因為手邊目前只有這顆CPU有支援Ethernet ,所以只能測試一種CPU,有點可惜
以後有機會再測試Q系列的


2016年11月30日 星期三

PLC SLMP Protocol的用法 (一)



在Receive loop的動作於一般TCP server的動作不同
一般server都會有ack的回應封包,所以可以判定資料封包是否有收完全

SLMP沒有這動作
PLC單純只會回應client端send的封包,資料封包丟完後無ACK的
簡單講也就是non-handshaking 的server啦

以下是code

private void OnReceive(System.IAsyncResult ar)
        {
            try
            {
                // Read data from the remote device.
                int bytesRead = tcpAsyn.EndReceive(ar);

                if (bytesRead > 0)
                {
                    // There might be more data, so store the data received so far.
                    asb.Append(Encoding.ASCII.GetString(tcpAsyClBuffer, 0, bytesRead));

                    // Get the rest of the data.
                    tcpAsyn.BeginReceive(tcpAsyClBuffer, 0,tcpAsyClBuffer.Length , 0,
                        new AsyncCallback(OnReceive), tcpAsyn);
                }
                else
                {
                    // All the data has arrived; put it in response.
                    if (asb.Length > 1)
                    {
                        response = asb.ToString();
                    }
                    //add do_packet
                    do_packet();
                    // Signal that all bytes have been received.
                    receiveDone.Set();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                //Console.ReadKey(true);
            }
        }

上面的一般tcp server的用法
這樣是無法正常運作的喔