技术论坛

【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能

作者 主题
侠士

经验值: 1746
发帖数: 141
精华帖: 4
主题:【探讨】【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精华帖精华帖星级4级 精编帖 推荐帖


只看楼主 只看精华 只看精编 楼主 2022-07-05 18:04:12

周末测试ModbusTCP通信时,发现MB_Client块竟然可以使用同一个实例多次无条件调用,很是惊奇。疑惑了两天,至今也没有完全想通细节,就尝试写了一个类似效果的程序,功能可以类似实现。


现发布一个编程挑战,实现图片中功能:

    1.编写FB使用同一个实例在同一个周期多次无条件调用。

    2.输入引脚IN触发延时,延时完成后在触发延时的那个块OUT引脚输出。

    3.同时只有一个延时在工作。

    4.正在执行任务的调用块BUSY引脚置True。


要求:

    1.使用图片中FB块的引脚,不增加新的引脚。

    2.只使用FB块内部变量。



希望各位大佬赏脸参与,编程完成跟帖上传程序,共同探讨功能实现。我将10天后上传图片中程序。


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
重要声明:

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

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1769146&b_id=66&s_id=0&pno=1

至圣

经验值: 13937
发帖数: 2008
精华帖: 43
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 1楼 2022-07-07 08:27:33

这种思路本来就有问题!

1:一个MODBUS TCP 连接 只用一个背景实例 ,至于多次调了,那是受到了,西门子给做的DEMO的影响!

2:推荐做法是在西门子标准MB_CLIENT基础上再封装一层,一个MODBUS TCP连接只调一次,多个命令,轮询执行,而不是一个命令,单独调用一次。

就像第三方网关一样,配置个命令表,PLC程序内部扫描有多少MB命令需要执行,上一个执行完毕,或者超时,再执行下一个命令;

程序内部 根据命令表动态改变

MB_MODE

MB_DATA_ADDR

MB_DATA_LEN

三个参数类容


人生就像一场旅行!
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 楼主 2楼 2022-07-07 13:19:36
以下是引用Letham在2022-07-07 08:27:33的发言 >1楼

这种思路本来就有问题!

1:一个MODBUS TCP 连接 只用一个背景实例 ,至于多次调了,那是受到了,西门子给做的DEMO的影响!

2:推荐做法是在西门子标准MB_CLIENT基础上再封装一层,一个MODBUS TCP连接只调一次,多个命令,轮询执行,而不是一个命令,单独调用一次。

就像第三方网关一样,配置个命令表,PLC程序内部扫描有多少MB命令需要执行,上一个执行完毕,或者超时,再执行下一个命令;

程序内部 根据命令表动态改变

MB_MODE

MB_DATA_ADDR

MB_DATA_LEN

三个参数类容

不能认同!

您推荐的用法是可以用,而官方给的示例不仅可以用,而且更方便,打破了以前的很多认知,说明西门子官方制作这个指令块的时候就考虑了这样的用法。

本贴是基于之前帖子讨论,希望能够通过自行编程实现功能,以讨论实现的方法,如果Letham版主感兴趣,可以一试~



公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 3楼 2022-07-07 18:12:25
以下是引用Letham在2022-07-07 08:27:33的发言 >1楼

这种思路本来就有问题!

1:一个MODBUS TCP 连接 只用一个背景实例 ,至于多次调了,那是受到了,西门子给做的DEMO的影响!

2:推荐做法是在西门子标准MB_CLIENT基础上再封装一层,一个MODBUS TCP连接只调一次,多个命令,轮询执行,而不是一个命令,单独调用一次。

就像第三方网关一样,配置个命令表,PLC程序内部扫描有多少MB命令需要执行,上一个执行完毕,或者超时,再执行下一个命令;

程序内部 根据命令表动态改变

MB_MODE

MB_DATA_ADDR

MB_DATA_LEN

三个参数类容

我也没那么用过。

看了一下,逻辑上确实可行。西门子提供的功能块,能够确保同一扫描周期中,同一背景数据块下,同一FB多次调用的正确输出。


除了通讯这类程序,没遇到啥程序需要这样做?也可能复杂多变的工艺有吧。



学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
至圣

经验值: 13937
发帖数: 2008
精华帖: 43
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精华帖精华帖星级5级 精编帖 推荐帖


