Байт Modus TCP в стандартные типы данных

Я очень хорошо знал Modbus и связанный с ним домен. Мне нужно реализовать приложение node js, которое должно считывать данные из регистра Modbus через TCP-соединение и преобразовывать их в читаемые форматы, такие как Integer, Float, Time, Char, String. Я использовал пакет Modbus-serial npm. Я каким-то образом реализовал часть разговора, но не знаю, правильно это или неправильно. Пожалуйста, предложите с вашим отзывом.

Предполагая, что каждый регистр имеет 2-байтовую информацию, а байтовые данные выглядят как So Integer, Char - 1 байт Float - 2 байта Время, выделенное с 3 байтами (предполагая, что хранилище будет в метке времени UNIX, даже, пожалуйста, предложите, есть ли какой-либо другой лучший способ обработки )

Register Holding value Buffer data (bytes) Converted Value DataType
97 Buffer 00 61 97 Integer
100 Buffer 00 64 d Char
[565,598] Buffer 02 35 02 56 1.32984502248624 Float
[1,1,1] Buffer 00 01 00 01 00 01 2106-02-08 00:40:33 3333 Time

person Narayanan    schedule 06.05.2021    source источник


Ответы (1)


Modbus не определяет, как отправляются типы данных, он определяет только отправку одного или нескольких 16-битных слов, а также битов.

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

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

А в случае с передачей времени все может быть еще сложнее.

person Lluis Felisart    schedule 06.05.2021
comment
Соглашаться !. Modbus не знает тип данных. В результате мы определили типы данных и преобразование. Вопрос с нетерпением ждет больше в правильности или неправильности результатов метода преобразования. - person Narayanan; 07.05.2021
comment
@Narayanan, потому что стандарт не определяет типы данных, отличные от 16-битных слов и битов, на ваш вопрос нет ответа (нет «правильного» метода). Существует несколько способов реализации Char, Float и Time; правильный путь будет тот, который выбрал производитель устройства, с которым вы общаетесь! (при общении с несколькими устройствами вам может понадобиться несколько методов кодирования/декодирования). Я нахожу этот калькулятор полезным при попытке выяснить, что использовалась кодировка. - person Brits; 10.05.2021
comment
@Британцы, Вы очень четко разъяснили, спасибо !! - person Narayanan; 19.05.2021