PDA

Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)



Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Aldonin2007
14.03.2016, 22:33
Уважаемый "Валенок", а вот Вас не затруднит разъяснить мне всё это подробней? (Ну очень хочется!!!)

Валенок
14.03.2016, 23:52
Наводим мыша на поле CFC - жмем правую клавишу
Ищем ВХОД и кладем в поле
Тоже самое - с ВЫХОД
Наводим мыша на правый кончик ножки входа и жмем левую кнопу не опуская
Тянем к левому кончику ножки ВЫХОДА
Кликаем по ??? ВЫХОДА, вбиваем Di, КДС что-то предложит, выбрать тип BOOL и согласиться
Копи ..... Eгора
Кликаем по ??? ВХОДА и пасте туда. КДС посылаем
В разделе объявлений вводишь имена типа
var_input
period_mc : word;
power_0_1 : real; (*0.0...1.0*)
и заменяешь во ВХОДЕ. Что куда - надеюсь понятно.

Всё. Рулишь var_inpiuta'ми и имеешь ШИМ на Di (ВЫХОДЕ)

Aldonin2007
15.03.2016, 11:28
Простите - не понял, в ??? входа вбиваем di := TIME_TO_DWORD(TIME()) MOD период_мс < период_мс * мощность_0_1; от Егора? Но ведь этим мы просто ВХОДу присваиваем имя переменной! А где же сидит сама программа ШИМ? И правильно ли я понимаю, что длительность ШИМ импульса зависит исключительно от величины сигнала на входе модуля? Иначе говоря если на входе, например 100% мощности от ПИД-регулятора, то длительность ШИМ-импульса будет равна длительности периода? При 10% - соответственно 1/10 от периода?

Yegor
15.03.2016, 12:47
Просто надо сразу говорить, о каком ПЛК идёт речь, а не намекать примерами. Судя по посту #4864, у вас ПЛК150 со встроенным ШИМом, параметры которого задаются в конфигураторе и для управления которым требуется только подавать значения от 0 до 65535. Поэтому если у вашего ПИД-регулятора выход от 0 до 1, то для работы ШИМа требуется умножить значение выхода на 65535. Реализовывать ШИМ вручную не требуется.

Aldonin2007
15.03.2016, 13:25
Абалдеть! А я думал, что встроенный ШИМ есть у всех ПЛК! Тогда другой вопрос: При конфигурировании ШИМ выход стал пятым. И на каком дискретном выходе его искать? И правильно ли я понимаю, что длительность ШИМ импульса зависит исключительно от величины сигнала на входе модуля? Иначе говоря если на входе, например 100% мощности от ПИД-регулятора, то длительность ШИМ-импульса будет равна длительности периода? При 10% - соответственно 1/10 от периода?

dim1987
15.03.2016, 15:25
Подскажите, иногда перестает отвечать мв110-8а. В данный момоент плк на это никак не реагирует. Как выявить, что мв110-8а отвалился?

ymnuhj
16.03.2016, 20:11
Добрый вечер.
Подскажите пожалуйста можно ли как нибудь получать имя переменной из стринговой переменной.
К примеру существует массивы data1, data2. И над ними допустим производятся одни и теже действия. Можно ли как то выбирать массив через стринговую переменную, чтоб не повторять один и тот же код для разных массивов? Что то вроде того что на рисунке 23174.

Евгений Кислов
16.03.2016, 20:36
Добрый вечер.
Подскажите пожалуйста можно ли как нибудь получать имя переменной из стринговой переменной.
К примеру существует массивы data1, data2. И над ними допустим производятся одни и теже действия. Можно ли как то выбирать массив через стринговую переменную, чтоб не повторять один и тот же код для разных массивов?23174

Может, вам проще будет так сделать?


data: ARRAY [1..2, 1..10] OF WORD;

и потом обращаться к data[i,j], где i - номер вашего массива из десяти элементов, j - номер конкретного элемента.

ООО "БЛС инжинеринг"
17.03.2016, 21:23
Кто подскажет какай лучше взять ПЛК для управления двумя шаговыми двигателями?

Вольд
17.03.2016, 23:24
Кто подскажет какай лучше взять ПЛК для управления двумя шаговыми двигателями?

А что Kinco не подошел ?

ООО "БЛС инжинеринг"
19.03.2016, 15:00
А что Kinco не подошел ?

Хочется использовать ОВЕН но Kinco из серии К5 тоже может подойти

Юра Б.
19.03.2016, 16:08
Имеется рабочая программа для погодного регулирования с точностью 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;

ООО "БЛС инжинеринг"
20.03.2016, 10:19
Добрый день!
Я столкнулся с проблемой такого характера…


Для начала обзора моего проекта вкратце опишу проблему.
Мы используем ПЛК 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

Юра Б.
20.03.2016, 10:36
Имеется рабочая программа для погодного регулирования с точностью 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;

capzap
20.03.2016, 10:48
зачем дублировать свое сообщение, да еще в таком виде, просто проект вложить не проще или хотя бы код убрать под спойлер. А по существу Вам уже посоветовали. По коду могу предложить обратит внимание на преобразование real_to_in, оно округляет до ближайшего целого, возможно в этом причина

alex55
20.03.2016, 10:49
когда я подключил параллельно к ПЛК 110.60-М (цикл сканирования в Statistic 7мс) Мин вр цикла плк должно быть больше цикла сканирования в МС(у вас 1мс и 6 мс), входы 1-4 в плк 110 быстрые время фильтрации 0(попробывать 1 если импульсы от расходомеров задаются мех контактами-такое было-дребезг) как и в других (обычных входах) т.е входы должны находится в одинаковых условиях(мое мнение)..

Юра Б.
20.03.2016, 12:29
зачем дублировать свое сообщение, да еще в таком виде, просто проект вложить не проще или хотя бы код убрать под спойлер. А по существу Вам уже посоветовали. По коду могу предложить обратит внимание на преобразование real_to_in, оно округляет до ближайшего целого, возможно в этом причина
Спасибо за ответ. Я не программист. Как необходимо исправить это выражение? Оно к тому же в двух местах. Там анализируются состояния термометров сопротивления: на улице и в трубопроводе, есть ли обрыв или кз. Но как я написал ранее если контроллер поддерживает целое значение температуры теплоносителя, например 50 гр., то точность становится 1 гр.: от 49,5 до 50,5 гр. Если поддерживается, например 50,5 гр. о точность становится 0,5 гр.: от 50,25 до 50,75 гр. Почему так происходит - непонятно.

Василий Кашуба
20.03.2016, 12:33
Юра, почему ты думаешь, что если ты продублируешь свой вопрос во всех ветках форума, то быстрее получишь ответ. Если не отвечают, значит мало представлено информации, или вы не воспользовались предложенным вам хорошим советом применить ПИД регулятор.

Юра Б.
20.03.2016, 12:35
У меня работает ПЛК 63 с этой программой.

Yegor
20.03.2016, 15:48
Где нужно подкорректировать программу чтобы точность поддержания температуры была 0,5 гр.?Для начала убрать все промежуточные округления. Всё выглядит подозрительно: и таблица эта (кстати её можно инициализировать при объявлении), и REAL_TO_INTы, и какие-то тысячи с сотнями, и таймеры, которые никогда не достигают своего Q. Этот код напрашивается на неприятности.

Юра Б.
20.03.2016, 16:24
Для начала убрать все промежуточные округления. Всё выглядит подозрительно: и таблица эта (кстати её можно инициализировать при объявлении), и REAL_TO_INTы, и какие-то тысячи с сотнями, и таймеры, которые никогда не достигают своего Q. Этот код напрашивается на неприятности.

Все таймеры нужны.

Валенок
20.03.2016, 21:07
Юрий, то что это работает - уже сами сказали в первом посте
"Имеется рабочая программа...Но когда контроллер поддерживает..."
То что 63й - видно из кода
"ShowString... ShowReal.."
То что "таймеры нужны" - так они объявлены и как-то используются.
Здесь не тупые сидят - выводы делать умеют.

Вы бы объяснили сами сначала
1.Конечную цель проекта
2.Cуть своего регулятора
3.Объяснили чем он круче пид'а. Особенно на фоне вопроса о точности

Валенок
20.03.2016, 21:17
http://www.owen.ru/forum/showthread.php?t=10555&page=489

Юра Б.
20.03.2016, 21:28
Когда контроллер поддерживает целое значение температуры теплоносителя, например 50 гр., то точность становится 1 гр.: от 49,5 до 50,5 гр. Если поддерживается, например 50,5 гр. о точность становится 0,5 гр.: от 50,25 до 50,75 гр.
Где нужно подкорректировать программу чтобы точность поддержания температуры была 0,5 гр. для целых значений температур?

Юра Б.
20.03.2016, 21:30
Когда контроллер поддерживает целое значение температуры теплоносителя, например 50 гр., то точность становится 1 гр.: от 49,5 до 50,5 гр. Если поддерживается, например 50,5 гр. о точность становится 0,5 гр.: от 50,25 до 50,75 гр.
Где нужно подкорректировать программу чтобы точность поддержания температуры была 0,5 гр. для целых значений температур?

capzap
20.03.2016, 21:45
Когда контроллер поддерживает целое значение температуры теплоносителя, например 50 гр., то точность становится 1 гр.: от 49,5 до 50,5 гр. Если поддерживается, например 50,5 гр. о точность становится 0,5 гр.: от 50,25 до 50,75 гр.
Где нужно подкорректировать программу чтобы точность поддержания температуры была 0,5 гр. для целых значений температур?

ну и который раз Вам сказать что округление значения 50, будет пятьдесят, а 50,5 округлив будет 51, поэтому остальная арифметика будет давать разные результаты, вот Вы и наблюдаете в одном месте градус, в другом полградуса

Юра Б.
20.03.2016, 22:15
ну и который раз Вам сказать что округление значения 50, будет пятьдесят, а 50,5 округлив будет 51, поэтому остальная арифметика будет давать разные результаты, вот Вы и наблюдаете в одном месте градус, в другом полградуса
50,5 гр. поддерживается в диапозоне от 50,25 до 50,75 гр = 0,5 гр.
50 гр. поддерживается в диапозоне от 49,5 до 50,5 гр = 1 гр.
Так где же нужно исправить?

Валенок
20.03.2016, 22:51
Видите ли Юрий, автоматчики народ ленивый, и при словах "погода, темп-ра, регулировать" они чаще всего берут с полки пид,
что бы все нормально регулировалось и не мешало пить пиво.
А у него (пид'а) вопрос с точностью вообще не стоит. Просто 0. Если конечно коэфф-ты подобрали ))

Вы ж не объяснили как оно работает, "поддерживается ..." это не принцип, а результат.
Предлагаете другим изучать странный и неизвестный алгоритм, который вряд ли когда потребуется ?

PS
Пжста, не надо одну и ту же тему в 10-ти местах.

krollcbas
21.03.2016, 01:44
И на разных форумах по автоматике тоже не надо, все мы - одна шайка-лейка.
У меня был Заказчик, который за 50т вынудил меня два месяца отжиматься, но хоть мало, да все таки деньги)
Вы судя по всему ищете бесплатного решения. Ошибаюсь?
Юрий, на чужих плечах в Рай Вы вряд ли уедете.

