故事作者:万泉河

最近创作

看看TA的故事

1112 【万泉河】FB内静态变量的使用

已锁定

万泉河

  • 帖子

    10904
  • 精华

    132
  • 被关注

    1012

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

1112 【万泉河】FB内静态变量的使用

1453

8

2022-11-12 17:30:01

1112 【万泉河】FB内静态变量的使用

 

很早以前,写过一篇文章:《【万泉河】PLC系统变量的作用域和生存期》

https://*********.qq.com/s/OG2j2LV_-5e2SU_aR4XzAQ


 

文章中提到了PLC中非常重要的静态变量的使用问题。

 

后来,我还发起了一场投票,测试大家的基本知识的掌握程度:

 

投票题:《静态变量是全局变量吗?》

http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1513112&b_id=50&s_id=76&num=45#anch


 

说实话, 那个投票结果我是不太满意的。或者说与我的预期大相径庭。当然也不是说我因此就多不高兴。 而是让我从中发现了广大同行的基础原理知识有多薄弱。那么多高手在基础原理方面的认知都是错误的,也怪不得只有我能研究出烟台方法,而其他人一直跟不上呢!

 

所以后来又写了一篇文章,《【万泉河】上帝不是全局变量》

https://*********.qq.com/s/ykcuLBPlzFcJzqGdnQA_eA


 

间接讲解了全局变量,全局访问之间的差异。

 

简单说,全局变量、局部变量是变量自身的身份。 身份的不同是靠出生地决定的。 而能否被全能局访问,能被多大范围空间访问,即首篇文章中讲到的作用域,是完全不同的概念。 不能混而等同之。

 

然而,如果大家对写程序并没有什么原则目标, 只以完成设计任务为目的,以设备最终能跑起来为目的,这些概念不清楚也无所谓。尤其只在西门子平台内谈,没有横向的对比,就得不出更深刻的经验。

 

所以,这个话题就放下了。 估计当年的读者们也都放下了,没几个人放在心上。

 

我自己最近在编写《三菱PLC标准化烟台方法》的书,在写书的过程中,在做一些小例子来验证功能。其中把西门子的程序移植到了GX WORKS2,写完了GX2的章节。然后现在又把程序移植到GX WORKS3,为GX3的章节整理素材。就发现了问题。

 

简单描述,就是原本在西门子程序中,有外部对FB块内的静态变量访问,到GX2,也仍然这么做的。 但移植到GX3时,发现了问题,编译报错。

 

经咨询三菱标准化的学员,得到提醒, 说新的GX3平台,静态变量VAR多出来一个VAR_PUBLIC的类型,可以支持外部访问。 照着修改之后,果然没问题了。

 

(很多人以为我做啥品牌的标准化方法,就一定要在掌握这个品牌全部的高精端的知识基础上,其实恰恰相反, 我只是对标准化架构熟悉,而对这些具体品牌和软件的使用,我反而时刻在跟学员们学习请教。)

 

我现在回过头看我当年提出的问题,就很清楚了。 静态变量能被全局访问,被很多人误以为就是等同于全局变量,那是因为只在西门子的井底。 当视界扩大到所有PLC品牌和平台之后,就不一样了。 甚至GX2和GX3都不一样。

 

GX2中VAR可以被全局访问,而GX3中则不可以。

 

你总不能认为GX2中的VAR是全局变量,而GX3中的 VAR就不是全局变量了吧?

 

发现这个问题的起源的程序块来自西门子官方库BST,先后移植到GX2和GX3。而根源又是其设计的部分静态变量要被WINCC访问,即勾选了HMI/OPC可见的选项。

 

在PORTAL中,不管是否勾选,影响的只是WINCC访问的权限,而在程序中FB外的访问都是畅通无阻的。

 

我在上帝一篇中建议过加个开关,关掉被块外部访问的权限,现在看,GX3果然做到了。

 

而最近几天,也有学员在开发自己的库函数,跟我沟通相似的问题。问我与WINCC通讯相关的变量放在OUTPUT还是STATIC更合适的问题。

 

我给与的回答是,原则上来讲,应该放到INOUT或者OUTPUT。 而放到VAR STATIC是不合适的,不符合封装的原则。 比如我这次的移植,就出现了问题。

 

不能因为看到有西门子官方的例子程序这么做过,就理所当然的认为就是正确无误的。 他们的作者也是普通的工控工程师,也未必事事都严格规范。

 

而我很容易就从西门子官方出的《设计规范指南》中找到了理论依据。

 

其中的

DA005规则:只通过形参交换数据

DA006规则:仅从块内访问静态变量

 

有人会杠, 如果不让从块外访问静态变量, 那系统为啥要设计为可以访问?

 

就如同我一直在推广PLC中编程不要使用M全局变量的理论,有人杠我系统设计了就该允许使用一个逻辑。

 

答案是系统提供的功能是给非规范的程序准备的。未必所有程序,比如测试学习程序也需要完全遵守规范。

 

而倒过来说,如果系统提供的功能即符合规范规则,只要规范规则之外的用法系统即不允许。 如我在GX3遇到的这样。 那么,连编程规范都不需要存在。 西门子也不需要整理一个设计规范了。

 

你做的不对, 编译都不通过,保存都亮红灯的事,还需要写在规范里面吗?

 

规范里的所有违反规范的相反的做法,都是可以用的,无非是不规范而已。

 

所以,我们在GX3遇到的问题, 那些导致编译错误的变量,  正确规范的数据类型应该是INOUT和OUTPUT。

 

有一些刚入门的工程师, 甚至连FB都不会用,从未用过的工程师,会看不懂我的这些文章,会质疑这些文章传播的知识什么用,我不懂你这些道理,我甚至不需要用FB,不也照样做出功能正常运行的设备吗?

 

我借用某Z常说的一句话:“基础不牢,地动山摇”。其实我不完全认同这个道理的。 基础不牢,不会导致你地动山摇,你在入门级别的工作并不受影响。而恰恰反过来,如果基础牢了, 会有更高的起飞的空间。

 

就好比,田径运动员基础的动作姿势如果不标准,在校级运动会可能没什么大的影响,照样有可能获得校运会冠军。然而当到了更大的天地间,就会发现姿势标准的重要性了。而等到了奥运会选手的级别,所有的运动员动作一定都是最标准的了。 因为那是基础的基本功。

 

 


1112 【万泉河】FB内静态变量的使用 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

网友专栏

共有3376条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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