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

Ответить
LapuLeen
Рядовой
Сообщения: 9
Зарегистрирован: 07 мар 2019, 18:03
Имя: Сергей

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

Сообщение LapuLeen »

Собственно необходимо опрашивать inputregisters в устройстве, но каждая переменная находится в двух регистрах, а не в одном. Разобрался как сделать, что бы шёл правильный запрос устройству (изменив numbeRegs с 1 на 2), но теперь видимо нужно изменить код отвечающий за обработку ответа. Пробовал выбирать holdingregister и менять function c 3 на 4, но тогда в запросе вообще идёт FF FF FF. Если что, то речь идёт о китайском счётчике Eastron SDM120M, с компа OPC сервером легко читается.
Аватара пользователя
Rovki
Полковник
Сообщения: 5722
Зарегистрирован: 22 апр 2016, 17:25
Откуда: Чехов
Имя: Анатолий
Благодарил (а): 68 раз
Поблагодарили: 217 раз
Контактная информация:

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

Сообщение Rovki »

инпутрегистр это для считывания аналоговых сигналов , а раз так ,то это тип данных float . если нужен один регистр то преобразуйте в INT , а если значение не большое ,например температура ,то сначала умножьте на 10 прежде ...что бы не потерять сильно в точности
Электронщик до мозга костей и не только
LapuLeen
Рядовой
Сообщения: 9
Зарегистрирован: 07 мар 2019, 18:03
Имя: Сергей

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

Сообщение LapuLeen »

Rovki писал(а): 09 май 2020, 00:39 инпутрегистр это для считывания аналоговых сигналов , а раз так ,то это тип данных float
Так и как переменную сделать float если там нет возможности выбора для InputRegister и по умолчанию встаёт только integer? Я пробовал читать из двух регистров создав соответсвенно две переменных Input Registers, но не пойму как тогда их потом собрать в один float, предпологаю что можно конвертировать в byte и смотреть что приходит сравнивать с тем что идёт если опрашивает OPC сервер, но подобное в любом случае будет решением через 5-тую точку.
Аватара пользователя
Rovki
Полковник
Сообщения: 5722
Зарегистрирован: 22 апр 2016, 17:25
Откуда: Чехов
Имя: Анатолий
Благодарил (а): 68 раз
Поблагодарили: 217 раз
Контактная информация:

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

Сообщение Rovki »

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

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

Сообщение LapuLeen »

Rovki писал(а): 09 май 2020, 07:42 Он состоит из 1 регистра ...с чего вы взяли что он из двух и сбили меня с толку...
Во первых всех с праздником! В данном приборе он точно состоит из двух регистров потому, что в OWEN OPC сервере есть возможность выбрать тип переменной float для функции чтения 0x04 (тобишь InputRegister) кроме того, запрос к первому регистру выглядит так: 01 04 00 00 00 02 71 CB. То есть в данном случае 02 означает команду прочитать два регистра.
Аватара пользователя
Rovki
Полковник
Сообщения: 5722
Зарегистрирован: 22 апр 2016, 17:25
Откуда: Чехов
Имя: Анатолий
Благодарил (а): 68 раз
Поблагодарили: 217 раз
Контактная информация:

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

Сообщение Rovki »

LapuLeen писал(а): 09 май 2020, 10:40
Rovki писал(а): 09 май 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 мар 2019, 18:03
Имя: Сергей

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

Сообщение LapuLeen »

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

Отправлено спустя 32 минуты 8 секунд:
Разобрался с передачей запроса, осталось разобраться с обработкой ответа, подозреваю, что трабла в том, что вторым байтом в ответе идёт 4 а не 3 из-за этого выдаёт ошибку.
Аватара пользователя
Rovki
Полковник
Сообщения: 5722
Зарегистрирован: 22 апр 2016, 17:25
Откуда: Чехов
Имя: Анатолий
Благодарил (а): 68 раз
Поблагодарили: 217 раз
Контактная информация:

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

Сообщение Rovki »

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

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

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

Сообщение LapuLeen »

Может кому-нибудь тоже пригодится. Решение: В 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:
Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей