当前位置: 主页 > PLC控制

LAR1 P##_IN求解

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

FC1:
输入变量:_INBOOL量
输出变量:_OUTBOOL量
临时局部变量:_TEMPBOOL量
程序
LAR1P##_IN//指令1
LAR1P##_OUT//指令2
LAR1P##_TEMP//指令3
A#_IN
=#_OUT

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

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

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

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

图片说明:

LAR1 P##_IN求解LAR1 P##_IN求解 LAR1 P##_IN求解737139c9c4f1a099eaad454ffb5fc05e LAR1 P##_IN求解LAR1 P##_IN求解

最佳答案

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

图片说明:

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

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

  • 关注微信

猜你喜欢

微信公众号