提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站协议库(西门子标准库指令)。使用 Modbus RTU 主站指令库,可以读写 Modbus RTU 从站的数字量、模拟量 I/O 以及保持寄存器,从而实现PLC通过modbus方式控制其他器件。
提示:以下是本篇文章正文内容,下面案例可供参考
一、准备工作
电脑
S7-200smart st30
485通讯线
说明:这里将以S7-200smart作为主站,电脑串口调试助手作为从站。做操作演示。
此处省略接线。
二、写梯形图
1.MBus_CTRL
1. 调用 Modbus RTU 主站初始化和控制子程序
使用 SM0.0 调用 MBUS_CTRL 完成主站的初始化,并启动其功能控制:
图 2. 用 SM0.0 调用 Modbus RTU 主站初始化与控制子程序
各参数意义如下:
a. | EN | 使能: | 必须保证每一扫描周期都被使能(使用 SM0.0) |
---|---|---|---|
b. | Mode | 模式: | 为 1 时,使能 Modbus 协议功能;为 0 时恢复为系统 PPI 协议 |
c. | Baud | 波特率: | 支持的通讯波特率为1200,2400,4800,9600,19200,38400,57600,115200。 |
d. | Parity | 校验: | 校验方式选择 |
0=无校验(通常默认选择0) | |||
1=奇较验 | |||
2=偶较验 | |||
e. | Port | 端口号: | 0 = CPU 集成的 RS 485 通讯口 ; 1 = 可选 CM 01 信号板 。 |
f. | Timeout | 超时: | 主站等待从站响应的时间,以毫秒为单位,典型的设置值为 1000 毫秒(1 秒),允许设置的范围为 1 - 32767。 |
注意: 这个值必须设置足够大以保证从站有时间响应。 | |||
g. | Done | 完成位: | 初始化完成,此位会自动置1。 |
h. | Error | 有错误 |
1.MBus_MSG
调用 Modbus RTU 主站读写子程序MBUS_MSG,发送一个Modbus 请求;
各参数意义如下:
a. | EN | 使能: | 同一时刻只能有一个读写功能(即 MBUS_MSG)使能 |
---|---|---|---|
注意:建议每一个读写功能(即 MBUS_MSG)都用上一个 MBUS_MSG 指令的 Done 完成位来激活,以保证所有读写指令循环进行(见例程)。 | |||
b. | First | 读写请求位: | 每一个新的读写请求必须使用脉冲触发 |
c. | Slave | 从站地址: | 可选择的范围 1 - 247 |
d. | RW | 读写请求: | 0 = 读, 1 = 写 |
e. | Addr | 读写从站的 | 选择读写的数据类型 |
数据地址: | 00001 至 0xxxx - 数字量输出 | ||
10001 至 1xxxx - 数字量输入 | |||
30001 至 3xxxx - 模拟量输入 | |||
40001 至 4xxxx - 保持寄存器 | |||
f. | Count | 数据个数 | 通讯的数据个数(位或字的个数) |
注意: Modbus主站可读/写的最大数据量为120个字(是指每一个 MBUS_MSG 指令) | |||
g. | DataPtr | 数据指针: | 1. 如果是读指令,读回的数据放到这个数据区中 2. 如果是写指令,要写出的数据放到这个数据区中 |
h. | Done | 完成位 | 读写功能完成位 |
i. | Error | 错误代码: | 只有在 Done 位为1时,错误代码才有效 |
0 = 无错误 | |||
1 = 响应校验错误 | |||
2 = 未用 | |||
3 = 接收超时(从站无响应) | |||
4 = 请求参数错误(slave address, Modbus address, count, RW) | |||
5 = Modbus/自由口未使能 | |||
6 = Modbus正在忙于其它请求 | |||
7 = 响应错误(响应不是请求的操作) | |||
8 = 响应CRC校验和错误 | |||
101 = 从站不支持请求的功能 | |||
102 = 从站不支持数据地址 | |||
103 = 从站不支持此种数据类型 | |||
104 = 从站设备故障 | |||
105 = 从站接受了信息,但是响应被延迟 | |||
106 = 从站忙,拒绝了该信息 | |||
107 = 从站拒绝了信息 | |||
108 = 从站存储器奇偶错误 |
三、使用难点与解答
通常支持485通讯的器件给的使用说明书,给的指令是16进制的字符串代码。很难与当前PLC库指令对应起来,尤其是命令地址。我们以IAI马达给的使用说明书为例子。如图所示:
该示例是PLC通过modbus去读取马达的位置。读取控制器地址9000这个寄存器里面的数据
RW填0,表示去读取数据。
Plc库里面需要填的Addr(e)是十进制,需要将16进制的9000转成十进制。
通过计算器得知:16#9000=36864
注意事项:这里博主也比较奇怪,实际使用读取寄存器地址的时候需要+1,36865
不知道有没有人可以解释一下的。
由于这里是读取寄存器,所以Addr=436865.
count是寄存器数量:按照示例,这里有2个寄存器。所以count填2
通过串口调试助手来测试一下:接通M15.0发送信号,串口调试助手收到了PLC发送的信号。且可以看到收到的数据与IAI操作手册示例一致。测试成功
以上是通过modbus读取的示例。
注意事项:
1、只有在操作就被控方寄存器的时候(无论读取还是写入),转换的成十进制的地址后第一位需要加个4
2、注意发送命令和读取命令的字符长度,需要正确填写
3、需要注意波特率要填写正确,与被控方保持一致。否则发出去的信号与收到的信号不相符
4、发出去的内容填写到DataPtr中。
此处我们再来解读plc的这个命令就比较清晰了:
通过MB_MSG,向1号从站读取从36865(Addr)这个地址开始2位(Count)的数据,并把读取到的数据写入VB2000
如果是写入:通过MB_MSG,将PLC的VB2000开始的2位寄存器内的数据,写入到1号从站的36865寄存器中