回复:[博途]+数据结构在IO地址冲突检测中的应用

zhangcc1978

  • 帖子

    10
  • 精华

    1
  • 被关注

    2

论坛等级:游侠

注册时间:2010-12-03

普通 普通 如何晋级?

发布于 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;
   
   

UPD_IO_Sample.rar

        我认为实际项目不可能经常修改变量,修改了之后在触摸屏上确认更改,才需要在PLC中调用此功能检查地址是否有重叠,所以不必担心CPU的扫描负担问题。如果有重叠则不将修改的地址传送到DB100。

       第一次发帖,感觉表达的不好,请大家见谅,非常期待Zane版给出重叠检查的好方法。

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54615条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。