Zik
22.03.2016, 20:28
Доброго времени суток обитателям форума. Нужна помощь. Не знаю, в какую ветку мне обратиться, поэтому оставлю свой небольшой вопрос здесь. Начинаю программировать в среде Codesys V2, на языке ST, на данном этапе мне нужно создать цикл, повторяющийся около сотни раз, и содержащий в себе таймер - задержку на каждое действие, поступающее на выход. Иными словами, код имеет вид while i<100 do {(действие); Tim1(in:=true, pt:=T#3s);}.
Возникает проблема при компиляции. 1. Если счетчик произвольно инкременируется раз в цикл, все 100 циклов завершаются быстрее, чем заканчивает работу первый таймер. 2. Если счетчику присваивается значение только после завершения работы таймера (по выходному значению Q), срабатывает сторожевой таймер, сигналит, что цикл слишком длинный. Как возможно реализовать задержку во времени в цикле, какие есть еще способы? Буду рад любым советам.

Владимир Ситников
22.03.2016, 20:37
while i<100
Циклы while и for используются _только_ для того, чтобы перебрать N опрашиваемых устройств/кранов/лампочек/кнопок и т.п.
Во всех остальных случаях (== в 99.99% программ) циклов while/for быть вообще не должно.

krollcbas
22.03.2016, 21:00
Zik, попробуйте оператор CASE
сделайте их столько, сколько Вам нужно
В каждом из них сделайте нужный Вам таймер

Может быть я и неправильно написал, но сложно понять Ваш текст, если Вы не описываете её как внешнюю задачу.
В ПЛК крайне не желательно использовать Wile&For эти операторы я в ПЛК использую, когда мне нужны манипуляции с массивами и структурами. ПЛК и Windows очень отличаются, в ПЛК Вы с легкостью подвесите процессор.
В общем - действуйте еще аккуратнее)

Zik
22.03.2016, 22:32
Спасибо за советы, попробую завтра с CASE. Непривычно довольно отказываться от циклов со счетчиком, не знал, что они так плохо воспринимаются средой.

RV9WFJ
23.03.2016, 04:01
Дело не в том что они средой не так воспринимаются, а в том что время общего цикла в ПЛК условно фиксировано и если вы в него не уложились то получили собаку. Поэтому вам надо поверх того цикла организовать свой при помощи оператора CASE. В нем в первом шаге что-то делаете (действие одно-го из ваших 100 циклов, взводите таймер и переходите во втррой шаг CASE. Во втором шаге просто проверяем таймер и если он отсчитал положенное возвращаемся в первый шаг CASE.

Zik
23.03.2016, 10:17
Попробовал вставить цикл только лишь для чередования между двумя case-блоками, в одном из которых таймер, а в другом по подверждению от таймера переход обратно к первому шагу. Происходит та же ошибка, что и без использования блоков -срабатывание сторожевого таймера. Возможно ли как-то реализовать их чередование без использования циклов? Ведь после проверки значения переменной условия case, повторная проверка возможна только при повторении всего кода, выходит. Схематично программу выложил здесь. https://ideone.com/hC38bK

petera
23.03.2016, 11:22
Попробовал вставить цикл только лишь для чередования между двумя case-блоками, в одном из которых таймер, а в другом по подверждению от таймера переход обратно к первому шагу. Происходит та же ошибка, что и без использования блоков -срабатывание сторожевого таймера. Возможно ли как-то реализовать их чередование без использования циклов? Ведь после проверки значения переменной условия case, повторная проверка возможна только при повторении всего кода, выходит. Схематично программу выложил здесь. https://ideone.com/hC38bK
А что изменилось?
Вы в цикл WHILE еще и CASE засунули:rolleyes:

Zik
23.03.2016, 11:29
Case нужен, так как по логике таймер не должен заканчивать отсчет позже,чем завершается программа. Только в итоге для плк ничего не изменилось. А while тут только для чередования блоков, без цикла выполняется только один из них, как перейти после выполнения второго к первому шагу case, например?

Николаев Андрей
23.03.2016, 11:43
Case нужен, так как по логике таймер не должен заканчивать отсчет позже,чем завершается программа. Только в итоге для плк ничего не изменилось. А while тут только для чередования блоков, без цикла выполняется только один из них, как перейти после выполнения второго к первому шагу case, например?

Опишите пожалуйста задачу.
Мне кажется Вы совершаете классическую ошибку программиста верхнего уровня и не учитываете особенности работы ПЛК. В частности того, что ПЛК в принципе работает в цикле сам по себе. Цикл уже организован в ПЛК :)
Любой другой цикл существует только для проверки условия ну или для зацикливания ПЛК, что приводит к перезагрузке.

petera
23.03.2016, 11:44
Вот я и говорю, что с точки зрения ПЛК ничего не изменилось, как был цикл WHILE так он и остался.
В ПЛК вся программа выполняется циклически без участия программиста, время цикла задается в настройках(в конфигурации). Вы не можете ее "притормозить" - сработает сторожевой таймер.
По этому вместо WHILE используйте IF с тем же условием.

Zik
23.03.2016, 11:56
Опишите пожалуйста задачу.
Мне кажется Вы совершаете классическую ошибку программиста верхнего уровня и не учитываете особенности работы ПЛК. В частности того, что ПЛК в принципе работает в цикле сам по себе. Цикл уже организован в ПЛК

В общем-то, задача - цикл испытаний, который должен повториться сто раз. В нем мотор крутится три секунды в одну сторону, три секунды ждет, потом три секунды крутится в другую. Пишу для PLC 100 R-M. Понимаю, как это реализовать несколькими способами, но натыкаюсь на сопротивление как раз таки архитектуры ПЛК. Когда я запускаю программу без цикла в режиме эмуляции CodeSYS - она выполняется один раз с начала и до конца. Отсчитывает один раз таймер, присваивает конечные значения локальным переменным, и останавливается, не мигают выходы, не присваиваются начальные значения для нового цикла. То же самое при подключении ПЛК, т.е. уже не в режиме эмуляции, код проходит один раз. Поэтому для наглядности, которая нужна работодателю, листинг должен быть зацикленным. Будет ли программа с блоками case идти на второй круг после выполнения, если не добавлять в нее циклы вручную, и главное, как это проверить? И именно на сотом ПЛК. Я в полном смятении.

Николаев Андрей
23.03.2016, 12:39
Не архитектура ПЛК Вам мешает, а накопленный за годы багаж знаний и опыт. :)
ПЛК работает по другому. Напишите в проекте:
a:=a+1; И Вы увидите, что a будет постоянно инкриментироваться, пока не переполнится. Это и есть внутернний цикл ПЛК.
Программа выполняется сверху вниз, записываются результаты, считывается область входов-выходов, и программа снова выполняется сверху вниз.
Таймеры не надо отслеживать - таймеры отследятся сами при очередном проходе.
Единственно для чего Вам нужен цикл - отключить работу логики когда условия выполнятся 100 раз.
Для организации выполнения условия циклы не нужны. Я обычно использовал обыкновенный If
Проще всего Вашу задачу вообще реализовать на SFC. Три блока, три условия перехода, три таймера. При выходе из последнего блока инкриментируем количество прошедших циклов.

Zik
23.03.2016, 12:51
a:=a+1; И Вы увидите, что a будет постоянно инкриментироваться, пока не переполнится. Это и есть внутернний цикл ПЛК.

Попробовал, действительно так. Сбило с толку, что логические значения переменным не переприсваивались в цикле для дальнейшего присваивания выходу. Попробую реализовать все без внутренних программных циклов, в общем. Спасибо за подсказки!

Zik
23.03.2016, 13:15
А как повторить таймер-то без цикла? Даже функция Tim(IN:=TRUE, PT:=T#2S); без привязки к входным и выходным параметрам, выполнится только 1 раз и программа остановится, хотя согласно логике плк должна повторяться.

petera
23.03.2016, 13:19
PROGRAM PLC_PRG
VAR
Aout: BOOL;
Bout: BOOL;
Start: BOOL;
Tim: TON:=(PT:=T#3S);
X: INT;
L: INT;
R_TRIG1: R_TRIG;
END_VAR


R_TRIG1(CLK:=Ain , Q=>Start );
IF Start THEN X:=1; END_IF

IF L<100 AND Ain THEN

Tim(IN:= NOT Tim.Q );
CASE X OF
1: Aout:=TRUE; X:=X+BOOL_TO_INT(Tim.Q);
2: Aout:=FALSE; X:=X+BOOL_TO_INT(Tim.Q);
3: Bout:=TRUE; X:=X+BOOL_TO_INT(Tim.Q);
4: Bout:=FALSE; X:=X+BOOL_TO_INT(Tim.Q);
5: L:=L+1; X:=1;
END_CASE
ELSE
X:=0;
L:=0;
Aout:=FALSE;
Bout:=FALSE;
Tim(IN:= FALSE );
END_IF
Как-то так.
ЗЫ.

А как повторить таймер-то без цикла? Даже функция Tim(IN:=TRUE, PT:=T#2S); без привязки к входным и выходным параметрам, выполнится только 1 раз и программа остановится, хотя согласно логике плк должна повторяться.
Таймер-то через 2с нужно перезапустить по входу IN.
23336
У меня в примере так - Tim(IN:= NOT Tim.Q ), т.е. он сам себя перезапускает.

Zik
23.03.2016, 13:20
Как-то так.
Ох. Сейчас буду разбираться, спасибо. Кое-что новое в коде для меня есть.

petera
23.03.2016, 13:42
Ох. Сейчас буду разбираться, спасибо. Кое-что новое в коде для меня есть.
В примере не объявлена переменная Ain: BOOL;, предполагал, что это вход ПЛК, т.е. глобальная переменная

Zik
23.03.2016, 14:41
это вход ПЛК, т.е. глобальная переменная
Да, именно так.

Zik
23.03.2016, 14:43
У меня в примере так - Tim(IN:= NOT Tim.Q ), т.е. он сам себя перезапускает.
Вот за наводку благодарен, крайне полезно мне будет. Спасибо за развернутый ответ, в целом.

Sanchez72
27.03.2016, 00:07
Уважемые форумчане, вопрос по грамотной реализации задачи:

Дано:
20 емкостей требуется в них поддерживать темературу и давление согласно графика по 10 точками из HMI

на входе данные:
датчики температуры + датчики давления
график температуры + давления от HMI на каждую емкость
время и дата старта процесса на каждую емкость
статусы емкости: емкость выключена, ручное управление, поддержание по графику

на выходе:
магнитные дискретные клапана подачи охлаждающей жижи и клапан сброса давления

условие:
Графики по 10 точкам , точность почасовая
Температура и давление уставки на каджый момент должны расчитываться по графику между двумя точками, почасово.

Формат данных:
температура -5 до +40 градусов, точность 0,1
давление 0 до 3 бара, точность 0,1 бара



Я вижу реализацию этого так:
В плк160 выступает сервером, создаем слэйв
Создаем карту регистров , допустим 2 байтных

Для каждой емкости регистры
1: статус : емкость выключена, ручное управление, поддержание по графику
2: дата-время старта процесса в часах от 0000 года
3-13: с 0 по 10 точку графика время
14-24: с 0 по 10 точку графика температуры
25-35: с 0 по 10 точку графика время
36-46: с 0 по 10 точку графика давления
47: положение клапана температуры
48: положение клапана давления
49: текущая уставка расчетная Температуры
50: текущая уставка расчетная Давления

итого 20 емкостей х 50 данных = 1 000 разных данных !!!


Это все ручками прописывать в codesys 2.3 в Конфигурации ПЛК и создавать 1000 регистров ?

Или создавать двухмерный массив в VAR_GLOBAL на 20 х 50 ячеек INT задать каждой ячейке ссылку на адрес AT %.... и уже потом работать с ним, ?
или массив для сохранности от выключения питания помещать в VAR_GLOBAL RETAIN ?

типо:

AR1: ARRAY [1..20,1..50] OF INT := AT %QD8.1.0 , AT %QD8.2.0, AT %QD8.3.0 .... и тд

В "конфигурации задач" создаю новую задачу с интервалом в 1 час, у которой добавляю вызов программы, в которой делаю перебор массива по 20 емкостям, и для тех емкостей у которых статус "поддержание по графику" , делаем расчет на текущий момент значение уставки исходя из данных в массиве.

Прописываем эту новую уставку в ячейку массива связанную с памятью, и используем этот регистр для поддержания температуры и для того чтоб мониторить в HMI


Далее в цикле программа которая по гистерезису и тек измеренному значению рулит клапанами с учетом уставки.


Ну и вроде все)))

ну и главное ПЛК160 потянет вообще такую нагрузку ?



Вот такие вопросы от новичка . Писать на ST видимо )

Спасибо заранее

Yegor
27.03.2016, 15:27
Это все ручками прописывать в codesys 2.3 в Конфигурации ПЛК и создавать 1000 регистров ? Можно обойтись и 51 точкой, из которых 50 это названные параметры, а 1 - номер ёмкости. Сильно зависит от способностей вашего HMI на самом деле.
AR1: ARRAY [1..20,1..50] OF INT := AT %QD8.1.0 , AT %QD8.2.0, AT %QD8.3.0 .... и тдТак нельзя. Можно проще: объявить указатель на массив и направить его на область слейва, если не ссыкотно. AR1: POINTER TO ARRAY [1..50] OF TANK; AR1 := ADR(%...) или типа того. TANK - структура с вашими данными (так удобнее ведь).

RV9WFJ
28.03.2016, 03:58
Нечего там бояться, именно по такой схеме и делаю всегда. Все работает. В ПЛК160 обязательно новую прошивку. С 2.14 работать не будет после ресета.

capzap
28.03.2016, 06:12
Уважемые форумчане, вопрос по грамотной реализации задачи:
...
Спасибо заранее
Вы бы еще объяснили сразу, чтоб отвечающие могли понимать что конкретно нужно. Вы же не собираетесь постоянно в эти регистры что то записывать, настроили параметры одной бочки перешли к другой, возможно больше не понадобится менять параметры, ну и т.д.
Исходя из этого задача резко сокращается до записи параметров, только на один объект плюсом номер этого объекта, чтоб знать кому принадлежат параметры и плюсом сигнал для сохранения параметров

Sanchez72
28.03.2016, 15:14
Вы бы еще объяснили сразу, чтоб отвечающие могли понимать что конкретно нужно. Вы же не собираетесь постоянно в эти регистры что то записывать, настроили параметры одной бочки перешли к другой, возможно больше не понадобится менять параметры, ну и т.д.
Исходя из этого задача резко сокращается до записи параметров, только на один объект плюсом номер этого объекта, чтоб знать кому принадлежат параметры и плюсом сигнал для сохранения параметров

В регистры задается рецепт, рецепт это просто графики температуры и давления от времени.
И дата начала и окончания процесса.
И режим: вкл, ручной, по рецепту.
Каждый раз может быть разный рецепт.
Нужно иногда менять на ходу рецепт-график оперативно с HMI
Есть вероятность что будет 2 HMI

