node.js - NodeJS jsmodbus 包 - readHoldingRegisters:预期浮点数
问题描述
我正在使用 jsmodbus 包访问 TCP Modbus 服务器以读取寄存器 126(Modbus 编号 40126),这是一个带符号的 16 位二进制数。
使用以下代码,我在 ReadHoldingRegistersResponseBody 中得到以下结果。我收到 10 个,同时期望看到 10.1;我怎样才能让它返回一个浮点数而不是一个整数?
提前致谢。
代码:
// create a tcp modbus client
let Modbus = require("jsmodbus");
let net = require("net");
let socket = new net.Socket();
let client = new Modbus.client.TCP(socket);
let options = {
host: "xxxxxx",
port: xxxx
};
socket.on("connect", function() {
client
.readHoldingRegisters(125,1)
.then(function(resp) {
console.log(resp.response._body);
socket.end();
})
.catch(function() {
console.error(
require("util").inspect(arguments, {
depth: null
})
);
socket.end();
});
});
socket.on("error", console.error);
socket.connect(options);
结果:
ReadHoldingRegistersResponseBody { _fc: 3, _byteCount: 2, _values: [ 10 ], _bufferLength: 4, _valuesAsArray: [ 10 ], _valuesAsBuffer: <Buffer 00 0a> }
解决方案
Modbus 传输 16 位大小的寄存器和浮点数表示为 32 位或 64 位大小的缓冲区。因此,如果需要浮点,您必须至少捕获两个寄存器,例如 readHoldingRegisters(125, 2),然后使用响应缓冲区 response.valuesAsBuffer.readFloat32BE(0)。
我联系了负责我正在访问的 modbus 服务器的开发团队,他们告诉我数字的小数部分在 modbus 服务器中不可用。所以在这种情况下我不能做太多,但它帮助我了解更多。
推荐阅读
- javascript - mongodb在多个请求时在节点应用程序上崩溃
- reactjs - 3个页面组件或导航之间的条件渲染,如何?
- excel-formula - 如何使用excel公式显示列表中的所有匹配值
- reactjs - 当材质 ui 滑块有多个拇指时,如何独立设置每个拇指的样式?
- bash - 如果与 HTTPS 一起使用,则 REST api 超时
- r - R - 在 tidyverse 中使用“group_by”的卡方检验
- javascript - 如何在 TypeScript 中丢弃 Promise 类型?
- sql - 在 SQL 中为分组数据计算 LQ、UQ 和 IQR
- html - How to have an image overlay on top of a clip path?
- azure-cognitive-search - Is there a way to limit search highlight length?