張瑞卿 胡愛軍 張 超
(華北電力大學(xué)機(jī)械工程系,河北 保定 071003)
隨著微電子及控制技術(shù)的不斷發(fā)展,PLC 已逐漸 成為一種智能型、綜合型控制器,由PLC構(gòu)成的集散控制是現(xiàn)代工業(yè)控制的一個(gè)重要組成部分。PLC 具有使用簡單方便,故障率低,抗干擾能力強(qiáng)等優(yōu)點(diǎn);但同時(shí),數(shù)據(jù)的計(jì)算處理與管理能力較弱,且無法提供良好的人機(jī)界面。將計(jì)算機(jī)與PLC 結(jié)合起來,可使兩者優(yōu)勢互補(bǔ),充分利用計(jì)算機(jī)友好的人機(jī)界面,實(shí)現(xiàn)人機(jī)對話和監(jiān)控功能,并可進(jìn)行一定的輔助決策,組成高性能價(jià)格比的控制系統(tǒng)。實(shí)現(xiàn)計(jì)算機(jī)與PLC 結(jié)合的控制系統(tǒng)的關(guān)鍵之一是二者之間的通信。
本設(shè)計(jì)選用三菱FX2N 系列的PLC,以Visual C++6.0 作為開發(fā)工具對PLC 通訊主程序進(jìn)行設(shè)計(jì),串口通訊采用ActiveX 控制Microsoft Communication Control 6.0,最后用PLC 編程電纜將PLC 編程口與計(jì)算機(jī)串口連接進(jìn)行調(diào)試。
串行通信是指外設(shè)和計(jì)算機(jī)間使用一根數(shù)據(jù)信號(hào)線一位一位地傳輸數(shù)據(jù),每一位數(shù)據(jù)都占據(jù)一個(gè)固定的時(shí)間長度?!按小笔侵竿庠O(shè)與接口電路之間的信息傳送方式,CPU 與接口之間仍按并行方式工作。串行通信的四個(gè)重要參數(shù):波特率(衡量通信速度的參數(shù))、奇偶校驗(yàn)位(一種簡單的檢錯(cuò)方式)、數(shù)據(jù)位(衡量通信中實(shí)際數(shù)據(jù)位的參數(shù))和停止位(表示單個(gè)數(shù)據(jù)包的最后一位)[1]。
(1)三菱FX2N 系列通信數(shù)據(jù)幀格式
FX2N 系列的PLC 與計(jì)算機(jī)之間的通信采用RS-232C 標(biāo)準(zhǔn),其傳輸速率一般設(shè)為9600 bps,實(shí)際傳輸過程還可設(shè)其它,比如115200 bps 等。奇偶校驗(yàn)位采用偶校驗(yàn)。數(shù)據(jù)以幀為單位發(fā)送和接收。一個(gè)多字符幀由起始字元、命令號(hào)碼、元件首地址、結(jié)束字元、和校驗(yàn)五部分組成,其中和校驗(yàn)值是將命令碼STX -ETX 之間的字符的ASCII 碼(十六進(jìn)制數(shù))相加,取得所得和的最低二位數(shù)。STX 和ETX 分別表示該字符幀的起始標(biāo)志和結(jié)束標(biāo)志[2]。
起始字元(STX):ASCII 碼的起始字元STX 對應(yīng)的16 進(jìn)制數(shù)位0 ×02。無論命令信息還是回應(yīng)信息,它們的起始字元均為STX,接收方以此來判知傳輸資料的開始;
命令號(hào)碼:為兩位16 進(jìn)制數(shù)。所謂命令號(hào)碼是指上位機(jī)要求下位機(jī)所執(zhí)行的動(dòng)作類別,例如要求讀取或?qū)懭雴吸c(diǎn)狀態(tài)、寫入或讀取暫存器資料、強(qiáng)制設(shè)定、運(yùn)行、停止等。在回應(yīng)信息中,下位機(jī)會(huì)將上位機(jī)接收到的命令號(hào)碼隨同其它信息一同發(fā)送給上位機(jī);
元件首地址:對應(yīng)要操作的元件的相應(yīng)的地址。如從D123 單元中讀取數(shù)據(jù)時(shí),要把它對應(yīng)的地址:0x10F6 發(fā)送給PLC;
元件個(gè)數(shù):一次讀取位元件或字元件的數(shù)量;
結(jié)束字元(ETX):ASCII 碼的結(jié)束字元ETX 對應(yīng)的16 進(jìn)制數(shù)為0 ×03。無論命令信息還是回應(yīng)信息,它們的結(jié)束字元均為ETX,接收方以此來判知此次通訊已結(jié)束;
校驗(yàn)碼(Checksum):校驗(yàn)碼是將STX -ETX 之間的ASCII 字元的16 進(jìn)制數(shù)值以"LRC(Longitudinal Redundancy Check)"法計(jì)算出1 個(gè)Byte 長度(兩個(gè)16 進(jìn)制數(shù)值00 -FFH)的校驗(yàn)碼。當(dāng)下位機(jī)接收到信息后,用同樣的方法計(jì)算出接收信息的校驗(yàn)碼,如果兩個(gè)校驗(yàn)碼相同,則說明傳送正確[2]。
(2)三菱FX2N 系列通信命令
FX2N 系列PLC 有4 個(gè)通信命令,它們是讀命令(30H)、寫命令(31H)、強(qiáng)制通命令(37H)、強(qiáng)制斷命令(38H)。
(3)三菱FX2N 系列通信控制字符
ENQ(ASCII 代碼05H):計(jì)算機(jī)向PLC 發(fā)送請求;
ACK(ASCII 代碼06H):PLC 對ENQ 的確定回答;
NAK(ASCII 代碼15H):PLC 對ENQ 的否認(rèn)回答;
STX(ASCII 代碼02H):報(bào)文開始;
ETX(ASCII 代碼02H):報(bào)文結(jié)束。
(4)FX2N 系列設(shè)備地址
①讀寫時(shí)的軟設(shè)備地址
S0 -S7:0000H;X0 -X7:0080H;Y0 -Y7:00A0H;T0 -T7:00C0H;M0 -M7:0100H;C0 -C7:01C0H;D0-D7:1000H
②置位/復(fù)位時(shí)的軟設(shè)備地址
S0 -S7:0000H;X0 -X7:0400H;Y0 -Y7:0500H;T0 -T7:0600H;M0 -M7:0800H;C0 -C7:0E00H;D0-D7:0100H
③傳輸過程
PC 機(jī)與FX 系列PLC之間采用應(yīng)答方式通信,傳輸出錯(cuò)則組織重發(fā)。其傳輸過程如圖1 所示。
PLC 根據(jù)PC 機(jī)的命令,在每個(gè)循環(huán)掃描結(jié)束處的END 語句后組織自動(dòng)應(yīng)答,無需用戶在PLC 一方編寫程序。
系統(tǒng)主要實(shí)現(xiàn)PLC 與計(jì)算機(jī)的通訊,具體主要完成PC 機(jī)指令下傳、監(jiān)測PLC 狀態(tài)、接收PLC 信息等功能。系統(tǒng)組成:小型PLC 一臺(tái)、RS232 串口、編程電纜、通訊界面。主操作界面在完成系統(tǒng)功能的前提下,力求明了直觀,操作簡單靈活方便。系統(tǒng)以VC++6.0 為平臺(tái),設(shè)計(jì)的界面如圖2 所示。
本程序設(shè)計(jì)了四個(gè)串口可供選擇,只有在選擇串口之后才可進(jìn)行“打開串口,關(guān)閉串口”的操作,當(dāng)打開串口以后,就可以對PLC 進(jìn)行相應(yīng)的操作了,為了使界面整潔干凈,特別設(shè)計(jì)了“清空發(fā)送區(qū)”和“清空接收區(qū)”選項(xiàng),當(dāng)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)放滿編輯框時(shí)只需點(diǎn)擊這兩個(gè)按鈕,數(shù)據(jù)就會(huì)清空。且實(shí)現(xiàn)代碼相當(dāng)簡單,m-sSend.Empty()、m-sReceive.Empty()就可輕松實(shí)現(xiàn)這一任務(wù)。
PC 機(jī)與PLC 的通訊程序流程圖如圖3 所示。
系統(tǒng)通信控制程序采用了MSComm 控件。此控件提供了兩種通信方法:①文件驅(qū)動(dòng),即用MSComm控件的OnComm 文件捕獲并處理通信事件和錯(cuò)誤,它是處理串行端口交互作用的一種非常有效的方法;②查詢方式,通過查詢串口屬性來獲得事件和錯(cuò)誤,實(shí)質(zhì)上還是屬于事件驅(qū)動(dòng),但在有些情況下顯得更為便捷。MSComm6.0 控件的屬性:①CommPort,設(shè)置或返回通信端口號(hào);②Settings,以字符串的形式設(shè)置或返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止位;③PortOpen,設(shè)置或返回通信端口的狀態(tài),也可以打開和關(guān)閉端口;④Input,返回和刪除接收緩沖區(qū)中的字符;⑤InputMode,設(shè)置或返回Input 屬性取回的數(shù)據(jù)的類型,數(shù)據(jù)取回的形式為字符串或二進(jìn)制數(shù)據(jù)的數(shù)組;⑥CommEvent 返回最近的通信事件或錯(cuò)誤的數(shù)字代碼,通信程序設(shè)計(jì)時(shí)可以根據(jù)該屬性值執(zhí)行不同的操作,在運(yùn)行時(shí)為只寫;⑦Output,將字符串寫入發(fā)送緩沖區(qū)。
MSComm6.0 控件只有一個(gè)事件,即Oncomm 事件。在通信時(shí)如果發(fā)生錯(cuò)誤或者事件,將會(huì)引發(fā)Oncomm 事件并且改變其屬性值,通過GetCommEvent()可獲得Oncomm 產(chǎn)生事件或錯(cuò)誤的代碼。在與PLC進(jìn)行通信的過程中,使用MSComm6.0 控件可以自動(dòng)完成PLC 對計(jì)算機(jī)發(fā)送信息的接收,最終實(shí)現(xiàn)PC 機(jī)對PLC 的狀態(tài)檢測。
軟件實(shí)現(xiàn)過程:FX2N 系列的PLC 與計(jì)算機(jī)之間的通信采用RS-232C 標(biāo)準(zhǔn),其傳輸速率固定為9600 bps,奇偶校驗(yàn)位采用偶校驗(yàn)。數(shù)據(jù)以幀為單位發(fā)送和接收。PC 機(jī)向PLC 中寫數(shù)據(jù)時(shí)首先需對串口進(jìn)行初始化,并對波特率、校驗(yàn)位等進(jìn)行設(shè)置,然后根據(jù)通信協(xié)議對PLC 進(jìn)行相應(yīng)的讀寫、復(fù)位、置位等操作,PLC根據(jù)PC 機(jī)送來的控制字進(jìn)行相應(yīng)的操作。數(shù)據(jù)發(fā)送,采用專用發(fā)送指令XMT TABLE,CommPort,其中TABLE 為發(fā)送緩沖區(qū)的首地址,首地址中保存要發(fā)送的字節(jié)數(shù),即數(shù)據(jù)長度,最大為255,其后的地址中保存要發(fā)送的數(shù)據(jù),CommPort 指定用于發(fā)送的端口。對于數(shù)據(jù)接收,使用接收指令RCV TABLE,CommPort,接收指令激活初始化或結(jié)束接收信息,通過制定端口接收信息并存儲(chǔ)于數(shù)據(jù)緩沖區(qū)中,數(shù)據(jù)緩沖區(qū)的第一個(gè)數(shù)據(jù)指明了接收的字節(jié)數(shù)。
將計(jì)算機(jī)用通訊電纜與PLC 相連后,首先發(fā)送請求05H 以后,驗(yàn)證計(jì)算機(jī)與PLC 是否可以正常通信,接收區(qū)顯示06,表示PLC 對ENQ 的確定回答,即PLC已準(zhǔn)備好,可以進(jìn)行下面的操作,具體如圖4 和圖5。
這里主要對PLC 讀值功能進(jìn)行驗(yàn)證。讀操作命令格式如下:
STX -CMD0 -數(shù)據(jù)段-ETX-SUMH-SUML
在按上述命令格式發(fā)送相應(yīng)的代碼后,就可直接讀取PLC 響應(yīng)的信息了。響應(yīng)信息格式如下:
STX-DATA-ETX-SUMH-SUML
圖6 和圖7 分別是對PLC 進(jìn)行讀值驗(yàn)證時(shí)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的顯示。
其中接收數(shù)據(jù)顯示中的023030033633,是對X 軟地址值(0080H)讀取后接收到的數(shù)據(jù)。具體算法如下:
故,轉(zhuǎn)變成兩字節(jié)ASCII 代碼SUMLX=33;SUMHX=36。
理論分析和實(shí)際操作的結(jié)果是一致的,即證明了本設(shè)計(jì)是準(zhǔn)確無誤的。
本文主要使用Visual C++6.0 作為開發(fā)工具,通過編寫各個(gè)模塊對應(yīng)的操作程序,最后用通訊電纜將PC 機(jī)與三菱PLC 相連進(jìn)行調(diào)試,基本上達(dá)到了預(yù)期的設(shè)計(jì)目標(biāo),實(shí)現(xiàn)了計(jì)算機(jī)與PLC 的通信功能。
[1]張?bào)蘩颍瑒?Visual C++實(shí)踐與提高——串口通信與工程應(yīng)用篇[M].北京:中國鐵道出版社,2005.
[2]李現(xiàn)勇.Visual C++串口通信技術(shù)與工程實(shí)踐(第二版)[M].北京:人民郵電出版社,2004.
[3]賀哲榮,石帥軍.流行PLC 實(shí)用程序及設(shè)計(jì)[M].西安:西安電子科技大學(xué)出版社,2006.
[4]王力虎,李紅波.PC 控制及接口程序設(shè)計(jì)實(shí)例[M].北京:科學(xué)出版社,2004.
[5]王衛(wèi)兵.PLC 系統(tǒng)通信、擴(kuò)展與網(wǎng)絡(luò)互連技術(shù)[M].北京:機(jī)械工業(yè)出版社,2004.