Sanchez72
28.03.2016, 15:21
Можно обойтись и 51 точкой, из которых 50 это названные параметры, а 1 - номер ёмкости. Сильно зависит от способностей вашего HMI на самом деле.Так нельзя. Можно проще: объявить указатель на массив и направить его на область слейва, если не ссыкотно. AR1: POINTER TO ARRAY [1..50] OF TANK; AR1 := ADR(%...) или типа того. TANK - структура с вашими данными (так удобнее ведь).

Я не совсем понял. Нам нужно чтоб ПЛК сам глядя в свои регистры которые выставляются и коректируются с HMI , делал дальнейшее действие.

"TANK структура с данными" они все INT, смысл в структуре ?

Так а нельзя сделать как я предлагал с сылками на память или типо того:
AR1: ARRAY [1..20,1..50] OF INT := AT %QD8.1.0 , AT %QD8.2.0, AT %QD8.3.0 .... и тд

Sanchez72
28.03.2016, 15:22
Нечего там бояться, именно по такой схеме и делаю всегда. Все работает. В ПЛК160 обязательно новую прошивку. С 2.14 работать не будет после ресета.

По какой схеме ? Так "AR1: ARRAY [1..20,1..50] OF INT := AT %QD8.1.0 , AT %QD8.2.0, AT %QD8.3.0 .... и тд" или как ?

ООО "БЛС инжинеринг"
03.04.2016, 11:44
Здравствуйте!
Есть деловое предложение.
Необходимо написать программку для ПЛК110.60 управление преобразователем частоты Omron MX2 по Modbas RTU https://drive.google.com/open?id=0B8lXnV9ObKUEbEdodi14dXdlb2c
Пишите в личку, договоримся.

ООО "БЛС инжинеринг"
03.04.2016, 12:55
Здравствуйте!
Есть деловое предложение.
Необходимо написать программку для ПЛК110.60 управление преобразователем частоты Omron MX2 по Modbas RTU https://drive.google.com/open?id=0B8lXnV9ObKUEbEdodi14dXdlb2c
Пишите в личку, договоримся.

Сколько сталкивался с каким то вопросами некоторые предлагали услуги за вознаграждение а когда я предлагаю реальною работёнку за вознаграждение таких уже нету....

Валенок
03.04.2016, 16:21
предлагаю реальною работёнку за вознаграждение таких уже нету
Напрягает:
-Термин - "работёнка", когда 50 стр. вдумчивого изучения
-Вы здесь не новичок - и не смогли связаться через штатного мастера ? Это - не беда, но
-На первой же странице ограничения адреса 1..32 - звоночек 1.
-Далее там есть объяснялки как работает модбас - звоночек 2.

Звоночки - признаки того, что у них возможно не модбас, а по мотивам модбас
Само по себе это не страшно, но зачастую для этого нужно прибор положить на стол в спокойной обстановке для выяснения отклонений и выработки микстуры. Бывает 1 минута, бывает 3 дня.
После победного применения микстуры, на ПНР, оказывается что эта микстура - только при работе в сети ОДНОГО прибора, а для нормальной работы более 1-ого в сети нужно сгенерить другую.
И это только связь - а дальше бывают такие форматы данных что кучу функций нужно напилить.

Бывают приборы - подключился и поехал. И у кетайцев и у эуропейцев и у наших.
А бывает все выше перечисленное. И у кетайцев и у эуропейцев и у наших...


Необходимо написать программку
Программку написать не проблема )) А если вышеперечисленное ? Тогда как честному жентельмену придецца на Вас женицца в виде экскурсии в Калугу (не КТЗ ?) - ведь репутация..

PS
Посмотрел что написал - и ужаснулся.

ООО "БЛС инжинеринг"
03.04.2016, 20:07
Напрягает:
-Термин - "работёнка", когда 50 стр. вдумчивого изучения
-Вы здесь не новичок - и не смогли связаться через штатного мастера ? Это - не беда, но
-На первой же странице ограничения адреса 1..32 - звоночек 1.
-Далее там есть объяснялки как работает модбас - звоночек 2.

Звоночки - признаки того, что у них возможно не модбас, а по мотивам модбас
Само по себе это не страшно, но зачастую для этого нужно прибор положить на стол в спокойной обстановке для выяснения отклонений и выработки микстуры. Бывает 1 минута, бывает 3 дня.
После победного применения микстуры, на ПНР, оказывается что эта микстура - только при работе в сети ОДНОГО прибора, а для нормальной работы более 1-ого в сети нужно сгенерить другую.
И это только связь - а дальше бывают такие форматы данных что кучу функций нужно напилить.

Бывают приборы - подключился и поехал. И у кетайцев и у эуропейцев и у наших.
А бывает все выше перечисленное. И у кетайцев и у эуропейцев и у наших...

Программку написать не проблема )) А если вышеперечисленное ? Тогда как честному жентельмену придецца на Вас женицца в виде экскурсии в Калугу (не КТЗ ?) - ведь репутация..

PS
Посмотрел что написал - и ужаснулся.

Да я понимаю что это тяжело но ведь делают.
Нет не КТЗ:)
Видать не судьба, как открыл тему так и закрыл её

Андрей555
04.04.2016, 07:10
Первый раз в кодесис пишу. Столкнулся с проблемой. Редактор думает несколько минут прежде чем сохранить, несколько минут при загрузке программы, несколько минут при включении эмуляции... а программа написана только примерно на 1/3. Использую режим программирования, который выглядит как привычный мне овенлогик.
Что можно сделать, чтобы укорить работу?

Yegor
04.04.2016, 08:25
Выложить проект сюда, чтобы было о чём говорить.

Валенок
04.04.2016, 08:26
По какой схеме ?
см п#4913....

Андрей555
04.04.2016, 08:44
На вс. случай повторю вопрос.))

Первый раз в кодесис пишу. Столкнулся с проблемой. Редактор думает несколько минут прежде чем сохранить, несколько минут при загрузке программы, несколько минут при включении эмуляции... а программа написана только примерно на 1/3. Использую режим программирования, который выглядит как привычный мне овенлогик.
Что можно сделать, чтобы укорить работу?

Для ПЛК 110.

krollcbas
04.04.2016, 09:01
Тоже минуты три открывалось.

Это либо не заработает, либо эксплуатация вывихнет мозг.
Код необходимо структурировать!
Не использовать ссылки

Андрей555
04.04.2016, 09:14
подробнее про "структурировать" и "ссылки" если можно.))

krollcbas
04.04.2016, 09:28
Если взять к примеру жилой дом.
У него три подъезда
В каждом - 40 квартир
В каждой - две комнаты
В каждой комнате - два жильца и кот

23612

Андрей555
04.04.2016, 09:43
Когда-то писал в аналогичном редакторе для сименса. Там была запрещена такая штуковина как рекурсия, т.е. когда выход блока соединялся со входом и сделать это было возможно только через промежуточные переменные. Может у меня аналогичная проблема? Я сейчас просто с принципиальной электрической схемы передираю алгоритм с помощью привычных АND и OR и "рекурсий" там полно. например схема включения реле с "самоподхватом" ))

Вольд
04.04.2016, 10:30
На вс. случай повторю вопрос.))

Первый раз в кодесис пишу. Столкнулся с проблемой. Редактор думает несколько минут прежде чем сохранить, несколько минут при загрузке программы, несколько минут при включении эмуляции... а программа написана только примерно на 1/3. Использую режим программирования, который выглядит как привычный мне овенлогик.
Что можно сделать, чтобы укорить работу?

Для ПЛК 110.

Ну ты и намудил. Первый раз такое чудо вижу. ;)

capzap
04.04.2016, 10:36
Ну ты и намудил. Первый раз такое чудо вижу. ;)

:) я уже час сижу, всего то 47 ошибок, ни как вычистить не могу, действительно долго


ЗЫ устранил ошибки теперь открывается за 5 секунд, ну чтоб нескучать автору перевел всё в FBD :)

Андрей555
04.04.2016, 19:28
Интересно но непонятно.)))) Что за ошибки?

Спасибо за ответы!

Andrew_Stranger
04.04.2016, 23:04
А зачем два раза сигнал инвертировать?

Андрей555
05.04.2016, 03:42
)))) Это чтобы прицепить соединительную линию. Только для этого. Потом, при отладке, разумеется такое предполагалось удалить. Повторю, что первый раз с кодесис дело имею. До этого только в сименс лого и овен логик программы рисовал и таких загадочных казусов не возникало. Выше написал хороший человек, потративший час своего времени на исправление, что 47 ошибок. Что за ошибки? На какие грабли я наступил?

"Ну ты и намудил. Первый раз такое чудо вижу."

Черновик же! Не дорисованный и на половину, и не "причёсанный". Нечему удивляться. )))))

capzap
05.04.2016, 06:56
нажимаете F11 и в окне вывода листаете до красных строк, двойной клик отправит на место ошибки, а текст ошибки объяснит в чем причина

Андрей555
05.04.2016, 08:08
Спасибо всем, особенно capzap! )) Разобрался почему кодесис тормозил. Не были заданы переменные. Похоже, что программа пыталась генерировать их автоматически и по мере усложнения это занимало у неё всё больше времени, в геометрической прогрессии, пока не дошло до минут.

Ziyatdinov
05.04.2016, 18:09
Здравствуйте.

НАчинаю осваивать Codesys. В наличии ПЛК304, МВ110-8АС, МВУ8. Есть ли пример работы с этими утройствами?

31kip
07.04.2016, 14:12
Добрый день! Помогите пожалуйста новичку. Пишу программу для управления котлом на газовом топливе на базе ПЛК-73, дошел до управления горением и уперся в выбор ФБ пид регулятора, их такое количество и разнообразие что глаза разбегаются. Наверняка кто-то сталкивался и может подсказать реально работающий. Назначение этого блока - управление исполнительным механизмом воздушной заслонки по заданной температуре(возможно, в перспективе, от температуры наружнего воздуха по погозависимому графику). Воздушная заслонка с газовой связаны механически, соответственно регулирования соотношения газ/воздух по средствам ПЛК отсутствует. Хотелось бы в регуляторе видеть задание времени хода заслонки и преждевременное остановку для избежания превышения температуры на выходе из котла.

karnagh777
12.04.2016, 07:35
Можете пожалуйста пошагово описать как сделать плк63 один мастером,а второй плк63 слейвом, и какие библиотеки использовать для того чтобы опрашивать по rs485. Если не сложно на языке CFC. Форум посмотрел не очень все понял.

kolyan
12.04.2016, 09:56
Добрый день! Помогите пожалуйста новичку. Пишу программу для управления котлом на газовом топливе на базе ПЛК-73, дошел до управления горением и уперся в выбор ФБ пид регулятора, их такое количество и разнообразие что глаза разбегаются. Наверняка кто-то сталкивался и может подсказать реально работающий. Назначение этого блока - управление исполнительным механизмом воздушной заслонки по заданной температуре(возможно, в перспективе, от температуры наружнего воздуха по погозависимому графику). Воздушная заслонка с газовой связаны механически, соответственно регулирования соотношения газ/воздух по средствам ПЛК отсутствует. Хотелось бы в регуляторе видеть задание времени хода заслонки и преждевременное остановку для избежания превышения температуры на выходе из котла.

А жаль, что никто не откликнулся...
Тема - то актуальная и серьёзная.

RV9WFJ
13.04.2016, 08:50
А жаль, что никто не откликнулся...
Тема - то актуальная и серьёзная.
Все очень просто, они все в основе одинаковые. Формулу еще никто не изменил. Вопрос только в точности интегрирования и противоударные заморочки при смене с ручного на ПИД и т.д. Одним словом каждому свой лучший. Для себя я в результате долгих выборов написал свой на основе UTIL.lib и OSCAT. Сейчас веду работы по разработке автонастройки, тут все намного сложнее. Каждый производитель пытается всячески скрыть свой алгоритм.

P.S. Вот можете мой ПИД посмотреть https://yadi.sk/d/BsRvvVrlnA6SL

