5.1.3 移位指令及應(yīng)用舉例
5.1.3 移位指令及應(yīng)用舉例
移位指令分為左、右移位和循環(huán)左、右移位及寄存器移位指令三大類。前兩類移位指令按移位數(shù)據(jù)的長度又分字節(jié)型、字型、雙字型3種。
1. 左、右移位指令
左、右移位數(shù)據(jù)存儲單元與SM1.1(溢出)端相連,移出位被放到特殊標(biāo)志存儲器SM1.1位。移位數(shù)據(jù)存儲單元的另一端補0。移位指令格式見表5-5。
(1)左移位指令(SHL)
使能輸入有效時,將輸入IN的無符號數(shù)字節(jié)、字或雙字中的各位向左移N位后(右端補0),將結(jié)果輸出到OUT所指定的存儲單元中,如果移位次數(shù)大于0,最后一次移出位保存在“溢出”存儲器位SM1.1。如果移位結(jié)果為0,零標(biāo)志位SM1.0置1。
(2)右移位指令
使能輸入有效時,將輸入IN的無符號數(shù)字節(jié)、字或雙字中的各位向右移N位后,將結(jié)果輸出到OUT所指定的存儲單元中,移出位補0,最后一移出位保存在SM1.1。如果移位結(jié)果為0,零標(biāo)志位SM1.0置1。
(3)使ENO = 0的錯誤條件:0006(間接尋址錯誤),SM4.3(運行時間)
|
LAD |
|
|
|
|
STL |
SLB OUT,N SRB OUT,N |
SLW OUT,N SRW OUT,N |
SLD OUT,N SRD OUT,N |
|
操作數(shù)及數(shù)據(jù)類型 |
IN:VB, IB, QB, MB, SB, SMB, LB, AC, 常量。 OUT:VB, IB, QB, MB, SB, SMB, LB, AC。 數(shù)據(jù)類型:字節(jié) |
IN:VW, IW, QW, MW, SW, SMW, LW, T, C, AIW, AC, 常量。 OUT:VW, IW, QW, MW, SW, SMW, LW, T, C, AC。 數(shù)據(jù)類型:字 |
IN:VD, ID, QD, MD, SD, SMD, LD, AC, HC, 常量。 OUT:VD, ID, QD, MD, SD, SMD, LD, AC。 數(shù)據(jù)類型:雙字 |
|
N:VB, IB, QB, MB, SB, SMB, LB, AC, 常量;數(shù)據(jù)類型:字節(jié);數(shù)據(jù)范圍:N≤數(shù)據(jù)類型(B、W、D)對應(yīng)的位數(shù) | |||
|
功能 |
SHL:字節(jié)、字、雙字左移N位;SHR:字節(jié)、字、雙字右移N位 | ||
表5-5 移位指令格式及功能
說明:在STL指令中,若IN和OUT指定的存儲器不同,則須首先使用數(shù)據(jù)傳送指令MOV將IN中的數(shù)據(jù)送入OUT所指定的存儲單元。如:
MOVB IN,OUT
SLB OUT,N
2. 循環(huán)左、右移位指令
循環(huán)移位將移位數(shù)據(jù)存儲單元的首尾相連,同時又與溢出標(biāo)志SM1.1連接,SM1.1用來存放被移出的位。指令格式見表5-6。
(1)循環(huán)左移位指令(ROL)
使能輸入有效時,將IN輸入無符號數(shù)(字節(jié)、字或雙字)循環(huán)左移N位后,將結(jié)果輸出到OUT所指定的存儲單元中,移出的最后一位的數(shù)值送溢出標(biāo)志位SM1.1。當(dāng)需要移位的數(shù)值是零時,零標(biāo)志位SM1.0為1。
(2)循環(huán)右移位指令(ROR)
使能輸入有效時,將IN輸入無符號數(shù)(字節(jié)、字或雙字)循環(huán)右移N位后,將結(jié)果輸出到OUT所指定的存儲單元中,移出的最后一位的數(shù)值送溢出標(biāo)志位SM1.1。當(dāng)需要移位的數(shù)值是零時,零標(biāo)志位SM1.0為1。
(3)移位次數(shù)N≥數(shù)據(jù)類型(B、W、D)時的移位位數(shù)的處理
如果操作數(shù)是字節(jié),當(dāng)移位次數(shù)N≥8時,則在執(zhí)行循環(huán)移位前,先對N進(jìn)行模8操作(N除以8后取余數(shù)),其結(jié)果0-7為實際移動位數(shù)。
如果操作數(shù)是字,當(dāng)移位次數(shù)N≥16時,則在執(zhí)行循環(huán)移位前,先對N進(jìn)行模16操作(N除以16后取余數(shù)),其結(jié)果0-15為實際移動位數(shù)。
如果操作數(shù)是雙字,當(dāng)移位次數(shù)N≥32時,則在執(zhí)行循環(huán)移位前,先對N進(jìn)行模32操作(N除以32后取余數(shù)),其結(jié)果0-31為實際移動位數(shù)。
(4)使ENO = 0的錯誤條件:0006(間接尋址錯誤),SM4.3(運行時間)。
表5-6 循環(huán)左、右移位指令格式及功能
|
LAD |
|
|
|
|
STL |
RLB OUT,N RRB OUT,N |
RLW OUT,N RRW OUT,N |
RLD OUT,N RRD OUT,N |
|
操作數(shù)及數(shù)據(jù)類型 |
IN:VB, IB, QB, MB, SB, SMB, LB, AC, 常量。 OUT:VB, IB, QB, MB, SB, SMB, LB, AC。 數(shù)據(jù)類型:字節(jié) |
IN:VW, IW, QW, MW, SW, SMW, LW, T, C, AIW, AC, 常量。 OUT:VW, IW, QW, MW, SW, SMW, LW, T, C, AC。 數(shù)據(jù)類型:字 |
IN:VD, ID, QD, MD, SD, SMD, LD, AC, HC, 常量。 OUT:VD, ID, QD, MD, SD, SMD, LD, AC。 數(shù)據(jù)類型:雙字 |
|
N:VB, IB, QB, MB, SB, SMB, LB, AC, 常量;數(shù)據(jù)類型:字節(jié)。 | |||
|
功能 |
ROL:字節(jié)、字、雙字循環(huán)左移N位;ROR:字節(jié)、字、雙字循環(huán)右移N位。 | ||
說明:在STL指令中,若IN和OUT指定的存儲器不同,則須首先使用數(shù)據(jù)傳送指令MOV將IN中的數(shù)據(jù)送入OUT所指定的存儲單元。如:MOVB IN,OUT
SLB OUT,N
【例5-4】程序應(yīng)用舉例,將AC0中的字循環(huán)右移2位,將VW200中的字左移3位。程序及運行結(jié)果如圖5-4所示。

