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 ----------------------------------------------------------------------