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