令狐釗,楊旭東,陳倫軍
(1.貴州大學機械工程學院,貴州貴陽 550025;2.貴陽永青儀電科技有限公司,貴州貴陽 550025)
編譯型PLC Modbus協議的研究與實現
令狐釗1,2,楊旭東1,陳倫軍1
(1.貴州大學機械工程學院,貴州貴陽 550025;2.貴陽永青儀電科技有限公司,貴州貴陽 550025)
在編譯型PLC的研發過程中,為使PLC的通信具有通用性和開放性,采用了Modbus協議。針對中斷數據收發會占用大量CPU的問題,以及幾種常用PLC通信方式的優缺點,通過對Modbus協議的研究,在ARM技術和操作系統的支持下,結合編譯型PLC的特點,提出了一種中斷組合DMA的數據收發新方法和一種多任務通信方法,實現了一種實時性較好、CPU占用量較少的適合于編譯型PLC串行鏈路上的Modbus服務器通信。測試結果表明了程序的正確性。
Modbus;編譯型PLC;DMA;操作系統
目前國內外的主流PLC為解釋型PLC,原因在于其跨平臺性好,在線編程能力強,但是執行效率低[1],資源占有量大,實時性低,而且PLC新興之處并未形成標準,造成了各品牌PLC自成系統。隨著IEC61131標準和工業場合對實時性要求苛刻等原因,基于IEC標準的編譯型PLC逐漸成為國內外研究課題。在通信方面,各品牌PLC基于自身利益的考慮,基本上都開發有專有通信協議,而面對各種新協議的不斷產生,用戶往往無所適從,擔心會被某些PLC廠商鉗制。Modbus通信協議是Modicon公司推出的一種公開的工業通信協議,該協議得到了施耐德、西門子、三菱、松下等大型PLC廠商支持,同時為各種儀器儀表廣泛支持。基于以上考慮,為使自主研發的編譯型PLC的通信具有通用性和開放性,提供了對Modbus的支持。本文采用STM32F107VC芯片,在實現了RS-485等硬件電路的基礎上,結合編譯型PLC的特點,綜合多任務處理技術,對協議的研究和實現提出了看法和實現方法。
編譯型PLC不同于解釋型PLC,編寫符合編譯型PLC的Modbus通信,首先應熟悉編譯型PLC的特點和Modbus協議。
1.1 編譯型PLC
編譯型PLC,從編譯原理的角度充分體現了與傳統解釋型PLC的不同之處。用戶編寫的程序在上位機上直接編譯,一步到位,不需要下位機再進行解釋。正因其“一次編譯,多次執行”的特點,一方面減輕了PLC本體需要裝載解釋系統的負擔,提高了效率,降低了資源占有量;另一方面增加了PLC軟硬件組合的靈活性。圖1為編譯型PLC梯形圖程序編譯流程。第一次編譯,把用戶梯形圖程序邏輯編譯成標準C文件,以方便與庫文件一起進行GCC調用編譯;第二次編譯,即GCC編譯以生成可執行文件,編譯后便可下載到PLC本體中以運行。其中庫文件一般包括兩部分,一部分是驅動程序,用于讀寫I/O,初始化I/ O等;另一部分是功能庫函數,例如移位、PID等功能函數。若為帶操作系統的PLC,則庫文件中還包括操作系統。本文Modbus協議程序即放置于庫文件中,用戶編寫程序時,調用即可。

圖1 梯形圖程序編譯流程圖
1.2 Modbus協議
Modbus是一種單主站、多從站的請求/應答協議[2-3]。如圖2為通用Modbus幀。PDU為數據單元,包括功能碼和數據兩部分。功能碼用于指示所要執行的操作。數據域包含完成指定操作所需要的附加信息。PDU上加上地址域和差錯校驗構成了ADU,即應用數據單元。地址域用于標識服務器,服務器用于確定數據幀是否是發送給自己的。差錯校驗碼用于確認收發數據的正確性。

圖2 通用Modbus幀
Modbus通信過程是主站發送數據給從站,從站在接收數據后,對接收幀進行處理,處理后若非廣播幀,則進行回復幀構建,并回復給主站。如圖3為Modbus服務器通信流程。服務器通信的實現包括:數據接收和發送、幀前處理后處理、PDU處理。為使程序各部分耦合性降低,以模塊化的方式來實現,模塊之間提供相應接口。RTU模式和ASCII模式因數據流格式不一樣,在數據的接收和發送,以及前后處理都不一樣。但是,它們可以有一樣的PDU處理函數,只需把前處理后的數據統一為RTU的八位二進制格式即可。下文先闡述RTU模式和ASCII模式數據接收和前后處理,然后闡述PDU處理,最后探討多線程下Modbus通信的實現。

