恭喜,你发布的帖子
发布于 2018-12-23 22:08:01
13楼
根据唐诗宋瓷的补充里提到的"Byte_Offset*8+Bit_Offset"来计算出索引,我直接把Zane版的例程中增加一个DB块“AddressCheck”,并新建两个数组,分别来存储计算出的DI和DO的地址索引,再遍历这两个数组中是否有相等的索引,如果有则表示地址有重叠的,置位重叠标志。
上图是增加的DB块
再修改Zane版例程中的FB100,增加几个Temp变量如上图,在FB100中增加程序段1如下:
#DIAccNo := 0;
#DOAccNo := 0;
FOR #Count1 := 0 TO #Obj_No_Set DO
FOR #Count2 := 0 TO 5 DO
//根据公式【Byte_Offset*8+Bit_Offset】计算输入区的地址,将结果保存到数据块【AddressCheck】的DIACC数组中
IF #IO_Obj[#Count1].Obj_IO[#Count2].Area = 16#81 THEN
"AddressCheck".DIAcc[#DIAccNo] := DINT_TO_INT(#IO_Obj[#Count1].Obj_IO[#Count2].Byte_Offset) * 8
+ #IO_Obj[#Count1].Obj_IO[#Count2].Bit_Offset;
#DIAccNo := #DIAccNo + 1;
END_IF;
//根据公式【Byte_Offset*8+Bit_Offset】计算输出区的地址,将结果保存到数据块【AddressCheck】的DOACC数组中
IF #IO_Obj[#Count1].Obj_IO[#Count2].Area = 16#82 THEN
"AddressCheck".DOAcc[#DOAccNo] := DINT_TO_INT(#IO_Obj[#Count1].Obj_IO[#Count2].Byte_Offset) * 8
+ #IO_Obj[#Count1].Obj_IO[#Count2].Bit_Offset;
#DOAccNo := #DOAccNo + 1;
END_IF;
END_FOR;
END_FOR;
//遍历查找数据块【AddressCheck】的DIACC数组中是否有相等的值,有则标志位置1并退出循环
#Count3 := #DIAccNo - 3;
FOR #Count4 := 0 TO #Count3 DO
FOR #Count5 := #Count4 TO #Count3 DO
#Count6 := #Count5 + 1;
IF "AddressCheck".DIAcc[#Count4] = "AddressCheck".DIAcc[#Count6] THEN
#Sign := 1;
EXIT;
END_IF;
END_FOR;
END_FOR;
//遍历查找数据块【AddressCheck】的DOACC数组中是否有相等的值,有则标志位置1并退出循环
#Count3 := #DOAccNo - 3;
FOR #Count4 := 0 TO #Count3 DO
FOR #Count5 := #Count4 TO #Count3 DO
#Count6 := #Count5 + 1;
IF "AddressCheck".DOAcc[#Count4] = "AddressCheck".DOAcc[#Count6] THEN
#Sign := 1;
EXIT;
END_IF;
END_FOR;
END_FOR;
IF #Sign = 1 THEN
RETURN;
END_IF;
我认为实际项目不可能经常修改变量,修改了之后在触摸屏上确认更改,才需要在PLC中调用此功能检查地址是否有重叠,所以不必担心CPU的扫描负担问题。如果有重叠则不将修改的地址传送到DB100。
第一次发帖,感觉表达的不好,请大家见谅,非常期待Zane版给出重叠检查的好方法。
请填写推广理由:
分享
只看
楼主