第四章 数据传送和数据比较指令
数据传送指令 数据比较指令 数据传送和数据比较指令有两个以上操作数 要注意指令微分和非微分形式时用法的区别 要注意这些指令的操作数的含义及其范围 这些指令多数都有微分和非微分两种形式
一、 数据传送指令 单字传送指令MOV 数字传送指令MOVD 块传送指令XFER 单字分配指令DIST 块设置指令BSET 数据调用指令COLL 位传送指令MOVB 数据交换指令XCHG
1. 单字传送指令MOV(21)/ @MOV (21) 功 能 MOV (21) S D @ MOV (21) 非微分:在执行条件为ON时,将S传送到D中 (每个扫描周期都执行)。 功 能 微 分:在执行条件OFF→ON时,将S传送到D中 (只在条件满足时刻执行一次)。
使用MOV指令举例(1) 分析程序的功能,并写出语句表. 在PLC上电的第一个扫描周期,把0198传送到HR00中 25315 MOV(21) # 0198 HR00 LD 25315 MOV (21) #0198 HR00 在PLC上电的第一个扫描周期,把0198传送到HR00中 在此后的各扫描周期,不再执行MOV指令。
使用MOV指令举例(2) 分析程序的功能: 只要0000 OFF→ON,就执行一次MOV 指令。 把LR00中的内容传送到HR00中。 20000 00000 DIFU(13) 20000 MOV(21) LR00 HR00 只要0000 OFF→ON,就执行一次MOV 指令。 把LR00中的内容传送到HR00中。 LR00中的内容在变化,必要时将其传送到HR00中。 使用DIFU指令有何作用?
只要00000 OFF→ON,就执行一次MOV 指令。 分析程序的功能 只要00000 OFF→ON,就执行一次MOV 指令。 00000 @MOV(21) LR00 HR00 把LR00中的内容传送到HR00中。 20000 00000 DIFU(13) 20000 MOV(21) LR00 HR00 与举例(2 )功能相同。
指令MOV几种使用方法的区别 (a) (b) (c) (a)与(c)相同,指令MOV都只在00000 OFF→ON时执行一次。 25315 MOV(21) LR00 HR00 00000 @MOV(21) (a) (b) (c) 20000 DIFU(13) 20000 (a)与(c)相同,指令MOV都只在00000 OFF→ON时执行一次。 (b ) 指令MOV只在PLC上电后的第一个扫描周期执行一次。
请注意MOV指令各种用法的区别 使用MOV指令举例(4) 分析程序的功能 与上述几种MOV指令使用方法的区别是: 25313 MOV(21) HR00 LR00 从PLC上电开始,每个扫描周期里,都将HR00中的内容传送到LR00中。 与上述几种MOV指令使用方法的区别是: 本程序中,每个扫描周期指令MOV都执行! 请注意MOV指令各种用法的区别
使用MOV指令举例(5) 分析程序的功能 PLC上电时,将0100传送到200通道中,作为CNT000的设定值 00001 MOV(21) #0100 200 25315 25502 00000 CNT000 00002 @MOV(21) #0200 PLC上电时,将0100传送到200通道中,作为CNT000的设定值 自00000 ON开始, CNT000按设定值100开始计数(或定时)。 ★ 改变计数器设定值的操作: ●断开00000,闭合一次触点 00002, 使CNT000复位; ●使00001OFF→ON,将0200 传送到200通道中; ●此后计数器按设定值200计数
2. 块传送指令XFER (70 )/ @ XFER(70 ) XFER(70 ) N S D @ XFER(70 ) N :通道数(BCD数 ) S :源数据块首通道 D:目的通道首通道 功能 在执行条件为ON时,将几个连续通道中的数据传送到另外几个连续通道中。
执行块传送指令时数据传送如下所示: … … … S D 1 2 3 4 1 2 3 4 S+1 D+1 8 2 A C 8 2 A C 1 2 3 4 S+1 8 2 A C S+2 9 0 B 6 … S+N-1 0 D F E D 1 2 3 4 D+1 8 2 A C D+2 9 0 B 6 … D+N-1 0 D F E …
3. 块设置指令BEST(71)/ @ BEST(71) BEST(71 ) S St E @ BEST(71) BSET(71) @BSET(71) S :源数据(通道或十六进制数 ) St :开始通道 E:结束通道号 功能 在执行条件为ON时,将S传送到从St到E的各通道中。
分析程序的功能,写语句表 使用BEST指令举例 LD 00000 @MOV(21) #0100 HR00 TIM 000 00001 @BSET(71) # 0050 TIM000 01000 @MOV(21) # 0100 HR00 00000 LD 00000 @MOV(21) #0100 HR00 TIM 000 AND TIM000 OUT 01000 LD 00001 @BSET(71) #0050 TIM 000
功能 ① @BSET指令的第二、第三操作数都是TIM000,即执行@BSET指令,只把数据传送到TIM000中。 00001 @BSET(71) # 0050 TIM000 01000 @MOV(21) # 0100 HR00 00000 ① @BSET指令的第二、第三操作数都是TIM000,即执行@BSET指令,只把数据传送到TIM000中。 ②在00001OFF、00000 OFF→ON 时,执行一次MOV指令,将 #0100传送到通道HR00中。 ③自此TIM 000以设定值10秒定时。 ④ 经过10秒,定时器TIM000 ON, 线圈01000 ON 。
⑤当需要改变定时器TIM000的当前值时,可通过执行@BSET指令来实现。 00001 @BSET(71) # 0050 TIM000 01000 @MOV(21) # 0100 HR00 00000 例如,在TIM000的当前值为0089时,令00001 ON一次: 执行@BSET指令将0050传送到TIM000中,TIM000的当前值立即变为0050。 自此,TIM000的当前值从0050开始,每隔0.1秒减1,一直减到为0000为止。
⑥由于HR00中的数据没有改变,在下一次定时器TIM000工作时,其定时值仍然是0100。 00001 @BSET(71) # 0050 TIM000 01000 @MOV(21) # 0100 HR00 00000 ⑥由于HR00中的数据没有改变,在下一次定时器TIM000工作时,其定时值仍然是0100。 ★ 以上是用BSET指令改变定时器的当前值。 ★ 用BSET指令也可以改变定时器的设定值。方法为: 本例中,令BSET指令的第2、3操作数为HR00,执行BSET指令后,TIM000的设定值就为0050了。
MOV与BSET指令的异同 ① 执行一次MOV指令,只能向一个通道传送一个字;而执行一次BSET指令,可以向多个通道传送同一个字。 ② TIM / CNT的操作数是通道时,用MOV 和BSET指令都可以改变TIM / CNT的设定值。 ③ 用BSET指令既可改变TIM/CNT的设定值、也可以改变TIM/CNT的当前值 。 因为MOV指令不能向TC区传送数据, 所以不能用MOV指令改变 TIM/CNT的当前值 !
4. 位传送指令MOVB (82)/ @ MOVB (82) MOVB (82) S C D @ MOVB (82) S:源数据 D:目的通道 C (BCD) :控制数据 bit00~bit07指定S中的位号 bit08~bit15指定D中的位号 C内容的含义 指令的功能 在执行条件为ON时,根据C的内容,将S传送到D中。
使用MOVB指令举例 分析程序的功能,写语句表 C的含义 bit00~bit07:S中的位 bit08~bit15:D中的位 程序功能 # 0050 HR00 200 25315 LD 00005 @MOV B (82) HR00 #1500 200 C的含义 bit00~bit07:S中的位 bit08~bit15:D中的位 程序功能 在PLC上电之初,将HR0000的内容传送到 20015中 。 例:设 HR00 的内容为 1000 1000 1000 0101 执行指令之后——20015为ON( 1 )
5. 数字传送指令MOVD (83)/ @ MOVD (83) S C D @ MOVD (83) @ MOVD(83) 指令的功能 在执行条件为ON时,根据C的内容,将S中指定的数字传送到D中指定的数字位中。
指令各操作数的含义 S:源数据 D:目的通道 C:控制数据 C (BCD数)的含义 C S中要传送的数字位数 D 数字3 数字2 数字1 MOVD (83) S C D S:源数据 D:目的通道 C:控制数据 C (BCD数)的含义 C 数字3 数字2 数字1 数字0 S中第一个要传送的数字位位号 S中要传送的数字位数 0→ 1位 1→2位 2→ 3位 3→4位 指定D中接收第一个数字的位号 不用
使用MOVD指令举例(1) 根据C、确定指令执行结果 C=#0030 传 送 4 位 数 字 被传送的数字位要连续 S #0030 D S中第0位数字开始传送 传 送 4 位 数 字 D中从第0位开始接收第一个数字 被传送的数字位要连续 1 2 3 D S 例如:1 → 2 →3 →0 例如:3 →0 →1 →2 例如:2 →3 →0 →1等
使用MOVD指令举例(2) 根据C、确定指令执行结果 C=#0023 S中第3位数字开始传送 传 送 3 位 数 字 传 送 3 位 数 字 D中从第0位开始接收第一个数字 第二个被传送的数字 1 2 3 D S 第一个接收数字的位 第三个被传送的数字 第一个被传送的数字
使用MOVD指令举例(3) 根据C、确定指令执行结果 C=#0123 S中第3位数字开始传送 传 送 3 位 数 字 传 送 3 位 数 字 D中从第1位开始接收第一个数字 第二个被传送的数字 第一个接收数字的位 1 2 3 D S 第三个被传送的数字 第一个被传送的数字
6. 单字分配指令DIST(80)/ @ DIST (80) DBS C @ COLL (81) @ DIST(80) S:源数据 DBS:目标基准通道 C:控制数据(BCD) 指令的功能 在执行条件为ON时,根据C的内容,进行单字数据分配或堆栈的进栈操作(栈区由C的低3位确定)。
控制数据C (BCD) 的含义 1. C的bit12~ bit15的内容≤8时,执行单字数据 分配 操作。 指令功能 DIST(80) S DBS C 当执行条件为ON时,将S的内容传送到(DBS + C )中,如下图。 S 9 0 B 6 DBS+C 9 0 B 6
2. C的bit12~ bit15的内容= 9时,执行指令生成一个堆栈,执行进栈操作。 指令功能: 当执行条件为ON时,执行指令生成一个堆栈(以C的低3位确定栈区通道数),以DBS为堆栈指针进行进栈操作。 进栈方法: 每执行一次指令,将S的内容复制到(DBS + 堆栈指针+1 )的栈区通道中,然后指针加1。
进栈过程举例。 源数据 200:FFFF 216:9005 控制数据 堆栈指针 第一次执行 200 DM0000 216 00000 @DIST(80) 200 DM0000 216 00000 200:FFFF 216:9005 0 0 0 0 DM0000 DM0001 DM0002 DM0003 DM0004 DM0005 0 0 0 1 DM0000 DM0001 DM0002 DM0003 DM0004 DM0005 F F F F 0 0 0 0 ! ! 栈区 第二次执行 0 0 0 2 DM0000 DM0001 DM0002 DM0003 DM0004 DM0005 F F F F 0 0 0 0 控制数据 ! !
7. 数据调用指令COLL (81)/ @ COLL (81) SBS C D @ COLL (81) @ COLL(81) SBs是基准通道 D是目的通道 C是控制数据(BCD) 指令的功能 在执行条件为ON时,根据C的内容,进行调用数据或堆栈的出栈操作(栈区由C的低3位确定)。
控制数据C (BCD) 的含义 1. C=0000~6655—— 数据调用 指令功能 @ COLL(81) SBS C D 1. C=0000~6655—— 数据调用 指令功能 当执行条件为ON时,将(SBS + C ) 传送到D中。
以SBS为堆栈指针,按先入先出的原则,将堆栈中的数据传送到D中,堆栈指针减1。 2. 出栈操作 (包括两种情况) ① C=9000~9999 ——先入先出的出栈操作 @ COLL(81) SBS C D 以SBS为堆栈指针,按先入先出的原则,将堆栈中的数据传送到D中,堆栈指针减1。 ② C=8000~8999 —— 后入先出的出栈操作 以SBS为堆栈指针,按后入先出的原则,将堆栈中的数据复制到D中(堆栈中的内容不变),堆栈指针减1。
C=#9007 分析:当SBs=DM0000、 C=#9007 、D=200时,指令COLL执行的结果。 先入先出的出栈过程 先入先出 栈区 DM0001~DM0007 指针减1 先入先出的出栈过程 堆栈指针 @ COOL(81) DM0000 #9007 200 0156 0007 1101 0001 EEEE 568C 9D6F 0000 DM0000 DM0001 DM0002 DM0003 DM0004 DM0005 DM0006 DM0007 568C 0006 0156 1101 EEEE 0000 9D6F DM0000 DM0001 DM0002 DM0003 DM0004 DM0005 DM0006 DM0007 栈区 执行前 执行一次 执行二次 IR200 0001 IR200 1101
C=#8007 分析:当SBs=DM0000、 C=#8007 、D=200时,指令COLL执行的结果。 后入先出的出栈过程 后入先出 栈区为 DM0001~DM0007 指针减1 后入先出的出栈过程 堆栈指针 @ COOL(81) DM0000 #9007 200 0156 0007 1101 0001 1234 568C 9D6F 0000 DM0000 DM0001 DM0002 DM0003 DM0004 DM0005 DM0006 DM0007 0156 0006 1101 0001 1234 568C 9D6F 0000 DM0000 DM0001 DM0002 DM0003 DM0004 DM0005 DM0006 DM0007 栈区 不变 执行前 执行一次 执行二次 IR200 1234 9D6F
二、 数据比较指令 单字比较指令CMP 双字比较指令CMPL 块比较指令BCMP 表比较指令TCMP
1. 单字比较指令CMP C1 :比较数1 C2 : 比较数2 功能 在执行条件为ON时,将C1 和C2进行比较。
使用CMP指令举例(1) 写语句表、分析程序功能 LD 00000 TIM 000 #0030 CMP(20) TIM000 #0200 25506 20001 TIM000 25507 20003 20002 CMP(20) TIM 000 # 0200 #0030 00000 25505 20000 LD 00000 TIM 000 #0030 CMP(20) TIM000 #0200 AND 25505 OUT 20000 AND 25506 OUT 20001 AND 25507 OUT 20002 LD TIM000 OUT 20003
分析程序功能 执行指令CMP时,将TIM000的当前值与 #0200进行比较。 25506 20001 TIM000 25507 20003 20002 CMP(20) TIM 000 # 0200 #0300 00000 25505 20000 分析程序功能 执行指令CMP时,将TIM000的当前值与 #0200进行比较。 当00000为ON时,TIM000开始定时、且开始执行CMP指令。 TIM000的当前值由0300每隔0.1秒减1。
可见:配合指令CMP,用一个定时器可以控制 多个输出位。 续 25506 20001 TIM000 25507 20003 20002 CMP(20) TIM 000 # 0020 #0030 00000 25505 20000 若TIM000当前值大于#0200时,25505 ON →20000 ON。 若TIM000的当前值等于# 0200时,25506 ON → 20001 ON。 若TIM000的当前值小于# 0200时,25507 ON → 20002 ON。 当TIM000 定时到 时,20002和 20003 ON。 可见:配合指令CMP,用一个定时器可以控制 多个输出位。
使用CMP指令举例 (2) 分析本例使用微分指令的原因 由于CMP指令没有微分形式 若欲使指令CMP只在00000 OFF→ON时执行一次 TIM 000 # 0020 00000 25505 01000 DIFU(13) 20000 若欲使指令CMP只在00000 OFF→ON时执行一次 则必须使用指令DIFU(13)
2. 块比较指令BCMP BCMP (68) CD CB R @ BM P(68) CD:比较数据 CB:数据块的起始通道 R:存结果通道 功能 当执行条件为ON时,将CD与每个数据区域比较。 当CD处于某个区域时,与该区域对应的R的位ON。
使用块比较指令BCMP举例 比较指令执行结果:HR 0514为 ON 数据块内容可预先写入 数据块 存结果 下限 上限 HR 05 比较数据 下限 上限 DM 0000 0000 DM 0001 0100 HR 0500 DM 0002 0101 DM 0003 0200 HR 0501 DM 0004 0201 DM 0005 0300 HR 0502 DM 0006 0301 DM 0007 0400 HR 0503 DM 0008 0401 DM 0009 0500 HR 0504 DM 0010 0501 DM 0011 0600 HR 0505 DM 0012 0601 DM 0013 0700 HR 0506 DM 0014 0701 DM 0015 0800 HR 0507 DM 0016 0801 DM 0017 0900 HR 0508 DM 0018 0901 DM 0019 1000 HR 0509 DM 0020 1001 DM 0021 1100 HR 0510 DM 0022 1101 DM 0023 1200 HR 0510 DM 0024 1201 DM 0025 1300 HR 0512 DM 0026 1301 DM 0027 1400 HR 0513 DM 0028 1401 DM 0029 1500 HR 0514 DM 0030 1501 DM 0031 1600 HR 0515 HR 05 @MOV(21) # 1450 200 @BCMP DM0000 HR 05 00000 比较数据 块首通道 结果通道 数据块内容可预先写入 比较指令执行结果:HR 0514为 ON
3. 表比较指令TCMP TCMP (85) CD TB R @ TCMP(68) CD:比较数据 TB:数据表的起始通道 R: 结果通道 功能 当执行条件为ON时,将CD与数据表中的数据比较。 当CD与表中某个通道的数据相同时,与该通道对应的R的位为ON。
使用表比较指令TCMP举例 数据表内容可预先写入 该程序执行结果:HR 1902为 ON。 存结果 数据表 结果通道 对应位状态 @MOV(21) # 0005 200 @TCMP HR00 HR19 00000 数据表 结果通道 对应位状态 HR00 0101 HR1900 0 HR01 0151 HR1901 0 HR02 0005 HR1902 1 HR15 0605 HR1915 0 … 比较数据 表首通道 结果通道 数据表内容可预先写入 该程序执行结果:HR 1902为 ON。
数据传送和数据比较指令小结 1. 数据传送指令 (1) 注意各种传送指令的区别。 单字传送MOV是常用的指令,要牢记其使用方法。 (1) 注意各种传送指令的区别。 单字传送MOV是常用的指令,要牢记其使用方法。 区别位传送和数字传送指令目的通道内容存放的方法 块设置指令BSET可以向TC区传送数据,用该指令可以改变定时器的当前值。 (2) 注意块传送和块设置指令功能的区别。 (3)注意单字分配、数据调用和数据交换指令的区别。
2. 数据比较指令 (1) 单字/双字比较指令是常用的指令,要牢记其格式、梯形图、操作数范围和使用方法。 2. 数据比较指令 (1) 单字/双字比较指令是常用的指令,要牢记其格式、梯形图、操作数范围和使用方法。 使用单字/双字比较指令要影响标志位25505~25507:① 在需要保存标志位状态时,要编写相应程序。 ②注意触点25505~25507的使用方法。 (2) 注意块比较和表比较指令执行结果的表示方法。
数据移位和数据转换指令 数 据 运 算 指 令 子程序控制 指 令 高速计数器控制 指 令
数据移位和数据转换指令
数据移位与数据转换指令指令 数据移位指令 数据转换指令
数据移位指令 移位寄存器指令 可逆移位寄存器指令 数字左、右移指令 算术左、右移指令 循环左、右移指令 字 移 位 指 令 异步移位寄存器指令
1. 移位寄存器指令SFT (10) 功 能 E:移位结束通道 IN:数据输入端 R:复位端 SP:移位脉冲输入端 St E IN SP R St :移位开始通道 E:移位结束通道 IN:数据输入端 R:复位端 SP:移位脉冲输入端 当复位端R为OFF时, 在SP端移位脉冲的作用下,IN端的数据被移入移位寄存器。 功 能 在移位脉冲的作用下,移位寄存器中的数据以位为单位依次向左移一位。
移位寄存器指令SFT 的用法 ●在移位脉冲作用下,St到E中的数据左移过程。 … St E IN端 数据 … 丢失 St E ●复位端R为ON时,St到E所有通道均复位为零,且移位指令不执行。 SFT(10) St E IN SP R ★ 没有移位脉冲时不执行移位。 ★ 移位寄存器具有保持功能。
移位寄存器指令SFT 的语句表 图示梯形图的语句表如下 SFT 的两个操作数都是200,表示只由200通道组成移位寄存器。 LD 00000 IN SP R 00000 25502 20003 00001 SFT(10) 200 01000 25315 LD 00000 LD 25502 LD 00001 OR 25315 SFT(10) 200 200 LD 20003 OUT 01000 SFT 的两个操作数都是200,表示只由200通道组成移位寄存器。
移位接触器 的工作时序 20000的ON状态,在200通道内依次向左移动。 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 IN SP R 00000 25502 20003 00001 SFT(10) 200 01000 25315 25502 00000 00001 20000 20001 20002 20003 20004 20000的ON状态,在200通道内依次向左移动。 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 200 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 200 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 200 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 200 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 200 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 200 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 200 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 200 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 200 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 200 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 200 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 200 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 200
分析程序的功能 25315使移位寄存器上电复位 00000 的状态作为输入数据 00001 ON 可使寄存器200复位 IN SP R 00000 25502 20003 00001 SFT(10) 200 01000 25315 25315使移位寄存器上电复位 00000 的状态作为输入数据 00001 ON 可使寄存器200复位 25502的秒脉冲作为移位脉冲 第一个移位脉冲输入后,00000的ON状态移入20000。 经过4个移位脉冲20003 ON,于是01000 ON。 第五个移位脉冲时20003 OFF,于是01000 也OFF。 移位过程中,只要00001为ON,移位寄存器即复位。
2. 可逆移位寄存器指令SFTR(84) C:控制通道 St :移位开始通道 E :结束通道 功能 SFTR (84) C St E 当执行条件为ON时, 根据控制通道C的内容,在St ~E通道内,执行左移或右移位操作。
可逆移位寄存器的用法 ① 控制通道C的含义 不使用 移位方向 1:左移(低→高) 0:右移(高→低) E 数据输入 移位脉冲输入 复位 SFTR (84) C St E 不使用 15 14 13 12 移位方向 1:左移(低→高) 0:右移(高→低) 数据输入 移位脉冲输入 复位 1: St~E及CY清零 0:根据C的状态移位
② 左、右移位的控制 ●通道C之bit 15为0时,在移位脉冲的作用下,根据C之bit 12的状态进行左移或右移。 SFTR (84) C St E ●通道C之bit 15为0时,在移位脉冲的作用下,根据C之bit 12的状态进行左移或右移。 St 开始通道 E 结束通道 ○ C之bit 12为1 左移:每个扫描周期,从St到E按位依次左移一位,C之bit13的数据移入St之bit 0中,E之bit15的数据 移入CY中。 ○ C之bit 12为0右移:每个扫描周期,从E到St按位依次右移一位,C之bit13的数据移入E之bit15中,St之bit0的数据移入CY中。 ●在执行条件为OFF时停止工作。此时若C之bit15为1,St到E及CY仍保持原状态不变。
使用可逆移位寄存器举例 LD 00000 OUT 20012 LD 00001 OUT 20013 LD 00002 DIFU (13) 20100 LD 20100 OUT 20014 LD 00003 OUT 20015 LD 00004 SFTR (84) 200 LR10 LR11 DIFU(13) 20100 移位方向 数据输入 移位脉冲 20013 20012 20100 00002 00001 00000 SFTR(84) 200 LR10 LR11 复位 00004 00003 20015 20014
程序功能分析 当00004为ON时,开始执行移位操作。 200的bit12~bit15的状态是由00000~00003控制的。 DIFU(13) 20100 移位方向 数据输入 移位脉冲 20013 20012 20100 00002 00001 00000 SFTR(84) 200 LR10 LR11 复位 00004 00003 20015 20014 当00004为ON时,开始执行移位操作。 200的bit12~bit15的状态是由00000~00003控制的。 若00001ON,则20013为1,即输入数据为1; 若00001OFF,则20013为0,即输入数据为0。 控制通道 每当00002 OFF→ON时,20014都会ON一个扫描周期,形成移位脉冲。 执行条件 开始通道 结束通道
(续) 若直接以00002作为移位脉冲。因为当00002为ON时,每个扫描周期都要执行一次移位,这将造成移位失控。 DIFU(13) 20100 移位方向 数据输入 移位脉冲 20013 20012 20100 00002 00001 00000 SFTR(84) 200 LR10 LR11 复位 00004 00003 20015 20014 若直接以00002作为移位脉冲。因为当00002为ON时,每个扫描周期都要执行一次移位,这将造成移位失控。 若00003ON,则20015ON,LR10~LR11及CY位清0 若00003OFF →20015 OFF,此时根据20012的状态执行移位操作。
每当00002OFF→ON时, LR10~LR11中的数据按位依次左移一位。20013的状态进入LR1000, LR1115的数据进入CY。 DIFU(13) 20100 移位方向 数据输入 移位脉冲 20013 20012 20100 00002 00001 00000 SFTR(84) 200 LR10 LR11 复位 00004 00003 20015 20014 (续) 若20012 ON执行左移位: 每当00002OFF→ON时, LR10~LR11中的数据按位依次左移一位。20013的状态进入LR1000, LR1115的数据进入CY。 HR1115~HR1100 HR1015~HR1000 CY ← 20013
每当00002OFF →ON时,LR10~LR11中的数据按位依次右移一位。20013的状态进入LR1115, LR1000的数据进入CY。 DIFU(13) 20100 移位方向 数据输入 移位脉冲 20013 20012 20100 00002 00001 00000 SFTR(84) 200 LR10 LR11 复位 00004 00003 20015 20014 (续) 若20012 OFF执行右移位: 每当00002OFF →ON时,LR10~LR11中的数据按位依次右移一位。20013的状态进入LR1115, LR1000的数据进入CY。 HR1115~HR1100 HR1015~HR1000 CY → 20013
3. 数字左/右移指令SLD (25)/ ASR(26) 算术左/右移位指令的功能和使用方法相似 以算术左移指令为例,介绍它们的功能和使用方法 SLD(74) St E St:移位首通道 E:移位结束通道 功能:当执行条件为ON时,执行指令将St~E中的数据以数字为单位依次左移位1位。如下图: St … ← 0 溢出 ← E
4. 算术左/右移位指令ASL (25)/ ASR(26) 算术左/右移位指令的功能和使用方法相似 以算术左移指令为例,介绍它们的功能和使用方法 ASL(25) Ch ASL(25) Ch Ch是移位通道号 功能 当执行条件为ON时,执行指令将Ch中的数据以位为单依次左移1位。最高位移入CY。如下图: CY Ch
5. 循环左/右移位指令ROL(27)/ROR(28) 循环左/右移位指令的功能和使用方法相似 以循环左移指令为例,介绍它们的功能和使用方法 ROL(27) Ch ROL(27) Ch Ch是移位通道号 功能 当执行条件为ON时,将Ch及CY中的数据以位为单依次循环左移位1位。如下图: CY Ch
使用指令ROL举例 写语句表、分析程序功能 … 当00000 OFF→ON时 ① 执行一次指令ROL 使HR00循环左移一次 @MOV(21) 010 … END(01) 当00000 OFF→ON时 ① 执行一次指令ROL 使HR00循环左移一次 ② 执行一次指令MOV 将HR00的数据传送到010通道中去。 LD 00000 @ROL(27) HR00 @MOV(21) HR00 010 END(01) …
(续)设HR00中的数据如下(设CY= 0 ) … ← 执行一次指令ROL后,CY和 HR00中的数据如下: ← 010通道中的数据为: 1101 0101 0101 0101 CY 00000 @ROL(27) HR00 @MOV(21) 010 … END(01) 执行一次指令ROL后,CY和 HR00中的数据如下: ← 1010 1010 1010 1010 1 010通道中的数据为: 1010 1010 1010 1010
★ 执行ROL/ROR指令时应注意的问题 由于程序扫描到END时,CY等标志位将被清零。 在下个扫描周期执行ROL时,仍需要 CY位参与移位或运算,这时会出现错误。 为了解决该问题,需设置保存 CY状态的程序
保存 CY状态的程序 原程序 修改后的程序 … … 00000 @ROL(27) HR00 @MOV(21) 010 END(01) STC(40) 25504 HR 0100 END(01)
(续)具有保存 CY状态的程序的分析 … 若某扫描周期使CY=1,则25504 ON→HR0100 ON 00000 @ROL(27) HR00 HR0100 STC(40) 25504 HR 0100 END(01) 下个扫描周期执行程序时,由于HR0100 ON ,则执行指令STC → CY位置1。 这样,在本扫描周期执行ROL指令时,CY的状态就是正确的了。 类似这样的问题,编程时务必引起注意。
6. 字移位指令WSFT(16)/ @WSFT(16) 功能:当执行条件为ON时,将St~E中的内容以字为单位依次左移1位。如下图: ← … 丢失 ← E 0000 St+1
7. 异步移位寄存器指令ASFT /@ASFT C:控制数据 St :移位开始通道 E :结果通道 C的含义 C 指令功能 15 14 13 12 为 0 移位方向:0→上移 1→下移 是否允许移位:0→ 不允许 1→允许 指令功能 是否复位:0→ 正常操作 1→复位 当执行条件为ON时,将数据为0000的通道与相邻通道进行数据交换。
执行指令ASFT时数据交换的规则 执行指令ASFT,可以把数据为0000的通道集中到数据区的上半部分或下半部分。 ① 相邻两通道数据都为0000,不交换。 ②上移:数据为0000的通道与相邻高地址通道交换。 ③下移:数据为0000的通道与相邻低地址通道交换。 执行指令ASFT,可以把数据为0000的通道集中到数据区的上半部分或下半部分。
使用指令ASFT举例 6 → 0 1 1 0 控制字 C=#6000 #6000 下移 第一次移位 允许移 正常工作 DM0000 00000 执行前 2B68 0000 507A 5147 0234 DM0000 DM0007 DM0001 DM0002 DM0003 DM0004 DM0005 DM0006 执行后 2B68 0000 507A 0234 5147 控制字 C=#6000 6 → 0 1 1 0 正常工作 允许移 下移 第一次移位
数据移位指令小结 1. 要根据需要,选择合适的数据移位指令。 ① 是需要建立移位寄存器、还是要按位移位、按数字移位或按字移位。 1. 要根据需要,选择合适的数据移位指令。 ① 是需要建立移位寄存器、还是要按位移位、按数字移位或按字移位。 ② 是需要作单向移位、循环移位、还是异步移位。 ③ 是需要作左移位还是右移位。 2. 当需要标志位CY参与移位时,有时需要编程保存CY的状态。 3. 注意执行各种指令后对标志位的影响。
数据转换指令 BCD→二进制转换 16→4编码指令 二进制→ BCD转换 七段译码指令 4→16 译码指令 ASCII码转换指令
1. BCD码→二进制数转换指令BIN/@BIN BCD /@BCD与 BIN/@BIN指令类似,下面以BIN/@BIN为例说明其使用方法。 BIN(23) S R BIN(23) S: 源通道 R: 结果通道 功能:当执行条件为ON时,将S中的BCD码转换成二进制数,并将结果存入R中。
写出图示语程序的句表、并分析功能。 本例只在00000 OFF→ON时转换一次。 源通道IR200中为BCD数4321。 @BIN DM0000 200 # 4321 @ MOV LD 00000 @ MOV (21) # 4321 200 @ BIN (23) DM0000 4321转换为二进制数是 0100000011100001 转换后结果通道内容 第3位 第2位 第1位 第0位 0 0 1 1 0 1 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 1 0 0 0 0 1 IR200 源通道 DM0000 结果通道 第3位 第2位 第1位 第0位 0 0 0 0 0 1 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 1 1 0 0 0 0 1 本例只在00000 OFF→ON时转换一次。
2. 4→16 译码指令MLPX/@ MLPX MLPX (76) S C R @ MLPX(76) 数字3 数字2 数字1 数字0 S中第一个要译码的数字位位号 S中要译码的数字位数 0→ 1位 1→2位 2→ 3位 3→4位 固定为0
指令功能 译码方法 当执行条件为ON时,根据C的内容对S进行译码,并将结果存放中R中。 ① 由C确定被译码的起始数字位及译码的位数; ② 将该位数字(十六进制)转换为0~15的十进制数; ③ 再将结果通道中与该十进制数对应的位置为ON,其余位为OFF。 ④被译码的数字位不能大于4。
被译码的数字位要连续 结果通道的存放顺序 如:1 → 2 →3 →0 3 →0 →1 →2 2 →3 →0 →1 等 C= # 0030 对4位数字译码 从0位开始译码 对3位数字译码 从3位开始译码 C= # 0030 C= # 0023 R R+1 R+2 R+3 1 2 3 S R R+1 R+2 R+3 1 2 3 S 第1个 第2个 第3个 第4个 第1个
C=#0013 使用译码指令MLPX举例 写语句表、分析程序功能 源 通 道 IR200 控制字C=#0013 结果首通道HR00 @MOV # 78F5 200 00000 @MLPX # 0013 HR00 LD 00000 @ MOV (21) # 78F5 200 @ MLPX (76) # 0013 HR 00 源 通 道 IR200 控制字C=#0013 结果首通道HR00 IR200:78F5 C=#0013 从第三位数字开始译码 对2个数字译码 (第3位→第0位) 译2个数字,存放结果需要2个通道 HR00和HR01
(续)译码的原理 源通道(78F5)第3位数字是0111——十进制数7 则以7为位号,将结果首通道HR00中的bit07置为1 源通道第0位数字是0101——十进制数5 则以5为位号,将结果末通道HR01的bit 05置为1 第3位 第2位 第1位 第0位 1 0 0 0 0 1 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 1 1 1 0 1 0 1 IR200 源通道 HR00 结果通道 0 0 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 0 0 0 0 0 0 0 HR01 结果通道 0 0 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 1 0 0 0 0 0
对本例,如果C=#0023,即对3个数字译码,第3个被译码的是源通道的第1位数字。第3个译码结果存放在结果通道HR02中。 第3位 第2位 第1位 第0位 1 0 0 1 0 1 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 1 1 1 0 1 0 1 IR200 源通道 HR00 结果通道 0 0 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 0 0 0 0 0 0 0 HR01 0 0 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 1 0 HR02 结果通道 0 0 0 0 1 0 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 1 0 0 0 0 0
使用译码指令MLPX 时需注意 ① 执行一次指令,最多只能对4个数字译码。 ② 结果通道不能超过其所在区域。 例如设C=#0023时,结果首通道设为HR18; 设C=#0042 等,都是错误的。
3. 16 → 4 编码指令DMPX/@ DMPX DMPX (77) S R C @ DMPX(77) S:源首通道 C:控制数据 R :结果通道 C的含义 C 数字3 数字2 数字1 数字0 R中接收编码的第一个数字位 被编码的源通道数 0→ 1个 1→2个 2→ 3个 3→4个 固定为0
指令功能 编码方法 当执行条件为ON时,根据C的内容,对以S为首通道的几个通道进行编码,并将结果存放在R中。 ① 由C确定被编码的通道数;
C=#0013 使用编码指令DMPX举例 写语句表、分析程序功能 源首通道 IR00 控制字 C=#0013 结果通道DM0000 @MOV # 0013 220 00000 @DMPX HR00 DM0000 LD 00000 @ MOV (21) # 0013 220 @ DMPX (77) HR 00 DM0000 源首通道 IR00 控制字 C=#0013 结果通道DM0000 C=#0013 从R的数字位3 开始存放结果 对2个通道进行编码 对两个通道编码,源通道 应为 HR00和HR01
(续)编码的原理 设源通道HR00中内容为A8E7(1010 1000 1110 0111) 源首通道 IR00 结果通道DM0000 控制字 C=#0013 结果通道DM0000 HR00中为1的最高位的位号是15——十六进制编码F 将编码F放在结果通道DM0000的第3位数字位上。 设源通道HR01中内容为01BF(0000 0001 1011 1111) HR01中为1的最高位的位号是8——十六进制编码8 将编码8 放在结果通道DM0000的第0 位数字位上。
存放编码结果的位号要连续 结果的存放顺序 如:1 → 2 →3 →0 3 →0 →1 →2 2 →3 →0 →1 等 C= # 0030 1 2 3 R S S+1 S+2 S+3 1 2 3 R S S+1 S+2 S+3 第4个 第1个 第1个 第2个 第4个 第3个
原通道与编码结果的对应关系 第3位 第2位 第1位 第0位 1 0 0 0 1 0 1 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 1 1 0 0 1 1 1 HR00 源通道 HR01 源通道 0 0 0 1 0 0 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 0 1 1 1 1 1 1 DM0000 结果通道 1 1 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 0 0 0 若C=#0023(对3个源通道编码),第3个被编码的源通道应是HR02,第3个编码结果应放在DM0000的数字位1上。
使用编码指令DMPX时需注意 ① 源通道不能超过其所在区域。 ② 源通道不能超过4个。 例如设C=#0023时,源首通道设为HR18;
4. 七段译码指令SDEC/@ SDEC S:源通道(BCD) C:控制数据 R :结果首通道 C的含义 SDEC (78) S C R 数字3 数字2 数字1 数字0 S中第一个要译码的数字位 被译码的数字位的位数 0→ 1位 1→2位 2→ 3位 3→4位 固定为0 从R的高8位还是低8位开始存放第一个结果 0:低8位 1;高8位
转换后结果存放顺序 C= # 0 0 3 0 固定为0 从R低8位开始存放 译码4位数字 从数字位0开始译码 S R 低8位 R+1 低8位 1 2 3 S R 低8位 高8位 R+1 低8位 高8位
注意: 对4个数字译码占用了三个通道! C= # 0 1 3 3 固定为0 从R高8位开始存放 译码4位数字 从数字位3开始译码 S R 1 2 3 S R 低8位 高8位 R+1 低8位 高8位 R+2 低8位 高8位 注意: 对4个数字译码占用了三个通道!
指令SDEC的功能 译 码 方 法 当执行条件为ON时,根据C的内容,对S进行译码,并将结果存放中R中。 ① R中的bit00~06及bit08~14分别对应数码管的a、b、c、d、e、f、g段。 bit07和bit15不用。 ② bit00~06及bit08~14若为1,对应数码管的段发光。 ③ 根据被译码数字位的数值,确定 bit00~06及bit08~14哪个位为1。 ④译码结果存放在以R为首的几个连续通道中(由C确定是从R的低8位还是高8位开始存放)。
C=#0013 使用译码指令SDEC举例 写语句表、分析程序功能 源 通 道 IR00 控制字 C=#0013 结果首通道 HR01 @MOV # 1673 HR00 00000 @SDEC #0013 HR01 LD 00000 @ MOV (21) # 1673 HR00 @ SDEC(78) # 0013 HR01 源 通 道 IR00 控制字 C=#0013 结果首通道 HR01 HR00:1673 C=#0013 R中第一个要译码的数字位 对2个数字位进行译码 从R的低8位开始存放结果 译码数字位3→0 需占用一个结果通道
(续)译码的原理 设源通道HR00中内容为1673(BCD) 源通道中第3位数字是1→对应 b、c 段应该是1; a b c d e f g a b c d g b c 设源通道HR00中内容为1673(BCD) 源通道中第3位数字是1→对应 b、c 段应该是1; 第一个译码结果要存放在结果通道的低8位,所以HR01的低8位是0000 0110(bit7固定为0); 源通道中第0位数字是3→对应 a、 b、 c、d、g段是1; 第二个译码结果要存放在结果通道的高8位,所以HR01的高8位是0100 1111(bit15固定为0)。 源通道数字与译码结果通道的对应关系如下页图。
(续)源通道数字与译码结果通道的对应关系 1 6 7 3 0 1 1 0 0 0 0 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 1 1 1 0 0 1 1 HR00 源通道 d g × b a e f c 1 1 1 1 0 1 0 0 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 0 0 0 1 1 0 HR01 结果通道 a b c d e f g a b c d g b c
注意 本例中,若C=#0113时,也是对2个数字译码,若第一个结果从高8位开始存放,则需要两个结果通道。 第一个译码结果存在HR01的高8位,第二个译码结果存在HR02的低8位。 注意 ① 执行一次指令,最多只能对4个数字译码; ② 结果通道不能超过其所在区域。 例如:设 C=#0023时,结果首通道设为HR18; 设 C=#0042 等,都是错误的。
5. ASCII码转换指令ASC/@ ASC S:源通道 C:控制数据 R :结果首通道 C的含义 ASII (86) S C R 数字3 数字2 数字1 数字0 S中第一个被转换的数字位 被转换的数字位的位数 0→ 1位 1→2位 2→ 3位 3→4位 校验 0:无校验 1:偶校验 2:奇校验 从R的高8位还是低8位开始存放第一个结果 0:低8位 1;高8位
指令功能 当执行条件为ON时,根据C的内容,将S中指定的数字转换成ASCII码,并将结果存放在R中。 关于校验位 ① 结果通道的bit00~06及bit08~14存放结果。bit07和bit15是校验位。 ② 若设置不校验,则bit07和bit15为0。 ③ 若设置奇校验,则校验位与ASCII码中的1的总数应为奇数,否则bit07和bit15为1; ④ 若设置偶校验,则校验位与ASCII码中的1的总数应为偶数,否则bit07和bit15为1。
转换方法 ① 确定源通道中欲转换的第一个数字及数字个数 。 ②查ASCII码表,对源通道中欲转换的数字进行转换 。 ③ 根据C中bit08~11的规定,按顺序存放结果。 由C来确定,是从R的低8位、还是高8位开始存放。 ④ 根据C中校验的规定,确定 bit07和bit15的状态。
执行ASC指令的几种情况 C= # 0 0 1 1 从R低8位开始存放 转换2位数字 从数字位1开始转换 无校验 0 0 0 1 0 0 0 1 0 1 0 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 1 1 1 1 0 1 S 源通道 31 33 0 0 0 1 0 0 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 1 1 0 0 1 1 R 结果通道
C= # 1 0 1 0 从R低8位开始存放 转换2位数字 从数字位0开始转换 偶校验 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 0 1 0 0 1 1 S 源通道 31 33 0 0 0 1 1 0 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 1 1 0 0 1 1 R 结果通道
C= # 2 0 1 0 从R低8位开始存放 转换2位数字 从数字位0开始转换 奇校验 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 0 1 0 0 1 1 S 源通道 31 33 0 0 0 1 0 0 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 1 0 1 1 R 结果通道
C= # 2 1 1 0 从R高8位开始存放 转换2位数字 从数字位0开始转换 奇校验 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 0 1 0 0 1 1 S 源通道 33 0 0 1 1 1 0 1 1 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 R 结果通道 31 215 214 213 212 211 210 29 28 23 22 21 20 27 26 25 24 0 0 1 1 0 0 0 1 R+1 结果通道
数据转换指令小结 1. 根据所作的操作(数制转换、编/译码),正确选择指令。 2. 编码(DMPX)与译码(MLPX)是互为逆操作的指令。其操作数较烦琐,要抓住它们的对偶关系来记忆指令的操作数。要确保操作数设置正确。 3. 七段译码指令(ASC)的执行结果对应数码管的a~g段。注意其结果的存放方法。 4. 注意ASCII码转换指令(ASC)执行结果的存放方法及不同校验方式时bit07和bit15的状态。 5. 注意执行各种指令对标志位的影响。
数据运算指令
数据运算指令 十进制运算指令 二进制运算指令 逻辑运算指令
十进制运算指令 十进制加法运算指令 十进制减法运算指令 十进制乘法运算指令 十进制除法运算指令
几种单字十进制运算指令 ADD (30) Au Ad R @ ADD(30) 当执行条件ON时,将Au、 Ad及CY相加,结果存入R。若结果大于9999,则将CY置1。 SUB (31) Mi Su R @ SUB(31) 当执行条件ON时,将Mi减去Su、再减CY,结果存入R。若有借位,将CY置1,且用0-R-CY,结果存入R MUL(32) Md Mr R @ MUL(32) 当执行条件ON时,将Md与 Mr相乘,结果存入从R(低4位)开始的结果通道中。 DIV (33) Dd Dr R @ DIV(33) 当执行条件ON时, 用Dd除以Dr 、结果存入R(商)和R+1 (余数)中。
使用运算指令时涉及CY,关于CY的指令: STC(40) @ STC(40) 当执行条件ON时,将25504(CY)置1。 CLC(41) @CLC(41) 当执行条件ON时,将25504(CY)置0。 通道BCD 数据 递增/递减指令: INC(38) @ INC(38) 执行一次指令,将通道数据递增1。 DEC(39) @ DEC(39) 执行一次指令,将通道数据递减1。
② 执行指令ADD将DM0010 (已预先写入0300)加上#0300; 1. 十进制加法运算指令举例 TIM000 DM0010 TIM001 # 0600 01000 00000 TIM001 CLC (41) 00000 TIM001 ADD(30) # 0300 CMP(20) # 0900 MOV(21) 25507 分析程序功能 当00000及TIM001 ON(一个扫描周期)时: ① 执行指令CLC将CY清零; ② 执行指令ADD将DM0010 (已预先写入0300)加上#0300; DM0010中的数据每加#0300,TIM000的设定值增加30秒。 ③ 执行指令CMP将#0900与DM0010比较 ;
④若DM0010 大于#0900,执行指令MOV ,再将#0300传送到DM0010中。 TIM000 DM0010 TIM001 # 0600 01000 00000 TIM001 CLC (41) 00000 TIM001 ADD(30) # 0300 CMP(20) # 0900 MOV(21) 25507 再次将#0300传送到DM0010,TIM000的设定值恢复为30秒。 ⑤TIM000的设定值是变化的, TIM001的设定值是固定的。 TIM001控制01000ON的时间、 TIM000控制01000 OFF时间 。 01000 ON的时间总是60秒; 01000 OFF的时间从 30秒起依次增加30秒(不超过90秒)。
该段程序对01000实现了循环间歇OFF、ON的控制。程序实现的控制如下: TIM000定时30s TIM001定时60s TIM000定时60s 01000 ON 60秒← 01000 OFF 90秒←01000 ON 60秒 00000 ON→01000 OFF 30秒→01000 ON 60秒→01000 OFF 60秒 ↑ ↓ TIM001定时60s TIM000定时90s TIM001定时60s
② 执行指令SUB,用HR00的 内容减去DM0000的内容,再减去CY,将差存放在HR01; 2. 十进制减法运算指令举例 MOV(21) # 0001 HR02 00000 CLC (41) # 0000 SUB (31) HR00 DM0000 HR01 25504 IL(02) ILC (03) 分析程序功能 当00000ON时: ① 执行指令CLC将CY清零; ② 执行指令SUB,用HR00的 内容减去DM0000的内容,再减去CY,将差存放在HR01; 若运算无借位,CY=0,触点25504 OFF,执行指令MOV置HR02为0(记忆CY状态); 若运算有借位,CY=1,触点25504 ON,执行CLC清CY。
③若运算有借位,因为HR01的 内容是差的十进制补码,故应再作一次减法运算。 MOV(21) # 0001 HR02 00000 CLC (41) # 0000 SUB (31) HR00 DM0000 HR01 25504 IL(02) ILC (03) 所以运算有借位时,要清CY,再执行一次指令SUB,用# 0 减去HR01的 内容,再将差存放在HR01。 ④将HR02置1 (记忆CY状态) 该程序段使用了分支指令,只有当00000 ON时,程序才执行。
有借位的减法运算的过程如下 设HR00的内容为1000,DM0000的内容为2000。 HR01 CY HR00 DM000 CY 第一次减:1000 – 2000 – 0→1000 + (10000 – 2000) = 9000 1 HR01 CY HR01 CY 第二次减:0000 – 9000 – 0→ 0000 + (10000 – 9000) = 1000 1
执行指令BSET,将DM0000~ DM0004清零,以准备运算。 # 0000 DM0000 DM0004 @INC 00000 21000 00001 21000 @CMP # 0004 @DIV DM0001 # 0002 DM0003 25507 @MUL 3. 十进制乘/除运算指令举例 乘法运算与CY位无关。 分析程序功能 ①运行程序前先令00000ON一次 执行指令BSET,将DM0000~ DM0004清零,以准备运算。 ②令00001ON一次,执行一次指令INC,使DM0000内容加1; ③执行一次指令CMP将DM0000与#0004比较;
若DM0000的内容大于# 0004,则将21000置为ON,执行一次指令BSET,将DM0000~ DM0004清零; # 0000 DM0000 DM0004 @INC 00000 21000 00001 21000 @CMP # 0004 @DIV DM0001 # 0002 DM0003 25507 @MUL 若DM0000的内容大于# 0004,则将21000置为ON,执行一次指令BSET,将DM0000~ DM0004清零; ④ 执行一次指令MUL,将DM0000的内容与#0004相乘,结果存入DM0001~DM0002中; ⑤执行一次指令DIV,将DM0001~DM0002的内容与#0002相除,将商存入DM0003、将余数存入DM0004中;
00001 ON4次,DM0000~DM0004的内容如下 从00001第5次ON开始,再重复上面的过程。 00001ON DM0000 DM0001 DM0002 DM0003 DM0004 第1次 0001 0004 0000 0002 0000 第2次 0002 0008 0000 0004 0000 第3次 0003 0012 0000 0006 0000 第4次 0004 0016 0000 0008 0000 DM0001~ DM0002除2 商 余数 DM0000乘4 DM0000加1 从00001第5次ON开始,再重复上面的过程。
二进制运算指令 二进制加法运算指令 二进制减法运算指令 二进制乘法运算指令 二进制除法运算指令
二进制运算指令的功能 ADB (50) Au Ad R @ ADB (50) 当执行条件ON时,将Au、 Ad及CY相加,结果存入R。结果大于FFFF时,将CY置1。 SBB (51) Mi Su R @ SBB (51) 当执行条件ON时,将Mi减去Su、再减CY,结果存入R。有借位时将 CY置1,且用0-R-CY再存入R MLB(52) Md Mr R @ MLB(52) 当执行条件ON时,将Md与 Mr相乘,结果存入从R(低4位)开始的结果通道。 DVB (53) Dd Dr R @ DVB(53) 当执行条件ON时, Dd除以Dr 、结果存入R(商)和R+1 (余数)中。
二进制运算指令举例 分析程序功能 用二进制运算指令完成(250×8 – 1000)/50运算的例子。 @SBB DM 0000 # 03E8 DM 0002 @DVB # 0032 DM 0003 @BSET # 0000 DM0000 DM0004 00000 00001 00001 00000 @MOV # 00FA HR00 @MLB # 0008 @CLC (41) 用二进制运算指令完成(250×8 – 1000)/50运算的例子。 分析程序功能 (1)当满足条件时,执行一次BSET指令将DM0000~DM0004清零,以备开始运算。 (2)当00001ON、00000OFF时,执行如下操作: ①执行@MOV指令将#00FA(十进250)传送到HR00中;
③执行 @CLC指令将CY清零,以备相减运算。 @SBB DM0000 # 03E8 DM0002 @DVB # 0032 DM0003 @BSET # 0000 DM0004 00000 00001 00001 00000 @MOV # 00FA HR00 @MLB # 0008 @CLC (41) ②执行@MLB指令将HR00的内容与#0008相乘,将结果的低位07D0(十进2000)存在DM0000中、结果高位0000存在 DM0001中; ③执行 @CLC指令将CY清零,以备相减运算。 ④执行@SBB指令,DM0000的内容减去#03E8(十进1000),将结果#03E8存在DM0002中; ⑤执行指令@DVB,将DM0002的内容除以#0032(十进50),把商#0014(十进20)存在DM0003中、把余数#0000存在DM0004中。
执行各种指令和运算的结果如下 执行指令 HR00 DM0000 DM0001 DM0002 DM0003 DM0004 CY @BSET — @MOV 00FA @MLB 07D0 @CLC @SBB 03E8 @DVB 0014
逻辑运算指令 逻辑与/或运算指令 逻辑同或运算指令 逻辑异或运算指令 逻 辑 求 反 指 令
几种逻辑运算指令的功能 ANDW (34) I1 I2 R @ ANDW (34) 当执行条件ON时,将输入数据I1 和 I2进行逻辑与,结果存入R中。 ORW (35) I1 I2 R @ ORW (35) 当执行条件ON时,将输入数据I1 和 I2进行逻辑或,结果存入R中。 XORW(36) I1 I2 R @ XORW(36) 当执行条件ON时,将输入数据I1 和 I2进行逻辑异或,结果存入R中。 XNRW(37) I1 I2 R @ XNRW(37) 当执行条件ON时,将输入数据I1 和 I2进行逻辑同或,结果存入R中。
逻辑运算指令举例 分析执行逻辑运算的结果 00000 00001 @BSET # 0000 DM0004 清零 #008F @ORW DM0000 # 0073 DM0001 @BSET # 0000 DM0004 @ANDW # 008F # 0081 00000 00001 00001 00000 @XORW DM0002 分析执行逻辑运算的结果 清零 #008F 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 #0081 DM0000 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 字逻辑与 逻辑与 DM0001 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 DM0000 #0073 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 字逻辑或 逻辑或 DM0000 DM0001 DM0002 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 字逻辑异或 逻辑异或
逻辑运算指令的用途 (1)用逻辑指令完成逻辑运算 (2)用逻辑指令进行通道清零 (3)用逻辑指令将通道中的某些位屏蔽 例如,欲保留HR00中的bit0、bit3、bit4、bit7、bit10的状态而屏蔽其余位的状态 可用#0499与HR00进行逻辑与运算来实现 ( #0499:0000 0100 1001 1001)
数据运算指令小结 1. 算术运算 2. 正确使用逻辑运算指令,注意其用途。 3. 注意执行各种指令对标志位的影响。 (1) 作二进制/十进制的加/减运算时,需要CY位参与运算,注意运算开始要进行CY清零。 (2) 注意二进制/十进制减法运算有借位时的处理方法。 (3) 注意除法运算时结果的存放方法。 (4) 注意双字运算时结果的存放方法。 2. 正确使用逻辑运算指令,注意其用途。 3. 注意执行各种指令对标志位的影响。
子程序控制指令
子程序控制指令 子程序调用指令 子程序定义指令 宏 指 令
一、子程序调用和子程序定义指令 1. 指令格式和功能 功能:当执行条件ON时,调用编号为N的子程序。 1. 指令格式和功能 SBS (91) N @ SBS (91) N SBS (91) N @ SBS (91) N 功能:当执行条件ON时,调用编号为N的子程序。 SBN (92) N RET (93) SBN (92) N 功能:用SBN定义子程序N开始,用RET定义子程序结束。
2. 执行子程序调用指令的过程 注意的问题: (1) 指令SBS必须满足执行条件时,才能调用子程序。 主程序段 SBS(91) 000 SBS(91) 001 SBN(92) 000 子程序000 RET(93) SBN(92) 001 子程序001 END(01) 主程序段 1 (1) 指令SBS必须满足执行条件时,才能调用子程序。 主程序段 2 (2) 子程序段必须用指令SBN/RET来定义。 主程序段 3 (3) 子程序必须放在主程序之后、指令END之前。 子程序 000 (4) 子程序不能自调用。 子程序 001 (5) 子程序嵌套不能超过16级。
3. 子程序调用举例( 1 ) 分析程序功能 (1) 当00100为OFF时,执行主程序。 3. 子程序调用举例( 1 ) END(01) RET(93) MOV(21) 220 010 # 0001 SBS(91) 005 00100 25313 KEEP 01100 25314 SBN(92) 005 22007 25502 SFT(10) 分析程序功能 主程序 (1) 当00100为OFF时,执行主程序。 ①执行指令MOV向通道220传送数据0001(使22000ON)。 25502 ② 执行指令KEEP,由01100输出秒脉冲(注意25502的作用)。 (2) 当00100为ON时,执行主程序中的指令SBS,中断执行主程序,转去执行子程序 005: 子程序 ① 只要00100一直ON,每个扫描周期都执行移位寄存器指令SFT,使22000的ON状态每秒向高位移一位。 移位时间取决于00100 ON的时间。
注意几个问题: ② 执行指令MOV,将通道220的内容传送到通道010。 ③ 返回主程序,继续执行主程序中的指令KEEP。 子程序 END(01) RET(93) MOV(21) 220 010 # 0001 SBS(91) 005 00100 25313 KEEP 01100 25314 SBN(92) 005 22007 25502 SFT(10) ② 执行指令MOV,将通道220的内容传送到通道010。 ③ 返回主程序,继续执行主程序中的指令KEEP。 25502 只要00100ON,上述过程将持续进行。 注意几个问题: ①主程序中若将SBS改成@SBS,会产生什么现象? ② 当22007为ON时,通道220的内容将如何变化?此后220的内容如何变化?
子程序调用指令举例(2) 子程序 主程序 @MOV # 0004 200 25315 SBS(91) 002 CNT000 00000 25502 TIM001 # 0020 01000 SBN(92) 002 25313 200 ADD(30) #0002 CMP(20) #0010 25506 MOV(21) # 0004 RET(93) END(01) 主程序 子程序
先分析主程序 PLC上电,即将#0004传送到通道200,复位CNT000。 主程序 MOV # 0004 200 25315 SBS(91) 002 CNT000 00000 25502 TIM001 # 0020 01000 主程序 PLC上电,即将#0004传送到通道200,复位CNT000。 (1)若00000ON ,CNT000开始计数(或定时)。计数器设定值为通道200的内容,计数器能自复位。 (2) 若CNT000 ON ( ON一个扫描周期 ): ① 停止执行主程序,转去执行子程序002。 ②子程序执行完毕,返回执行主程序:将01000置为ON、并使TIM001开始定时(2s)。
再分析子程序 (1)执行指令ADD ,将通道200加上#0002; 计数器的设定值变成0006 子程序 SBN(92) 002 25313 200 ADD(30) #0002 CMP(20) #0010 25506 MOV(21) # 0004 RET(93) END(01) 子程序 计数器的设定值变成0006 (2)执行指令CMP ,将通道200的内容与#0010比较; (3)若200的内容= #0010,则将#0004传送到通道200中。 计数器的设定值恢复0004 (4)子程序执行完毕,返回执行主程序。
子程序调用举例( 3 ) 子程序嵌套 程序分析 比较 主程序 子程序 ①执行子程序010时若25506 ON,则使21000ON。 SBS(91) 010 CNT000 25315 00000 25502 21001 # 0300 01001 SBN(92) 010 DEC(39) DM0000 25313 25313 CMP(20) DM0000 # 0000 主程序 子程序 25506 ①执行子程序010时若25506 ON,则使21000ON。 21000 21000 SBS(91) 011 RET(93) ②则再调用子程序011,使21001ON SBN(92) 011 25313 21001 ③子程序011执行完毕,返回010。 RET(93) ④从子程序010返回继续执行主程序 END(01) BCD减1
(续) ⑤执行子程序010时,若25506 OFF则返回主程序。 由于CNT000为自复位,所以它只ON一个扫描周期 CMP(20) DM0000 # 0000 25506 21000 SBS(91) 011 RET(93) SBN(92) 011 21001 25313 END(01) SBS(91) 010 CNT000 25315 00000 25502 # 0300 01001 SBN(92) 010 DEC(39) ⑤执行子程序010时,若25506 OFF则返回主程序。 由于CNT000为自复位,所以它只ON一个扫描周期 如果执行子程序,两个子程序也只在该扫描周期中执行一次。
二、宏指令及其功能 执行宏指令的过程 MCRO(99) N I1 O1 @ MCRO(99) 注意:子程序N必须用指令SBN/RET来定义,必须放在主程序之后、END之前。子程序嵌套不能超过16次。 执行宏指令的过程 ① 当执行条件ON时,停止执行主程序,将输入数据I1~ I1+3的内容复制到SR232~SR235中,将输出数据O1~ O1+3的内容复制到SR236~SR239中,然后调用子程序N; ②子程序N执行完毕,再将SR236~SR239的内容传送到O1~ O1+3中,并返回到MCRO的下一条语句,继续执行主程序。
关于宏指令的操作数 执行一次左面的程序与执行下图程序的结果相同。 程序中,一般安排多次调用宏指令。 结构相同 @INC HR10 SBN(92) 040 @MCRO 040 010 RET(93) END (01) 00001 23200 23600 23201 23601 子程序040 第一个输入字 执行一次左面的程序与执行下图程序的结果相同。 第一个输出字 结构相同 HR1000 01001 01000 HR1001 程序中,一般安排多次调用宏指令。
使用宏指令举例(1) 执行左面的程序与执行下图的结果相同。 本程序中安排2次调用宏指令。 子程序100 子程序040 第一个输入字 @MCRO 040 200 HR00 SBN(92) 040 201 HR10 RET(93) END (01) 00100 23200 23600 23201 23601 23202 主程序 子程序 执行左面的程序与执行下图的结果相同。 子程序100 子程序040 第一个输入字 HR0000 20000 HR0001 20001 20002 0000 HR 0001 HR1000 20100 HR1001 20101 20102 1000 1001 第一个输出字 本程序中安排2次调用宏指令。
使用宏指令举例(2) 25313 MCRO 25507 100 HR10 MOV 010 #0003 HR01 23200 HR05 SBN(92) 100 25313 HR05 011 ADD HR00 DM0000 #0010 CLC (41) DIV DM0010 CMP #0006 RET(93) END (01) MOV #0003 HR01 25507 23200 23600 23201 23601 (X+10),结果存入DM0000 Y=(X+10)/X, 结果Y存入 DM0010 Y与#0006比较
执行上面的程序与执行左图的结果相同。 HR1000 01000 HR1001 01001 25313 ADD(30) HR00 DM0000 #0010 DIV(33) DM0010 CMP(20) #0006 25507 MOV(21) #0003 HR01 CLC (41) HR0500 01100 HR0501 01101 25313 ADD(30) HR00 DM0000 #0010 DIV(33) DM0010 CMP(20) #0006 25507 MOV(21) #0003 HR01 CLC (41) 执行上面的程序与执行左图的结果相同。
使用宏指令举例(3) 当需要经常执行结构相同、但操作数不同的程序段时,使用宏指令,使程序大大简化,也提高了子程序的利用率。 SBN(92) 040 @MCRO 040 HR10 010 RET(93) END (01) 00001 23200 23201 23601 23600 HR11 011 00002 HR1000 01001 01000 HR1001 HR1100 01101 01100 HR1101
子程序控制指令小结 1. 子程序必须用指令SBN/RET来定义。子程序必须放在主程序之后、指令END之前。 2. 子程序执行完毕,要返回到调用它的指令SBS的下一条指令处,继续执行主程序。 3. 注意宏指令的应用场合,其操作数与子程序中输入/输出数据的对应关系。 4. 注意执行指令对相关标志位的影响。