0720 【万泉河】机械参数不是全局变量
我在10多年前首次提出的PLC编程不用全局变量M和T的理论,着实惊讶到了一大批人。 其中有一批是坚决不相信,所以就搬出各种反面证据来印证。而另外还有一批信是信的,但程序做的胆战心惊,就怕自己没用好,把程序做垃圾了。
我后来反思,应该是我表达的不够清楚,导致一些人没理解透彻,产生了歧义。 比如我后来有组织过讨论,FB的背景数据块的数据,在某些品牌的PLC中是不允许外部访问的,然而在某些品牌又是可以访问。 后者以西门子为代表。 那么这些数据算是全局变量还是不是全局变量呢?
其实我一直表达的全局变量是一种逻辑用法。 从定时器T就能看出来,它既是一种寄存器变量,也是一种用法。 比如我说不用T,可从来没有说过不让用IEC定时器,或者自治的定时器。 如果不用,程序需要定时的地方,功能就无法实现了。
对全局变量M也是。PLC中给规划了M变量空间,给你做什么用的,你拿来做了什么,你必须清楚。 而我当然更清楚。 我反对的是你用来做这部分功能的用法。
比如在一个程序块FC_B中,逻辑需要知道在FC_A中的某个逻辑状态的值,比如某个BOOL量状态,就用M,或者某个阀门的开度,轴的当前位置等,就用MW或者MD。那么你就在FC_A中把值送到M和MD, 然后在FC_B中使用它,就得到了这个值。
这就叫使用全局变量。 通过全局变量作为一种编程方法,实现了程序功能。 所以反对的是方法,而不是变量本身。 我也有写过许多文章介绍合理使用M的技巧方法。 都不符合这种全局变量用法特征。 同时我每次也都告诫提醒, 你方法如果不变,只是脑筋急转弯,把M和MD替换为DB.DBX或者DB.DBD,仍然是换汤不换药的全局变量用法。
这种全局变量用法的特征是,你有通过它来进行数据传递,需要通过全局的索引,追索到数据是从哪里写入的,又从哪里有读取使用过。 这是你以往写程序时常用的技俩(不是技巧,就是技俩,贬义)。也是你读别人的程序最头疼的部分。你不了解原始的程序逻辑,原本希望通过读程序逻辑来了解工艺,然而最终缺不可避免陷入到这种无穷无尽的对数据变量的追索中。
很多时候因为追索没头绪,同一个变量会被反复重复追索而仍然记不住。 然后你就会忍不住反复的痛骂,垃圾程序,程序太垃圾了。恨恨的宣誓,宁肯自己另起炉灶重写,也不愿读这样的程序。 而其实如果技能手法不变,你自己重新架构的程序,到了别人眼里,也是同样的会随时被另起炉灶丢弃的垃圾。
那么程序中其实还有一些数据变量,它原本就可以被全局访问,然而不适应这种用法特征,就不算做全局变量。
我这里给出的一类数据便是机械参数。
与机械参数对应的先是电气参数,那些与电气元器件本身相关的,比如阀门的开关时间, 模拟量的上下限值等等,往往是这个EM自身的参数,其应该有初始值,也应该可以被修改设定,修改之后还应该被保存。前面的文章有讲到过。
而机械参数,则是在电气参数之外的参数。 最常见的是在某个工步伺服需要走过的位置距离,PID的给定值等等,这些会与机械机构,以及生产产品特性相关,称之为机械参数。
机械参数的特征是,在数值需要变化不能用常量的情况下,数值通常会在触摸屏或者上位机上设定,而在PLC程序逻辑中只读取使用。 这个数据流向非常清晰:触摸屏写入,PLC读取。甚至有时候还要有配方管理,进行不同参数的切换。 但任何人读这样的程序的时候就不需要追根朔源,你读到的时候就知道它是参数,来自上位机的参数。
那么对于这些参数, 你就在程序逻辑中放心的用,放心的读好了。 不需要担心被嘲笑垃圾,烟台方法的学员也不需要担心被万老师打屁股。 甚至,如果需要,某个参数值在不同的程序逻辑中需要多次读取, 你也想读变读,直接读取使用,而不需要搞一个程序功能,专门读取后送到一个变量接口,分发到不同的应用场景中。 非但不需要,反而是如果用了反而麻烦了。
而如果这个参数值是变化的,程序逻辑中的一个数值对应的有可能是上位机中的一套参数,需要根据当下的实际运行的步号,查询检索到参数集中的具体值,如果这部分检索很复杂,需要一些程序逻辑,你当然也将其封装为一个程序块。 我有写过文章《0103 【万泉河】PLC程序块INOUT管脚的倒置用法》
https://mp.weixin.qq.com/s/ikVx2rQgdiDvkSnYTfkQzg
如果需要可以用。
最后,我再举一个IT应用的例子来验证。比如电脑软件中窗口的设定,需要获知显示器的分辨率以及用户设置的字体大小方案。 这种参数就不是全局变量。 每一个窗口,它自己用到的自行去获得,获得后直接用来组态当下的窗口布局。 而其它的窗口也都各自独立完成,互相之间不需要交互,也不需要再使用其他的变量或者接口辅助。