Express Pi 開發實例-Modbus RTU

■ 軟件需求

1540969920691745.png

本例程以Modbus RTU協議爲例,ExpOS設備做主機,通訊串口使用com1連接4臺modbus RTU從設備(地址01 ~ 04)進行通訊,查詢和控制從機的狀態。

■ 設計步驟

1.首先設置串口com1協議爲ModbusRTU,速率爲9600,如果需要處理通訊超時,需要勾選“使能超時”屬性,默認接收超時爲100mS,可以根據具體情況調整

1536793426107189.png

ExpOS設備目前支持的Modbus RTU功能碼如下:

  • 功能碼01:讀線圈(開關量輸出)
  • 功能碼02:讀輸入狀態(開關量輸入)
  • 功能碼03:讀保持寄存器(模擬量輸出)
  • 功能碼04:讀輸入寄存器(模擬量輸入)
  • 功能碼05:寫單線圈(開關量輸出)
  • 功能碼06:寫單保持寄存器(模擬量輸出)
  • 功能碼15:寫多線圈(開關量輸出)
  • 功能碼16:寫多保持寄存器(模擬量輸出)
  • 功能碼0F: 寫多個線圈寄存器
  • 功能碼10: 寫多個保持寄存器

2.主機發送Modbus指令

串口控件有專門的modbus寫方法:device.com1.writeModbus(data) , 參數data可以是一個字符串(字符之間使用空格分隔),也可以是一個16進制的數組,也可以輸入多個16進製做爲參數

device.com1.writeModbus(’01 01 00 00 00 02′); // 字符串
device.com1.writeModbus([0x01, 0x01, 0x00, 0x00, 0x00, 0x02]); // 數組
device.com1.writeModbus(0x01, 0x01, 0x00, 0x00, 0x00, 0x02); // 16進制

串口硬件輸出的字節流爲:01 01 00 00 00 02 BD CB

當然我們也可以不使用writeModbus方法,自己計算CRC,最後使用通用的write方法來寫串口

如:

var data = [0x01, 0x01, 0x00, 0x00, 0x00, 0x02];
var crc = util.calculateCRC16(data); // 返回長度爲兩個字節的數組
device.com1.write(data, crc);

串口硬件輸出的字節流爲:01 01 00 00 00 02 BD CB

3.主機接收Modbus從機回覆

當第2步主機發送指令完成後,對應地址的從機回覆,串口com1接收到一幀完整數據並CRC校驗通過後,會調用串口控件的onReceive方法

如果串口控件設置勾選了“使能超時”屬性,如果從機返回超時,或者從機返回數據幀校驗有問題,會調用串口的onEvent方法

 

完整工程,請在最新版本的Studio中打開例程“Modbus RTU通訊”

1553634166299761.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章