■ 軟件需求
本例程以Modbus RTU協議爲例,ExpOS設備做主機,通訊串口使用com1連接4臺modbus RTU從設備(地址01 ~ 04)進行通訊,查詢和控制從機的狀態。
■ 設計步驟
1.首先設置串口com1協議爲ModbusRTU,速率爲9600,如果需要處理通訊超時,需要勾選“使能超時”屬性,默認接收超時爲100mS,可以根據具體情況調整
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通訊”