高速計(jì)數(shù)器指令及舉例
1. 高速計(jì)數(shù)器指令
高速計(jì)數(shù)器指令有兩條:高速計(jì)數(shù)器定義指令HDEF、高速計(jì)數(shù)器指令HSC。指令格式如表6-9所示。
(1)高速計(jì)數(shù)器定義指令HDEF。指令指定高速計(jì)數(shù)器(HSCx)的工作模式。工作模式的選擇即選擇了高速計(jì)數(shù)器的輸入脈沖、計(jì)數(shù)方向、復(fù)位和起動(dòng)功能。每個(gè)高速計(jì)數(shù)器只能用一條“高速計(jì)數(shù)器定義”指令。
(2)高速計(jì)數(shù)器指令HSC。根據(jù)高速計(jì)數(shù)器控制位的狀態(tài)和按照HDEF指令指定的工作模式,控制高速計(jì)數(shù)器。參數(shù)N指定高速計(jì)數(shù)器的號(hào)碼。
表6-9 高速計(jì)數(shù)器指令格式
LAD |
|
|
STL |
HDEF HSC,MODE |
HSC N |
功能說(shuō)明 |
高速計(jì)數(shù)器定義指令HDEF |
高速計(jì)數(shù)器指令HSC |
操作數(shù) |
HSC:高速計(jì)數(shù)器的編號(hào),為常量(0~5)數(shù)據(jù)類型:字節(jié) MODE工作模式,為常量(0~11) 數(shù)據(jù)類型:字節(jié) |
N:高速計(jì)數(shù)器的編號(hào),為常量(0~5)數(shù)據(jù)類型:字 |
ENO=0的出錯(cuò)條件 |
SM4.3(運(yùn)行時(shí)間),0003(輸入點(diǎn)沖突), 0004(中斷中的非法指令),000A(HSC重復(fù)定義) |
SM4.3 (運(yùn)行時(shí)間),0001(HSC在HDEF之前),0005(HSC/PLS同時(shí)操作) |
2. 高速計(jì)數(shù)器指令的使用
(1)每個(gè)高速計(jì)數(shù)器都有一個(gè)32位當(dāng)前值和一個(gè)32位預(yù)置值,當(dāng)前值和預(yù)設(shè)值均為帶符號(hào)的整數(shù)值。要設(shè)置高速計(jì)數(shù)器的新當(dāng)前值和新預(yù)置值,必須設(shè)置控制字節(jié)(表6-7),令其第五位和第六位為1,允許更新預(yù)置值和當(dāng)前值,新當(dāng)前值和新預(yù)置值寫入特殊內(nèi)部標(biāo)志位存儲(chǔ)區(qū)。然后執(zhí)行HSC指令,將新數(shù)值傳輸?shù)礁咚儆?jì)數(shù)器。當(dāng)前值和預(yù)置值占用的特殊內(nèi)部標(biāo)志位存儲(chǔ)區(qū)如表6-10所示。
表6-10 HSC0-HSC5當(dāng)前值和預(yù)置值占用的特殊內(nèi)部標(biāo)志位存儲(chǔ)區(qū)
要裝入的數(shù)值 |
HSC0 |
HSC1 |
HSC2 |
HSC3 |
HSC4 |
HSC5 |
新的當(dāng)前值 |
SMD38 |
SMD48 |
SMD58 |
SMD138 |
SMD148 |
SMD158 |
新的預(yù)置值 |
SMD42 |
SMD52 |
SMD62 |
SMD142 |
SMD152 |
SMD162 |
除控制字節(jié)以及新預(yù)設(shè)值和當(dāng)前值保持字節(jié)外,還可以使用數(shù)據(jù)類型HC(高速計(jì)數(shù)器當(dāng)前值)加計(jì)數(shù)器號(hào)碼(0、1、2、3、4或5)讀取每臺(tái)高速計(jì)數(shù)器的當(dāng)前值。因此,讀取操作可直接讀取當(dāng)前值,但只有用上述HSC指令才能執(zhí)行寫入操作。
(2)執(zhí)行HDEF指令之前,必須將高速計(jì)數(shù)器控制字節(jié)的位設(shè)置成需要的狀態(tài),否則將采用默認(rèn)設(shè)置。默認(rèn)設(shè)置為:復(fù)位和起動(dòng)輸入高電平有效,正交計(jì)數(shù)速率選擇4×模式。執(zhí)行HDEF指令后,就不能再改變計(jì)數(shù)器的設(shè)置,除非CPU進(jìn)入停止模式。
(3)執(zhí)行HSC指令時(shí),CPU檢查控制字節(jié)和有關(guān)的當(dāng)前值和預(yù)置值。
3. 高速計(jì)數(shù)器指令的初始化
高速計(jì)數(shù)器指令的初始化的步驟如下:
(1)用首次掃描時(shí)接通一個(gè)掃描周期的特殊內(nèi)部存儲(chǔ)器SM0.1去調(diào)用一個(gè)子程序,完成初始化操作。因?yàn)椴捎昧俗映绦颍陔S后的掃描中,不必再調(diào)用這個(gè)子程序,以減少掃描時(shí)間,使程序結(jié)構(gòu)更好。
(2) 在初始化的子程序中,根據(jù)希望的控制設(shè)置控制字(SMB37、SMB47、SMB137、SMB147、SMB157),如設(shè)置SMB47=16#F8,則為:允許計(jì)數(shù),寫入新當(dāng)前值,寫入新預(yù)置值,更新計(jì)數(shù)方向?yàn)榧佑?jì)數(shù),若為正交計(jì)數(shù)設(shè)為4×,復(fù)位和起動(dòng)設(shè)置為高電平有效。
(3)執(zhí)行HDEF指令,設(shè)置HSC的編號(hào)(0-5),設(shè)置工作模式(0-11)www.zhimadaxue.com。如HSC的編號(hào)設(shè)置為1,工作模式輸入設(shè)置為11,則為既有復(fù)位又有起動(dòng)的正交計(jì)數(shù)工作模式。
(4)用新的當(dāng)前值寫入32位當(dāng)前值寄存器(SMD38,SMD48,SMD58 ,SMD138, SMD148, SMD158)。如寫入0,則清除當(dāng)前值,用指令MOVD 0,SMD48實(shí)現(xiàn)。
(5)用新的預(yù)置值寫入32位預(yù)置值寄存器(SMD42 ,SMD52, SMD62, SMD142 ,SMD152, SMD162)。如執(zhí)行指令MOVD 1000,SMD52,則設(shè)置預(yù)置值為1000。若寫入預(yù)置值為16#00,則高速計(jì)數(shù)器處于不工作狀態(tài)。
(6)為了捕捉當(dāng)前值等于預(yù)置值的事件,將條件CV=PV中斷事件(事件13)與一個(gè)中斷程序相聯(lián)系。
(7)為了捕捉計(jì)數(shù)方向的改變,將方向改變的中斷事件(事件14)與一個(gè)中斷程序相聯(lián)系。
(8)為了捕捉外部復(fù)位,將外部復(fù)位中斷事件(事件15)與一個(gè)中斷程序相聯(lián)系。
(9)執(zhí)行全局中斷允許指令(ENI)允許HSC中斷。
(10)執(zhí)行HSC指令使S7-200對(duì)高速計(jì)數(shù)器進(jìn)行編程。
(11)結(jié)束子程序。
【例6-4】高速計(jì)數(shù)器的應(yīng)用舉例。
(1)主程序
如圖6-11所示,用首次掃描時(shí)接通一個(gè)掃描周期的特殊內(nèi)部存儲(chǔ)器SM0.1去調(diào)用一個(gè)子程序,完成初始化操作。
(2)初始化的子程序
如圖6-12所示,定義HSC1的工作模式為模式11(兩路脈沖輸入的雙相正交計(jì)數(shù),具有復(fù)位和起動(dòng)輸入功能),設(shè)置SMB47=16#F8(允許計(jì)數(shù),更新新當(dāng)前值,更新新預(yù)置值,更新計(jì)數(shù)方向?yàn)榧佑?jì)數(shù),若為正交計(jì)數(shù)設(shè)為4×,復(fù)位和起動(dòng)設(shè)置為高電平有效)。HSC1的當(dāng)前值SMD48清零,預(yù)置值SMD52=50,當(dāng)前值 = 預(yù)設(shè)值,產(chǎn)生中斷(中斷事件13),中斷事件13連接中斷程序INT-0。
(3)中斷程序INT-0,如圖6-13所示。
LD SM0.0
MOVD +0 SMD48 // HSC1的當(dāng)前值清0
MOVB 16#C0 SMB47 //只寫入一個(gè)新當(dāng)前值,
預(yù)置值不變,計(jì)數(shù)方向不變,
HSC1允許計(jì)數(shù)
HSC 1 //執(zhí)行HSC1指令