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浓度对应的寄存器地址为25
console.log("NHMC的浓度是:" + data.data[6] * 0.01 + "ppmV"); // NHMC浓度对应的寄存器地址为28
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
----------------------------------------------------------------------
本文同步分享在 博客“雪域迷影”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。