劉振青,侯文利,姚仲坤
中海石油中國有限公司蓬勃作業公司 天津 300459
德國西門子公司生產的S7-300 可編程序控制器(Programmable Logic Controller,PLC)因具有可靠性高、編程容易、組態靈活、輸入/輸出功能模塊齊全、運行速度快、安裝維護方便、總價格低等特點,已成為工業控制領域常用的一種可編程邏輯控制器。
七段數碼管是S7-300 PLC可直接驅動的硬件,因價格便宜、編程簡單而被廣泛應用,可通過對不同管腳輸入相對應的電流,使數碼管發亮,顯示出數字和相關參數。數碼管指令還可以非常便捷地與定時器指令、計數器指令、加減法指令配合使用,從而顯示倒計時,用于提醒監控人員完成急停、啟動、切換等重要流程轉換[1]。
本文將重點探討基于S7-300 的七段數碼管倒計時的3種實現方案。
七段數碼管裝配7 個發光二極管,用來顯示十進制0~9 的數字外加小數點,也可以顯示英文字母,包括十六進制中的英文A至F,見圖1(a)。根據二級管的控制方式,將七段數碼管分為共陽極、共陰極兩類,見圖1(b),共陽極為8 個發光二極管的共有正極,其他接點為獨立發光二極管的負極,使用者只需把正極接電、不同的負極接地就能控制七段數碼管顯示不同的數字。共陰極的七段數碼管與共陽極接法相反。無論是共陰極還是共陽極,只要數碼管所在的回路導通,對應的數碼管就會被點亮,如在a端加上24 VDC時,a連接的二極管得電,對應的七段數碼管上的a段就會點亮。

圖1 七段數碼管示意圖Fig.1 Schematic diagram of seven-segment digital tube
七段數碼管與S7-300 配合使用時,7 個輸入端分別接在DO卡的輸出通道上,如a、b、c…g 7 個端子分別對應接在Q0.0、Q0.1、Q0.2…Q0.6 上。
當Q0.1、Q0.2 回路導通時,七段數碼管b、c 段點亮,數碼管顯示數字“1”;當Q0.1、Q0.2、Q0.3 回路導通時,七段數碼管a、b、c段點亮,數碼管顯示數字“7”。因此,我們通過控制Q0.0、Q0.1、Q0.2…Q0.6,實現數碼管不同數字的顯示。七段數碼管顯示0 至F字符對應的7 個數碼段,a、b、c…g的回路導通對應關系見圖2,1 為導通,0 為斷開,右側數據為對應的十六進制表示。

圖2 七段數碼管顯示字符與輸入對應關系Fig.2 Corresponding relationship between display characters and input of seven-segment digital tube
分別控制Q0.0、Q0.1……Q0.6 這7 個布爾型變量的輸出,用于顯示不同數字或字符,這一思路過程清晰簡單,但在實際編程過程中分別控制7 個“位”并不容易實現,且出錯的概率非常高,我們需要從S7-300 PLC的存儲單元入手,尋找簡單且高效的解決方案;根據S7-300 PLC的輸出過程映像寄存器規則,邏輯編程可直接控制整個QB0 的字節(1 個字節,8 位),Q0.0 是最低位,Q0.7 是最高位。因此,只需將數值2#00000110(16#06)整體賦值給QB0 字節,對應的七段數碼管即可顯示數字“1”;同理,將數值2#01101111(16#6F)整體賦值給QB0 字節,七段數碼管即可顯示數字“9”。這表明,0 至F字段共16 個顯示字符,對應16種組合,通過控制QB0 字節中的數值,實現控制數碼管的顯示。但圖2 中字符與數值組合并無特定規律,編程的可記憶性和可讀性較差,相關的編程及邏輯識讀均需查看圖2 的表格,極大地降低工作效率,為消除此弊端,我們使用七段數碼管指令FC93 來提升人機交互性[2]。
通過識讀圖2,我們發現16 個顯示字符對應的數值組合無規律可循,為提高程序的可讀性,S7-300 PLC的標準庫中內置了FC93 函數,該函數為七段解碼器函數,輸入為WORD型,輸出為DWORD型。只需要在該函數IN參數內輸入需要顯示的字符,該函數OUT 參數即可輸出七段數碼管所需的二進制組合,對應的數碼管就會正確顯示該字符。如在FC93函數的IN 參數輸入數字“2”,FC93 的OUT 參數即可對應輸出2#00000110(16#06),相應的字符串顯示“2”,此時數碼管也會顯示數字“2”。必須強調的是,A至F字段的顯示不能簡單輸入該字符,而應輸入該字符對應的16 進制數,但本研究為倒計設置,不涉及字符的顯示,因此不對此部分進行講解。
將輸入字符與顯示字符統一成人員可直接讀取并理解的數字和字符能夠極大地提高程序可讀性。因此,FC93 七段解碼器函數在工業實際中應用十分廣泛,特別是用于倒計時的顯示。
單個數碼管可以直觀地展示9~0 的倒計時;2 個數碼管配合邏輯編程可以展示99~0 的倒計時。本論文實現的倒計時均以單個數碼管倒計時10 s為例。
七段數碼管顯示均從“9”開始,每間隔1 s顯示的數字減1,直到顯示字符“0”為止。實現上述功能除了使用FC93 七段解碼器函數外,還必須使用計時功能。S7-300 中可以使用定時器指令或CPU時鐘存儲器,2種方式的編程均十分便捷,定時器指令可直接在指令集中選擇使用;使用CPU時鐘存儲器時,需在配置CPU硬件時激活該功能并定義地址。該地址按字節存取,系統默認的地址為0,即MB0 中存儲,MB0 字節中每個位都對應不同的占空比,如M0.3 周期為0.5 s(其中0.25 s輸出為1,剩余0.25 s輸出為0)、M0.7周期為2 s(其中1 s輸出為1,剩余1 s輸出為0)、M0.5 周期為1 s(其中0.5 s輸出為1,剩余0.5 s輸出為0)。
在本論文講解的七段數碼管倒計時實現方法中,計數器和減法指令這2種倒計時顯示方法均需要利用M0.5 的1 s周期特性。
利用減法指令實現七段數碼管倒計時顯示的S7-300 程序見圖3,僅需4 個程序段即可完成全部邏輯,十分簡單便捷。程序段一中,點擊I0.0 觸點后,邏輯(點動輸入)“開始”執行,程序首次掃描到上升沿時,通過MOVE 指令,為MW10 賦值10,通過置位指令,將M9.0“開始標志”置位為1。程序段二中,當M9.0“開始標志”位閉合后,CPU 時鐘存儲器M0.5 每次出現上升沿時都會觸發減法指令,將MW10 的值減去1,相當于每1 s減1,從而實現關鍵的倒計時功能,MW10 中的數值從10 開始遞減。程序段三中,FC93 函數將MW10 中對應的數據翻譯成對應的二進制組合,該函數的OUT1 對應的數據類型為DWORD,因此,這里填寫的地址為MD16。MD16 包含MB16、MB17、MB18、MB19 4 個字節,MB16 位于高位,MB19 位于低位,將雙字MD16 的低位字節MB19 輸出給QB0 即可實現七段數碼管倒計時顯示。程序段四中,MW10 為0 時,說明計時結束,將M9.0 復位,倒計時邏輯停止。綜上,減法指令和時鐘脈沖觸發器的配合十分簡單地實現了10 s倒計時功能。

圖3 利用減法指令實現倒計時程序Fig.3 Countdown program using subtraction instruction
利用計數器指令實現數碼管倒計時顯示的程序見圖4,該方法與利用減法指令實現過程類似,也需4 個程序段完成全部邏輯。程序段一中,點擊I0.0 觸點,M9.0 置位1,程序開始執行。程序段二中,M9.0位連接計數器C1 的S 參數,C#10 連接C1 的PV 參數,MW10 連接C1 的CV參數,當M9.0 位出現上升沿時,計數器預設置為10,CPU時鐘存儲器M0.5 每次上升沿時都會觸發計數指令減1,MW10 中的值即為倒計時值,當MW10 不為0 時,M2.2 線圈得電,當MW10 為0 時,M2.2 失電。程序段三與利用減法指令實現過程完全相同。程序段四中,當M2.2 出現下降沿,即MW10 為0 時,將M9.0 復位,倒計時邏輯停止。該方法中的計數指令也是S7-300 的基本指令,用該指令和時鐘脈沖觸發器配合,實現10 s倒計時也非常簡單。

圖4 利用計數器指令實現倒計時程序Fig.4 Countdown program using counter instruction
利用定時器指令實現數碼管倒計時需要用到定時器的時間基準。S7-300 的定時器有4種時間基準,時間基準定義時間值以一個單位遞減的間隔實現,包括0.01、0.1、1、10 s 4種,可以通過編程選擇需要的時基,也可系統自動選擇。本論文中的定時器時基均按照系統自動選擇,定時時間小于9.99 s時,默認時基為0.01 s;定時在10~99.9 s 區間時,默認時基為0.1 s;定時在100~999 s區間時,默認時基為1 s;定時在1 000~9 990 s時,默認時基為10 s。我們需要實現10 s的倒計時,因此,系統默認的時基為0.01 s。
S7-200 指令集中有多種定時器指令,且每個定時器指令均有BI和BCD 2種輸出,輸出值為計時剩余時間,BI輸出提供二進制格式的時間值,該輸出值與時基的乘積即為剩余時間;BCD輸出提供BCD格式的時間值,該字后十二位中,每4 位表示一個“十進制的數”,假設高位到低位依次為B、C、D,則上述3 個數組合成的數值BCD與時基的乘積也為剩余時間。用定時器實現數碼管10 s倒計時顯示的關鍵就是將定時器剩余時間中秒的整數值送給數碼管顯示。
3.3.1 利用定時器BI參數實現倒計時顯示
直接用定時器指令BI參數數值除以時基數值的倒數,然后將運算結果送給FC93 函數指令,以實現10 s倒計時的顯示,具體實現的邏輯程序見圖5。在程序段二中,當M9.0 位閉合后,延時導通定時器指令開始計時,該定時器預設的定時時長為10 s,因此,系統默認的時基自動對應0.1 s;MW10 字用于存儲定時器T1 的BI參數的數值;在程序段三中,MW10字存儲的數值除以時基數值的倒數,即MW10 除以10;在程序段四中,當T1 計時10 s完成后,把整個倒計時顯示的邏輯“開始標志”復位。需要注意的是,計時周期不同,時基也會不同,如果實現小于10 s的倒計時,則時間繼電器的時基為0.01 s,此時MW10應除以100。時基的問題不是本論文講解的重點,不再贅述。

圖5 利用定時器BI參數實現倒計時程序Fig.5 Countdown program using timer BI parameters
3.3.2 利用定時器BI參數實現倒計時顯示
用定時器BCD參數實現的七段數碼管倒計時顯示的程序見圖6。在程序段二中,MW10 字存儲定時器T1 的BCD參數的數值;在程序段三中,MB18 字節的數值輸出給QB0。如果實現小于10 s的倒計時,則時間繼電器的時基為0.01 s,此時根據BCD碼的特點,應將MB19 輸出給QB0。關于BCD碼存儲問題,可詳細閱讀S7-300 的幫助手冊。

圖6 利用定時器BCD參數實現倒計時程序Fig.6 Countdown program using timer BCD parameters
利用加減法指令和計數器指令的實現原理類似,編程語句與人的邏輯思維十分相似,直觀易懂,方便后期維護。但由于開始指令的上升沿無法精準地與CPU時鐘存儲器M0.5 的上升沿重合,用上述2種方法實現倒計時第1 s的時間往往小于1 s,具體時長受開始指令發出瞬間M0.5 的狀態影響。
計時器指令可以實現精確的10 s倒計時顯示,且程序編程相對簡單,但程序可讀性較差,后期維護困難;定時周期選取不同,S7-300 默認的時基不同,倒計時顯示邏輯需要做對應參數的修改,程序的通用性不如前兩種方法。
本文闡述了基于S7-300 3種七段數碼管倒計時顯示思路,模塊化地提出了3種倒計時解決方案,可非常方便地用于各種倒計時顯示;同時,在倒計時顯示邏輯的編程過程中,同步對S7-300 PLC的減法指令、計數指令、定時指令、數碼管指令等常用邏輯指令的使用進行分析,也對S7-300 定時器的時基和數據存儲格式的應用進行了演示,極大地拓寬了該系列PLC的編程思路[3]。
在實際工廠應用或模擬教學中,該論文展示的邏輯功能可十分便捷地為應用者提供模塊化的編程邏輯,可為S7-300 PLC和七段數碼管的使用提供系統、全面的編程思路。