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