在前兩期的《世紀星月刊》中已經詳細介紹了Modbus的基本概念和類型,作為工業控制系統中的一種通用協議,為很多儀表廠家所使用。有了它,不同廠商生產的控制設備可以連成工業網絡,進行集中監控。雖然Modbus有其標準的傳輸格式,但在一些細節方面,各個廠家所支持的Modbus協議還是有些差別。
過去,在我們為客戶做技術支持時常會發生這樣的情況,由于儀表支持的Modbus協議與我們軟件所支持的有一些細微區別,就會導致世紀星讀出的數據與實際數據不符合。要解決這個問題,就必須重新定制一個驅動提供給客戶進行更新,這樣一來,對于客戶或者對于我們技術支持人員都會耽誤一定的時間,而且,某些客戶的現場沒有條件上網進行驅動更新,這樣就給客戶造成了更大的不便。
為解決這一問題,我們在總結常遇問題的基礎上,對世紀星中的Modbus驅動進行了改善,可以通過Modbus設備初始化字設置直接解決以下三個問題:
1)16位整數的字節順序的調整;
2)32位整數(或實數)字順序的調整;
3)寫單個寄存器時所使用功能碼的選擇。

圖1 Modbus設備設置初始化字的格式
如圖1所示,初始化字格式為(XXX),每個X的值為1或者為0,括號為半角符號,當初始化字設置為空時,系統默認為(000)。
第一,16位整數的字節順序的調整:
第一個X:值為0時,表示16位整數傳送時高字節在前,低字節在后;值為1時,表示16位整數傳送時低字節在前,高字節在后。
例:設備傳送的16位整數(即兩個字節):12H 34H。當X值為0時,賦值給變量的數據為1234H(十進制數為4660);當X值為1時,賦值給變量的數據為3412H(十進制數為13330)。
第二,32位整數(或實數)字順序的調整:
第二個X:值為0時,表示32位數據低字在前,高字在后;值為1時,表示32位數據高字在前,低字在后。當讀取的數據為32位的長整型或浮點數時,要搭配第一個X和第二個X配置讀取數據的字節順序。
以長整型為例:
設備傳送的32位整數(即四個字節):12H 34H 56H 78H。
當XX值為00時,賦值給變量的數據為56781234H(十進制數為1450709556);
當XX值為01時,賦值給變量的數據為12345678H(十進制數為305419896);
當XX值為10時,賦值給變量的數據為78563412H(十進制數為2018915346);
當XX值為11時,賦值給變量的數據為34127856H(十進制數為873625686)。
第三,寫單個寄存器時所使用功能碼的選擇:
第三個X:X值為0時,使用06(06H)號功能碼向設備寫入單字整數數據;X值為1時,使用16(10H)號功能碼像設備寫入單字整數數據。
例如:上位機要將設備地址為2,寄存器地址為5的16位寄存器設置為18(12H):
當X值為0時,上位機發送的命令為:02 06 00 05 00 12 19 F5;
第一個字節:02,表示設備地址;
第二個字節:06,為功能碼字節,06號功能碼的作用為預置單個16位寄存器;
第三第四個字節:0005,表示的是上位機發送命令所預置的寄存器的地址;
第五第六個字節:0012H,表示上位機要將地址為5的16位寄存器設置為18(12H);
第七第八個字節:19 F5,為CRC校驗字節。
當X值為1時,上位機發送的命令為:02 10 00 05 00 01 02 00 12 70 D3。
第一個字節:02,表示設備地址;
第二個字節:10H(十進制為16),為功能碼字節;
第三第四個字節:0005,表示的是上位機發送命令所預置的多個寄存器的起始地址為0005H;
第五第六個字節:0001,表示上位機要進行設置的寄存器個數;
第七個字節:02,表示后面跟著的2個字節數據是要預置到指定寄存器中去的;
緊跟在第七個字節后的兩個字節便是要預置到指定寄存器中的數據了;
最后兩個字節:9C08,為CRC校驗字節。
當初始化字為空或者三個X值都為0時,世紀星采用原版的Modbus驅動解析數據的方式進行存取數據。因此用戶在使用Modbus驅動進行通信時,可以暫時不設置初始化字,當取出的數據與實際的數據相差較大時,再參考這篇文章進行調試,或者可直接聯系我們世紀星的技術支持人員幫助您調試。
到此,關于Modbus的內容先暫告一段落,謝謝您的關注。