|
在前兩期的《世紀星月刊》中已經詳細介紹了Modbus的de基ji本ben概gai念nian和he類lei型xing,作zuo為wei工gong業ye控kong製zhi係xi統tong中zhong的de一yi種zhong通tong用yong協xie議yi,為wei很hen多duo儀yi表biao廠chang家jia所suo使shi用yong。有you了le它ta,不bu同tong廠chang商shang生sheng產chan的de控kong製zhi設she備bei可ke以yi連lian成cheng工gong業ye網wang絡luo,進jin行xing集ji中zhong監jian控kong。雖sui然ranModbus有其標準的傳輸格式,但在一些細節方麵,各個廠家所支持的Modbus協議還是有些差別。 過去,在我們為客戶做技術支持時常會發生這樣的情況,由於儀表支持的Modbus協(xie)議(yi)與(yu)我(wo)們(men)軟(ruan)件(jian)所(suo)支(zhi)持(chi)的(de)有(you)一(yi)些(xie)細(xi)微(wei)區(qu)別(bie),就(jiu)會(hui)導(dao)致(zhi)世(shi)紀(ji)星(xing)讀(du)出(chu)的(de)數(shu)據(ju)與(yu)實(shi)際(ji)數(shu)據(ju)不(bu)符(fu)合(he)。要(yao)解(jie)決(jue)這(zhe)個(ge)問(wen)題(ti),就(jiu)必(bi)須(xu)重(zhong)新(xin)定(ding)製(zhi)一(yi)個(ge)驅(qu)動(dong)提(ti)供(gong)給(gei)客(ke)戶(hu)進(jin)行(xing)更(geng)新(xin),這(zhe)樣(yang)一(yi)來(lai),對(dui)於(yu)客(ke)戶(hu)或(huo)者(zhe)對(dui)於(yu)我(wo)們(men)技(ji)術(shu)支(zhi)持(chi)人(ren)員(yuan)都(dou)會(hui)耽(dan)誤(wu)一(yi)定(ding)的(de)時(shi)間(jian),而(er)且(qie),某(mou)些(xie)客(ke)戶(hu)的(de)現(xian)場(chang)沒(mei)有(you)條(tiao)件(jian)上(shang)網(wang)進(jin)行(xing)驅(qu)動(dong)更(geng)新(xin),這(zhe)樣(yang)就(jiu)給(gei)客(ke)戶(hu)造(zao)成(cheng)了(le)更(geng)大(da)的(de)不(bu)便(bian)。 為解決這一問題,我們在總結常遇問題的基礎上,對世紀星中的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驅qu動dong進jin行xing通tong信xin時shi,可ke以yi暫zan時shi不bu設she置zhi初chu始shi化hua字zi,當dang取qu出chu的de數shu據ju與yu實shi際ji的de數shu據ju相xiang差cha較jiao大da時shi,再zai參can考kao這zhe篇pian文wen章zhang進jin行xing調tiao試shi,或huo者zhe可ke直zhi接jie聯lian係xi我wo們men世shi紀ji星xing的de技ji術shu支zhi持chi人ren員yuan幫bang助zhu您nin調tiao試shi。 到此,關於Modbus的內容先暫告一段落,謝謝您的關注。
|