QQ登录

只需一步,快速开始

详解S7-1500PLC 实现 Modbus-RTU 通信

[ 复制链接 ]

此次讲解以示例项目为例,
主要阐述关于SIEMENS S7-1500PLC 实现 Modbus-RTU 通信的配置步骤、程序编写及注意事项,
详细的系统配置如下图 :

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信


该实例中, Modbus-RTU 主站为安装在 S7-1500 主机架上的 CM PtPRS422/485 HF ,
Modbus-RTU 从站模块(站地址为 2)为安装在 ET 200SP 分布式 IO 上的 CM PtP ,
接口类型为 RS485 ,通信波特率为 9600bit/s ,无奇偶校验。
该实例所用的软件及硬件

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信


(二) 硬件组态步骤
按照系统配置图,首先组态 S7-1516 CPU 主机架,
在主机架上配置点对点通信模块,并将该模块的协议设置为 “Modbus ”,
如下图 2:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 2:S7-1500 CPU 主机架点对点通信模块组态

然后激活 CPU 的“系统和时钟存贮器功能”,如下图 3 。
(本例程中使用了CPU 首次扫描位来实现 Modbus 的初始化,使用 CPU 的时钟信号来控制发送频率,该方法供参考。)

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 3:激活 CPU 的系统和时钟存储器

然后组态 ET 200SP 分布式 IO 站,并在该分布式 IO 上组态点对点通信模块,
并将该模块的通信协议设置为 “Modbus ”,
如下图 4:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 4:选择通信协议

ET200 SP 分布式 IO 站点对点模块组态,至此硬件配置已完成。

(三)软件编写
S7-1500 实现 Modbus-RTU 功能,需要调用以下指令,
见下表 3,其中“Modbus_Comm_Load ”指令用于通信模块的组态,
“Modbus_Master ” 指令和“Modbus_Slave ” 指令分别实现 Modbus 主站通信和 Modbus 从站通信,
“Modbus_Comm_Load ”指令和 “Modbus_Master ”/ “ Modbus_Slave ”指令是通过 “Modbus_Comm_Load ”指令的 “MB_DB ”参数来实现关联的。
表 3. Modbus-RTU 相关指令

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信


在此,首先编写 Modbus 主站程序,添加一个新 FB ,将其命名为“ModbusMaster ”,
如下图 5:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 5:添加 Modbus-Master 功能块

在该 FB 中以多重背景方式调用 “Modbus_Comm_Load ”指令,
该指令在指令目录下“通信 —〉通信处理器 —〉Modbus (RTU )”下,
如下图 6:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 6 :调用 “Modbus_Comm_Load ”

        在该 FB 中以多重背景方式调用 “Modbus_Master ”指令,
该指令在指令目录下“通信—〉通信处理器—〉 Modbus (RTU )”下,
如下图 7:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 7 :调用 “Modbus_Master ”指令

         然后对 “ Modbus_Comm_Load ”指令进行参数化,由于该指令参数较多,在此只列出必须要关注的参数,
如下表 4 所示,其它参数解释见手册或在线帮助。
         表 4. Modbus_Comm_Load 主要参数列表

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信


首先要为 “Modbus_Comm_Load ”指令指定端口,即该指令是针对哪个点对点模块进行参数化的。
在硬件配置中,每个硬件均有一个硬件标识符,该硬件标识符在硬件属性中可以查看到,
如下图 8:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 8:在硬件属性中查看模块硬件标识符

同样,该硬件标识符也可以在 “PLC 变量 —〉显示所有变量 —〉系统变量”下可以查看到,
如下图 9:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 9 :PLC 变量表中查看系统常量

         所以可以通过如图 10 所示方法,通过拖拽的方式,
将 Modbus 主站接口的硬件标识符拖至 “Modbus_Comm_Load ”指令的 “Port”接口参数处,如下图 10:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信


图 10 :为“ Modbus_Comm_Load ”指定端口

         接下来,定义端口的工作模式,本示例中,点对点模块的工作模式为 RS485 ,
所以需要将 “Modbus_Comm_Load ”背景数据中静态变量的 “MODE ”参数赋值为 4,
赋值既可以通过 “Move ”指令来完成,
也可以通过直接修改该静态变量的默认值来实现,本实例使用后一种方法,
参见下图 11:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 11 :定义 Modbus-RTU 主站端口工作模式为 RS485

         接下来,通过对 “Modbus_Comm_Load ”指令的 “MD_DB ”参数赋值,
将 “Modbus_Comm_Load ”指令与 “Modbus_Master ”指令进行关联,
即将 “Modbus_Master ”指令的背景 DB 块中静态变量 “MB_DB ”赋值给 “Modbus_Comm_Load ”指令的 “MD_DB ”,
可以通过拖拽的方式来实现,
拖拽路径如下图 12:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信


对“ Modbus_Comm_Load ”指令的 “ MD_DB ”参数赋值除以上操作外,
对于 “Modbus_Comm_Load ”指令的 “REQ ”参数,本实例使用 PLC 的首个扫描位来完成。
其它参数如波特率,奇偶校验等,请根据实际使用情况对这些参数进行赋值,
因本实例波特率为 9600bit/s ,无奇偶校验,
所以以上参数使用缺省设置即可。
接下来,对指令 “Modbus_Master ”进行参数设置,该指令主要参数如下表 5所示:
       表 5. Modbus_Master 主要参数列表

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

表五

由于 Modbus 指令读取或写入的数据区必须为指针寻址,
所以必须是有绝对地址的区域方可访问,
而 S7-1500 创建的 DB 块缺省为优化的 DB 块,变量没有绝对地址,无法直接使用。
本例中我们创建 DB 块,并在该 DB 块内创建一个名为 “M_Data ”的数组,
类型为 WORD ,长度为 100 ,即创建了 100 个字的存储空间。
然后在该 DB 块点右键,在属性中将“优化的块访问”前的勾去掉,重新编译该 DB 块,
该 DB 块就会生成,可以看到每个变量都有偏移地址了,
如下图 13:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 13 :创建一个标准 DB 块

         根据下表 6 所示的 Modbus 功能码,
本实例需要 Modbus 主站读取 Modbus 从站保持寄存器从起始地址开始的 10 个字的内容到创建的 “Master_Data ”中,
即 Modbus 功能码 03 的功能。

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

表6:Modbus 功能码的选择

    根据以上要求,则 “Modbus_Master ”指令应按如下赋值:
    “REQ ”:本实例使用 PLC 时钟信号来完成,即下图中的 M0.5 ;
    “MB_ADDR ”:2 // 访问的从站地址;
    “MODE ”:0;// 与“DATA_ADDR ”参数一起决定 Modbus 功能码为 03
    “DATA_ADDR ”:40001 // Modbus 地址
    “DATA_LEN ”:10 // 数据长度为 10 个字
    “DATA_PTR ”:该参数可以通过拖拽的方式,将创建的标准 DB 内的变量 “M_Data ”拖拽到 “DATA_PTR ”处,
拖拽路径如下图 14:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 14 :为“ Modbus_Master ”指令进行参数赋值

接下来,编写 Modbus_RTU 从站程序,参照主站的程序,
添加一个新 FB2“Modbus-Slave ”,在该 FB 中以多重背景方式调用“Modbus_Comm_Load ”指令,
同样为该指令选择 ET 200SP 的硬件地址,其它通信参数如波特率、奇偶校验等与主站的“Modbus_Comm_Load ”指令相同,
如下图 15 :

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 15:在从站 FB 中调用 “Modbus_Comm_Load ”指令

       使用定义主站端口的工作模式相同的方法,将从站点对点模块的工作模式定义为RS485 ,
所以需要将 “Modbus_Comm_Load ”背景数据中静态变量的 “MODE”参数赋值为 4,
如下图 16:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 16 :定义 Modbus-RTU 从站端口工作模式为 RS485

       然后,以多重背景的方式调用从站指令 “ Modbus_Slave ”指令,并设置Modbus 从站地址为 2,
并为从站创建一个标准的 DB 块“Slave Data ”,长度根据实际情况定,
本例中在 “Slave Data ”中创建了一个长度为 200 字的数组,并将该变量以拖拽的形式(也可以通过指针 P# 的方式),
将该变量填在“Modbus_Slave ”的“MB_HOLD_REG ”参数处,
如下图 17:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 17 :调用 “Modbus_Slave ”指令

然后对 “ Modbus_Comm_Load ”指令的 “ MD_DB ”参数赋值,
将 “Modbus_Comm_Load ”指令与 “Modbus_ Slave ”指令进行关联,
即将 “Modbus_Slave ”指令的背景 DB 块中静态变量 “ MB_DB ”赋值给 “Modbus_Comm_Load ”指令的 “MD_DB ”,
可以通过拖拽的方式来实现,
拖拽路径如下图 18:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

  图 18

     将“ Modbus_Slave ” 指令和 “Modbus_Comm_Load ”指令关联在 OB1 中分别调用 Modbus 主站程序块和 Modbus 从站程序块,
并为其分配全局 DB 块,
如下图 19:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

图 19

在 OB1 中分别调用主站程序和从站程序至此,
程序编写基本结束,建立 2 个变量监视表,分别用来监视 Modbus 主站数据和 Modbus 从站数据,
将该例程下载到 PLC 后,可以看到通信模块对应的收发 LED 指示灯在闪烁,表示端口正在发送 / 接收数据。
将 DB 块“Slave Data ”中的变量赋值,监视主站 “Master Data ”中的变量,可以看到主站已经读取到从站的数据,
如下图 20:

详解S7-1500PLC 实现 Modbus-RTU 通信

详解S7-1500PLC 实现 Modbus-RTU 通信

  图 20: 使用变量监视表测试

主站侧已成功读取到从站数据Modbus 其它功能码使用方法类似,
请参照表 6 修改相应的变量即可,此处不再一一举例。也可以根据此例程,
举一反三,编写 Modbus-RTU 轮询程序。

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索