【万泉河】设备的设定参数&&数据块的运行值
这其实是一回事。
只是观察者身份不同, 视角不同而已。
大部分设备, 都会有一些参数需要在运行中更改设置。 比如因为环境季节的变化, 或者原材料性能参数的变化, 设备的温度压力或者一些时间参数,需要操作员运行中根据实际工艺要求进行修改。
这些修改过的参数, 一定得能断电保存。不能够PLC断电重启了, 参数就全丢了, 还需要从头再设置一遍。 那很多时候就出事故了。 因为参数设置不完整, 系统运行不在最优状态, 生产线出废品, 甚至都不能正常运转。
断电保存这件事, 对PLC的功能来说, 曾经是个比较严重的事。 像S7-200,只有前面十几个字节的M区,可以设置为断电保存, 而整个V区, 是可以短时间内的断电保存,但时间长一点, 也丢了。 要想长期保存, 还得加电池。
而S7-300, 在程序卡升级为小卡的MMC之后,就完全解决了这个问题。 数据块中的运行数据,全都是可以断电保存的, 所以参数也不需要归拢在一个公共区域内了,到处都可以。 这就为模块化编程打好了基础。
比方说,一种类型的同样两台设备, 工艺运行中设定值不一样,现在就可以在各自的实例中保存各自不同的参数。 而不需要特别整理存储区域了。
到了S7-1200/1500,这个问题更简洁了。 对于优化的数据块,每个数据都可以单独设置是否保存。 非优化的数据块, 整个数据块设置为保存或不保存。 然后整个系统算总账,根据CPU不同, 可用的断电保持数据量不一样。 所以新的系统应该尽量使用优化数据块。
运行数据固然要运行中设置好了以后保存, 但程序编写时, 如果完全空着,留给运行以后再逐个设置。 那样程序上线后,即便程序本身逻辑都没有问题,但手动设置参数的工作量太大, 稍有疏忽, 也容易出安全事故。
比方说, 系统工艺规定的某个测点的温度值超过了一定的范围, 比如大概85度-90度,就要开启一系列安全设备。 而如果这个参数值没有设置,为0呢, 那程序一运行,就导致相关安全设备误启动了。至少,各种报警提示乱响,也怪吓人的。
所以, 对于这些参数值, 还需要一个默认的初始值。
嗯, 初始值。
有人会说了, 咦,就一个初始值的简单事,绕这么多弯子,费这么大的劲。
嗯。 没办法呀, 不从头讲起, 好多人不明白这事的来龙去脉, 后面的分析看不懂。
初始值的问题, 在计算机系统里很平常。 比如我们都知道的系统注册表, INI文件等, 保存的是软件的参数值。 在读取参数值的时候,可以约定默认值。 如果读取失败,至少有一个靠点谱的默认值,不至于因为参数值丢失而软件整个儿乱掉。
像读取INI文件的API函数:
DWORD GetProfileString(
LPCTSTR lpAppName, // 节名
LPCTSTR lpKeyName, // 键名,读取该键的值
LPCTSTR lpDefault, // 若指定的键不存在,该值作为读取的默认值
LPTSTR lpReturnedString, // 一个指向缓冲区的指针,接收读取的字符串
DWORD nSize // 指定lpReturnedString指向的缓冲区的大小
)---------------------
本文来自 FlyingTiger_Sun 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/vistas_fh/article/details/8894510?utm_source=copy
够清晰简单吧?
然而在PLC程序里,就没那么容易了。
比方说, 一个模拟量处理的FB,当然可以用于所有类型的模拟量。 比如一个是温度,上下限范围是0-100 deg 。另一个是压力,0-10 bar。FB的定义, 只能有1个默认值,同样, 高低限的报警值, 也只能一套, 要么90,要么9。那么在调用FB块的时候, 这个管脚怎么写?
我们都知道, FB的INPUT管脚是可以不输入具体数值和参数, 而留空的。 留空就意味着这个管脚这里是默认值。那不是默认值的, 调用时就要输入,比如上限报警值可以输入88.0 。
但是,问题来了:
输入88.0之后,这个管脚就固化了, 不能参数化, 不能修改了!
以后要改,还需要用编程器来改程序。这绝不符合我们的本意。
或许有一个办法,可以在实例创建完成以后, 钻到背景数据块里面改这个管脚的对应值。 是否好用,我甚至没有尝试过。 因为, 这种方式太隐蔽了, 根本没办法对照检查!
而且, 我认为, 对于模块化编程来说, 最好的方法是同一个对象, 所有参数,通道地址,标定值上下限值,报警值,乃至物理单位等, 在同一个完整的界面里实现, 那样容易批量化。对于动辄几百点乃至上千点的系统来说, 可以更好地节省时间。
比如, 我曾经做到的用SCL调用的程序:
// V209 (IN_INT:=" AI2_00 ",HI_LIM:= 5 ,LO_LIM:= 0 ,Unit:=' m ' ,INSTANCE:=' 软化水箱液位 ');
// V210 (IN_INT:=" AI2_01 ",HI_LIM:= 10 ,LO_LIM:= 0 ,Unit:=' Bar ' ,INSTANCE:=' 软化水补水压力 ');
// V211 (IN_INT:=" AI2_02 ",HI_LIM:= 100 ,LO_LIM:= -50 ,Unit:=' °C ' ,INSTANCE:=' 冷却塔供水温度 ');
// V212 (IN_INT:=" AI2_03 ",HI_LIM:= 10 ,LO_LIM:= 0 ,Unit:=' Bar ' ,INSTANCE:=' 冷却塔供水压力 ');
// V213 (IN_INT:=" AI2_04 ",HI_LIM:= 1 ,LO_LIM:= 0 ,Unit:=' ' ,INSTANCE:=' 备用 ');
// V214 (IN_INT:=" AI2_05 ",HI_LIM:= 100 ,LO_LIM:= -50 ,Unit:=' °C ' ,INSTANCE:=' 闭式冷却塔供水温度 ');
// V215 (IN_INT:=" AI2_06 ",HI_LIM:= 100 ,LO_LIM:= -50 ,Unit:=' °C ' ,INSTANCE:=' 闭式冷却塔回水温度 ');
// V216 (IN_INT:=" AI2_07 ",HI_LIM:= 200 ,LO_LIM:= 0 ,Unit:=' m3/h ' ,INSTANCE:=' 闭式冷却塔循环水流量 ');
// V217 (IN_INT:=" AI3_00 ",HI_LIM:= 600 ,LO_LIM:= 0 ,Unit:=' °C ' ,INSTANCE:=' 1#锅炉烟气温度 ');
// U011 (Run :=% I0.0 , Fault :=% I0.1 , Comment := ' 1#冷冻水泵 ');
// U012 (Run :=% I0.2 , Fault :=% I0.3 , Comment := ' 2#冷冻水泵 ');
// U013 (Run :=% I0.4 , Fault :=% I0.5 , Comment := ' 1#冷却水泵 ');
// U014 (Run :=% I0.6 , Fault :=% I0.7 , Comment := ' 2#冷却水泵 ');
// U015 (Run :=% I1.0 , Fault :=% I1.1 , Comment := ' 3#冷冻水泵 ');
// U016 (Run :=% I1.2 , Fault :=% I1.3 , Comment := ' 4#冷冻水泵 ');
// U017 (Run :=% I1.4 , Fault :=% I1.5 , Comment := ' 3#冷却水泵 ');
// U018 (Run :=% I2.0 , Fault :=% I2.1 , Comment := ' 热水循环泵 ');
// U019 (Run :=% I2.2 , Fault :=% I2.3 , Comment := ' 1#空压机循环水泵 ');
明眼人一定一眼就看透了。
没错!用EXCEL生成的。
原始数据表是这样的:
在校对完成后, 大部分的具体编程工作在EXCEL里完成的。
我以前写过文章:《【万泉河】EXCEL是个好工具》http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1467087&b_id=82&b_sid=19&s_id=&num=21#anch
有印象的同学可以跳转去重温一下。 没印象的不妨一读。
总之, 你不光要有编程的能力, 要想工作效率高,EXCEL也得能玩的很溜才行。 我玩的还行,如果觉得这方面也需要提高的也同样可以向我拜师学艺。
当然啦, 我推行的高效率工作的标准化PLC编程方式, 这里谈到的只是其中一点点思考。 其他方面的细节还有很多很多,很多。
更大的计划详见:
【万泉河】一个完全不使用T和M全局变量的好标准的PLC程序分享计划
本号历史文章还有:
【万泉河】一个完全不使用T和M全局变量的好标准的PLC程序分享计划