圖3 通信流程圖
2.1 RTU模式
數據以報文幀方式發送和接收,如圖4為RTU數據流格式。一幀數據以非空閑幀作為幀頭的標記,3.5個字符作為幀尾標記。

圖4 RTU數據流
2.1.1 數據收發
數據的收發,通常采用中斷方式來實現。該方式優點是配置簡單,缺點是占用CPU過多。ARM最新Cotex系列芯片支持DMA(直接存儲器訪問)。根據RTU傳輸模式的特點,最終采用DMA組合空閑幀中斷、接收中斷的方式,而發送則完全采用DMA發送,具有CPU占用小,速度快的優點。圖5為RTU數據接收程序框圖。
RTU模式以3.5個字符作為幀的結束,作為幀與幀之間標識。其實現算法為:


圖5 RTU數據接收程序框圖
其中:MBbaud為串口波特率。因高速傳輸時隱含著大量中斷管理,從而導致CPU負擔加重,所以在當波特率大于19 200 bit/s時,定時器值設為1.75 ms。
2.1.2 前后處理
前處理的工作是確定數據是否發送給本機,以及進行CRC校驗確認傳輸數據的正確性。確定數據是否發送給本機,通過地址的判斷來確定。后處理的工作是確認是否廣播幀,如果不是則給回復幀加上CRC校驗碼,并把數據移交給DMA。前后處理分別提供兩個函數頭,如下:

2.2 ASCII模式
ASCII模式通信流程和RTU模式類似,不同之處在于報文幀數據流格式。圖6為ASCII數據流格式。

圖6 ASCII數據流
2.2.1 數據收發
ASCII模式以“:”字符標識數據幀的起始,CR(回車符“ ”)和LF(換行符“ ”)作為幀尾標識。如果采用DMA方式來接收,則必須通過查詢標識字符來識別幀頭和幀尾,所以,采用接收中斷的方式比較合理。其實現可采用狀態機的方式,如圖7所示。而對于數據的發送,采用DMA方式發送即可。該模式對定時器要求并不高,協議規定容許有1 s的延時,但為了適應各種場合對實時性的要求,該延時值容許用戶配置。

圖7 ASCII接收狀態機
2.2.2 前后處理
為方便PDU數據處理,在發送前后把數據轉換為八位二進制格式。前處理程序邏輯為:接收之后先對把地址轉換以確認地址是否正確,如果正確則全部轉換,并進行LRC校驗。后處理給要回復幀加上':'字符,然后依次把處理好的數據轉換為字符形式,并添加到回復幀上,然后給回復幀加上轉換后的LRC校驗碼,最后加上“ ”、“ ”字符。前后處理分別提供兩個函數頭,如下:

2.3 PDU處理
PDU處理是通信的目的內容。歸納協議,得圖8,可知其處理過程是根據數據幀的功能碼和數據域的地址信息對數據進行讀寫操作?;诖?,PDU處理要實現三部分內容:數據的讀寫操作;相應功能碼的功能函數;提供給數據處理階段主程序的接口函數。三者的程序邏輯關系是:接口函數根據功能碼查找調用哪個功能函數,功能函數先檢查PDU的讀寫地址和讀寫數量信息,在信息正確的情況下進行讀寫操作,該過程若有錯誤則返回相應異常。

圖8 PDU處理流程
離散輸入點和輸入寄存器只可讀,線圈和保持寄存器可讀且可寫。所以,分別實現四個讀寫函數:讀取離散輸入、讀取輸入寄存器、讀寫線圈、讀寫保持寄存器,而其返回參數是枚舉類型的異常碼。

各功能函數根據PDU信息調用一次或兩次其中的一個讀寫函數,返回參數異常碼。以功能0x17(讀寫多個寄存器功能)為例,定義該功能碼功能函數的函數頭如下,其它功能碼的功能函數頭與其相似,僅函數名不同,如下:
MBException SMBFunc0x17RWHoldings(U8* frame,U16*Len);//0x17功能函數
采用用數組和函數指針的方式來查找并調用功能函數,接口函數和數組定義如下:
MBException SMBPDUProcess(U8*pframe,U16*pLen)//接口函數