只看楼主 只看精华 只看精编 4楼 2022-07-08 09:04:08
以下是引用yming在2022-07-07 18:12:25的发言 >3楼

我也没那么用过。

看了一下,逻辑上确实可行。西门子提供的功能块,能够确保同一扫描周期中,同一背景数据块下,同一FB多次调用的正确输出。


除了通讯这类程序,没遇到啥程序需要这样做?也可能复杂多变的工艺有吧。


以下是引用Letham在2022-07-07 08:27:33的发言 >1楼:这种思路本来就有问...

引用1楼详细内容:

这种思路本来就有问题!

1:一个MODBUS TCP 连接 只用一个背景实例 ,至于多次调了,那是受到了,西门子给做的DEMO的影响!

2:推荐做法是在西门子标准MB_CLIENT基础上再封装一层,一个MODBUS TCP连接只调一次,多个命令,轮询执行,而不是一个命令,单独调用一次。

就像第三方网关一样,配置个命令表,PLC程序内部扫描有多少MB命令需要执行,上一个执行完毕,或者超时,再执行下一个命令;

程序内部 根据命令表动态改变

MB_MODE

MB_DATA_ADDR

MB_DATA_LEN

三个参数类容

最基本原理都是一样的,上一个命令发送完成,或者超时错误等,发送下一个命令。
但是西门子提供的DEMO,如果 读写多个寄存器,线圈等,那么需要自己 更改代码,一个命令使用同样背景实例调用一次,它只是提供了一种可行方法的最基本原理。



这个,是我做的MB_CLIENT程序,按照市场上第三方网关的通用配置设计,一个连接,我只调用一次,有多少命令需要发送,自己配置在DB块里,包括和服务器的连接参数配置。

读过来的数据 ,要存放到什么区域(程序里我写死了,必须是数据块),或者 写命令的 数据来自与哪里,全部配置在命令表里。

下图是我们常用的一个网关配置界面。




人生就像一场旅行!
精华帖版主置评: 这是MB_Client经典的命令打包写法。只需修改命令DB。 -yming
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 5楼 2022-07-08 10:04:18
以下是引用Letham在2022-07-08 09:04:08的发言 >4楼

最基本原理都是一样的,上一个命令发送完成,或者超时错误等,发送下一个命令。
但是西门子提供的DEMO,如果 读写多个寄存器,线圈等,那么需要自己 更改代码,一个命令使用同样背景实例调用一次,它只是提供了一种可行方法的最基本原理。



这个,是我做的MB_CLIENT程序,按照市场上第三方网关的通用配置设计,一个连接,我只调用一次,有多少命令需要发送,自己配置在DB块里,包括和服务器的连接参数配置。

读过来的数据 ,要存放到什么区域(程序里我写死了,必须是数据块),或者 写命令的 数据来自与哪里,全部配置在命令表里。

下图是我们常用的一个网关配置界面。



以下是引用yming在2022-07-07 18:12:25的发言 >3楼:我也没那么用过。看...

引用3楼详细内容:

我也没那么用过。

看了一下,逻辑上确实可行。西门子提供的功能块,能够确保同一扫描周期中,同一背景数据块下,同一FB多次调用的正确输出。


除了通讯这类程序,没遇到啥程序需要这样做?也可能复杂多变的工艺有吧。


以下是引用Letham在2022-07-07 08:27:33的发言 >1楼:这种思路本来就有问...

引用1楼详细内容:

这种思路本来就有问题!

1:一个MODBUS TCP 连接 只用一个背景实例 ,至于多次调了,那是受到了,西门子给做的DEMO的影响!

2:推荐做法是在西门子标准MB_CLIENT基础上再封装一层,一个MODBUS TCP连接只调一次,多个命令,轮询执行,而不是一个命令,单独调用一次。

就像第三方网关一样,配置个命令表,PLC程序内部扫描有多少MB命令需要执行,上一个执行完毕,或者超时,再执行下一个命令;

程序内部 根据命令表动态改变

MB_MODE

MB_DATA_ADDR

MB_DATA_LEN

三个参数类容

楼主通过研究西门子MB_CLIENT,提出问题的真正意义是:

针对异步任务,在写功能块时,应该怎样做,才能确保不出错。

西门子功能块的这种写法,确实值得借鉴。

(每循环调用一次OK;调用数次也行。)


楼主给出的工况示例,不明显。要找个合适的示例。


学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
侠圣

经验值: 2625
发帖数: 734
精华帖: 3
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 7楼 2022-07-08 14:46:45

看下MB_Client的背景数据块,SAVED_MB_DATA_ADDR,SAVED_DATA_LEN,SAVED_MB_MODE,大致就能理解这个功能如何实现的,诚如之前大家分析的,它是通过绑定管脚来识别当前调用的实例。

这个方法是可行的,更适用于固定场景的简单通讯应用。

宝冬侠举了个例子,把这比喻成开房,但是我的理解稍微有点不同。酒店房间预约给了3拨客人,但其实同一时间只有一波客人能拿到房卡(管脚信息),房卡信息同步输入保存到系统,也就是存到了static区域saved相关的几个变量,其实这样是不会乱掉的,管脚和系统信息匹配了才能自由出入。只有这波客人走后,房卡才会在req上升沿通过管脚来更新。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 13749
发帖数: 2032
精华帖: 16
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 9楼 2022-07-08 16:35:35

我也习惯一个FB,然后通过外部引脚实现轮询。

当然可以一个实例,方法多次调用,但这个在高级语言比较常见,PLC上用起来比较怪。


工控毁我青春!
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 10楼 2022-07-08 16:39:26
以下是引用宝冬在2022-07-08 16:17:23的发言 >8楼

这种问题的本质是:用FB内部的静态变量,做公共数据区来用,就像全局DB一样。而习惯上静态变量是做为需要封装起来的内部私有计算使用的。


弊端就是用FB的内部数据做公共区产生的。代码上固然可以实现,但丧失扩展性和可剪裁的柔性。


调度是需要封装的东西,尤其是当它变得越来越复杂。这样才能保证FB外部接口界面的使用无关性,而不是在FB外边还要再套一层机制,来解决管脚外面的调度约束。一个封装好的FB拿过来,外部管脚的使用越简单越好,而不是还要使用者在外部再自建一套管理。


这就和很多人都抢着上一个单间厕所一样,大家自主协调,有人占了你就等着,有人要是紧急憋不住了,你就让他夹塞先上。而不需要再额外设置一个厕所排序叫号的管理员。这需要每个参与者都把排序和竞争的规则,封装进各自头脑内部。


没看出有啥弊端哦。

只能说西门子编写功能块的严谨。

按版主常规这么用可以,直接一次列出多次调用也可以。给编程者最大的自由度。


学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
侠圣

经验值: 2625
发帖数: 734
精华帖: 3
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 11楼 2022-07-08 16:48:48
以下是引用yming在2022-07-08 16:39:26的发言 >10楼

没看出有啥弊端哦。

只能说西门子编写功能块的严谨。

按版主常规这么用可以,直接一次列出多次调用也可以。给编程者最大的自由度。

以下是引用宝冬在2022-07-08 16:17:23的发言 >8楼:这种问题的本质是:...

引用8楼详细内容:

这种问题的本质是:用FB内部的静态变量,做公共数据区来用,就像全局DB一样。而习惯上静态变量是做为需要封装起来的内部私有计算使用的。


弊端就是用FB的内部数据做公共区产生的。代码上固然可以实现,但丧失扩展性和可剪裁的柔性。


调度是需要封装的东西,尤其是当它变得越来越复杂。这样才能保证FB外部接口界面的使用无关性,而不是在FB外边还要再套一层机制,来解决管脚外面的调度约束。一个封装好的FB拿过来,外部管脚的使用越简单越好,而不是还要使用者在外部再自建一套管理。


这就和很多人都抢着上一个单间厕所一样,大家自主协调,有人占了你就等着,有人要是紧急憋不住了,你就让他夹塞先上。而不需要再额外设置一个厕所排序叫号的管理员。这需要每个参与者都把排序和竞争的规则,封装进各自头脑内部。


逻辑是很简单,西门子功能块也很健壮,但是有些上层应用会比较复杂,譬如掉站处理,譬如写优先处理(循环读,事件触发写),譬如故障处理等等,这样的话就还得是靠包装了。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 15532
发帖数: 1735
精华帖: 0
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
推荐帖


