一个客户,需要从主控PLC(三菱iQ-R系列)读写设备值(PLC用的是S7-200 SMART),很不幸,三菱iQ-R系列的PLC的"简单CPU通信"不支持西门子(这点与FX5U不同,FX5U支持与S7系列做简单CPU通信,配置非常方便). 经与客户协商,决定走Modbus TCP协议。
S7-200 SMART内增加对Modbus TCP的支持
S7-200 SMART有现成的Modbus TCP库,分server(相当于slave)和client(相当于master), 官方有非常详细的使用说明:
https://www.ad.siemens.com.cn/download/materialaggregation_581.html
同时西门子也提供了视频和范例:
当前的场景是做server, 响应客户主控PLC的请求,特别简单,只需要在PLC主程序MAIN的第一段加上对应的指令即可。其它什么也不需要改。
其中需要注意MaxHold和HoldStart两个参数:
HoldStart指定从哪个地址开始读/写V存储区,它对应 位机的读写指令中的00 00 这个起始地址。
MaxHold:最多允许上位机从起始地址读多少个双字节 (16位,S7-200 SMART的Modbus 程序对V存储区的处理是以双字节为单位的)
用Modbus Poll做client端读写S7-200 SMART
参考文章:
Modbus通信协议-软件调试4个工具软件
https://blog.csdn.net/shi_xiaobin/article/details/127443774
下载地址:
https://www.modbustools.com/download.html
使用注意事项:
端口号与程序中设定保持一致

连接成功后,在"Functions"菜单中选择"Test Center"

测试命令及结果解析:
Modbus TCP通信协议参考文章:
https://blog.csdn.net/mmmjsjsk/article/details/142655263
https://zhuanlan.zhihu.com/p/696344025
Modbus TCP/IP Explained: Complete Beginner-to-Expert Guide
测试读取V存储区(功能码0x03)
PLC中设置HoldStart: &VB0, MaxHold: 6

可以看到,测试成功。PLC按指令要求正确返回了数据。
Modbus Poll中发出的命令 00 00 00 00 00 06 01 03 00 00 00 06 解析:
00 00: 事务处理标识符, 2个字节
00 00:协议标识符,2个字节
00 06:长度,指后续指令的字节数, 2个字节
01: 单元标识符, 1个字节, 通常为01
03: 功能码, 1个字节, 03是读V存储区的功能码
00 00:读取的起始地址,2个字节。 (对应PLC程序中设定的起始地址)
00 06: 读取的双字节(WORD)数, 2个字节。
功能码之后统称"数据区",不同的功能码,其数据区定义不同。
从上图中,也可以看出,S7-200 SMART对于错误,返回的值是 83 02
测试写入V存储区:
写单个输出线圈(功能码0x05):
|-------------|---------|------------|----------|---------|-----------|
| 事务/协议(各2字节) | 长度(2字节) | 单元标识符(1字节) | 功能码(1字节) | 线圈(2字节) | 断通标志(2字节) |
| 0x00000000 | 0x0006 | 0x01 | 0x05 | 0x00 00 | 0xFF 00 |
写单个寄存器(功能码0x06):
|-------------|---------|------------|----------|---------|---------|
| 事务/协议(各2字节) | 长度(2字节) | 单元标识符(1字节) | 功能码(1字节) | 地址(2字节) | 数据(2字节) |
| 0x00000000 | 0x0006 | 0x01 | 0x06 | 0x00 00 | 0x11 22 |
写多个寄存器(功能码0x10):

发送命令: 00 00 00 00 00 0B 01 10 00 04 00 02 04 11 11 22 22
00 00: 事务处理标识符, 2个字节
00 00:协议标识符,2个字节
00 0B6:长度,指后续指令的字节数, 2个字节
01: 单元标识符, 1个字节, 通常为01
10: 功能码, 1个字节, 10是写多个V存储区的功能码
00 04:写入的起始地址,2个字节。 (对应PLC程序中设定的起始地址)
00 02: 写入的双字节(WORD)数, 2个字节。
04: 写入的字节数(bytes)
11 11 22 22: 写入的数据
从测试中可以看出,写寄存器出错返回值是90 03
S7-200 SMART中DW和REAL数据的读取:
DW(双字)数据:
处理比较简单,只需要从开始地址设置读取数量为2即可:

浮点数
处理相对麻烦。S7-200 SMART中浮点数是32位的。共存储格式为:
最高位(第31位): 符号位
第30~23位: 共8位, 指数位。
第22~0位: 共23位,小数位

测试例子中, VD124是浮点数256.78, 返回的16进制数据为43 80 63 D7

理解43 80 63 D7与256.78的关系:
0x 43 80 63 D7 = 01000011 10000000 01100011 11010111
按上述结构拆解:
符号位: 0
指数位:10000111
小数位: 0000000 01100011 11010111
计算还原:
