Modbus 通信協議是 Modicon 公司為使用 PLC 通信而發表 [5] ,該協議廣泛用于工業現場,通過該協議可以完成多控制器之間、不同型號設備之間的數據通信 [6] 。該協議采用主從應答通信,明確規定了主從應答通信行為、設備識別碼、設備驗證碼及標準的報文結構格式,目前是工業電子設備之間常用的連接方式。Modbus 主要有以下 3 種通信方式:以太網的 Modbus TCP、異步串行通信的 Modbus RTU、基于高速令牌傳遞網絡的 Modbus PLUS[7] 。常用的物理接口有 RS232/RS422/RS485、光纖、無線等通信接口 [8-9] 。本文采用異步串行通信,通信接口采用 RS485 的連接。
協議格式是完成不同設備間溝通的橋梁,Smart 700 觸摸屏配套的組態軟件是 WinCC flexible,該軟件內無單片機的驅動。本節研究兩個方面的內容,即 Modbus RTU 數據通信的命令串格式和觸摸屏發出命令的含義。
2.1 Modbus RTU 協議格式
Modbus 通信方式有多種,本文主要采用 Modbus RTU 異步串行通信方式,其數據格式包括:地址碼 + 功能碼 + 數據 + 循環冗余校驗(cycle redundancy check,CRC),各部分含義如表 2所示。
主機對從機的操作有讀數據操作和寫數據操作,完成對特定內存單元的數據進行讀取和預設功能。
主機對從機寫數據操作,如表 3 所示。
主機對從機讀數據操作,如表 4 所示。
單片機接收到這串數據后,根據消息幀數據開始進行 CRC 校驗,判斷數據是否正確,如果判斷數據無誤,則返回信息給主機,應答格式如表 5 所示。
地址碼主要是用來識別同一線路上不同設備的信息號,區別特定對象上的數據身份,其構成可以從 1 到 247 標號。主機發送帶設備地址的消息幀,從機都可以收到信息,但是只有設置了匹配的設備號才能響應。
功能號主要是用來說明該數據幀的用途,從機根據幀信息完成數據的讀取或賦值功能,完成幀數據的動作,常用的功能碼如表 6 所示。
常用的寄存器地址分配有離散量輸入,地址范圍 0X00001 ~ 0X0FFFF,輸出繼電器地址范圍 0X10001 ~ 0X1FFFF,輸 入 寄 存 器 地 址 范 圍 0X30001 ~ 0X3FFFF,輸 出 寄 存 器 地 址 范 圍0X40001 ~ 0X4FFFF。
2.2 Smart 700 觸摸屏 Modbus 指令
Smart 700 IE 1000 觸摸屏的人機交互界面是通過 WinCC flexible 組態編程軟件完成功能界面設計,然后下載到觸摸屏內。本文建立了 Modicon Modbus 標準通信協議驅動,其運行流程如圖 1 所示。系統運行開始,從起始單元進行主動查詢,發送查詢功能碼,如果工控機有預設操作,系統跳轉發送預設參數,完成后繼續發送下一個單元請求查詢命令;如果上位機無預設指令,上位機繼續發送讀取內存單元命令。當上位機獲取到了響應讀取指令,先獲取指令值,且上位機地址指針自加并發送下一幀讀取命令,同時判斷地址指針的范圍,范圍內繼續循環,范圍外重新開始新的一輪請求查詢。當上位機沒有收到響應,在循環周期內繼續請求當前讀取數據,周期外將會從起始地址開始請求。在一個周期內完成所有內存單元的查詢工作,周期循環執行。
Smart 700 IE 1000 觸摸屏與單片機通信采用主從通信模式,上位機 Smart 700 為主機,從機為 STM32 主控板。主機配置有 Modicon Modbus 通信協議驅動程序,上電后系統自動開始運行,上位機 Smart 700 作為主機自動按周期循環發送請求讀取內存數據命令,通過 RS485 通信接口發送到 STM32 單片機。下位機接收到上位機請求命令后,首先進行 CHR 數據校驗,如果校驗錯誤,返回重新查詢接收;如果校驗正確,解析獲取功能碼。如果是讀取命令,單片機按照 Modbus命令格式發送內存單元的數值到上位機;如果接收到的是寫命令,單片機將對本機內存單元進行賦值操作。解析完成讀寫命令后,返回重新查詢接收,循環查詢上位機的請求命令,掉電后自動停止發送,其流程圖如圖 2 所示。
STM32F1X 單片機作為下位機 [10-11] ,主要完成功能包括編寫 Modbus 解析程序、RS485 發送接收程序、傳感器信號檢測、接收及驅動信號發送等。
3.1 CRC 校驗碼的生成
CRC 是檢查通信可靠性的一種方式,Modbus RTU 為了獲取數據的準確性,采用 16 位 CRC對接收數據進行處理。其校驗流程如圖 3 所示。單片機獲取消息幀后,截取總長度的前 n ~ 16位字符串數據,進行累加,獲取結果的低 16 位數據,然后將計算的 CRC 與發送到的 CRC 進行對比,完成數據校驗。
以下為單片機 CRC 校驗的部分腳本程序:
u16 Computes_CRC16(u8 *DAT,u8 L)//指針 DAT 為要校驗數組,L 為組長
{u16ComCRC = 0xffff;u8 i;u8 j;
for (i = 0;i < L;i++)
{ComCRC = ComCRC ^ DAT[i];
for (j = 0;j < 8;j++)
{if (ComCRC & 0x01)
{ComCRC = ComCRC>> 1;ComCRC = ComCRC ^ 0xA001;}
else{ComCRC = ComCRC>> 1;}
}}return(ComCRC);}
3.2 數據的接收
STM32單片機數據接收主要采用串口中斷模式進行數據的接收[12] ,Modbus傳輸數據是固定的數字幀(屏發送請求信息幀如下所示:01 03 9C 40 00 01 AB 8E),先接收數據存入緩沖區 BUFF內,然后對數據進行分析、校驗,將有效的數據提取到運行 BUFF內用于條件判斷及數據提取。
3.3 數據的發送
單片機接收到 Smart 700 觸摸屏的通信請求后,先獲取運行 BUFF 內的數組,提取校驗,數據無誤發送 Modbus 響應數組,發送函數代碼如下所示。
void RS485_TX_DATA(u8 TmpH,u8 TmpL)
{ModTX. Gnm_1[0]= 0x01;//設備號
ModTX. Gnm_1[1]= 0x03;//功能碼
ModTX. Gnm_1[2]= 0x02;//發送字符個數
ModTX. Gnm_1[3]= TmpH;//發送字符高八位
ModTX. Gnm_1[4]= TmpL;//發送字符低八位
DataMsg = ModTX. Gnm_1;//數組指針幅值
RXcrc = Computes_CRC16(DataMsg,5);//開始 CRC 校驗
RS485_Send_Data(ModTX. Gnm_1,7);}//發送一串響應數組
4 STM32 單片機與 Smart 700 觸摸屏的通信測試
系統測試對象是基于水泥灌漿自動控制系統的通信測試,主要包括觸摸屏西門子 Smart 700設備、STM32 為主的主控板和現場壓力傳感器等,實現設備間通信。系統測試分為兩個部分,第一部分是 Smart 700 觸摸屏循環請求獲取內存單元值命令調試,串口反饋數據給觸摸屏;串口調試數據如圖 4 所示。
屏請求數據:01 03 9C 40 00 01 AB 8E,是請求 40000 地址一個數據。
串口響應信息:01 03 02 00 13 F9 89,響應一個數據 19 給 40000 地址。
屏請求數據:01 03 9C 41 00 01 FA 4E,響應格式同上。
屏請求數據:01 03 9C 42 00 01 0A 4E,單片機響應后,繼續請求,地址增加,在預定周期內請求所有輸入寄存器的數據,完成后,程序從起始地址循環發送請求數據。
第二部分是觸摸屏與下發控制命令調試,給串口發送預設值,為單片機測試做準備。如圖 4所示,人機交互界面有按鈕控件,點擊壓力預設按鈕,確認下發后,串口響應后的指令如下:
屏預設數據:01 06 9C 47 00 07 56 4D,其中 01 是設備號,06 是預設功能碼,0x9C、0x47 為寄存器位地址碼,0x07 為系統預設的壓力值,0x56、0x4D 為 CRC 校驗碼。其他控制測試為同樣方法。
最后就是總體功能測試,主要完成主控板與 Smart 700 觸摸屏間的數據通信測試,其測試結果如圖 5 所示。測試方法是主控板通過仿真器與觸摸屏設備進行聯調,觀察接收寄存器數據,該數據為觸摸屏下發的 Modbus 數據幀,然后進行數據的處理、顯示及分析等。
如圖 5 所示,當前顯示實時壓力為 3. 5MPa,運行中觸摸屏請求數據幀格式為:01 03 9C 47 00 01 1A 4F,該指令為屏請求獲取內存地址 40007 單位的值,也就是實測壓力值。
單片機接收到上位機請求數據幀后,按照通信協議,將當前檢測到的實測壓力值按照雙方的通信格式,發送響應幀為:01 03 02 00 23 F9 9D,其中 0x00、0x23 為響應的壓力值,當前壓力傳感器數據(十六進制發送),發送到觸摸屏進行顯示。
觸摸屏的按鈕功能測試,點擊觸摸屏預設壓力下發控制按鈕后,觸摸屏下發命令格式為:01 06 9C 49 00 06 F6 4E,當單片機讀取到該數據幀后,獲取第二位 0x06為功能碼,知道當前操作為預設操作,單片機開始提取數據,獲取到的第四位和第五位的數據為 0x00、0x06,即為觸摸屏下發的預設壓力值。單片機將獲取的數據賦給全局變量,用于程序邏輯控制、計算及顯示等,如圖 5所示,預設壓力為 0. 6 MPa(Set_YaLi = 0x06),其他觸摸屏按鈕功能預設方法一樣,如其中管道長度預設值為 0. 7 m(Set_GuanDao_Long = 0x07),鉆孔預設深度為 0. 5 m(Set_ZuanKong_Long = 0x05)等。
觸摸屏發送請求命令周期是小于 50 ms,觸摸屏控制變量不多,1 s 周期內基本可完成全部內存單元的查詢,通過單片機單位時間內收到的數據可判斷其穩定性。Modbus 通訊方式是標準的信息幀,還帶有 CRC 數據校驗功能,實驗過程數據傳輸穩定,實現了兩者之間的數據通信。
本文分析了 Modbus RTU 的通信規則及 Smart 700 觸摸屏的 Modbus 驅動配置,了解了報文信息的規則,然后結合 STM32 單片機的結構特征,編寫了 Modbus 的數據通信協議,完成了人機界面設計,最后通過實驗測試,實現了單片機與觸摸屏的數據通信,達到了設計的要求。本次實驗可以加大單片機技術在觸摸屏領域的應用,替換傳統可編程控制器與觸摸屏項結合的工業設計模式,減少設備成本,擴展性能強,信號傳輸穩定,可廣泛用于工控領域,具有一定的實際意義,并且該軟件具備二次開發性能,可為同類項目通信提供參考。
參考文獻略