设为首页
收藏本站
PLC技术网
开启辅助访问
切换到宽版
登录
注册哦
只需一步,快速开始
微信扫码登录
门户
Portal
论坛
BBS
导读
Guide
排行榜
Ranklist
搜索
搜索
本版
文章
帖子
用户
PLC论坛-全力打造可编程控制器专业技术论坛
»
论坛
›
工控技术交流区
›
『国外:三菱/西门子/欧姆龙/松下』
›
RTU 轮巡编程全攻略:零基础也能轻松上手,速来围观 ...
返回列表
发新帖
[西门子]
RTU 轮巡编程全攻略:零基础也能轻松上手,速来围观
[复制链接]
174
|
0
|
2024-8-27 17:25:36
|
显示全部楼层
|
阅读模式
1
介绍
Modbus RTU
是S7-1200/1500常用的
串口通信协议
,很多项目都会用这种方式连接大量仪表,因为通常都是基于半双工的RS485接口,所以同一时刻只能访问一个站,对于每个站的访问就需要用到轮询的方式。我们在这里就为大家讲一下如何去编写轮询程序。
1.1
Modbus RTU 主站通信
Modbus RTU的通信作业是主站去读从站的某个地址区的数据或者把数据写入从站的指定地址。读和写作为两个作业彼此不能冲突,从站同一时间也只能接收一个作业请求(被读或者被写),所以在主站程序中需要完全错开两种作业。
如图1所示为Modbus RTU 主站的初始化。
图1、Modbus RTU 主站初始化程序
这一块重点关注的是这几个部分:· 因为绝大多数Modbus RTU都是基于RS485,所以对初始化程序的背景数据块的Mode变量赋值为4,此外也可以在背景数据块直接修改起始值。· REQ赋值,可以是FirstScan,也可以是常数True/1。· PORT填写正确,一定是对应串口模块的硬件标识符。· MB_DB参数为后面Modbus_Master的背景数据块中的MB_DB变量。· 如果同一CPU下有多个串口模块都使用Modbus RTU 主站通信,则图1程序调用多次,且背景数据块不能相同。· 以上程序在主程序(程序循环)而非启动OB中调用。· 当初始化完成后DONE位会有一个扫描周期的1,这可以作为后面轮询程序的启动信号。
后续将调用
Modbus_Master
,很多时候工程师都是直接使用时钟脉冲去触发每个读写作业,对单个站往往直接使用时钟脉冲,多个站可能使用时钟脉冲+计数器或者时钟脉冲上升沿/下降沿。这些方法并不是不行,只是偶尔会导致些错误,例如在Modbus RTU中是16#8200,究其原因是前面提到的“程序中需要错开两种作业”,也就是这样做会偶尔导致前一作业没执行完,后一作业就已经触发!
为了解决这个问题,我们通常建议使用
Modbus_Master的DONE位与ERROR位
作为下一作业触发,第一个作业由前面提到的初始化DONE位。如图2所示是访问两个不同站的示例。
图2、Modbus RTU轮询程序1
该方法中使用每次Modbus_Master作业的DONE位或ERROR位置位下一作业的REQ位,复位当前作业REQ位。第一次触发由Modbus_Comm_Load的DONE位来完成。对于多个站轮询也是同一个道理。这种方法可以完全错开每次作业。应该注意的是同一串口模块下,每个Modbus_Master作业的背景数据块是相同的。
如果伙伴是单个站点,并且是单个作业,可以参考如图3中所示程序(初始化参考图1)。
图3、Modbus RTU轮询程序2
该方法中不存在多个REQ轮流置位复位的可能,那我们就利用逻辑编程实现在不同扫描周期对REQ位置位复位,实现
单站点轮询
。
与之前程序不同,程序段2中使用Modbus_Comm_Load的DONE位来置位一个标志位,意为
初始化已完成
。
而程序段3中,当初始化完成标志位是False时程序不执行程序段4及其后面的程序,使用RET指令直接返回。
当初始化完成标志位为True以后,开始执行程序段4及其后面的程序,程序段4因为初始REQ为False,所以通过SR指令置位了REQ位,程序段5的Modbus_Master作业此周期开始执行。到了下一周期,因为REQ为True,且DONE、ERROR都是False,所以程序段4不进行任何操作。
等到作业完成,Modbus_Master的DONE位或ERROR位置位为True,下一周期程序段4复位了REQ,所以此周期Modbus_Master作业不执行,同时DONE位和ERROR位复位。再下一周期因为REQ为False,程序段4通过SR指令又置位了REQ位,此周期又开始执行Modbus_Master作业了,这样就轮询起来了。也就是说始终是若干扫描周期执行作业,一个扫描周期不执行作业,再若干扫描周期执行作业,再一个扫描周期不执行作业,这样一个往复的步骤。
如果站点比较多,并且访问的都是相同的数据区,可以通过简单扩展上述程序来实现循环操作,因为Modbus_Master背景数据块是相同的,所以可以只调用一次Modbus_Master,在每次作业执行前修改接口参数即可,程序如图4所示(初始化参考图1)。
图4、Modbus RTU轮询程序3
该方法中的例子程序是应用中较简单的一种,只读,地址区顺序排列(地址1-8),数据区固定大小(40001开始两个字)。如果地址排列不规则,数据区不固定,有读又有写,就需要考虑使用
PLC
数据类型的数组针对每一个地址区,利用
序列化反序列化
进行数据的重组,这里不做展开。程序段2、3与之前相同不再赘述。
程序段4增加了在触发REQ位的同时修改地址区变量,使地址区变量(图5中第二个变量)处于1-8这个范围,每次触发则地址区变量修改一次,地址区变量同时作为DATA_PTR数组的索引。
程序段5,执行Modbus_RTU作业,地址区变量关联MB_ADDR,以及DATA_PTR,使用数据数组元素,索引变量为地址区变量,数组在定义时定义为二维数组,第一维度是站,第二维度是每个站的数据,如图5所示的第一个变量。
图5、数据定义
注意:以上程序不包含错误处理,如需错误处理还需要编写相关程序。
这些轮询方法,你们都学会了吗,赶快把它应用在你的项目中吧。有问题的话可以在下方留言区留言哦,欢迎转发到您的朋友圈,让更多的小伙伴们来学习。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
注册哦
x
回复
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册哦
本版积分规则
发表回复
回帖后跳转到最后一页
西家支持与服务
回复楼主
返回列表
『国外:三菱/西门子/欧姆龙/松下』
『国产:台达/汇川/信捷产品交流区』