modbus? 關於modbus RTU的使用說明
http://www.xuan.idv.tw/wordpress/?p=1705
以下為文章的摘要
modbus RTU 為最原始的以二進制方式表示
modbus ASCII 使用ASCII
modbus TCP/IP
其不同的差異只有在於部分的格式不同(ASCII採用字元編碼方式傳送)
在低階的硬體控制中,最常使用的莫過於modbus RTU這種以二進制方式傳送的通訊
是最簡單不過的,在RS485(TTL485)中經常可以看到modbus的通訊協定
其原因為modbus本身也具有master與slave的架構,在一個並聯(RS485)的通訊環境
中,有一節點(設備)為master,由該master向其他slave通訊,進行通訊、控制等
★★作者提到 :
1.因為TCP/IP的傳送格式本身就有其自己的檢查機制,故可以將Modbus RTU的CRC省略,透過TCP/IP本身的機制防止收到垃圾資料,這是我認為省略Modbus RTU CRC的原因。
2.但是如果是使用Modbus TCP的話,我記得除了省略CRC以外,在命令前面還會加上6個byte表示後面命令長度,如 00 00 00 00 00 06 01 03 01 02 00 AA
3.Modbus RTU能用網路IP封包傳送方式嗎?
我的答案是肯定的,因為只要是資料,就可以透過TCP/IP拋出來,Modbus只是定義了一種資料格式,所以與TCP/IP沒有衝突。
■ 常用的modbus功能碼(function code) - 0x03
0x03功能碼(function code)所定義的功能為讀取多個暫存器,用來讀取一連續
位址的資料。
master讀取格式:
設備ID(slave address/ID) + 0x03 + 讀取起始位置(word) + 讀取的數量(word) + CRC16
slave回復格式:
設備ID(slave address/ID + 0x03 + 回復資料的byte數 + 資料1(word) + ... + 資料n(word) + CRC16
例如
以下所出現之命令數字均已16進制表示)
master送出: 05 03 0100 0003 + CRC16
slave回應: 05 03 06 00A1 00B2 00C3 + CRC16
這樣就或許到暫存器位址中0100,0101,0102的資料分別為
0100 = 00A1
0101 = 00B2
0102 = 00C3
■ 常用的modbus功能碼(function code) - 0x10
0x10是在執行連續寫入多個暫存器用,其發送命令類似0x03功能的回覆命令
master寫入格式:
設備ID(slave address/ID) + 0x10 + 寫入暫存器起始位置(word) + 寫入的數量(word) + 資料數量(byte)
+ 第1筆資料(word) + ... +第n筆資料(word) + CRC16
slave回復格式:
設備ID(slave address/ID) + 0x10 + 寫入暫存器起始位置(word) + 寫入的數量(word) + CRC16
這個命令通常剛接觸的人都會霧煞煞,簡單說就是指定一個寫入的起始位置,然後預計寫入多少個暫存器
然後再加上一個資料數量,這個資料數量就是後面所帶的資料量有幾個byte,所以等於寫入的數量乘以2
因為一次需要寫入一個word的資料量,以至於就必須告訴slave端說後面帶了多少資料,很多人會說
已經知道寫入幾個了,為什麼還要脫褲子放屁的加上一個資料byte數呢?其原因應該是增加資料的可靠度
當slave端收到命令時,可以有助於驗證資料的正確性,如同0x03功能碼回覆時,也必須帶一個資料長度的大小
也是一樣的作用。
寫入範例:
master 送出: 05 10 0601 0003 06 000A 000B 000C + CRC16
slave 回應: 05 10 0601 0003 + CRC16
這行命令代表了我要寫入多個暫存器,由0601開始寫,連續寫入三個,所以後面的資料長度是6byte
經過命令之後
0601 = 000A
0602 = 000B
0603 = 000C
■ 常用的modbus功能碼(function code) - 0x06 (★★作者沒提到讀取單一暫存器的功能)
0x06的作用,在於寫入單一個暫存器資料,因一次只能寫入一筆資料,
依照modbus標準的定義來看,一次只能寫入1word的資料量。
master寫入格式:
設備ID(slave address/ID) + 0x06 + 寫入暫存器位置(word) + 寫入資料(word) + CRC16
slave回復格式:
設備ID(slave address/ID) + 0x06 + 寫入暫存器位置(word) + 寫入資料(word) + CRC16
0x06寫入與回應是相同的時候,代表寫入成功,如寫入失敗時,則會有另外一種格式,於後面介紹
寫入範例:
master 送出: 05 06 0205 9999 + CRC16
slave 回應: 05 06 0205 9999 + CRC16
經過上面的命令後,slave端暫存器位置0205資料寫入變更為0x9999