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

已锁定

yming

西门子1847工业学习平台

  • 帖子

    23718
  • 精华

    915
  • 被关注

    1289

论坛等级:至圣

注册时间:2004-03-06

钻石 钻石 如何晋级?

发布于 2022-07-07 17:41:54

29楼

展开查看
以下是引用宝冬在2022-07-07 14:29:41的发言 >28楼

假设某FB内部有10行代码,原本的设计意图是:只要第1行被触发,后面就会一直顺序执行到第10行完毕。

但是由于模块同时被多处调用,就有可能出现:虽然本处调用的第1行没有触发,但第8行的条件已经为真,结果就在本处调用中,后面的部分语句在第1行未触发的情况下被执行。

也就是说:内部的某个语句,如果前置条件不是以外部管脚为条件,而是以内部的静态变量为条件,这个静态变量就有可能被其它处的调用给激活,从而导致该行在本处调用中被执行。

也就是说:它的内部构造不是完全与本处调用耦合的,比如:所有的逻辑都被放进一个以输入管脚事件为条件的大IF语句中。

就这么个大概意思吧。所以这样的外部调用方式并不好,它耦合于模块的内部构造。同一个实例的多处调用,会让内部的静态数据,在多处调用之间,成为逻辑传递的公共区。

即使官方的东西也可能有瑕疵。全球库很多范例可以看源代码,很多西门子程序员都是老派的。

这是由用户程序任务和通讯任务并行处理决定的。

一个通讯连接,只能有一个数据处理缓冲区;只能指定一个数据块。就是这个背景数据块

用户程序经过与通讯任务处理器(并行的另外线程)打交道。

若想要在用户程序中,多次调用这个同一背景数据块的功能块,就是要检查每个调用的输入项,与激活、被保存的输入项是否一致。

一致的就有效输出,不一致的就直接跳出(输出未定);或完全指定输出零。


楼主后面的三个完全一致的调用,只是在同一周期中,对通讯处理器查询三次。至于那次DONE=1都有可能。

学而时习之,不亦说乎?温故而知新,不亦乐乎?
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有11143条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。