InputRegisters переменная занимает два регистра

Ответить
LapuLeen
Рядовой
Сообщения: 9
Зарегистрирован: 07.03.2019{, 18:03}
Репутация: 0
Имя: Сергей

InputRegisters переменная занимает два регистра

#1

Сообщение LapuLeen » 09.05.2020{, 00:08}

Собственно необходимо опрашивать inputregisters в устройстве, но каждая переменная находится в двух регистрах, а не в одном. Разобрался как сделать, что бы шёл правильный запрос устройству (изменив numbeRegs с 1 на 2), но теперь видимо нужно изменить код отвечающий за обработку ответа. Пробовал выбирать holdingregister и менять function c 3 на 4, но тогда в запросе вообще идёт FF FF FF. Если что, то речь идёт о китайском счётчике Eastron SDM120M, с компа OPC сервером легко читается.

Аватара пользователя
Rovki
Полковник
Сообщения: 4877
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 268
Откуда: Чехов
Имя: Анатолий
Контактная информация:

InputRegisters переменная занимает два регистра

#2

Сообщение Rovki » 09.05.2020{, 00:39}

инпутрегистр это для считывания аналоговых сигналов , а раз так ,то это тип данных float . если нужен один регистр то преобразуйте в INT , а если значение не большое ,например температура ,то сначала умножьте на 10 прежде ...что бы не потерять сильно в точности
Электронщик до мозга костей и не только

LapuLeen
Рядовой
Сообщения: 9
Зарегистрирован: 07.03.2019{, 18:03}
Репутация: 0
Имя: Сергей

InputRegisters переменная занимает два регистра

#3

Сообщение LapuLeen » 09.05.2020{, 01:02}

Rovki писал(а):
09.05.2020{, 00:39}
инпутрегистр это для считывания аналоговых сигналов , а раз так ,то это тип данных float
Так и как переменную сделать float если там нет возможности выбора для InputRegister и по умолчанию встаёт только integer? Я пробовал читать из двух регистров создав соответсвенно две переменных Input Registers, но не пойму как тогда их потом собрать в один float, предпологаю что можно конвертировать в byte и смотреть что приходит сравнивать с тем что идёт если опрашивает OPC сервер, но подобное в любом случае будет решением через 5-тую точку.

Аватара пользователя
Rovki
Полковник
Сообщения: 4877
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 268
Откуда: Чехов
Имя: Анатолий
Контактная информация:

InputRegisters переменная занимает два регистра

#4

Сообщение Rovki » 09.05.2020{, 07:42}

LapuLeen писал(а):
09.05.2020{, 01:02}
Rovki писал(а):
09.05.2020{, 00:39}
инпутрегистр это для считывания аналоговых сигналов , а раз так ,то это тип данных float
Так и как переменную сделать float если там нет возможности выбора для InputRegister и по умолчанию встаёт только integer? Я пробовал читать из двух регистров создав соответсвенно две переменных Input Registers, но не пойму как тогда их потом собрать в один float, предпологаю что можно конвертировать в byte и смотреть что приходит сравнивать с тем что идёт если опрашивает OPC сервер, но подобное в любом случае будет решением через 5-тую точку.
Я ошибся - Input Registers — 16-битовый знаковый или беззнаковый тип, доступен только для чтения. Он состоит из 1 регистра ...с чего вы взяли что он из двух и сбили меня с толку...
Электронщик до мозга костей и не только

LapuLeen
Рядовой
Сообщения: 9
Зарегистрирован: 07.03.2019{, 18:03}
Репутация: 0
Имя: Сергей

InputRegisters переменная занимает два регистра

#5

Сообщение LapuLeen » 09.05.2020{, 10:40}

Rovki писал(а):
09.05.2020{, 07:42}
Он состоит из 1 регистра ...с чего вы взяли что он из двух и сбили меня с толку...
Во первых всех с праздником! В данном приборе он точно состоит из двух регистров потому, что в OWEN OPC сервере есть возможность выбрать тип переменной float для функции чтения 0x04 (тобишь InputRegister) кроме того, запрос к первому регистру выглядит так: 01 04 00 00 00 02 71 CB. То есть в данном случае 02 означает команду прочитать два регистра.

Аватара пользователя
Rovki
Полковник
Сообщения: 4877
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 268
Откуда: Чехов
Имя: Анатолий
Контактная информация:

InputRegisters переменная занимает два регистра

#6

Сообщение Rovki » 09.05.2020{, 11:03}

