博图标准化编程技巧(五)智能电表数据转换
智能电表一般采用Modbus的方式与PLC通讯,数据通常都是16位整数,需要在PLC里面编写数据处理程序换原为一次侧实际值。我们一般要读取智能电表的三相电压、电流、总功率、总功率因数、频率、总有功电量等数据,如果逐行写转换命令会非常繁琐,所以最好将一个电表的数据处理程序集成为一个FC程序块多次调用。
我们需要显示的变量在智能电表的通讯地址表里通常不是连续存储的,如下面整个电表的通讯地址,所需要的数据存储在40041到40065之间的25个16位地址中。当电表数量较少时我们可以采用轮询的方式只读取我们需要的变量,当电表数据较多时为了提高轮询效率我们一般一次性读取25个数据,后期处理时再分别摘取需要的数据。我习惯使用一款国产485转PN的通讯网关,这个网关可以将485通讯数据直接映射到PLC的IW数据区,不需要编写485通讯程序,非常方便。

在设计FC的接口时,简单的方法就是输入接口分别连接需要的三相电压、电流、总功率、总功率因数、频率、有功电能等原始地址,输出接口再分别连接以上转换后的地址变量,输入输出接口都需要十几个,程序块会非常长。为了使程序更加简洁,输出接口我们采用前面介绍的UDT数据类型定义,这样只需要连接一次就可以了;输入接口我们定义为一个25个无符号整数的数组,这样就可以一次性输入所有原始数据。

使用的时候,我们先用BLKMOV块移动指令将25个IW地址数据赋值给一个中间数组变量,然后将数组变量连接到FC的输入接口,再将换算系数等常数填入,最后在输出接口填入转换后的UDT上位监控变量地址就可以完成一个智能电表的数据转换,并且这个程序看起来非常整洁,还不宜出错。

唯一的遗憾是我曾经尝试将IW数据直接填入FC的输入接口但没有成功,希望有经验的大佬留言指点一下可否实现,如何实现。