krollcbas
13.04.2016, 09:04
Я вот попытался раскрыть алгоритм автонастройки (http://lapshinvr.ru/avtotyuning.html), даже таки работающий, так же на базе обычного PID из UTIL, однако всякого рода народ, не имеющие какого-либо желания разбираться, ну или платить - стали злобно дербанить мое скромное творение.
Тратя мое время на расспросы, как будто я им сильно должен.

Регулирование котла с газом, довольно ответственное занятие. Рвануть может.

31kip
14.04.2016, 09:18
Все очень просто, они все в основе одинаковые. Формулу еще никто не изменил. Вопрос только в точности интегрирования и противоударные заморочки при смене с ручного на ПИД и т.д. Одним словом каждому свой лучший. Для себя я в результате долгих выборов написал свой на основе UTIL.lib и OSCAT. Сейчас веду работы по разработке автонастройки, тут все намного сложнее. Каждый производитель пытается всячески скрыть свой алгоритм.

P.S. Вот можете мой ПИД посмотреть https://yadi.sk/d/BsRvvVrlnA6SL

Все правильно, вопрос именно в точности регулирования для конкретной системы, в данном случаи котла. Вот я и хотел узнать кто чем регулирует на реальных объектах, а не в симуляторе.

31kip
14.04.2016, 09:25
Я вот попытался раскрыть алгоритм автонастройки (http://lapshinvr.ru/avtotyuning.html), даже таки работающий, так же на базе обычного PID из UTIL, однако всякого рода народ, не имеющие какого-либо желания разбираться, ну или платить - стали злобно дербанить мое скромное творение.
Тратя мое время на расспросы, как будто я им сильно должен.

Регулирование котла с газом, довольно ответственное занятие. Рвануть может.

Хотелось бы заметить про "рвануть может", 99% взрывов и хлопков происходят при розжиге котла, а при регулировании максимальный риск-это отклонение параметров, для этого есть несколько ступеней защиты по различным параметрам как рабочие так и аварийные. Я считаю что автоматизация любого технологического процесса несет в себе не малую ответственность.

Василий Кашуба
14.04.2016, 20:54
Все правильно, вопрос именно в точности регулирования для конкретной системы, в данном случаи котла. Вот я и хотел узнать кто чем регулирует на реальных объектах, а не в симуляторе.
Я запускал котёл с газовой модуляционной горелкой, она регулировалась ТРМ12. Температуру на выходе из котла держала +/- 0,5 гр., и это при ступенчатом подключении нагрузки (по очереди подключали новые контура, по мере прогревания уже подключённых).

Игоррь
14.04.2016, 21:25
Добрый вечер, скажите, как у данных типа Real получить значение только с двумя знаками после запятой. Сейчас от МВ110 получаю показания температуры с разным количеством цифр после запятой, а нужно округление до второго знака после запятой? функциональные блоки дают возможность преобразовать в значения без сотых.

Василий Кашуба
14.04.2016, 21:33
Добрый вечер, скажите, как у данных типа Real получить значение только с двумя знаками после запятой. Сейчас от МВ110 получаю показания температуры с разным количеством цифр после запятой, а нужно округление до второго знака после запятой? функциональные блоки дают возможность преобразовать в значения без сотых.
Сначала, полученное значение Real умножаете на 100, потом преобразуете в WORD и снова в Real, потом делишь на 100.

Игоррь
14.04.2016, 23:34
Спасибо, Василий, работает, столько преобразований..., думал есть какой ни будь функциональный блок в какой ни будь библиотеке. Хотя можно и самому в макрос собрать или в блок. Одного в наглядности не хватает - иногда десятые пропадают (когда значение так сходится) и когда, например, 21,50, а выводится 21,5, а так, все работает. Спасибо еще раз.

Возвращаясь к вопросу - а можно как ни будь работать с дробными числами, но не с плавающей точкой, ну, чтоб фиксированное число знаков после запятой. Такого типа данных вроде нет, а другими методами, ни кто не реализовал возможность?

Yegor
15.04.2016, 09:52
Если речь о визуализации, то просто задайте формат %.2f

23901

ASo
15.04.2016, 09:57
Спасибо, Василий, работает, столько преобразований..., думал есть какой ни будь функциональный блок в какой ни будь библиотеке. Хотя можно и самому в макрос собрать или в блок. Одного в наглядности не хватает - иногда десятые пропадают (когда значение так сходится) и когда, например, 21,50, а выводится 21,5, а так, все работает. Спасибо еще раз.

Возвращаясь к вопросу - а можно как ни будь работать с дробными числами, но не с плавающей точкой, ну, чтоб фиксированное число знаков после запятой. Такого типа данных вроде нет, а другими методами, ни кто не реализовал возможность?Установите в настройках модуля 2 знака после запятой и считывайте регистр, где будет целое число в сотых долях. Это правильней и быстрей.

Игоррь
15.04.2016, 10:16
ASo, это Вы о чем, в конфигураторе МВ110 этого нет, есть смещение десятичной точки, но это не то, в нижней и верхней границы стоит значение с тремя нулями после запятой, но изменить нельзя, в ПЛК вообще REAL ведет себя, с его плавающей точкой, как захочет.

Yegor, может Вы и правы, не морочиться с переменной, а искать возможность в ее визуализации. Сейчас распаковал СП307, буду смотреть ее возможности по отображению переменных разного формата, может там будет возможность из Реал, перевести в фиксированное значение с сотыми долями.

Р.СИ. Хотя вариант с сотыми долями в переменной самого блока МВ110 (как ASo говорил) был бы еще лучше в программной обработке на ПЛК на мой взгляд...

приборист
15.04.2016, 10:39
ASo, это Вы о чем, в конфигураторе МВ110 этого нет, есть смещение десятичной точки, но это не то, в нижней и верхней границы стоит значение с тремя нулями после запятой, но изменить нельзя, в ПЛК вообще REAL ведет себя, с его плавающей точкой, как захочет.

Yegor, может Вы и правы, не морочиться с переменной, а искать возможность в ее визуализации. Сейчас распаковал СП307, буду смотреть ее возможности по отображению переменных разного формата, может там будет возможность из Реал, перевести в фиксированное значение с сотыми долями.

Р.СИ. Хотя вариант с сотыми долями в переменной самого блока МВ110 (как ASo говорил) был бы еще лучше в программной обработке на ПЛК на мой взгляд...


ASo все верно советует.
В модуле настраиваете запятые, считываете word.
Word отправляете в панель,а в панеле лишь указываете количество знаков до и после запятой.
Но это при условии что значения не слишком большие.

Игоррь
15.04.2016, 10:51
Приборист, спасибо, правда я только учусь, не смог найти возможность считать в ВОРД, ведь я Модбасе добавляю под элемент Реал инпут модуле и эта переменная принимается с плавающей точкой, разве есть другой вариант?

capzap
15.04.2016, 10:54
Приборист, спасибо, правда я только учусь, не смог найти возможность считать в ВОРД, ведь я Модбасе добавляю под элемент Реал инпут модуле и эта переменная принимается с плавающей точкой, разве есть другой вариант?

документацию на модуль перечитайте, не обязательно искать только вещественные числа

Yegor
15.04.2016, 10:59
не морочиться с переменной, а искать возможность в ее визуализацииГде именно у вас выводится 21,5 вместо 21,50? Потому что если не в визуализации, то число нулей справа не имеет совершенно никакого значения для конечного пользователя.

Игоррь
15.04.2016, 11:14
Проверил, не работает, у МВ110 три регистра с измеренными значениями каждого канала, регистры разной величины, корректно считывается только из "последнего" (по документации) с адресом первого канала 288 с данными чтения Float_32, другие регистры этого же, например первого, канала - 264 и 256 дают белебирдовые значения. Что я не понял, как по другому снять данные в Ворд. К стати, и, смещение десятичной точки работает только на эти два регистра, а на третий, который ПЛК принимает, нет, там данные всегда с тремя знаками после запятой. (все настраиваю и смотрю показания в конфигураторе МВ110), да, и, задаю, как про документации, верхнюю и нижнюю границу целыми числами (от0 до 100), а сохраняется в настройках канала все равно с тремя знаками за запятой.

ПИ.СИ. Наверно понял ошибку, данные тех двух регистров ИНТ, а я читаю как РЕАЛ, надо по модбасу другой вариант считывания искать.

capzap
15.04.2016, 11:20
Проверил, не работает, у МВ110 три регистра с измеренными значениями каждого канала, регистры разной величины, корректно считывается только из "последнего" (по документации) с адресом первого канала 288 с данными чтения Float_32, другие регистры этого же, например первого, канала - 264 и 256 дают белебирдовые значения. Что я не понял, как по другому снять данные в Ворд. К стати, и, смещение десятичной точки работает только на эти два регистра, а на третий, который ПЛК принимает, нет, там данные всегда с тремя знаками после запятой. (все настраиваю и смотрю показания в конфигураторе МВ110)
так потавте в конфигураторе плк не real input modulr, а регистр, тогда и и примите 16битные значения

Игоррь
15.04.2016, 11:23
Yegor, пока я вижу их как переменные в кодисис, но эти значения пойдут и на панель оператора, и будут использованы в программе, на основе этих данных будут рассчитываться ШИМ.

Игоррь
15.04.2016, 11:37
Все правильно, не догнал, что можно по модбас использовать и другие подэлементы. В примере было написано СОЗДАТЬ РЕАЛ, ну думал, что это единственный вариант, большое спасибо, теперь как белый день все ясно.

petera
15.04.2016, 11:40
Yegor, пока я вижу их как переменные в кодисис, но эти значения пойдут и на панель оператора, и будут использованы в программе, на основе этих данных будут рассчитываться ШИМ.
Про значения для панели см. здесь http://www.owen.ru/forum/showthread.php?t=23794&p=205351&viewfull=1#post205351

Yegor
15.04.2016, 13:03
пока я вижу их как переменные в кодисисОтображение в кодесисе никак не связано и не влияет на отображение на какой-нибудь панели. Вот на ней (на панели) и будете округлять/подрезать/наращивать.

Игоррь
16.04.2016, 17:45
Спасибо Petera, а не подскажите, пробую панель СП307, в ее примерах, при добавлении подэлементов в Модбасе, в примере запись выглядит так:
8 bits (*BOOL (0x0)*)[VAR]
и в панели мы используем видимую в ПЛК адресацию регистра - 0x0. Другие подэлементы тоже в примере создаются с адресами - 4х1, 4х2. Я же, когда создаю подэлемент он выгладит так: 8 bits [VAR]. Где, в этом случае мне определиться с адресом создаваемого подэлемента?
В документации, которую описываю, написано, что более подробно об распределении адресов написано в РЭ на ПЛК, в РЭ на ПЛК об этом нет и слова. Где читать, как понять адресацию?

Евгений Кислов
16.04.2016, 18:19
Спасибо Petera, а не подскажите, пробую панель СП307, в ее примерах, при добавлении подэлементов в Модбасе, в примере запись выглядит так:
8 bits (*BOOL (0x0)*)[VAR]
и в панели мы используем видимую в ПЛК адресацию регистра - 0x0. Другие подэлементы тоже в примере создаются с адресами - 4х1, 4х2. Я же, когда создаю подэлемент он выгладит так: 8 bits [VAR]. Где, в этом случае мне определиться с адресом создаваемого подэлемента?
В документации, которую описываю, написано, что более подробно об распределении адресов написано в РЭ на ПЛК, в РЭ на ПЛК об этом нет и слова. Где читать, как понять адресацию?

Про адресацию достаточно понимать, что она ведется с нуля и зависит от типа элементов, к которым идет обращение.

Предположим, вы добавили 8 bits. Соответственно, они получили адреса 0x0, 0x1 ... 0x7. Если вы следом добавите еще 8 bits, то они получат адреса 0x8 ... 0x15. А если после этого вы еще добавите 2 Byte (т.е. WORD), то он получит адрес 4x1 - поскольку нулевой регистр занят двумя элементами 8 bits (регистр занимает 16 бит).

Возможно, совсем понятно станет, если взглянуть на рисунок уважаемого Petera:
http://www.owen.ru/forum/attachment.php?attachmentid=14955&d=1414419860

petera
16.04.2016, 19:10
Спасибо Petera, а не подскажите, пробую панель СП307, в ее примерах, при добавлении подэлементов в Модбасе, в примере запись выглядит так:
8 bits (*BOOL (0x0)*)[VAR]
и в панели мы используем видимую в ПЛК адресацию регистра - 0x0. Другие подэлементы тоже в примере создаются с адресами - 4х1, 4х2. Я же, когда создаю подэлемент он выгладит так: 8 bits [VAR]. Где, в этом случае мне определиться с адресом создаваемого подэлемента?
В документации, которую описываю, написано, что более подробно об распределении адресов написано в РЭ на ПЛК, в РЭ на ПЛК об этом нет и слова. Где читать, как понять адресацию?
Для начала хотя бы немного ознакомьтесь с Modbus https://sites.google.com/site/fieldbusbook/seti/modbus/modbuseducation
Есть четыре области данных,
0х.. -биты доступные для чтения/записи
1х.. -биты доступные только для чтения
3х.. -регистры доступные только для чтения
4х.. -регистры доступные для чтения/записи
В панели элементы имеют в начале адреса ссылку на эти области
битовые на 0х или 1х
23916

регистровые на 4х, 3х
23917

В конфигурации ПЛК модули
8bits создают восемь последовательных бит в областях 0х или 1х
2byte создают один регистр в области 4х или 3х (в панели тип данных Word)
4byte создают два последовательных регистра в области 4х или 3х (в панели тип данных DWord)
Float создают два последовательных регистра в области 4х или 3х (в панели тип данных DWord)

Однако для ПЛК ОВЕН области 0х, 1х, 3х, 4х накладываются на одно адресное пространство. Поэтому выше сказанное для модуля 8bits довольно условно и по большому счету используется только для удобства программирования ПЛК по тому, что
23920
здесь вместо двух модулей 8bits можно было поставить один 2byte и панель при адресации 0х0...0х15 обращалась бы к разрядам 0...15 модуля 2byte
Маленькая шпаргалка

http://www.owen.ru/forum/attachment.php?attachmentid=12345&d=1395648726
При определении адресов для переменных в дереве конфигурации не забываем про выравнивание, переменные размером 8 бит, 2 байта и 4 байта будут располагаться только по определенным адресам.Адрес в памяти ПЛК( первый столбец шпаргалки) 4-байтной переменной будет кратен 4, 2-байтной –кратен 2, а однобайтной (или 8 бит) – кратен 1 и может находиться в любой точке пространства памяти.
Из-за выравнивания возможно появление незанятого пространства.

ЗЫ. Рисунок в шпаргалке не мой, я уже не помню у кого я его позаимствовал, но автору респект http://www.owen.ru/forum/attachment.php?attachmentid=19860&d=1441788809

Игоррь
16.04.2016, 22:34
А если несколько сетевых подключений, по АйПи, моббас Мастер и Модбас Слейв, адресация будет распределяться сверху в низ, не зависимо где какой и для каких устройств? И, почему опять же на Вашем примере (выше шпаргалки) на скриншоте опять же присутствуют адреса в скобках, а в других случаях, как и у меня в конфигурации, ее нет?

(Если, что, звините за тупые вопросы)

petera
17.04.2016, 00:11
А если несколько сетевых подключений, по АйПи, моббас Мастер и Модбас Слейв, адресация будет распределяться сверху в низ, не зависимо где какой и для каких устройств? И, почему опять же на Вашем примере (выше шпаргалки) на скриншоте опять же присутствуют адреса в скобках, а в других случаях, как и у меня в конфигурации, ее нет?

(Если, что, звините за тупые вопросы)
На моем примере я указал адреса специально для Вас, напишите себе сами и у Вас тоже будет.:)

https://www.youtube.com/watch?v=vJCKCa9ghmQ

А причем здесь Master? Мы же рассматривали распределение адресов ВНУТРИ ПЛК, а модуль Master обращается к областям в ДРУГОМ, внешнем устройстве.
Если будете делать несколько слейвов, то зависит от их расположения
В общем случае адресация в них не пересекается, т.е. не является продолжением друг друга
23923

Хотя бывает нужно сделать доступ к регистрам ПЛК из разных мест, тогда можно сделать несколько портов в одном слейве.
23924

Есть и другой вариант слейв в слейве http://www.owen.ru/forum/showthread.php?t=14199&p=146969&viewfull=1#post146969
Эти варианты удобно применять, когда нужен доступ к регистрам ПЛК из разных мест, например с панели и SCADA, или из нескольких панелей.

Игоррь
17.04.2016, 01:18
За тупость извинился, надо было самому попробовать, что ни будь вписать в поле комментарий.)
По адресации вроде как понятно, значит каждый слейв будет начинаться со "своего" нуля. Просто у меня пока не получилось с панели увидеть данные ПЛК, но скорее сам ошибся, сдвинулся в нумерации, завтра перезалью перепроверив.

ПиСи.Уже яснея. А еще для ясности: мастер обращается к регистрам другого устройства, но ведь данные того устройства уже в ПЛК и имеют имя переменной. Почему я не могу это имя переменной использовать в слейве, а только через присвоения нового имени в ПОУ. Почему эту переменную, с этм же именем не предоставить другому мастеру по слейв, а только через выделение нового имени переменной.
Может опять глупый вопрос, но это из-за недостатка еще понимания.

karnagh777
19.04.2016, 05:50
Можете пожалуйста пошагово описать как сделать плк63 один мастером,а второй плк63 слейвом, и какие библиотеки использовать для того чтобы опрашивать по rs485. Если не сложно на языке CFC. Форум посмотрел не очень все понял.

Lihoj
23.04.2016, 23:21
Как поменять кодировку программы 24129

Валенок
24.04.2016, 01:45
проект/опции/редактор/шрифт/анимация - кириллица

Lihoj
24.04.2016, 06:37
проект/опции/редактор/шрифт/анимация - кириллица

Спасибо! Все верно!

waro88
25.04.2016, 09:56
Доброе утро, можно ли использовать модем ПМ01 совместно с контроллерами других производителей, к примеру с S7-1200 / LOGO! ?

RV9WFJ
26.04.2016, 05:02
Тема конечно не про модем. Да можно, более того, можете искать в интернете команды и т.д для SIM900 и это будет справедливо для ПМ01.

31kip
26.04.2016, 13:33
Добрый день, подскажите пожалуйста ПЛК-73 на экране отображается меня в 2 строки:
Меню ПЛК73

Ветка.
При пролистывании есть все пункты меню. правильно ли я понимаю что должно отображаться вот так(так как экран 4х строчный):
Меню ПЛК73

Ветка
Ветка
Ветка
Если я все правильно понимаю, то как этого добиться.

Kolya_povar
26.04.2016, 13:37
Здравствуйте, коллеги, проблема следующая: не могу связать ПЛК 110-32 RM с драйвером шагового двигателя OSM- 42 RA. В программе ModbusTerminal получается менять частоту, силу тока и т.д., а программно с ПЛК не могу. Может есть примеры реализации?

Newcomer
26.04.2016, 15:03
Здравствуйте, коллеги, проблема следующая: не могу связать ПЛК 110-32 RM с драйвером шагового двигателя OSM- 42 RA. В программе ModbusTerminal получается менять частоту, силу тока и т.д., а программно с ПЛК не могу. Может есть примеры реализации?

OSM-42RA - это не драйвер, а контроллер шагового двигателя.

Kolya_povar
26.04.2016, 15:43
Извините, это не особо по существу.
Всё равно я его подключаю в режиме контроллера. Может тогда подскажите с чтением\записью регистров.

Валенок
26.04.2016, 16:50
правильно ли я понимаю что должно отображаться вот так..
Неправильно. Штатное дерево меню как и в 63-ем - 2х строчное

Валенок
26.04.2016, 16:51
Может тогда подскажите с чтением\записью регистров.
Лехко. Их нужно читать и писать.

Newcomer
26.04.2016, 18:09
Извините, это не особо по существу.

Не скажи. Как корабль назовешь так он и поплывет. Правильно назовешь, правильно поплывет и наоборот. ;)

Эдуард_Н
27.04.2016, 11:31
Подскажите ОВЕНовские таргеты и библиотеки будут работать в CODESYS версии 2.3.9.50 ?

31kip
28.04.2016, 09:20
Неправильно. Штатное дерево меню как и в 63-ем - 2х строчное
Спасибо)))

Андрей555
01.05.2016, 17:20
ПЛК110, редактор CFC
1. Есть ли в эмуляторе возможность эмулировать RETAIN? Если есть, то как пользоваться эмулятором, чтобы увидеть?
2. Нужно сохранить состояние SR триггера при выключении контроллера. Правильно ли я делаю когда просто ставлю галочку в пункте RETAIN в окошке при объявлении переменной?

Андрей555
01.05.2016, 22:43
Вопрос снят.)) http://www.owen.ru/forum/showthread.php?t=2985&p=15904&viewfull=1#post15904

Арс
06.05.2016, 15:16
Добрый день, скачал версию 2.11 target файла, установил. Открываю ПЛК Браузер, набираю PLCInfo, в строке need target, до сих пор стоит 2.10 . Пробовал установить в ручную, а автоматическую установку. Подскажите пожалуйста в чем может быть причина?

RV9WFJ
07.05.2016, 05:40
Видимо в том, что вы смотрите не вашу версию таргета, а минимальную которая будет работать с текущей прошивкой вашего ПЛК :-)

Арс
07.05.2016, 06:29
Видимо в том, что вы смотрите не вашу версию таргета, а минимальную которая будет работать с текущей прошивкой вашего ПЛК :-)

При обновлении прошивки плк, на 2.15.8, было написано минимальная версия таргет 2.11
Прошивка обновилась, а таргет не установливается

ООО "БЛС инжинеринг"
07.05.2016, 13:52
Подскажите как мне можно реализовать управление шаговым двигателем, то есть какой использовать генератор импульсов чтобы давал до 10кГц?

IVM
07.05.2016, 18:52
Подскажите как мне можно реализовать управление шаговым двигателем, то есть какой использовать генератор импульсов чтобы давал до 10кГц?

Проще всего взять контроллер ШД с управлением по RS-485 или специализированный ПЛК. Иначе намучаешься.

ООО "БЛС инжинеринг"
07.05.2016, 21:10
Проще всего взять контроллер ШД с управлением по RS-485 или специализированный ПЛК. Иначе намучаешься.

Нет этот вариант отпадает не подходит,
пробовали и уже столько перелопатили таких контроллеров...
это оборудование для нанесения этикетки на тару, (бутылки канистры и т.п.)

Так всё таки какой мне генератор нужен?

IVM
08.05.2016, 11:19
Нет этот вариант отпадает не подходит,
пробовали и уже столько перелопатили таких контроллеров...
это оборудование для нанесения этикетки на тару, (бутылки канистры и т.п.)

Так всё таки какой мне генератор нужен?

Опиши свою задачу и поясни кратко как ты собираешься управлять ШД.

Panalexfix
08.05.2016, 12:28
Доброго времени суток!!!
Столкнулся с проблемой подключения плк 110-60м и кодесис 2.3. Мне достался б/у плк и хотелось бы к нему подключится но параметров связи ни по скорости, ни по IP у меня нет. Можно ли его скинуть на заводские настройки и как это сделать?
Заранее спасибо!

Yegor
08.05.2016, 12:59
Не знаю насчёт сброса, но дебаговые порты на одной и той же скорости работают - гляньте в документации. Дальше чтобы восстановить настройки эзернета, удалите файл address.dat (или посмотрите его содержимое).

Panalexfix
08.05.2016, 14:18
Спасибо разобрался!

Panalexfix
10.05.2016, 11:49
Подскажите!!! Как в основной программе PLC_PRG запускать другие PRG по кнопке (bool)?

Panalexfix
10.05.2016, 11:59
Подскажите!!! Как в основной программе PLC_PRG запускать другие PRG по кнопке (bool)?

Разобрался спасибо ГУГЛУ))))

Komando
10.05.2016, 14:06
Подскажите пожалуйста начинающему есть ли в codesys функция Scale и unscale, если нет как её создать не могу сигнал с датчика 4-20мА преобразовать в 0-6bar!!!

ivydy
10.05.2016, 14:56
здравствуйте. Имеется ПР200 с ПР-ИП485 и панель Weintek 8050iE. Не могу настроить связь по модбасу между ними. Панель-мастер, ПР200-слейв. Выставляю настройки 19200-8-none-1. В чем может быть причина? Необходимо ли наличие терминального резистора? Заранее спасибо.

capzap
10.05.2016, 15:11
здравствуйте. Имеется ПР200 с ПР-ИП485 и панель Weintek 8050iE. Не могу настроить связь по модбасу между ними. Панель-мастер, ПР200-слейв. Выставляю настройки 19200-8-none-1. В чем может быть причина? Необходимо ли наличие терминального резистора? Заранее спасибо.

по подробнее можно что такое ПР-ИП485, может это http://www.owen.ru/catalog/modul_interfejsnij_pr_mi485/opisanie, в любом случае зачем он вобще применительно к ПР200?

ivydy
10.05.2016, 15:29
по подробнее можно что такое ПР-ИП485, может это http://www.owen.ru/catalog/modul_interfejsnij_pr_mi485/opisanie, в любом случае зачем он вобще применительно к ПР200?

Это встроенная в реле интерфейсная плата RS-485

Yegor
10.05.2016, 19:32
Подскажите пожалуйста начинающему есть ли в codesys функция Scale и unscale, если нет как её создать не могу сигнал с датчика 4-20мА преобразовать в 0-6bar!!!В общем случае библиотека util.lib (http://www.owen.ru/catalog/codesys_v2/67395347), функциональный блок LIN_TRAFO.

Komando
10.05.2016, 21:07
В общем случае библиотека util.lib (http://www.owen.ru/catalog/codesys_v2/67395347), функциональный блок LIN_TRAFO.

Спасибо огромное

Yrik74
11.05.2016, 08:04
Доброго дня.
Помогите разобраться, необходимо периодически менять коэффициент трансформации тока в МЭ110 по модбас через ПЛК, для применения и сохранения настроек необходимо в регистр 0&#215;007C записывать 0&#215;0081 ( применить и
сохранить настройки в энергонезависимую память) После применения и сохранения значение этого параметра станет 0&#215;0000.
Вопрос. Что это за 0&#215;0081, как записать данное значение?

petera
11.05.2016, 10:06
Доброго дня.
Помогите разобраться, необходимо периодически менять коэффициент трансформации тока в МЭ110 по модбас через ПЛК, для применения и сохранения настроек необходимо в регистр 0&#215;007C записывать 0&#215;0081 ( применить и
сохранить настройки в энергонезависимую память) После применения и сохранения значение этого параметра станет 0&#215;0000.
Вопрос. Что это за 0&#215;0081, как записать данное значение?

Перевожу
значение 0&#215;0081=129
регистр 0&#215;007C=124

