1009 【万泉河】设备参数值掉电保持实现
这个话题以前探讨过多次。但都不彻底。
以前是因为面对的是西门子PORTAL ,FB的每个管脚都可以设置保持。 所以焦点主要在优化块和非优化块,在非优化块对掉电保持资源消耗量大的问题。
而最近在撰写《三菱PLC标准化编程烟台方法》的书,这个问题又逐渐抬到前台来了。我在分发三菱的标准化示范项目资料的时候, 跟学员就直接坦诚, 这一块的问题我没有解决,留着等需要的时候再大家一起努力想办法找到解决方案。
这都好几年过去了,上周借着写书的机会,温习了一部分内容,就跟学员们做了一次讲座。 讲座之余,问起学员们这个问题,他们在实际项目中如何解决的。 有几个老学员,自己标准化应用已经很熟练了,回答我还是FB管脚绑锁存区的软元件数据来实现的。
这种是最原始的,工作量最大的方法。 等于他们也同样对这个问题没有解决,等于是暂时搁置了。面向未来,搁置争议,这在政治上是政治智慧,在技术上也是一种智慧。
当然,也可能他们自身对这一点并不太重视,不觉得有痛点。百分之九十的痛点都解决了,都爽到了, 还有一点点固有的不爽, 也无足轻重了。
然而对我这种偏执狂则不行的。 当然啦,我是烟台方法的奠基者,我当然有责任尽可能把一切都做好,做到尽善尽美。 都能给出完美的解决方案。
于是,花了点时间重新研究了下,做了实现。 有近3年多的新技能的积累,理解力和方法又深了一层,实现起来就容易多了,方向也清晰多了。
从头来描述这个问题。
对于一台设备,一个设定参数,在PLC中本质上是FB的一个管脚。 这个管脚会连接到HMI的变量,即可以对这个参数的设定修改。
那么这个数值会有多个侧面,分别是当前值,存储值和出厂初始值。
当前值即在线运行使用的参数值。 如果是称重系统, 则是称重目标值,如果是温度控制系统, 会是温度的给定值。 然而会要求这个数值在万一系统掉电之后重新恢复后不要丢。要尽可能和掉电之前的运行值相同,至少不能全丢了,导致工厂要恢复生产还需要忙上大半天去逐个参数进行修改。
当然,如果HMI支持配方存储功能,可以将所有参数储存为配方,通过配方下发批量完成所有参数的恢复。 但这里讲不依赖HMI,也不依赖人工操作,仅在PLC功能就能自动保存记忆的情况下。
另外还有一个值是出厂初始值,即如果恢复工厂设置, 比如换了CPU, 程序重新下载,那么将源程序重新下载到CPU之后,系统也应该有一套基本的接近靠谱的设定参数,而不是全部参数都是0。即便需要针对当下的生产工艺对参数做一定的更新, 也不至于一上来系统就是瘫痪的,完全不能跑。
所以就是写在程序中的,也必须有一套数值。
我以前有讨论过INPUT管脚又要有固定数值,又要能修改,这是不可能实现的。 那么我们现在应该知道了, 最好的方式是设置两套管脚,固定值用于赋值初始值,而与HMI接口的是另一套管脚,且单独实现掉电保持的问题。
即便在S7-1500的FB中,其实也存在这个问题。 它的FB的管脚虽说有一个初始值,但这个初始值是专属于FB的,即各实例的IDB得到的初始值都相同。而不会给每个实例都预留好不同的初始值。 如果要针对每个实例修改, 还需要逐个打开IDB进行修改。其实也很麻烦。
现在的解决思路是, 制作一个专用的SETSAVE的块,在工艺块内部来调用它, 工艺块需要保存的参数有多少个,就调用多少次。SETSAVE块内部,为这些参数分配存储区域位置。分配后只实现数据保存和调用,但具体的位置在哪里, 不需要知道。
而在工艺块FB的管脚就有2套同样的管脚,分别用于存放初始值和运行设定值,运行设定值对接HMI,接受修改。
SETSAVE块实现的功能:
1, 首次上电,将出厂值送给运行值和保存值。
2, 首次上电之外的每次掉电后的重新上电,将保存值恢复到运行值。
3, 每个周期随时随地,或判断有修改后,将运行值存储到保存值。
比如有一个WTING块,给定参数打包放在UDT中, 分别为SP1, SP2, SP3:
标签 数据类型 注释
SP1 FLOAT (Single Precision)
SP2 FLOAT (Single Precision)
SP3 FLOAT (Single Precision)
而出厂值则为3个单独的管脚,分别为W1,W2,W3:
类 标签 数据类型
VAR_INPUT W1 FLOAT (Single Precision)
VAR_INPUT W2 FLOAT (Single Precision)
VAR_INPUT W3 FLOAT (Single Precision)
VAR_IN_OUT UU U01_RECP
最后一个UDT则为上述打包的给定参数。
程序中开始部分的实现则为:
SETSAVE_1(DATA0:=W1 ,RUNDATA:= UU.SP1 );
SETSAVE_1(DATA0:=W2 ,RUNDATA:= UU.SP2 );
SETSAVE_1(DATA0:=W3 ,RUNDATA:= UU.SP3 );
其后为正式程序。
即实现了需要的功能。
把功能需求和实现思路梳理清楚后,实现过程其实是比较简单的。 任何有一定功底的PLC工程师都可以自己完成。 就像我曾经提出的中央报警指示灯的实现思路,同一天内, 有2个网友,非学员,来问我当初文章的题目。他们只是记得这回事,但文章题目不记得了。 我给了提示后他们找到了文章,也是不到半天,就纷纷告捷大功告成了。
这个函数块,也是一样, 只给思路, 不分发具体的程序逻辑实现方法。 我是为了完成书中的内容, 在三菱GX2系统,FX3U下实现的。 三菱标准化学习营的学员如果需要,可以跟我索取。 未来可能可以在书中见到一部分源代码。
其他的品牌平台的学员, 以及只购买了打印版三菱源程序的非正式学员, 不提供。
S7-1500系统下,我还没想清楚是否有必要这么做。 而SMART系统,因为V区掉电本来就会保持7天,所以一直以来需求不强烈。但将来有需要的话我会考虑移植到SMART 200中同样实现。
但三菱学员即便得到这个程序,也只是提供思路和实现途径,本人并不负责代码的完整正确。 真的要应用到工程中, 还需要每个人自己去把关验证。
所以,我其实并不负责所有代码的正确。我之所以不愿意随意分享后开发的源代码,也是出于这方面的考虑。 烟台方法,给人的只是编程思想和架构。我给的有源代码的项目程序,也只是保证用于我自己的工程现场,是原汁原味完整好用的,但并不保证可以直接拿去套用到学员自己的行业项目。
所以, 总有人在造谣宣扬烟台方法的程序中有bug。 其实是很愚蠢可笑的。我都没有这样的责任和义务, 何来的bug? 有没有bug是我跟我自己的客户之间的事,我的设备在现场运行几百套,即便有bug哭的是我自己,别人操的哪门子心?
不过真正的烟台方法的学员,当然都是懂这些的。从来都是我催促他们往前走,而从没有人在我后面挑出来什么所谓的bug。