簡單來說, 用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
};
{
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);
}
以下是簡易實作的程式碼:
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
沒有留言:
張貼留言