Просмотр полной версии : Прочитать ПР-200 -м число типа Double
aefimcev@yandex.ru
20.09.2025, 17:33
Здравствуйте можно ли как-то прочитать число в формате Double ПР-200-м?
kondor3000
20.09.2025, 17:38
Double это FLOAT(64) восьми байтный (или LREAL), даже если вы сможете прочитать 2 раза по 4 байта,
собрать FLOAT(64) в ПР200 не получится.
Нужен либо ПЛК2хх, либо СПК1хх (СПК2хх) либо панель с форматом Double (или LREAL).
Здравствуйте можно ли как-то прочитать число в формате Double ПР-200-м?
Для чего такое значение в ПР200? Отобразить на дисплее ПР200 или выполнить вычисления?
aefimcev@yandex.ru
21.09.2025, 16:32
нужно знать расход газа, чтобы распределить нагрузку на котлы
Может быть генерацию тепла (общую нагрузку) вычислять по другим параметрам?
Для паровых котлов - по общему расходу воды.
Для водогрейных котлов - по разности температур и заданном (или измеренном) расходе воды.
нужно знать расход газа, чтобы распределить нагрузку на котлы
Т.е. сравнить значения друг с другом на больше/меньше?
нужно знать расход газа, чтобы распределить нагрузку на котлы
double можно переделать в местный real. Естественно с потерей точности. Вопросы:
1.А нужна ли исходная точность? Или даже всё сводится к тому что спросил выше EFrol?
2.Сделать это можно или найдя энтузиастов или за бабки*. Что выберете вы?
*Т.к. элементарные действия делаемые при помощи указателей/"union"/"absolute" здесь придётся делать ректально, а это - время.
Сергей0308
21.09.2025, 19:25
Может считать значение в виде отдельных регистров и выбросив незадействованные нули, в смысле, значения расхода(что ТС хотел считать) не будут космических масштабов и размеры сократить до 32 бит, короче, надо преобразовать:
https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%B4%D0%B2%D0%BE% D0%B9%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D 0%BE%D1%81%D1%82%D0%B8#/media/%D0%A4%D0%B0%D0%B9%D0%BB:IEEE_754_Double_Floating_ Point_Format.svg
https://commons.wikimedia.org/wiki/File:IEEE_754_Double_Floating_Point_Format.svg
в
https://en.wikipedia.org/wiki/IEEE_754-1985
https://en.wikipedia.org/wiki/IEEE_754-1985#/media/File:IEEE_754_Single_Floating_Point_Format.svg
А прибор другими регистрами не предоставляет отдельно целое, отдельно дробное? Не смотрел описание, но в приборах часто такое встречается. Производитель бывает предусматривает, для не умеющих double.
Не смотрел описание
Так посмотри - там 10-к страниц всего. Там даже такие текущие параметры, как температура и давление в double представлены. За камим - хз, но парни явно о проблемах "индейцев" не задумывались.
А действительно, почему их должны волновать проблемы ПР (индейцев), если это оборудование не предназначено для подобного.
Смотреть нет ни времени, ни желания.
Прочитать 4 регистра как Инты, выбрать целую часть, на остальное положить.
Сергей0308
21.09.2025, 23:30
А действительно, почему их должны волновать проблемы ПР (индейцев), если это оборудование не предназначено для подобного.
Смотреть нет ни времени, ни желания.
Прочитать 4 регистра как Инты, выбрать целую часть, на остальное положить.
А ПЛК 100-й серии это поддерживают?
100 тоже нет, там нет LReal.
Поддерживают scada в полном объеме, на что вероятно и был расчет. Прибор как средство измерения, а не управления все таки.
Я что-то нить упустил, нафига в пр данные от расходомера? Принять какое-то решение и включить реле?
Поставить шлюзом scada туда же в котельную. Будет и средство мониторинга и выполнит необходимую задачу, будет распределять нагрузку на котлы.
Выйдет дешевле, чем напрягать мозги. Насколько ронимаю, в ST для ПР формат double не завезли, и завезут ли?
Александр Пинэко-Скворцов
23.09.2025, 11:13
Здравствуйте можно ли как-то прочитать число в формате Double ПР-200-м?
Добрый день.
DOUBLE (LREAL) в ПР и в ПЛК1хх не поддерживается.
Если прочитать из устройства число DOUBLE как два отдельных DWORD, то в ПР можно на языке ST написать функцию конвертации в REAL. Понятно, что точность будет потеряна.
Пример для числа Пи:
в DOUBLE = 3.141592653589793
в HEX = 0x400921fb54442d18
старший DWORD в десятичном виде = 1074340347
младший DWORD в десятичном виде = 1413754136
результат в REAL = 3,1415927
85881
В real (float) вроде даже целая часть меньше чем у Инта, это только если расход попадает в диапазон, тогда наверное можно кастрировать.
kondor3000
23.09.2025, 13:21
Добрый день.
DOUBLE (LREAL) в ПР и в ПЛК1хх не поддерживается.
Если прочитать из устройства число DOUBLE как два отдельных DWORD, то в ПР можно на языке ST написать функцию конвертации в REAL. Понятно, что точность будет потеряна.
Пример для числа Пи:
в DOUBLE = 3.141592653589793
в HEX = 0x400921fb54442d18
старший DWORD в десятичном виде = 1074340347
младший DWORD в десятичном виде = 1413754136
результат в REAL = 3,1415927
А где сама функция то?
Александр Пинэко-Скворцов
23.09.2025, 13:44
А где сама функция то?
Приложил.
Для тестов удобно использовать конвертер https://gregstoll.com/~gregstoll/floattohex/
FUNCTION DOUBLE_TO_REAL : REAL;
VAR_INPUT
dwHigh: UDINT;
dwLow: UDINT;
END_VAR
VAR
rSign, rExponent, rMantissa: REAL;
udiExp: UDINT;
udiMantissa: UDINT;
END_VAR
//Знак (бит 63)
rSign := 1.0;
IF dwHigh >= 2147483648 THEN
rSign := -1.0;
END_IF;
//Экспонента (биты 62-52)
// / 1048576 - сдвигаем на 20 бит вправо (1048576 = 2^20)
// MOD 2048 - берём младшие 11 бит экспоненты (2048 = 2^11)
udiExp := (dwHigh / 1048576) MOD 2048;
//Мантисса
// MOD 1048576 - берём старшие 20 бит мантиссы (1048576 = 2^20)
udiMantissa := dwHigh MOD 1048576;
// Cтаршие 20 бит мантиссы: биты 51-32
rMantissa := 1.0 + UDINT_TO_REAL(udiMantissa) / 1048576.0; // Делим на 2^20
// Младшие 32 бита: биты 31-0
rMantissa := rMantissa + UDINT_TO_REAL(dwLow) / 4503599627370496.0; // Делим на 2^52
rExponent := POW(2.0, UDINT_TO_REAL(udiExp) - 1023.0);
DOUBLE_TO_REAL := rSign * rExponent * rMantissa;
END_FUNCTION
kondor3000
23.09.2025, 14:42
Приложил.
Для тестов удобно использовать конвертер https://gregstoll.com/~gregstoll/floattohex/
Да, потери данных слишком большие для расхода, всего 8 знаков.
Наверное более правильно было, разложить в DWORD всё до запятой и в REAL, всё что после запятой. Тогда, потери были бы гораздо меньше.
И вывести на экран ПР200 тоже можно как 2 переменных.
Может что-то типа такого?
REAL FUNCTION get_dred_var(INT w1, INT w2, INT w3, INT w4)
REAL rval;
INT eval;
INT SignBit;
eval=(w4 BITAND 32752)/16;
SignBit = w4 BITAND Pow(2,15);
rval = (1 + ((w4 BITAND 15)*(Pow(2,28)) + w3*(Pow(2,12)) + w2)/Pow(2,32))* Pow(2, eval-1023);
IF SignBit = 0 THEN
RETURN rval;
ELSE
RETURN -rval;
END;
END
Только мне толком проверить не на чем, поскольку у меня REAL - это double. Но, по сравнению с 52-битной мантиссой разница в 6-ом разряде после запятой начинается.
rval = (1 + ((w4 BITAND 15)*(Pow(2,28)) + w3*(Pow(2,12)) + w2/16)/Pow(2,32))* Pow(2, eval-1023);
Так, пожалуй, правильнее. До 8-го знака совпадение.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot