西门子PLC如何使用Modbus 485通讯传输接收数据

描述

前言    

西门子在 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 完成主站的初始化,并启动其功能控制:

plc


图 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 请求;

plc

各参数意义如下:

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

plc

plc

该示例是PLC通过modbus去读取马达的位置。读取控制器地址9000这个寄存器里面的数据

RW填0,表示去读取数据。

Plc库里面需要填的Addr(e)是十进制,需要将16进制的9000转成十进制。

通过计算器得知:16#9000=36864

注意事项:这里博主也比较奇怪,实际使用读取寄存器地址的时候需要+1,36865

不知道有没有人可以解释一下的。

plc

由于这里是读取寄存器,所以Addr=436865.

plc

count是寄存器数量:按照示例,这里有2个寄存器。所以count填2

通过串口调试助手来测试一下:接通M15.0发送信号,串口调试助手收到了PLC发送的信号。且可以看到收到的数据与IAI操作手册示例一致。测试成功

plc

以上是通过modbus读取的示例。

注意事项:

1、只有在操作就被控方寄存器的时候(无论读取还是写入),转换的成十进制的地址后第一位需要加个4

2、注意发送命令和读取命令的字符长度,需要正确填写

3、需要注意波特率要填写正确,与被控方保持一致。否则发出去的信号与收到的信号不相符

4、发出去的内容填写到DataPtr中。

plc

此处我们再来解读plc的这个命令就比较清晰了:

通过MB_MSG,向1号从站读取从36865(Addr)这个地址开始2位(Count)的数据,并把读取到的数据写入VB2000

如果是写入:通过MB_MSG,将PLC的VB2000开始的2位寄存器内的数据,写入到1号从站的36865寄存器中。

来源:电子开发网。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分