PLC作為一種高效、靈活、可靠的控制器,已經廣泛地應用在包括數字邏輯控制、運動控制、閉環過程控制、數據處理和聯網通信等工業控制領域。在聯網通信方面,PLC與上位計算機設備一起,可以組成“集中管理、分散控制”的分布式工業控制系統。在這種控制系統中,PLC與上位機的通信對系統整體性能有着較大的影響。面對眾多廠家不同類型的PLC,它們在功能編程上沒有統一的標准而且在通信協議上也是千差萬別,選擇一種即能滿足通信要求又經濟實用的通信協議是非常關鍵的。本文以S7-200PLC為對象,詳細研究了S7-200PLC在自由端口模式下與PC之間的通信方法,並采用.net環境下的C#語言編寫通信程序實現了計算機與PLC之間的通信。這種通信方式硬件投入低,通信協議靈活,可以在多個工業控制領域得到廣泛的應用。
1 S7-200 PLC與上位機的通信方式
S7-200 系列PLC與上位機進行通信主要有以下幾種方式:(1)通過S7-200 PLC的OPC服務器(pc access)作為上位機的OPC服務器, 這種方式只須在OPC服務器中配置相應的測點數據,編程簡單,但通信速率不高,用戶不能自由修改通信協議;(2)利用觸摸屏,這種方式需要根據觸摸屏兼容的通信協議進行選擇,通信可靠性高, 但靈活性差,觸摸屏界面編程功能也不夠強大;(3)利用通用編程軟件實現,這種方法雖然系統開發工作量大,對技術人員的水平和經驗都要求較高,但編程靈活,可以實現比較復雜的功能。本文采用了第三種通信方式,在開發通信軟件時考慮了S7-200 PLC所特有的一種通信方式—自由口通信模式。在自由口模式下用戶可自定義協議,利用串口和PLC的通信口來收發數據,通信功能完全由用戶程序控制,通信任務和信息定義均需由用戶編程實現,通過調用子程序來進行接收中斷、發送中斷、發送指令(XMT)、接收指令(RCV)等通信控制操作。
2 自由口通訊工作模式的定義
在中小規模系統,通信速率要求不是特別高的情況下,S7-200 PLC自帶的編程口可以作為通信口使用。S7-200 PLC編程軟件與PLC進行通信所利用的PPI協議實質也是一種RS-485通信,它可在多種模式下工作,其中自由口通信功能是S7-200 PLC的一個獨特的功能。在自由口通信方式下,S7-200 PLC可以與任何協議公開的設備、控制器進行通信,最高波特率可達38.4kbit/s。一般上位機串行口符合RS-232C標准協議,為了與PLC的RS-485通信則必須進行協議轉換。在PLC編程方面,自由口模式下的通訊協議主要就是自由口通信工作模式控制字的定義以及發送和接受數據指令的格式約定及其參數設置等。
2.2 接收指令(RCV)
RCV(接收指令)從S7-200 PLC的通訊口接收一個或多個數據字節。接收的數據字節保存在接收數據緩沖區中。接收指令完成后,會產生一個中斷事件(對Port0為中斷事件23,對Port1為中斷事件24)。啟動接收指令后,CPU的通訊控制器就處於接收狀態。使用接收指令時需要設置消息起始和結束的判斷條件,通訊控制器用這些條件來判斷消息的開始和結束。當判斷消息結束時接收狀態終止,否則通訊口會一直處在接收狀態。由於S7-200 PLC的自由口通訊是建立在RS-485半雙工通訊的基礎上,接收和發送不能同時進行,接收指令不結束,就不能執行發送指令。對幾個重要的特殊存儲區設置舉例如下:
MOVB 16#EC, SMB87(允許接受,檢測起始字符和結束字符,超時檢測)
MOVB 104, SMB88(發送報文起始字符為h)
MOVB 72, SMB99(結束字符為H)
MOVB +1000, SMB92(接受超時時間為1s)
MOVB 35, SMB94(接受最大字符數為35)
2.3 發送指令(XMT)
XMT 發送指令利用數據緩沖區指定要發送的字符,用於向指定通信口以字節為單位發送一串數據字符,發送命令格式為 XMT TABLE,PORT, 其中TABLE為數據存儲區地址,PORT指定PLC要發送數據的端口。一次最多發送255個字節。XMT 發送指令完成后,會產生一個中斷事件(Port0為中斷事件9,Port1為中斷事件26)也可以監視發送完成狀態位SM4.5和SM4.6的變化來產生XMT中斷。
3 S7-200 PLC 通信程序設計
3.1 通信程序流程
本程序中S7-200 CPU從通訊端口0接收字符串,使用RCV指令和接受完成中斷接受數據,以自定義協議來實現計算機與S7-200PLC之間的數據通信時,為了避免通信中的各方爭用通信線路,一般采用主從方式,即計算機作為主機,向作為從站的S7-200 PLC端口0發送規定格式的報文。
當S7-200 PLC接收到指令后進行相關的數據校驗, 這里采用BBC校驗方式,即將每一幀的第一個字節(不包括起始字符)到該幀中正文校驗碼之前的所有字節作異或運算(本例中是從VB101到VB130),並將校驗碼作為報文一部分發送到計算機。在PLC接收端也要對接收緩沖區的數據進行BBC校驗,然后與指令中的校驗碼比較,如果校驗碼相等則置位M0.0,PLC執行命令並將所接收到的數據反饋給計算機;如果校驗碼不相等, 則置位M0.1並返回帶有校驗碼錯誤的反饋信息,通信流程圖如圖1所示。
圖 1 PLC通信流程圖
3.2 通信幀格式約定
計算機每次發送一個33字節的指令來實現一次讀寫操作。每條指令都包括起始字符、結束字符、目標站地址、目標寄存器地址、要讀寫的字節數、要寫入的數據和校驗碼。S7-200 PLC接收到計算機發送來的數據,先存放在PLC的接收緩沖區,設定以VB100開始。自定義的接收緩沖區的數據設計格式見表1
表 1 PLC接收數據緩沖區
VB100 接收到的字節數
VB101 起始字符
VB102 指令類型(讀/寫)
VB103 VB104 目標站地址
VB105~VB112 目標寄存器地址
VB113 VB114 讀寫字節數
VB115~VB130 要寫入的數據
VB131 VB132 校驗碼
VB133 結束字符
為避免在通信中由於指令中的起始字符或者結束字符與傳輸的數據有重復而導致PLC的誤動作,這里采用文本傳送二進制數據,即通過以16進制的ASCII碼的格式來描述數據,讓每個二進制的字節都表示成一對ASCII編碼的16進制字符。比如48H可表示為34H、38H兩個字節。指令類型自定義為05H代表讀操作,06H代表寫操作。目標寄存器地址采用四個字節表示,前兩個字節表示寄存器類型,后兩個表示寄存器號,例如:VB101的地址可表示為08 00 00 65,其中“08 00”表示V寄存器區,“00 65”表示寄存器號101。目標寄存器地址表示方法如表2所示:
PLC接收上位機的指令后會返回一個21字節的反饋信息。自定義的發送緩沖區的格式如表3所示:
表 3 PLC發送緩沖區格式
VB153 VB154 VB155 VB156~VB171 VB172 VB173 VB174
發送字符數 起始字符 狀態信息 發送數據區 校驗碼 結束字符
其中VB155狀態信息的格式定義為:01H代表讀入正確,02H代表寫入正確,03H代表校驗碼錯誤,04H代表指令不合法。
3.3 主要程序設計
本系統PLC程序設計采用模塊化設計,主要包括主程序、初始化子程序、讀子程序、寫子程序、校驗子程序、接收完成中斷程序和發送完成中斷程序。
主程序負責判斷讀寫條件和調用各個子程序,具體包括判斷PLC運行模式;調用初始化子程序;判斷本機站號、指令類型和校驗碼等是否符合讀寫程序;調用讀、寫子程序;接收數據等。
在初始化子程序中主要設置一些通信參數和RCV接收參數並開啟接收完成中斷0和發送完成中斷1。在讀寫子程序中根據接收到的指令信息讀取目標寄存器數據或者把數據寫入目標寄存器中,並利用XMT發送反饋信息到計算機。讀寫程序如下:
讀子程序:
LD SM0.0
R SM87.7, 1 (禁止接收)
R M0.0 (復位校驗位)
RCV VB100, 0
MOVB 103, VB154 (送返回信息起始字符為g)
MOVB 1, VB155 (狀態信息讀取正確)
HTA *VD135,VB156,16(將要讀取的數據做16進制轉ASCII碼轉換)
MOVB 71, VB174 (結束字符為G)
MOVB 21,VB153 (發送字節數為21個字節)
…… (校驗發送數據)
LD SM4.5(端口0發送空閑時置1)
XMT VB153, 0
寫子程序與讀程序類似,只是要對寫入的數據做ASCII碼轉換:
MOVD &VB115, VD145(裝入要寫的數據源的地址指針)
ATH *VD145, *VD135, VB139(對要寫入的數據做ASCII碼轉16進制轉換)
……
XMT VB153, 0