LapuLeen писал(а):
09.05.2020{, 10:40}
Rovki писал(а):
09.05.2020{, 07:42}
Он состоит из 1 регистра ...с чего вы взяли что он из двух и сбили меня с толку...
Во первых всех с праздником! В данном приборе он точно состоит из двух регистров потому, что в OWEN OPC сервере есть возможность выбрать тип переменной float для функции чтения 0x04 (тобишь InputRegister) кроме того, запрос к первому регистру выглядит так: 01 04 00 00 00 02 71 CB. То есть в данном случае 02 означает команду прочитать два регистра.
Я вам процитировал из описания модбаса Input Registers — 16-битовый знаковый или беззнаковый тип,, а китайцы как всегда сделают как им удобно :smile225:
Электронщик до мозга костей и не только

LapuLeen
Рядовой
Сообщения: 9
Зарегистрирован: 07.03.2019{, 18:03}
Репутация: 0
Имя: Сергей

InputRegisters переменная занимает два регистра

#7

Сообщение LapuLeen » 09.05.2020{, 11:32}

Rovki писал(а):
09.05.2020{, 11:03}
а китайцы как всегда сделают как им удобно
Китайцы конечно делают как им удобно, но Input Registers и Holding Registers с точки зрения железа абсолютно одинаковы и занимают 16 бит на регистр, разница в том что Holding Registers можно читать и записывать, для Input Registers доступно только чтение. Не думаю что OWEN разрабатывал свой OPC сервер для каких-то непонятных китайских устройств, скорее всего подобных девайсов ещё много, сама функция то стандартная, просто в FLprog не предусмотрено чтение нескольких регистров для 0х04.

Отправлено спустя 32 минуты 8 секунд:
Разобрался с передачей запроса, осталось разобраться с обработкой ответа, подозреваю, что трабла в том, что вторым байтом в ответе идёт 4 а не 3 из-за этого выдаёт ошибку.

Аватара пользователя
Rovki
Полковник
Сообщения: 4877
Зарегистрирован: 22.04.2016{, 17:25}
Репутация: 268
Откуда: Чехов
Имя: Анатолий
Контактная информация:

InputRegisters переменная занимает два регистра

#8

Сообщение Rovki » 09.05.2020{, 12:08}

LapuLeen писал(а):
09.05.2020{, 12:04}
Rovki писал(а):
09.05.2020{, 11:03}
а китайцы как всегда сделают как им удобно
Китайцы конечно делают как им удобно, но Input Registers и Holding Registers с точки зрения железа абсолютно одинаковы и занимают 16 бит на регистр, разница в том что Holding Registers можно читать и записывать, для Input Registers доступно только чтение. Не думаю что OWEN разрабатывал свой OPC сервер для каких-то непонятных китайских устройств, скорее всего подобных девайсов ещё много, сама функция то стандартная, просто в FLprog не предусмотрено чтение нескольких регистров для 0х04.

Отправлено спустя 32 минуты 8 секунд:
Разобрался с передачей запроса, осталось разобраться с обработкой ответа, подозреваю, что трабла в том, что вторым байтом в ответе идёт 4 а не 3 из-за этого выдаёт ошибку.
Так это у многих при передачи двух регистров идет своя последовательность байт ,стандарт это не оговаривает .Хорошо что в фл есть возможность менять очередность байт и регистров
Электронщик до мозга костей и не только

LapuLeen
Рядовой
Сообщения: 9
Зарегистрирован: 07.03.2019{, 18:03}
Репутация: 0
Имя: Сергей

InputRegisters переменная занимает два регистра

#9

Сообщение LapuLeen » 09.05.2020{, 12:40}

Может кому-нибудь тоже пригодится. Решение: В FLprog задаём переменную модбас как HoldingRegisters(поскольку функции чтения идентичны за исключением значения второго байта 3 вместо нужного нам 4)
На выходе в Arduino IDE правим код:
const unsigned char _modbusMaster_fctsupported[] = {3, 6, 16}; меняем на const unsigned char _modbusMaster_fctsupported[] = {4, 6, 16};

в методе void _createMasterTelegramm() оператор switch (_modbusMasterCurrentVariable) _modbusTelegramm.function = 3; меняем на _modbusTelegramm.function = 4; (если переменных несколько то меняем для каждой переменной)

в методе void _modbusMasterSendQuery() switch ( _modbusTelegramm.function ) {
case 3: меняем на case 4:

_modbuseLastError1_ErrCode = 0;
switch ( _modbusMasterBuffer[1] ) {
case 3: меняем на case 4:

Ответить

Вернуться в «Помогите, а то я "нимагу"»