圖5-4 例5-4題圖
【例5-5】用I0.0控制接在Q0.0~Q0.7上的8個彩燈循環(huán)移位,從左到右以0.5s的速度依次點亮,保持任意時刻只有一個指示燈亮,到達(dá)最右端后,再從左到右依次點亮。
分析:8個彩燈循環(huán)移位控制,可以用字節(jié)的循環(huán)移位指令。根據(jù)控制要求,首先應(yīng)置彩燈的初始狀態(tài)為QB0=1,即左邊第一盞燈亮;接著燈從左到右以0.5s的速度依次點亮,即要求字節(jié)QB0中的“1”用循環(huán)左移位指令每0.5s移動一位,因此須在ROL-B指令的EN端接一個0.5s的移位脈沖(可用定時器指令實現(xiàn))。梯形圖程序和語句表程序如圖5-5所示。


圖5-5 例5-5題圖
LD SM0.1 //首次掃描時
MOVB 1, QB0 //置8位彩燈初態(tài)
LD I0.0 //T37產(chǎn)生周期為
AN T37 0.5s的移位脈沖
TON T37, +5
LD T37 //每來一個脈沖
RLB QB0, 1 彩燈循環(huán)左移1位
3. 移位寄存器指令(SHRB)
移位寄存器指令是可以指定移位寄存器的長度和移位方向的移位指令。其指令格式如圖5-6所示。
說明:(1)移位寄存器指令SHRB將DATA數(shù)值移入移位寄存器。梯形圖中,EN為使能輸入端,連接移位脈沖信號,每次使能有效時,整個移位寄存器移動1位。DATA為數(shù)據(jù)輸入端,連接移入移位寄存器的二進(jìn)制數(shù)值,執(zhí)行指令時將該位的值移入寄存器。S_BIT指定移位寄存器的最低位。N指定移位寄存器的長度和移位方向,移位寄存器的最大長度為64位,N為正值表示左移位,輸入數(shù)據(jù)(DATA)移入移位寄存器的最低位(S_BIT),并移出移位寄存器的最高位。移出的數(shù)據(jù)被放置在溢出內(nèi)存位(SM1.1)中。N為負(fù)值表示右移位,輸入數(shù)據(jù)移入移位寄存器的最高位中,并移出最低位(S_BIT)。移出的數(shù)據(jù)被放置在溢出內(nèi)存位(SM1.1)中。
(2)DATA和S-BIT的操作數(shù)為I, Q, M, SM, T, C, V, S, L 。數(shù)據(jù)類型為:BOOL變量。N的操作數(shù)為VB, IB, QB, MB, SB, SMB, LB, AC, 常量。數(shù)據(jù)類型為:字節(jié)。
(3)使ENO = 0的錯誤條件:0006(間接地址),0091(操作數(shù)超出范圍),0092(計數(shù)區(qū)錯誤)。
(4)移位指令影響特殊內(nèi)部標(biāo)志位:SM1.1(為移出的位值設(shè)置溢出位)。
【例5-6】移位寄存器應(yīng)用舉例。

