只发PLC相关5 随时更新~~
一、 欧姆龙PLC指令应用
欧姆龙PLC是一种功能完善的紧凑型PLC,能为业界领先的输送分散控制等提供高附加值机器控制;它还具有通过各种高级内装板进行升级的能力,大程序容量和存储器单元,以Windows环境下高效的软件开发能力。
条件:欧姆龙PLC变送器的输出信号为0-10V,对应温度为-100--200摄氏度;CP1H的模拟量输入量程设置为0-10V,分辨率选择6000
目的:使用SCL2指令将模拟量转换得到的数据0-6000(BIN)对应缩放到-100--200(BCD)摄氏度显示输出。
程序如下:
SCL2控制字解释:
200:CP1H的模拟量输入通道1
D100:偏移量(带符号BIN)详见下图
D101:ΔX(带符号BIN)详见下图
D102:ΔY(BCD)详见下图
D200:转换结果通道
结果:程序执行后就可以实现0-6000(BIN)转换到-100--200(BCD)摄氏度显示了。
注:因为BCD数是以十六进制来表示十进制数据的,因此对应的温度值应该用16进制方式去监视。例如:当200CH中的数据是&4000(即6.66V电压输入),那么用十六进制监控数据D200应该显示#100。
&符号表示十进制数;#表示十六进制数。
SCL指令应用案例
条件:欧姆龙PLC变送器的输出信号为0-10V,对应压力为0-400MPa;CP1H的模拟量输入量程设置为0-10V,分辨率选择6000。
目的:使用SCL指令将模拟量转换得到的数据0-6000(BIN)对应缩放到0-400MPa(BCD)显示输出。
程序如下:
结果:程序执行后就可以实现0-6000(BIN)转换到0-400(BCD)的压力值了。
注:因为BCD数是以十六进制来表示十进制数据的,因此对应的压力值应该用16进制方式去监视。例如:当200CH中的数据是&3000(即5V电压输入),那么用十六进制监控数据D200应该显示#200。
&符号表示十进制数;#表示十六进制数。
使用CPM1A-AD041的模块采集模拟量4-20ma的信号,该模拟量信号取自一位移传感器信号,代表一个0-100mm的距离,要怎么才能把输入通道里的数据转换成所对应的这个距离值呢?
可以使用SCL指令做此类的定标转换,该指令的作用是把一个16进制数据线性转换成一个BCD码的数据,这条指令有3个操作数见图1,S为源字,P1是参数首字,R是结果字,从P1到P1+3要设置4个值,P1是AY,P1+1是AX,P1+2是BY,P1+3是BX(见图2),在此例中因为输入的数据范围是0-1770 HEX,所以P1+1和P1+3分别是0和1770,而定标结果是0-100,所以P1和P1+2分别是0和100.具体可以这么做,例如AD041的输入通道是002,把DM0作为参数首字,D10作为结果字存放0-100的距离值。
SCL 2 DM0 DM10
在执行SCL指令前先用MOV指令对DM0-DM3里分别赋值0,0,100,1770。之后SCL指令就能把输入的模拟量值定标成0-100的距离值了。
CPM1A-MAD02-CH使用了4路输入,但是它的输入数据是每两路放一个通道的,这样就无法进行监视或处理单独一路的输入数据了,有什么办法可以把两路数据分离开吗?
可以用MOVD指令,分别把两路数据传送到一个单独的通道。该指令有3个操作数,
操作数排列如图1,S是源字,也就是用模拟量输入的通道,DI是指定数位号,每个数字指定方式如上图2,也就是指定从源字中哪一个数字开始传送(一个通道是4个16进制数字,一路输入是半个通道,也就是2个16进制数字),传送几个数字,传送到目标通道的哪个数字,D就是指定目标通道。例如现在MAD02的第一第二路输入的通道是002通道,现在要把第一路数据传送到DM0,第二路数据传送到DM1,MOVD指令
CPM1A-AD041的外部输入电流和电压信号要如何接线?
电压输入:把外部的输入正信号接V IN,负信号接com端;
电流输入:把模块上V IN和I IN的端子短接后接输入正信号,负信号接com端。
CPM1A-MAD02-CH的参数应该怎么设置?
在n+1通道(n为分配给CPU单元或前一个扩展单元的最后一个输出通道)的每个位对应的作用按照如下表分配,在量程对应的位是设定输入输出的量程范围,在启动位和平均值对应的位是设定该功能使用与否,例如4路输入1路输出全用4-20ma,平均值功能不用,就在N+1通道设置C3FF HEX就可以了。
CP1H-X□40D□-□的型号是如何定义的?
举例说明如下:
S:200CH为传送源地址,初始值为#ABCD(十六进制)。
D:300CH为传送目标地址,初始值为#0000(十六进制)。
例1:D300为#0211:
从左往右解释:
2表示传送到目标字以位2开始(即8-11位)。
1表示传送位数2位。
1表示传送源字以位1开始(即4-7位)。
程序执行后,300CH中的值为#BC00。
例2:D300为#0230:
从左往右解释:
2表示传送到目标字以位2开始(即8-11位)。
3表示传送位数4位。
0表示传送源字以位0开始(即0-3位)。
程序执行后,300CH中的值为#CDAB。
CPM2A-30CDR-A配CPM1A-AD041和CPM1A-20EDR1地址是如何分配的?
CX-Programmer下传程序的时提示UM区被保护,如何处理?
① 新建PLC程序时,在设备型号后的设定中选中了文件内存只读,只要把文件内存只读的钩去掉即可;
② 询问CPU型号:
a.CPM系列,DM 6602设为了×××1,可以在编程模式中将DM6602设为×××0后断电上电即可;
b.C200Ha或CQM1系列,CPU盖板下的开关中的DIP-1打在了On上,断电将DIP-1打为Off上电即可;
c.CP/CJ/CS系列,如果CPU被加过写保护密码,需要先释放密码,CPU盖板下的开关中的DIP-1打在了On上,断电将DIP-1打为Off上电即可。
在输入模拟量数据后,如果要把数据定标成带小数点的数据,可以怎么做?
两种办法,一是把定标的结果数据放大10的N次方来得出小数点,例如需要2位小数,例如把0-0FA0的输入定标成0-10.00V的BCD码,带两位小数,那就当成0-1000来定标。如果是CP1H或CQM1H那还有一种方法,就是如果把源数据转成浮点数来做浮点运算,也能做到,但因为CPM系列的PLC不支持浮点数,所以不能用这个方法。
4-20ma模拟量输入的时候,输入信号为4ma,但输入通道的数据在0,65535两个值跳,这是正常的吗?实际使用中如果不能有这样的数据怎么办?
65535的16进制其实是FFFF,因为PLC是用二进制补码表示负数的,其实这个数据是代表-1,也就是模拟量输入在0到-1之间跳动,是属于正常的。如果处理跳变的现象,不要直接用输入通道的数据,可以把这个数据传送到另一个中间通道后再使用,之前用一条CPS比较指令判断输入信号是否是负的,如果是负的,就不传送输入通道数据而传送0到这个中间通道,把信号作为0来处理
几根常用的RS-232C通讯电缆的接线?
①电缆XW2Z-200S-V连接图:
PLC(9孔)侧 PC(9针计算机)侧
2――――2
3――――3
9――――5
PLC的4与5短接
PC侧的4与6短接, 7与8短接
②电缆XW2Z-200S-CV连接图:
PLC(9孔)侧 PC(9针计算机)侧
2――――2
3――――3
4――――8
5――――7
9――――5
③电缆XW2Z-200P-V连接图:
PLC(25孔)侧 PC(9针计算机)侧
2――――2
3――――3
7――――5
PLC侧4,5短接,6,20短接。
计算机侧4,6短接,7,8短接。
④电缆XW2Z-200T连接图:
PLC(9孔)侧 触摸屏(9孔)侧
2――――3
3――――2
9――――9
PLC和触摸屏两侧的4,5都要短接。
CPM1A的外设口用CPM1-CIF11转成RS-422口后连计算机侧的RS-422电缆接线?
CIF11 计算机
SDA———RDA
SDB———RDB
RDA———SDA
RDB———SDB
NC模块的参数设置注意事项
a)当m+2控制字设置为0000,即x轴使用保存在PCU的FLASH中的轴参数时,NC模块控制电机正常;
b)当m+2控制字设置为0001,即x轴使用分配给特殊I/O单元的数据存储器区域字设置的轴参数时,NC模块控制电机不正常。
具体表现如下:
在a)状态时,开机搜索原点(n.06),然后手动控制电机进位,然后执行原点返回命令(n.07),电机返回原点;
在b)状态时,开机搜索原点,然后手动控制电机进位,然后执行原点返回命令(n.07),电机停止不动,检查n+2.05位,发现为ON,即表示定位结束。
根据现象,判断是NC模块没有完成正确的设置,以至于它没有能够正确判断相对和绝对移动。检查公共参数区域(m,m+1……),没有发现问题
。但是在检查到m+25~m+28参数区域时,这4个通道内值为0。
这4个通道分别是设置CCW/CW的软限位的。
在以前的试验中我们曾发现过当软限位未设置的情况下,NC模块不能执行正确的绝对和相对移动,现象是让电机按照绝对移动或者相对移动模式,运行结果是一样的,按照相对运行的模式运行。
所以估计是这个区域没有设置导致客户出现问题。将m+25~m+26设置为C0000001,m+27~m+28设置为3FFFFFFF。断电上电,按照b)模式运行,故障消除。
CJ1W-AD041的DM区设置?
对于DM字地址定义是m=20000+(单元号*100)D(m):输入使用设置D(m+1):输入信号范围设置D(m+2):输入1均值处理设置D(m+3):输入2均值处理设置D(m+4):输入3均值处理设置D(m+5):输入4均值处理设置D(m+6)~D(m+17):未使用忽略设置D(m+18):高8位是转换时间/分辨率设置,低8位是操作模式设置具体的参数设置请参照CJ1/CS1模拟量I/O单元中文操作手册P86
例:
我用压力传感器输入4-20mA,对应工作压力为0-70p,用SCL指令源通道我用200,参数字用D100(内存设置D100,D101,D102,D103怎么写),我要做4个报警,在用CMP指令做比较的时候,数据比较1写D100,数据比较2写4个报警的具体数值吗?
1:分辨率为6000的情况下,四个参数字如下:D100:#0 D101:#0 D102:#70 D103:#1770 ;2:分辨率为12000的情况下,四个参数字如下:D100:#0 D101:#0 D102:#70 D103:#2EE0 ;
比如SCL指令的结果通道用的是D300,那么D300里面看到的就是0-70P之间的值,CMP指令和D300里面的当前工程量作比较,满足一定条件输出报警
例2:
两个压力传感器是电流型4-20mA输出、其量程为0-25Mpa,我将其分别接入200CH、201CH,实际工作中的压力计算公式是:实际压力 X=20*25*D200/6000。(分辨率假定为6000);
我的程序是:--P_on-------Mov #0 D100
|-Mov #0 D101
|-Mov #25 D102
|-Mov #1770 D103
--P_on-------Scl 200 D100 D200
|-Cmp D200 D0(设定值)
|-P_on--1000
你的定标是正确的,不过D102设成#25太小,精度太低,建议设为#2500.比较程序的判别标记不能使用P_ON
二、欧姆龙PLC如何选择地址
欧姆龙PLC系统中的单元,根据前后位置或单元的特殊性,分别占用CIO区不同的地址,了解地址分配、知道输入、输出数据的具体存放位置,就能够利用编程对数据进行正确的处理。
第一讲欧姆龙PLC的地址分配
在I/O存储器中,CPU单元和CP1W扩展单元的输入地址占用000 ~ 016通道,输出地址占用100 ~ 116通道,而1个通道就是我们所说的1个字,它也等于16个位,本篇我们以CP1H为例,来说明PLC地址分配的规律。
1、CPU单元地址分配
X和XA型CPU
X和XA型CPU单元自带40点I/O,其中输入24点,输出16点,在CIO区输入部分占用0 ~ 1通道,总共分配24个输入位:
① 其中12个位为0通道的位00 ~ 位11
② 另12个位为1通道的位00 ~ 位11
③ 0通道和1通道中不使用的位12 ~ 位15,将始终被清除,且不可用作内部辅助工作位
X和XA型CPU单元的输出16点,在CIO区输出部分占用100 ~ 101通道,总共分配16个输出位:
① 其中8个位为100通道的位00 ~ 位07
② 另8个位为101通道的位00 ~ 位07
③ 100通道和101通道的位08 ~ 位15,可用作内部辅助工作位
CP1H-XA型CPU中自带了模拟量输入和输出,其中4路模拟量输入占用200 ~ 203通道,2路模拟量输出占用210 ~ 211通道。
Y型CPU
CP1H-Y型CPU中自带20点I/O,其中输入12点,输出8点,由于脉冲输入输出专用端子占用,输入输出被分配到不连续的地址:
① 所以Y型CPU单元的输入,占用CIO区0通道和1通道的共计12点
② 0通道和1通道中不使用的位12 ~ 位15,将始终被清除,且不可用作内部辅助工作位
Y型CPU单元的输出8点,也是由于脉冲输入输出专用端子占用:
① CPU单元的输出占用CIO区100通道和101通道的共计8点
② 100通道和101通道中不使用的位08 ~ 位15,可用作内部辅助工作位
2、扩展单元地址分配
扩展单元的作用是扩展输入、输出,扩展单元从CPU单元的分配通道之后的下一个通道开始,依次往后分配地址。
CP1W扩展单元
如CPU单元自带输入占用0通道和1通道,输出占用100通道和101通道,以后连接的CP1W的扩展单元:
① 其输入从2通道开始依次往后分配,最多分配到16通道
② 输出从102通道开始依次往后分配,最多分配到116通道
CP1W的基本I/O扩展单元,根据输入输出的点数不同,其所分配的输入输出通道数也不同,位分配原则与CPU单元输入输出的位分配原则相同,例如12点输入、8点输出的扩展单元,输入输出各占用1个通道:
① 其输入位占用所分配通道的位00 ~ 位11,不使用的位12 ~ 位15将始终被清除,且不可用作内部辅助工作位
② 输出位占用所分配通道的位00 ~ 位07,不使用的位08 ~ 位15可用作内部辅助工作位
对于模拟量及温度传感器等扩展单元,其输入输出通道的地址,根据其所占用的通道数来进行分配,例如CP1W-MAD11,分配了2个输入通道和1个输出通道。
CJ系列高功能扩展单元
CJ系列高功能扩展单元的地址分配和其单元号有关,单元号是在模块上的一个硬件开关,特殊I/O单元根据排列的先后,占用地址2000 ~ 2959通道,具体分配如下图:
CPU总线单元根据排列的先后,占用地址1500 ~ 1899通道,具体分配如下图:
3、应用举例
如图,CP1H PLC配置了1个以太网模块、2个基本I/O扩展单元、2个模拟量扩展单元和1个温度传感器单元,那么各输入输出的地址是如何分配的呢?
正确答案如下:
三、PLC中断
plc这样理解中断功能,在理解中断时,首先要清楚plc的运算周期或者说是扫描周期,有必要说下plc顺控循环执行的流程,这是理解中断的前提,必须要掌握,分为三部分,输入处理、程序处理、输出处理
1、输入处理,可编程控制器在执行程序前,将可编程控制器的所有输入端子的ON/OFF状态读入输入映像区,程序执行过程中即使输入发生变化,输入映像区的内容也不会变化,在执行下一个循环的输入处理时读取该变化。
2、程序处理、plc根据程序内存中的指令内容,从输入映像区和其他软元件的映像区中读出各软元件的ON/OFF状态,然后从0步依次开始运算,并将每次得出的结果写入到映像区中。因此,各软元件的映像区随着程序的执行逐步改变其内容,此外,输出继电器的内部触点根据输出映像区的内容而执行动作。
3、输出处理,所有指令执行结束后,输出Y映像区中的,ON/OFF状态会传送至输出锁存内存,这个就作为可编程控制器的实际输出。
执行以一次动作所需要的时间就是运算周期也叫扫描时间,那么中断与扫描周期有什么联系呢,中断就是不按照从上到下顺序的完整执行,而是中断程序优先单独运行程序处理而且是立即输出不参与整个周期运算。
中断的作用是什么呢,我们知道plc扫描周期是很短的,因此我们很难看出plc顺控执行过程,这里我们不妨假设扫描周期为10s的时间,就是执行全部的程序需要10s的时间,有一个很简单的程序LD X0,OUT Y0,根据上图当X0为ON时,Y0不是马上就有输出的,而是等到10s后才输出,断开X0后,同样Y0也不是马上就关闭的,都需要得到扫描完后才有结果。那么这样在我们实际应用中plc就没什么使用了设备就无法进行工作了,这时候就需要中断处理了,采用输入中断功能,立即执行输入。实际上plc的运算时间是很短只有几毫秒,完全能够满足需要,但一些如高频脉冲输入、脉冲捕捉等时间在微秒级的肯定要受到周期运算的影响了。
因此如果在一个周期内要完成很多次ON/OFF状态处理时,必须使用中断功能了。在我们一般情况下很少用到中断,即使需要plc的高速指令都带有中断功能无需自己专门编写中断子程序了,例如高速计数器采用中断的方式对从特定的输入继电器出来的高速脉冲进行处理,所以无论运算时间多少都可进行计数,计数的结果或是使用高速计数器专用的比较指令立即输出,或是对高速计数器的计数值用高速计数器中断方式执行特定的程序处理。
对高频脉冲进行计数不采用高速计数器进行计数,我们举例使用中断功能对高速输入进行计数,示例如下,从EI到FEND是主程序,从指针I101(输入X0的中断指针)开始到IRET是中断子程序,每当感应到X1的上升沿就执行子程序将数值立即传送到D10中,这样就避免了plc运算周期的影响。
四、西门子S7-300和S7-400指针类型与间接寻址
在西门子S7-300和S7-400的编程中经常需要调用一些系统功能或功能块,在输入参数时经常碰到有指针类型的参数,那么你对指针类型了解吗?我第一次接触指针一词是在学习C语言的时候,指针和链表是C语言中的一个重点难点。在C语言中,指针即存储器地址,在西门子PLC中的指针也是指地址。下面看看西门子POINTER类型的结构:
参数类型POINTER存储下列信息:
· DB编号(或0,如果数据没有存储在DB中)
· CPU中的存储区域(下表给出了参数类型POINTER存储器区的十六进制代码)·
十六进制代码 | 存储区 | 描述 |
b#16#81 | I | 输入区域 |
b#16#82 | Q | 输出区域 |
b#16#83 | M | 位存储区域 |
b#16#84 | DB | 数据块 |
b#16#85 | DI | 背景数据块 |
b#16#86 | L | 本地的数据(L堆栈) |
b#16#87 | V | 先前的本地数据 |
数据的地址(格式为字节.位)
STEP 7提供指针格式:p#memory_area byte.bit_address. (如果形式参数被声明为参数类型POINTER,只需要指出存储区域和地址。STEP 7将自动地重定输入指针的格式。) 下面的实例说明如何为以M50.0开始的数据输入参数类型POINTER:P#M50.0
存储器间接寻址:
使用存储器间接寻址的程序语句包含一条指令,后面跟有[地址]标识符,最后是一个(地址必须括在方括号内)。根据所用的地址标识符,该指令会将存储于指定地址的数据解释为字或双字指针。完整的数据地址由地址标识符和指针构成,如下例所示。间接寻址的优点是能在程序执行期间动态修改指令的数据地址。
存储器间接寻址使用以下两部分地址:
1. 地址标识符
对于由位逻辑运算寻址的位,可分配地址标识符I、Q、M、L、DIX或DBX。
对于由装载指令寻址的字节、字和双字,可使用存储区I、Q、M、L、D和PI,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PIB、PIW、PID等形式的地址标识符。
对于由传送指令寻址的字节、字和双字,可使用存储区I、Q、M、L、DB、DI和PQ,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PQB、PQW、PQD等形式的地址标识符。
要寻址定时器、计数器或块,可使用T、C、DB、DI、FB、FC形式的区域标识符。
2. 括在方括号"[ ]"内的字或双字指针的地址
字指针 - 含有定时器(T)、计数器(C)、数据块(DB、DI)或逻辑块(FC、FB)的标识号的字。字指针是十进制整数。
双字指针 - 指含有位、字节、字或双字的确切位置的双字。双字指针的格式为:P#字节.位。指针必须存储在下列区域之一,才能进行存储器间接寻址:
M - 位存储器
L - 本地数据
D - 数据块(DB或DI)
STAT 静态数据(不是用于具有多重实例能力的块的静态数据)
注意如果要寻址使用存储器间接寻址的字节、字或双字,请确保指针的位号为双字格式0。
字指针实例:
L 5 //将指针值载入ACCU 1。T MW2 //将指针传送到MW2中。L T[MW2] //将5号定时器的当前时间值载入ACCU 1。
L C[MW2] //将5号计数器的当前计数值载入ACCU 1。
OPN DB[MW2] //将数据块DB5作为共享数据块打开。
OPN DI[MW2] //将数据块DB5作为背景数据块打开。
双字指针实例:
L P#8.7 //将指针值载入ACCU 1。T MD2 //将指针传送到MD2中。A I [MD2] //扫描输入位8.7的状态,并将其= Q [MD2] //信号状态分配给输出位Q 8.7。
区域内寄存器间接寻址:
使用区域内寄存器间接寻址的程序语句包含一条指令和以下组成部分:地址标识符[地址寄存器标识符,地址]。区域内寄存器间接寻址使用以下两部分地址:
1. 地址标识符
对于由位逻辑运算寻址的位,可以分配地址标识符I、Q、M、L、DIX或DBX。
对于由装载指令寻址的字节、字和双字,可使用存储区I、Q、M、L、D和PI,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PIB、PIW、PID等形式的地址标识符。
对于由传送指令寻址的字节、字和双字,可使用存储区I、Q、M、L、DB、DI和PQ,分配IB、IW、ID、DBB、DBW、DBD、DIB、DIW、DID、PQB、PQW、PQD等形式的地址标识符。
2. 方括号"[ ]"中的内容包括地址寄存器引用(AR1或AR2)、逗号分隔符","以及双字指针。
双字指针 - 指包含位、字节、字或双字的部分地址的双字。双字指针的格式为:P#字节.位。
注意请记住您现在使用的是两个格式为"P#字节.位"的指针。一个指针已被精确表示出来。另一个指针通过对地址寄存器AR1或AR2的引用来确定。如果要寻址字节、字或双字,请确保指针的位号为0。使用寄存器间接寻址的语句不更改地址寄存器的内容。
指针实例:
L P#8.7 //将指针值载入ACCU 1。LAR1 //用ACCU 1中的指针装载AR1。A I [AR1, P#0.0] //检查输入位I 8.7并将有符号的状态分配给Q 10.0。= Q [AR1, P#1.1] //确切地址8.7在AR1中。偏移量不对其产生影响。确切位置10.0由8.7 (AR1)加上1.1 (偏移量)得出,结果是10.0而不是9.8。
区域内寄存器间接寻址实例:
A I [AR1,P#4.3] 对其位置是由AR1中的内容加上4个字节,再加上3个位计算得出的输入位,执行逻辑与运算。= DIX [AR2, P#0.0] 将RLO位状态分配给位于AR2中的实例数据位。L IB [AR1, P#10.0] 将输入字节载入ACCU 1中。地址由AR1的内容加上十个字节计算得出。T LD [AR2,P#53.0] 将ACCU 1中的内容传送到本地双字中(该双字的位置由AR2的内容加上53个字节计算得出)。
区域内寄存器间接寻址的特点是:地址标示符在方括号前确定,方括号中的指针均为不含存储区信息(如[AR1,P#4.3]中AR1=P#8.7,两个指针都不含有存储区信息),否则将会与方括号前的地址标示符表示的存储区冲突。
跨区域寄存器间接寻址:
使用跨区域寄存器间接寻址的程序语句包含一条指令和以下组成部分:地址标识符[地址寄存器标识符,地址]。
跨区域寄存器间接寻址使用以下两部分地址:
1. 对已寻址的数据对象(地址标识符)大小的规定数据对象大小规定 位(无规定表示是一个位)B 字节W 字D 双字
2. 方括号"[ ]"中的内容包括地址寄存器引用(AR1或AR2)、逗号分隔符","以及双字指针。双字指针 - 指包含位、字节、字或双字的部分地址的双字。指针具有以下区域内格式:P#字节.位。
注意事先必须已将跨区域双字指针载入到由寄存器间接地址引用的地址寄存器中。跨区域双字指针 - 包含位的部分地址(对于位逻辑指令)或字节、字或双字的部分地址(对于装载和传送指令)的双字。地址前面的区域标识符位于用来指定字节和位。跨区域双字指针格式为:P#区域标识符字节.位。
对于由位逻辑指令寻址的位,可以分配跨区域指针区域标识符I、Q、M、DIX或DBX。
对于由装载或传送指令寻址的字节、字和双字,可以分配跨区域指针区域标识符I、Q、M、DIX、DBX或P。 注意要在指针中指定外设输入或PI区域,请以P#Px.y形式输入指针。区域被指定为P。在跨区域指针中不能使用外设输出PQ区域。请记住您正使用两个指针:
作为偏移量,直接在地址中表示的区域内双字指针,例如P#4.0。
存储在地址寄存器(AR1或AR2)中的跨区域双字指针,例如P#Q4.0。
如果要访问通过直接寻址方式进行寻址的字节、字或双字,请确保这两个指针的位号均为0。使用寄存器间接寻址的语句不更改地址寄存器的内容。
跨区域寄存器间接寻址的第一个实例:
L P# I8.7 //将指针值和区域标识符载入ACCU 1。LAR1 //将存储区I和地址8.7存入AR1。L P# Q8.7 //将指针偏移量和区域标识符载入ACCU 1。LAR2 //将存储区Q和地址8.7存入AR2。A [AR1, P#0.0] //检查输入位I 8.7并将其信号状态分配给输出位Q 10.0。= [AR2, P#1.1] //偏移量0.0没有任何作用。输出位10.0由8.7 (AR2)加上1.1 (偏移量)得出,结果是10.0而不是9.8。跨区域寄存器间接寻址的第二个实例:
A I 0.0 JC M002 L P#M10.0 //将指针值和区域标识符载入ACCU 1。LAR1 //将存储区M和地址10存入ACCU 1。JU M001 M002: L P#Q0.3 //将指针值和区域标识符载入ACCU 1。LAR1 //将存储区Q和地址0.3存入ACCU 1。M001:A I 0.4 = [AR1, P#0.1] //I 0.0用于控制哪个指针用于此语句。将I 0.4的信号状态分配给存储器位M 10.1,或者分配给输出Q 0.4。
跨区域寄存器间接寻址实例A [AR1,P#4.3],对于其位置是由AR1中的内容加上4个字节,再加上3个位计算得出的位,执行逻辑与运算。位的存储区在AR1的位24、25和26中指出。= [AR2, P#0.0] 将RLO位信号状态分配给位于AR2中的位。位的存储区在AR1的位24、25和26中指出。L B [AR1, P#10.0] 将字节(其位置由AR1的内容加上10个字节计算得出)载入ACCU 1。位的存储区在AR1的位24、25和26中指出。T D [AR2,P#53.0] 将ACCU 1的内容传送到双字(该字的精确位置由AR2的内容加上53个字节计算得出)。位的存储区在AR1的位24、25和26中指出。
跨区域寄存器间接寻址的特点是:地址标示符在方括号前确定,方括号中的地址寄存器中包含存储区信息(如[AR1,P#4.3]中AR1=P#Q0.3)。
区域内寄存器间接寻址和跨区域寄存器间接寻址的使用相当灵活,可以根据需要选择。由上面的说明可知,区域内寄存器间接寻址是针对存储区固定的间接寻址方式,寻址的存储区是确定的。而跨区域寄存器间接寻址则在指令中不确定存储区,存储区由地址寄存器中存储的指针中的信息确定,因而寻址的存储区是可变的。