Yrik74
11.05.2016, 12:46
Спасибо, я как-то так и думал, но не был уверен:confused:

Александр067
13.05.2016, 04:48
Здравствуйте,помогите разобраться есть датчик тока выдающий аналоговый сигнал 4-20mA подключенный к ПЛК 160. В конфигурации я указал тип датчика и диапазон. В онлайн режиме в конфигурации входов я вижу что он показывает значение (например 1 Ампер) а также я создал визуализацию шкалу с этой переменной и она также показывает данные, но в POU эта переменная всегда равна нулю хотя я её задал через системные переменные тип REAL. Как вывести значение переменной ?

Panalexfix
13.05.2016, 09:43
Подскажите как прочитать один байт целиком из регистра в CDS 2.3? Стоит задача:

считать состояние терминала, 6 байт, младший в третьем регистре.

он принимает следующие значения

0 - меню

1- калибровка

2 - ожидание

3 - дозирование грубо 1-ого компонента

4 - пауза 1-ого компонента

5 - импульса 1-ого компонент

6 - дозирование грубо 2-ого компонента

7 - пауза 2-ого компонента

8 - импульса 2-ого компонент

9 - дозирование грубо 3-ого компонента

10 - пауза 4-ого компонента

11 - импульса 5-ого компонент

12 - вес ушел

13 - окончание выгрузки (успокоение системы)

14 - выгрузка

15 - ошибка - превышен НПВ

petera
13.05.2016, 10:01
Здравствуйте,помогите разобраться есть датчик тока выдающий аналоговый сигнал 4-20mA подключенный к ПЛК 160. В конфигурации я указал тип датчика и диапазон. В онлайн режиме в конфигурации входов я вижу что он показывает значение (например 1 Ампер) а также я создал визуализацию шкалу с этой переменной и она также показывает данные, но в POU эта переменная всегда равна нулю хотя я её задал через системные переменные тип REAL. Как вывести значение переменной ?
Не делать этого "я её задал через системные переменные тип REAL."

capzap
13.05.2016, 10:20
о как, petera знает, что такое системные переменные в плк, можно поподробнее, с картинками, как Вы любите

pavelmas
13.05.2016, 14:48
Здравствуйте,помогите пожалуйста. При подключении сп307 к плк110 возникает ситуация. при подачи импульса на вход плк на экране панели меняется состояние кнопки и программа запускается, а при нажатии этой же кнопки на экране панели, ПЛК никак не реагирует.

petera
13.05.2016, 15:06
Здравствуйте,помогите пожалуйста. При подключении сп307 к плк110 возникает ситуация. при подачи импульса на вход плк на экране панели меняется состояние кнопки и программа запускается, а при нажатии этой же кнопки на экране панели, ПЛК никак не реагирует.
А разве должен реагировать?

pavelmas
13.05.2016, 16:51
А разве должен реагировать?

Да, а то как мне с панели запустить программу в ПЛК или остановить её.

Александр067
14.05.2016, 11:06
Не делать этого "я её задал через системные переменные тип REAL."

А как нужно задавать переменную чтобы отображалось реальное значение в программе ?
Вот она в конфигурации ПЛК, значение отображается :
24453
Вот визуализация ;
24454
А вот в программе равна нулю;
24455

Эдуард_Н
14.05.2016, 13:50
вроде там этого не должно быть?(помечено кружком)

Александр067
14.05.2016, 14:44
вроде там этого не должно быть?(помечено кружком)
УРАААА!!! Появилось СПАСИБО БОЛЬШОЕ !!!
Еще хотел узнать можно ли в программе делать запись показаний аналогового сигнала (в виде графика например) на контроллере ПЛК 160.

RV9WFJ
15.05.2016, 06:55
В контроллере можно почти все, только вот ваша постановка задачи ставит в тупик.
Если речь об архивировании значения то ПЛК160 не позволяет делать глубоких архивов в силу возникновения проблем при записи в момент пропадания питания. С этой проблемой можно бороться, но если ваш уровень программирования слабоват то лучше МСД200 поставьте.

petera
15.05.2016, 12:55
В контроллере можно почти все, только вот ваша постановка задачи ставит в тупик.
Если речь об архивировании значения то ПЛК160 не позволяет делать глубоких архивов в силу возникновения проблем при записи в момент пропадания питания. С этой проблемой можно бороться, но если ваш уровень программирования слабоват то лучше МСД200 поставьте.
Речь идет не об архивировании, а о графиках.

УРАААА!!! Появилось СПАСИБО БОЛЬШОЕ !!!
Еще хотел узнать можно ли в программе делать запись показаний аналогового сигнала (в виде графика например) на контроллере ПЛК 160.
В среде используйте в визуализации элемент "Тренд"
24463

24464

Stalker46k
18.05.2016, 11:22
Писал небольшую программку, решил проэмулировать, не хочет срабатывать таймер TON. В чем может быть проблема?

24505

capzap
18.05.2016, 12:17
Писал небольшую программку, решил проэмулировать, не хочет срабатывать таймер TON. В чем может быть проблема?

F5 не нажали

Stalker46k
18.05.2016, 12:22
F5 не нажали
Ну зачем же вы так, нажимал и отжимал, не помогает.
24506

capzap
18.05.2016, 12:26
в таком случае выложите скрин всего окна КДс, чтоб это было видно
К тому же нет ясности откуда эти переменные для включения таймера, они могут подсвечиваться и в неработающем коде, поэтому нужен целый проект, чтоб назвать причину ошибки

Stalker46k
18.05.2016, 12:36
Все, разобрался. Я зачем то в метке прописывал адрес %MX0.0.0, переписал на %MX0.0 и все заработало.

vongot
20.05.2016, 22:02
Как реализовать мигание лампы перед отключением? Есть лампочка, показывающая статус(1) в течении некоторого времени, перед переходом в (0) надо сделать мигание за 35 секнд до отключения, ковырять blink или можно проще сделать как-то?

Yegor
21.05.2016, 08:08
Мигать-то не проблема:
лампочка := вкл_постоянно OR (вкл_мигать AND (TIME_TO_UDINT(TIME()) MOD 500) > 250);Проблема - знать будущее: "перед отключением", "за 35 секнд до отключения". Тут бы правильнее говорить о том, что что-то выключается спустя 35 секунд мигания лампочки. Ну то есть вы сами должны перевести "вкл_мигать" в TRUE и "вкл_постоянно" в FALSE; нет и не может быть функциональных блоков, которые бы знали наперёд, что через 35 секунд что-то выключится.

Eugene.A
21.05.2016, 08:34
нет и не может быть функциональных блоков, которые бы знали наперёд, что через 35 секунд что-то выключится.
Тут вы ошибаетесь. Если какой-нибудь процесс протекает по известной зависимости от времени (линейной, экспоненциальной), ничто не мешает вычислить момент достижения функцией заданного значения. Например, процесс наполнения емкости при постоянном потоке жидкости.

Yegor
21.05.2016, 08:49
Как ловко вы подменили задачу, однако. Даже при известной зависимости в реальном процессе конечный результат наперёд достоверно не известен. Но пожалуйста - принимаем допуски, переформулируем задачу косвенно, и тогда упрекайте меня в ошибке. А так я остаюсь на своём - машину времени ещё не изобрели.

Eugene.A
21.05.2016, 08:59
Напрасно вы ерничаете. Именно так работают, например, весовые терминалы, снижая скорость подачи материала в бункер при приближении к уставке для повышения точности дозирования. И вообще подобные алгоритмы применяются повсеместно и успешно. Больше вам скажу - без способности к предсказанию многое стало бы невозможно. Например, остановить автомобиль на линии Стоп. И без всяких машин времени.

capzap
21.05.2016, 09:01
А так я остаюсь на своём - машину времени ещё не изобрели.
автор конкретно указал
Есть лампочка, показывающая статус(1) в течении некоторого времени
Грубо говоря обычная схема светофора

Валенок
21.05.2016, 10:36
Однако не лампочка определяет статус. Она всего лишь индицирует нечто рожденное другим процессом.
И если говорить о красотульках в коде, то управление лампочкой красивше вынести в отдельный поу (например ф.блок), т.к. внутренняя логика лампы никакого отношения к процессу не имеет даже если это одна строка. Но вот незадача - нет и не может быть функциональных блоков, которые бы знали наперёд, что через 35 секунд что-то выключится.


Больше вам скажу - без способности к предсказанию многое стало бы невозможно. Например, остановить автомобиль на линии Стоп. И без всяких машин времени.

Еще больше Вам скажу - это не предсказание, а предположение. Можно учесть мильон факторов (массу машины, износ колодок, состояние покрытия...) - но гопник за вами, который решил что вы тоже решили проехать на бледно-зеленый, легко удивит ваши стопари которые "предсказали" положение Вашей машины.

vongot
21.05.2016, 15:47
Проблема - знать будущее: "перед отключением", "за 35 секнд до отключения". Тут бы правильнее говорить о том, что что-то выключается спустя 35 секунд мигания лампочки. Ну то есть вы сами должны перевести "вкл_мигать" в TRUE и "вкл_постоянно" в FALSE; нет и не может быть функциональных блоков, которые бы знали наперёд, что через 35 секунд что-то выключится.
Возможно, я не совсем корректно описал. Ей не надо угадывать чье-то отключение, ей всего лишь нужно показать свое, т.е через 12h29m25s от начала своей работы 35s мигать и перейти в (0) до следующего перехода в (1).

Василий Кашуба
22.05.2016, 10:27
Возможно, я не совсем корректно описал. Ей не надо угадывать чье-то отключение, ей всего лишь нужно показать свое, т.е через 12h29m25s от начала своей работы 35s мигать и перейти в (0) до следующего перехода в (1).
Ну тогда это конкретный светофор (зелёный), такое то время горю постоянно, потом перед выключением, помигаю.
Обыкновенный таймер и схема сравнения, как время стало =< 35 сек, лампа моргает.

Yegor
22.05.2016, 14:16
На ПЛК организуете modbus-слейв на нужном порту и опрашиваете его своей программой на компьютере. Конкретнее не скажу, т.к. 73-й не видел.

31kip
23.05.2016, 10:01
Добрым день форумчанам! Появилось в моем хозяйстве несколько новых приборов: СПК207, МДВВ, МД110-8АС, и есть старенький ПЛК-73. Связать новые между собой по RS-485 не составило особого труда, а вот сделать опрос 73го с СПК не могу, перечитал кучу мануала и примеров и ... ничего!!!! Все дело, наверное, в том что все примеры на ST, а у меня с этим пока слабовато, совсем слабовато. Программы пока как таковой нет, просто пытаюсь понять принцип организации опросов и в конце концов получить то эту злополучную переменную, если не сложно посмотрите опытным взглядом что не так делаю, плиззз.(подозреваю что прям много не так делаю).

RV9WFJ
24.05.2016, 05:41
А зачем у вас в проекте ПЛК73 библиотеки ModBus SysLibCom и SysLibSocet? Что-то я не увидел в коде их использования (особенно последней :-) )
Вообще, если ПЛК Slave то все проще некуда - описываем переменную в PLCConfiguration как здесь
24553
настраиваем порт и обязательно разрешаем изменение по сети, без этой галки почему-то ничего не работает (ИМХО баг прошивки) Номер регистра выбираем из указанного диапазона. Я всегда указывал без пропусков, возможно с ними тоже не работает, не проверял.

31kip
24.05.2016, 10:16
Так у меня так все и сделано.24556
Но судя по всему проблема у меня в принимающей стороне, а вот в чем она заключается я никак понять не могу, а сейчас еще интересней стало24557

specialist kipia
26.05.2016, 16:43
Плдскажите пожалуйста, как в программу вкладывать функции, функц. блоки? Не могу пока-что понять.

Yegor
26.05.2016, 17:00
http://www.owen.ru/forum/attachment.php?attachmentid=24591&stc=1

specialist kipia
26.05.2016, 17:23
Спасибо Вам ,ЧЕЛОВЕК. А то отдельно тему создал-срач развели и так и не ответили. Даже ссылки "рутрекера" заблокированные скидывали:D

specialist kipia
26.05.2016, 17:26
И еще вопросик: Функция или блок должны быть внутри программы или внутри проекта?

Yegor
26.05.2016, 19:46
Не пойму вопрос. Давайте с картинками.

krollcbas
26.05.2016, 20:22
Вышлите то, что у Вас получается, поможем!

Эдуард_Н
27.05.2016, 04:05
Спасибо Вам ,ЧЕЛОВЕК. А то отдельно тему создал-срач развели и так и не ответили. Даже ссылки "рутрекера" заблокированные скидывали:D

Держи не заблокированное: http://smart-torrent.org/programmirovanie/prostoe-ponyatnoe-programmirovanie-codesys-t86299.html
и даже сам файл.

nsarychev
27.05.2016, 12:41
Комрады вопрос!
О Портах СОМ-2 и СОМ-3 (RJ45) на СПК207 написано в мануале, что они по умолчанию RS485. В разъеме используются 8 А и 6 B контакты. Подключился как написано а связи нет. В чем секрет?

