王新,王鳳翔,王燕,郭學亮
(中煤科工集團唐山研究院有限公司,河北 唐山 063012)
工業(yè)自動化程度越來越高,Modbus 串行通信協議以其先進性、開放性、成熟性的特點得到了廣泛應用,當前PLC(可編程邏輯控制器)及組態(tài)軟件都支持此協議。智能儀表作為自動化控制的源頭,支持此協議,將大大降低自動化工程設計人員的開發(fā)難度。
Modbus 協議是定義在OSI 網絡模型第7 層(應用層)的報文發(fā)送協議,它可以在不同類型的總線或網絡上連接的設備之間進行“客戶端/服務器”式的通信,它是主從式的串行通信協議。Modbus 協議利用RS485 或RS232 總線進行數據傳輸,同一條總線上只允許1 臺主機,從機數量從1 臺最多至247 臺,并且從機的地址是唯一的。Modbus 協議由主機發(fā)送命令及從機返回數據組成,有兩種傳輸模式:Modbus-RTU模式及Modbus-ASCII 模式。
數據以數值型式傳輸,其幀格式如下:
主機發(fā)送命令(表1)。
表1
從機返回數據(表2)。
數據以16 進制數值再轉換為ASCII 碼型式傳輸,傳輸為字符‘0’~‘9’及字符‘A’~‘F’(即實際數據為16進制0x30~0x39 及0x41~0x46),其幀格式如下:
表2
表3
表4
主機發(fā)送命令(表3)。
從機返回數據(表4)。
Modbus 數據幀通過RS485 或RS232 總線進行串行通信,數據以字節(jié)型式傳輸,傳輸時低位在前,高位在后,串行通信采用固定波特率進行數據傳輸,常用波特率為2400bps、4800bps、9600bps、19200bps 等,本例中波特率采用最常用的9600bps(即每秒傳輸9600 位,每位傳輸時間約為104.167μs),8 位數據位,無校驗位,1 位停止位,則每個字節(jié)數據為10 位,每秒傳輸960 個字節(jié)。
本例所用的智能儀表主芯片為TI 公司生產的MSP430F5438 超低功耗Flash 型單片機,擁有4 路USCI_A 型模塊可進行UART 串行通信,本例為了同時實現RTU 通信及ASCII 通信,使用USCI_A1 模塊進行RTU 模式編程,USCI_A3 模塊進行ASCII 模式編程,系統(tǒng)主時鐘采用12MHz晶振,其優(yōu)點是通信波特率在(600~19200)bps 范圍內,時鐘分頻為整數,不需要做步進調整,不會產生誤碼。數據接收采用中斷方式,接收完畢后,單片機對接收數據進行處理,判斷是否為本機命令(由從機地址碼區(qū)分),進行校驗驗證數據準確性,數據正確則根據命令返回相應數據,否則丟棄準備下一次接收。
在編程中應當注意以下幾點:
(1)Modbus 的寄存器地址為1~9999,但實際發(fā)送數據為起始地址減1,例如從起始地址1 開始返回數據,則發(fā)送數據為0x00、0x00(ASCII 為0x30、0x30、0x30、0x30)。
(2)Modbus 協議規(guī)定16 位數據采用高字節(jié)優(yōu)先傳輸,以本文的儀表通信為例,主機向地址為1的從機發(fā)送命令讀取起始地址為1 開始連續(xù)2 個寄存器數據,則發(fā)送命令為:
RTU 模 式:0x01 0x03 0x00 0x00 0x00 0x02 0xC4 0x0B(8 字節(jié))
返回數據:0x01 0x03 0x04 0x81 0x0A 0x43 0x34 0xC2 0xEA(9 字節(jié))
返回的四字節(jié)數據為float 型,由于Modbus 協議高字節(jié)先傳輸,所以數據實際為0x4334810A,即為浮點數180.504059。
ASCII 模 式:0x3A 0x30 0x31 0x30 0x33 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x32 0x46 0x41 0x0D 0x0A(17 字節(jié))
返回數據:0x3A 0x30 0x31 0x30 0x33 0x30 0x38 0x38 0x31 0x30 0x41 0x34 0x33 0x33 0x34 0x46 0x32 0x0D 0x0A(19 字節(jié))
返回的8 個字節(jié)數據代表一個float 型數據,數據需先進行16 進制處理為0x81 0x0A 0x43 0x34,再進行高低字節(jié)調換為0x4334810A,即浮點數180.504059。
(3)以上為正常的4 字節(jié)數據處理方式,還有一種數據傳輸方式稱為互換模式,即將存儲器中存儲的4 字節(jié)數據完全按照從最高字節(jié)到最低字節(jié)輸出,例如,內存中的數據為0x0A(最低位)0x81 0x34 0x43(最高位),則輸出為0x43 0x34 0x81 0x0A。某些智能儀表采用此種方式傳輸數據。
(4)Modbus 協議規(guī)定幀與幀之間的時間間隔應>3.5個位周期,數據傳輸位間隔應<1.5 個位周期,以9600bps通信速率為例,則幀間隔應>364.585μs,位間隔<165.25μs。編程時應充分考慮數據處理所占時間,必要時增加延時。
本例中以PC 機為主機,采用Modscan32 這款成熟的Modbus 通信測試軟件進行數據收發(fā),智能儀表作為從機接收PC 機命令,根據命令返回相應數據,PC 機和智能儀表之間通過RS485 總線連接。部分調試界面,見圖1、圖2。
圖2 Modbus-ASCII 通信界面
通過以上調試界面,實現了PC 機和智能儀表之間的modbus 通信,說明單片機嵌入式程序編寫是正確的。
Modbus 協議是工業(yè)控制領域中最通用、最開放的通信協議之一,得到了眾多廠商的支持。通過Modbus 協議,不同廠商的設備可以方便地連成工業(yè)網絡,進行相互通信。Modbus 的兩種傳輸模式相比,ASCII 方式更直觀,但傳輸相同數據需要的字節(jié)數更多,效率低;RTU 模式傳輸字節(jié)數少,效率更高,更適用于測控系統(tǒng)中數據的實時傳輸。