PDU中线圈的地址是从0开始的.
在从设备返回的消息中,
请求PDU的构成域

字节数
描述
功能码
1
0x0F
线圈起始地址
2
0x0000-0xFFFF
线圈数量
2
0x0001-0x07B0
字节总数
1
N
线圈输出值
N
若N%8==0, 则n=N/8, 否则n=N/8+1.
响应PDU的构成域
字节数
描述
功能码
1
0x0F
线圈起始地址
2
0x0000-0xFFFF
线圈数量
2
0x0001-0x07B0
错误PDU的构成域
字节数
描述
功能码
1
0x8F
异常代码
1
01或02或03或04
示例写第20个线圈开始的连续10个线圈的值.
请求PDU
响应PDU
域
值(HEX)
域
值(HEX)
功能
0F
功能
0F
起始地址高8位
00
起始地址高8位
00
起始地址低8位
13
起始地址低8位
13
线圈数高8位
00
线圈数高8位
00
线圈数低8位
0A
线圈数低8位
0A
字节总数
02
输出值高8位
CD
输出值低8位
01
在请求报文中, 线圈20对应的地址为19, 用十六进制表示为0x0013, 10个线圈, 用十六进制表示为0x000A.
因为请求的线圈状态为10个, 每个字节可以表示8个线圈状态, 所以需要2个字节表示全部10个线圈状态, 在请求PDU中, 字节总数为0x02.
线圈20-27的状态为
字节位序
7
6
5
4
3
2
1
0
线圈序号
27
26
25
24
23
22
21
20
线圈状态
1
1
0
0
1
1
0
1
用十六进制表示即为0xCD.
线圈29-28的状态为
字节位序
7
6
5
4
3
2
1
0
线圈序号
29
28
线圈状态
x
x
x
x
x
x
0
1
用x标示的位用0表示, 所以用十六进制表示即为0x01.
写多个线圈流程图从设备写多个线圈流程图如下图所示.
写多个线圈流程图
备注读线圈输入功能可阅读
https://www.toutiao.com/i7056402170543014413/
写单个线圈输入功能可阅读
https://www.toutiao.com/a7057771676746007053
参考文献[1] Modbus Application Protocol(V1.1b). http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b.pdf
版权转载或者引用本文内容请注明来源及原作者.