LAR1 P##_IN求解

我写了一个简单的OB1调用FC1
OB1:
CALL FC1
_IN:M0.
_OUT:Q0.0

FC1:
输入变量:_IN                 BOOL量
输出变量:_OUT              BOOL量
临时局部变量:_TEMP     BOOL量
程序:
LAR1 P##_IN                            //指令1
LAR1 P##_OUT                        //指令2
LAR1 P##_TEMP                     //指令3
A  #_IN
=  #_OUT

我写这个程序的目的是观察调用FC1时_IN和_OUT 的地址。
但是指令1和2都是红色,是错误的。指令3是对的
我又把指令1和2改成如下格式
L   P##_IN
LAR1
L   P##_OUT
LAR1
这样是可以的,监视发现
_IN的地址是M0.0 
_OUT的地址是Q0.0
_TEMP的地址是L0.0

请问为什么指令1和2是错误的

问题补充:
_IN:M0.0这个是笔误,程序里是对的。
关于LAR1<D>对存储区域的限制,我认为是对当<D>为地址时的限制,如
LAR1 MD0是对的
LAR1 ID0是错的
当<D>为32位指针常量时,应该是没有这种限制的,如
LAR1  P#Q0.0
LAR1  P#I0.0
都是能通过编译的

我是不是有点钻牛角尖了。。。

图片说明:

LAR1 P##_IN求解    LAR1 P##_IN求解    LAR1 P##_IN求解   

最佳答案

要区分地址寄存器间接寻址与指针寻址:
1、地址寄存器间接寻址:
这种LAR1 <D>格式,其中<D>只能表示只能用D、M、L存储区来进行间接寻址。即,所说的存储器地址间接寻址中,间接地址用M、DB、DI和L指定。
LAR1 MD0是对的
LAR1 ID0是错的。
另外你列出的4条红色的指令均为间接地址没有用M、DB、DI和L指定。
2、详见上传的LAR1 <D>格式截图。
3、问题补充:
弄清指针寻址:
P#中的P是Pointer,是个32位的直接指针。所谓的直接,是指P#中的#后面所跟的数值或者存储单元,是P直接给定的。这样P#XXX这种指针,就可以被用来在指令寻址中,作为一个“常数”来对待,这个“常数”可以包含或不包含存储区域。例如:
LAR1 P#I0.0是可以的。正如你上述当<D>为32位指针常量时,应该是没有这种限制的。
总之,要弄清地址寄存器间接寻址与指针寻址。

图片说明:

LAR1 P##_IN求解  LAR1 P##_IN求解  

提问者对于答案的评价:
谢谢

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc232453.html

(2)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月1日 下午1:07
下一篇 2018年12月1日 下午1:07

相关推荐