薛春陽,尤麗靜,陳炳秋,冀衛杰
(北京和利時系統集成有限公司,北京 100176)
Modbus RTU 作為一種開放高效的通信協議在眾多工業領域中的智能控制器以及智能儀表上已經得到了廣泛的應用,它成功解決了現場智能控制器以及工業儀表與PLC 之間數據交換的問題,這樣不僅節省了傳統的大量通信電纜,而且其數據傳輸可靠性也得到了大幅度提升[1]。隨著科技的不斷發展和進步,工業以太網以其低成本、高效率及一網到底的便捷性,正在逐步取代傳統工業總線,在工業自動化控制領域得到了迅速推廣和普及[2]。西門子ET200SP CM PtP 正是以太網結構下的串口通信模塊,相比傳統總線結構下的串口通信模塊,CM PtP的實現方法和資料還比較少,編程方法仍停留在基礎功能塊上,不滿足PLC 結構化編程理念。
本文結合城市軌道交通地鐵BAS(環境與設備監控系統)機電設備和西門子STEP7 編程環境特點,對西門子ET200SP 串口通信模塊CM PtP 的Modbus RTU 主站通信程序的設計開發進行重點研究,其開發后的程序組織結構規范、清晰、簡明,通用性和可讀性強,更容易被閱讀者理解,有利于對常用功能進行標準化,將難化簡,更適合多人分工合作共同編寫的復雜項目,且易于查錯、修改和調試[3]。
城市軌道交通BAS 是對地鐵建筑物內的環境與空氣條件、通風、給排水、照明、乘客導向、自動扶梯及電梯、屏蔽門、防淹門等建筑設備和系統進行集中監視、控制和管理的系統,以確保設備處于安全、可靠、高效、節能的最佳運行狀態[4]。其中BAS 系統中有很多使用Modbus RTU 通信協議的設備,如隧道風機、空調機組、冷水機組、遠程水表、電保溫等。
在項目實際應用中,Modbus 通信部分相關的硬件配置如圖1所示。
針對上述配置,Modbus 通信程序需設計為面向CM PtP 的通用程序塊,項目中每增加一個CM PtP的硬件,則在程序中增加一次對通用程序塊的調用,調用時只需修改塊的輸入參數,而不必修改其內部程序。
西門子編程環境STEP7 提供了串口通信的基礎程序Modbus_Comm_Load 和Modbus_Master。其中Modbus_Comm 用于設置PtP 參數,例如數據傳輸速率、奇偶校驗和數據流控制,Modbus_Master 用作Modbus 主站指令,與一個或更多的Modbus 從站設備進行通信。
在西門子技術手冊《ET 200MP/ET 200SP 用于S7-300/400 分布式I/O 的PtP 通信指令》中有如下要求:①Modbus_Comm_Load 來完成將用于Modbus通信的每個通信端口的組態。必須為使用的每個端口分配唯一的Modbus_Comm_Load 背景數據塊。②對于該端口,可以使用一個或多個Modbus_Master的實例。但是,所有版本的Modbus_Master 都必須為該端口使用相同的背景數據塊。鑒于西門子手冊的要求,每個PtP 不允許使用多個Modbus_Comm_Load以及不能在同一時間調用多個Modbus_Master,故在程序中設計一個功能塊FB(Sub_ModbusRTU),該FB 以Modbus_Comm_Load 和Modbus_Master 為基礎,能夠完成一次完整的發送查詢信息和接收響應信息的過程,并且通過修改該FB 的輸入參數和觸發條件能夠完成下一次的通信。
在實際應用中,一個PtP 可以和多個對象通信,每個通信對象根據數據量的大小和數據寄存器地址的分布情況,可能需要多次通信才能讀回和寫出全部數據,所以Sub_ModbusRTU 的功能是完成針對某個PtP 的全部通信過程,該過程需要調用一次或多次Modbus_Master 來實現。考慮到程序的通用性,Sub_ModbusRTU 應該是一個模塊化的程序,模塊內部的程序是固定不變的,當用于不同的PtP 時只需要修改輸入參數即可。
在試驗對比梯形圖(LAD)、語句表(STL)、結構化文本(SCL)三種編程語言之后,本文最終選擇了 結構化文本(SCL)。結構化文本(SCL)是用于SIMATIC S7 系列CPU 編程的類PASCAL 高級語言,特別適合復雜算法、數學函數、過程優化、數據和配方管理等編程任務。
Sub_ModbusRTU 作為供編程者直接應用的通用程序,設計目標如下:①該程序要設計和封裝為一個面向對象的子程序,及每個PtP 模塊調用一次,并為其分配一個背景數據塊,當PtP 模塊改變時,僅需修改通信參數即可實現功能。②該程序支持Modbus 協議中的8 個常用的功能碼01,02,03,04,05,06,15,16。③由于PtP 在BAS 系統中作為Modbus RTU 主站使用,所以Sub_ModbusRTU 還要能夠與多個Modbus RTU 從站通信,本次設計為最多帶8 個從站。④Modbus 協議具有問答式的通信特點,其通信過程是由多個問答過程組成的,在對這些過程的調度上,Sub_ModbusRTU 還要設計靈活的觸發方式,即:事件觸發,當前過程完成后,自動觸發下一個通信過程;輪詢方式,通過設置輪詢時間參數,控制通信過程之間的時間間隔。
Sub_ModbusRTU 程序的接口參數設計如下:
輸入參數:
(1)LADDR:INT 型,在STEP7 中組態硬件時產生的CM PtP 模塊的地址。
(2)InPar:ARRAY[0..7,0..5,0..6] OF INT,在程序中以InPar[k,x,y]的形式出現,三位數組類型,其中“k”用來區分接在同一PtP 上的不同從站設備,一個PtP 模塊設計最多帶8 個不同的從站,“x”用來區分同一從站下的不同通信過程,每個從站設計最多6 個不同的通信過程,“y”包含7 個參數,設置方法如下:
InPar[k,x,0]——ModbusRTU 從站ID 號;
InPar[k,x,1]——通訊模式選擇,該參數與西門子提供的Modbus_Master 的輸入參數MODE 一致;
InPar[k,x,2]——Modbus 數據的存儲區域,標準Modbus 地址萬位上數字,例如40001,則取4設置;
InPar[k,x,3]——Modbus 數據起始地址;
InPar[k,x,4]——Modbus 數據長度;
InPar[k,x,5]——目標數據所在的DB 塊編號;
InPar[k,x,6]——目標數據所在的DB 塊內的起始地址。
(3)TimePoll:INT 型;每次通訊過程的輪詢時間(以100 ms 為最小單位)。TimePoll=10 時,表示每隔1000 ms 進行一次通訊;TimePoll=0 時,表示上一次通訊過程結束后觸發本次通訊。
(4)PARITY:校驗方式,0 無校驗,1 奇校驗,2偶校驗。
(5)DataChange:BOOL 型;此變量為True 時,執行寫命令,否則只執行讀命令。
輸出參數:①CommOK,BOOL 型;Modbus 從站通信狀態,正常時為True,不正常時為False;②STATUS:WORD 型,錯誤代碼,該參數與西門子提供的Modbus_Master 的輸出參數STATUS 一致,在調試過程中遇到問題時可從西門子手冊中查找相關信息,判斷故障原因。
Sub_ModbusRTU 程序的流程如圖2所示。

