NodeJS jsmodbus package - readHoldingRegisters: ожидается число с плавающей точкой - PullRequest
0 голосов
/ 08 января 2019

Я использую пакет jsmodbus для доступа к серверу TCP Modbus для чтения регистра 126 (номер Modbus 40126), который является 16-разрядным двоичным числом со знаком.

С помощью следующего кода я получаю результаты ниже в ReadHoldingRegistersResponseBody. Я получаю 10, ожидая увидеть 10,1; Как я могу заставить его возвращать число с плавающей точкой вместо int?

Заранее спасибо.

Код:

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

1 Ответ

0 голосов
/ 10 января 2019

Modbus передает регистры 16-битного размера, а числа с плавающей запятой представлены в виде 32-битного или 64-битного буфера. Поэтому, если требуется с плавающей запятой, вам нужно как минимум перехватить два регистра, например readHoldingRegisters (125, 2), а затем поработать с буфером ответа response.valuesAsBuffer.readFloat32BE (0).

Я связался с командой разработчиков, ответственной за сервер Modbus, к которому я обращаюсь, и мне сказали, что десятичная часть чисел недоступна на сервере Modbus. Так что в этом случае я мало что могу сделать, но это помогло мне узнать больше.

...