nodejs中使用modbus-serial库创建Modbus TCP读取设备的数据

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
----------------------------------------------------------------------
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353