首先把
modbus协议搞明白,
modbus协议具体到S7 200PLC是这样的:
功能1:读单个或多个数字量输出Q状态。
功能2:读单个或多个数字量输入I状态。
功能3:读单个或多个保持寄存器V。
功能4:读单个或多个模拟量输入寄存器AI。
功能5:写单个数字量输出Q。
功能6:写单个保持寄存器V。
功能15:写多个数字量输出Q。
功能16:写多个保持寄存器V。
以上功能涉及到4个地址:I Q AI和V,具体到
modbus地址如下所示:
00001 - 09999:Q
10001 - 19999:I
30001 - 39999:AI
40001 - 49999:V
所以
modbus地址加上是读还是写就可以确定功能码。
但数据在传输过程中,地址不是上述形式,实际发送的数据帧里反而包括功能码和直接地址。比如在上述的例子里的数据块就可以看到。
比如:某个从站设备地址设定为4,模拟量地址0为温度1,模拟量地址1为温度2,模拟量地址2为温度3,模拟量地址3为温度4,而我要读取这4个温度值,那么我直接发送以下8字节数据:16#04, 16#04, 16#0, 16#0, 16#0, 16#04, 16#F1, 16#9C,对方即将4个温度值传送给我,但是如果用
modbus主站库来写,就这样这样:
RW=0
ADDR=30001
COUNT=4