nodejs中使用modbus-serial庫創建Modbus TCP讀取設備的數據
- 2019 年 12 月 20 日
- 筆記
nodejs中使用modbus-serial庫創建Modbus TCP讀取設備的數據
在nodejs中安裝modbus-serial庫
本人使用的開發環境是Windows10下的VSCode,安裝並配置好了npm、node、cnpm等工具,使用cnpm安裝了modbus-serial庫,可以在npm中搜到modbus-serial包以及它的介紹, 在對應的VSCode終端下使用cnpm install modbus-serial -g安裝modbus-serial庫
cnpm install modbus-serial -g
本來想使用libmodbus的javascript庫的,不過在npm官網搜到對應的libmodbus 3.1.4的javascript庫,有如下聲明:
This is binding to native library libmodbus (http://libmodbus.org/). Now working only in *nix system. Module have native function and framework.
說是modbus目前只支援類nix系統,比如Linux、Unix系統。所以我選擇了modbus-serial庫,當然如果使用C和C++的話,直接使用libmodbus庫的C語言版本,官網是:https://libmodbus.org,Github地址是:https://github.com/stephane/libmodbus,Linux下編譯libmodbus源程式碼很簡單,Windows下配置相對麻煩點。
非甲烷總烴設備的Modbus暫存器地址定義表
例如,要讀取非甲烷總烴設備的總烴、甲烷CH4、NMHC非甲烷總烴對應的濃度, 相關監測因子參數的Modbus暫存器定義如下:
名稱 |
數據 |
地址 |
係數 |
值 |
---|---|---|---|---|
系統參數 |
儀器狀態 |
1 |
1 |
0 |
系統參數 |
運行狀態 |
2 |
1 |
1 |
系統參數 |
控制指令 |
3 |
1 |
8 |
取樣時間 |
年 |
10 |
1 |
2019 |
取樣時間 |
月 |
11 |
1 |
11 |
取樣時間 |
日 |
12 |
1 |
14 |
取樣時間 |
時 |
13 |
1 |
14 |
取樣時間 |
分 |
14 |
1 |
26 |
取樣時間 |
秒 |
15 |
1 |
22 |
TVOC |
狀態 |
20 |
1 |
0 |
TOVC |
峰面積 |
21 |
0.01 |
1908 |
總烴 |
濃度 |
22 |
0.01 |
254 |
CH4 |
狀態 |
23 |
1 |
0 |
CH4 |
峰面積 |
24 |
0.01 |
1729 |
CH4 |
濃度 |
25 |
0.01 |
200 |
NMHC |
狀態 |
26 |
1 |
0 |
NMHC |
峰面積 |
27 |
0.01 |
0 |
NMHC |
濃度 |
28 |
0.01 |
57 |
苯 |
狀態 |
29 |
1 |
8 |
苯 |
峰面積 |
30 |
0.01 |
0 |
苯 |
濃度 |
31 |
0.01 |
0 |
甲苯 |
狀態 |
32 |
1 |
8 |
甲苯 |
峰面積 |
33 |
0.01 |
0 |
甲苯 |
濃度 |
34 |
0.01 |
0 |
乙苯 |
狀態 |
35 |
1 |
8 |
乙苯 |
峰面積 |
36 |
0.01 |
0 |
乙苯 |
濃度 |
37 |
0.01 |
0 |
間二甲苯 |
狀態 |
38 |
1 |
8 |
間二甲苯 |
峰面積 |
39 |
0.01 |
0 |
間二甲苯 |
濃度 |
40 |
0.01 |
0 |
對二甲苯 |
狀態 |
41 |
1 |
8 |
對二甲苯 |
峰面積 |
42 |
0.01 |
0 |
對二甲苯 |
濃度 |
43 |
0.01 |
0 |
間-對二甲苯 |
狀態 |
44 |
1 |
8 |
間-對二甲苯 |
峰面積 |
45 |
0.01 |
0 |
間-對二甲苯 |
濃度 |
46 |
0.01 |
0 |
苯乙烯 |
狀態 |
47 |
1 |
8 |
苯乙烯 |
峰面積 |
48 |
0.01 |
0 |
苯乙烯 |
濃度 |
49 |
0.01 |
0 |
鄰二甲苯 |
狀態 |
50 |
1 |
8 |
鄰二甲苯 |
峰面積 |
51 |
0.01 |
0 |
鄰二甲苯 |
濃度 |
52 |
0.01 |
0 |
非甲烷總烴分析儀有三個關鍵參數,即總烴、CH4、NMHC的濃度,對應Modbus暫存器地址分別為:22,25,28,獲取對應暫存器數據後還需要乘以0.01
使用modbus-serial庫,使用Modbus TCP協議讀取對應暫存器中的數據
相關nodejs程式碼如下:
var moment = require('moment') // create an empty modbus client var ModbusRTU = require("modbus-serial") var client = new ModbusRTU(); // open connection to a tcp line // 創建Modbus TCP連接,IP是15.18.200.23,埠502 client.connectTCP("15.18.200.23", { port: 502 }); / 讀取非甲烷總烴的關於總烴、甲烷、NMHC這3個暫存器(暫存器地址分別為22,25,28)中的濃度 // 每隔5秒鐘讀取保持暫存器的值,從暫存器地址22開始讀取,讀10個暫存器到data數組中 setInterval(function(){ client.readHoldingRegisters(22, 10, function(err, data){ // 獲取當前時間 //moment.locale('zh-cn'); console.log("----------------------------------------------------------------------"); console.log("數據時間是:" + moment().format('YYYY年MM月DD日 HH時mm分ss秒')); console.log("總烴的濃度是:" + data.data[0] * 0.01 + "ppmV"); // 總烴濃度對應的暫存器地址為22 console.log("CH4的濃度是:" + data.data[3] * 0.01 + "ppmV"); // CH4濃度對應的暫存器地址為22 console.log("NHMC的濃度是:" + data.data[6] * 0.01 + "ppmV"); // NHMC濃度對應的暫存器地址為22 console.log("----------------------------------------------------------------------"); //console.log(data.data); }); }, 5000);
上述程式碼使用了JavaScript 日期處理類庫Moment.js對當前日期進行格式化,相關介紹見Moment.js-JavaScript 日期處理類庫 使用很簡單,比如項要獲取當前的時間,按照2019年12月9日 16時07分23秒這種格式輸出,程式碼如下:
var moment = require('moment'); var currentTime = moment().format('YYYY年MM月DD日 HH時mm分ss秒'); console.log("當前時間為:" + currentTime);
nodejs中安裝moment庫也很簡單,一條命令搞定,如下:
cnpm install moment -g
相關程式碼測試輸出如下:
---------------------------------------------------------------------- 數據時間是:2019年12月11號 16時07分56秒 總烴的濃度是:2.78ppmV CH4的濃度是:2.07ppmV NHMC的濃度是:0.70ppmV ---------------------------------------------------------------------- ---------------------------------------------------------------------- 數據時間是:2019年12月11號 16時08分01秒 總烴的濃度是:2.78ppmV CH4的濃度是:2.07ppmV NHMC的濃度是:0.70pmV ---------------------------------------------------------------------- ---------------------------------------------------------------------- 數據時間是:2019年12月11號 16時08分06秒 總烴的濃度是:2.78ppmV CH4的濃度是:2.07ppmV NHMC的濃度是:0.70ppmV ----------------------------------------------------------------------