PDA

Просмотр полной версии : Температура насыщения воды



brmatvey
16.08.2021, 09:55
Здравствуйте.

Стоит задача вычислить температуру насыщения воды по давлению.

Пробежавшись по библиотекам в разделе "Библиотеки и компоненты" не нашёл нужных мне блоков, например:
1 - блока, который бы считал Тнасыщения (что было бы идеально);
2 - блока, задающего табличную функцию x-y, в которой можно было бы задать таблицу насыщенного пара;

Чтобы не писать данную функцию самому, не могли бы опытные форумчане подсказать, где у овена искать подобные функции?

Спасибо.

petera
16.08.2021, 10:40
Здравствуйте.

Стоит задача вычислить температуру насыщения воды по давлению.

Пробежавшись по библиотекам в разделе "Библиотеки и компоненты" не нашёл нужных мне блоков, например:
1 - блока, который бы считал Тнасыщения (что было бы идеально);
2 - блока, задающего табличную функцию x-y, в которой можно было бы задать таблицу насыщенного пара;

Чтобы не писать данную функцию самому, не могли бы опытные форумчане подсказать, где у овена искать подобные функции?

Спасибо.


Чтобы не писать данную функцию самому
Возьмите, например, мою https://owen.ru/forum/showthread.php?t=10555&p=220263&viewfull=1#post220263
Хотя она написана в КДС 2.3 , думаю будет работать и в 3.5

FUNCTION MyGraf_p : REAL
VAR_INPUT
IN: REAL; (*Входной сигнал*)
pt : POINTER TO ARRAY[0..99] OF Point_GR; (*Массив точек графика, не более 100 пар точек X,Y*)
size : UINT;
END_VAR
VAR
a: INT; (*Начало интервала поиска*)
b: INT; (*Конец интервала поиска*)
N: INT; (*Число точек в графике*)
i: INT;
END_VAR

N:= SHR(size,3)-1; (*Число точек в графике*)
(*Начальные значения интнрвала поиска*)
a:=0;
b:=N-1;

(*Обрезание графика для крайних точек*)
IF IN<=pt^[0].X THEN
MyGraf_p:=pt^[0].Y;
ELSIF IN>=pt^[N-1].X THEN
MyGraf_p:=pt^[N-1].Y;
(*Теперь можно начать поиск*)
ELSE
WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
i:=(a+b)/2; (*Делим интервал поиска пополам*)
IF IN=pt^[i+1].X THEN (*Может нам повезло, и мы сразу нашли точку? *)
a:=i; b:=i+1; (*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
(*мимо :( ,тогда посмотрим в какую половину интервала попали*)
ELSIF IN>pt^[i].X THEN (*Если входной сигнал больше середины интервала поиска,*)
a:=i; (*то следующий поиск будем делать начиная от середины и до конца массива*)
ELSE (*А если входной сигнал меньше середины интервала поиска,*)
b:=i; (*то следующий поиск будем делать начиная от начала и до середины массива*)
END_IF
(*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину значений
две соседние координаты X(a) и Х(а+1), меду которыми попадает входной сигнал найдем очень быстро
для 8 точек графика нужно не более 3 итераций
при 9..16 точек в графике нужно не более 4 итераций
при 17..32 точек в графике нужно не более 5 итераций
при 33..64 точек в графике нужно не более 6 итераций
при 65..128 точек в графике нужно не более 7 итераций
инфа точная - 100% ;) *)
END_WHILE
(*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
MyGraf_p:=pt^[b].Y-(pt^[b].X-IN)*(pt^[b].Y-pt^[a].Y)/(pt^[b].X-pt^[a].X);
END_IF
Пример использования - см. ссылку выше

ЗЫ.
для таблицы используется пользовательский тип данных - Point_GR

TYPE Point_GR :
STRUCT
X,Y: REAL;
END_STRUCT
END_TYPE
Максимальное кол. точек в график ограничил сотней (100). Хотя если надо можно и больше, только не знаю, где такой график может понадобиться. Если реально будет меньше точек, то в функции ничего не менять! Все само подстроится под нужный размер.