Потеря точности при чтении Float32 в Modbus-драйвере

Avatar
  • обновлен
  • Отвечен

Переменная типа REAL (4 байта) в CDS 2.3 и памяти ПЛК имеет значение 10.68 (например).

При чтении Holdings Register с типом данных Float32 в тег SimpLight тип

single (double) значение равно 10.625.

Параллельное чтение ОРС сервером Lectus (да и любыми другими Modbus-серверами) дает значение 10.68.

Почему происходит потеря точности? Запись в эту переменную из монитора SimpLight не всегда дает эффект, если не изменять значение существенно, например 10.75, или 10.88. А если ввести 11.22 - значение запишется, но в контроллере будет 11.08, например.

Ошибка обработки 4-байтных чисел с плавающей точкой? Как исправить? Нет никакого желания все готовые теги в редакторе каналов переделывать на ОРС сервер.


Image 864


Как Вы оцениваете обслуживание, которое получили?

Оценка удовлетворенности от Сергей Королев 7 лет назад

Добавьте комментарий о качестве обслуживания (необязательно):

Avatar
СИМП Лайт (тех поддержка)
  • На рассмотрении

День добрый.


Интересная проблема, потери точности не должно быть. Давайте будем разбираться в причинах. Если можно пришлите свой проект на simp@simplight.ru.

Avatar

И было бы хорошо получить лог опроса с Лектуса и нашего драйвера по этому каналу.

Avatar
Сергей Королев

Добрый день. Выслал проект и логи Lectus OPC, драйвера на simp@simplight.ru. Мнемосхема, где используется проблемная переменная (уставка расхода газа в м3/ч и л/мин), открывается по-умолчанию (ASTRA_2_0_Main_panel.msl).

Avatar
Сергей Королев

Проблема решена.

Как мне подсказали в техподдержке, адрес нужно было уменьшить на 1, а порядок байт изменить с default (BE_4_3_2_1) на LE_2_1_4_3.

Адресация в SIMPLight начинается с 0. И даже если у вас получились значения float32 на адресе +1, то, очевидно, в определенных ситуациях в десятых-сотых вы получите проблемы, как у меня.

Читайте внимательно документацию :)

Этот совет касается и меня.

Спасибо техподдержке! Оперативно и четко.