技术论坛

 求一个能用的modbus rtu主站轮询程序

返回主题列表
作者 主题
doubaoning
游民

经验值:127
发帖数:21
精华帖:0
楼主    2019-12-30 11:59:17
主题:求一个能用的modbus rtu主站轮询程序 精编帖 

最近按照西门子官方例程里写了个程序,完成位或故障位做轮询条件的程序,程序开始跑着没问题,轮询非常块,某时就卡死不发指令了,指示灯也不闪了。求一个现场测试没问题的 modbus rtu主站轮询程序,谢谢,发我邮箱:  dou_baoning@163.com

yming
至圣

经验值:127287
发帖数:21996
精华帖:825
1楼    2019-12-30 13:50:27
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

必须按异步方式(按完成位或故障位做轮询条件的程序)。其他的方法都有隐患。

Modbus RTU是通过CM485模块进行的。要找出卡住的原因。


检查程序:注意Done、Error仅存在一个扫描周期。你是否使用了其他中断?



学而时习之,不亦说乎?温故而知新,不亦乐乎?
'Razor
至圣

经验值:20113
发帖数:2773
精华帖:23
3楼    2019-12-30 21:45:29
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

可以试试版主Zane的程序

Less is more……
454565806
游士

经验值:206
发帖数:13
精华帖:0
6楼    2020-02-13 22:21:28
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

我发一个485轮询通信架构你看下。由于带的设备少此程序不是很全。程序修改一下可以做到按需要轮询,深入了解可以问我。此程序架构所有PLC都可以实现,单站速度3毫秒轮询。此程序是读取485继电器板用的

485通信程序.rar


Zane
版主

经验值:76319
发帖数:19347
精华帖:378
7楼    2020-02-13 23:47:51
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

脱离了工况与使用环境的性能指标只能是吹牛皮!

3毫秒轮询?

9600波特率,一次刷2个存储器单元,你试试!?


莫不是把扫描周期当成轮询时间了吧?!

Zane 注册自动化系统工程师 Always save before download
454565806
游士

经验值:206
发帖数:13
精华帖:0
9楼    2020-02-14 02:58:30
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

我看了你一篇MODBUS  RTU的一篇帖子,你形容的很好,轮询有高速,有低速。我第一做RTU通信的时候做出的架构就是和你说的差不多功能,以上发的附件不完整。完整的你应该会认可的。我的指令是定制的,不能用标准MODBUS库。所以我都是用自由口写的。没事不要那么大火气。我一个西门子项目没做过的,能在这里和你讨论。对我来说已经学了很多。同时也敬佩了你们的专业知识。其实很多时候我的野路子也能给你们启发。我从来不吹牛,没有数据或不能实现的东西不能乱说。S7-200SMART我按我的架构写了轮询程序。1200的我也写了轮询架构。松下,三菱都用了很多台机器,一种方法而已。

Zane
版主

经验值:76319
发帖数:19347
精华帖:378
10楼    2020-02-14 14:19:17
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

我对野路子没有兴趣,奉劝你也别热衷于野路子,这只会毁了你的技术前程!


工控是一个理论与实践紧密结合的行业,


希望你在能够好好学习,论坛也能给予你应有的帮助,如果还像上两个帖子一样插大葱装象,那只能是贻笑大方了。

Zane 注册自动化系统工程师 Always save before download
Zane
版主

经验值:76319
发帖数:19347
精华帖:378
11楼    2020-02-14 14:36:20
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

有存在即合理一说,但我认为很多不合理的事情依旧存在是因为还有很多人自以为是。

Zane 注册自动化系统工程师 Always save before download
一串奇怪的数字
侠士

经验值:1326
发帖数:114
精华帖:4
12楼    2020-06-01 14:09:23
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

1.时间+DONE双保险,时间可以大一些,举个例子假定正常读次需要20ms,我们可以把时间轮询设到50ms.即50ms未收到Done、Error,就指向下一个。
2.另外标准库确实有它的局限性。有些场合也会用自己写的块,毕竟实际读写用的的功能码很少,不用每个都加进去,可以节省一点PLC内存。

人生没有边界,一切皆有可能。
Zane
版主

经验值:76319
发帖数:19347
精华帖:378
13楼    2020-06-01 23:23:09
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

也是个没脑子的,设置超时时间的依据是什么呀?

Zane 注册自动化系统工程师 Always save before download
一串奇怪的数字
侠士

经验值:1326
发帖数:114
精华帖:4
14楼    2020-06-02 09:27:37
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