василий17061980
27.05.2016, 16:35
Зачем особенно нужны подпрограммы? Если в основной plc_prg весь проект написать? место не хватит макросы в помощь? Есть наверное тайный смысл их делать а потом вызывать с главной. Опрос контроллера все ровно стандартный.

capzap
27.05.2016, 17:19
Зачем особенно нужны подпрограммы? Если в основной plc_prg весь проект написать? место не хватит макросы в помощь? Есть наверное тайный смысл их делать а потом вызывать с главной. Опрос контроллера все ровно стандартный.

ну если Вы на плк решаете задачу: сколько_будет_дважды_два, то да хватит и того, чтоб написать все в одном ПОУ. Но существуют, повторяющиеся логические блоки или блоки у которых логика одна, но входные аргументы зависят от выбранного рецепта, описывать различные ситуации в одной портянке ни какого удовольствия нет, вот Вам и тайный смысл

Rednaxel
28.05.2016, 23:14
Подскажите пожалуйста, как лучше реализовать получение давления от датчика Овен ПД100:
Датчик подключен к Овен ПЧВ-2 на клемму 60. ПЛК 110-30М получает значение тока 4-20 мА из ПЧВ по RS485.
Проблема в том, что когда я начинаю пересчитывать в ПЛК сигнал 4-20 мА в значения давления в Барах (в 2 действия) показания начинают сильно "прыгать", видимо к дисперсии показаний от датчика добавляется разброс времени цикла ПЛК. Среднее за 2-3 сек. помогло бы но тоже пока не знаю как его рассчитать.
Сначала подумал что можно с помощью параметров 6-93, 6-94 пересчитать токовый сигнал на Клемме 42 в значение давления - я так понимаюэто не для того функция :(
Может быть все-таки есть способ "достать" значение давления из ПЧВ? Или как здесь правильно поступить?
P.s. По условия задачи датчик должен быть подключен именно к ПЧВ, а не к ПЛК.

RV9WFJ
29.05.2016, 06:02
Не понятно только при чем тут время цикла ПЛК. Может вы его как-то не так в ПЛК к атмосферам приводите? Используйте LINTARFO из Util.lib. Поверьте не прыгает ли давление в самом ПЧВ.

Rednaxel
29.05.2016, 19:45
Используйте LINTARFO из Util.lib
О! :o LIN_TRAFO - наверняка это то что нужно, спасибо огромное. Завтра проверю. Я ведь высчитывал давления путем арифметических операций в 2 действия :confused:
В самом ПЧВ сигнал тоже немного "прагает" но не критично, а вот после моих вычислений стало совсем никуда. Что касается времени цикла, то это просто какое-то эмпирическое предположение новичка, оно ведь тоже меняется, так? Может и нет никакой связи.
Возможно это самый "новичковый" вопрос новичка. ;)

Ugeen
01.06.2016, 07:48
Здравствуйте.
Установил Контроллер. Подключил к компьютеру.

Короче у меня сразу возникла проблемма... Написал программу , очень иаленькую . и она не хочет работать.
Короче программа элементаррная: грубо говоря LD: олна цепь контакт k1 AT%ix0.0.0.0 выход q1 AT%qd0.1.0

Компилирую. Засылаю в контроллер. Кстати ПЛК63 М. Конфигурация входов : РРРККК
Далее нажимаю - Старт.
Нижимаю физическую кнопку - вижу прохождение сигнала через контакт кнопки и активацию выхода .
ПЕрвый выход в ПЛК 63 - реле НО-НЗ (контакты 3-4-5).
с контакта 4 я подал 24 вольта на контакт 3 , далее на лампочку. При срабатывании выхода лампочка должна зажигаться
Не работает выход . При подключении лампочки через НЗ она горит , но при срабатывании выхода - не гаснет.

Тоесть выход физически не срабатывает почему .

И что странно - В разделе ресурсы - конфигурация ПЛК все выходы QD 0.1.0-5 имеют почему то тип Реал. Как то странно видеть при булевских выходах в конфигурации реал.

Подскажите , где собака зарыта? где искать?

Беру готовую программу Светофор. Она работает так же с выходами Qd0.1.0-2. История та же. Ни одна лампочка не зажигается

_Mikhail
01.06.2016, 08:28
[QUOTE=Ugeen;210805]

И что странно - В разделе ресурсы - конфигурация ПЛК все выходы QD 0.1.0-5 имеют почему то тип Реал. Как то странно видеть при булевских выходах в конфигурации реал.

Нужно внимательнее читать документацию. Там все описано

Ugeen
01.06.2016, 13:56
[QUOTE=Ugeen;210805]

И что странно - В разделе ресурсы - конфигурация ПЛК все выходы QD 0.1.0-5 имеют почему то тип Реал. Как то странно видеть при булевских выходах в конфигурации реал.

Нужно внимательнее читать документацию. Там все описаноhttp://www.owen.ru/forum/attachment.php?attachmentid=24667&stc=1

И как таким выходом управлять? Кстати я забыл указать типы элементов в цепочке. Тип переменной выход если я ставлю Реал - то у меня программа не компилируется .
Цепочка : контакт 0.0.0.0 BOOl- выход 0.1.0 Real. при компилировании выводится ошибка что тип данных Реал не доступен. Компиляция проходит только если тип данных выхода -BOOL.

И еще... просмотр состояния выхода qd 0.1.0. с ЖКИ контроллера при срабатывании инициирующего контакта-входа показывает, что состояние ВУ1 как было 0 до срабатывания входа, так и осталось 0 после срабатывания.

А как у типа данных BOOL может быть диапазон данных от 0-1. ? Как булевской переменной присвоить значение 1.0 ?
Как будет выглядеть такая простая программа? тоесть реле выхода сработает только тогда , когда я присвою выходу значение 1.0? а если присвоить значение 0.5?

Или вы хотите сказать, чтобы выход 0.1.0 сработал нужно сделать операцию прямого присвоения выходу 0.1.0 значения 1.0?

LuckLake
01.06.2016, 15:03
В процессе работы программы на выход (4 реле) должен подаваться номер команды (10 номеров). Подскажите, пожалуйста, как это лучше реализовать.
Я додумалась только до того, что нужно объявить 4 двоичных переменных и записывать их значения в каждом шаге. Нет ли какого-нибудь элемента, который делал бы это автоматически? Например: на вход (INT) подается число 8, на 4 двоичных выходах генерируются соответствующие значения (1-0-0-0).
Или же лучше прописать значения как отдельные подпрограммы (или функции)? Главная программа в SFC.

василий17061980
01.06.2016, 16:48
работай в CFC FBблоки прописывай на LD и будет тебе счастья

Charushin1989
01.06.2016, 21:24
Подскажите необходимо перезапускать переменную run когда переменная stop тру. Проблема в том что когда stop фолс run тоже становится фолс(. Только не смейтесь,лучше помогите))

smk1635
01.06.2016, 22:00
Подскажите необходимо перезапускать переменную run когда переменная stop тру. Проблема в том что когда stop фолс run тоже становится фолс(. Только не смейтесь,лучше помогите))

Ни черта не понял. Напишите алгоритм нормально.

И это ... false читается как фалшь, а лучше включен - выключен. :)

ахметыч
01.06.2016, 22:32
Уважаемые коллеги, прошу помочь разобраться как работать с библиотекой SysLibFile . есть пример который ниже Pr_XX --- имя переменной, получается для каждой переменной создавать такой блок ? и SIZEOF(Pr_XXf)-1) что это за строка и для чего (-1)? буду очень признателен если все же ткнете носом куда чего .
зап:
dwHandle := SysFileOpen('Pr_XX.t','w');
SysFileWrite(dwHandle,ADR(Pr_XX),SIZEOF(Pr_XX));
SysFileClose(dwHandle);

Чтение:
dwHandle := SysFileOpen('Pr_XX.t','r');
SysFileRead(dwHandle,ADR(Pr_XXf),SIZEOF(Pr_XXf)-1);
SysFileClose(dwHandle);


Работает.
Pr_XX --- имя переменной
SysLibFile.lib --- добавь библиотеку.

Валенок
01.06.2016, 22:35
Подскажите необходимо перезапускать переменную run когда переменная stop тру. Проблема в том что когда stop фолс run тоже становится фолс(. Только не смейтесь,лучше помогите))
Да, жуткое объяснение хотелки. Тоже ничего не понял. А правильное объяснение - это 90% решения

Чисто для осмысления.
1. Присвоение в run[1] и сам F_TRIG можете смело выкинуть, т.к. выход тригера идет только в run[1], а он тут же переписывается - см. run[2]
2. Обратите внимание - run[2] сначала берет данные из таймера, и только после этого отрабатывается таймер

Charushin1989
01.06.2016, 22:40
Ни черта не понял. Напишите алгоритм нормально.

И это ... false читается как фалшь, а лучше включен - выключен. :)

Когда включается stop необходимо чтобы run выключился и включился через 15 сек.

Валенок
01.06.2016, 22:40
Уважаемые коллеги...
Недостаточно данных. Нужны типы упомянутых переменных, особенно для второй, в которую почему-то читается на один байт меньше чем sizeof

Валенок
01.06.2016, 22:44
Может это хотели?
)) Cудя по "может" - тоже ничего не поняли. Пусть автор потренируется в выражении своих хотелок. На пользу пойдет..

amn
01.06.2016, 22:46
Когда включается stop необходимо чтобы run выключился и включился через 15 сек.
Может это хотели?

Валенок
01.06.2016, 22:56
Может это хотели?
Он хотел просто сдать зачот )) А по чему - это не имеет значения.

Валенок
01.06.2016, 23:16
Когда включается stop необходимо чтобы run выключился и включился через 15 сек.
TP активируется по переднему фронту входа и ему все пофигу* пока он сам (TP.Q) активен. TP.Q с инверсией на run.
*если нужно это

Charushin1989
01.06.2016, 23:38
TP активируется по переднему фронту входа и ему все пофигу* пока он сам (TP.Q) активен. TP.Q с инверсией на run.
*если нужно это
Спасибо! Сам виноват что невнятно обьяснил

ахметыч
02.06.2016, 09:44
Недостаточно данных. Нужны типы упомянутых переменных, особенно для второй, в которую почему-то читается на один байт меньше чем sizeof
этот пример нашел на просторах интернета но нечего в нем не понял . если у вас есть готовый рабочий пример буду очень признателен .

johnny89
02.06.2016, 14:01
Добрый день! Столкнулся с таким багом, или фичей.
Разрабатываю проект на плк160. Нужны только дискретные сигналы. Разработан алгоритм и все что для него нужно. Наконец, добились от начальства ПЛК-110 новой серии. Как перейти с таргета на таргет.
В лоб смена таргета не помогает, так как пропадают все данные в ПЛК-конфигураторе. На данный момент спасает только импорт экспорт, но это почти равносильно написанию проекта с нуля. Возможность смены целевого устройства есть вообще, или на каждое устройство новый проект?

Надеюсь понятно задал вопрос. Спасибо

nsarychev
02.06.2016, 14:29
Комрады вопрос!
Есть ПЛК-100 к нему подключены два слейва, блоки управления кранами BCV-1, modbus RTU.
А вопрос собственно такой: Как детектировать обрывы связи по каждому слейву в отдельности?

Ugeen
02.06.2016, 15:40
[QUOTE=Ugeen;210805]

И что странно - В разделе ресурсы - конфигурация ПЛК все выходы QD 0.1.0-5 имеют почему то тип Реал. Как то странно видеть при булевских выходах в конфигурации реал.

Нужно внимательнее читать документацию. Там все описано
ну вот , на деле так и оказалось . Для того , что бы выход 1 сработал, тот пример программы светофора, который описан например в разделе помощи по Ф1 Кодесис-а, не годится. Выход срабатывает только тогда, когда переменной , например, iii, связанной с адресов выхода qd0.1.0, и обьявленной типом Real, делается прямое присвоение значения 1.
А в примере выходы обозваны булевскими типами, и присваиваются и присвоения им значений TRUE FALSE никакого значения на состояние выхода не играют.

Кстати выявлено, что физически, при двоичном отображении состояния выхода на ЖКИ индикаторе ПЛК 63 при операции с выходом , как с Булевским типом изменяется логически правый бит с 0 на 1 и обратно., тоесть отображается 00000001 или 00000000 Но на физическое состояние выхода это влияния не оказывает. При записи в БУлевских пипах в выход ТРУЕ, значение выхода по раделу КОДЕСИС - ресурсы ПЛК присваивается 1.4 е-045.
Хотя наоборот, при записи в выход , как тип Реал, значения 1.0 или 0.0, то это же самое отображение выглядит следующим образом : 37800000, либо 00000000 и при этом физическое состояние выхода меняется и происходит срабатывание исполнительного механизма.

Так почему же тогда в примере Светофора из раздела ПОмощь в КОДЕСИС используется именно булевская работа с выходами , когда очевидно , что физическая сработка выхода по булевской операции с ним не происходит.


Это что , косяк разработчиков ОВЕна получается ?

capzap
02.06.2016, 19:47
Это что , косяк разработчиков ОВЕна получается ?

