回复:一个困扰我多年的问题:FB,FC 内部的output变量,在块内是否可读?

已锁定

xyvsjay

  • 帖子

    208
  • 精华

    0
  • 被关注

    4

论坛等级:侠士

注册时间:2017-11-05

钻石 钻石 如何晋级?

发布于 2024-10-17 10:06:08

25楼

展开查看
以下是引用leeber在2024-10-16 15:12:55的发言 >23楼

1200和1500的FB块中的output在其背景数据块中有存储,所以其可以在块内进行读取操作。因为FB的OUTPUT引脚除工艺对象外都是副本传递方式,读取的值为程序内部形参的最新值,无法读取该输出变量对应实参的最新值(这个也是和inout参数的重要区别之一);

由于其有背景数据块保持其值,即使在程序内第一次读取,且读取前还未对其值进行赋值,也不会存在不可预测的值,其会读取该形参的默认值(起始值),在非首次读取时,会读取该形参的最新值。


FC的output,没有背景数据块存储其值,并且在接口定义参数时,output参数不能赋默认值(起始值),所以在程序中还未对该Output参数赋值的情况下,对副本方式传递的output参数进行读取操作,会读取到不可预测的值。实际上,在FC中读取output参数时,TIA会对该指令标黄提示该指令有风险,但是编译时不会报错,也不会有警告。


FC用指针方式传递的output参数,其实质已经变为Inout参数类型了。虽然TIA依然会对其标为黄色,但是在程序内部和inout参数类型一样使用,完全可以进行读写操作。这时TIA编程建议:将该参数定义为inout参数以提高程序的可读性和规范性。



赞同你的说法。

FB中,output是有独立的背景数据块对应的,和static没什么区别,实际当成static使用也可以。在博图v19里读output也不再标黄。FB的各个变量区,input output inout static 本质相同,但是博图为他们做了功能区分,在外部调用时做了接口的映射,这个映射可以理解为梯形图的输出线圈。

如果你不遵循博图为你设置的功能区分,程序同样可以运行,最多出现双线圈情况,双线圈也不是bug,只要你理解机制就能使用。

博图本来设置的标准中,FB的背景块不要在外部使用,内部也遵循input只读 output只写 static只在fb内使用,但实际项目中至少static经常被人在外部读写,比如上位机。

FC会有一些区别,FC是没有背景数据来存储相关变量的,实际output和temp变量是一样的,如果你先读后写,读的就是初始0,博图中临时变量不同于200中不可预测,已经为你设置了初始值0或false。FC中你可以按照博图的标准来使用,input只读,output只写 temp先写后读,你不遵循同样没问题,只产生类似临时变量使用的问题。

博图的很多使用都很灵活,没有限制,这些软性标准是为了使程序标准化模块化,如果你没有完全理解,还是按照设定的标准来使用,这会更规范,程序可读性更好。

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15100条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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