如果看过西门子库的原码,你就会知道这个timeout 是干嘛的,  也就会理解为什么有时候明明设置的timeout ,这个超时的错误就是出不来,也就会发生done 和error都出不来时候。
我只是在这个timeout上加了一个双保险而已,咋就没有脑子了,呵呵。
中国这个大环境就是这样,对EMC不重视,虽然硬件上有缺陷,这个时候就只能靠软件弥补。对于大多数用户来说,又便宜又好用,能满足需求就够了。
对应我而言,能解决实际需求的都是好方法,至于取舍让用户去选择。

人生没有边界,一切皆有可能。
kenshinguo
侠圣

经验值:2627
发帖数:736
精华帖:3
15楼    2020-06-02 10:38:06
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

自己加超时检测,强行切换通信进程还是要注意的。各品牌PLC的通信功能块自己都有超时检测的,默认时间大部分都是1s,如果自己超时检测短于这个时间的话,碰到一个有问题的站,往往轮询就会出问题了。如果自己超时检测大于这个时间的话,其实还不等你超时时间到,error信号就有了。

一串奇怪的数字
侠士

经验值:1326
发帖数:114
精华帖:4
16楼    2020-06-02 11:28:33
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

西门子库最大问题就是会卡在第4步 

      0 = 空闲

      1 = 等待发送

      2 = 等待发送完成

      3 =等待接收第一个字符

      4 = 等待接收完成

      5 =接收完成

一旦走到第4步后,这个timeout是给不出来的。  
对200和200smart  可以监控   mModbusState 这个变量
对于1200和1500    可以监控      MB_State  这个变量
发生卡顿后,可以分析问题到底出在哪。
我只学习过西门子PLC,别家PLC没怎么用过,不清楚怎么个机制。
我只是西门子PLC的一个小学生,希望得到专家的指正。

人生没有边界,一切皆有可能。
Zane
版主

经验值:76319
发帖数:19347
精华帖:378
17楼    2020-06-02 23:01:59
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

现在的源代码你看过吗?


明确告诉你,不判断ERROR与DONE信号,靠所谓的超时来重新触发轮询通信任务,更会雪上加霜,导致你所谓的通信卡顿现象。


另外,RTU接口是在主机还是在分布式IO站上,处理的方式也有不同,好好看看手册。


没用好就没用好,别动不动就说官方的库有问题,你也太小瞧西门子了。



Zane 注册自动化系统工程师 Always save before download
Zane
版主

经验值:76319
发帖数:19347
精华帖:378
19楼    2020-06-03 00:03:38
精华帖  精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

Modbus_Master 通信规则

● 必须先执行 Modbus_Comm_Load 组态端口,然后 Modbus_Master 指令才能与该端口通信。

● 如果要将某个端口用于初始化 Modbus 主站请求,则 Modbus_Slave 不应使用该端口。Modbus_Master 执行的一个或多个实例可使用该端口,但是对于该端口,所有Modbus_Master 执行都必须使用同一个Modbus_Master 背景数据块。

● Modbus 指令不使用通信中断事件来控制通信过程。用户程序必须轮询 Modbus_Master指令以了解传送和接收的完成情况。

● 对于给定的端口,从程序循环 OB 中调用所有 Modbus_Master 执行。Modbus_Master 指令只能在一个程序循环或循环/延时执行等级执行。它们不能同时在两种执行优先级中执行。如果一个Modbus_Master 指令被另一个执行优先级更高的 Modbus_Master 取代,将导致不正确的操作。Modbus_Master 指令不能在启动、诊断或时间错误执行优先级执行。

● Modbus_Master 指令启动传输后,必须连续执行已启用 EN 输入的该实例,直到返回状态 DONE=1 或状态 ERROR=1 为止。在这两个事件其中之一发生前,一个特殊的Modbus_Master 实例被视为已激活。原始实例激活后,调用已启用 REQ 输入的其它任何实例都将导致错误。如果原始实例的连续执行过程停止,则请求状态保持激活一段时间,该时间由静态变量“Blocked_Proc_Timeout”指定。一旦超出该时间段,则下一个使用激活的 REQ 输入调用的 Modbus_Master 指令成为激活实例。这可以防止单个

Modbus_Master 指令独占或锁定对端口的访问。如果在由静态变量“Blocked_Proc_Timeout”指定的时间段内没有启用原始激活的实例,则下次执行此实例(未设置 REQ)时将清除激活状态。如果设置了REQ,则此次执行将启动新的Modbus_Master 请求,如同其它实例未曾激活一样。


Zane 注册自动化系统工程师 Always save before download
一串奇怪的数字
侠士

经验值:1326
发帖数:114
精华帖:4
20楼    2020-06-03 10:16:03
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

