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