Код:
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