程序及運行結(jié)果如圖5-7所示。
溢出位(SM1.1)
S-BIT
I0.1
S-BIT
I0.1
S-BIT
I0.1
溢出位(SM1.1)
溢出位(SM1.1)
溢出位
第一次移位
第一次移位后
第二次移位后
第一次移位前
時序圖
MB10
MB10
MB10
I0.0
I0.1

圖5-7 例5-6梯形圖、語句表、時序圖及運行結(jié)果
【例5-7】用PLC構(gòu)成噴泉的控制。用燈L1~L12分別代表噴泉的12個噴水注。
(1)控制要求:按下起動按鈕后,隔燈閃爍,L1亮0.5秒后滅,接著L2亮0.5秒后滅,接著L3亮0.5秒后滅,接著L4亮0.5秒后滅,接著L5、L9亮0.5秒后滅,接著L6、L10亮0.5秒后滅,接著L7、L11亮0.5秒后滅,接著L8、L12亮0.5秒后滅,L1亮0.5秒后滅,如此循環(huán)下去,直至按下停止按鈕。如圖5-8所示。

圖5-8 噴泉控制示意圖
(2)I/O分配
輸入 輸出
(常開)起動按鈕:I0.0 L1:Q0.0 L5、L9:Q0.4
(常閉)停止按鈕:I0.1 L2:Q0.1 L6、L10:Q0.5
L3:Q0.2 L7、L11:Q0.6
L4:Q0.3 L8、L12:Q0.7
(3)噴泉控制梯形圖
梯形圖程序如圖5-10所示。
分析:應(yīng)用移位寄存器控制,根據(jù)噴泉模擬控制的8位輸出(Q0.0~Q0.7),須指定一個8位的移位寄存器(M10.1~M11.0),移位寄存器的S-BIT位為M10.1,并且移位寄存器的每一位對應(yīng)一個輸出。如圖5-9所示。


圖5-9 移位寄存器的位與輸出對應(yīng)關(guān)系圖
在移位寄存器指令中,EN連接移位脈沖,每來一個脈沖的上升沿,移位寄存器移動一位。移位寄存器應(yīng)0.5s移一位,因此需要設(shè)計一個0.5s產(chǎn)生一個脈沖的脈沖發(fā)生器(由T38構(gòu)成)。
M10.0為數(shù)據(jù)輸入端DATA ,根據(jù)控制要求,每次只有一個輸出,因此只需要在第一個移位脈沖到來時由M10.0送入移位寄存器S-BIT位(M10.1)一個“1”,第二個脈沖至第八

T38構(gòu)成0.5s產(chǎn)生一個機器掃描周期脈沖的脈沖發(fā)生器
8位的移位寄存器
移位寄存器的每一位
對應(yīng)一個輸出

圖5-10 例5-7噴泉模擬控制梯形圖
個脈沖到來時由M10.0送入M10.1的值均為“0”,這在程序中由定時器T37延時0.5s導(dǎo)通一個掃描周期實現(xiàn),第八個脈沖到來時M11.0置位為1,同時通過與T37并聯(lián)的M11.0常開觸點使M10.0置位為1,在第九個脈沖到來時由M10.0送入M10.1的值又為1,如此循環(huán)下去,直至按下停止按鈕。按下常閉停止按鈕(I0.1),其對應(yīng)的常閉觸點接通,觸發(fā)復(fù)位指令,使M10.1~M11.0的8位全部復(fù)位。
















