
1.7.1 读取数据
以下举例说明机器人如何向PLC请求读取地址为20~38的线圈状态。ModBus/TCP读取数据时的请求与响应如表1-12所示。
表1-12 ModBus/TCP读取数据时的请求与响应

根据前文所述,机器人需要发送的数据(加粗部分为发送的具体数据)如下:
0x00,0x01,0x00,0x00,0x00,0x06,0x01,0x01,0x00,0x14,0x00,0x13
(1)第1和第2字节:事务处理标识,PLC会返回相同值。
(2)第3和第4字节:00,00表示Modbus/TCP协议。
(3)第5和第6字节:表示从第7字节开始的总共字节数。
(4)第7字节:设备地址1。
(5)第8字节:功能码,此处请求读取线圈状态,故为0x01。
(6)第9和第10字节:待读取数据的起始地址为20,对应十六进制0x14。
(7)第11和第12字节:从起始地址开始的线圈个数共19个,对应十六进制0x13。
可以利用ModBusSlave软件进行仿真测试。单击该软件的“SetUp”按钮,设置“Slave ID”为1,要读取的线圈起始地址“Address”为20,数量“Quantity”为19,如图1-47所示。
如图1-48所示,根据前文所述,设置地址20~38的线圈值如下:
27~20:0XCD,35~28:0X6B,38~36:0X05
机器人向PLC发送数据“0x00,0x01,0x00,0x00,0x00,0x06,0x01,0x01,0x00,0x14,0x00,0x13”后,会接收到如下信息:
0x00,0x01,0x00,0x00,0x00,0x06,0x01,0x01,0x03,0xCD,0x6B,0x05
(1)第1到第7字节:同前文中的发送部分。
(2)第8字节:功能为读取线圈。

图1-47 设置ModBus/TCP相关信息

图1-48 设置地址20~38的线圈值
(3)第9字节:0x03表示从第10字节开始的字节数。
(4)第10字节:地址27~20的线圈值为11001101(0xCD)。
(5)第11字节:地址35~28的线圈值为01101011(0x6B)。
(6)第12字节:地址43~36的线圈值为00000101(0x05)。
为实现基于ModBus/TCP通信的数据读取,编写如代码1-11所示的机器人代码。
代码1-11


机器人运行以上代码后,接收到的数据如图1-49所示。

图1-49 机器人接收到的数据
机器人默认数据显示为十进制,205对应0xCD,107对应0x6B, 5对应0x05。读取的地址为20~38的线圈数据,正确。