技术论坛

S7-1214C的Modbus rtu通讯一例

作者 主题
至圣

经验值: 72012
发帖数: 8043
精华帖: 145
主题:【分享】S7-1214C的Modbus rtu通讯一例
推荐帖


只看楼主 楼主 2022-05-04 07:53:33

S7-1214C的Modbus rtu通讯一例

  今天下午借到s7-1200的RS485模块(6ES7241-1AH32-0XB0)一个,正好拿来与刚刚前几天买来的导轨式温、湿度传感器(带Modbus rtu通讯功能)做一次通讯验证。

硬件组件:

1) S7-1214C的cpu版本V4.2(6ES7212-1HE40-0XB0)一个,扩展通讯模块RS485(6ES7241-1AH32-0XB0)一个,固件版本V2.2;

2) 第三方温、湿度传感器一个,支持Modbus rtu通讯协议,其中,湿度数据长度一个字,温度数据长度一个字,站地址通过专用软件已经设置为:5,其它参数同样符合S7-1200的Modbus rtu通讯协议;

3) 西门子电源模块(6EP1334-3BA10)一个,连接导线若干。

测试软件Portal V15版本。

通讯组态:

1) 创建一个测试项目,根据测试条件,插入相应的cpu及通讯模块并组态通讯选项:

 2) 勾选“系统时钟”的标志字节,等一下编写程序时需要,图示:

 

3) 在OB1中编写通讯程序,也可以在合适的FB/FC/OB中调用,这个没有特别的要求,合适自己就好,另外,再创建一个数据块_1,方便存放通讯指令的标志位及数据,仍然没有特殊要求,纯粹是个人的喜好。图示:

   填写相应的管脚,这个在西门子S7-1200的plus文档中有非常强大的描述,这里不再说明,只是在填写Modbus_Comm_load指令的MB_DB管脚时,需要在“系统块”---“程序资源”下,找到“Modbus_Master_DB”中的MB_DB,把它拖拽到管脚就可以了。其中,Modbus_Master的管脚填写是根据第三方温、湿度传感器的填写协议内容填写即可。另外,有一点我之前有遇到的是Modbus_Comm_load的Static变量的MODE(数据类型)USInt由原来的16#00改为16#04,与硬件组态的半双工两线制模式保持一致。哦,对了,我在V15的Protal版本寻找Modbus_Comm_load指令的PORT管脚时,没有查询到硬件标设信息,可能是软件版本的原因问题,这个是在实际填写管脚过程的下拉菜单中可以选择到,图示:

 4) 再创建一个变量表,方便填写需要的数据监控。用导线根据硬件手册及传感器说明书内容连接好测试的所有硬件连接,上电后将用户程序保存、编译、下载到cpu,进行监控,因为该传感器只是读取温度和湿度数据,所以只需要调用一个Modbus_Master指令就能够满足通讯要求了:

 

 数据块_1中,DB2.DBW0 = 湿度数据,DB2.DBW2 = 温度数据。

今天,在200smart版区与一个爱好者讨论是关于Modbus rtu通讯之CTRL指令done位的应用问题。于是,想起是否可以用Modbus_Comm_load指令的done位,作为Modbus_Master通讯指令的REQ管脚触发,修改变量再次下载,通讯仍然可以实现,图示: 

读取到的温度与湿度数据,仍然与用200smart读取到的一致,实际数据需要除10处理。如果项目中需要读取多个数据,那么,在调用Modbus_Master指令中仍然沿用轮询机制,即上一个Modbus_Master的done位及Status值关联下一个Modbus_Master的REQ管脚,构成一个相对闭合的触发链路,首次第一个Modbus_Master指令的触发可以用Modbus_Comm_load指令的done位进行,也可以用其它标志位来做。

