PDA

Просмотр полной версии : Какая-то байда с передачей float из OPC



Boris_K
06.02.2015, 15:07
Использую ПЛК100 под Кодесис 2. Для связи с MasterSCADA использую её родной MasterOPC (build 3.1.3). Связь по Модбас. Столкнулся с проблемой. При передаче больших/малых значений float-тегов скада и OPC отображают неправильные значения. Например, в Кодесис, в конфиге ПЛК ставлю очень малое значение (1e-15 к примеру), затем смотрю в OPC сервер - он показывает просто 0, и скада аналогично. Судя по всему, в скаде постоянна дискретность значений float-переменных, и всё, независимо от общего количества значащих цифр! И такое чувство, что скада и ОРС не понимают экспоненциальный формат float-переменных. В другой ситуации, при больших значениях - вообще показывают какой-то мусор.

Вот скрин, сравните три значения, выделенные красным - значение в Кодесис (правильное), в OPC-сервере и в скаде.

16617

P. S. С адресами, выравниванием и перестановкой байт всё в порядке, и не очень большие значения везде отображаются правильно. Но с экспоненциальным форматом - беда какая-то. :( Как это вылечить?

SCADAMaster
06.02.2015, 17:53
Проблема проявилась. Мы ее изучим.

Boris_K
06.02.2015, 18:55
capzap, это просто другой тег (тип word в Кодесис), и с ним всё в порядке. А uint32 с сервера только потому, что у сервера нет возможности выдавать в uint16. Это просто конвертация в избыточный формат.

SCADAMaster
06.02.2015, 21:33
Ошибка устранена. Исправление будет доступно в следующей стабильной версии.
Также нужно иметь ввиду что при типе Float на столь больших числах возникает погрешность - добавляются лишние значения (условно говоря - ввели 9 триллионов, в контроллере будет отображаться 9 триллионов и 4 тысячи).

Boris_K
09.02.2015, 10:05
ЗЫ Вы пишите о конвертации в избыточный формат, а хоть представляете границы диапазона 16-ти разрядных чисел? Помню наизусть, а в чём вопрос-то? :) Это был просто пример, и что вы прицепились к этому uint16? В адресации он идёт после тега с Float, поэтому никак не влияет на него. Вопрос был про Float.

Boris_K
09.02.2015, 15:14
Нет, если форматы не совпадают, то просто происходит конвертация, так в документации к MasterOPC сказано. Да и в любом случае, те два регистра с float в данном примере никак ведь не конвертируются.

Boris_K
09.02.2015, 15:42
SCADAMaster,

Судя по всему, ошибка с восприятием float присутствует и в самой скаде, и в модбас-сервере MasterOPC. Да и сдаётся мне, что это не ошибка, а просто разработчики изначально "закладывались" на хранение фиксированного количества нулей после точки, а все меньшие значения понимать как просто ноль. Мол, для реальных величин не нужны такие мизерные или огромные значения. Но это неправильно! Первый же пример (который мне и нужен) - давление в высоковакуумной камере - может меняться от 100000 Па (атмосфера) до 1e-6 Па - то есть в 100 миллиардов раз. А есть и гораздо более "глубокие" величины.

И вообще, в любой системе программирования диапазон стандартного четырёхбайтового float - от 1e-38 до 1e+38 (по показателю степени, коэффициенты не помню), и со знаком +/- разумеется. И любое число из этого диапазона будет храниться с точностью 7 значащих цифр. Так правильно, так везде. А количество цифр после точки - это уже вопрос вкуса отображения. Иногда нужно отображать фиксированное количество цифр после точки. Но не всегда. Далеко не всегда!

То есть если я напишу 0.0000000000123, то это 1.23e-11, а не ноль! На то оно и float - число с плавающей точкой! Исправляйте срочно!

SCADAMaster
09.02.2015, 15:57
Судя по всему, ошибка с восприятием float присутствует и в самой скаде, и в модбас-сервере MasterOPC.

Почему вы так решили? Несколько наших клиентов используют экспонециональную шкалу (измерение радиации и вакуумные системы).
Создаете шкалу у Система - Шкалы - Аналоговые, в поле формат прописываете вместо f букву e - exponential. Эту шкалу и назначайте нужным переменным.

Boris_K
09.02.2015, 16:02
Почему вы так решили? Несколько наших клиентов используют экспонециональную шкалу (измерение радиации и вакуумные системы).
Создаете шкалу у Система - Шкалы - Аналоговые, в поле формат прописываете вместо f букву e - exponential. Эту шкалу и назначайте нужным переменным.

Дык сам ОРС-сервер тупо меняет на 0 всё, что меньше 0.00001. И скада тут уже не поможет, ей с нижнего уровня приходит тупо ноль! Пробовал и через шкалы, с использованием повторителя сигналов: при больших значениях глюки начинаются с +13 степени, а должно всё верно отображаться до 1е+38.

SCADAMaster
09.02.2015, 16:35
Мы вам написали что это проблема в ОРС сервере.
Причем здесь SCADA?

Boris_K
09.02.2015, 16:40
Да, насчёт скады извиняюсь, с использованием эксп. шкалы всё работает нормально. Но пока не знаю как передать с нижнего уровня, придётся ждать выхода новой версии MasterOPC.