【万泉河】在S7-1200/1500的FB中,如何获取CPU启动首次循环的状态?
我算是服了我们的一些自动化同行。
我在还没开始推广标准化编程方法的时候,先发表过一组关于PLC编程中不要使用全局变量M的文章。相当于标准化编程方法的预热。
我这里再重申下我的观点,全局变量和标准化编程的关系:
使用全局变量的程序, 那是程序有多烂程度的问题。我们不否认一些精心设计反复打磨的使用M变量的程序有可能非常精炼,没有漏洞,非常优秀,设备运行可以很稳定,功能也很强大。但它再漂亮再精美, 也只是在跟垃圾程序做比较。完全谈不上标准化程序。
所以, 不使用全局变量, 避免使用全局变量,是红线,那是做标准化程序的底线。并不是说你程序中同样不使用全局变量,所以程序的架构就可以称为标准化程序了。还差的很远呢!我自己,十多年前就致力于程序中不使用M , 而标准化架构和理念完成,也不过近2-3年的事。
这观点原本很简单很容易理解的,你只要学过任何一门高级编程语言,就会知道编程的基本的理念,就是禁止滥用全局变量。在一个封闭的函数中使用全局变量,然后程序范围内任何一个地方都可用对这个全局变量进行读写修改, 这样的程序是非常糟糕的,不可接受的。
这对应到PLC系统中, 说的就是M变量。然而,可能是因为整个行业习惯的原因,一个原本最简单不过的常识,到了PLC行业,就特别难被认同。所以, 这一点,我就一直不能理解,不能理解同行们的思维逻辑。
有一位自称大拿级的高手,这一年多也写过不少关于他的标准化编程的文章。说实话, 我是从头到底没看懂过,没看懂他的标准化原理到底是什么。但我每次在他的公众号看到新文章后,总是率先转发到***中, 以期和大家一起探讨讨论,以期能从中学到一些有用的营养。
他的最新一期的文章,提到了程序中使用M变量的问题,虽然没有直接提及我的名字,但很明显,是针对我的观点做出了一些辩驳。
这样也挺好,我俩虽然有加过微信好友,也共同在***中,但关于标准化架构的问题, 一直没有面对面交锋过。基本上属于各说各话,互相不能理解。 所以这样的隔空对话,各自发表自己的观点,反而更文雅。
在我看来, 你只要承认PLC编程的本质就是一种计算机编程,那么在计算机领域存在的红线,在PLC编程中也一样存在,也一样是红线。
你辩解的各种理由,理由再多再自以为充分,也是徒劳的辩解。在一定的历史时期, PLC系统受限于其系统功能,无法绕开全局变量的使用,你需要承认那是迫不得已,而不能当做理直气壮,这里面的逻辑顺序不能颠倒。
有的人会觉得, 如果 我们约定好重要的全局变量的使用方式, 约定好哪些变量分别使用什么地址,那会非常方便,如果公司的所有程序都统一使用这个约定标准, 那很好很方便啊!反正我们追求的是公司范围内的标准化,又没有和你万老师一样的志向,要推广标准化编程方法到整个行业。
错了!这样的思想,很容易陷入到技术强人强行推广的标准化的陷阱,我有文章写过的:【万泉河】技术权威主导推动的企业标准化 http://www.ad.siemens.com.cn/club/bbs/PostStory.aspx?a_id=1615412&b_id=82&s_id=&num=3#anch
假设一下,在一个公司原本一个技术大拿搭建的公司标准,后来公司因为并购,或者规模扩张的原因, 又来了一个水平差不多, 甚至水平还稍微高一些的大拿。你原本的公司编程标准, 1HZ的脉冲信号约定使用M0.5, 而新大拿十几年编程都习惯使用M100.5为1HZ。 那得了,如果你嘲笑对方不标准, 那新大拿也可以同样的理由嘲笑你原公司做法不标准。因为互相都在以自己的习惯当标准,这非常危险,也非常容易带来混乱。
你公司的老人们可以以公司已有的技术基础为理由要求新人完全服从,但代价是新大拿原本积累的技术资源就全部要推翻重来了。 有可能原本双方技术上是可以有互补的,可以增强公司原有技术实力的,而这样就造成了浪费。 对公司来说是一种内卷化的损失。
好啦,说了这么多,终于可以进入正题了。
问题:在S7-1200/1500的FB中,如何获取CPU启动首次循环的状态?
为什么需要首次循环状态?有一些功能, 最常见的是自由口通讯,MODBUS通讯,以及MODBUS TCP通讯等,需要在CPU刚启动的时候,对通讯口的参数做一次初始化。有可能是启动时立马初始化,也可以启动一段时间比如5S后再进行初始化。但无论如何,都需要先获取CPU的首次循环。
对于不理解我提出的全局变量红线的人来说,这问题原本就不存在。只需要在CPU的属性中,指定一个MB字节,然后程序中需要用到首次启动的时候,直接使用M变量即可。
但这对于我们标准化阵营的同仁来说,这却是一个长久以来的难点。
你做了一个程序,需要用到首次扫描状态,但不管是在FB内部使用M变量, 还是把FIRSTSCAN状态直接做到INPUT管脚上,但每次程序移植,都总有可能因为疏忽了在CPU中勾选启用M字节,或者使用了其它的地址,程序功能莫名其妙失效。
如果这个M是不可设定的,如S7-200,它就是一个简单SM0.1供你使用,不可以更改,而且总是使能的, 那暂时没有问题。而怕就怕在既需要勾选使能,而地址还可以修改, 这就留下了后患。
分析一下对这个首次循环状态位的需求:
1, CPU不管是从失电状态到上电后的冷启动,还是带电状态的STOP切换到START状态的热启动,都需要首次循环为1, 而之后为0。
2, 这个状态需要保持,即在过了首次循环之后的整个CPU运行中,都需要保持为0。
而实现的方法,经过摸索,答案其实非常简单,简单到无聊,简单到这个问题太水,都不可以称之为技术问题:
你只需要在FB的静态变量中,建立一个名字叫做FirstScan的BOOL位,缺省值为1,掉电保持状态为NO;
FB程序正常的逻辑中直接使用这个FirstScan变量,只需要在FB的最后,对这个变量做一次复位即可!
天知道西门子开发者的想法,你在电状态,把CPU从运行切换到停止的时候,它会认为是掉电,那些未保持的数据,自然全部丢失回到默认值了。
可能就是为了满足我们这样的需求吧!