Чтение 32-битного числа с плавающей запятой из Modbus TCP с использованием красного узла

как читать удерживаемые значения Modbus TCP (03) - обмен 32-битным плавающим словом (CD AB) с функциональным блоком узла красного цвета?

У меня проблема с Modbus...

Чтение из Modbus TCP (FC3, размер данных 32 бита с плавающей запятой, адрес 272 десятичного числа)...

Когда Node RED считывает значения ( FC 3, чтение регистров хранения, количество 2 ) возвращает такие значения, как [0,16833]... Здесь я использую msg.payload=msg.payload[1] в функции, чтобы получить значение 16833 из множество...

Это значение моего датчика температуры.

Чтобы убедиться, что адрес Modbus правильный, я использую внешнее приложение для считывания значений с датчиков (опрос Modbus Rilheva) ...

Правильное значение считывается из модуля ПЛК, когда установлено значение:

Чтение удерживаемых значений (03) - замена 32-битного слова с плавающей запятой (CD AB) - см. экран...

Итак, кто-нибудь знает, как преобразовать его в реальное значение - вот оно 24,25...

Посмотрите документ nodejs для чтения из буферов.

hardillb 22.05.2019 17:51

Смотрите здесь: discourse.nodered.org/t/modbus-tcp-read-32-bit-registers/171‌​0/2 вам нужно будет манипулировать необработанными данными, чтобы учесть ваш порядок слов.

Marcos G. 22.05.2019 21:19

И здесь вы видите, как вы можете получить свой float: schneider-electric.com/en/faqs/FA204140, я не знаю, было ли это реализовано в узле red.

Marcos G. 22.05.2019 21:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
6 514
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сначала вы можете сохранить два целых числа в буфер (поменяв местами слова, как вы упомянули в ОП). После этого прочитайте буфер как число с плавающей запятой.

Вот как будет выглядеть функциональный узел (первая строка добавлена ​​для тестирования).

msg.payload = [0, 16833];
let pay = msg.payload;

const buf = Buffer.allocUnsafe(4);
buf.writeInt16BE(pay[0],2);
buf.writeInt16BE(pay[1],0);

msg.payload = buf.readFloatBE(0);
return msg;

При тестировании с вашими образцами данных [0,16833] вы получите msg.payload = 24,125.

это работает, он показывает правильное значение (1-проводной датчик температуры 18b20).. Я изменил первую строку с помощью msg.payload = [0, msg.payload [1]]; ..... но если я использую другой регистр, где находится входное значение аналогового напряжения (0-5 В), я не могу получить правильное значение (тип регистра тот же). Я получаю ошибку диапазона....RangeError [ERR_OUT_OF_RANGE]: значение «значение» выходит за пределы допустимого диапазона. Должно быть >= -32768 и <= 32767. Получено 52880 здесь должно быть выведено 40...

Damir Švegović 23.05.2019 07:02

Регистры хранения ModBUS могут хранить любые произвольные двоичные данные в нескольких 16-битных регистрах. Если вы хотите разобраться в этих данных, вам нужно знать, как какое правило использовалось для представления этих данных фрагментами по 16 бит. Из ваших результатов видно, что аналоговое напряжение не сохранялось в виде числа с плавающей запятой (с двумя замененными словами). Упомянутому вами датчику даже не нужно использовать все 16 бит, поскольку его точность составляет 12 бит. Возможно, вам потребуется даже выполнить какую-то дополнительную операцию (после чтения регистра), чтобы представить данные осмысленным образом.

AIOT MAKER 23.05.2019 16:27

Правильное решение — использовать writeUInt16BE, как показано ниже:

msg.payload = [0, 16833];
let pay = msg.payload;

const buf = Buffer.allocUnsafe(4);
buf.writeUInt16BE(pay[0],2);
buf.writeUInt16BE(pay[1],0);

msg.payload = buf.readFloatBE(0);
return msg;enter code here

Другие вопросы по теме