摘 要:本文介紹了在自由口通信模式下,用計算機讀寫S7-200 PLC存儲區內相鄰的多個字節數據的通信程序設計方法,程序設計中采用了多種可靠性措施。
關鍵詞:PLC 通信 自由口模式
1 引言
使用S7-200的自由口模式與上位計算機通信,其硬件成本低,適應性強,但編程較困難。本文根據自定義的通信規約編制通信程序,實現了上位計算機對各PLC從站存儲器中字節、整數或雙整數數據的讀寫操作。
2 通信規約
通信采用單主站方式,一臺計算機作為主站,多臺PLC作為從站。計算機采用廣播方式主動向所有PLC發送包含從站站址的讀/寫命令幀,每次被計算機指定站址的一臺PLC收到后返回響應幀。
通信波特率為19.2k bit/s,串行數據格式為1位起始位,8位數據位,1位停止位,無奇偶校驗,采用異或校驗方式,校驗碼為除它本身外所有字節的異或值。計算機使用事件驅動方式接收數據;PLC用XMT(發送)指令發送數據,用字符中斷方式接收數據。
[align=center]

圖1 通信幀格式[/align]
圖1是通信幀的格式,用陰影表示數據區。幀起始標志占3個字節,定義為十六進制數BEBEBE。站址是計算機要讀寫的從站的編號。讀命令字節為CCH,寫命令字節為DDH,PLC響應幀中的命令字節與接收到的命令字節相同,寫命令的響應幀沒有“讀取的數據”部分。
除了幀起始標志、讀寫區的首地址和讀寫的數據外,幀中其余各部分均只占一個字節。圖1中當PLC對接收到的一幀數據校驗無誤而且命令字節為CCH或DDH時,響應幀中的“PLC接收正誤標志”為1,否則為0。
命令幀中的讀寫區首地址為PLC內讀寫區域的起始字節地址的數字編碼,PLC接收到命令幀后可以將其作為指針,使用循環指令讀寫計算機指定的連續區域。經作者反復實驗,得到了PLC內部多種存儲區域地址的數字編碼規律。該數字編碼為雙字,高字表示存儲區類型(見表1),低字表示偏移量。根據尋址區域和偏移量就可以得到地址編碼,例如MB3的地址編碼為0200 0003H,它等同于PLC程序中的&MB3,只是表示方式不同而已。在通信幀中使用地址的數字編碼可以簡化PLC的程序。
表1 幾種存儲器區域地址高字編碼
如果PLC接收超時,PLC重新進入接收狀態;如果計算機接收超時,重發3次命令幀,若3次均超時,發出報警信息。
3 PLC通信程序設計
3.1 接收程序和發送程序的設計
PLC作為從站,只有接收到計算機的命令幀后才返回響應幀,不會主動發送數據。
PLC使用多個字符中斷服務程序,順次接收命令幀各部分的內容。在接收幀起始標志的中斷服務程序中,只有接收到連續3個BEH,PLC才認為是一幀的開始,否則重新接收幀起始標志。在接收站地址的中斷服務程序中,將接收到的站址與本站站址相比較,如果相同,繼續接收命令幀其余的字節,否則重新接收幀起始標志。這樣每次只有一臺PLC接收整個命令幀,避免了其余的PLC進行不必要的接收。在接收數據區的中斷服務程序中,通過比較接收到的“數據區字節數”和實際接收到的字節數來判斷數據區接收是否完成。接收完數據區后再接收到一個字節的校驗碼,則一幀接收完成,置發送允許標志位。
主程序檢測到發送允許標志位為1時,進行異或校驗并檢查命令字節,若接收正確,判斷是讀命令還是寫命令。如果是讀命令,將計算機要讀取的數據送入發送緩沖區;如果是寫命令,將計算機提供的數據寫入指定的存儲區地址;最后計算異或校驗碼并將它送入發送緩沖區;組織好發送幀后將它發送出去。
3.2 讀寫PLC存儲區
首先從接收緩沖區中取出讀寫區首地址,存入符號地址為Address的雙字中,用循環程序實現對多個字節的讀寫。讀寫PLC存儲區的語句格式為
MOVB *pFrom, *pTo
計算機讀存儲區時,pFrom指向Address開始的m個字節的連續區域,pTo指向發送緩沖區,循環次數m為要讀取的字節數。寫存儲區時,pFrom指向接收緩沖區中要寫入的n個字節的連續區域,pTo指向Address開始的連續區域,循環次數n是要寫入的字節數。
3.3 接收緩沖區和發送緩沖區
使用XMT指令時每次最多可以發送255個字節。由于PLC不能同時發送和接收數據,為了節省通信程序占用的存儲空間和簡化程序,接收緩沖區和發送緩沖區共用VB100~VB355這片區域。接收數據時,只存儲命令幀中的命令字節及其后的內容。
VB100是XMT指令發送緩沖區的首字節,即要發送的字節數,響應幀從VB101開始存放。對于某一從站來說,幀起始標志和站址都是固定值,可以在PLC首次掃描時將它們送入發送緩沖區。PLC響應幀中的命令字節與接收到的命令字節相同,因此PLC在生成響應幀時,只需生成除幀起始標志、站址和命令字節以外的部分。經分析可知,計算機每次最多可以從PLC讀取247個字節,向PLC寫入244個字節的數據。
4 計算機程序設計
計算機通過PLC響應幀中返回的站址號和命令字節判斷是哪個從站對何種命令作出的響應,并結合PLC接收正誤標志作出相應的處理。
4.1 接收及通信出錯處理
計算機采用串口事件方式接收PLC發出的響應幀。計算機將接收到的每個字節順次放入接收緩沖區(動態字節型數組),通過數據區字節數判斷對響應幀的接收是否結束。
接收完成后,計算機對接收到的數據作異或校驗,如果校驗無誤,命令字節為CCH或DDH,而且PLC接收正誤標志為1,計算機認為接收正確。如果計算機異或校驗判斷接收有誤或PLC返回的接收正誤標志為0,將重發同樣的命令幀,若連續重發3次后均出錯,則提示用戶。
4.2 命令幀的生成
在計算機中命令幀用字節型數組來表示。假設要讀取1號站PLC中MB6開始的3個字節的數據,MB6的地址代碼0200 0006H應放在PLC接收緩沖區的VB107~VB110。根據S7-200的尋址方式,VB107~VB110各字節中的值分別為02H、00H 、00H、06H,PLC接收到的字節從低地址開始存放,所以在計算機中只需將以上4個字節順次存放于命令幀數組即可。本例從VB101開始的讀命令幀為:BE BE BE 01 06 CC 02 00 00 06 03 72(十六進制數),最后一個字節(72H)為異或校驗碼。
4.3 讀寫整數和雙整數的方法
整數占用一個字,雙整數占用連續的兩個字。由于PLC和計算機中整數和雙整數的存儲方式相同,計算機可以把它們分別拆成2個字節和4個字節后發送,亦可將接收到的多字節組合成整數或雙整數。
讀PLC中連續的n個整數時,可以轉換為讀連續的2n個字節,計算機接收到后將每相鄰的2個字節組合成1個整數;同樣的,讀n個雙字可以轉化為讀4n個字節,計算機接收到后將每相鄰的4個字節組合成1個雙整數。
將n個字或雙字寫入PLC時,可將它們拆分成2n個字節或4n個字節,按高字節在前,低字節在后的順序放入發送幀中。拆分操作可用位邏輯運算來實現。例如,欲將256和-1兩個整數寫入PLC的MW6和MW8,首先將它們分別拆分為2個字節01H ,00H和FFH, FFH,設站號為1,則寫命令幀為BE BE BE 01 09 CC 02 00 00 06 01 00 FF FF 7F(十六進制)。
5 實驗及結論
經多次實驗表明,本文介紹的通信程序運行穩定可靠,能滿足工程實用的要求。該程序的通用性好,計算機可以讀寫PLC中的多種存儲區域,可設置讀寫的起始地址和字節數,每次最多可讀寫240多個字節,數據可以按字節、整數和雙整數來讀寫。
通過幀起始標志、PLC接收正誤標志和異或校驗保證了通信的可靠性,接收出錯和超時出錯重發送機制進一步提高了通信的性能。
參考文獻
[1] Siemens AG. S7-200 Programmable Controller System Manual. Nuernberg, 2002
[2] 廖常初. PLC編程及應用. 北京:機械工業出版社,2002年
[3] 范逸之等. 利用Visual Basic實現串并行通信技術. 北京:清華出版社