儀表網(wǎng)手機(jī)版
手機(jī)訪問(wèn)更快捷
儀表網(wǎng)小程序
更多流量 更易傳播
公眾號(hào):ybzhan
隨時(shí)掌握行業(yè)動(dòng)態(tài)
掃碼關(guān)注視頻號(hào)
網(wǎng)絡(luò)課堂 行業(yè)直播
產(chǎn)品推薦:水表|流量計(jì)|壓力變送器|熱電偶|液位計(jì)|冷熱沖擊試驗(yàn)箱|水質(zhì)分析|光譜儀|試驗(yàn)機(jī)|試驗(yàn)箱
同類產(chǎn)品
近期手頭有個(gè)項(xiàng)目,需要用mablab從一款四通道儀表上通過(guò)串口讀取有效的稱重?cái)?shù)據(jù)。
首先,Modbus協(xié)議是一種常見(jiàn)的通信協(xié)議,常用于工業(yè)自動(dòng)化。這里需要用到的是Modbus RTU模式,因?yàn)樗ǔMㄟ^(guò)串口進(jìn)行通信,比如RS-485或RS-232。
從用戶的問(wèn)題來(lái)看,有幾個(gè)關(guān)鍵點(diǎn):
1、使用MATLAB的串口接口。
2、儀表的從機(jī)地址是1。
3、讀取保持寄存器,從11號(hào)開(kāi)始,讀8個(gè)寄存器。
4、每?jī)蓚€(gè)寄存器組成一個(gè)32位有符號(hào)整數(shù),然后就返回四個(gè)這樣的數(shù)值。
首先,我需要知道如何在MATLAB中使用串口。MATLAB有一個(gè)Instrument Control Toolbox,里面有serialport函數(shù)可以用來(lái)配置和操作串口設(shè)備。
接下來(lái)是Modbus協(xié)議的具體實(shí)現(xiàn)部分。因?yàn)?/span>MATLAB可能沒(méi)有內(nèi)置的Modbus庫(kù),所以可能需要自己構(gòu)造Modbus RTU幀。這包括:
·從機(jī)地址:1個(gè)字節(jié)。
·函數(shù)碼:讀保持寄存器(0x03)。
·起始地址:兩個(gè)字節(jié),這里是從11號(hào)開(kāi)始。
·寄存器數(shù)量:一個(gè)字節(jié),這里是8個(gè)。
·CRC校驗(yàn)。
所以Modbus RTU幀的結(jié)構(gòu)大致是:
[設(shè)備地址][功能碼][起始地址高][起始地址低][寄存器數(shù)量][數(shù)據(jù)…][CRC]
在代碼中,我需要構(gòu)造這個(gè)幀,然后通過(guò)串口發(fā)送出去,并等待儀表的響應(yīng)。收到的數(shù)據(jù)需要進(jìn)行解析。
接下來(lái)考慮如何處理接收到的數(shù)據(jù)。Modbus RTU的響應(yīng)結(jié)構(gòu)是:
·設(shè)備地址(1字節(jié))
·功能碼(1字節(jié))
·數(shù)據(jù)部分(2個(gè)字節(jié)每個(gè)寄存器,共8*2=16字節(jié))
·CRC校驗(yàn)(2字節(jié))
所以數(shù)據(jù)部分會(huì)被分割成4組,每?jī)蓚€(gè)字節(jié)組成一個(gè)32位整數(shù)。因?yàn)橛脩粢蟮氖怯蟹?hào)的整數(shù),所以在轉(zhuǎn)換時(shí)需要處理為int32類型。
我還需要注意字節(jié)順序的問(wèn)題。通常情況下,Modbus的數(shù)據(jù)傳輸是使用大端字節(jié)序,即高位在前。但在MATLAB中處理的時(shí)候,可能需要調(diào)整字節(jié)順序。
接下來(lái)我們列出具體的步驟:
1、配置串口:正確的波特率、數(shù)據(jù)位、停止位等參數(shù)。假設(shè)儀表的波特率為9600,8數(shù)據(jù)位,無(wú)奇偶校驗(yàn),1停止位。
2、打開(kāi)串口連接。
3、構(gòu)造Modbus RTU讀取請(qǐng)求幀:
a. 設(shè)備地址:1
b. 功能碼:0x03(十進(jìn)制51)
c. 起始地址:高字節(jié)和低字節(jié)。11的十六進(jìn)制是0x0B,所以高位是0x00,低位是0x0B。
d. 寄存器數(shù)量:8
4、計(jì)算CRC校驗(yàn)。這個(gè)部分可能需要查找Modbus RTU CRC算法,通常是計(jì)算前三個(gè)字節(jié)(設(shè)備地址、功能碼和數(shù)據(jù)字段)的多項(xiàng)式,得到兩個(gè)字節(jié)的校驗(yàn)值。
5、發(fā)送請(qǐng)求幀到串口。
6、等待響應(yīng),并讀取返回的數(shù)據(jù)。
7、解析響應(yīng)幀:
a. 檢查設(shè)備地址和功能碼是否正確。
b. 提取數(shù)據(jù)部分。
8、將16個(gè)字節(jié)分成4組,每組兩個(gè)字節(jié)構(gòu)成一個(gè)32位整數(shù)。需要注意的是,這可能涉及到將兩個(gè)字節(jié)合并成一個(gè)雙字節(jié)值,并轉(zhuǎn)換為有符號(hào)整數(shù)。
在構(gòu)造請(qǐng)求幀的時(shí)候,我需要計(jì)算CRC校驗(yàn)。我記得Modbus RTU的CRC是基于0xFFFF的多項(xiàng)式,使用的是16位的循環(huán)冗余校驗(yàn)碼。所以,需要寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算這個(gè)CRC。
另外,在讀取串口數(shù)據(jù)時(shí),可能會(huì)遇到超時(shí)的問(wèn)題。所以代碼中需要設(shè)置適當(dāng)?shù)牡却龝r(shí)間,并且處理可能的錯(cuò)誤情況,比如沒(méi)有收到足夠的數(shù)據(jù)或者CRC不匹配的情況。
接下來(lái)是具體實(shí)現(xiàn):
1、配置串口:
使用serialport對(duì)象,設(shè)置波特率、字節(jié)大小等參數(shù)。
2、構(gòu)造請(qǐng)求幀:
設(shè)備地址:1(一個(gè)字節(jié))
功能碼:3(十進(jìn)制,對(duì)應(yīng)0x03)
起始地址:高位是0x00,低位是0x0B
寄存器數(shù)量:8
數(shù)據(jù)部分暫時(shí)為空,因?yàn)檎?qǐng)求幀的數(shù)據(jù)字段包含起始地址和寄存器數(shù)量,所以請(qǐng)求的數(shù)據(jù)字段為[0x00, 0x0B, 0x08]。然后計(jì)算CRC校驗(yàn)。
構(gòu)造完整的請(qǐng)求幀應(yīng)該是:
[1 (設(shè)備地址), 3 (功能碼), 0x00, 0x0B, 0x08, CRC_high, CRC_low]
這里需要注意的是,數(shù)據(jù)部分在請(qǐng)求中是包含起始地址和寄存器數(shù)量的,所以數(shù)據(jù)字段是三個(gè)字節(jié):起始高、起始低、寄存器數(shù)。那計(jì)算CRC的時(shí)候,需要包括這些三個(gè)字節(jié)嗎?或者是不是只計(jì)算前兩個(gè)字節(jié)?
不,Modbus RTU中的數(shù)據(jù)部分在請(qǐng)求中包含的是起始地址和寄存器數(shù)量,因此數(shù)據(jù)字段的長(zhǎng)度是2(起始地址)+1(寄存器數(shù)量)=3個(gè)字節(jié)。所以在構(gòu)造請(qǐng)求時(shí),整個(gè)幀的數(shù)據(jù)字段包括這三個(gè)字節(jié)。那計(jì)算CRC的時(shí)候,是否只對(duì)前三個(gè)字節(jié)進(jìn)行校驗(yàn)?
不,實(shí)際上Modbus RTU的CRC是針對(duì)設(shè)備地址、功能碼和數(shù)據(jù)部分的所有字節(jié)進(jìn)行計(jì)算的。所以,在本例中,數(shù)據(jù)部分有3個(gè)字節(jié):起始高(0x00)、起始低(0x0B)和寄存器數(shù)(0x08)。因此,總共有1(設(shè)備地址) + 1(功能碼) +3(數(shù)據(jù)部分)=5個(gè)字節(jié)用于計(jì)算CRC。
然后,我需要編寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算這五個(gè)字節(jié)的多項(xiàng)式生成校驗(yàn)碼。這可能有點(diǎn)復(fù)雜,但網(wǎng)上可以找到Modbus CRC-16算法的實(shí)現(xiàn)方式。
另外,在解析響應(yīng)時(shí),收到的數(shù)據(jù)應(yīng)該包括設(shè)備地址、功能碼、數(shù)據(jù)部分和CRC。首先檢查設(shè)備地址是否為1,功能碼是否正確,然后計(jì)算接收到的數(shù)據(jù)部分是否符合預(yù)期,并驗(yàn)證CRC是否正確。
關(guān)于轉(zhuǎn)換字節(jié)到32位整數(shù)的部分,我需要將每?jī)蓚€(gè)連續(xù)的字節(jié)合并成一個(gè)雙字節(jié)值。需要注意的是,MATLAB中的處理方式可能會(huì)影響符號(hào)的問(wèn)題,因?yàn)閿?shù)據(jù)是以有符號(hào)整數(shù)形式返回。
舉個(gè)例子,假設(shè)收到的數(shù)據(jù)是字節(jié)1和字節(jié)2,那么這個(gè)數(shù)值如何轉(zhuǎn)換?在Modbus中,通常是將高字節(jié)放在前面(大端),所以字節(jié)作為高位,第二個(gè)字節(jié)作為低位。然后將它們組合成一個(gè)16位的無(wú)符號(hào)整數(shù),再轉(zhuǎn)換為有符號(hào)整數(shù)。
比如,如果有兩個(gè)字節(jié):0x12和0xAB,那么合并的結(jié)果是 0x12AB,將其視為有符號(hào)整數(shù),應(yīng)該是43957。
但是在MATLAB中,這可能需要一些處理。因?yàn)樽止?jié)的順序會(huì)影響結(jié)果,所以可能需要將它們轉(zhuǎn)換為一個(gè)雙字節(jié)值,并考慮是否有符號(hào)的問(wèn)題。
另外,在解析數(shù)據(jù)時(shí),我還需要確保數(shù)據(jù)部分確實(shí)返回了8個(gè)寄存器的數(shù)據(jù),也就是16個(gè)字節(jié),這樣可以得到4組兩個(gè)字節(jié),最終組成四個(gè)整數(shù)
相關(guān)產(chǎn)品
免責(zé)聲明
客服熱線: 18758282240(同微信)
加盟熱線: 18758282240(同微信)
媒體合作: 0571-87759945
投訴熱線: 0571-87759942

下載儀表站APP

Ybzhan手機(jī)版

Ybzhan公眾號(hào)

Ybzhan小程序