InputRegisters переменная занимает два регистра
InputRegisters переменная занимает два регистра
Собственно необходимо опрашивать inputregisters в устройстве, но каждая переменная находится в двух регистрах, а не в одном. Разобрался как сделать, что бы шёл правильный запрос устройству (изменив numbeRegs с 1 на 2), но теперь видимо нужно изменить код отвечающий за обработку ответа. Пробовал выбирать holdingregister и менять function c 3 на 4, но тогда в запросе вообще идёт FF FF FF. Если что, то речь идёт о китайском счётчике Eastron SDM120M, с компа OPC сервером легко читается.
- Rovki
- Полковник
- Сообщения: 5722
- Зарегистрирован: 22 апр 2016, 17:25
- Откуда: Чехов
- Имя: Анатолий
- Благодарил (а): 68 раз
- Поблагодарили: 217 раз
- Контактная информация:
InputRegisters переменная занимает два регистра
инпутрегистр это для считывания аналоговых сигналов , а раз так ,то это тип данных float . если нужен один регистр то преобразуйте в INT , а если значение не большое ,например температура ,то сначала умножьте на 10 прежде ...что бы не потерять сильно в точности
Электронщик до мозга костей и не только
InputRegisters переменная занимает два регистра
Так и как переменную сделать float если там нет возможности выбора для InputRegister и по умолчанию встаёт только integer? Я пробовал читать из двух регистров создав соответсвенно две переменных Input Registers, но не пойму как тогда их потом собрать в один float, предпологаю что можно конвертировать в byte и смотреть что приходит сравнивать с тем что идёт если опрашивает OPC сервер, но подобное в любом случае будет решением через 5-тую точку.Rovki писал(а): 09 май 2020, 00:39 инпутрегистр это для считывания аналоговых сигналов , а раз так ,то это тип данных float
- Rovki
- Полковник
- Сообщения: 5722
- Зарегистрирован: 22 апр 2016, 17:25
- Откуда: Чехов
- Имя: Анатолий
- Благодарил (а): 68 раз
- Поблагодарили: 217 раз
- Контактная информация:
InputRegisters переменная занимает два регистра
Я ошибся - Input Registers — 16-битовый знаковый или беззнаковый тип, доступен только для чтения. Он состоит из 1 регистра ...с чего вы взяли что он из двух и сбили меня с толку...LapuLeen писал(а): 09 май 2020, 01:02Так и как переменную сделать float если там нет возможности выбора для InputRegister и по умолчанию встаёт только integer? Я пробовал читать из двух регистров создав соответсвенно две переменных Input Registers, но не пойму как тогда их потом собрать в один float, предпологаю что можно конвертировать в byte и смотреть что приходит сравнивать с тем что идёт если опрашивает OPC сервер, но подобное в любом случае будет решением через 5-тую точку.Rovki писал(а): 09 май 2020, 00:39 инпутрегистр это для считывания аналоговых сигналов , а раз так ,то это тип данных float
Электронщик до мозга костей и не только
InputRegisters переменная занимает два регистра
Во первых всех с праздником! В данном приборе он точно состоит из двух регистров потому, что в OWEN OPC сервере есть возможность выбрать тип переменной float для функции чтения 0x04 (тобишь InputRegister) кроме того, запрос к первому регистру выглядит так: 01 04 00 00 00 02 71 CB. То есть в данном случае 02 означает команду прочитать два регистра.Rovki писал(а): 09 май 2020, 07:42 Он состоит из 1 регистра ...с чего вы взяли что он из двух и сбили меня с толку...
- Rovki
- Полковник
- Сообщения: 5722
- Зарегистрирован: 22 апр 2016, 17:25
- Откуда: Чехов
- Имя: Анатолий
- Благодарил (а): 68 раз
- Поблагодарили: 217 раз
- Контактная информация:
InputRegisters переменная занимает два регистра
Я вам процитировал из описания модбаса Input Registers — 16-битовый знаковый или беззнаковый тип,, а китайцы как всегда сделают как им удобноLapuLeen писал(а): 09 май 2020, 10:40Во первых всех с праздником! В данном приборе он точно состоит из двух регистров потому, что в OWEN OPC сервере есть возможность выбрать тип переменной float для функции чтения 0x04 (тобишь InputRegister) кроме того, запрос к первому регистру выглядит так: 01 04 00 00 00 02 71 CB. То есть в данном случае 02 означает команду прочитать два регистра.Rovki писал(а): 09 май 2020, 07:42 Он состоит из 1 регистра ...с чего вы взяли что он из двух и сбили меня с толку...

Электронщик до мозга костей и не только
InputRegisters переменная занимает два регистра
Китайцы конечно делают как им удобно, но 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 переменная занимает два регистра
Так это у многих при передачи двух регистров идет своя последовательность байт ,стандарт это не оговаривает .Хорошо что в фл есть возможность менять очередность байт и регистровLapuLeen писал(а): 09 май 2020, 12:04Китайцы конечно делают как им удобно, но Input Registers и Holding Registers с точки зрения железа абсолютно одинаковы и занимают 16 бит на регистр, разница в том что Holding Registers можно читать и записывать, для Input Registers доступно только чтение. Не думаю что OWEN разрабатывал свой OPC сервер для каких-то непонятных китайских устройств, скорее всего подобных девайсов ещё много, сама функция то стандартная, просто в FLprog не предусмотрено чтение нескольких регистров для 0х04.
Отправлено спустя 32 минуты 8 секунд:
Разобрался с передачей запроса, осталось разобраться с обработкой ответа, подозреваю, что трабла в том, что вторым байтом в ответе идёт 4 а не 3 из-за этого выдаёт ошибку.
Электронщик до мозга костей и не только
InputRegisters переменная занимает два регистра
Может кому-нибудь тоже пригодится. Решение: В 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:
На выходе в 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:
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя