Имеется рабочая программа для погодного регулирования с точностью 0,5 градуса. Но когда контроллер поддерживает целое значение температуры теплоносителя, например 50 гр., то точность становится 1 гр.: от 49,5 до 50,5 гр. Если поддерживается, например 50,5 гр. о точность становится 0,5 гр.: от 50,25 до 50,75 гр.
Где нужно подкорректировать программу чтобы точность поддержания температуры была 0,5 гр.?
PROGRAM PLC_PRG
VAR
ind_temp: INT;
ton1,ton2: TON;
df: DECODE_FLOAT;
ust_temp: REAL;
temp_pod_i: INT;
first_start: BOOL := TRUE;
(*old_mode: INT;
old_pod_ust: INT;
old_ust_temp_z: INT;*)
temp_pod, ust_temp_f: REAL;
temp_nv: REAL;
delta: REAL;
ind_temp1: REAL;
END_VAR
VAR RETAIN
temp: ARRAY [0..78] OF REAL;
(*mode_r: INT;
pod_ust_r: INT;
ust_temp_r: INT;*)
NaprReg_r:REAL;
END_VAR
…………………………………………………………………………………………………………………………………… …………………………….
NaprReg := NaprReg_r;
IF first_start THEN
(* +8 +7.5 +7 +6.5 +6 *)
temp[0] := 35; temp[1] := 36; temp[2] := 36; temp[3] := 36; temp[4] := 36;
(* +5.5 +5 +4.5 +4 +3.5 *)
temp[5] := 36; temp[6] := 36; temp[7] := 36; temp[8] := 36; temp[9] := 36.5;
(* +3 +2.5 +2 +1.5 +1 *)
temp[10] := 37; temp[11] := 37.5; temp[12] := 38; temp[13] := 38.5; temp[14] := 39;
(* +0.5 0 -0.5 -1 -1.5 *)
temp[15] := 39.5; temp[16] := 40; temp[17] := 40.5; temp[18] := 41; temp[19] := 41.5;
(* -2 -2.5 -3 -3.5 -4 *)
temp[20] := 42; temp[21] := 42.5; temp[22] := 43; temp[23] := 43.5; temp[24] := 44;
(* -4.5 -5 -5.5 -6 -6.5 *)
temp[25] := 44.5; temp[26] := 45; temp[27] := 45.5; temp[28] := 46; temp[29] := 46.5;
(* -7 -7.5 -8 -8.5 -9 *)
temp[30] := 47; temp[31] := 47.5; temp[32] := 48; temp[33] := 48.5; temp[34] := 49;
(* -9.5 -10 -10.5 -11 -11.5 *)
temp[35] := 49; temp[36] := 49; temp[37] := 49.5; temp[38] := 50; temp[39] := 50;
(* -12 -12.5 -13 -13.5 -14 *)
temp[40] := 50; temp[41] := 50.5; temp[42] := 51; temp[43] := 51; temp[44] := 51;
(* -14.5 -15 -15.5 -16 -16.5 *)
temp[45] := 51.5; temp[46] := 52; temp[47] := 52.5; temp[48] := 53; temp[49] := 53.5;
(* -17 -17.5 -18 -18.5 -19 *)
temp[50] := 54; temp[51] := 54.5; temp[52] := 55; temp[53] := 55.5; temp[54] := 56;
(* -19.5 -20 -20.5 -21 -21.5 *)
temp[55] := 56.5; temp[56] := 57; temp[57] := 57.5; temp[58] := 58; temp[59] := 58.5;
(* -22 -22.5 -23 -23.5 -24 *)
temp[60] := 59; temp[61] := 59.5; temp[62] := 60; temp[63] := 60.5; temp[64] := 61;
(* -24.5 -25 -25.5 -26 -26.5 *)
temp[65] := 61.5; temp[66] := 62; temp[67] := 62.5; temp[68] := 63; temp[69] := 63.5;
(* -27 -27.5 -28 -28.5 -29 *)
temp[70] := 64; temp[71] := 64.5; temp[72] := 65; temp[73] := 65.5; temp[74] := 66;
(* -29.5 -30 -30.5 -31 *)
temp[75] := 66.5; temp[76] := 67; temp[77] := 67.5; temp[78] := 68;
IF NaprReg=0.0 THEN
NaprReg := 0.5;
END_IF;
first_start := FALSE;
END_IF;
df( VALUE:=temp_pod_d, DEF_VALUE:= temp_pod);
CASE df._ERR OF
12: temp_pod_s := 2000; (* кз *)
13: temp_pod_s := 2001; (*обрыв *)
6,7,8,9,10,11,14,15: temp_pod_s := 2002; (*ошибка контроллера *)
ELSE
temp_pod_s := REAL_TO_INT(df.OUT_VALUE*10);
temp_pod := temp_pod_d;
END_CASE;
df( VALUE:=temp_nv_d, DEF_VALUE:=temp_nv);
CASE df._ERR OF
12: temp_nv_s := 2000; (* кз *)
13: temp_nv_s := 2001; (*обрыв *)
6,7,8,9,10,11,14,15: temp_nv_s := 2002; (*ошибка контроллера *)
ELSE
temp_nv_s := REAL_TO_INT((df.OUT_VALUE+50.0)*10);
temp_nv := temp_nv_d;
END_CASE;
ind_temp1 := temp_nv;
ind_temp := 16 - REAL_TO_INT(ind_temp1*2);
IF ind_temp < 0 THEN
ind_temp := 0;
ELSIF ind_temp > 78 THEN
ind_temp := 78;
END_IF;
IF mode = 1 THEN
ust_temp := temp[ind_temp]+pod_ust;
ELSE
ust_temp := ust_temp_z;
END_IF;
temp_pod_i := REAL_TO_INT(temp_pod);
ust_temp_f := (ust_temp);
ton1.PT := t#10m; ton2.PT := t#10s;
ton1(in :=TRUE); ton2(in :=TRUE);
IF ton1.ET >t#30s THEN
IF (temp_pod_i >ust_temp) AND (temp_pod_s <2000) AND ((temp_nv_s<2000) OR (mode=0)) THEN
delta :=(temp_pod - ust_temp_f)/500;
NaprReg := NaprReg +delta;
IF NaprReg > 0.90 THEN NaprReg := 0.90; END_IF;
END_IF;
IF (temp_pod_i delta :=(ust_temp_f - temp_pod)/500 ;
NaprReg := NaprReg -delta;
IF NaprReg < 0.0 THEN NaprReg := 0.0; END_IF;
END_IF;
ton1(in :=FALSE);
END_IF;
NaprReg_r := NaprReg;
napr_s :=REAL_TO_INT( NaprReg *1000);
IF ton2.ET >t#400ms THEN
ton2(in :=FALSE);
ClearScreen(0);
SetWorkScreen(0);
ShowString(0,0,0,'Тнв=');
CASE temp_nv_s OF
2000: ShowString(0,4,0,'КЗ ');
2001: ShowString(0,4,0,'Обр ');
2002: ShowString(0,4,0,'Ош. ');
ELSE
ShowReal(0, 4, 0, '%3.1f',temp_nv);
END_CASE;
ShowString(0,9,0,'Тп=');
CASE temp_pod_s OF
2000: ShowString(0,12,0,'КЗ ');
2001: ShowString(0,12,0,'Обр ');
2002: ShowString(0,13,0,'Ош. ');
ELSE
ShowReal(0, 12, 0, '%3.1f',temp_pod);
END_CASE;
ShowString(0,0,1,'Uуп='); ShowReal(0, 4, 1, '%4.2f',NaprReg*10);
END_IF;
Добрый день!
Я столкнулся с проблемой такого характера…
Для начала обзора моего проекта вкратце опишу проблему.
Мы используем ПЛК 110.60-М и МУ 110 -16Р
У нас приходит сигналы с расходомеров жидкости их 12 шт. с выходной частотой около 100-200 Гц. на первых 12 входов в ПЛК
ПРИМЕР: Если мы наливаем 1литру жидкости это составляет (100 импульсов для ПЛК)
1000 : 100=10грам 10=1импульсу для ПЛК, нам нельзя терять не одного импульса, это точность налива.
ЭКСПЕРЕМЕНТ:
Прилагаю видео которое я заснял с экрана «Видео-1»
на видео видно что CUT (12шт.) и остальная программа просчитала импульсы не правильно, их количество импульсов не равномерно просчитали CTU не смотря на то что я подключил все 12 входов ПЛК на один расходомер (то есть все параллельно) но это ещё не всё
когда я подключил параллельно к ПЛК 110.60-М (цикл сканирования в Statistic 7мс) ещё ПКЛ 110.30-М для того чтоб посмотреть насколько ПЛК 110.60-М считает правильно то увидел что каждый из ПЛК вообще показывает разные значения «Фото-1»
Видать проект для ПЛК 110 тяжелый
Подскажите как мне выйти из этого положения
Вложение 23242 Вложение 23243 Вложение 23244 Вложение 23245 Вложение 23246 Вложение 23247
Имеется рабочая программа для погодного регулирования с точностью 0,5 градуса. Но когда контроллер поддерживает целое значение температуры теплоносителя, например 50 гр., то точность становится 1 гр.: от 49,5 до 50,5 гр. Если поддерживается, например 50,5 гр. о точность становится 0,5 гр.: от 50,25 до 50,75 гр.
Где нужно подкорректировать программу чтобы точность поддержания температуры была 0,5 гр.?
PROGRAM PLC_PRG
VAR
ind_temp: INT;
ton1,ton2: TON;
df: DECODE_FLOAT;
ust_temp: REAL;
temp_pod_i: INT;
first_start: BOOL := TRUE;
(*old_mode: INT;
old_pod_ust: INT;
old_ust_temp_z: INT;*)
temp_pod, ust_temp_f: REAL;
temp_nv: REAL;
delta: REAL;
ind_temp1: REAL;
END_VAR
VAR RETAIN
temp: ARRAY [0..78] OF REAL;
(*mode_r: INT;
pod_ust_r: INT;
ust_temp_r: INT;*)
NaprReg_r:REAL;
END_VAR
…………………………………………………………………………………………………………………………………… …………………………….
NaprReg := NaprReg_r;
IF first_start THEN
(* +8 +7.5 +7 +6.5 +6 *)
temp[0] := 35; temp[1] := 36; temp[2] := 36; temp[3] := 36; temp[4] := 36;
(* +5.5 +5 +4.5 +4 +3.5 *)
temp[5] := 36; temp[6] := 36; temp[7] := 36; temp[8] := 36; temp[9] := 36.5;
(* +3 +2.5 +2 +1.5 +1 *)
temp[10] := 37; temp[11] := 37.5; temp[12] := 38; temp[13] := 38.5; temp[14] := 39;
(* +0.5 0 -0.5 -1 -1.5 *)
temp[15] := 39.5; temp[16] := 40; temp[17] := 40.5; temp[18] := 41; temp[19] := 41.5;
(* -2 -2.5 -3 -3.5 -4 *)
temp[20] := 42; temp[21] := 42.5; temp[22] := 43; temp[23] := 43.5; temp[24] := 44;
(* -4.5 -5 -5.5 -6 -6.5 *)
temp[25] := 44.5; temp[26] := 45; temp[27] := 45.5; temp[28] := 46; temp[29] := 46.5;
(* -7 -7.5 -8 -8.5 -9 *)
temp[30] := 47; temp[31] := 47.5; temp[32] := 48; temp[33] := 48.5; temp[34] := 49;
(* -9.5 -10 -10.5 -11 -11.5 *)
temp[35] := 49; temp[36] := 49; temp[37] := 49.5; temp[38] := 50; temp[39] := 50;
(* -12 -12.5 -13 -13.5 -14 *)
temp[40] := 50; temp[41] := 50.5; temp[42] := 51; temp[43] := 51; temp[44] := 51;
(* -14.5 -15 -15.5 -16 -16.5 *)
temp[45] := 51.5; temp[46] := 52; temp[47] := 52.5; temp[48] := 53; temp[49] := 53.5;
(* -17 -17.5 -18 -18.5 -19 *)
temp[50] := 54; temp[51] := 54.5; temp[52] := 55; temp[53] := 55.5; temp[54] := 56;
(* -19.5 -20 -20.5 -21 -21.5 *)
temp[55] := 56.5; temp[56] := 57; temp[57] := 57.5; temp[58] := 58; temp[59] := 58.5;
(* -22 -22.5 -23 -23.5 -24 *)
temp[60] := 59; temp[61] := 59.5; temp[62] := 60; temp[63] := 60.5; temp[64] := 61;
(* -24.5 -25 -25.5 -26 -26.5 *)
temp[65] := 61.5; temp[66] := 62; temp[67] := 62.5; temp[68] := 63; temp[69] := 63.5;
(* -27 -27.5 -28 -28.5 -29 *)
temp[70] := 64; temp[71] := 64.5; temp[72] := 65; temp[73] := 65.5; temp[74] := 66;
(* -29.5 -30 -30.5 -31 *)
temp[75] := 66.5; temp[76] := 67; temp[77] := 67.5; temp[78] := 68;
IF NaprReg=0.0 THEN
NaprReg := 0.5;
END_IF;
first_start := FALSE;
END_IF;
df( VALUE:=temp_pod_d, DEF_VALUE:= temp_pod);
CASE df._ERR OF
12: temp_pod_s := 2000; (* кз *)
13: temp_pod_s := 2001; (*обрыв *)
6,7,8,9,10,11,14,15: temp_pod_s := 2002; (*ошибка контроллера *)
ELSE
temp_pod_s := REAL_TO_INT(df.OUT_VALUE*10);
temp_pod := temp_pod_d;
END_CASE;
df( VALUE:=temp_nv_d, DEF_VALUE:=temp_nv);
CASE df._ERR OF
12: temp_nv_s := 2000; (* кз *)
13: temp_nv_s := 2001; (*обрыв *)
6,7,8,9,10,11,14,15: temp_nv_s := 2002; (*ошибка контроллера *)
ELSE
temp_nv_s := REAL_TO_INT((df.OUT_VALUE+50.0)*10);
temp_nv := temp_nv_d;
END_CASE;
ind_temp1 := temp_nv;
ind_temp := 16 - REAL_TO_INT(ind_temp1*2);
IF ind_temp < 0 THEN
ind_temp := 0;
ELSIF ind_temp > 78 THEN
ind_temp := 78;
END_IF;
IF mode = 1 THEN
ust_temp := temp[ind_temp]+pod_ust;
ELSE
ust_temp := ust_temp_z;
END_IF;
temp_pod_i := REAL_TO_INT(temp_pod);
ust_temp_f := (ust_temp);
ton1.PT := t#10m; ton2.PT := t#10s;
ton1(in :=TRUE); ton2(in :=TRUE);
IF ton1.ET >t#30s THEN
IF (temp_pod_i >ust_temp) AND (temp_pod_s <2000) AND ((temp_nv_s<2000) OR (mode=0)) THEN
delta :=(temp_pod - ust_temp_f)/500;
NaprReg := NaprReg +delta;
IF NaprReg > 0.90 THEN NaprReg := 0.90; END_IF;
END_IF;
IF (temp_pod_i delta :=(ust_temp_f - temp_pod)/500 ;
NaprReg := NaprReg -delta;
IF NaprReg < 0.0 THEN NaprReg := 0.0; END_IF;
END_IF;
ton1(in :=FALSE);
END_IF;
NaprReg_r := NaprReg;
napr_s :=REAL_TO_INT( NaprReg *1000);
IF ton2.ET >t#400ms THEN
ton2(in :=FALSE);
ClearScreen(0);
SetWorkScreen(0);
ShowString(0,0,0,'Тнв=');
CASE temp_nv_s OF
2000: ShowString(0,4,0,'КЗ ');
2001: ShowString(0,4,0,'Обр ');
2002: ShowString(0,4,0,'Ош. ');
ELSE
ShowReal(0, 4, 0, '%3.1f',temp_nv);
END_CASE;
ShowString(0,9,0,'Тп=');
CASE temp_pod_s OF
2000: ShowString(0,12,0,'КЗ ');
2001: ShowString(0,12,0,'Обр ');
2002: ShowString(0,13,0,'Ош. ');
ELSE
ShowReal(0, 12, 0, '%3.1f',temp_pod);
END_CASE;
ShowString(0,0,1,'Uуп='); ShowReal(0, 4, 1, '%4.2f',NaprReg*10);
END_IF;
зачем дублировать свое сообщение, да еще в таком виде, просто проект вложить не проще или хотя бы код убрать под спойлер. А по существу Вам уже посоветовали. По коду могу предложить обратит внимание на преобразование real_to_in, оно округляет до ближайшего целого, возможно в этом причина
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
Мин вр цикла плк должно быть больше цикла сканирования в МС(у вас 1мс и 6 мс), входы 1-4 в плк 110 быстрые время фильтрации 0(попробывать 1 если импульсы от расходомеров задаются мех контактами-такое было-дребезг) как и в других (обычных входах) т.е входы должны находится в одинаковых условиях(мое мнение)..когда я подключил параллельно к ПЛК 110.60-М (цикл сканирования в Statistic 7мс)
Спасибо за ответ. Я не программист. Как необходимо исправить это выражение? Оно к тому же в двух местах. Там анализируются состояния термометров сопротивления: на улице и в трубопроводе, есть ли обрыв или кз. Но как я написал ранее если контроллер поддерживает целое значение температуры теплоносителя, например 50 гр., то точность становится 1 гр.: от 49,5 до 50,5 гр. Если поддерживается, например 50,5 гр. о точность становится 0,5 гр.: от 50,25 до 50,75 гр. Почему так происходит - непонятно.
Юра, почему ты думаешь, что если ты продублируешь свой вопрос во всех ветках форума, то быстрее получишь ответ. Если не отвечают, значит мало представлено информации, или вы не воспользовались предложенным вам хорошим советом применить ПИД регулятор.
У меня работает ПЛК 63 с этой программой.
Для начала убрать все промежуточные округления. Всё выглядит подозрительно: и таблица эта (кстати её можно инициализировать при объявлении), и REAL_TO_INTы, и какие-то тысячи с сотнями, и таймеры, которые никогда не достигают своего Q. Этот код напрашивается на неприятности.Где нужно подкорректировать программу чтобы точность поддержания температуры была 0,5 гр.?