FB内部使用地址寄存器案例 - 32位指针区域内间接寻址

案例内容:实现DQ32模块通道依次循环输出。

  • 利用循环左移指令,把默认值位16#1的DWORD循环左移,最后绑定QD,实现DQ32模块通道依次循环输出。
    • 限制1:不使用SCL实现,而用STL或LAD来实现。
    • 限制2:DWORD被拆分为bit的时候会因大端模式导致的输出对应异常,需要重新梳理bit位和实际DI32通道之间的对应关系。

实现方法

  • 如下图,FB的input接口需要一个使能按钮和一个触发左移的信号;输出为4个byte类型的接口,用于绑定DQ输出;建立了一些static变量做中间变量使用。
  • 程序的重点在于如何在不使用AT、片段访问(在经典step7 LAD中也确实没找到怎么使用AT和片段访问)或其他高级指令的前提下,实现把DWORD拆分:
     L     P##Stream_Dword     //此处在获取DI(背景DB)对应变量的地址
     LAR1  
     L     B [AR1,P#0.0]       //长度是byte,偏移是0.0
     T     #Out_StreamByte3    //此处手动对应DWORD的字节顺序
     L     B [AR1,P#1.0]
     T     #Out_StreamByte2
     L     B [AR1,P#2.0]
     T     #Out_StreamByte1
     L     B [AR1,P#3.0]
     T     #Out_StreamByte0

造成FB在线监控为虚线的原因

  • 在监控该FB的时候,发现该FB在监控的时候为虚线,但是FB本身是被正常执行的,如图:
    • 一般情况下,西门子自己内部的块,如果出现虚线,表示的是块没有被正确的执行,执行出错。
    • 自己写的块没有去这样定义,所以通常自己写的块出现虚线的原因如下:
      • 在块结束时没有处理BR位
  • 在块结尾加上SET SAVE即可解决:
   SET     //置位RLO
   SAVE    //把RLO的结果保存到BR位

此时监控调用块不再是虚线,ENO也有了输出。
一般情况下,BR位的状态会直接体现在ENO的状态上。

posted @ 2025-02-20 17:28  你要去码头整点薯条吗  阅读(165)  评论(0)    收藏  举报