在梯形图中,对数据地址进行重复写入可能是错误的,如图1所示。
注:本文中提到的数据地址是指8位、16位、32位及64位的M区、Q区或DB块数据,而不是指1位的布尔量数据,关于布尔量或称位逻辑程序的重复写入,请参考文章:梯形图中的重复写入——位逻辑篇
图1 对数据地址进行错误的重复写入
在图1中,当I0.0为1时,程序段1中的MOVE指令被执行,3被写入到MW0中,此时由于I0.1为0,程序段2中的MOVE未被执行;当I0.0和I0.1都为1时,程序段2中的MOVE指令被执行,15被写入到MW0中,但此时程序段1、2同时执行,程序段1写入MW0中的3被程序段2中写入的15覆盖了(每个扫描周期中,15的结果都覆盖了3的结果),即表现为除最后一个以外的写入程序都失效。
如果您编写出图1的程序可能是想实现:I0.0为1,使MW0中的数值为3,而当I0.1为1时,使MW0的数值为15,即不同的条件下对MW0写入不同的数值。这样编程不仅会发生上述错误,而且即使实际工况可以接受写入15的优先级高于写入3的,但当这两行程序离得较远分别位于不同程序块中或同一个程序块的不同位置时,会降低程序的可读性。
其实,在不同条件下对同一数据地址写入不同的数值,应该处理成分段函数,其特点就是要描述清楚分段的条件。
例如:
当MW0
当0≤MW0≤500时,使MW2=MW0×2;
当MW0>500时,使MW2=500。
程序见图2。
图2 有相互独立条件的重复写入
可见,图2程序中并未出现数值覆盖的情况。因为虽然程序段1~3都对MW2进行写入操作,但三个程序段通过前面的条件而互相独立,这样三个程序段不会同时执行,即三个写入MW2的指令前面的RLO在某一时刻只能有一个为1。这不同于位逻辑中赋值指令的重复写入,写入数据的指令,其前面RLO为0时,此指令不执行或者说不会写入数据。
因此,对于数据地址的重复写入,在每个写入的程序前加上相互独立的条件就可以了,包括图1中的程序。
工控学苑愿陪您慢慢进步,请持续关注!
领取专属 10元无门槛券
私享最新 技术干货