Здравствуйте! помогите пожалуйста с настройкой.
Используем прибор WB-MAP3E для расширения возможностей программируего реле Овен ПР205 в качестве анализатора сетевого напряжения и мощности.
Не как не могу разобраться с отображением значений в регистрах с плавающей запятой.
ПР205 настроено так
Причем как регистры big endian таки и little endian
Если убрать галку “старшим байтом вперед” в настройках порта, сбиваются регистры u16 и показываю какую то ерунду.
Не знаю куда дальше двигаться. Подскажите пожалуйста.
Согласно документации на счётчик порядок старшим байтом вперёд, а порядок регистров может отличаться. При этом u32 и u64 значит, что они целочисленные и беззнаковые. То есть это не число с плавающей точкой.
Согласно документации на OWEN Logic, такой формат чисел при работе по modbus не поддерживается стандартными средствами.
Могу предложить реализовать следующий костыль: считать такие числа по одному регистру в переменные типа uint, затем математически преобразовать в нужный вид.
Коллега заметил, что с таким костылём можно получить неконсистентные данные.
Из-за того, что регистры будут считываться разными запросами, может оказаться, что за время между запросами данные изменятся.
Я предполагала, OWEN Logic достаточно оптимизированная для того, чтобы регистры, расположенные по порядку, считывать групповым запросом.
В документации нашла примечание, что такой опрос в режиме master не поддерживается:
Можно проверить, что ПР посылает отдельные запросы на считывание соседних регистров, прослушав шину, чтобы наверняка. Т.к. ПР205 на новой платформе, вдруг оптимизировали.
Зато обнаружила способ считывания u32 без костылей:
Да я тоже нашел выбор целочисленных чисел с двумя регистрами, попробовал вроде работает. Про u64 придется забыть, я этот вопрос тоже задал коллегам на форуме OwenLogic и они сказали, что u64 вне возможностей ПР205. По крайней мере я так понял. У теперь остался один большой вопрос. При настройке режима работы мастера модбас для порта задается порядок чтения регистров. Старшим регистром вперед или без галочки - младшим вперед.
Как я понял из инструкции на счетчик у переменных указаны форматы чтения регистров
прямым (big-endian) и обратным (little-endian)
другими словами (big-endian) - старшим регистром вперед, (little-endian) - младшим регистром вперед. Поправьте меня, если я ошибаюсь.
И вот здесь я столкнулся с тако проблемой. Выставил параметр старшим регистром вперед Начал я вносить регистры в память ПРки
5136 - u16 big endian ( здесь вроде не важно)
4864 - s32 big endian (прямая)
6160 - s32 little endian и оппа, другая последовательность
потом опять прямая потом опять обратная. В общем некоторые параметры (Их 6 шт) имеют обратную последовательность. не знаю ка быть.
И вообще зачем так нужно было делать, Ну в ваших приборах таких проблем конечно нет. Но все же, похоже их только через костыли (ранее предложенные) попробовать считать.
Попробовал собрать значения регистра 6160 - s32 little endian из двух регистров сначала младший 6160 потом старший 6161, но что то полученные значения не похожи на правду. Там ведь вычилеиния как для u64 только без двух последних?
s32 - значит, что число со знаком. То есть число представлено двоичным дополнением.
Опишу подробнее:
Представляем значение регистра в двоичной системе.
Если в самом старшем бите (самом левом) стоит единица, значит число отрицательное.
Вычитаем единицу - инвертируем все биты - получаем число по модулю.
Положительные числа выглядят как обычно, просто максимальное возможное значение в два раза меньше.