本文實現了實現了十一種功能碼,滿足PLC需求。在PDU處理實現的基礎上,組合前后出理,對RTU模式和ASCII模式,將分別構成下面兩個函數。

2.4 多線程下的Modbus通信
傳統PLC是一個大循環掃描,其通信方式有兩種:以中斷的方式執行;非中斷方式執行。中斷的方式是通信數據到達,程序立刻跳轉到中斷中執行,適合于較高速度的通信場合,缺點是占用較多CPU。非中斷方式是把通信邏輯放到掃描程序中,當掃描到了后即執行通信,這種通信方式適合于低速度通信場合,但是在用戶程序量比較大時,延時明顯。本文將提出采用多任務操作系統情況下的第三種方法:把通信單獨做為一個任務來處理,PLC程序采用多任務方式工作,設置通信任務的優先級可以適應對通信任務的中低高速要求。
以RTU模式為例,若采用中斷方式,只需將SMBRTUProcess()組織到定時器中斷中即可;若采用非中斷方式執行,只需將SMBRTUProcess()放到大循環中即可。本文也提出的第三種方式的實現方法是在main()函數中新建一個任務用于Modbus通信,該任務執行條件是數據是否到達。其通過在數據接收完時發送數據接收完成信號量給操作系統等待任務調度以實現。其中通信任務的優先級容許用戶配置。本文采用的操作系統是CoOs,程序源碼如下:


表1 異常測試結果
上位機RS-232轉RS-485連接到PLC,利用Modbus poll的CommunicationTraffic顯示往返數據,如下以0x03為例,分別為兩種模式測試值。

分析結果,一方面測試軟件沒顯示錯誤,另一方面,對比往返數據,顯示了數據的正確性。設置通信間隔時間為20 ms,長時間讀寫數據,運行結果表明軟件的正確和可靠性,速度方面也滿足要求。
對異常的測試也是至關重要的。下文僅表述在RTU模式下測試功能碼0x03的部分異常回復。測試結果見表1,表明了異常碼顯示的正確性。
基于Modbus協議在PLC領域的通用性,文章結合編譯型PLC的特點,分析和實現了該協議在串行鏈路上的服務器通信。通過合理利用DMA的方式實現了RTU的串口數據收發,有效釋放了中斷CPU;通過狀態機的方法實現了ASCII模式的數據接收;通過PLC通信方式的總結,結合編譯型PLC的特點提出了基于多任務下的通信實現方法。測試驗證了程序設計的正確性。最終使得自主研發的PLC具有了通用總線的功能,具有很好的實用性和參考價值。
[1]李慧強,程廣河,王茂勵,等.基于ARM的編譯型可編程序控制器系統研究[J].自動化與儀表,2009,24(10):42-44.
[2]GB/T 19582.1-2008.基于Modbus協議的工業自動化網絡規范第1部分:Modbus應用協議[S].
[3]GB/T 19582.2-2008.基于Modbus協議的工業自動化網絡規范第2部分:Modbus協議在串行鏈路上的實現指南[S].
Research and Implementation of Modbus Protocol for Complied PLC
LINGHU Zhao1,2,YANG Xu-dong1,CHEN Lun-jun1
(1.School of Mechanical Engineering,Guizhou University,Guiyang 550025,China;2.Guiyang Yong Qing Yi Dian Ke Ji Co.,Ltd.,Guiyang 550025,China)
In order to make the communication of complied PLC which is researched and implemented to be compatible and open,Modbus protocol is adopted.Aiming at data transmission through interrupt will take up a lot of CPU time,and the advantages and disadvantages of several kinds of PLC communication mode,through the study of Modbus protocol,with the support of ARM technology and RTOS,and according to the characteristics of compiled PLC,a new combinational way of DMA and interrupt,and a effective multitask way is proposed.Finally,a kind of serial link Modbus communication that is higher real-time,lesser CPU occupation,and suitable to complied PLC is implemented.The test results turned out that the correctness of the program.
Modbus;complied PLC;DMA;operating system
TP274
:A
:1009-9492(2014)12-0210-05
10.3969/j.issn.1009-9492.2014.12.054
令狐釗,男,1988年生,貴州人,碩士研究生,工程師。研究領域:測試與數字控制技術。
(編輯:王智圣)
2014-07-17