js实现modbus_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浓度对应的寄存器地址为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源创计划”,欢迎正在阅读的你也加入,一起分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows如何安装MSMQ消息队列

1 打开控制面板,找到下图所示的服务器核心,然点击确定 2 等待安装完成 转载于:https://www.cnblogs.com/acetaohai123/p/6610302.html

讲字节数组转化为base64_Base64编码简介及简单实现

Base64编码是一种将字节数据编码为字符串的编码,字节数据会被编码成由64个可打印ASCII字符组成的字符串,这64个字符包括大写字母A-Z, 小写字母a-z, 以及数字 0 -9再加上 和 / ,刚好64个字符。对应的字符表如下图:base64编码的一个用途就是对…

Mybatis返回Map

返回一条记录的map resultType“map“ key就是列名,值就是对应的值 多条记录封装成一个map Select返回类型中是返回Map时,是对方法中是否存在注解MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象的Map…

C# TreeView 连续点击 不触发AfterCheck事件

创建一个类 TreeView2 namespace System.Windows.Forms {public class TreeView2 : TreeView{protected override void WndProc(ref Message m){if (m.Msg ! 0x203){base.WndProc(ref m);}}} }然后前台放置一个TreeView控件。名叫:treeView1 后台代码: p…

最长等差数列_最长等差数列分析

原题给定未排序的数组,请给出方法找到最长的等差数列。分析题目描述比较简单,但是有一个问题我们需要首先搞清楚:等差数列中的数字,是否要和原始数组中的顺序一致。题目中,并没有说明,这个就需要大家在面试…

Mybatis中注解@MapKey的使用详解

MyBatis查询一些记录,数据涉及到两个表里的数据,需要连表查询,但我MyBatis的返回结果不想创建新的DO对象,因此使用MapKey注解返回一个Map集合。 含义:MapKey注解用于mapper.xml文件中,一般用于查询多条记录…

JMeter测试组件

JMeter的主要测试组件 1、测试计划是使用JMeter进行测试的起点,它是其它JMeter测试元件的容器。 2、线程组代表一定数量的并发用户,它可以用来模拟并发用户发送请求。实际的请求内容在Sampler中定义,它被线程组包含。 3、监听器负责收集测试结…

aes js 加盐值 解密_Java已有AES加解密,现需要前端Javascript加密调接口,返回的数据需要解密,目前互..._慕课猿问...

目前Javascript使用crypto-js包。前后台可以自己跑通加解密,但是,无法互通。针对对象{}加密……网上的方案,已经尝试了4天左右了,还没成功,请指导。无思路,无报错。Javapackage com.pactera.sms.foundbase.…

springboot 1.5.2 集成kafka 简单例子

添加依赖 compile("org.springframework.kafka:spring-kafka:1.1.2.RELEASE") 添加application.properties #kafka # 指定kafka 代理地址,可以多个 spring.kafka.bootstrap-servers192.168.59.130:9092,192.168.59.131:9092,192.168.59.132:9092 # 指定默…

更新 绑定数据_Blazor 修仙之旅 组件与数据绑定

一.前言在第一篇文章初尝 Blazor WebAssembly中,有提到过组件(Component)这个概念。组件在 Blazor 中是必不可少的,UI 全靠它组装起来,和前端的 JS 组件是一个意思,比如:vue component、react component 等等。借用官方…

Struts2 拦截器: 拦截器与过滤器区别

1、首先要明确什么是拦截器、什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。…

关于使用idea工具debug时,断点颜色由红色变成灰色解决方法

在使用断点调试的时候,发现断点由原来的红色变成灰色的,后来发现是由于错误操作将Debug断点调试禁用了 ,只需要点击禁用按钮取消就可以了

改变图标颜色_LOL设计师宣布修改装备图标:提高清晰度、颜色差异化

在11月12日,英雄联盟更新到了最新的季前赛版本。这次官方除了对部分英雄进行改动,主要是对于装备的图标和属性进行了更新。而在图标更新后,很多装备的样子都发生了很大的变化。这也导致很多老玩家在进游戏后,看着装备栏发呆&#…

虚拟机中centos安装gcc

yum install gcc-c 一、首先是:使得虚拟机联网 使用NAT模式 虚拟机网络连接使用NAT模式,物理机网络连接使用Vmnet8。 虚拟机设置里面——网络适配器,网络连接选择NAT模式。 虚拟机菜单栏—编辑—虚拟网络编辑器,选择Vmnet8 NAT模式…

python查看汉字的编码_python有关汉字编码问题

python分为:程序编码(python安装程序)、文件编码。查看程序编码方式:sys.getdefaultencoding()查看文件编码方式:1.import chardet 2. f open(lianxi1-qus.py) data f.read() print chardet.detect(data)字符编码发展历程&#…

gcd(欧几里得算法)

基础 1 int gcd(int a,int b) 2 { 3 int r; 4 while(b>0) 5 { 6 ra%b; 7 ab; 8 br; 9 } 10 return a; 11 } View Code递归 1 int gcd(int a,int b) 2 { 3 return (b>0)?gcd(b,a%b):a; 4 } Vi…