近期手頭有個項目,需要用mablab從一款四通道儀表上通過串口讀取有效的稱重數據。
首先,Modbus協議是一種常見的通信協議,常用于工業自動化。這里需要用到的是Modbus RTU模式,因為它通常通過串口進行通信,比如RS-485或RS-232。
從用戶的問題來看,有幾個關鍵點:
1、使用MATLAB的串口接口。
2、儀表的從機地址是1。
3、讀取保持寄存器,從11號開始,讀8個寄存器。
4、每兩個寄存器組成一個32位有符號整數,然后就返回四個這樣的數值。
首先,我需要知道如何在MATLAB中使用串口。MATLAB有一個Instrument Control Toolbox,里面有serialport函數可以用來配置和操作串口設備。
接下來是Modbus協議的具體實現部分。因為MATLAB可能沒有內置的Modbus庫,所以可能需要自己構造Modbus RTU幀。這包括:
·從機地址:1個字節。
·函數碼:讀保持寄存器(0x03)。
·起始地址:兩個字節,這里是從11號開始。
·寄存器數量:一個字節,這里是8個。
·CRC校驗。
所以Modbus RTU幀的結構大致是:
[設備地址][功能碼][起始地址高][起始地址低][寄存器數量][數據…][CRC]
在代碼中,我需要構造這個幀,然后通過串口發送出去,并等待儀表的響應。收到的數據需要進行解析。
接下來考慮如何處理接收到的數據。Modbus RTU的響應結構是:
·設備地址(1字節)
·功能碼(1字節)
·數據部分(2個字節每個寄存器,共8*2=16字節)
·CRC校驗(2字節)
所以數據部分會被分割成4組,每兩個字節組成一個32位整數。因為用戶要求的是有符號的整數,所以在轉換時需要處理為int32類型。
我還需要注意字節順序的問題。通常情況下,Modbus的數據傳輸是使用大端字節序,即高位在前。但在MATLAB中處理的時候,可能需要調整字節順序。
接下來我們列出具體的步驟:
1、配置串口:正確的波特率、數據位、停止位等參數。假設儀表的波特率為9600,8數據位,無奇偶校驗,1停止位。
2、打開串口連接。
3、構造Modbus RTU讀取請求幀:
a. 設備地址:1
b. 功能碼:0x03(十進制51)
c. 起始地址:高字節和低字節。11的十六進制是0x0B,所以高位是0x00,低位是0x0B。
d. 寄存器數量:8
4、計算CRC校驗。這個部分可能需要查找Modbus RTU CRC算法,通常是計算前三個字節(設備地址、功能碼和數據字段)的多項式,得到兩個字節的校驗值。
5、發送請求幀到串口。
6、等待響應,并讀取返回的數據。
7、解析響應幀:
a. 檢查設備地址和功能碼是否正確。
b. 提取數據部分。
8、將16個字節分成4組,每組兩個字節構成一個32位整數。需要注意的是,這可能涉及到將兩個字節合并成一個雙字節值,并轉換為有符號整數。
在構造請求幀的時候,我需要計算CRC校驗。我記得Modbus RTU的CRC是基于0xFFFF的多項式,使用的是16位的循環冗余校驗碼。所以,需要寫一個函數來計算這個CRC。
另外,在讀取串口數據時,可能會遇到超時的問題。所以代碼中需要設置適當的等待時間,并且處理可能的錯誤情況,比如沒有收到足夠的數據或者CRC不匹配的情況。
接下來是具體實現:
1、配置串口:
使用serialport對象,設置波特率、字節大小等參數。
2、構造請求幀:
設備地址:1(一個字節)
功能碼:3(十進制,對應0x03)
起始地址:高位是0x00,低位是0x0B
寄存器數量:8
數據部分暫時為空,因為請求幀的數據字段包含起始地址和寄存器數量,所以請求的數據字段為[0x00, 0x0B, 0x08]。然后計算CRC校驗。
構造完整的請求幀應該是:
[1 (設備地址), 3 (功能碼), 0x00, 0x0B, 0x08, CRC_high, CRC_low]
這里需要注意的是,數據部分在請求中是包含起始地址和寄存器數量的,所以數據字段是三個字節:起始高、起始低、寄存器數。那計算CRC的時候,需要包括這些三個字節嗎?或者是不是只計算前兩個字節?
不,Modbus RTU中的數據部分在請求中包含的是起始地址和寄存器數量,因此數據字段的長度是2(起始地址)+1(寄存器數量)=3個字節。所以在構造請求時,整個幀的數據字段包括這三個字節。那計算CRC的時候,是否只對前三個字節進行校驗?
不,實際上Modbus RTU的CRC是針對設備地址、功能碼和數據部分的所有字節進行計算的。所以,在本例中,數據部分有3個字節:起始高(0x00)、起始低(0x0B)和寄存器數(0x08)。因此,總共有1(設備地址) + 1(功能碼) +3(數據部分)=5個字節用于計算CRC。
然后,我需要編寫一個函數來計算這五個字節的多項式生成校驗碼。這可能有點復雜,但網上可以找到Modbus CRC-16算法的實現方式。
另外,在解析響應時,收到的數據應該包括設備地址、功能碼、數據部分和CRC。首先檢查設備地址是否為1,功能碼是否正確,然后計算接收到的數據部分是否符合預期,并驗證CRC是否正確。
關于轉換字節到32位整數的部分,我需要將每兩個連續的字節合并成一個雙字節值。需要注意的是,MATLAB中的處理方式可能會影響符號的問題,因為數據是以有符號整數形式返回。
舉個例子,假設收到的數據是字節1和字節2,那么這個數值如何轉換?在Modbus中,通常是將高字節放在前面(大端),所以字節作為高位,第二個字節作為低位。然后將它們組合成一個16位的無符號整數,再轉換為有符號整數。
比如,如果有兩個字節:0x12和0xAB,那么合并的結果是 0x12AB,將其視為有符號整數,應該是43957。
但是在MATLAB中,這可能需要一些處理。因為字節的順序會影響結果,所以可能需要將它們轉換為一個雙字節值,并考慮是否有符號的問題。
另外,在解析數據時,我還需要確保數據部分確實返回了8個寄存器的數據,也就是16個字節,這樣可以得到4組兩個字節,最終組成四個整數
相關產品
免責聲明
客服熱線: 18358129118
加盟熱線: 18358129118
媒體合作: 0571-87759945
投訴熱線: 0571-87759942

下載儀表站APP

Ybzhan手機版

Ybzhan公眾號

Ybzhan小程序