圖2 串口通信程序設計流程Fig.2 Serial communication program design flow chart
本程序核心思路是利用雙重循環依次完成每個從站設備的每個通信過程,外層循環以從站順序號為依據,內層循環以從站內的通信過程順序號為依據。程序從第一個從站的第一個通信過程開始執行,當執行完第一個從站的最后一個通信過程后,接著執行第二個從站的第一個通信過程,依次類推,當執行完最后一個從站的最后一個通信過程后,重新開始第一個從站的第一個通信過程,只要程序被使能,便如此循環下去。
具體的實現方法如下:

本程序的亮點:①將RTU 從站的通信參數存儲在三維數組中,在數組的基礎上充分結合循環的程序結構特點,實現對通信過程的組織調度。程序結構清晰明了,同時也縮減了代碼的體積,使代碼更加優化。②本程序在處理Modbus_Master 不同從站通信過程的時候使用了西門子ANY 指針的方法給Modbus_Master 的DATA_PTR 管腳賦值[5]。該方法可以將Modbus 數據傳送到不同設備的背景DB 塊的指定位置中,省去了數據處理的問題。③利用Modbus_Master 的輸出參數Done 和Error 以及Modbus_Comm_Load 的輸出參數Error 來判斷Modbus每從站的通信狀態,并將錯誤代碼反饋輸出。④程序設置看門狗,用于程序第一次運行和模塊斷電后重新運行以及程序發生故障卡死時保障程序可靠性和穩定性。⑤利用結構化文本SCL 編程,可讀性以及可移植性更強,處理復雜數據更容易。
Sub_ModbusRTU 將Modbus_Master 指令以及Modbus_Comm_Load 指令高效地整合在一起,使其直接作為通用子程序被調用,實現每個PtP 模塊只調用一次就可以實現全部功能。很適合地鐵BAS 這種通信設備數量多和種類多的大型機電項目PLC編程工作,Sub_ModbusRTU 的調用如圖3所示。

圖3 通信程序塊Sub_ModbusRTUFig.3 Communication block Sub ModbusRTU
每個CM PtP 模塊的Sub_ModbusRTU 輸入參數,即InPar 的賦值直接采用在SCL 中編寫初始化功能函數FC1000(Initialize)的方式來實現,輸入參數以每個CM PtP 模塊下每個Modbus 子站的每條讀寫命令為單位編寫設置,每個Modbus RTU 子站最多配置6 條讀寫命令,每條命令有7 個參數信息,分別對應到Sub_ModbusRTU 的輸入參數InPar 中,編制方法簡單清晰,利于修改和調試維護,如圖4所示。
每個CM PtP 模塊調用Sub_ModbusRTU 后集中放到FC1040(Com_Modbus_RTU)中,在地鐵車站中,一個典型的S7-400H 系統中會存在多個CM PtP模塊,因此在實例調用時,會把通信塊集中到一個功能塊,將程序分為功能塊調用和參數初始化設置兩部分,如圖5所示。
本文的設計成果已成功應用在深圳地鐵2 號線三期、深圳地鐵8 號線一期、成都地鐵5 號線、北京地鐵新機場線中,經現場調試驗證,程序運行穩定可靠,通信效果良好。程序Sub_ModbusRTU 是面向通信模塊硬件的通用程序,編程時可根據項目的實際需要靈活調用,其它行業的工控系統也可借鑒使用,具有較大的實際應用價值。