PDA

Просмотр полной версии : Прочитать ПР-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).

EFrol
20.09.2025, 18:46
Здравствуйте можно ли как-то прочитать число в формате Double ПР-200-м?

Для чего такое значение в ПР200? Отобразить на дисплее ПР200 или выполнить вычисления?

aefimcev@yandex.ru
21.09.2025, 16:32
нужно знать расход газа, чтобы распределить нагрузку на котлы

FPavel
21.09.2025, 16:46
Может быть генерацию тепла (общую нагрузку) вычислять по другим параметрам?

Для паровых котлов - по общему расходу воды.
Для водогрейных котлов - по разности температур и заданном (или измеренном) расходе воды.

EFrol
21.09.2025, 18:57
нужно знать расход газа, чтобы распределить нагрузку на котлы

Т.е. сравнить значения друг с другом на больше/меньше?

Валенок
21.09.2025, 18:59
нужно знать расход газа, чтобы распределить нагрузку на котлы
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

melky
21.09.2025, 19:49
А прибор другими регистрами не предоставляет отдельно целое, отдельно дробное? Не смотрел описание, но в приборах часто такое встречается. Производитель бывает предусматривает, для не умеющих double.

imaex
21.09.2025, 20:56
Не смотрел описание

Так посмотри - там 10-к страниц всего. Там даже такие текущие параметры, как температура и давление в double представлены. За камим - хз, но парни явно о проблемах "индейцев" не задумывались.

melky
21.09.2025, 22:35
А действительно, почему их должны волновать проблемы ПР (индейцев), если это оборудование не предназначено для подобного.
Смотреть нет ни времени, ни желания.
Прочитать 4 регистра как Инты, выбрать целую часть, на остальное положить.

Сергей0308
21.09.2025, 23:30
А действительно, почему их должны волновать проблемы ПР (индейцев), если это оборудование не предназначено для подобного.
Смотреть нет ни времени, ни желания.
Прочитать 4 регистра как Инты, выбрать целую часть, на остальное положить.

А ПЛК 100-й серии это поддерживают?

melky
21.09.2025, 23:47
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

melky
23.09.2025, 11:47
В 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 переменных.

imaex
24.09.2025, 09:37
Может что-то типа такого?



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-ом разряде после запятой начинается.

imaex
24.09.2025, 09:59
rval = (1 + ((w4 BITAND 15)*(Pow(2,28)) + w3*(Pow(2,12)) + w2/16)/Pow(2,32))* Pow(2, eval-1023);


Так, пожалуй, правильнее. До 8-го знака совпадение.