案例内容:实现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.0T #Out_StreamByte3 //此处手动对应DWORD的字节顺序L B [AR1,P#1.0]T #Out_StreamByte2L B [AR1,P#2.0]T #Out_StreamByte1L B [AR1,P#3.0]T #Out_StreamByte0
造成FB在线监控为虚线的原因
- 在监控该FB的时候,发现该FB在监控的时候为虚线,但是FB本身是被正常执行的,如图:
- 一般情况下,西门子自己内部的块,如果出现虚线,表示的是块没有被正确的执行,执行出错。
- 自己写的块没有去这样定义,所以通常自己写的块出现虚线的原因如下:
在块结束时没有处理BR位
。
- 在块结尾加上
SET SAVE
即可解决:
SET //置位RLOSAVE //把RLO的结果保存到BR位
此时监控调用块不再是虚线,ENO也有了输出。
一般情况下,BR位的状态会直接体现在ENO的状态上。