上述程序仅仅只是列举了Modbus通讯程序的框架,而并不是一个完整的程序段落,完整程序还需要提取STATUS的状态值及error位值,作为检测通讯是否存在故障和继续轮询的触发的依据,同时利用这个特点(正常情况下STATUS = 16#7000空闲或者16#7002正忙)的非逻辑,触发Modbus_Maste这里的REQ管脚,图示:

 


当通讯连接断开后,M2.3 = 1,无条件再次触发Modbus_Master指令的REQ管脚,直到通讯再次连接成功,当然,增加通讯中断的报警程序也是一件非常有必要的事情。



 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1760397&b_id=50&s_id=0&num=15

版主

经验值: 69061
发帖数: 12270
精华帖: 59
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 1楼 2022-05-04 09:46:57


感谢分享实例


Q群:https://jq.qq.com/?k=9BDuEgf6
以下网友喜欢您的帖子:

  
奇侠

经验值: 5592
发帖数: 303
精华帖: 0
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 2楼 2022-05-04 09:52:02


思路明晰,图文并茂,简单明了。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 72012
发帖数: 8043
精华帖: 145
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 楼主 3楼 2022-05-04 10:48:24

上面的各位,五一节好!

实际上通讯这项技能,就是靠多做项目,就是这几个关注点,对于新手、初次使用者可能会造成一些使用上的瓶颈问题。看别人的程序是一会事情,自己做又是另外一件事情。

手上刚好有这些硬件,所以我用200smart 和s7-1214C各做了一个测试。

200smart的贴子,http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1759958&b_id=64&s_id=0&num=49#anch

传感器是同一个,所以,通讯参数是同样的。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 72012
发帖数: 8043
精华帖: 145
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 楼主 5楼 2022-05-04 11:42:06
以下是引用宝冬在2022-05-04 11:31:03的发言 >4楼

可以试试低版本MB指令,速度更快。非分布式模块,没必要用高版本的,增加负荷和开销。以前测过,速度慢约40%,工作内存消耗多出7K。

同样是通信,对于200smart和博途中的意义和用法是很大不同的。在博途中,重点不是局限于通信底层的执行过程,而是借助封装和调度,把底层元素整合成高层级的富功能对象,来对接工艺和表层交互需求。

直接用串口模块,还可以试试用自由口来实现modbus协议。也可以试试走以太网通信来封装modbus。以前我发过源码,可以下载玩玩。


http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1725735&b_id=50&s_id=77&num=50&myreply=1#anch


http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1725940&b_id=50&s_id=77&num=36&myreply=1#anch

好的,scl语言方式不是很熟练,还是在学习阶段。

正好,拿来学习,感谢提供学习机会。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8146
发帖数: 843
精华帖: 14
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 6楼 2022-05-04 17:44:33

我很想指出问题,可是楼主又会说:我这是测试程序


13478405725
以下网友喜欢您的帖子:

  
至圣

经验值: 18932
发帖数: 2108
精华帖: 0
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 7楼 2022-05-04 18:56:17

楼上的说,这里就是讨论的地方


 
以下网友喜欢您的帖子:

  
至圣

经验值: 72012
发帖数: 8043
精华帖: 145
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 楼主 8楼 2022-05-04 23:37:35
以下是引用不欲勿施13478405725在2022-05-04 17:44:33的发言 >6楼

我很想指出问题,可是楼主又会说:我这是测试程序

如果你是秉承就事论事的心态,我将会悉心讨论,反之,我也没有讨论的心态了。

话说ctrl的done位,确实就是那种状态,你的思路没有问题,我也说了。但是,你针对ctrl的初始化程序做过深刻理解?这些所谓的报警error仅仅只针对于用户填写了错误的管脚参数而做出的报警,而并不是检测通讯链路上的那些错误,可能你又会说这个你知道的。

  我是非常喜欢接受别人正确意见的人,我的很多测试程序,在实际应用中也一直在用,虽然,不能够说是十分的完善,但是,决没有误导别人的想法,仅仅只是发一些测试应用程序过程的贴子而已。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8146
发帖数: 843
精华帖: 14
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 9楼 2022-05-05 02:45:14

当通讯连接断开后,M2.3 = 1,无条件再次触发Modbus_Master指令的REQ管脚,直到通讯再次连接成功,当然,增加通讯中断的报警程序也是一件非常有必要的事情。

好吧,你的最后一张图里的程序多余,就算没有从站,指令返回超时错误,完成位也会为1,不需要人为额外触发指令。单从站单条通信任务可能没问题,但多条任务时,这样做会出现 忙 错误。

期待你分享,多从站,多通信任务,多通信功能(读轮询,写优先,掉站处理,掉站恢复)的真实、实用的项目程序。


13478405725
以下网友喜欢您的帖子:

  
至圣

经验值: 72012
发帖数: 8043
精华帖: 145
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 楼主 10楼 2022-05-05 09:30:51
以下是引用不欲勿施13478405725在2022-05-05 02:45:14的发言 >9楼

当通讯连接断开后,M2.3 = 1,无条件再次触发Modbus_Master指令的REQ管脚,直到通讯再次连接成功,当然,增加通讯中断的报警程序也是一件非常有必要的事情。

好吧,你的最后一张图里的程序多余,就算没有从站,指令返回超时错误,完成位也会为1,不需要人为额外触发指令。单从站单条通信任务可能没问题,但多条任务时,这样做会出现 忙 错误。

期待你分享,多从站,多通信任务,多通信功能(读轮询,写优先,掉站处理,掉站恢复)的真实、实用的项目程序。

我在实际测试从站掉站时,没有后面的那些程序,通讯会是一个死循环,加上后才是等待通讯连接成功就自动又开始运行了,至于加什么条件确实需要再推敲一番。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8146
发帖数: 843
精华帖: 14
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 11楼 2022-05-05 10:09:48

我在实际测试从站掉站时,没有后面的那些程序,通讯会是一个死循环

这时再加上从站,是不是通信就恢复了?


13478405725
以下网友喜欢您的帖子:

  
至圣

经验值: 72012
发帖数: 8043
精华帖: 145
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 楼主 13楼 2022-05-05 11:43:31
以下是引用不欲勿施13478405725在2022-05-05 10:09:48的发言 >11楼

我在实际测试从站掉站时,没有后面的那些程序,通讯会是一个死循环

这时再加上从站,是不是通信就恢复了?

没有自动连接上。

我是这样测试的,上电启动plc,看通讯正常(能够反映具体的数据波动),此时,我断开通讯线路的任意一根,A或B后,通讯中断,数据保持原来断开的那个周期数据不变。

在整理写贴时,发现了这个问题,是我后来临时补上的那段程序,程序的严谨性显然不够,没有深究。

只是临时写了这个程序后,通过几次测试,可以自动连接上,就截图补充了这些内容。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 72012
发帖数: 8043
精华帖: 145
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 楼主 14楼 2022-05-05 11:47:05
以下是引用宝冬在2022-05-05 11:14:41的发言 >12楼

最好把设备做成一个FB,modbus通信资源只做为IO管脚引入。这就和封装其他IO设备是一样的。

各个设备FB平行调用。如果增加设备,往里拖拽实例即可。类似下面,直接加载实例运行就可以了。


设备FB内部设计参考如下。低耦合是核心。



界面上除了设备本身的功能,有通信的监控页面,有通信通道的配置页面。


在触摸屏上,动态配置各个modbus设备究竟走哪个通道,场景大概如下。


如果把通信执行仅仅做为设备的IO考虑,这样的思路是适合任何存在公共IO竞争的设备,包括那些走以太网信道的也一样。只不过以太网下为虚拟通道,可以独占,通常无需竞争。

但不排除由于PLC后台静态线程资源紧张,需要动态更换不同对象来使用同一个虚拟通道的案例需求。


说这些仅供参考。博途下的通用化对象结构的设计思路。独占资源自不必说,但很多重要资源往往是有限稀缺,需要多个对象竞争性复用的。


非常感谢东侠,您的程序我还需要化时间来消化。

刚好,上次您提供的程序是V14的版本,而我安装的是V15的版本。我用V15方式无法打开,如果您有打开方式不妨告诉一下,谢谢。不然,我只能去借同事有安装V14版本的电脑来打开您的程序了。


 
以下网友喜欢您的帖子:

  
游士

经验值: 166
发帖数: 149
精华帖: 0
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 15楼 2023-05-23 09:09:33

感谢大家的经验分享,实例写的很好


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2114
发帖数: 550
精华帖: 0
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 16楼 2023-05-23 09:34:25

过来学习,感谢分享


学而时习之,不亦说乎
以下网友喜欢您的帖子:

  
侠圣

经验值: 2237
发帖数: 208
精华帖: 2
回复:S7-1214C的Modbus rtu通讯一例


只看楼主 17楼 2023-05-23 14:18:38


感谢分享实例


 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
S7-1214C的Modbus rtu通讯一例
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。