我写了一个简单的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
都是能通过编译的
我是不是有点钻牛角尖了。。。
图片说明:
最佳答案
要区分地址寄存器间接寻址与指针寻址:
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位指针常量时,应该是没有这种限制的。
总之,要弄清地址寄存器间接寻址与指针寻址。
图片说明:
提问者对于答案的评价:
谢谢
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc232453.html