1:回到本帖的楼主遇到的问题,通讯就是卡死了,真的是没有用好吗?

2.必须先执行 Modbus_Comm_Load 组态端口,然后 Modbus_Master 指令才能与该端口通信
这个真的是必须的吗?用port_config就一定不行?

3.  Modbus_Comm_Load把MODE藏在静态变量里,坑了多少新手?把这个MODE放到接口处就那么难吗?

4:曾经有个需求,一个串口又要做主站,又要做从站?(200PLC )难道说用户的这个需求就一定有问题,必须换PLC?

人生没有边界,一切皆有可能。
一串奇怪的数字
侠士

经验值:1326
发帖数:114
精华帖:4
21楼    2020-06-03 19:38:15
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

另外,我仔细拜读过Zane 版主的程序,写的真的非常好。
我有这么一个想法,如果在DONE/Error后直接通过程序跳转到前面触发下一次轮询,是否会节省一个扫描周期。假定扫描周期10ms,轮询20个任务,是否可以节省200ms?
另外建议Zane 版主火气不要那么大,应该允许别人提出不同意见,我绝对是西门子忠实粉丝。

人生没有边界,一切皆有可能。
一串奇怪的数字
侠士

经验值:1326
发帖数:114
精华帖:4
22楼    2020-06-04 08:42:59
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

最后说一点,标准化编程好归好,但是它是以牺牲内存和计算效率为代价的。以Zane版主的程序为例,就一个MODBUS 轮询就占了多少内存?
Zane版主也说了脱离了工况与使用环境的性能指标只能是吹牛皮!
以1200为例,全系列的计算速度是一个指标,所以想缩短扫描周期,往往就需要针对性的优化程序,删除不要的功能,否则必须换系列了。
可能有点跑题了。

人生没有边界,一切皆有可能。
Zane
版主

经验值:76319
发帖数:19347
精华帖:378
23楼    2020-06-04 22:24:50
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

枉费我一番苦心,我就是要错开一个扫描周期,另外我可以得以实现通信轮询任务的自激启动,第三让总线得以平静,提高通信的可靠性

Zane 注册自动化系统工程师 Always save before download
芳季
至圣

经验值:67465
发帖数:14768
精华帖:100
24楼    2020-06-04 22:45:05
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

绝对可以省。但后面的工作真的不必时就是省下的。

我先读一个驱动器的报警字节,如果发现驱动器根本上就离线了,后面的读什么写什么都是不必的了。直接跳到下一站驱动器。如果读到有报警那么余下的驱动指令都是不必的了。只留复位在候命。

Zane
版主

经验值:76319
发帖数:19347
精华帖:378
25楼    2020-06-04 22:53:29
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序
  1.   我遇到的情况,还真就如此,你可以试试我的程序。

  2. 只有正确执行Modbus_Comm_Load 组态端口,Modbus_Master 指令才会正确执行,但Modbus_Master 指令不能有任何的调用条件,除非做组态控制,避免硬件寻址出错。Modbus_Master 指令是异步执行指令,在一次通信任务结束前中断调用是通信死机的最主要原因!所以我即使修改波特率,Modbus_Comm_Load 执行复位,我也不会中断Modbus_Master 指令的执行,大不了出一次错而已,不会死机。

  3. 关于MODE参数,可能是西门子想“这回真的便宜你了”,挖个坑让菜鸟们呆一会儿。在线帮助有说明,就看你看手册的功力了。

  4. 在现有技术条件下,我认为还是个无理要求,RTU的主从功能是应该分不同的物理端口来实现的。

Zane 注册自动化系统工程师 Always save before download
Zane
版主

经验值:76319
发帖数:19347
精华帖:378
26楼    2020-06-04 23:01:56
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

芳侠你讲的问题,超出了我的例程所包含功能的范围,我的例程是基于任务的轮询通信,不是基于站点的轮询通信,若是后者,每个站的任务中只要一个出错,后续的任务就不必再执行下去了。

Zane 注册自动化系统工程师 Always save before download
Zane
版主

经验值:76319
发帖数:19347
精华帖:378
27楼    2020-06-05 00:53:45
精编帖  主题:回复:求一个能用的modbus rtu主站轮询程序

这是经过平衡取舍的,有所为而有所不为,程序在S7-1200经历了若干个版本的修改,使最终用了较多的数据存储区,但程序量是十分精简的,执行的效率是比较高的。

另外,使用全优化的编程模式,即使对于保持数据区域的使用也是可以根据实际需求调节的

Zane 注册自动化系统工程师 Always save before download
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。