技术论坛

Modbus_RTU多站“轮询”,是说这个站的信号没有读写结束,就不能去读写下一站的数据吗?还是......

作者 主题
侠圣

经验值: 3606
发帖数: 744
精华帖: 3
主题:【求助】Modbus_RTU多站“轮询”,是说这个站的信号没有读写结束,就不能去读写下一站的数据吗?还是......
推荐帖


只看楼主 楼主 2019-09-20 18:40:42

    我手头的项目是用Modbus_RTU两线多站制,而Modbus_RTU只能做“轮询”。在编程时我就遇到困惑,这个轮询是什么意思,是说这个站的数据读完了,发出一个"Done"的信号,这个“Done”信号传递给下一站,下一站才能做通信;如果上一站因为某种原因,数据没有读完(或者写完),迟迟发不出“Done”的信号,下一站就无法进行通信?如下图左。

   比如下图,有三个站,各自需要读写电表功率、马达速度和炉子真空度。“轮询”是不是意味着,如果“电表功率”没有读写完毕,则不能进行“马达速度”的读写;如果“马达速度”没有读写完毕,则不能进行“炉子真空度”读写?

   还是Modbus_RTU在访问某一站时,即使数据没有读完(或者写完),但是超过了时限,Modbus_RTU就掉头去下一站做数据的读写?如下图右。即使“电表功率”没有读写完,但是Modbus_RTU依然去读写“马达速度”?

  追问:如果有三个从站,是不是就要做三次组态即三次调用“Modbus_Comm_Load”指令?可是我在官网上的教程中只看到多从站但是只调用“Modbus_Comm_Load”一次呀。(官网教程见http://www.ad.siemens.com.cn/productportal/prods/s7-1200_plc_easy_plus/11-Comm/03-Serial/02-Modbus/02-Modbus_RTU.htm)

   望大侠指点迷津。

   


   


 
以下网友喜欢您的帖子:

  
重要声明:

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

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1585701&b_id=50

奇侠

经验值: 5102
发帖数: 520
精华帖: 7
回复:Modbus_RTU多站“轮询”,是说这个站的信号没有读写结束,就不能去读写下一站的数据吗?还是......
推荐帖


只看楼主 2楼 2019-09-20 19:51:53
认真做事,低调做人
以下网友喜欢您的帖子:

  
奇侠

经验值: 5102
发帖数: 520
精华帖: 7
回复:Modbus_RTU多站“轮询”,是说这个站的信号没有读写结束,就不能去读写下一站的数据吗?还是......
推荐帖


只看楼主 1楼 2019-09-20 19:47:41

RS485 半双工通讯,同一总线上的设备,同一时刻只能一个设备发送字符,

Modbus_RTU采用主从模式,一条总线上只能有一个主站设备,只有主站设备才能主动发送命令,从站只能根据主站命令被动回复。主站发送命令后,不管是正常接收还是数据错误或者应答超时,都要继续执行下一条指令,依次循环,就是所谓的轮询。

左侧图片基本正确。


认真做事,低调做人
以下网友喜欢您的帖子:

  
侠圣

经验值: 3606
发帖数: 744
精华帖: 3
回复:Modbus_RTU多站“轮询”,是说这个站的信号没有读写结束,就不能去读写下一站的数据吗?还是......
推荐帖


只看楼主 楼主 3楼 2019-09-20 22:40:15
以下是引用--意孤行在2019-09-20 19:47:41的发言 >1楼

RS485 半双工通讯,同一总线上的设备,同一时刻只能一个设备发送字符,

Modbus_RTU采用主从模式,一条总线上只能有一个主站设备,只有主站设备才能主动发送命令,从站只能根据主站命令被动回复。主站发送命令后,不管是正常接收还是数据错误或者应答超时,都要继续执行下一条指令,依次循环,就是所谓的轮询。

左侧图片基本正确。

朋友,带两个从站,要两次调用Modbus_Comm_Load指令吗?


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3606
发帖数: 744
精华帖: 3
回复:Modbus_RTU多站“轮询”,是说这个站的信号没有读写结束,就不能去读写下一站的数据吗?还是......
推荐帖


只看楼主 楼主 5楼 2019-09-20 23:24:43
以下是引用宝冬在2019-09-20 23:14:41的发言 >4楼

1、通常每一次读或写的通信操作的结局要么是Done,要么是Error。无论是哪一个,都代表本次通信结束了,都用来触发下一个读写操作。超出时限是Error的一种情况。

2、MB_Comm_Load是用来设置PLC的485端口参数的,这配置通常运行中是不变的,所以一般上电后一个端口初始化一次就完了。这指令是给端口用的和站点无关,一个端口带10个站点,也只用一次。

3、MB_Master指令是用来执行读写操作的,轮询就是依次反复的使用这个指令。使用这条指令有如下两种风格。(A)每一次读写都单独使用一个MB_Master指令。如果是10次读写的轮询,那就在程序中写了10个MB_Master指令,每个指令的变量都单独配置。(B)无论有多少次读写,程序中只用一个MB_Master指令。这个指令的变量是采用参数化的方式,每一次调用前,变量内容都会更新,以完成不同的读写操作。

4、在3的基础上,可以对MB_Master指令进行进一步封装,形成通用的站点通信FB。对于任意一个给定站点的、任意次数的、各种类型的、类型和数量可以动态变更的读写操作,该模块都可以完成。与站点通信相关的所有参数和信息,和通信后各种信息的处理,需要有另外的FC或FB,与站点通信FB进行流水线式的配合和调度,以完成若干不同站点的依次通信。

5、在4的基础上,可以对各个站点的通信质量进行监控,包括错误率、错误代码、每个站点的通信队列执行时间等。通信差的可以淘汰,改善后可以召回,或者强制召回。为了提高效率,写入成功后,就不再继续写入,直到下一次需要写入的数据发生变化。如果有必要,485端口可以在运行中重新初始化,有些应用中可以支持485模块在线插拔。


自己知道的Modbus-RTU使用的套路也就这些供参考。博途中Modbus-RTU指令有新旧两套,我一直用旧的。新的功能多一点。

受益非浅。谢谢!


 
以下网友喜欢您的帖子:

  
侠士

经验值: 1782
发帖数: 324
精华帖: 0
回复:Modbus_RTU多站“轮询”,是说这个站的信号没有读写结束,就不能去读写下一站的数据吗?还是......
推荐帖


只看楼主 6楼 2019-09-24 09:55:55

轮询通讯感觉就是老师挨个检查作业,可有有多种思路,最常用的就是等待上一条指令的完成位或者故障位去触发吓一条指令的执行位,这个时候程序写起来比较麻烦,思维逻辑要清晰,就像老师检查作业是问每一个同学,完成了没有,需要等同学回答完成或者没有完成后才进行下一步;我个人一般不会那样写,用一个简单的计数器搞定,每个几百ms计一次数,记到一定数后清零计数器,当计数器的值等于某一个特地值时执行一条指令,不管执行情况怎样,就去执行下一条指令,就像老师检查作业不管你有没有回答,直接问下一个;第一种思路对于时间利用率非常充分,能够好不浪费且最大限度的实时采集数据,第二种方法对于数据的实时性采集不够,浪费了时间。具体根据系统对于数据的实时性要求而定吧!


老老实实做人,踏踏实实做事!
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
Modbus_RTU多站“轮询”,是说这个站的信号没有读写结束,就不能去读写下一站的数据吗?还是......
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。