最近,写了几个程序,都用到了SCL的间接寻址指令。之前,没有SCL的时候,一直用STL做,感觉很好用,利用地址寄存器做地址的计算寻址。现在,对于不是逻辑运算,主流应该用SCL比较多,于是找了找SCL的间接寻址方法。指令简单易懂,十分好用,唯一遗憾的是不能访问当前FB的背景数据块。
现在我就来简单介绍下300CPU的间接寻址方法吧。具体请看我上载的附件截图即可。
间接寻址1.jpg
DB块数据的间接寻址.jpg
以下是对DB块的位和浮点数的间接寻址访问:
IF WORD_TO_BLOCK_DB(#I_wDBNO).DX(IDX := #"I_iResetConsumptionAddr.byte" + (#IO_i - 1) * #I_iInterval, BIT := #"I_iResetConsumptionAddr.bit")
AND NOT #I_bDosingUnitOn
THEN
WORD_TO_BLOCK_DB(#I_wDBNO).DD(#I_iOldConsumptionAfterResetAddr + (#IO_i - 1) * #I_iInterval) := WORD_TO_BLOCK_DB(#I_wDBNO).DD(#I_iNewConsumptionBeforeResetAddr + (#IO_i - 1) * #I_iInterval);
END_IF;
另外,使用WORD_TO_BLOCK_DB做间接寻址时,需要注意以下几点:
访问的DB必须是没有被优化的,因为优化后的块只能进行符号寻址;
WORD_TO_BLOCK_DB(#I_wDBNO)中的DB块号必须是WORD类型。
3.如果要对浮点型的DB块数据访问,需要用DWORD_TO_REAL()指令进行转换,这里不支持隐式转换。
如果,有不对的地方请各位大神指正,谢谢!后续继续更新。