只看楼主 只看精华 只看精编 12楼 2022-07-09 09:44:19

涨见识,又学一招,学以致用,谢谢!


海纳百川,厚德务实!
以下网友喜欢您的帖子:

  
版主

经验值: 76198
发帖数: 19143
精华帖: 378
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 13楼 2022-07-09 10:22:02

楼主的第二个程序,虽未见具体程序,但从贴出的录波图上还是可以看出一些问题的


所有的延时设置都是5s,但输出的间隔却是不等的,后三个输出间隔分别为3,4,5s。


另外,楼主的MB-TCP的程序也没有贴出,就是这么一说




Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 楼主 14楼 2022-07-09 13:31:14
以下是引用Zane在2022-07-09 10:22:02的发言 >13楼

楼主的第二个程序,虽未见具体程序,但从贴出的录波图上还是可以看出一些问题的


所有的延时设置都是5s,但输出的间隔却是不等的,后三个输出间隔分别为3,4,5s。


另外,楼主的MB-TCP的程序也没有贴出,就是这么一说



Zane大师观察仔细呀,确实是,原因是因为程序截图和Trace不是同时截的。MB_Client程序在另外一个帖子里,使用的就是官方的示例方法。

为什么MB_Client块可以使用同一个背景数据块多次调用,如何实现的?


公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
侠士

经验值: 1746
发帖数: 141
精华帖: 4
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 楼主 16楼 2022-07-11 08:47:31


我想到的几种思路:

  • 参数比较。

    每次调用参数均不同,比较当前任务与输入参数,可以正常输出。

  • 调用次数计数   

    核心问题是如何在块内判断调用属于同一周期。 记忆任务触发时的调用序号,也可以实现功能。

  • 参数堆栈

     核心问题也是如何在块内判断调用属于同一周期。 这种方法可以实现Mod_Client块测试中看到的效果,但是其背景数据块并没有看到相应的存储变量。






公众号"worksway工方工园",欢迎关注~
以下网友喜欢您的帖子:

  
侠士

经验值: 1237
发帖数: 100
精华帖: 0
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
推荐帖


只看楼主 只看精华 只看精编 17楼 2022-07-13 08:42:39

参观学习下


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

  
侠客

经验值: 774
发帖数: 81
精华帖: 0
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能


只看楼主 只看精华 只看精编 19楼 2022-07-13 18:00:01

后天要公布程序吗?楼主能再总结下,就更好了


办法总比困难多!
以下网友喜欢您的帖子:

  
侠客

经验值: 846
发帖数: 90
精华帖: 1
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能


只看楼主 只看精华 只看精编 20楼 2022-07-14 00:12:20

跟着学习,感谢分享!


 
以下网友喜欢您的帖子:

  
至圣

经验值: 12573
发帖数: 2503
精华帖: 31
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
推荐帖


只看楼主 只看精华 只看精编 21楼 2022-07-14 08:06:34
只要学过C语言的状态字编程,写这种程序很简单啊。
FB最开始就是判断自身状态字是否空闲,不空闲就直接false不处理当前这次调用的参数。
感觉这样写程序是非常不好的习惯。

 
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 22楼 2022-07-14 10:30:23

好多回帖,其实没搞明白楼主想说的是啥?

他想说明的是:

一个功能块FB,使用同一个背景数据块DB(很多情况下,过程处理通道是独占的。处理这个过程,只能用这个背景数据块DB。)

常规写法就是完成这个过程,进行下一个过程。(在一个扫描周期,只调用一次FB。完成后,赋予新的过程参数。)

若所需处理过程数量很少,(2-3个),在一个扫描周期内调用2-3次,当前被调用的FB如何正确输出!



学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
至圣

经验值: 127331
发帖数: 22001
精华帖: 824
回复:【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
精编帖 推荐帖


只看楼主 只看精华 只看精编 23楼 2022-07-14 11:58:19

另外,举个例子看看:




驱动可以是电机、也可以是液压、气缸。

组装可以是零件,也可以装箱等等。

通常,都是完成一个过程Done。再赋予新的过程参数。

若,过程很少。在一个扫描周期中,连续三次调用(分别三套参数),过程FB的写法。







学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
收起
【编程挑战】同一个FB使用同一个实例多次无条件调用完成功能
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。