для какого плк написан пример светофора?

LuckLake
02.06.2016, 22:33
Можно ли как-нибудь сделать, чтобы комментарии к шагу SFC были видны не только при открытии атрибутов?

petera
03.06.2016, 04:52
Можно ли как-нибудь сделать, чтобы комментарии к шагу SFC были видны не только при открытии атрибутов?

Можно, Дополнения-->Опции-->Отображать в шаге.
24710

Коментарии также можно писать в названии шага
24711

nsarychev
03.06.2016, 10:04
Комрады вопрос!
Есть ПЛК-100 к нему подключены два слейва, блоки управления кранами BCV-1, modbus RTU.
А вопрос собственно такой: Как детектировать обрывы связи по каждому слейву в отдельности?

Ну что, вообще никому не приходилось ошибки(отсутствие) связи по слейвам в проектах определять? Дайте хотя-бы пример посмотреть как это делается!

sergeykrylov
03.06.2016, 10:21
Там вроде код 81 выскакивает когда слейв не отвечает.

LuckLake
03.06.2016, 10:24
petera, вы просто мой спаситель! И там помогли, и тут. Спасибо.

nsarychev
03.06.2016, 10:52
Там вроде код 81 выскакивает когда слейв не отвечает.
По шине выскакивает. А мне отдельно по каждому слейву надо.

sergeykrylov
03.06.2016, 11:00
Можно привязаться к адресу (Last address). Устройства ведь по очереди опрашиваются и в этой переменной как раз адрес и находится.

nsarychev
03.06.2016, 11:18
Можно привязаться к адресу (Last address). Устройства ведь по очереди опрашиваются и в этой переменной как раз адрес и находится.
Была такая мысль, с реализацией проблема. Слейвы на адресах 1 и 2. И если я хочу получить к примеру из lasterror через точку (lasterror.1) обрыв слейва на 1-м адресе то гничего не вижу.

sergeykrylov
03.06.2016, 11:21
На ST пишешь?

nsarychev
03.06.2016, 11:36
На ST пишешь?
на CFC по большей части.

sergeykrylov
03.06.2016, 11:51
Самому стало интересно, вечером проверю и отпишусь что получилось.

sergeykrylov
03.06.2016, 11:58
Вот предварительно набросал:
24724
24725

nsarychev
03.06.2016, 12:28
Сейчас попробую.

nsarychev
03.06.2016, 12:50
Работает, но фиг отличишь обрыв от ошибок при таком помаргивании. Попробовал оторвать один слейв, потом занизил таймаут(пошли ошибки но связь есть). Картина получилась очень похожая. Вот ести бы побитно по шине каждый слейв видеть?

sergeykrylov
03.06.2016, 13:04
Скорость обмена какая?

sergeykrylov
03.06.2016, 13:10
Так error1 это первый слейв, а error2 второй. Вот тебе и побитно.

Yegor
03.06.2016, 13:17
Там неправильно сделано: при опросе очередного слейва ошибки на всех остальных сбрасываются. Надо как-то так:

http://www.owen.ru/forum/attachment.php?attachmentid=24729&stc=1

Проверить не на чем пока.

sergeykrylov
03.06.2016, 13:24
То же самое получиться.

nsarychev
03.06.2016, 13:29
Скорость 19200. Я понимаю что "error1 это первый слейв, а error2 второй", я говорю о том, что ошибки от обрыва отличаются тем, что обрыв весит постоянно, а ошибки промаргивают периодически. А пример Yegor то-же самое, только вид сбоку :). Ясное дело, что можно залачить ошибку через RS. Как отличить обрыв от ошибки?

Yegor
03.06.2016, 13:30
Нет, не получится. У вас ошибки актуальны только на момент опроса слейва. У меня - всегда.

Yegor
03.06.2016, 13:31
Как отличить обрыв от ошибки?Никак, потому что обрыв это частный случай ошибки.

nsarychev
03.06.2016, 13:36
Там неправильно сделано: при опросе очередного слейва ошибки на всех остальных сбрасываются. Надо как-то так:

http://www.owen.ru/forum/attachment.php?attachmentid=24729&stc=1

Проверить не на чем пока.

Извени Yegor! Невнимательно изучал твой пример. На обрыв связи работает.

Спасибо!

sergeykrylov
03.06.2016, 13:36
Считать все ошибки обрывами.

Yegor
03.06.2016, 13:48
Кстати умеренно ленивый программист оформит это в ФБ, чтобы общая схема не мельтешила:

http://www.owen.ru/forum/attachment.php?attachmentid=24730&stc=1

sergeykrylov
03.06.2016, 13:51
Можно поставить таймер и счётчик. И по значению счётчика условно выделять ошибку связи и обрыв.

Эдуард_Н
04.06.2016, 04:16
Можно поставить таймер и счётчик. И по значению счётчика условно выделять ошибку связи и обрыв.

Пожалуйста пример можете дать?

nsarychev
04.06.2016, 18:41
Комрады!
Подскажите простой способ сохранения уставок.
А суть вопроса такова, есть управляемое по modbus slave устройство с сохраненными в нем уставками, которые можно изменять.
Но, codesys при каждой перезагрузке норовит обнулить все эти уставки. Почему это происходит я понимаю, я не понимаю как с этим бороться
без танцев с бубном, как заставить codesys считать из устройства уставки не не сбрасывая их в ноль.

RV9WFJ
05.06.2016, 04:51
Почему это происходит я понимаюПохоже, что не понимаете.
Не надо писать уставки в каждом цикле обмена плюс в первом цикле стоит читать то что уже имеется в приборе и сохранять их в СПК.

RV9WFJ
05.06.2016, 04:54
Сообщение от sergeykrylov Посмотреть сообщение
Можно поставить таймер и счётчик. И по значению счётчика условно выделять ошибку связи и обрыв.

Пожалуйста пример можете дать?Счетчик ИМХО лишнее, просто таймер задержки аварии связи. Если ошибка проскочила то следующий удачный обмен пройдет быстрее таймера. А если таймер успел отсчитать то это уже тенденция - следовательно авария связи.

Эдуард_Н
05.06.2016, 10:07
Счетчик ИМХО лишнее, просто таймер задержки аварии связи. Если ошибка проскочила то следующий удачный обмен пройдет быстрее таймера. А если таймер успел отсчитать то это уже тенденция - следовательно авария связи.

А насколько таймер выставлять?

Rednaxel
05.06.2016, 10:17
Всем привет!

В программе на CFC есть счетчик отправленных СМС и нужно его сбрасывать каждый месяц, а кроме таймера в моём новичковом мозгу на эту тему пока ничего не обнаруживается ;-)

Подскажите пожалуйста: как зафиксировать наступление первого числа месяца?

nsarychev
05.06.2016, 16:20
Похоже, что не понимаете.
Не надо писать уставки в каждом цикле обмена плюс в первом цикле стоит читать то что уже имеется в приборе и сохранять их в СПК.

Может я описал ситуацию неправильно, контроллер обнуляет уставки при рестарте, например, если его выключить-включить. Ну или если я в нем проект перегружаю. А сохранять уставки в приборе необходимости нет, я их отдельно считываю.

capzap
05.06.2016, 16:41
Может я описал ситуацию неправильно, контроллер обнуляет уставки при рестарте, например, если его выключить-включить. Ну или если я в нем проект перегружаю. А сохранять уставки в приборе необходимости нет, я их отдельно считываю.

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

Валенок
05.06.2016, 16:51
Всем привет!

В программе на CFC есть счетчик отправленных СМС и нужно его сбрасывать каждый месяц, а кроме таймера в моём новичковом мозгу на эту тему пока ничего не обнаруживается ;-)

Подскажите пожалуйста: как зафиксировать наступление первого числа месяца?



var
std,z : systemtimedate; //syslibtime
st64 : systime64; //...
get : curtimeex; //...
var retain //ретайн желательно если критична из-за вероятность передергивания питания за сутки
вот_и_первое_число : r_trig;
------------
std := z;
get(systemtime := st64, timedate:=std);
вот_и_первое_число(clk := std.day = 1);
if вот_и_первое_число.q then
//..................
end_if


PS
Движок форума чудит, блин

nsarychev
05.06.2016, 16:54
определитесь Вам что вобще нужно, раз не сохраняете уставки в плк, то зачем волноваться что после рестарта их нет. Если панель мастер, пусть следит за соединением и после восстановления по новой записывает уставки По новой записывать уставки? Я в первом вопросе спрашивал, можно ли, чтобы контроллер не трогал без команды уставки в слейвах, которые сами являются контроллерами. Я задавал вопрос есть ли простой способ это сделать, без согласования данных в мастере и слейвах при первом скане! Если такого способа нет, значит буду мудрить.

capzap
05.06.2016, 17:03
По новой записывать уставки? Я в первом вопросе спрашивал, можно ли, чтобы контроллер не трогал без команды уставки в слейвах, которые сами являются контроллерами. Я задавал вопрос есть ли простой способ это сделать, без согласования данных в мастере и слейвах при первом скане! Если такого способа нет, значит буду мудрить.
мне кажется Вам самому придется мудрить, это будет самый быстрый способ решить проблему, ясности что конкретно Вам нужно так и нет

Валенок
05.06.2016, 17:19
По новой записывать уставки? Я в первом вопросе спрашивал, можно ли, чтобы контроллер не трогал без команды уставки в слейвах, которые сами являются контроллерами. Я задавал вопрос есть ли простой способ это сделать, без согласования данных в мастере и слейвах при первом скане!
Если такого способа нет, значит буду мудрить.
Перейти на обмен по команде и не трогать без команды уставки в слейвах

Rednaxel
05.06.2016, 17:51
var
std,z : systemtimedate; //syslibtime
..................
end_if


Это выглядит круто и наверняка сработает, огромное спасибо за помощь! :)

Только вот чтобы это применить, ну совсем для новичков подскажите пожалуйста:
код видимо нужно в ФБ вставить, или это функция? И на каком это языке?
А то я пока только в CFC умею диаграммки рисовать. :confused:

Валенок
05.06.2016, 18:38
.. и наверняка сработает
100 пудов


код видимо нужно в ФБ вставить, или это функция? И на каком это языке?
А то я пока только в CFC умею диаграммки рисовать. :confused:
Язык ST (настоятельно рекомендую изучать, как самый мощный в рамках КДС. Порно в виде IL - даже не смотрите)
Вставлять куда угодно кроме функции т.к. она по определению не имеет памяти, которая нужна для r_trig (работа с глобалами - не кошерна)
Можно в фб - но тут тоже нюанс, весь блок будет в ретайне (но на это обычно покласть - ресурсов море, и никому они ненужны кроме вас)
Если это нужно 1 раз, проще всего сделать программ (когда потребуется размножение - переделка ф.б как 2 пальца..)



program вот_и_первое_число
var_output
Q : bool;
end_var
var
std,z : systemtimedate;
st64 : systime64;
get : curtimeex;
end_var
var retain
opanki : r_trig;
end_var
-----------------------
std := z;
get(systemtime := st64, timedate:=std);
opanki(clk := std.day = 1, q => Q);
--------------------------


Вызов где-то в CFC
|вот_и_первое_число Q|-----> |EN чета_там_делать|

nsarychev
06.06.2016, 11:26
Комрады вопрос! Нифига не найду как в проекте к start-stop подключится и динамику. А поисковик форуме кучу ненужной информации выдает.

nsarychev
07.06.2016, 09:26
Комрады вопрос! Нифига не найду как в проекте к start-stop подключится и динамику. А поисковик форуме кучу ненужной информации выдает. Что никто не знает как из проекта контролировать старт стоп контроллера(или хотя-бы сигнализацию к ним прицепить). Как кнопку отвязать я разобрался, только вот она после этого начинает работать как вход дискретный. В конфигурации задач есть системные события с интерфейсами событий, но как ими пользоваться я не пойму.

drvlas
07.06.2016, 19:38
Я уже не новичок, но страсть как не люблю читать. Так что до сих пор не могу ответить на такой вот простой вопрос:

А если в программе все-все POU, которьіе не возвращают значение, обозвать ФБ (не использовать, грубо говоря, функции)? Что плохого программе будет?

Что хорошего будет, я придумал: во время отладки я вижу значения локальньіх переменньіх ФБ, а вот переменньіе функции не видньі. Так что, вроде бьі, ФБ удобнее.
Все на борьбу с воробьями, то бишь, с функциями!

Владимир Ситников
07.06.2016, 19:50
Я уже не новичок, но страсть как не люблю читать. Так что до сих пор не могу ответить на такой вот простой вопрос:

А если в программе все-все POU, которьіе не возвращают значение, обозвать ФБ (не использовать, грубо говоря, функции)? Что плохого программе будет?
Из первого, что приходит на ум -- с ФБ быстрее упрётесь в ограничение на количество POU.

ФБ всегда занимает 2 POU (сам блок и его инициализатор), а функция занимает только 1 POU (инициализаторов не бывает).
Общее ограничение не помню, но меньше 256.

На форуме есть те, кто упирался в количество POU в одном проекте.