Показано с 1 по 10 из 182

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

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #26

    По умолчанию

    Короче простых вариантов почти нет.
    По формуле 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.

Похожие темы

  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

Ваши права

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