張瑞卿 胡愛軍 張 超
(華北電力大學機械工程系,河北 保定 071003)
隨著微電子及控制技術的不斷發展,PLC 已逐漸 成為一種智能型、綜合型控制器,由PLC構成的集散控制是現代工業控制的一個重要組成部分。PLC 具有使用簡單方便,故障率低,抗干擾能力強等優點;但同時,數據的計算處理與管理能力較弱,且無法提供良好的人機界面。將計算機與PLC 結合起來,可使兩者優勢互補,充分利用計算機友好的人機界面,實現人機對話和監控功能,并可進行一定的輔助決策,組成高性能價格比的控制系統。實現計算機與PLC 結合的控制系統的關鍵之一是二者之間的通信。
本設計選用三菱FX2N 系列的PLC,以Visual C++6.0 作為開發工具對PLC 通訊主程序進行設計,串口通訊采用ActiveX 控制Microsoft Communication Control 6.0,最后用PLC 編程電纜將PLC 編程口與計算機串口連接進行調試。
串行通信是指外設和計算機間使用一根數據信號線一位一位地傳輸數據,每一位數據都占據一個固定的時間長度。“串行”是指外設與接口電路之間的信息傳送方式,CPU 與接口之間仍按并行方式工作。串行通信的四個重要參數:波特率(衡量通信速度的參數)、奇偶校驗位(一種簡單的檢錯方式)、數據位(衡量通信中實際數據位的參數)和停止位(表示單個數據包的最后一位)[1]。
(1)三菱FX2N 系列通信數據幀格式
FX2N 系列的PLC 與計算機之間的通信采用RS-232C 標準,其傳輸速率一般設為9600 bps,實際傳輸過程還可設其它,比如115200 bps 等。奇偶校驗位采用偶校驗。數據以幀為單位發送和接收。一個多字符幀由起始字元、命令號碼、元件首地址、結束字元、和校驗五部分組成,其中和校驗值是將命令碼STX -ETX 之間的字符的ASCII 碼(十六進制數)相加,取得所得和的最低二位數。STX 和ETX 分別表示該字符幀的起始標志和結束標志[2]。
起始字元(STX):ASCII 碼的起始字元STX 對應的16 進制數位0 ×02。無論命令信息還是回應信息,它們的起始字元均為STX,接收方以此來判知傳輸資料的開始;
命令號碼:為兩位16 進制數。所謂命令號碼是指上位機要求下位機所執行的動作類別,例如要求讀取或寫入單點狀態、寫入或讀取暫存器資料、強制設定、運行、停止等。在回應信息中,下位機會將上位機接收到的命令號碼隨同其它信息一同發送給上位機;
元件首地址:對應要操作的元件的相應的地址。如從D123 單元中讀取數據時,要把它對應的地址:0x10F6 發送給PLC;
元件個數:一次讀取位元件或字元件的數量;
結束字元(ETX):ASCII 碼的結束字元ETX 對應的16 進制數為0 ×03。無論命令信息還是回應信息,它們的結束字元均為ETX,接收方以此來判知此次通訊已結束;
校驗碼(Checksum):校驗碼是將STX -ETX 之間的ASCII 字元的16 進制數值以"LRC(Longitudinal Redundancy Check)"法計算出1 個Byte 長度(兩個16 進制數值00 -FFH)的校驗碼。當下位機接收到信息后,用同樣的方法計算出接收信息的校驗碼,如果兩個校驗碼相同,則說明傳送正確[2]。
(2)三菱FX2N 系列通信命令
FX2N 系列PLC 有4 個通信命令,它們是讀命令(30H)、寫命令(31H)、強制通命令(37H)、強制斷命令(38H)。
(3)三菱FX2N 系列通信控制字符
ENQ(ASCII 代碼05H):計算機向PLC 發送請求;
ACK(ASCII 代碼06H):PLC 對ENQ 的確定回答;
NAK(ASCII 代碼15H):PLC 對ENQ 的否認回答;
STX(ASCII 代碼02H):報文開始;
ETX(ASCII 代碼02H):報文結束。
(4)FX2N 系列設備地址
①讀寫時的軟設備地址
S0 -S7:0000H;X0 -X7:0080H;Y0 -Y7:00A0H;T0 -T7:00C0H;M0 -M7:0100H;C0 -C7:01C0H;D0-D7:1000H
②置位/復位時的軟設備地址
S0 -S7:0000H;X0 -X7:0400H;Y0 -Y7:0500H;T0 -T7:0600H;M0 -M7:0800H;C0 -C7:0E00H;D0-D7:0100H
③傳輸過程
PC 機與FX 系列PLC之間采用應答方式通信,傳輸出錯則組織重發。其傳輸過程如圖1 所示。
PLC 根據PC 機的命令,在每個循環掃描結束處的END 語句后組織自動應答,無需用戶在PLC 一方編寫程序。

系統主要實現PLC 與計算機的通訊,具體主要完成PC 機指令下傳、監測PLC 狀態、接收PLC 信息等功能。系統組成:小型PLC 一臺、RS232 串口、編程電纜、通訊界面。主操作界面在完成系統功能的前提下,力求明了直觀,操作簡單靈活方便。系統以VC++6.0 為平臺,設計的界面如圖2 所示。

本程序設計了四個串口可供選擇,只有在選擇串口之后才可進行“打開串口,關閉串口”的操作,當打開串口以后,就可以對PLC 進行相應的操作了,為了使界面整潔干凈,特別設計了“清空發送區”和“清空接收區”選項,當發送數據和接收數據放滿編輯框時只需點擊這兩個按鈕,數據就會清空。且實現代碼相當簡單,m-sSend.Empty()、m-sReceive.Empty()就可輕松實現這一任務。
PC 機與PLC 的通訊程序流程圖如圖3 所示。

系統通信控制程序采用了MSComm 控件。此控件提供了兩種通信方法:①文件驅動,即用MSComm控件的OnComm 文件捕獲并處理通信事件和錯誤,它是處理串行端口交互作用的一種非常有效的方法;②查詢方式,通過查詢串口屬性來獲得事件和錯誤,實質上還是屬于事件驅動,但在有些情況下顯得更為便捷。MSComm6.0 控件的屬性:①CommPort,設置或返回通信端口號;②Settings,以字符串的形式設置或返回波特率、奇偶校驗、數據位和停止位;③PortOpen,設置或返回通信端口的狀態,也可以打開和關閉端口;④Input,返回和刪除接收緩沖區中的字符;⑤InputMode,設置或返回Input 屬性取回的數據的類型,數據取回的形式為字符串或二進制數據的數組;⑥CommEvent 返回最近的通信事件或錯誤的數字代碼,通信程序設計時可以根據該屬性值執行不同的操作,在運行時為只寫;⑦Output,將字符串寫入發送緩沖區。
MSComm6.0 控件只有一個事件,即Oncomm 事件。在通信時如果發生錯誤或者事件,將會引發Oncomm 事件并且改變其屬性值,通過GetCommEvent()可獲得Oncomm 產生事件或錯誤的代碼。在與PLC進行通信的過程中,使用MSComm6.0 控件可以自動完成PLC 對計算機發送信息的接收,最終實現PC 機對PLC 的狀態檢測。
軟件實現過程:FX2N 系列的PLC 與計算機之間的通信采用RS-232C 標準,其傳輸速率固定為9600 bps,奇偶校驗位采用偶校驗。數據以幀為單位發送和接收。PC 機向PLC 中寫數據時首先需對串口進行初始化,并對波特率、校驗位等進行設置,然后根據通信協議對PLC 進行相應的讀寫、復位、置位等操作,PLC根據PC 機送來的控制字進行相應的操作。數據發送,采用專用發送指令XMT TABLE,CommPort,其中TABLE 為發送緩沖區的首地址,首地址中保存要發送的字節數,即數據長度,最大為255,其后的地址中保存要發送的數據,CommPort 指定用于發送的端口。對于數據接收,使用接收指令RCV TABLE,CommPort,接收指令激活初始化或結束接收信息,通過制定端口接收信息并存儲于數據緩沖區中,數據緩沖區的第一個數據指明了接收的字節數。
將計算機用通訊電纜與PLC 相連后,首先發送請求05H 以后,驗證計算機與PLC 是否可以正常通信,接收區顯示06,表示PLC 對ENQ 的確定回答,即PLC已準備好,可以進行下面的操作,具體如圖4 和圖5。


這里主要對PLC 讀值功能進行驗證。讀操作命令格式如下:
STX -CMD0 -數據段-ETX-SUMH-SUML
在按上述命令格式發送相應的代碼后,就可直接讀取PLC 響應的信息了。響應信息格式如下:
STX-DATA-ETX-SUMH-SUML
圖6 和圖7 分別是對PLC 進行讀值驗證時發送數據和接收數據的顯示。
其中接收數據顯示中的023030033633,是對X 軟地址值(0080H)讀取后接收到的數據。具體算法如下:




故,轉變成兩字節ASCII 代碼SUMLX=33;SUMHX=36。
理論分析和實際操作的結果是一致的,即證明了本設計是準確無誤的。
本文主要使用Visual C++6.0 作為開發工具,通過編寫各個模塊對應的操作程序,最后用通訊電纜將PC 機與三菱PLC 相連進行調試,基本上達到了預期的設計目標,實現了計算機與PLC 的通信功能。
[1]張筠莉,劉書智.Visual C++實踐與提高——串口通信與工程應用篇[M].北京:中國鐵道出版社,2005.
[2]李現勇.Visual C++串口通信技術與工程實踐(第二版)[M].北京:人民郵電出版社,2004.
[3]賀哲榮,石帥軍.流行PLC 實用程序及設計[M].西安:西安電子科技大學出版社,2006.
[4]王力虎,李紅波.PC 控制及接口程序設計實例[M].北京:科學出版社,2004.
[5]王衛兵.PLC 系統通信、擴展與網絡互連技術[M].北京:機械工業出版社,2004.