2019年5月21日 星期二

以C# 實作MODBUS TCP

最近在弄MODBUS TCP的東西,但又不想引用第三方的LIBRARY,所以就從底層做起。
簡單來說, 用socket傳送 byte array就搞定了。 不好處理的是byte array的設定,以下是簡易的設定說明。


寫入output register

MODBUS TCP的 byte array如下:

 byte[] array=
{
0,0,// transaction id , no use in this case
0,0,// id no use in this case
0,0x6,// length of data
0,// device number, no use in this case
0x6,//function code
0x1F, 0xBB,// Start Address
0x0,0x1//Force data
};

解釋一下這些的意義:
0,0,// transaction id , no use in this case
在MODBUS TCP可以不指定,或是任意指定也可,SLAVE裝置回傳的前兩個byte就是這兩碼。
0,0,// id no use in this case
這個也是可以隨意指定。
0,0x6,// length of data 這兩個byte代表要傳輸的訊息的byte length,


0,// device number, no use in this case
0x6,//function code
0x1F, 0xBB,// Start Address
0x0,0x1//Force data

到這裡總共有6個bytes,所以長度為6

0,// device number, no use in this case
裝置號碼,在有IP位置的情況下可以不用設定。

0x6,//function code
這個就是重點了,MODBUS的指令,
這個是寫入特定output register的代碼,
不同廠商的function code有些許不同,但大致如下:

讀取多個registers : 0x3
讀取單個 input register : 0x4
寫入 coil : 0x5
寫入單個 output register : 0x6
(其他的網路上都找得到,這邊只列常用的)

0x1F, 0xBB,// Start Address
這邊是指定要寫入的位址,每家廠商定義的位址都不一樣,得自己慢慢看原廠手冊。

0x0,0x1//Force data
這邊是讓該位址ON的指令,每家廠商設定不一樣,得自己慢慢看原廠手冊。


讀取register狀態

 byte[] array=
{
0,0,// transaction id , no use in this case
0,0,// id no use in this case
0,0x6,// length of data
0,// device number, no use in this case
0x3,//function code
0x00, 0xAB,// Start Address
0x0,0x2//Number of registers
};


大部分都和上面一樣,不同的是function code,這邊是0x3,另外是最後的兩個bytes,是一對High/Low byte,用來指定要讀取的register的數量。在這邊Address和register是同義。
回傳的資訊就是該Address的IO狀態了。

以下是簡易實作的程式碼:

var socket=new Socket( SocketType.Stream, ProtocolType.Tcp);
var Addr=new IPAddress (new byte[]{168,192,1,1});//slave device ip
int port=502;
var IEP = new IPEndPoint(Addr,port);

socket.Connect(IEP as EndPoint);

if(socket.Connected)
{
socket.send(array);
var buffer=new byte[1024];
int L= socket.recieve(buffer);
}

以上就是Modbus TCP的實作。

2021.Mar.24 Add:
Modbus specification:
https://modbus.org/specs.php











沒有留言:

張貼留言

同軸度 Coaxiality

同軸度和同心度是兩個非常容易搞混的幾何公差. 同軸度的符號如下: 跟正位度的符號是一樣的! 有這種設定,主要是它的定義和正位度的使用方法很像,反而跟同心度沒這麼相似. 首先來個範例: 由於這個不是繪圖軟體做的,只是示意用,不合工程圖規範的部分還請包涵. 這個是...