Modbus協議在質量流量計組態軟件中的應用
摘 要:該文根據質量流量計的應用實際,介紹了智能儀表上普遍采用的Modbus通信原理,分析了請求、響應的消息格式,介紹了地址,功能碼,寄存器地址,數據位和校驗碼的組成,并給出了軟件開發中常用的CRC校驗程序和十六進制浮點數轉換程序。
關鍵字:Modbus 通信 協議 RTU 流量計 校驗碼
1 引言
Modbus協議由Modicon公司在1978年發明,是全球第一個真正用于工業現場的總線協議,Modbus具有開放,簡單的重要特性,用戶可以免費、放心地使用Modbus協議,不用交納許可證費,也不會侵犯知識產權。Modbus幀格式簡單、緊湊,用戶使用容易,廠商開發便利。隨著儀表和通信技術的發展,Modbus協議正向網絡化發展,目前其于ModbusTCP/IP的通信正在工業以太網領域得到用戶青睞。Modbus由于得到眾多儀表廠家的支持,在PLC、智能儀表上的成功應用,使其成為工業自動化領域的事實標準。近年來,各儀表廠家紛紛采用該標準,生產支持Modbus協議的產品,如橫河,艾默生,E+H,ABB等,尤其艾默生公司生產的流量儀表除保留HART協議外還向用戶提供了基于Modbus協議的RS485通信接口,以支持遠程通信。我廠是石油化工企業,現場使用的大多是流量式儀表-質量流量計,其中支持Modbus協議占大多數,在生產實踐中,我們根據有關技術文獻,利用高級語言開發了非常實用的流量計組態軟件,具備Modbus的基本功能,可完成標零,校準,修改流量系數,故障診斷等功能,還支持網絡和數據存儲,為儀表的調校和維護提供了快捷方便的工具。
2 Modbus協議
Modbus協議在控制系統和設備之間采用類似短語的格式進行通信,所有發送的信息包均具有相同的格式。Modbus采用主從工作方式:主設備(Host)為智能終端或上位機,從設備(Slave)為多臺遵守Modbus協議的智能儀表或變送器。每臺設備可由用戶設定地址以實現訪問操作,地址范圍為0-247,其中0為廣播地址,所有從設備都可識別但不響應。Modbus要訪問設備中的參數需要用戶確定其參數的位置(地址),即讀取、寫入數據,需要明確該數據存放在哪個寄存器上。Modbus手冊向用戶提供了設備中每個參數的具體位置,用戶通過命令可以進行讀、寫有關“位”信息和“字節”信息。
Modbus協議建立的主設備查詢格式:設備(或廣播)地址、功能代碼、所有要發送的數據、錯誤校驗碼。從設備回應消息也由Modbus協議構成,包括地址、功能代碼、返回的數據和一錯誤檢測域。如果在消息接收過程中發生錯誤,或從設備不能執行其命令,從設備將發回一錯誤消息。
如圖1為主-從設備查詢響應循環。
標準的Modbus協議使用兩種模式進行通信:ASCII和RTU,這兩種模式在報文結構、功能代碼上相同,僅錯誤校驗方法不同。
2.1 ASCII模式
當控制器設為在Modbus網絡上以ASCII(美國標準信息交換代碼)模式通信時,在消息中的每8Bit字節都作為兩個ASCII字符發送,在ASCII模式下,消息均以“:”(十六進制3A)開始,以回車換行(十六進制0D和0A)結束。這種方式的主要優點是字符發送的時間間隔可達到1秒而不產生錯誤,ASCII模式通信要比RTU模式占用更多的空間,但編程、解碼方便,ASCII消息幀格式如下:
字節格式:
1)采用十六進制,ASCII字符0…9,A…F。
2)消息中的每個ASCII字符都是由一個十六進制字符組成。
3)字節中位的組成:1個起始位,7個數據位,1個奇偶校驗位(無校驗則無),1個停止位(有校驗時)或2個停止位(無校驗時)。
4)錯誤校驗域,采用LRC校驗(所有字節進行異或運算形成縱向冗余校驗)
2.2 RTU(RemoteTerminalUnit)模式
當控制器設為在Modbus網絡上以RTU(遠程終端單元)模式通信時,信息是以8位二進制方式傳送的,這種方式的最大好處是
在同等傳輸速率下,可以比ASCII模式傳送較多的信息,該模式在智能儀表、PLC、DCS上普遍采用。
字節格式:
1)采用8位二進制,十六進制數0…9,A…F表示。
2)消息中的每個8位域都是一個兩個十六進制字符組成。
3)字節中位的組成:1個起始位,8個數據位,1個奇偶校驗位(無校驗則無),1個停止位(有校驗時)或2個停止位(無校驗時)。
4)錯誤校驗域,采用CRC(循環冗余校驗)
3 協議幀格式
Modbus消息格式由地址、功能碼、數據段、校驗碼等四部分組成,數據段內容根據主-從之間的關系可包括寄存器起始地址、寄存器數量、字節數、數據位等。主設備向從設備發送的請求稱為主-從幀,由多個信息組成:從設備必須執行的功能代碼,連續的或不連續的寄存器地址,要處理項的數目,域中實際數據等。
例如,如果主設備需從設備中讀取一組保持寄存器的值(功能代碼03),數據域需指定起始寄存器以及要讀取的寄存器數量。如果主設備向從設備的一組寄存器寫入信息(功能代碼10十六進制),數據域則指明要寫的起始寄存器地址以及要寫的寄存器數量,數據域的字節數和要寫入寄存器的數據等。下表是主設備查詢從設備的消息格式:
從設備得到請求后向主設備發送的響應格式:
其中“數據長度”就是“返回數據”域的字節個數,也就是請求消息中的“寄存器數量”乘以2的值。
3.1 地址
幀首的Address地址為智能儀表的輪詢地址,范圍為0-247,一般RS485接口僅支持0-32。這個字節表明僅擁有該地址的從設備返回信息,其他設備不應答,每個設備都要有惟一的地址,返回的信息均以各設備的地址碼開始。
3.2 功能碼
信息幀的功能碼可用兩個字節表示,范圍為1-255,功能碼表示主機要求設備執行的操作種類,如03表示讀保持寄存器數據,05表示修改某個線圈位,16表示修改設備地址等,此外,設備響應主機時,還用功能碼指示設備的工作狀態,用以表示響應是否正常,若出現錯誤,功能碼最高位被置為1。表1是部分常見功能碼的含義。
3.3 數據域
數據域是請求和響應的主要內容,主機向設備請求讀取寄存器內容時,數據域包括寄存器的起始地址以及讀取的寄存器個數。寄存器是設備存放數據的地方,一個寄存器可存儲2字節二進制數據或兩個ASCII字符,寄存器地址為16位,按高位在前低位在后排列,有關寄存器地址可查閱儀表通信手冊。設備回送響應的數據域包括數據長度、實際采集的數據,另外,當設備出現異常時,數據域存放的則是錯誤代碼,根據錯誤代碼軟件可進行報警處理。
3.4 寄存器地址
寄存器地址通常用5位十進制數表示,如20247,30120等,由于Modbus所有信息地址均是以0為起始位置的,第一個寄存器的地址就是0,故其余地址均要減去1,例如:保持寄存器40001的地址就是0000,其中4是表示要對保持寄存器進行操作,20108的寄存器地址就是108-1=107,轉成十六進制就是006B。表2是常見地址的操作類型。
3.5 校驗碼
為避免誤碼保證通信的可靠性,標準的MODBUS協議有兩種數據校驗方法:LRC(縱向冗余校驗)和CRC(循環冗余校驗)。LRC用于ASCII模式的傳輸校驗,校驗范圍是從地址到校驗碼之前的數據,連續異或后得出校驗碼。CRC用于RTU模式的傳輸校驗,采用的是通信領域常用的CRC-16校驗法,CRC長度為2字節,其中低位在前,高位在后,以下給出在VB下CRC校驗碼的生成例子:
在函數的調用參數中:data為要進行校驗的數據序列(自地址到校驗碼之前的數據),crc1為低位,crc2為高位。
PublicSubMake_CRC(data()AsByte,ByValnAsInteger,crc1AsByte,crc2AsByte)
'計算CRC校驗碼
DimcrcAsLong
DimiAsInteger
DimjAsInteger
DimcarryAsInteger
crc=&HFFFF‘初始化
Fori=0Ton–1‘n為要生成CRC校驗碼的數據字節數,即傳來的數組長度
crc=crcXordata(i)
Forj=1To8‘處理每個字節的每一位
crc=crcAnd&H2FFFF
IfcrcAnd&H1Then
carry=1
Else
carry=0
EndIf
crc=Int(crc/2)
Ifcarry<>0Then
crc=crcXor&HA001
EndIf
Nextj
Nexti
crc=crcAnd&H4FFFF
crc=crcAnd&H2FFFF
crc1=crcAnd&HFF‘取得CRC碼低位
crc2=(crcAnd&HFF00)/256‘取得CRC碼高位
EndSub
4 常見讀寫操作
4.1 讀保持寄存器
實時采集和監控主要涉及讀寄存器操作,如要采集流量計的瞬時流量,經查詢艾默生質量流量計通信手冊,得儀表中瞬時量的寄存器地址為20247-20248,共占用兩個寄存器。地址的第一個數字2代表需使用功能碼3進行讀操作,將寄存器的地址減去1,即20247-20248要改為20246-20247,在請求消息中寄存器實際首地址用246(十六進制F6)表示,本例設儀表站地址為1,則發送的請求幀為:
將上面8個16進制數,發到儀表上,就可從串口收到下列數據(可用“串口精靈”工具軟件進行試驗):
返回的數據EB8542FB為4字節IEEE754格式浮點數,其結構為:1位符號位,8位指數位,23位尾數位,對此需進行規格化處理,得到儀表值為125.96。將4字節十六進制浮點數化為十進制數的子程序代碼如下:
‘dat()數組中存放4字節待轉化的十六進制數,函數返回十進制數。如將上面返回的數據進行轉換,需賦值:dat(0)=&HEB,dat(1)=&H85,dat(2)=&H42,dat(3)=&HFB。
PrivateFunctionIEEE2float(dat()AsByte)Assingle
DimaAsSingle
DimbAsSingle
a=(dat(1)+dat(0)*256+(dat(3)And127)*65536)/8388608+1
b=((dat(2)And&H7F)*256+(dat(3)And&H80))/128-127
Ifa=1.25Andb=128Thenieee2float=0
Ifa<>1.25Andb<>128Then
IEEE2float=a*(2^b)
EndIf
Ifdat(2)And128Then
IEEE2float=-IEEE2float‘符號位為1則為負數
EndIf
EndFunction
4.2 寫保持寄存器
在實際工作中除讀寄存器外,有時還需改動儀表參數,進行寫寄存器操作。如要將從設備的輪詢地址(PollAddress)改為4,4為整數占用兩個字節,需用一個寄存器,經查其寄存器的起始地址為40047,4表示對保持寄存器操作,寫操作的功能號為16,寄存器地址減去1為46(十六進制2E),則向從設備發送如下命令,則可完成將從設備的地址改成4的操作,其發送消息格式如下:
4.3 程序設計
在軟件開發過程中,考慮到現有組態軟件大多支持VB腳本程序,采用了VisualBasic6。0程序設計語言,其中通信模塊利用Mscomm32。ocx控件實現,由于支持的屬性和方法較多,編程方便,被用戶普遍采用。主程序主要由串口初始化,設置波特率,發送請求,等待響應,處理串口數據等模塊組成。在編程中需注意因ModbusRTU是基于二進制的,發送和返回消息中都包含了大于127的編碼,故需設置Mscomm的屬性為二進制,即在程序中設置:MSComm1。InputMode=comInputModeBinary。
5 結束語
企業ERP、MES的實施,對過程控制層儀表的通信提出了更高的要求,其目的是可連續7×24小時、實時性的采集現場數據,了解工藝狀況,跟蹤產品質量。與此同時,對儀表的監控、維護和管理將更加嚴格,本文討論的流量計組態軟件的使用可減輕儀表技術人員的勞動強度,方便操作和生產,對其他基于Modbus通信協議的設備也有重要參考價值。
參考文獻:
[1] 陽憲惠。現場總線技術及其應用[M]。北京:清華大學出版社,2008。
[2] 李長林。VisualBasic串口通信技術與典型實例[M]。北京:清華大學出版社,2006。
[3] 龔建偉,能光明。VisualC++/TruboC串口通信編程實踐[M]。北京:電子工業出版社,2004。
- 上一篇:基于MODBUS_RTU協議的HK-CMF質量流量計通信軟件 2015/12/31
- 下一篇:HK-CMF質量流量計在液氯充裝上的應用 2015/12/29
