Страница 18 из 19 ПерваяПервая ... 816171819 ПоследняяПоследняя
Показано с 171 по 180 из 184

Тема: ST функции OWEN Logic

  1. #171

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    x : array[0..24] of real :=



    <--- X[limit(0, real_to_int(температура / 5.0), 4) * 5 + limit(0, real_to_int(давление / 5.0), 4)];

    limit для целых - сами. Мож тут уже есть. Можете наизнанку limit и real_to_int. Тут же udint

    И щаc ведь начнется про апроксимацию?

    <--- Лимит(0.0, температура, 20.0) + лимит(0.0, давление, 40.0)

    Даже без массива. Но этому - соответствует. Линейно-апроксиматично
    Лимит для реал - сами
    Честно говоря, я в написании кода новичок и не особо понял что тут написано
    Почитал справку и похоже мне мог подойди массив. Но мне нужен двухмерный массив, а в ПР может быть только одномерный
    Значений очень много, вот часть таблицы которую мне надо применить2026-10-12_19-24-08.png
    Последний раз редактировалось Алексей410; 12.10.2026 в 19:26.

  2. #172

    По умолчанию

    Цитата Сообщение от Алексей410 Посмотреть сообщение
    Честно говоря, я в написании кода новичок и не особо понял что тут написано
    Почитал справку и похоже мне мог подойди массив. Но мне нужен двухмерный массив, а в ПР может быть только одномерный
    Значений очень много, вот часть таблицы которую мне надо применить2026-10-12_19-24-08.png
    Почему вы всё частями выкладываете?
    Нужно точно знать пределы температуры и давления, в каких единицах надо и сколько всего строк и столбцов, короче все таблицы.
    Последний раз редактировалось kondor3000; 12.10.2026 в 21:30.

  3. #173
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,202

    По умолчанию

    Скормите таблицу жпт, пусть подберет функцию К(Р, Т) для указанного окна с нужной точностью
    Накой массив? Не занимайтесь ерундой. Тем более что "в написании кода новичок"

    Тока причем тут код? Голимая математика 7-8 класса советской школы - по графику сделать фукцию. Ну чуть сложней - по поверхности. Со * задачка

  4. #174
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    9,942

    По умолчанию

    Может сразу формулу привести, по которой эту таблицу высчитывали?
    Любят некоторые товарищи всякие таблицы, помнится начальник тоже с таблицей носился зависимости температуры теплоносителя от температуры на улице, я сначала хотел график построить по 10 точкам путём кусочно-линейной интерполяции, потом прикинул что это практически прямая линия и выдумал подходящую функцию с точностью плюс/минус полградуса, минут десять это заняло, методом научного втыка, даже на форуме эту формулу несколько раз приводил, короче, дело было не в бобине: https://owen.ru/forum/showthread.php...l=1#post244198
    Последний раз редактировалось Сергей0308; 12.10.2026 в 22:27.
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  5. #175

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Почему вы всё частями выкладываете?
    Нужно точно знать пределы температуры и давления, в каких единицах надо и сколько всего строк и столбцов, короче все таблицы.
    Таблицу полностью не скидывал, потому что не знаю нужный мне диапазон. Хочу просто узнать, возможно ли такое провернуть.
    А задача у меня стоит такая. Есть баллон 215 литров и в него закачивается гелей, мне надо узнать количество газообразного гелия в баллоне. Вычислить это можно по формуле Скриншот-20261013-111509.jpg из ТУ 0271-135-31323949-2005, вместимость баллона(VE) я знаю, а вот коэффициент(K) вычисляют по формуле Скриншот-20261013-111822.jpg,где также есть коэффициент сжимаемости гелия(Z) при давлении и температуре(это безразмерный параметр, который показывает насколько реальный газ отклоняется от поведения идеального газа. Еще важный нюанс для гелия: из-за очень малых размеров атомов и слабого взаимодействия между ними гелий заметно отличается от идеального газа даже при умеренных давлениях и температурах. Поэтому для точных расчётов с гелием (особенно при высоких давлениях) коэффициент сжимаемости нужно учитывать отдельно). Но в ТУ 0271-135-31323949-2005 есть таблица(скрин,который я скидывал), в которой этот коэффициент известен в зависимости от давления и газа, вот я и хотел бы эти данные из таблицы взять. Но как мне это сделать в ФБ ST не понимаю, вот и думал что кто-то хоть какую то подсказку даст.

  6. #176

    По умолчанию

    Передал Вашу таблицу Google AI.
    Он предложил формулу:
    K(T, P) = 0.17984 - 0.001208*T + 0.017745*P - 0.00003173*T*P + 0.000002178*T^2
    Максимальная погрешность вычислений по этой формуле во всем диапазоне таблицы составляет менее 0.00018 (менее 0.1%).
    Код:
    function_block K
        
        var_input
            T, P : real;
        end_var
        
        var_output 
            Ret : real;
        end_var
        
        Ret := 0.17984 - 0.001208*T + 0.017745*P - 0.00003173*T*P + 0.000002178*T*T;
    
    end_function_block
    или

    Код:
    function F : real;
        
        var_input
            T, P : real;
        end_var
        
        F := 0.17984 - 0.001208*T + 0.017745*P - 0.00003173*T*P + 0.000002178*T*T;
        
    end_function
    Последний раз редактировалось EFrol; 13.10.2026 в 15:38.

  7. #177
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,202

    По умолчанию

    Ну вот. Небось еще и опечатку в таблице нашел (234K, 13.5МПа)

  8. #178

    По умолчанию

    Короче простых вариантов почти нет.
    По формуле EFrol врёт в 4 знаке после запятой, на 0.0001 - 0.0002. Из простых формул, это лучший вариант.
    Полиномы 3-4 степени врут ещё сильнеее. По крайней мере у меня так .
    Единственный более точный вариант, требует ввода табличных значений, типа такого, это только по выложенной странице
    Скрытый текст:
    Код:
    FUNCTION F_1 : REAL;
        VAR_INPUT
            T, P : REAL;
        END_VAR
    
        VAR
            Tvals: ARRAY[0..12] OF REAL; //   Температура в К
            Pvals: ARRAY[0..8]  OF REAL; //  Давление в МПа
            Kvals: ARRAY[0..116] OF REAL;
    
            i, j, idx: UDINT;
            t1, t2, p1, p2: REAL;
            k11, k12, k21, k22: REAL;
            kt1, kt2, k: REAL;
        END_VAR
    
        (* Заполняем Tvals (13 значений) *)
        Tvals[0]  := 230.0;  Tvals[1]  := 234.0;  Tvals[2]  := 238.0;
        Tvals[3]  := 242.0;  Tvals[4]  := 246.0;  Tvals[5]  := 250.0;
        Tvals[6]  := 254.0;  Tvals[7]  := 258.0;  Tvals[8]  := 262.0;
        Tvals[9]  := 266.0;  Tvals[10] := 270.0;  Tvals[11] := 272.0;
        Tvals[12] := Tvals[11];
    
        (* Заполняем Pvals (9 значений) *)
        Pvals[0] := 13.5;  Pvals[1] := 14.0;  Pvals[2] := 14.5;
        Pvals[3] := 15.0;  Pvals[4] := 15.5;  Pvals[5] := 16.0;
        Pvals[6] := 16.5;  Pvals[7] := 17.0;  Pvals[8] := 17.5;
    
        (* Заполняем Kvals (117 значений) *)
        (* Строка 0 (T=230) *)
        Kvals[0]  := 0.1581; Kvals[1]  := 0.1634; Kvals[2]  := 0.1687;
        Kvals[3]  := 0.1740; Kvals[4]  := 0.1793; Kvals[5]  := 0.1845;
        Kvals[6]  := 0.1897; Kvals[7]  := 0.1949; Kvals[8]  := 0.2000;
        (* Строка 1 (T=234) *)
        Kvals[9]  := 0.1554; Kvals[10] := 0.1609; Kvals[11] := 0.1661;
        Kvals[12] := 0.1713; Kvals[13] := 0.1765; Kvals[14] := 0.1816;
        Kvals[15] := 0.1868; Kvals[16] := 0.1919; Kvals[17] := 0.1996;
        (* Строка 2 (T=238) *)
        Kvals[18] := 0.1532; Kvals[19] := 0.1584; Kvals[20] := 0.1635;
        Kvals[21] := 0.1687; Kvals[22] := 0.1738; Kvals[23] := 0.1789;
        Kvals[24] := 0.1839; Kvals[25] := 0.1890; Kvals[26] := 0.1939;
        (* Строка 3 (T=242) *)
        Kvals[27] := 0.1508; Kvals[28] := 0.1560; Kvals[29] := 0.1611;
        Kvals[30] := 0.1661; Kvals[31] := 0.1712; Kvals[32] := 0.1762;
        Kvals[33] := 0.1812; Kvals[34] := 0.1861; Kvals[35] := 0.1911;
        (* Строка 4 (T=246) *)
        Kvals[36] := 0.1486; Kvals[37] := 0.1536; Kvals[38] := 0.1587;
        Kvals[39] := 0.1636; Kvals[40] := 0.1686; Kvals[41] := 0.1736;
        Kvals[42] := 0.1785; Kvals[43] := 0.1834; Kvals[44] := 0.1883;
        (* Строка 5 (T=250) *)
        Kvals[45] := 0.1464; Kvals[46] := 0.1514; Kvals[47] := 0.1563;
        Kvals[48] := 0.1612; Kvals[49] := 0.1662; Kvals[50] := 0.1710;
        Kvals[51] := 0.1759; Kvals[52] := 0.1807; Kvals[53] := 0.1855;
        (* Строка 6 (T=254) *)
        Kvals[54] := 0.1442; Kvals[55] := 0.1492; Kvals[56] := 0.1541;
        Kvals[57] := 0.1589; Kvals[58] := 0.1638; Kvals[59] := 0.1686;
        Kvals[60] := 0.1734; Kvals[61] := 0.1781; Kvals[62] := 0.1829;
        (* Строка 7 (T=258) *)
        Kvals[63] := 0.1422; Kvals[64] := 0.1470; Kvals[65] := 0.1518;
        Kvals[66] := 0.1567; Kvals[67] := 0.1614; Kvals[68] := 0.1662;
        Kvals[69] := 0.1709; Kvals[70] := 0.1756; Kvals[71] := 0.1803;
        (* Строка 8 (T=262) *)
        Kvals[72] := 0.1401; Kvals[73] := 0.1449; Kvals[74] := 0.1497;
        Kvals[75] := 0.1544; Kvals[76] := 0.1592; Kvals[77] := 0.1639;
        Kvals[78] := 0.1685; Kvals[79] := 0.1732; Kvals[80] := 0.1778;
        (* Строка 9 (T=266) *)
        Kvals[81] := 0.1382; Kvals[82] := 0.1429; Kvals[83] := 0.1476;
        Kvals[84] := 0.1523; Kvals[85] := 0.1570; Kvals[86] := 0.1616;
        Kvals[87] := 0.1662; Kvals[88] := 0.1708; Kvals[89] := 0.1754;
        (* Строка 10 (T=270) *)
        Kvals[90] := 0.1363; Kvals[91] := 0.1410; Kvals[92] := 0.1456;
        Kvals[93] := 0.1502; Kvals[94] := 0.1548; Kvals[95] := 0.1594;
        Kvals[96] := 0.1640; Kvals[97] := 0.1685; Kvals[98] := 0.1730;
        (* Строка 11 (T=272) *)
        Kvals[99]  := 0.1353; Kvals[100] := 0.1400; Kvals[101] := 0.1446;
        Kvals[102] := 0.1492; Kvals[103] := 0.1538; Kvals[104] := 0.1583;
        Kvals[105] := 0.1629; Kvals[106] := 0.1674; Kvals[107] := 0.1718;
        (* Дублируем последнюю строку для безопасного доступа при T=272 *)
        Kvals[108] := Kvals[99];  Kvals[109] := Kvals[100]; Kvals[110] := Kvals[101];
        Kvals[111] := Kvals[102]; Kvals[112] := Kvals[103]; Kvals[113] := Kvals[104];
        Kvals[114] := Kvals[105]; Kvals[115] := Kvals[106]; Kvals[116] := Kvals[107];
    
        (* Ограничиваем T и P пределами таблицы (clamp) *)
        IF T < Tvals[0] THEN
            T := Tvals[0];
        END_IF;
    
        IF T > Tvals[12] THEN
            T := Tvals[12];
        END_IF;
    
        IF P < Pvals[0] THEN
            P := Pvals[0];
        END_IF;
    
        IF P > Pvals[8] THEN
            P := Pvals[8];
        END_IF;
    
        (* Находим индекс i такой, что Tvals[i] <= T <= Tvals[i+1] *)
        i := 0;
        WHILE (i < 11) AND (Tvals[i + 1] < T) DO
            i := i + 1;
        END_WHILE;
    
        (* Находим индекс j такой, что Pvals[j] <= P <= Pvals[j+1] *)
        j := 0;
        WHILE (j < 7) AND (Pvals[j + 1] < P) DO
            j := j + 1;
        END_WHILE;
    
        t1 := Tvals[i];
        t2 := Tvals[i + 1];
        p1 := Pvals[j];
        p2 := Pvals[j + 1];
    
        (* Вычисляем базовый индекс в одномерном массиве Kvals *)
        idx := i * 9 + j;
    
        k11 := Kvals[idx];           (* [i, j] *)
        k12 := Kvals[idx + 1];       (* [i, j+1] *)
        k21 := Kvals[idx + 9];       (* [i+1, j] *)
        k22 := Kvals[idx + 10];      (* [i+1, j+1] *)
    
        (* Интерполяция по T при фиксированных P *)
        IF t2 = t1 THEN
            kt1 := k11;
        ELSE
            kt1 := k11 + (k21 - k11) * (T - t1) / (t2 - t1);
        END_IF;
    
        IF t2 = t1 THEN
            kt2 := k12;
        ELSE
            kt2 := k12 + (k22 - k12) * (T - t1) / (t2 - t1);
        END_IF;
    
        (* Интерполяция по P *)
        IF p2 = p1 THEN
            k := kt1;
        ELSE
            k := kt1 + (kt2 - kt1) * (P - p1) / (p2 - p1);
        END_IF;
    
        F_1 := k;
    END_FUNCTION
    Последний раз редактировалось kondor3000; 13.10.2026 в 19:38.

  9. #179
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,202

    По умолчанию

    Выглядит как жертвоприношение Брадису (При всем уважении к его трудам)
    Попросите нейронку сделать поточней и будет немного длинней формула (ну 2..3 строки) и точность уйдет в 5й знак. Но это будет все равно меньше и проще каких то массивов.

  10. #180

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Выглядит как жертвоприношение Брадису (При всем уважении к его трудам)
    Попросите нейронку сделать поточней и будет немного длинней формула (ну 2..3 строки) и точность уйдет в 5й знак. Но это будет все равно меньше и проще каких то массивов.
    Все варианты нейронки Алисы и GPT считают хуже выложенных выше. Уже с десяток проверил, врут уже на 2 знаке, вместо 4.
    Видно бесплатно не хотят работать)))
    Последний раз редактировалось kondor3000; 13.10.2026 в 20:12.

Страница 18 из 19 ПерваяПервая ... 816171819 ПоследняяПоследняя

Похожие темы

  1. Групповые запросы в Owen Logic. Что хотите видеть в этой функции?
    от EvgenyR в разделе Программируемые реле
    Ответов: 37
    Последнее сообщение: 05.07.2023, 15:26
  2. Owen Logic 2.1 нет экспорта устройства в Owen Cloud.
    от Григори в разделе Среда программирования OWEN Logic
    Ответов: 4
    Последнее сообщение: 12.10.2022, 19:33
  3. Добавление аварийных ситуаций в Owen Logic на ПР200 для отображения в Owen Cloud.
    от Григори в разделе Среда программирования OWEN Logic
    Ответов: 6
    Последнее сообщение: 07.07.2022, 11:09
  4. OWEN Logic v1.7
    от Евгений Сергеевич в разделе Программируемые реле
    Ответов: 401
    Последнее сообщение: 28.07.2016, 19:46
  5. Тригонометрические функции OWEN Logic
    от POMAXA в разделе Среда программирования OWEN Logic
    Ответов: 36
    Последнее сообщение: 13.02.2016, 12:11

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •