Потеря точности при чтении Float32 в Modbus-драйвере
Переменная типа 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-байтных чисел с плавающей точкой? Как исправить? Нет никакого желания все готовые теги в редакторе каналов переделывать на ОРС сервер.
Сервис поддержки клиентов работает на платформе UserEcho
День добрый.
Интересная проблема, потери точности не должно быть. Давайте будем разбираться в причинах. Если можно пришлите свой проект на simp@simplight.ru.
И было бы хорошо получить лог опроса с Лектуса и нашего драйвера по этому каналу.
Добрый день. Выслал проект и логи Lectus OPC, драйвера на simp@simplight.ru. Мнемосхема, где используется проблемная переменная (уставка расхода газа в м3/ч и л/мин), открывается по-умолчанию (ASTRA_2_0_Main_panel.msl).
Проблема решена.
Как мне подсказали в техподдержке, адрес нужно было уменьшить на 1, а порядок байт изменить с default (BE_4_3_2_1) на LE_2_1_4_3.
Адресация в SIMPLight начинается с 0. И даже если у вас получились значения float32 на адресе +1, то, очевидно, в определенных ситуациях в десятых-сотых вы получите проблемы, как у меня.
Читайте внимательно документацию :)
Этот совет касается и меня.
Спасибо техподдержке! Оперативно и четко.