最近在做一个项目,要求使用1200读取电控柜里面一个仪表的参数,有8,9个参数,大概需要分4次读取。于是就是选取了1214C+CM1241Mobus这种方式进行。在编程时遇到疑问:原因时Modbus_Comm_Load的MB_DB参数需要连接下面Modbus_Master功能块的背景数据块,这样对于多次调用Modubs_Master就是个问题了。
于是参考了下西门子官方的MODBUS轮询例程,大概进行如下的编写。
到这里就比较惊讶 了,于是去查了下
MB_Master这个就是个FB功能块,带背景数据块,如果按照例程中那样调用,就是出现在程序中多次使用同一个背景数据块的问题,这会不会产生什么问题呢?
(由于手里暂时没有硬件,所以暂时不知道例程是否能得到正确的结果)
于是我就做了个测试,目的就是看对于调用同一个同样背景数据库的程序会产生什么影响:
1. 首先生成一个公共调用的FB块,分别带了bool和real的数据输入、输入输出、输出和在里面生成的静态变量
2. 程序如下:
Net1如果第一个bool参数(bit1)为True,则将输入的数据+88然后输出到输出变量1 outval1
Net2如果第二个bool参数(bit2)的上升沿,则将第一个输入输出(inoutval1)变量自加1,而将其内部的静态数据(intervals[0])自减1,将结果分别赋值给输出变量2(outval2)和输入输出变量2(inoutval2)
3. 生成外部调用
首先使用一个2HZ的脉冲进行将MW50从0~2变化,然后按MW50分别触发bit2的脉冲,
然后下面分3次调用:
第一次:
第二次
第三次
4. 测试
经过测试,得出如下结果:
a. 如果输入1(bit1)为True时,程序想要的时将输入1(val1)+88.0然后输出到输出变量(outval1)
结果如下:如果3次调用都是false,则对3个的输出结果都不影响。任意一个调用为True,该调用将会影响所有结果,直到下一个调用为真的更改结果。
b. 如果bit2有脉冲输入时,那么FB里面想要结果:
输入变量2(bit2)的上升沿会将输入输出1(inoutval1)的结果自加1
同时将内部静态变量intervals[0]自减去1,然后再将该值输出到输出变量2(outval2)和输入输出变量2(inoutval2)
而调用的结果:
对于打开脉冲的那个功能块,输入输出2(inoutval2)在跟随变化,而且变化频率是和触发的频率一致,而Outval2的变化会多1,是因为第3个也是打开了脉冲功能。
而对于第一个,关掉脉冲的:
结果输入输出不受影响,而输出将会也是跟随前面的功能块变化。
总结:如果非得在同一个程序使用相同的FB背景数据块,那么可能会产生如下结果:
1. 对于输出型的变量,值永远会刷新到输出连接的变量,只要有任何地方更改了改变量值。所有的输出都会是一样并且输出到连接的变量。也就是说,输出变量是共用的。
2. 对于输入输出的变量,如果不触发,则似乎不受影响。变量不共用。
3. 对于内部static变量,里面的所有变量会是共用的,例如如果想使用里面做沿触发存储位是会出错的。
那么问题来了,对于Modbus_Master里面的变量,
这些部分都会是共用,那么数据会得到准确的数值吗?
最后看到有人另外一种方案:使用Modbus_Master的输出参数作为变量,然后每次调用完后及时取出来,然后更改参数再读取,可能这样比较靠谱些。