0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

全局变量与全局访问之间的差异

opkgjew 来源:PLC标准化编程 作者:万泉河0031 2022-11-14 11:21 次阅读

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

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

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

我自己最近在编写《三菱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规则:仅从块内访问静态变量

5eb973dc-6273-11ed-8abf-dac502259ad0.png

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

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

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

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

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

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

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

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

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

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




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HMI
    HMI
    +关注

    关注

    9

    文章

    489

    浏览量

    47887
  • VaR
    VaR
    +关注

    关注

    0

    文章

    37

    浏览量

    11117
  • 静态变量
    +关注

    关注

    0

    文章

    13

    浏览量

    6608

原文标题:1112 【万泉河】FB内静态变量的使用

文章出处:【微信号:PLC标准化编程,微信公众号:PLC标准化编程】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    全局变量太多有哪些弊端?

    随着全局变量的增多,不同模块的变量名可能会产生冲突或混淆,导致代码难以理解和维护。同时,全局变量使得代码中的依赖关系变得复杂,难以追踪和理解。这增加了新开发人员的学习成本,也增加了修改和调试的难度。
    发表于 04-24 09:15 74次阅读

    Tc38x中全局变量访问只能是不带cache的地址吗?

    全局变量只能放置在不带cache的地址么?
    发表于 02-06 08:17

    全局变量数组数据错乱怎么解决?

    不知道是自己定义的全局变量太多了还是怎么了? 在执行数组赋值的时候不同的全局变量会出现共用地址的问题,也就是明明在给A赋值但是B的值也一起变了?导致出现数据错乱,不知有谁遇到过这种情况???
    发表于 11-06 08:19

    STM8L进入低功耗全局变量释放的原因?

    做一项目,使用RTC闹钟唤醒功能唤醒,测试了两个月,没遇到全局变量释放的情况。今天上午发现单片机不能在指定时间唤醒,仿真模式下找了原因,发现使用的数组在进入休眠后,十分钟唤醒后,数组释放掉了,数组是全局变量。 向大神请教原因。
    发表于 11-03 08:18

    C语言中定义全局变量时,如何在定义变量时就指定好变量的地址?

    请问,C语言中定义全局变量时,如何在定义变量时就指定好变量的地址?
    发表于 11-03 06:31

    嵌入式全局变量的初始化原理详解

    全局变量的初始值,是在哪里赋值的?
    的头像 发表于 10-27 10:15 652次阅读
    嵌入式<b class='flag-5'>全局变量</b>的初始化原理详解

    labview全局变量不能用,接收不到数值

    我在labview程序里面加入一个全局变量,如图所示,用light1指示是有变化的,但是全局变量无变化,像是接收不到数值? 是因为我是在FPGA里面用的吗?FPGA里面不能用全局变量吗?
    发表于 07-31 21:43

    嵌入式C编程中全局变量问题分享

    嵌入式特别是单片机os-less的程序,最易范的错误是全局变量满天飞。这个现象在早期汇编转型过来的程序员以及初学者中常见,这帮家伙几乎把全局变量当作函数形参来用。
    发表于 07-17 16:53 520次阅读

    RTOS任务间通信为什么不用全局变量

    RTOS任务间通信为什么不用全局变量?原因在于使用全局变量存在诸多弊端。
    发表于 07-05 09:06 423次阅读

    static的全局变量与局部变量的使用,看完你就懂了

    全局变量有许多缺点,最明显的缺点是破坏了此变量访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。 另外,在 C++ 中,需要一
    发表于 06-27 08:54

    第81集(15.2#100)))小实验:寻觅全局变量和静态变量的默认值

    全局变量
    于振南的单片机世界
    发布于 :2023年06月14日 14:33:22

    第69集13.3#100)局部变量全局变量的家(堆栈):你了解吗?

    全局变量
    于振南的单片机世界
    发布于 :2023年06月14日 13:45:12

    求助,保存的全局变量在哪里?

    我有一个关于全局变量的新手问题。我们定义是否将代码保存到 RAM 或 FLASH 中,并带有函数属性。但是全局变量(在函数外部定义的)存储在哪里?也可以更改存储它们的位置吗?
    发表于 06-12 07:31

    西门子博途寻址全局变量

    要对全局 PLC 变量进行寻址,可以使用绝对地址或符号名称。
    的头像 发表于 06-10 11:35 3069次阅读

    MCUXPresso IDE加载全局变量时间过长怎么解决?

    当我进入调试模式并且我想观察一个全局变量时,我打开“全局变量”视图。 “Loading global variables from build artifacts”花费的时间太长,而且在它完成之前什么也做不了。 每次我打开“全局变量
    发表于 05-17 07:04