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

Ryzhij
27.05.2015, 15:29
Это понятно. Но хочется понять почему, и как это устранить
Я в таких случаях делаю задержку разрешения обработки аналоговых сигналов после включения питания на время, достаточное чтобы периферия "пришла в себя". По-старинке именую сей таймер "задержка на прогрев". Пол-минуты обычно достаточно.

schlosser
27.05.2015, 15:39
Я в таких случаях делаю задержку
И как делать эту задержку, можно по подробней? Пробовал после LE ставить AND и TON , но что то не получилось. Единственное может я время мало ставил, секунд 5

shagin
27.05.2015, 17:50
И как делать эту задержку, можно по подробней? Пробовал после LE ставить AND и TON , но что то не получилось. Единственное может я время мало ставил, секунд 5

поробовал поставить после LE блок TON. у меня все работает - включается через заданное время

schlosser
27.05.2015, 20:16
У меня проблема в том, что при подачи питания на плк и мв 8а на LE проскакивает импульс который активирует триггеры , хотя не должен температура плюсовая.

petera
28.05.2015, 03:21
Добрый день. Столкнулся с такой проблемой. a_p это температурный датчик, подключен у МВ100. 8А. При снижении температуры ниже 0 гр. включаются Pusk1 и A_pusk, так и должно быть. Но у меня проблема в том, что Pusk1 и A_pusk активируются при включении ПЛК и МВ при плюсовой температуре. Подскажите где искать?
18365


Это понятно. Но хочется понять почему, и как это устранить


У меня проблема в том, что при подачи питания на плк и мв 8а на LE проскакивает импульс который активирует триггеры , хотя не должен температура плюсовая.
http://www.owen.ru/forum/attachment.php?attachmentid=11962&d=1392751544Блин, столько постов наплодили.
Ни каких отрицательных значений при включении не проскакивает!
Ну не ужели не понятно, что условие "LE" по русски "меньше или равно". При старте программы переменная a_p однозначно равна "0" до тех пор пока не прочитается значение из модуля МВ. По этому при старте программы условие a_p=0 выполняется всегда, R_TRIG срабатывает и Ваши Pusk1 и A_pusk закономерно установятся в TRUE. Это даже в эмуляции можно проверить.
18370http://www.owen.ru/forum/attachment.php?attachmentid=11963&d=1392751579
Замените "LE" на "LT", или сравнивайте не с "0", а с"-0.5", например.

ЗЫ. Если уж очень хочется строгое выполнение условия "<=", то сделать так
18371
Порядок ФБ важен, таймер ТР должен выполнятся раньше чем LE. Уставку для таймера подобрать по факту.

schlosser
28.05.2015, 10:40
Спасибо, всё заработало.

VanoKing
28.05.2015, 11:03
Есть ПЛК63 с модулем МК110.8Д.4Р
в основной программе реализована связь между ними
в подпрограммах ST_1; - ST_5; реализация плавного регулирования 5ти групп светильников подключенных на выхода 0-10V от кнопок пульта(задание сцен освещения 4шт) и от выключателей.

От выключателей все работает нормально, каждая отдельная группа регулируется своим выключателем плавно изменяется напряжение на выходе от 0 до 10 или от 10 до 0
От одной кнопоки пульта регулируются сразу все группы освещения, так называемая сцена освещения.
Проблема: регулировка на первых двух выходах(AO2,АО3) происходит плавно, а на последних трех(АО4,5,6) скачком, хотя все подпрограммы одинаковы и в онлайн симуляции регулирование плавное, в реальности проверено тестером на выходах скачок

Пробовал увеличить время цикла выполнения программы отличное от 1ms - тогда пропадает связь.
Пробовал заменить контроллер - все тоже, плавности нет

adamst
08.06.2015, 11:11
задача перегнать bit в word и обратно, подскажите пожалуйста все ли я правильно делаю



PROGRAM PLC_PRG
VAR
Var_Word: WORD;
Byte_low: BYTE;
Byte_hi: BYTE;
Byte_low2: BYTE;
Byte_hi2: BYTE;
Bit1: BOOL;
Bit2: BOOL;
Bit3: BOOL;
Bit4: BOOL;
Bit5: BOOL;
Bit7: BOOL;
Bit8: BOOL;
Bit9: BOOL;
Bit10: BOOL;
Bit6: BOOL;
Bit11: BOOL;
Bit12: BOOL;
Bit13: BOOL;
Bit14: BOOL;
Bit15: BOOL;
Bit16: BOOL;

Bits: ARRAY [1..16] OF BOOL;

UNPACK1: UNPACK;
UNPACK2: UNPACK;
PACK1: UNPACK;
PACK2: UNPACK;
END_VAR


(*заполняем биты (библиотека UTIL)*)
Bit1:=1;
Bit2:=0;
Bit3:=0;
Bit4:=0;
Bit5:=0;
Bit6:=0;
Bit7:=0;
Bit8:=0;
Bit9:=1;
Bit10:=0;
Bit11:=0;
Bit12:=0;
Bit13:=0;
Bit14:=0;
Bit15:=0;
Bit16:=0;

(*упаковываем биты в байты*)
Byte_low2:=PACK(Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7 ,Bit8);
Byte_hi2:=PACK(Bit9,Bit10,Bit11,Bit12,Bit13,Bit14, Bit15,Bit16);
(*ну и байты в слово объединям*)
Var_Word:=SHL(BYTE_TO_WORD(Byte_hi2),8) OR BYTE_TO_WORD(Byte_low2);


(*ОБРАТНАЯ ПРОЦЕДУРА Переменная Var_Word разбивается на два байта*)
Byte_low:=WORD_TO_BYTE(Var_word);
Byte_hi:=WORD_TO_BYTE(Var_word/256);

(*байты раскладываются на биты с помощью ФБ Unpack (библиотека UTIL)*)

UNPACK1(
B:=Byte_low ,
B0=>Bits[1],
B1=>Bits[2] ,
B2=>Bits[3] ,
B3=>Bits[4] ,
B4=>Bits[5] ,
B5=>Bits[6] ,
B6=>Bits[7] ,
B7=>Bits[8] );
UNPACK2(
B:=Byte_hi ,
B0=>Bits[9] ,
B1=>Bits[10] ,
B2=>Bits[11] ,
B3=>Bits[12],
B4=>Bits[13] ,
B5=>Bits[14],
B6=>Bits[15],
B7=>Bits[16]);

(*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)

adamst
08.06.2015, 12:04
Пользуюсь немного более простой конструкцией:
Упаковка:
IF BOOL_var THEN WORD_cmd:=WORD_cmd OR 1024; ELSE WORD_cmd:=WORD_cmd AND NOT 1024; END_IF;
Распаковка:
IF (WORD_sts AND 1024)<>0 THEN BOOL_var:=TRUE; ELSE BOOL_var:=FALSE; END_IF;
можно Вас просить прокомментировать более подробно?
если значение 1 тогда прибавить к word 1024? вот это не понял, ну и дальше :)

Scream
08.06.2015, 12:32
Пользуюсь немного более простой конструкцией:
Упаковка:
IF BOOL_var THEN WORD_cmd:=WORD_cmd OR 1024; ELSE WORD_cmd:=WORD_cmd AND NOT 1024; END_IF;
Распаковка:
IF (WORD_sts AND 1024)<>0 THEN BOOL_var:=TRUE; ELSE BOOL_var:=FALSE; END_IF;

Мда..... куда тут уж проще... жесть, товарищи

Вот это, просто.


if bBool
then
wWord.0 := true;
wWord.1 := false;
wWord.2 := true;
wWord.3 := false;
wWord.4 := true;
...
wWord.14 := true;
wWord.15 := false;
end_if

ps. Еще интересно, писал в WORD_cmd, а читал из WORD_sts.

petera
08.06.2015, 12:34
задача перегнать bit в word и обратно, подскажите пожалуйста все ли я правильно делаю



PROGRAM PLC_PRG
VAR
Var_Word: WORD;
Byte_low: BYTE;
Byte_hi: BYTE;
Byte_low2: BYTE;
Byte_hi2: BYTE;
Bit1: BOOL;
Bit2: BOOL;
Bit3: BOOL;
Bit4: BOOL;
Bit5: BOOL;
Bit7: BOOL;
Bit8: BOOL;
Bit9: BOOL;
Bit10: BOOL;
Bit6: BOOL;
Bit11: BOOL;
Bit12: BOOL;
Bit13: BOOL;
Bit14: BOOL;
Bit15: BOOL;
Bit16: BOOL;

Bits: ARRAY [1..16] OF BOOL;

UNPACK1: UNPACK;
UNPACK2: UNPACK;
PACK1: UNPACK;
PACK2: UNPACK;
END_VAR


(*заполняем биты (библиотека UTIL)*)
Bit1:=1;
Bit2:=0;
Bit3:=0;
Bit4:=0;
Bit5:=0;
Bit6:=0;
Bit7:=0;
Bit8:=0;
Bit9:=1;
Bit10:=0;
Bit11:=0;
Bit12:=0;
Bit13:=0;
Bit14:=0;
Bit15:=0;
Bit16:=0;

(*упаковываем биты в байты*)
Byte_low2:=PACK(Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7 ,Bit8);
Byte_hi2:=PACK(Bit9,Bit10,Bit11,Bit12,Bit13,Bit14, Bit15,Bit16);
(*ну и байты в слово объединям*)
Var_Word:=SHL(BYTE_TO_WORD(Byte_hi2),8) OR BYTE_TO_WORD(Byte_low2);


(*ОБРАТНАЯ ПРОЦЕДУРА Переменная Var_Word разбивается на два байта*)
Byte_low:=WORD_TO_BYTE(Var_word);
Byte_hi:=WORD_TO_BYTE(Var_word/256);

(*байты раскладываются на биты с помощью ФБ Unpack (библиотека UTIL)*)

UNPACK1(
B:=Byte_low ,
B0=>Bits[1],
B1=>Bits[2] ,
B2=>Bits[3] ,
B3=>Bits[4] ,
B4=>Bits[5] ,
B5=>Bits[6] ,
B6=>Bits[7] ,
B7=>Bits[8] );
UNPACK2(
B:=Byte_hi ,
B0=>Bits[9] ,
B1=>Bits[10] ,
B2=>Bits[11] ,
B3=>Bits[12],
B4=>Bits[13] ,
B5=>Bits[14],
B6=>Bits[15],
B7=>Bits[16]);

(*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)

Без всяких массивов, просто и сердито

FUNCTION PACK_W : WORD
VAR_INPUT
B0: BOOL;
B1: BOOL;
B2: BOOL;
B3: BOOL;
B4: BOOL;
B5: BOOL;
B6: BOOL;
B7: BOOL;
B8: BOOL;
B9: BOOL;
B10: BOOL;
B11: BOOL;
B12: BOOL;
B13: BOOL;
B14: BOOL;
B15: BOOL;
END_VAR
VAR
END_VAR
(*Тело функции*)
PACK_W.0:=B0;
PACK_W.1:=B1;
PACK_W.2:=B2;
PACK_W.3:=B3;
PACK_W.4:=B4;
PACK_W.5:=B5;
PACK_W.6:=B6;
PACK_W.7:=B7;
PACK_W.8:=B8;
PACK_W.9:=B9;
PACK_W.10:=B10;
PACK_W.11:=B11;
PACK_W.12:=B12;
PACK_W.13:=B13;
PACK_W.14:=B14;
PACK_W.15:=B15;

В обратную сторону аналогично, используем Bxx:=W.xx, где хх=0,1,2,...15
Или еще вариант

FUNCTION PACK_W2 : WORD
VAR_INPUT
B0: BOOL;
B1: BOOL;
B2: BOOL;
B3: BOOL;
B4: BOOL;
B5: BOOL;
B6: BOOL;
B7: BOOL;
B8: BOOL;
B9: BOOL;
B10: BOOL;
B11: BOOL;
B12: BOOL;
B13: BOOL;
B14: BOOL;
B15: BOOL;
END_VAR
VAR
BYTE_0: BYTE;
BYTE_1: BYTE;
END_VAR
(*Тело функции*)
BYTE_0:=SHL(SHL(SHL(SHL(SHL(SHL(SHL(BOOL_TO_BYTE(B 7),1) OR BOOL_TO_BYTE(B6),1) OR BOOL_TO_BYTE(B5),1) OR BOOL_TO_BYTE(B4),1)
OR BOOL_TO_BYTE(B3),1) OR BOOL_TO_BYTE(B2),1) OR BOOL_TO_BYTE(B1),1) OR BOOL_TO_BYTE(B0);
BYTE_1:=SHL(SHL(SHL(SHL(SHL(SHL(SHL(BOOL_TO_BYTE(B 15),1) OR BOOL_TO_BYTE(B14),1) OR BOOL_TO_BYTE(B13),1) OR BOOL_TO_BYTE(B12),1)
OR BOOL_TO_BYTE(B11),1) OR BOOL_TO_BYTE(B10),1) OR BOOL_TO_BYTE(B9),1) OR BOOL_TO_BYTE(B8);
PACK_W2:=SHL(BYTE_TO_WORD(BYTE_1),8) OR BYTE_TO_WORD(BYTE_0);


А зачем их вообще упаковывать/распаковывать? Не проще ли просто использовать обращение к отдельным битам WORD?

adamst
08.06.2015, 12:34
а мой пример можете адаптировать к Вашему методу, а то появляется много вопросов
т.е. пример загнать 16 бит в слово и потом это слово снова разложить на 16 бит
вот мое предположение как это должно выглядеть:




(*заполняем биты (библиотека UTIL)*)
Bit1:=1;
Bit2:=0;
Bit3:=0;
Bit4:=0;
Bit5:=0;
Bit6:=0;
Bit7:=0;
Bit8:=0;
Bit9:=1;
Bit10:=0;
Bit11:=0;
Bit12:=0;
Bit13:=0;
Bit14:=0;
Bit15:=0;
Bit16:=0;

(*упаковываем биты в байты*)
IF Bit1 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit2 HEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit3 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit4 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit5 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit6 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit7 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit8 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit9 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit10 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit11 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit12 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit13 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit14 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit15 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit16 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;

(*ОБРАТНАЯ ПРОЦЕДУРА*)
(*байты раскладываются на биты*)

IF (Var_Word AND 1024)<>0 THEN Bits[1]:=TRUE; ELSE Bits[1]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[2]:=TRUE; ELSE Bits[2]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[3]:=TRUE; ELSE Bits[3]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[4]:=TRUE; ELSE Bits[4]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[5]:=TRUE; ELSE Bits[5]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[6]:=TRUE; ELSE Bits[6]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[7]:=TRUE; ELSE Bits[7]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[8]:=TRUE; ELSE Bits[8]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[9]:=TRUE; ELSE Bits[9]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[10]:=TRUE; ELSE Bits[10]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[11]:=TRUE; ELSE Bits[11]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[12]:=TRUE; ELSE Bits[12]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[13]:=TRUE; ELSE Bits[13]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[14]:=TRUE; ELSE Bits[14]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[15]:=TRUE; ELSE Bits[15]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[16]:=TRUE; ELSE Bits[16]:=FALSE; END_IF;
(*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)

Scream
08.06.2015, 12:38
а мой пример можете адаптировать к Вашему методу, а то появляется много вопросов
т.е. пример загнать 16 бит в слово и потом это слово снова разложить на 16 бит
вот мое предположение как это должно выглядеть:





(*заполняем биты (библиотека UTIL)*)
Bit1:=1;
Bit2:=0;
Bit3:=0;
Bit4:=0;
Bit5:=0;
Bit6:=0;
Bit7:=0;
Bit8:=0;
Bit9:=1;
Bit10:=0;
Bit11:=0;
Bit12:=0;
Bit13:=0;
Bit14:=0;
Bit15:=0;
Bit16:=0;

(*упаковываем биты в байты*)
IF Bit1 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit2 HEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit3 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit4 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit5 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit6 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit7 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit8 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit9 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit10 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit11 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit12 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit13 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit14 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit15 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit16 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;

(*ОБРАТНАЯ ПРОЦЕДУРА*)
(*байты раскладываются на биты*)

IF (Var_Word AND 1024)<>0 THEN Bits[1]:=TRUE; ELSE Bits[1]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[2]:=TRUE; ELSE Bits[2]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[3]:=TRUE; ELSE Bits[3]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[4]:=TRUE; ELSE Bits[4]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[5]:=TRUE; ELSE Bits[5]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[6]:=TRUE; ELSE Bits[6]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[7]:=TRUE; ELSE Bits[7]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[8]:=TRUE; ELSE Bits[8]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[9]:=TRUE; ELSE Bits[9]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[10]:=TRUE; ELSE Bits[10]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[11]:=TRUE; ELSE Bits[11]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[12]:=TRUE; ELSE Bits[12]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[13]:=TRUE; ELSE Bits[13]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[14]:=TRUE; ELSE Bits[14]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[15]:=TRUE; ELSE Bits[15]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[16]:=TRUE; ELSE Bits[16]:=FALSE; END_IF;
(*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)





да что это за порно!
на мой пост глянь. писать word.0 := true читать if word.0 then ...
http://www.owen.ru/forum/showthread.php?t=10555&page=424&p=172569&viewfull=1#post172569

adamst
08.06.2015, 12:42
Без всяких массивов, просто и сердито
...
А зачем их вообще упаковывать/распаковывать? Не проще ли просто использовать обращение к отдельным битам WORD?
в панель передать чтобы, Bool значения нужно загнать в WORD, и соответсвенно когда их принимаем, тоже считываем их word блоками, вот для этих целей эти манипуляции и нужны,
Ваш метод с обращением намного проще, я и не знал что можно обращаться по битно к word, а dword тоже так можно?

petera
08.06.2015, 13:11
а мой пример можете адаптировать к Вашему методу, а то появляется много вопросов
т.е. пример загнать 16 бит в слово и потом это слово снова разложить на 16 бит
вот мое предположение как это должно выглядеть:




(*заполняем биты (библиотека UTIL)*)
Bit1:=1;
Bit2:=0;
Bit3:=0;
Bit4:=0;
Bit5:=0;
Bit6:=0;
Bit7:=0;
Bit8:=0;
Bit9:=1;
Bit10:=0;
Bit11:=0;
Bit12:=0;
Bit13:=0;
Bit14:=0;
Bit15:=0;
Bit16:=0;

(*упаковываем биты в байты*)
IF Bit1 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit2 HEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit3 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit4 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit5 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit6 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit7 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit8 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit9 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit10 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit11 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit12 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit13 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit14 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit15 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;
IF Bit16 THEN Var_Word:=Var_Word OR 1024; ELSE Var_Word:=Var_Word AND NOT 1024; END_IF;

(*ОБРАТНАЯ ПРОЦЕДУРА*)
(*байты раскладываются на биты*)

IF (Var_Word AND 1024)<>0 THEN Bits[1]:=TRUE; ELSE Bits[1]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[2]:=TRUE; ELSE Bits[2]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[3]:=TRUE; ELSE Bits[3]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[4]:=TRUE; ELSE Bits[4]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[5]:=TRUE; ELSE Bits[5]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[6]:=TRUE; ELSE Bits[6]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[7]:=TRUE; ELSE Bits[7]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[8]:=TRUE; ELSE Bits[8]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[9]:=TRUE; ELSE Bits[9]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[10]:=TRUE; ELSE Bits[10]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[11]:=TRUE; ELSE Bits[11]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[12]:=TRUE; ELSE Bits[12]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[13]:=TRUE; ELSE Bits[13]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[14]:=TRUE; ELSE Bits[14]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[15]:=TRUE; ELSE Bits[15]:=FALSE; END_IF;
IF (Var_Word AND 1024)<>0 THEN Bits[16]:=TRUE; ELSE Bits[16]:=FALSE; END_IF;
(*все получили массив Bits заполненный (другая переменная чтобы легче было оценивать результат) *)





Я уже показал, как загнать 16 бит в WORD

FUNCTION PACK_W : WORD
VAR_INPUT
B0: BOOL;
B1: BOOL;
B2: BOOL;
B3: BOOL;
B4: BOOL;
B5: BOOL;
B6: BOOL;
B7: BOOL;
B8: BOOL;
B9: BOOL;
B10: BOOL;
B11: BOOL;
B12: BOOL;
B13: BOOL;
B14: BOOL;
B15: BOOL;
END_VAR
VAR
END_VAR
(*Тело функции*)
PACK_W.0:=B0;
PACK_W.1:=B1;
PACK_W.2:=B2;
PACK_W.3:=B3;
PACK_W.4:=B4;
PACK_W.5:=B5;
PACK_W.6:=B6;
PACK_W.7:=B7;
PACK_W.8:=B8;
PACK_W.9:=B9;
PACK_W.10:=B10;
PACK_W.11:=B11;
PACK_W.12:=B12;
PACK_W.13:=B13;
PACK_W.14:=B14;
PACK_W.15:=B15;
Обратная процедура

FUNCTION_BLOCK UNPACK_W
VAR_INPUT
In_W: WORD;
END_VAR
VAR_OUTPUT
B0: BOOL;
B1: BOOL;
B2: BOOL;
B3: BOOL;
B4: BOOL;
B5: BOOL;
B6: BOOL;
B7: BOOL;
B8: BOOL;
B9: BOOL;
B10: BOOL;
B11: BOOL;
B12: BOOL;
B13: BOOL;
B14: BOOL;
B15: BOOL;
END_VAR
VAR
END_VAR
B0:=In_W.0;
B1:=In_W.1;
B2:=In_W.2;
B3:=In_W.3;
B4:=In_W.4;
B5:=In_W.5;
B6:=In_W.6;
B7:=In_W.7;
B8:=In_W.8;
B9:=In_W.9;
B10:=In_W.10;
B11:=In_W.11;
B12:=In_W.12;
B13:=In_W.13;
B14:=In_W.14;
B14:=In_W.15;



в панель передать чтобы, Bool значения нужно загнать в WORD, и соответсвенно когда их принимаем, тоже считываем их word блоками, вот для этих целей эти манипуляции и нужны
Да не нужны эти манипуляции с "загнать в WORD", "разогнать из WORD". Все прекрасно передается на панели и из нее.
Просто в программе вместо переменных BOOL манипулируйте сразу отдельными битами переменной WORD, которая определена в конфигурации для связи с панелью.
Неудобно обращаться по номерам разрядов? Тогда обращайтесь к ним по именам.
-определить в глобальных переменных константы INT для отдельных разрядов
18502
Теперь для переменной WORD, через которую идет обмен с панелью
18503
можно в программе, вместо номера разряда в переменной можно обращаться по имени этого разряда
18504
т.е. например, вместо CMD_Panel.0 использовать CMD_Panel.cmdUrov_man.

petera
08.06.2015, 13:34
Можно было еще проще сделать.
В том месте конфигурации ПЛК, где у меня была переменная CMD_Panel, вместо модуля 2 byte вставить два модуля 8bits
18505
И тогда можно эти BOOL переменные использовать в программе, а в панели будет обращаться к двум модулям 8bits как к одному регистру.

adamst
08.06.2015, 13:54
да, интересный подход, с константами замечательно придумано!

приборист
10.06.2015, 12:10
День добрый!
Подскажите, возможно ли сформировать строку указателем прям с начала структуры?

Например:
STRUCT
BYTE
BYTE
WORD
WORD
DWORD
DWORD
DT
DT
end_struct

Занимает она 20 байт. Храню я её на Flash.
Сейчас я вычитываю её в массив Read (тип STRUCT), переделываю в строки и отправляю дальше.
Но я хочу отправить одну строку c содержимым всего файла.
Т.е. вычитали из файла, встали в начало файла и отправили строку байт.
По идее берем p:=ADR(Read);
Где p:pointer to string;
Определяем длину нашего массива (20 байт * кол-во данных + 1)
И загоняем в SysSockSend.

Сейчас пробую без отправки, просто вычитываю массив и пытаюсь сформировать из него строку - а в переменной вижу лишь это:
18536
В данном примере testData - array [0..20] of byte;
Если использовать testDate - STRUCT - значения такие же.

Может просто строка не отображается правильно, а на деле будет работать?

Валенок
10.06.2015, 15:48
Можно. Но начнем с того, что


Например:
STRUCT
BYTE
BYTE
WORD
WORD
DWORD
DWORD
DT
DT
end_struct

Занимает она 20 байт. ?
24 байта. В онлайне

Это может и работать правильно. И отображатся правильно. И при этом быть как Вас. Курим про asciiZ

capzap
10.06.2015, 15:54
Можно. Но начнем с того, что

24 байта. В онлайне

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

приборист
10.06.2015, 15:54
Можно. Но начнем с того, что

24 байта. В онлайне

Лишку я дал с Word :)
STRUCT
BYTE
BYTE
WORD
DWORD
DWORD
DT
DT
end_struct

По факту 20 байт, и на Flash сохраняется соответственно кратно 20.


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

Я могу и не отказываться от структуры, мне не понятно почему присваивая значение указателя строке - я получаю пару пробелов.

приборист
10.06.2015, 16:23
По поводу проекта - вот пример.
Файлик - пример данных. Разархивировать и в папку C:\Program Files (x86)\3S CODESYS\GatewayPLC
C Control Win V3 работает.
По факту получаем строку длиной в 3 символа.

capzap
10.06.2015, 16:40
По поводу проекта - вот пример.
Файлик - пример данных. Разархивировать и в папку C:\Program Files (x86)\3S CODESYS\GatewayPLC
C Control Win V3 работает.
По факту получаем строку длиной в 3 символа.
а загляните в этот проект, может вместо массива указатель на строку читать из файла, так не проще будет
http://www.owen.ru/forum/showthread.php?t=17003&p=141820&viewfull=1#post141820

ЗЫ это при условии что у Вас в файле строчные символы, если же это бинарник из числовых типов данных, то кроме как преобразовать "ручками" в проекте подругому не получится, и строка у Вас выдается правильно, просто нечитаемые символы не видны

приборист
10.06.2015, 18:55
а загляните в этот проект, может вместо массива указатель на строку читать из файла, так не проще будет
http://www.owen.ru/forum/showthread.php?t=17003&p=141820&viewfull=1#post141820

ЗЫ это при условии что у Вас в файле строчные символы, если же это бинарник из числовых типов данных, то кроме как преобразовать "ручками" в проекте подругому не получится, и строка у Вас выдается правильно, просто нечитаемые символы не видны

Спасибо за пример, сейчас посмотрю.
В файле действительно числовые данные. Но длина строки равна 3, а данных там 20 байт.

capzap
10.06.2015, 19:13
В файле действительно числовые данные. Но длина строки равна 3, а данных там 20 байт.
значит попалось три раза число 20 означающее пробел, отсюда и длинна строки

приборист
10.06.2015, 19:20
значит попалось три раза число 20 означающее пробел, отсюда и длинна строки

03 01 07 00 00 00 00 00 A2 07 00 00 33 0F A4 55 34 0F A4 55

Два раза в одни и те же грабли ;)

Валенок уже говорил про это месяц тому назад, в этой же теме, по похожему вопросу :)
В общем отправлять через SendByte либо SysSockSend должен нормально, но в строке мы это не увидим :)

В очередной раз Всем спасибо!
Пойду пытать HyperTerminal и отправлять в него.

100xanoff
10.06.2015, 23:34
Подскажите, поиском не нашел.

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

100xanoff
11.06.2015, 01:49
Подскажите, поиском не нашел.

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

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

Теперь другой вопрос:
У меня контроллер ModBus to DMX512 принимает на вход команды Holding Registers, то есть двухбайтовые значения, но т.к. один канал это один байт получается один регистр управляет сразу двумя каналами. А хотелось бы управлять каналами как отдельными байтами. Как это можно реализовать?

Ryzhij
11.06.2015, 09:42
Традиционное решение "в лоб" состоит из:
1. Чтения всего регистра (двух каналов);
2. Изменения нужного байта;
3. Записи нового значения в регистр.

Вольд
11.06.2015, 11:09
У меня контроллер ModBus to DMX512 принимает на вход команды Holding Registers, то есть двухбайтовые значения, но т.к. один канал это один байт получается один регистр управляет сразу двумя каналами. А хотелось бы управлять каналами как отдельными байтами. Как это можно реализовать?
Вам удалось реализовать протокол DMX512 на ПЛК "ОВЕН" ?

Yegor
11.06.2015, 11:18
Вам удалось реализовать протокол DMX512 на ПЛК "ОВЕН" ?Из не совсем внятного описания мне кажется, что там отдельный преобразователь модбас > дмх512. В этом случае просто складывать два байта в одно слово. SHL в помощь.

Prototype2
12.06.2015, 14:08
Всем привет! Вот начал изучать программирование в СoDeSys v2.3. Ну и начал со стандартной книги по руководству codesys_v23_ru. Ну и в первом же разделе наткнулся на проблемку, есть функция пример.
Пример функции, написанной на языке IL:
FUNCTION Fct :INT
VAR_INPUT
PAR1:INT;
PAR2:INT;
PAR3:INT;
END_VAR
_______________
LD PAR1
MUL PAR2
DIV PAR3
ST Fct
Ну вот, проект я скомпилировал все нормально ошибок нет. Но как присвоить этим переменным значения численные сломал голову. Там говорится: Вот пример функции, написанной на IL, которая использует три входных пе-
ременных и возвращает результат деления произведения первых двух на третью. А как увидеть это наглядно в цифрах?? Хто знает подскажите хочу продвигатся дальше а тут ступор. ЗАРАНЕЕ СПАСИБО!!!

petera
12.06.2015, 14:37
Всем привет! Вот начал изучать программирование в СoDeSys v2.3. Ну и начал со стандартной книги по руководству codesys_v23_ru. Ну и в первом же разделе наткнулся на проблемку, есть функция пример.
Пример функции, написанной на языке IL:
FUNCTION Fct :INT
VAR_INPUT
PAR1:INT;
PAR2:INT;
PAR3:INT;
END_VAR
_______________
LD PAR1
MUL PAR2
DIV PAR3
ST Fct
Ну вот, проект я скомпилировал все нормально ошибок нет. Но как присвоить этим переменным значения численные сломал голову. Там говорится: Вот пример функции, написанной на IL, которая использует три входных пе-
ременных и возвращает результат деления произведения первых двух на третью. А как увидеть это наглядно в цифрах?? Хто знает подскажите хочу продвигатся дальше а тут ступор. ЗАРАНЕЕ СПАСИБО!!!
Можно задавать начальные значения для переменных
18561
После запуска программы
18562

ЗЫ. При работающей программе
18563

Получится так
18564

Что бы изменения вступили в силу нажать F7
18565

ООО "БЛС инжинеринг"
12.06.2015, 16:13
Как можно собрать схему на CFC и сохранить как шаблон чтобы по 100 раз не писать одно и тоже?
Если можно то скриншот.

Василий Кашуба
12.06.2015, 16:43
Как можно собрать схему на CFC и сохранить как шаблон чтобы по 100 раз не писать одно и тоже?
Если можно то скриншот.
Нужно этот кусок схемы написать как ФБ, а не ПРГ, и потом в программе его тиражировать.

ООО "БЛС инжинеринг"
12.06.2015, 21:38
Нужно этот кусок схемы написать как ФБ, а не ПРГ, и потом в программе его тиражировать.

Ну если я правильно понял то это оно?18571 а если это то то потом как его сохранить?
(Я новичок)

Василий Кашуба
13.06.2015, 09:33
Ну если я правильно понял то это оно?18571 а если это то то потом как его сохранить?
(Я новичок)
Это оно и оно само сохранится, как и ПРГ.18574

ООО "БЛС инжинеринг"
14.06.2015, 21:03
Какой есть FB в CFC что на панельки вводишь значение (пример) от 1 до 10 (WORD) а на выходе есть 10 выходов (BOOL) которые переключаются в зависимости от указанной цифры

_Mikhail
14.06.2015, 21:12
Какой есть FB в CFC что на панельки вводишь значение (пример) от 1 до 10 (WORD) а на выходе есть 10 выходов (BOOL) которые переключаются в зависимости от указанной цифры

не 10 а 8 называется UNPACK

energvk
15.06.2015, 09:07
Организовал управление ПЧ с ПЛК160 по RS-485. Обратил внимание, что набор частоты (уставка с ПИД-регулятора) на ПЧ идёт заметными рывками. При этом скорость опроса стояла по умолчанию - 100 мс. Увеличение скорости с 9600 на 19200 эффекта не дало. Снизил время опроса ПЧ до 10 мс стало всё ровно. В связи с этим возник вопрос, это нормально или нет? Мне казалось что 10 раз в секунду более чем адекватная скорость.

Yegor
15.06.2015, 09:19
Организовал управление ПЧ с ПЛК160 по RS-485. Обратил внимание, что набор частоты (уставка с ПИД-регулятора) на ПЧ идёт заметными рывками. При этом скорость опроса стояла по умолчанию - 100 мс. Увеличение скорости с 9600 на 19200 эффекта не дало. Снизил время опроса ПЧ до 10 мс стало всё ровно. В связи с этим возник вопрос, это нормально или нет? Мне казалось что 10 раз в секунду более чем адекватная скорость.Это не нормально, но это ожидаемо в случае со стандартным опрашивателем. Подробнее — экспортируйте конфигурацию и выкладывайте её сюда.

energvk
15.06.2015, 09:31
Как вариант проверить через библиотеку можно? Экспорт конфигурации в приложении
18582

Yegor
15.06.2015, 09:48
Вооот... На каждый register input (output) module отводится свой 100-миллисекундный интервал (который вы потом поставили на 10). Соответственно, каждый отдельный регистр у вас записывался/считывался не чаще, чем каждые 100 &#215; 6 = 600 мс. И нет, запросы даже по смежным регистрам не группируются — всё отдельными запросами. Это вы ещё легко отделались, т.к. у вас лишь одно устройство на порту. Когда их несколько, то начинается битва за порт. Такова стратегия опроса по умолчанию.

Что можно сделать помимо библиотеки... Ну, частоту вы уже попробовали повысить. В более сложных сценариях можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров. Ещё там есть активируемые вручную модули (которые state) — ими тоже можно спланировать опрос по-своему.

energvk
15.06.2015, 10:56
Всё понятно, спасибо большое за разъяснение.


В более сложных сценариях можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров.

Не подскажите чуть подробнее?

petera
15.06.2015, 11:05
Вооот... На каждый register input (output) module отводится свой 100-миллисекундный интервал (который вы потом поставили на 10). Соответственно, каждый отдельный регистр у вас записывался/считывался не чаще, чем каждые 100 &#215; 6 = 600 мс. И нет, запросы даже по смежным регистрам не группируются — всё отдельными запросами. Это вы ещё легко отделались, т.к. у вас лишь одно устройство на порту. Когда их несколько, то начинается битва за порт. Такова стратегия опроса по умолчанию.

Что можно сделать помимо библиотеки... Ну, частоту вы уже попробовали повысить. В более сложных сценариях можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров. Ещё там есть активируемые вручную модули (которые state) — ими тоже можно спланировать опрос по-своему.


Всё понятно, спасибо большое за разъяснение.
Не подскажите чуть подробнее?
Фишка с "можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку. А это не наш случай.
Самый простой способ
1. поместить регистры "управляющая команда на ПЧ" и "задание частоты" в отдельные UMD с WorkMode - By value change, т.е. запись в ПЧ будет только при изменении значения регистров в программе.
2. Все остальные input регистры оставить в третьем UMD для которого оставить WorkMode - By poll time
18584

Yegor
15.06.2015, 11:14
Модбас предусматривает групповое чтение регистров, но в Овено-Кодесисе оно реализуется только для чтения в строковый тип.

Например, надо читать сразу 20 смежных регистров, и часто. Добавляем String input module, в параметрах указываем подходящую функцию (Read Holding Registers), номер первого регистра и сколько надо прочитать в байтах (один регистр — два байта, то есть ставим 40). Подписываем эту строку как-нибудь типа ModbusRawInput. Дальше пользуемся функцией SysMemCpy из библиотеки SysLibMem, чтобы раздербанивать байты этой строки в переменные программы:
SysMemCpy(ADR(T0_Setpoint), ADR(ModbusRawInput) + 0, SIZEOF(T0_Setpoint));
SysMemCpy(ADR(T1_Setpoint), ADR(ModbusRawInput) + 2, SIZEOF(T1_Setpoint));... и так далее по карте регистров. То есть смысл в том, чтобы взять все регистры одной охапкой с устройства, а уже потом их разобрать.

energvk
15.06.2015, 11:19
Фишка с "можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку. А это не наш случай.
Самый простой способ
1. поместить регистры "управляющая команда на ПЧ" и "задание частоты" в отдельные UMD с WorkMode - By value change, т.е. запись в ПЧ будет только при изменении значения регистров в программе.
2. Все остальные input регистры оставить в третьем UMD для которого оставить WorkMode - By poll time
18584


Да, спасибо petera, я так уже и сделал. Единственно в чём сомнения, "текущее частота ПЧ" и "текущий ток ПЧ", мне не требуется получать так часто, вполне устроит и раз в секунду, поэтому я думаю эти два параметра выделить в 4-й блок. Это же правильно? Или будет пересекаться с 3-м блоком?

И по
"можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку.
Это же всё равно через библиотеку только решается, правильно?

petera
15.06.2015, 11:29
Да, спасибо petera, я так уже и сделал. Единственно в чём сомнения, "текущее частота ПЧ" и "текущий ток ПЧ", мне не требуется получать так часто, вполне устроит и раз в секунду, поэтому я думаю эти два параметра выделить в 4-й блок. Это же правильно? Или будет пересекаться с 3-м блоком?
Пересекаться? Каким образом? Делайте столько UMD, сколько пожелаете и для каждого могут быть свои настройки WorkMode.

И по
Это же всё равно через библиотеку только решается, правильно?
Это делается без библиотек, на стандартной конфигурации, например http://www.owen.ru/forum/showthread.php?t=17207&p=141316&viewfull=1#post141316

energvk
15.06.2015, 12:09
petera

Цитата Сообщение от energvk Посмотреть сообщение
Да, спасибо petera, я так уже и сделал. Единственно в чём сомнения, "текущее частота ПЧ" и "текущий ток ПЧ", мне не требуется получать так часто, вполне устроит и раз в секунду, поэтому я думаю эти два параметра выделить в 4-й блок. Это же правильно? Или будет пересекаться с 3-м блоком?
Пересекаться? Каким образом? Делайте столько UMD, сколько пожелаете и для каждого могут быть свои настройки WorkMode.
И по
Это же всё равно через библиотеку только решается, правильно?
Это делается без библиотек, на стандартной конфигурации, например http://www.owen.ru/forum/showthread....l=1#post141316

Сегодня, 10:19
energvk

Цитата Сообщение от petera Посмотреть сообщение
Фишка с "можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку. А это не наш случай.
Самый простой способ
1. поместить регистры "управляющая команда на ПЧ" и "задание частоты" в отдельные UMD с WorkMode - By value change, т.е. запись в ПЧ будет только при изменении значения регистров в программе.
2. Все остальные input регистры оставить в третьем UMD для которого оставить WorkMode - By poll time
Вложение 18584

Да, спасибо petera, я так уже и сделал. Единственно в чём сомнения, "текущее частота ПЧ" и "текущий ток ПЧ", мне не требуется получать так часто, вполне устроит и раз в секунду, поэтому я думаю эти два параметра выделить в 4-й блок. Это же правильно? Или будет пересекаться с 3-м блоком?

И по
"можно воспользоваться модулями ввода/вывода строк, а строки рассматривать как буферы приёма и отправки регистров" применима если ареса для регистров идут по порядку.
Это же всё равно через библиотеку только решается, правильно?

Сегодня, 10:14
Yegor

Модбас предусматривает групповое чтение регистров, но в Овено-Кодесисе оно реализуется только для чтения в строковый тип.

Например, надо читать сразу 20 смежных регистров, и часто. Добавляем String input module, в параметрах указываем подходящую функцию (Read Holding Registers), номер первого регистра и сколько надо прочитать в байтах (один регистр — два байта, то есть ставим 40). Подписываем эту строку как-нибудь типа ModbusRawInput. Дальше пользуемся функцией SysMemCpy из библиотеки SysLibMem, чтобы раздербанивать байты этой строки в переменные программы:
Код:

SysMemCpy(ADR(T0_Setpoint), ADR(ModbusRawInput) + 0, SIZEOF(T0_Setpoint));
SysMemCpy(ADR(T1_Setpoint), ADR(ModbusRawInput) + 2, SIZEOF(T1_Setpoint));

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



Yegor и petera большое спасибо за подробные и понятные разъяснения.

Prototype2
15.06.2015, 18:28
Всем привет! Учу по книжке) Подскажите пожалуйста куда вписывать это выражение что ниже, чтобы вызвать ресет для функционального блока????? ЗАРАНЕЕ БЛАГОДАРЕН!
Выражение:
Inst.Reset(in:= FALSE);
Erg:= Inst.out;

Ф-ний блок:
FUNCTION_BLOCK Counter
VAR_INPUT
in:BOOL;
END_VAR
VAR_OUTPUT
out:INT;
END_VAR
--------------------------
IF in THEN
out:=out+1;
ELSE
out:=out-1;
END_IF

amn
15.06.2015, 19:21
Не видно связи выражения с представленным функциональным блоком (сокращенно ФБ). Если хотите обнулить переменную out в ФБ Counter, то Вам надо в этом блоке добавить вход reset. И уже на него подавать сигнал для сброса.

FUNCTION_BLOCK Counter
VAR_INPUT
in:BOOL;
reset:bool;
END_VAR
VAR_OUTPUT
out:INT;
END_VAR
--------------------------
IF reset THEN
out:=0;
ELSIF in THEN
out:=out+1;
ELSE
out:=out-1;
END_IF
------
для обнуления вызываем блок
Counter(reset:=true);

В этом случае на выходе блока будет все время 0, пока не вызовем блок с параметром false.
Counter(reset:=false);

Prototype2
15.06.2015, 20:32
Не видно связи выражения с представленным функциональным блоком (сокращенно ФБ). Если хотите обнулить переменную out в ФБ Counter, то Вам надо в этом блоке добавить вход reset. И уже на него подавать сигнал для сброса.

FUNCTION_BLOCK Counter
VAR_INPUT
in:BOOL;
reset:bool;
END_VAR
VAR_OUTPUT
out:INT;
END_VAR
--------------------------
IF reset THEN
out:=0;
ELSIF in THEN
out:=out+1;
ELSE
out:=out-1;
END_IF
------
для обнуления вызываем блок
Counter(reset:=true);

В этом случае на выходе блока будет все время 0, пока не вызовем блок с параметром false.
Counter(reset:=false);

Ну все дабы хорошо но как вызватьCounter(reset:=true); куда его вписывать вообще как все вызывать где прописивать эти вызовы????))))))))

Prototype2
15.06.2015, 20:37
18591

Короче как зделать так?

capzap
15.06.2015, 20:56
18591

Короче как зделать так?
ну так прочтите в документации, что такое действие, если пока не понимаете его предназначения делайте проще, как Вам посоветовали с добавлением входной переменной

Prototype2
15.06.2015, 21:11
ну так прочтите в документации, что такое действие, если пока не понимаете его предназначения делайте проще, как Вам посоветовали с добавлением входной переменной

Ну а если я не могу понять по книжке то что???? Зачем нужен форум и этот раздел для прикола????

capzap
15.06.2015, 21:24
Ну а если я не могу понять по книжке то что???? Зачем нужен форум и этот раздел для прикола????

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

Prototype2
15.06.2015, 21:48
если Вы действительно хотите изучать КДС, то повторно отправляю Вас к документации, а если ради прикола, то займитесь чем нибудь другим, например пойдите в дворники.
под тем рисунком, что Вы тут выложиди ясно и понятно написано как вызывается действие - через точку в случае если вызов идет из родителя, а если внутри самого ПОУ то просто как функция без аргументов

Вообще то я никого не оскорблял и не посылал в дворники как вы. Я нормально спросил культурно, а вы снова говорите на языке программирования. Я понимаю у вас там стаж много лет вы думаете что любому человеку доступны ваши слова без наглядного примера, но не все люди одинаковы не все понимают легко, некоторым надо показать тогда они понимают и двигаются дальше. А вы сразу в дворники. Эта стандартная книжка не сильно доступно обьясняет ели на то пошло и начинающий челове к не понимает теряется....

amn
15.06.2015, 22:04
По какой книжке Вы учитесь? Советую для начала найти в инете и почитать книгу
Петров И.В. Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования сразу отпадет куча вопросов.

Prototype2
15.06.2015, 22:36
По какой книжке Вы учитесь? Советую для начала найти в инете и почитать книгу
Петров И.В. Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования сразу отпадет куча вопросов.

Я учу по стандартному руководству с сайта Овен.))) Спасибо за совет обязательно скачаю посмотрю прочту!!!

100xanoff
16.06.2015, 00:01
Подскажите как проще всего побайтно записывать двухбайтовую переменную типа WORD. Возможно есть встроенная функция, желательно в FBD?
Получается только побитово, через указание номера бита после точки.

У меня получается не очень эстетично:
18593

Yegor
16.06.2015, 06:02
Оформите отдельным функциональным блоком — будет эстетично.

capzap
16.06.2015, 08:07
Вообще то я никого не оскорблял и не посылал в дворники как вы. Я нормально спросил культурно, а вы снова говорите на языке программирования. Я понимаю у вас там стаж много лет вы думаете что любому человеку доступны ваши слова без наглядного примера, но не все люди одинаковы не все понимают легко, некоторым надо показать тогда они понимают и двигаются дальше. А вы сразу в дворники. Эта стандартная книжка не сильно доступно обьясняет ели на то пошло и начинающий челове к не понимает теряется....

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

Prototype2
16.06.2015, 12:27
начинающий должен в школе получить базовые знания по информатике, вот выложил пример, посмотрим как это Вам поможет

Спасибо но я сам допёр уже просто вчера уставший мозг не варил с утра встал все пошло) Но спасибо, посмотрю ваш вариант.

ООО "БЛС инжинеринг"
16.06.2015, 21:46
Подскажите что я не так сделал? показываю пример 18604 18603 почему равенство не работает?

Василий Кашуба
16.06.2015, 22:00
Подскажите что я не так сделал? показываю пример 18604 18603 почему равенство не работает?
А кнопочку "Старт" нажимали?18605

ООО "БЛС инжинеринг"
16.06.2015, 22:09
Да нажимал:) вот при запуске как есть 18607 если можно скинте проектик

_Mikhail
16.06.2015, 22:24
Да нажимал:) вот при запуске как есть 18607 если можно скинте проектик

Судя по скрину, у тебя не подтверждено изменение переменной Ctrl+F7

ООО "БЛС инжинеринг"
16.06.2015, 22:41
Судя по скрину, у тебя не подтверждено изменение переменной Ctrl+F7

Спасибо:) оказалось что нужно было нажать Ctrl+F718608

smk1635
16.06.2015, 23:17
Спасибо:) оказалось что нужно было нажать Ctrl+F718608

Павел, ну ты даёшь! :D

ООО "БЛС инжинеринг"
16.06.2015, 23:53
Павел, ну ты даёшь! :D

Да сам поражаюсь:o

Арс
20.06.2015, 22:13
Здравствуйте, помогите пожалуйста. После загрузки программы в контроллер, не виден ход времени переменных типа тайм, хотя видно что цикл отрабатывается, т.е. понятно потому что происходит кратковременное мигание выходного сигнала согласно программе. так же согласно программе после определенного времени, должен включится светодиод, (дискретный выход) на контроллере плк100. но он не включается
В режиме эмуляции ход времени виден.

Арс
20.06.2015, 22:26
Нашел ошибку. Нужно было зафиксировать значение, а не записать. :-)

Арс
23.06.2015, 11:36
Здравствуйте, подскажите пожалуйста. В Codesys в параметрах связи создал SERIL MODEM, где указал INIT-ATZ, DIAL- ATDT+номер телефона, Timeout-30c, Port-3, скорость 9600. все остальное оставил по умолчанию. Подключил настроенный модем IRZ к компьютеру, подключаюсь, выдается ошибка связи #0, в чем может быть проблема?

ООО "БЛС инжинеринг"
24.06.2015, 18:00
Нашел ошибку. Нужно было зафиксировать значение, а не записать. :-)

Да нашел и понял свой косяк...

ООО "БЛС инжинеринг"
24.06.2015, 18:11
Подскажите какой есть функциональный блок который слаживает несколько значений водно?
ПРИМЕР: Подключены три счетчика расходомера жидкости параллельно, чтоб повысить пропускаемую способность, но нужно с трёх счётчиков суммировать значение водно.

Эдуард_Н
24.06.2015, 18:24
Ответ в вопросе.

ООО "БЛС инжинеринг"
24.06.2015, 23:05
Ответ в вопросе.

Вот первый пример но он не катит из-за того что возможно из двух-трёх счётчиков одновременно будет сигнал 18729 а вот второй более подходит но тоже то18730 подскажите а лучше скриншот

Василий Кашуба
24.06.2015, 23:18
Вот первый пример но он не катит из-за того что возможно из двух-трёх счётчиков одновременно будет сигнал 18729 а вот второй более подходит но тоже то18730 подскажите а лучше скриншот
Вариант 2, но вместо "или", поставьте "+", а последний счётчик уберите, и счётчик №3 поставьте с выходом (INT не BOOL).

Василий Кашуба
25.06.2015, 16:30
Вариант 2, но вместо "или", поставьте "+", а последний счётчик уберите, и счётчик №3 поставьте с выходом (INT не BOOL).
Уточнение, вместо счётчика №4, перед Выход Qut, ФБ сравнение ">=" или "<=", в зависимости от того, что нужно.

ООО "БЛС инжинеринг"
25.06.2015, 21:01
Уточнение, вместо счётчика №4, перед Выход Qut, ФБ сравнение ">=" или "<=", в зависимости от того, что нужно.

Спасибо. Вот я сделал набросок ну и всё работает 18763

ООО "БЛС инжинеринг"
27.06.2015, 23:43
Кто подскажет ПРИМЕР: 18794 Это выбор уставок, а как можно сделать так чтоб цифровой можно выбрать уставки для редактирования?

ООО "БЛС инжинеринг"
28.06.2015, 21:53
Кто подскажет ПРИМЕР: 18794 Это выбор уставок, а как можно сделать так чтоб цифровой можно выбрать уставки для редактирования?

Разве не кто не знает как?

приборист
28.06.2015, 22:08
Разве не кто не знает как?
Если честно, не ясно что именно нужно :)

ООО "БЛС инжинеринг"
28.06.2015, 23:25
Если честно, не ясно что именно нужно :)

ПРИМЕР:
1) При нажатии на А1 выбираем уставку U2 и эта уставка отображается в окне W при этом её возможно редактировать (корректировать)

2) Если нажимаем на А1 и выбираем уставку U4 то также в окне W отображается уже уставка U4.
То есть при выборе любой уставки чтоб была возможность её редактировать в одном окне 18804

capzap
28.06.2015, 23:51
ПРИМЕР:
1) При нажатии на А1 выбираем уставку U2 и эта уставка отображается в окне W при этом её возможно редактировать (корректировать)

2) Если нажимаем на А1 и выбираем уставку U4 то также в окне W отображается уже уставка U4.
То есть при выборе любой уставки чтоб была возможность её редактировать в одном окне 18804

и кто мешает по фронту задать фиксированную уставку, а далее редактировать её как хочется

Данис
29.06.2015, 12:12
Программирую ПЛК110 на CFC.

Контроллер подключен в качестве Modbus slave к панели оператора Weintek.
Одна из уставок задается с панели оператора. Каким образом задать для этой уставки значение по умолчанию, чтобы при пуске и работе контроллера без панели это значение было ненулевым?

_Mikhail
29.06.2015, 12:34
Программирую ПЛК110 на CFC.

Контроллер подключен в качестве Modbus slave к панели оператора Weintek.
Одна из уставок задается с панели оператора. Каким образом задать для этой уставки значение по умолчанию, чтобы при пуске и работе контроллера без панели это значение было ненулевым?

переменная RETAIN в памяти ПЛК

petera
29.06.2015, 12:37
Программирую ПЛК110 на CFC.

Контроллер подключен в качестве Modbus slave к панели оператора Weintek.
Одна из уставок задается с панели оператора. Каким образом задать для этой уставки значение по умолчанию, чтобы при пуске и работе контроллера без панели это значение было ненулевым?
Т.к. все переменные в модуле Slave являются retain по умолчанию, то достаточно один раз ввести начальное значение с панели. После этого панель можно даже не включать, значение переменной останется таким, каким было перед выключением ПЛК.
В общем случае нужно объявить в разделе глобальных переменных
VAR_GLOBAL RETAIN
My_1 AT %QW7.1.0: WORD := 100;
END_VAR
где %QW7.1.0 -соответствующий адрес из конфигурации Slave.
При этом этот адрес не должен быть именован в Slave.

ЗЫ. Но в последнем случае переменная My_1 всегда будет равна 100 после каждого включения ПЛК.

Данис
29.06.2015, 13:03
Т.к. все переменные в модуле Slave являются retain по умолчанию, то достаточно один раз ввести начальное значение с панели. После этого панель можно даже не включать, значение переменной останется таким, каким было перед выключением ПЛК.
В общем случае нужно объявить в разделе глобальных переменных
VAR_GLOBAL RETAIN
My_1 AT %QW7.1.0: WORD := 100;
END_VAR
где %QW7.1.0 -соответствующий адрес из конфигурации Slave.
При этом этот адрес не должен быть именован в Slave.

ЗЫ. Но в последнем случае переменная My_1 всегда будет равна 100 после каждого включения ПЛК.

Спасибо, за подробный ответ. Вроде все понятно. Буду пробовать.

Эдуард_Н
29.06.2015, 16:34
Не знаю как Weintek и где у него ретейн, а в другой панели пришлось делать передачу уставки с панели в ПЛК по триггеру иначе при включении панель всё переписывала в ноль.

Smaily
02.07.2015, 13:00
Добрый день товарищи форумчане, прошу=молю о помощи, изучаю само программирование контроллеров месяца 2 с перерывами, от силы 3, источником знаний пока использую - переведенный хэлп Codesys, книга Петрова И.В. "Программируемые контроллеры. Стандартные языки и приемы прикладного программирования", пара-тройка MSPP презентаций семинаров найденных в сети,книжка в 3х частях Гайнутдинова К.Р."Простое и понятное программирование в Codesys", РЭ ПЛК. Начал писать программу для связки ПЛК+мдвв, под рукой пока только ПЛК150+МВУ поэтому использую входы ПЛК некоторые выходы ПЛК и несколько выходов МВУ.
Написал все сначала на ST, не очень понравился набор букв в виду того что использовал там только простейшие IF THEN ELSE, переписал на CFC с объявлением локальных переменных BOOL типа, нарисовал визуализацию, начал читать внимательнее уже как адресовать и присвоить выходам модуля переменные - понял, что надо многое исправлять, так как логика написанна только на BOOL переменные, а в модуль необходимо отправлять WORD, убил кучу времени на перебивку, узнал попутно о операндах EQ и MUL, обрезал лишние элементы, но как нужно не работает, прикладываю проект с встроенными программами. Помогите/натолкните на топик/тему где нужно внимательнее читать чтобы облегчить эту нарисованную паутину, заранее извиняюсъ за запутанный и неразборчивый вид POU, самоучка.
Попутно есть вопрос о возможности использования чтения состояния выходов, ибо перерыл многое, но не понял как исопльзовать если вообще разрешено использовать var_in_out глобально, возможно от этого и идут все грабли по которым я иду изначально.
Прил. в архиве:
1.GAZ_VOZDUH - то, что писал изначально, исполняющая программа на которую опирается визуализация - proba
2.GAZ-VOZDUH_PREPARE TO WORD - то, что я намудрил с конвертированием сигнала, исполняющая программа к которой привязаны и входы/выходы в конфигурации ПЛК и визуализация - proba, предыдущий код в proba_OLD.

capzap
02.07.2015, 14:16
Добрый день товарищи форумчане, прошу=молю о помощи, изучаю само программирование контроллеров месяца 2 с перерывами, от силы 3, источником знаний пока использую - переведенный хэлп Codesys, книга Петрова И.В. "Программируемые контроллеры. Стандартные языки и приемы прикладного программирования", пара-тройка MSPP презентаций семинаров найденных в сети,книжка в 3х частях Гайнутдинова К.Р."Простое и понятное программирование в Codesys", РЭ ПЛК. Начал писать программу для связки ПЛК+мдвв, под рукой пока только ПЛК150+МВУ поэтому использую входы ПЛК некоторые выходы ПЛК и несколько выходов МВУ.
Написал все сначала на ST, не очень понравился набор букв в виду того что использовал там только простейшие IF THEN ELSE, переписал на CFC с объявлением локальных переменных BOOL типа, нарисовал визуализацию, начал читать внимательнее уже как адресовать и присвоить выходам модуля переменные - понял, что надо многое исправлять, так как логика написанна только на BOOL переменные, а в модуль необходимо отправлять WORD, убил кучу времени на перебивку, узнал попутно о операндах EQ и MUL, обрезал лишние элементы, но как нужно не работает, прикладываю проект с встроенными программами. Помогите/натолкните на топик/тему где нужно внимательнее читать чтобы облегчить эту нарисованную паутину, заранее извиняюсъ за запутанный и неразборчивый вид POU, самоучка.
Попутно есть вопрос о возможности использования чтения состояния выходов, ибо перерыл многое, но не понял как исопльзовать если вообще разрешено использовать var_in_out глобально, возможно от этого и идут все грабли по которым я иду изначально.
Прил. в архиве:
1.GAZ_VOZDUH - то, что писал изначально, исполняющая программа на которую опирается визуализация - proba
2.GAZ-VOZDUH_PREPARE TO WORD - то, что я намудрил с конвертированием сигнала, исполняющая программа к которой привязаны и входы/выходы в конфигурации ПЛК и визуализация - proba, предыдущий код в proba_OLD.


IF _vozduh =FALSE THEN
B14_:=TRUE;
ELSE B14_:=FALSE;
END_IF почему не заменить на B14_:=NOT _vozduh;
по поводу CFC если работает как задумано, то можно и не трогать
шаблонами в конфигурации настоятельно не рекомендую пользоваться

Smaily
02.07.2015, 14:45
почему не заменить на B14_:=NOT _vozduh;
по поводу CFC если работает как задумано, то можно и не трогать
шаблонами в конфигурации настоятельно не рекомендую пользоваться
По поводу B14, думаю скорее всего так и надо, спасибо!
К вопросу о CFC и шаблонах, т.е. можно отправлять в модули мдвв/мву простые BOOL 1/0 через Modbus(Master)->Universal Modbus Device создавая 8bit и ни о какой "скважности" не заморачиваться, либо связь с дискретными входами/выходами для переменных BOOL типа происходит по другим подэлементам?

capzap
02.07.2015, 14:52
главное шаблонами не пользуйтесь, они могут работать не корректно

по поводу В14 - это касается всего ПОУ а не отдельно взятого элемента

Sergey666
02.07.2015, 20:14
Настоятельно не рекомендую использовать в операторах сравнения выражения с "=" , лучше ">=" или "<=" ! Петров конечно хороший парень , только фигов теоретик , по его писанию работать это как боевые приемы по книжкам изучать - вроде все ОК , выучил , а на улице гопники табло набили , обидно да !
Практика и еще раз практика , а также опыт и алкоголь :p

Вольд
03.07.2015, 11:15
Петров конечно хороший парень , только фигов теоретик , по его писанию работать это как боевые приемы по книжкам изучать - вроде все ОК , выучил , а на улице гопники табло набили , обидно да !
Практика и еще раз практика , а также опыт и алкоголь :p
Херню несешь. И.Петров - это голова. Он и практик и теоретик.

Ryzhij
03.07.2015, 11:39
Настоятельно не рекомендую использовать в операторах сравнения выражения с "=" , лучше ">=" или "<=" ! Рекомендацию поддерживаю.

От оценок границ компетентности г-на Петрова воздержусь. Как методист и технический писатель лично мне от симпатичен.

Smaily
03.07.2015, 14:40
В общем-то остался на CFC, почитал про упаковку, упаковал 8 выходных переменных, записал в конфигурацию через Modbus Master -> 8bit output module , дал название согласно упакованному биту, и раздал каждому биту по переменной согласно упаковке бит к биту,но никак не могу связаться с мву, т.е. в эмуляции как и прежде все без проблем работает, по крайней мере в инструкции и в визуализации все показано как и задумано, укажите плз мне на ошибку.Проект приложил.
По книге Петрова ничего плохого сказать не могу, ибо читаю пока для себя первый полноценный учебник по данной теме, посему судить не могу о качестве изложения, прочитал пока только треть книги.

_Mikhail
03.07.2015, 14:57
В общем-то остался на CFC, почитал про упаковку, упаковал 8 выходных переменных, записал в конфигурацию через Modbus Master -> 8bit output module , дал название согласно упакованному биту, и раздал каждому биту по переменной согласно упаковке бит к биту,но никак не могу связаться с мву, т.е. в эмуляции как и прежде все без проблем работает, по крайней мере в инструкции и в визуализации все показано как и задумано, укажите плз мне на ошибку.Проект приложил.
По книге Петрова ничего плохого сказать не могу, ибо читаю пока для себя первый полноценный учебник по данной теме, посему судить не могу о качестве изложения, прочитал пока только треть книги.

1. Упаковка абсолютно не правильная.
2. С каким модулем соединяетесь? Если это дискретные выходы, то откуда 3 регистр, если аналоговые выходы, то откуда дискретные переменные

ООО "БЛС инжинеринг"
03.07.2015, 19:30
Я достал проект "часы" но когда я его открываю появляется вот это18873 нажимаю ОК 18874 что делать? в проекте три файла 18875

capzap
03.07.2015, 21:14
Я достал проект "часы" но когда я его открываю появляется вот это18873 нажимаю ОК 18874 что делать? в проекте три файла 18875

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

ООО "БЛС инжинеринг"
03.07.2015, 21:56
проект надо открыть в текстовом редакторе и найти какой конкретно плк используется, после установить соответствующий таргет

Да не хватало таргет, но возникла другая проблема а что тут нужно вводить и зачем? 18877

capzap
04.07.2015, 01:12
Да не хватало таргет, но возникла другая проблема а что тут нужно вводить и зачем? 18877

четырехзначные коды ошибок описаны в документации КДС, скорее всего кроме ПОУ нужно было посмотреть на вкладке структур пользовательские типы данных ( с телефона архив не смотрел, пишу наугад)

Гарчев Евгений
06.07.2015, 12:27
Да не хватало таргет, но возникла другая проблема а что тут нужно вводить и зачем? 18877

Необходимо объявить в Вашем проекте указанные переменные, в примере они были привязаны к конфигурации.

adamst
07.07.2015, 09:19
подскажите пожалуйста способы логирования и вывод ошибок
плк+винтек панель, кто как делает?

полагаю нужно в плк вести логи и отправлять в панель сообщение об ошибках, а на ней выводить просто текст ошибки?

amn
07.07.2015, 20:48
В ПЛК создать необходимое количество регистров, каждый бит которого соответствует своей аварии. В панели каждому биту сопоставить соотвующее сообщение для отображения ошибки. В ИП320 для этого есть список тревог, наверное у винтека тоже должен быть.

Ivanovich
10.07.2015, 10:41
Подскажите как считать часы ПЛК 63 (FBD)? Пробовал при помощи CurTimeEx, но часы "виснут". Как обнулить значения на FBD?

жекон
10.07.2015, 16:04
подскажите пожалуйста способы логирования и вывод ошибок
плк+винтек панель, кто как делает?

полагаю нужно в плк вести логи и отправлять в панель сообщение об ошибках, а на ней выводить просто текст ошибки?
Достаточно одной переменной word а в панели в журнале событий прописываете для каждого значения свое сообщение

grenz
21.07.2015, 13:21
Всем привет, Уважаемые форумчане. Сваял в железе машину, которая должна отмерять и резать. Подключил к ПЛК входы и выходы. Написал сам себе техзадание на "человеческом языке". Теперь как-то нужно все это в программу превратить. В программировании полный ноль. Пытаюсь научиться. Один из вопросов такой: Как задать количество повторений цикла в зависимости от введенной уставки? Скажем, если значение уставки от 100 до 200, тогда результат 5, если от 201 до 300, то 6, если 301-400, то 7, иначе 0. Не пинайте сильно, если это вопрос из букваря. Не нашел в букваре. Может подскажете, как сделать? Только не пишите: "Читай руководство". Там пока мне не все буквы понятны.

petera
21.07.2015, 13:37
Как задать количество повторений цикла в зависимости от введенной уставки? Скажем, если значение уставки от 100 до 200, тогда результат 5, если от 201 до 300, то 6, если 301-400, то 7, иначе 0.
Так и написать, буквально "Как слышится, так и пишется":)
IF Ust >= 100 AND Ust<=200 THEN i:=5;
ELSIF Ust >= 201 AND Ust<=300 THEN i:=6;
ELSIF Ust >= 301 AND Ust<=400 THEN i:=7;
ELSE i:=0;
END_IF

Василий Кашуба
21.07.2015, 13:42
Всем привет, Уважаемые форумчане. Сваял в железе машину, которая должна отмерять и резать. Подключил к ПЛК входы и выходы. Написал сам себе техзадание на "человеческом языке". Теперь как-то нужно все это в программу превратить. В программировании полный ноль. Пытаюсь научиться. Один из вопросов такой: Как задать количество повторений цикла в зависимости от введенной уставки? Скажем, если значение уставки от 100 до 200, тогда результат 5, если от 201 до 300, то 6, если 301-400, то 7, иначе 0. Не пинайте сильно, если это вопрос из букваря. Не нашел в букваре. Может подскажете, как сделать? Только не пишите: "Читай руководство". Там пока мне не все буквы понятны.
Вы лучше напишите какое у вас оборудование и что вы будете делать на вашем оборудовании, а уже как эффективнее использовать оборудование (какую программу использовать) вам помогут.

Данис
25.07.2015, 16:35
Программирую ПЛК110 на CFC.
Контроллер подключен в качестве Modbus slave к панели оператора Weintek.
Одна из уставок задается с панели оператора. Каким образом задать для этой уставки значение по умолчанию, чтобы при пуске и работе контроллера без панели это значение было ненулевым?


Т.к. все переменные в модуле Slave являются retain по умолчанию, то достаточно один раз ввести начальное значение с панели. После этого панель можно даже не включать, значение переменной останется таким, каким было перед выключением ПЛК.
В общем случае нужно объявить в разделе глобальных переменных
VAR_GLOBAL RETAIN
My_1 AT %QW7.1.0: WORD := 100;
END_VAR
где %QW7.1.0 -соответствующий адрес из конфигурации Slave.
При этом этот адрес не должен быть именован в Slave.

ЗЫ. Но в последнем случае переменная My_1 всегда будет равна 100 после каждого включения ПЛК.


Все делаю вроде бы как Вы написали, однако начальные значения все же равны 0. Фото - во вложении.

boo_white
25.07.2015, 23:26
Всем привет. Столкулся с проблемой задержки команды от кнопки через модуль мк110 на ПЛК110 на ПЧВ, через modbus.
Сигнал проходит с задержкой примерно в 1 секунду и после отпускания кнопки ПЧВ работает 1 секунду. Может кто знает в чем проблема?

_Mikhail
26.07.2015, 07:02
Всем привет. Столкулся с проблемой задержки команды от кнопки через модуль мк110 на ПЛК110 на ПЧВ, через modbus.
Сигнал проходит с задержкой примерно в 1 секунду и после отпускания кнопки ПЧВ работает 1 секунду. Может кто знает в чем проблема?

Ты думаешь тут экстрасенсы? Выкладывай проект или хотя бы скриншоты

Валенок
26.07.2015, 08:22
Все делаю вроде бы как Вы написали, однако начальные значения все же равны 0. Фото - во вложении.
Начальное значение ретайн-переменных относится только к моменту первого старта (если только есть нюанс именно для слейва - я никогда не надеюсь на ретайн слейва)
Если слейв не хочет зависеть от прихотей внешних мастеров - делайте инициацию области обмена кодом

При взаимодействии мастер-слейв принципиально важно направление r/w до момента установки логической связи (и после обрыва связи) именно этого канала. Во общем смотрите настройки мастера-панели.

boo_white
26.07.2015, 11:35
вот проект. плк110-30v2, 2 модуля мк110, 3 частотника овен и 1 веспер + ип-320

сегодня заметил что со всех входов (хоть с плк, хоть с мк110) идеть задержка на ПЧВ.

Вольд
26.07.2015, 12:11
вот проект. плк110-30v2, 2 модуля мк110, 3 частотника овен и 1 веспер + ип-320
А что за Target файл для ПЛК110 у тебя ? При открытии проекта он не обнаруживается. В какой директории у тебя хранятся Target файлы ?

Вольд
26.07.2015, 12:18
Всем привет. Столкулся с проблемой задержки команды от кнопки через модуль мк110 на ПЛК110 на ПЧВ, через modbus.
Сигнал проходит с задержкой примерно в 1 секунду и после отпускания кнопки ПЧВ работает 1 секунду. Может кто знает в чем проблема?
У тебя в сети много приборов, по этой причине такая большая задержка. Если ты при конфигурировании сети пользовался шаблонами, то ничего лучшего и не получишь.

boo_white
26.07.2015, 12:26
таргет фаил во вложении. установлены в папке C:\CoDeSys\Targets\PLC110.30_M_v2.
я пробовал плк с одним МК110 и ПЧВ - все тоже самое

boo_white
26.07.2015, 12:59
У тебя в сети много приборов, по этой причине такая большая задержка. Если ты при конфигурировании сети пользовался шаблонами, то ничего лучшего и не получишь.

А шаблоны это что такое? Я вроде сам прописывал сетевые настройки.

Вольд
26.07.2015, 13:38
А шаблоны это что такое? Я вроде сам прописывал сетевые настройки.
Ты реализовал обмен по сети через шаблоны PLC Configuration. Тебе надо выявить когда появляются тормоза при обмене. Наращивай сеть постепенно. Сначала подключи к ПЛК один МК110-8ДН и посмотри время реакции на нажатие кнопки. Если все нормально делай дальнейшие подключения. Если время реакции большое даже при одном подключенном МК110-8ДН, тогда надо разбираться с параметрами сетевых настроек.

Вольд
26.07.2015, 13:47
Еще попробуй сделать ИП320 Master, говорят помогает.

Валенок
26.07.2015, 13:47
Оптимизируйте обмен.
Для частотников можно ком.слово/задание - писать по изменению, а статус читать - достаточно раз в 1-2 сек для поддержания канала (при соотв.настройке в чп).
Для 8D4Р - тоже самое. Постоянно читать входы, а выходы - писать только по по изменению. И скорость рекомендую 38.4 хоть и в шкафу.

Штатный конфигуратор весьма не гибок. Через сислибком все это можно повесить на одну линию и с реакцией не более 0.1-0.2с. А разбивкой по линиям вообще молчу.

PS
В слейвах уберите дурацкие задержки ответа если есть возможность.

boo_white
26.07.2015, 13:52
спасибо, будем пробовать

boo_white
26.07.2015, 14:08
Оптимизируйте обмен.
Для частотников можно ком.слово/задание - писать по изменению, а статус читать - достаточно раз в 1-2 сек для поддержания канала (при соотв.настройке в чп).
Для 8D4Р - тоже самое. Постоянно читать входы, а выходы - писать только по по изменению. И скорость рекомендую 38.4 хоть и в шкафу.

Штатный конфигуратор весьма не гибок. Через сислибком все это можно повесить на одну линию и с реакцией не более 0.1-0.2с. А разбивкой по линиям вообще молчу.

PS
В слейвах уберите дурацкие задержки ответа если есть возможность.

в слейвах ? а это где??

Medved
27.07.2015, 08:36
день добрый! В kodesys 2.3 в тексте программы не распознается руский язык. Как вылечить? Кодировки XML перебрал все

Валенок
27.07.2015, 15:41
день добрый! В kodesys 2.3 в тексте программы не распознается руский язык. Как вылечить? Кодировки XML перебрал все
У меня:
проект/опции/редактор/шрифт/набор символов - кириллический
проект/опции/рабочий стол/iso 8859-5, язык russian

Валенок
27.07.2015, 15:45
в слейвах ? а это где??
Для 8Д4Р - Rs.dL в своем конфигураторе
Для частотников - см.в РЭ на них подобное 8Д4Р
Для ИП320 - можно и не искать.

groom
29.07.2015, 13:42
Ребята, подскажите пожалуйста каким образом производиться расчет дельт для трех точек при конфигурировании плк150 с датчиком дтс125-50м?

МаксТТ
30.07.2015, 18:15
Help,
где можно почитать как настроить связь компа с ПЛК110-60 по Ethernet,
как кабель обжать в руководстве написано всё сделал.
а что в компе настраивать и в СSv2.3... нет:)
заранее благодарен.

Эдуард_Н
30.07.2015, 18:21
подскажите где можно почитать описание о подэлементе "статистика".

приборист
30.07.2015, 18:48
подскажите где можно почитать описание о подэлементе "статистика".
Так в скобках написано :confused:

В РП даже перевели и расшифровали (стр 126)

Эдуард_Н
30.07.2015, 19:03
В РП даже перевели и расшифровали (стр 126)

Спасибо, как то в РП пролистнул этот пункт.
И ещё, если у меня в пункте Cycle time in 100 mks показывает 26, а в пункте MinCycleLength стоит значение 10, это нормально или нет?

petera
30.07.2015, 19:10
Help,
где можно почитать как настроить связь компа с ПЛК110-60 по Ethernet,
как кабель обжать в руководстве написано всё сделал.
а что в компе настраивать и в СSv2.3... нет:)
заранее благодарен.
В руководстве по программированию все толково описано, с картинками:rolleyes:.
Есть видео инструкция http://www.owen.ru/catalog/codesys_v2/81399447

ЗЫ. Видео есть и на диске ПЛК

Эдуард_Н
31.07.2015, 03:34
если у меня в пункте Cycle time in 100 mks показывает 26, а в пункте MinCycleLength стоит значение 10, это нормально или нет?

kukla100
31.07.2015, 04:28
Измеренное значение на аналоговом входе ПЛК160 имеет вид примерно такой:26,23486218. Нельзя ли уменьшить количество знаков после запятой?

приборист
31.07.2015, 07:47
Измеренное значение на аналоговом входе ПЛК160 имеет вид примерно такой:26,23486218. Нельзя ли уменьшить количество знаков после запятой?

New:=int_to_real(real_to_int(Old*100))/100
Где 100 - нужное количество знаков после запятой.

kukla100
31.07.2015, 10:11
New:=int_to_real(real_to_int(Old*100))/100
Где 100 - нужное количество знаков после запятой.

Что только так, и никак иначе? Может в настройках ПЛК что ни будь есть?

Dimooon
31.07.2015, 10:28
Как проверить- работает RS485 на плк или нет? Модуль в конфигураторе видно,а с плк -нет связи. Причем все работало корректно несколько месяцев,пока я не залез опять. Но в мастере плк я ничего не изменял. Может,интерфейс на плк физически накрылся?

Валенок
31.07.2015, 12:19
Измеренное значение на аналоговом входе ПЛК160 имеет вид примерно такой:26,23486218. Нельзя ли уменьшить количество знаков после запятой?
А смысл ? Для обработки - побоку. Для вывода - форматирование на выводых уст-вах

Эдуард_Н
31.07.2015, 12:25
если у меня в пункте Cycle time in 100 mks показывает 26, а в пункте MinCycleLength стоит значение 10, это нормально или нет?

Валенок
31.07.2015, 12:29
все работало корректно несколько месяцев,пока я не залез опять. Но в мастере плк я ничего не изменял..
Может зацепился чем-нить пока лез ?


Как проверить- работает RS485 на плк или не?
Оборудование, проекты ?
Например самого себя на себя завести на разных интерфейсах.

Но вероятней всего - зацепился.

Валенок
31.07.2015, 12:31
если у меня в пункте Cycle time in 100 mks показывает 26, а в пункте MinCycleLength стоит значение 10, это нормально или нет?
В принципе - зашибись. 74% времени ПЛК курит бамбук.

Dimooon
31.07.2015, 13:38
Может зацепился чем-нить пока лез ?Но вероятней всего - зацепился. Модуль с ПЛК на одной дин рейке бок о бок. Связь RS-485 = 30 см. Все звонится.


Например самого себя на себя завести на разных интерфейсах. С ПЛК через АС-4 подать на USB ПК, можно как-то понять, работает ли RS485? У меня драйвер ПЛК USB не встает на комп. Определяет как неизвестное устройство, указываю путь до драйвера- не нуждается в обновлении. В СОМ портах его тоже нет.
Отключения делали по высокой стороне (6 кВ). Когда питание восстановили - Сом порт USB PLC появился... Меня этот необъяснимый полтергейст бесит и пугает. Вот так встряну где-нибудь хз из-за чего... И закатают под асфальт... Может, это система на компе кривая? Как переустановили недавно - началась черная полоса в жизни.

Оборудование, проекты ? Проект для ПЛК 100-224.КМ и конфигурация для модуля МВ110-224.1ТД

Dimooon
31.07.2015, 14:34
В двадцатый раз откинул с модуля АС4 и посадил ПЛК- все заработало. Что было - я так и не понял. Не делал ничего. Связи с ПЛК не было точно. Столько крови попортил... Причину не нашел, и это очень плохо. Программа или железо. Если сказать без мата - то я промолчу. Работает - и ладно.

Валенок
31.07.2015, 21:32
Для начала.
Зачем polling time = 10 при МинЦ = 50 ?

Dimooon
01.08.2015, 05:45
Спасибо. Сравняю с 50. Еще есть ошибки?

Валенок
01.08.2015, 13:38
Спасибо. Сравняю с 50. Еще есть ошибки?
Да не ошибки - улучшения.
Общее - Скорость поднять до 38.4
ПЛК : Минц снизить до 10, polling time поднять до 30..50
Сбросить до заводского/Проект - очистить все.
1TД : Rs.dL = 0, проверить 8N1

Shogun
02.08.2015, 21:29
Подскажите как сконфигурировать плк160 в codesys2 чтоб из scada по modbus уходила команда на замыкание DO1.
19283
19284
Берут сомнения что так будет работать :)

smk1635
02.08.2015, 23:03
Подскажите как сконфигурировать плк160 в codesys2 чтоб из scada по modbus уходила команда на замыкание DO1.
19283
19284
Берут сомнения что так будет работать :)

Правильно берут. Из Скада приходит переменная типа Word, а у выхода тип Bool. В Word можно 16 таких Bool запаковать. Прочтите в "Руководство пользователя по программированию ПЛК в CoDeSys 2.3" про функциональные блоки PACK и UNPACK.

Валенок
03.08.2015, 03:15
А после этого еще почитайте про глобальные/локальные переменные.

Shogun
03.08.2015, 16:43
Правильно берут. Из Скада приходит переменная типа Word, а у выхода тип Bool. В Word можно 16 таких Bool запаковать. Прочтите в "Руководство пользователя по программированию ПЛК в CoDeSys 2.3" про функциональные блоки PACK и UNPACK.

Сделал немного подругому в ST, все-равно фигня выходит...

IF do1_input.0=TRUE THEN
do1_out=TRUE;
END_IF

В итоге я вижу что из скады сигнал приходит и do1_input меняет значение с 0 на 1, тогда почему такая простая функция не работает? Что не так в синтаксисе?

capzap
03.08.2015, 16:46
Сделал немного подругому в ST, все-равно фигня выходит...

IF do1_input.0=TRUE THEN
do1_out=TRUE;
END_IF

В итоге я вижу что из скады сигнал приходит и do1_input меняет значение с 0 на 1, тогда почему такая простая функция не работает? Что не так в синтаксисе?

может старт(F5) не нажали :)
и так то можно просто написать do1_out:=do1_input.0;

Ryzhij
03.08.2015, 16:51
Сделал немного подругому в ST, все-равно фигня выходит...

IF do1_input.0=TRUE THEN
do1_out=TRUE;
END_IF

В итоге я вижу что из скады сигнал приходит и do1_input меняет значение с 0 на 1, тогда почему такая простая функция не работает? Что не так в синтаксисе?А ELSE со сбросом переменной do1_out в состояние FALSE кто прописывать будет?
Иначе установившись в TRUE пременная так в нём и останется.

Shogun
03.08.2015, 17:07
ELSE прописал. Просто F5 не нажал :)

ООО "БЛС инжинеринг"
04.08.2015, 18:53
Кто подскажет почему я не могу подключится с ПК к ПЛК 110-32 (контролер новый) что я не так делаю?19349 19350 19351

Scream
04.08.2015, 19:19
Кто подскажет почему я не могу подключится с ПК к ПЛК 110-32 (контролер новый) что я не так делаю?19349 19350 19351

Элементарно Ватсон... Поправьте ваш IP, точнее последнюю цифру (10) на любое другое отличное от 0 и 255 (хотя и маска дебильная), шлюз также в топку, уберите.
Поясню. Вы коннектитесь к самому себе, IP адреса должны быть уникальны, windows должна была вам об этом кстати напомнить.
Это как номера телефонов, у каждого свой номер.

ООО "БЛС инжинеринг"
04.08.2015, 22:56
Элементарно Ватсон... Поправьте ваш IP, точнее последнюю цифру (10) на любое другое отличное от 0 и 255 (хотя и маска дебильная), шлюз также в топку, уберите.
Поясню. Вы коннектитесь к самому себе, IP адреса должны быть уникальны, windows должна была вам об этом кстати напомнить.
Это как номера телефонов, у каждого свой номер.

Спасибо заработало.

ООО "БЛС инжинеринг"
04.08.2015, 23:00
Появился другой казус, написал простую программку и залил её в ПЛК 110-32 работает но при выключении питания потом не работает, или как-то особо заливать её нужно... подскажите где что-то не так?19354

smk1635
04.08.2015, 23:02
Появился другой казус, написал простую программку и залил её в ПЛК 110-32 работает но при выключении питания потом не работает, подскажите где что-то не так?19354

Кнопка Онлайн - Подключение - Создание загрузочного приложения

ООО "БЛС инжинеринг"
04.08.2015, 23:31
Кнопка Онлайн - Подключение - Создание загрузочного приложения

Спасибо работает :)

Эдуард_Н
05.08.2015, 03:22
Появился другой казус, написал простую программку и залил её в ПЛК 110-32 работает но при выключении питания потом не работает, или как-то особо заливать её нужно... подскажите где что-то не так?19354

http://mineo.ucoz.ru/_ld/0/17_prosto_CoDeSys_.pdf:)
http://rutracker.org/forum/tracker.php?nm=CoDeSys

Руслпн
06.08.2015, 17:53
Всем привет! Возникла проблема в создании сетевой переменной с плавающей запятой в Owen Logic 1.7. После того как залил прогу в ПР114-8Д.4А и прописав переменные в OPS Lectus, далее настроив в TraceMode. Запустив скаду возникли проблемы с переменными в ОРС но. как только удаляю сетевые переменные с плавающей запятой все работает как часы.19399

Руслпн
06.08.2015, 17:57
И еще, установив новую версию Owen Logic-1.8, создав новый проект с сетевыми переменными, возникла проблема при сохранение проекта, то-есть файл не сохраняется.19400

capzap
06.08.2015, 18:04
И еще, установив новую версию Owen Logic-1.8, создав новый проект с сетевыми переменными, возникла проблема при сохранение проекта, то-есть файл не сохраняется.19400

раздел в котором Вы задаете вопрос про КДС и плк, для ПР есть свой раздел и тема про новый лоджик http://www.owen.ru/forum/showthread.php?t=17153&p=177116&viewfull=1#post177116

Руслпн
06.08.2015, 18:05
Спасибо за правильное русло

Vorloc
07.08.2015, 00:04
Добрый ночер ))
Прошу подсказки корифеев по циклу выполнения программы на ПЛК под КДС. Про последовательность выполнения программы (опрос входов)-(выполнение программы)-(запись выходов)-(в начало) в курсе. Но терзают сомнения - а как это работает если в вызываемой из программы функции определен таймер с задержкой включения большей чем время цикла выполнения программы ?
Очень жду ваших комментариев.

amn
07.08.2015, 00:17
Во-первых, внутри функции таймер не будет работать, для этого используйте функциональный блок. А работает таймер очень просто: он при каждом вызове поглядывает на часы, и как только время подошло, то выдает сигнал.

Vorloc
07.08.2015, 00:35
Спасибо, что откликнулись.
С таймером понятно. Я правильно понимаю, что количество созданных экземпляров ФБ равно количеству их вызовов и PLC_PRG ? Просто никак не могу представить общую картину по последовательности исполнения программы вместе с фунциями и функциональными блоками (((

Валенок
07.08.2015, 10:24
Я правильно понимаю, что количество созданных экземпляров ФБ равно количеству их вызовов и PLC_PRG ?...((
Не совсем.
Кол-во экземпляров ФБ и вызовов ФБ иногда сопадают - но это не связанные вещи.


Просто никак не могу представить общую картину по последовательности исполнения программы вместе с фунциями и функциональными блоками (((
Если бы не существовало ФБ (только PROGRAM и FUNCTION) - представляли бы картину ?

Vorloc
07.08.2015, 13:56
Если бы не существовало ФБ (только PROGRAM и FUNCTION) - представляли бы картину ?

Так да, но кроме ФБ есть еще ПРГ которые тоже можно вызывать из ПРГ_ПЛК

amn
07.08.2015, 14:15
Программа выполняется сверху вниз (язык ST). Если встерчается ФБ или программа или функция, то выполняется код внутри, потом остальное ниже. На языке CFC выполняемые элементы пронумерованы и выполняются согласно нумерации.

Валенок
08.08.2015, 03:00
Так да, но кроме ФБ есть еще ПРГ которые тоже можно вызывать из ПРГ_ПЛК
Картина с функциями и program (любыми) ясна ?
Ну так ФБ это такая же program в которую неявно передается адрес структуры-экземпляра и поля этой структуры в теле этой proramm доступны без полного пути - не "экземпляр.поле" а просто "поле"

User701
13.08.2015, 16:52
В codesys есть элементы условия IF ELSE и как их задать? Пробовал на ПЛК100-220.P-L элемент AND - срабатывал дискретный выход, все нормально. Менял текстом в элементе на OR, никакой реакции на выходе.

Kabasva
13.08.2015, 20:58
Здравствуйте! Помогите новичку. :confused:

Есть:
ПЛК100-24.Р-М
1. Светильник 220в
2. Водяная помпа 12в
3. Воздушный компрессор 220в

Нужно:
1. Светильник включался в 08:00 выключался в 20:00
2. Водяная помпа включалась каждые 2 часа на 5 минут
3. Воздушный компрессор включался каждые 2 часа на 5 минут параллельно с водяной помпой.

Гуру помогите написать код в CoDeSys 2.3 :confused:

АлександрЖбанов
13.08.2015, 22:56
Подскажите как на трм212 создать температурный график ? Какие кнопки жать . И какая велbчина величины.
Например на трм 32 все просто U1.....

RV9WFJ
14.08.2015, 06:49
Подскажите как на трм212 создать температурный график ? Какие кнопки жать . И какая велbчина величины.
Например на трм 32 все просто U1.....
Вообще-то вы веткой форума ошиблись, здесь про контроллеры. А по вопросу графика в ТРМ212, там только график по величине второго входа. А вам наверно нужен график теплосетей, с ним берите ТРМ32 и выше...

Dobrosed
14.08.2015, 13:43
Привет всем. Только начал изучать контроллеры. Пишу программу для Овен ПЛК 63 на языке ST, пока в режиме эмуляции, и немного непойму работу с таймерами.

Задача: Каждые 3 минуты необходимо включать двигатель (Engine1 = 1) на 10 секунд.

Написал такой код:

PROGRAM TEMP_CONTROL
VAR
T1,T2: TON;
T1_start, T2_start: BOOL;
END_VAR
T2(IN:=T2_start, PT:=T#10s);
T2_start := FALSE;
IF NOT T2.Q THEN
Engine1 := 1;
Vibrator := TRUE;
T1_start := TRUE;
END_IF;
T1(IN:=T1_start, PT:=T#3m);
IF T1.Q AND T1_start THEN
Engine1 := 0;
Vibrator := FALSE;
T1_start := FALSE;
T2_start := TRUE;
END_IF;
Всё работает, только почему-то, когда запустился таймер T1 и переменой T1_start установлено значение FALSE, код под условием IF T1.Q AND T1_start выполняется заново в следующем цикле, в связи с чем не могу в другом месте запустить двигатель. Почему так?

petera
14.08.2015, 14:28
Привет всем. Только начал изучать контроллеры. Пишу программу для Овен ПЛК 63 на языке ST, пока в режиме эмуляции, и немного непойму работу с таймерами.

Задача: Каждые 3 минуты необходимо включать двигатель (Engine1 = 1) на 10 секунд.

Написал такой код:

PROGRAM TEMP_CONTROL
VAR
T1,T2: TON;
T1_start, T2_start: BOOL;
END_VAR
T2(IN:=T2_start, PT:=T#10s);
T2_start := FALSE;
IF NOT T2.Q THEN
Engine1 := 1;
Vibrator := TRUE;
T1_start := TRUE;
END_IF;
T1(IN:=T1_start, PT:=T#3m);
IF T1.Q AND T1_start THEN
Engine1 := 0;
Vibrator := FALSE;
T1_start := FALSE;
T2_start := TRUE;
END_IF;
Всё работает, только почему-то, когда запустился таймер T1 и переменой T1_start установлено значение FALSE, код под условием IF T1.Q AND T1_start выполняется заново в следующем цикле, в связи с чем не могу в другом месте запустить двигатель. Почему так?
Что-то сложно слишком, почему BLINK не использовать, вместо всей этой конструкции?
Ну или так

VAR
t1: TON:=(PT:=t#3m);
t2: TON:=(PT:=t#10s);
Engine,Vibrator: BOOL;
END_VAR

t1(IN:= NOT t2.Q );
t2(IN:= t1.Q );
Engine:=t1.Q;
Vibrator:=t1.Q;

19545

capzap
14.08.2015, 16:34
var
tik:ton;
delay1:time:=t#3m;
delay2:time:=t#10s;
q:bool;
end_var

if tik.q then
if tik.pt=delay1 then
tik.pt:=delay2;
q:=true;
else
tik.pt:=delay1;
q:=false;
end_if
end_if;
tik(in:=not tik.q,pt:=tik.pt);

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

Sergey666
14.08.2015, 22:54
Блинк вообще фигня , не используйте его !

Дакие штуки удобно делать при помощи оператора CASE :

(* опустим раздел объявлений *)



Case State_engine of

0://*Стоим*)
Tmr_pause(In:= true ,Pt:=t#3m);
if Tmr_pause.q then
Tmr_pause(In:=false);
State_engine:=10;
end_if
R_engine:=false;

10://*Мослаем 10 сек*)
R_engine:=true;
Tmr_pause(In:=true,Pt:=t#10s);

if Tmr_pause.Q then
Tmr_pause(In:=false);
State_engine:=0;
end_if

end_case

Подобными конструкциями можно сколько угодно (65534) разных вариантов работы задать , в таком простом случае конечно проще на IF конструкциях сделать (см.выше пример) , но если вариантов работы-уставки больше 2х , тогда конструкция CASE рулит + 1 таймер на толпу.

Kabasva
15.08.2015, 00:19
19554
Написал тестовые таймеры для помпы и компрессора, заливаю на ПЛК100, все как надо работает, выключаю питание во время работы, включаю, ничего не сохраняется. Дату и время выставляю текущие, выкл./вкл. питание ПЛК100, все сбрасывается. Что делать? Может нужно как то сохранить после заливки кода и изменения даты и времени? Или аккумулятор дохлый?
Спасибо всем кто помог разобраться с таймерами для помпы и компрессора, осталось разобраться с таймером для светильника, пока не пойму что да как сделать.

...Сейчас проверил, время сохранилось. Но я менял сутки назад, ПЛК лежал без питания, время сбросилось.

.....Сделал "создание загрузочного проекта" отключил на 1 минуту, все сохранилось :) На ночь выключу его, посмотрим сохранится ли дата и программа.

Kabasva
15.08.2015, 00:41
PLCInfo

PLC model MODEL PLC 100
Binary VERSION 2.12.7
Need Target version 2.10
Compiled: 11:34:29 Sep 30 2010
MAC
IP
GATE
MASK
PIC upper version is 07
Licence unlimited
No DAC
PIC lower version is 0a

Нужно ли обновлять прошивку?

Kabasva
15.08.2015, 01:00
19555
Изменил время в blink, 2 часа выкл., 5 мин. работает. Включаю, исполнение программы начинается с 2 часового отключения, а мне нужно чтобы она начиналась с 5 мин. включения, как исправить? Или как вариант можно сделать принудительный 5 минутный пуск в любое время по кнопке, решается TP, TON, TOF ? Какую кнопку можно использовать на вход?

жекон
15.08.2015, 06:13
Попробуйте ФБ GEN_PULSE из библиотеки OSCAT, а еще можно время местами поменять и инверсию на выход, вообще BLINK не самый удачный выбор

RV9WFJ
15.08.2015, 06:40
Написал такой код:

PROGRAM TEMP_CONTROL
VAR
T1,T2: TON;
T1_start, T2_start: BOOL;
END_VAR
T2(IN:=T2_start, PT:=T#10s);
T2_start := FALSE;
IF NOT T2.Q THEN
Engine1 := 1;
Vibrator := TRUE;
T1_start := TRUE;
END_IF;
T1(IN:=T1_start, PT:=T#3m);
IF T1.Q AND T1_start THEN
Engine1 := 0;
Vibrator := FALSE;
T1_start := FALSE;
T2_start := TRUE;
END_IF;
Всё работает, только почему-то, когда запустился таймер T1 и переменой T1_start установлено значение FALSE, код под условием IF T1.Q AND T1_start выполняется заново в следующем цикле, в связи с чем не могу в другом месте запустить двигатель. Почему так?Потому как сразу после выполнения IF T1.Q в следующем цикле выполняется IF NOT T2.Q где у вас прописано T1_start := TRUE т.е в это же втором цикле снова вызывается IF T1.Q. Программа и должна себя вести так как вы описали.

capzap
15.08.2015, 07:11
Блинк вообще фигня , не используйте его !

Дакие штуки удобно делать при помощи оператора CASE :

(* опустим раздел объявлений *)



Case State_engine of

0://*Стоим*)
Tmr_pause(In:= true ,Pt:=t#3m);
if Tmr_pause.q then
Tmr_pause(In:=false);
State_engine:=10;
end_if
R_engine:=false;

10://*Мослаем 10 сек*)
R_engine:=true;
Tmr_pause(In:=true,Pt:=t#10s);

if Tmr_pause.Q then
Tmr_pause(In:=false);
State_engine:=0;
end_if

end_case

Подобными конструкциями можно сколько угодно (65534) разных вариантов работы задать , в таком простом случае конечно проще на IF конструкциях сделать (см.выше пример) , но если вариантов работы-уставки больше 2х , тогда конструкция CASE рулит + 1 таймер на толпу.

разные то разные, но это менять только одну пеоеменную. Не стоит списывать конструкцию IF/ELSIF, с помощью неё можно создать приоритетность условий, они могут быть любыми,не обязательно число, а були как внутренние,так и внешние, возвращение результата функции и т.п.

Dobrosed
15.08.2015, 07:29
Потому как сразу после выполнения IF T1.Q в следующем цикле выполняется IF NOT T2.Q где у вас прописано T1_start := TRUE т.е в это же втором цикле снова вызывается IF T1.Q. Программа и должна себя вести так как вы описали.

Ага, когда в сотый раз прочитал свой код, понял это. Только в режиме эмуляции присвоение происходит быстро и Codesys постоянно показывал FALSE. В общем, надо быть внимательнее. Спасибо. :) Зато мне подсказали более красивые варианты как написать код. :)

Sergey666
15.08.2015, 09:38
разные то разные, но это менять только одну пеоеменную. Не стоит списывать конструкцию IF/ELSIF, с помощью неё можно создать приоритетность условий, они могут быть любыми,не обязательно число, а були как внутренние,так и внешние, возвращение результата функции и т.п.

Кэп , риспект и уважуха , но эти конструкции можно и нужно комбинировать и , самое главное учиться это делать . Если бы на видео-интернет уроках от Овен это делали , меньше вопросов было-бы . А так только профанация и популизм , как-то - использование Блинк (Вообще исключить из библиотек , или доработать ) , именование каналов в конфигураторе (сколько смотрел примеров для КДС2 для других ПЛК (Не Овен) , никто так не делает ) и прочее .

capzap
15.08.2015, 10:11
:) я на семене,тоже сразу именую все входы выходы и не работаю с I,IW,ID и т.д

Sergey666
15.08.2015, 10:21
:) я на семене,тоже сразу именую все входы выходы и не работаю с I,IW,ID и т.д

Но ведь насколько проще в тексте объявить переменные и адресацию им привязать !!!
По Блинку , как понимаю , вы согласны ?
Вот молдаване не любят огурцы в банках , любят в бочках .....;)

capzap
15.08.2015, 10:39
блинком действительно не пользуюсь, вобще не подключаю бибку util
а по поводу как проще,для меня проще скопировать область входов в структуру,а из структуры соответствующие данные в область выходов одним махом, в проге уже пользуюсь только именами, и эту же структуру вычитываю панелью,тоже зараз,т.ч. нет необходимости что то привязывать

Sergey666
15.08.2015, 11:04
блинком действительно не пользуюсь, вобще не подключаю бибку util
а по поводу как проще,для меня проще скопировать область входов в структуру,а из структуры соответствующие данные в область выходов одним махом, в проге уже пользуюсь только именами, и эту же структуру вычитываю панелью,тоже зараз,т.ч. нет необходимости что то привязывать

???
Позвольте немного раскрыть ваши тезисы , уважаемый .(Примерно как В.И Ленин на сборище 2 интернационала ;):D:D).
1.Вы именуете каналы в конфигураторе , соотв. имена становятся глобальными переменными .
2.Создается некие 2 структуры и соотв. прописывается присвоение элементам структуры переменным из конфигурации и наоборот из структуры выходов переменные из конфигурации подключаются к элементам структуры , так ?
3.Может вы работаете как-то ч-з указатели с областью ввода-вывода ? Если да , для чего тогда именование каналов ? Может примерчик простенький выложите для полного понимания , так сказать .

capzap
15.08.2015, 12:19
ну чтоб создать указатель, как минимум один кaнaл нужно обозвать
а пример хотя бы этот http://www.owen.ru/forum/showthread.php?t=21903&p=178030&viewfull=1#post178030

Sergey666
15.08.2015, 13:00
ну чтоб создать указатель, как минимум один кaнaл нужно обозвать
а пример хотя бы этот http://www.owen.ru/forum/showthread.php?t=21903&p=178030&viewfull=1#post178030

Нда ... китайцы едят рис палочками , мы вилкой , узбеки руками , а рис ... он и есть рис .
Тенденция такая : создать - высосать проблему и , используя принципы и методы СИ программирования , решать в МЭК епархии искуственно созданную проблему .

ЗАЧЕМ !!!

Sergey666
15.08.2015, 13:18
Вот смотрю некоторые примеры , что выкладывают и удивляюсь , поражаюсь .
Байт адресация -НА-ФИ-ГА ???
Байт в конфигурации в модбас слэйв - НА-ФИ-ГА ? Зачем вводить неоднородность , чтобы потом хэроически с ней бороться ?
Когда начинал тоже по "примерчикам" блин для битовых адресов использовал пару раз "байт" в слэйве , пока не понял , что это Феерический идиотизм .
Эта идиотская феерия когда-нибудь закончится ? Почему обучение от Овена ведет народ к той самой проблеме -"Проблемы смещения" ?
Спецом что-ли , дабы занюханные-затертые до дыр темы-вопросы поднимались снова и снова ?

grenz
15.08.2015, 14:10
Здравствуйте, Уважаемые Форумчане.
Пишу свою первую программу для автомата, который отмеряет-отрезает. На выходе должны получиться жалюзи.
В процессе работы оператор с панели должен задать ширину, высоту изделия, поставить выбор "Стандарт" или "Арка". От ширины в ПЛК рассчитывается кол-во повторений цикла.
Высота изделия "Стандарт" зависит от уставки "Высота", а высота "Арка" рассчитывается функцией ПЛК, в которой в зависимости от номера "палочки" определяется ее длина. Формулу написал, вроде результат ПЛК выдает верный. При каждом проходе цикла результат функции должен выводиться на панель. Но вот в связи с этим вопрос: Как сделать, чтобы на панель выводилась информация по высоте всех "палочек", которые будут изготовлены. Ведь функция выдает высоту только одной, производимой в данный момент "палочки". Другими словами, мы еще "старт" не нажали, а гистограмма всех высот "палочек" на панели уже есть.
Может вопрос не совсем понятно сформулировал, но, оказывается, умение задавать вопрос по программированию тоже приходит с опытом.
Пыс. Во вложении только кусочек программы. Вся программа для меня пока неподъемна.

capzap
15.08.2015, 14:19
Вот смотрю некоторые примеры , что выкладывают и удивляюсь , поражаюсь .
Байт адресация -НА-ФИ-ГА ???
Байт в конфигурации в модбас слэйв - НА-ФИ-ГА ? Зачем вводить неоднородность , чтобы потом хэроически с ней бороться ?
Когда начинал тоже по "примерчикам" блин для битовых адресов использовал пару раз "байт" в слэйве , пока не понял , что это Феерический идиотизм .
Эта идиотская феерия когда-нибудь закончится ? Почему обучение от Овена ведет народ к той самой проблеме -"Проблемы смещения" ?
Спецом что-ли , дабы занюханные-затертые до дыр темы-вопросы поднимались снова и снова ?
кто то интересовался бит-адресацией я показал один пример использования, для Вас показал, что используя указатель не обязательно каждый канал именовать, главное от чего оттолкнутся. В семене я спокойно копирую всю область, в КДС надо следить чтоб були совпадали, а из-за малого количества входов/ыходов можно обойтись именовкой каждого канала, по моему это удобство в КДС относительно других сред

amn
15.08.2015, 18:21
Но вот в связи с этим вопрос: Как сделать, чтобы на панель выводилась информация по высоте всех "палочек", которые будут изготовлены. Ведь функция выдает высоту только одной, производимой в данный момент "палочки". Другими словами, мы еще "старт" не нажали, а гистограмма всех высот "палочек" на панели уже есть.


Сначала вычисляете все размеры "палочек" и заносите их в массив. Его содержимое выводите на панель. Если оператора устраивает результат он нажимает старт, после чего берется размер из первого элемента массива и изготавливается первая "палочка". Сделали, берем размер из следующего элемента массива и делаем следующую "палочку". И так до конца.

Kabasva
15.08.2015, 23:00
Попробуйте ФБ GEN_PULSE из библиотеки OSCAT, а еще можно время местами поменять и инверсию на выход, вообще BLINK не самый удачный выбор

Нашел OSCAT, установил и настроил GEN_PULSE, по внешнему виду работает так же как и BLINK, а в чем отличие, чем BLINK плох, а GEN_PULSE хорош?
Как сделать инверсию на выход?

Sergey666
15.08.2015, 23:33
Нашел OSCAT, установил и настроил GEN_PULSE, по внешнему виду работает так же как и BLINK, а в чем отличие, чем BLINK плох, а GEN_PULSE хорош?
Как сделать инверсию на выход?

Переключите в False Enable БЛИНКа во время включенного выхода , результат может удивить и расстроить , а кое-кому может выйти в производственную травму . Недавно на заводе фольксвагена робот наладчика раздавил во время наладочных работ ...

Kabasva
15.08.2015, 23:41
Как кнопку СТАРТ/СТОП на ПЛК100 перепрограммировать на включение на 5 мин. дискретного выхода - %QX1.0 ?

Sergey666
15.08.2015, 23:53
Как кнопку СТАРТ/СТОП на ПЛК100 перепрограммировать на включение на 5 мин. дискретного выхода - %QX1.0 ?

В этой теме чуть выше можно увидеть ПУТЬ к решению .

Анекдот :
Хохол выходит с сыном (великовозрастным-чубатим дэтыной) к берегу моря ... Вот смотри , Сынку , о це море . Идэ , Батько ? Та вот же (показывает) . Идэ , Батько ? Батько хватае сынку за чуб и окунает головой в волну прибоя . Батько ! Шо це було !? Море , Сынко . Та идэ !?

жекон
16.08.2015, 05:27
Как кнопку СТАРТ/СТОП на ПЛК100 перепрограммировать на включение на 5 мин. дискретного выхода - %QX1.0 ?
TP или TOF Вам в помощь , в справке посмотрите как что работает, а кнопка на панели контроллера активируется добавлением модуля Button, в конфигурации

Kabasva
16.08.2015, 08:54
Подскажите про физическую кнопку для дискретного входа, какая подойдет и как подключается.

Валенок
16.08.2015, 11:49
Кнопка должна быть зеленая. Подключается отверткой

Sergey666
16.08.2015, 12:05
Кнопка должна быть зеленая. Подключается отверткой


:DЕще можно желтую , красную , черную , "грибок" , но подключается все отверткой , руками и проводом ПВ3-0.5 , концы в наконечники трубчатые с изолированным фланцем (потребуется обжим , но мона и плоскогубцами ) .

жекон
16.08.2015, 12:55
:DЕще можно желтую , красную , черную , "грибок" , но подключается все отверткой , руками и проводом ПВ3-0.5 , концы в наконечники трубчатые с изолированным фланцем (потребуется обжим , но мона и плоскогубцами ) .Самое интересное мне на днях пытались доказать, что по ПОЭ нельзя подключать проводом меньшее 1мм"

ASo
16.08.2015, 14:22
Смотря что подключать.

ООО "БЛС инжинеринг"
16.08.2015, 22:28
Подскажите как можно передавать с панели оператора (Weintek) на ПЛК110-32 Уставку время к примеру две с половиной секунды 2.5сек.

Sergey666
16.08.2015, 22:36
Подскажите как можно передавать с панели оператора (Weintek) на ПЛК110-32 Уставку время к примеру две с половиной секунды 2.5сек.

В целочисленном формате .
В панели элемент цифровой ввод , формат хх.х .
В ПЛК принимаем в слэйв
Пишем код WORD_TO_TIME(Var)*100 ;

ООО "БЛС инжинеринг"
16.08.2015, 22:47
В целочисленном формате .
В панели элемент цифровой ввод , формат хх.х .
В ПЛК принимаем в слэйв
Пишем код WORD_TO_TIME(Var)*100 ;

1) А на языке CFC как это сделать?
2) И ещё вопрос что можно сделать чтоб CTU мог считать больше 40.000 импульсов, или как можно просчитывать такое количество импульсов?

Sergey666
16.08.2015, 23:40
1) А на языке CFC как это сделать?
2) И ещё вопрос что можно сделать чтоб CTU мог считать больше 40.000 импульсов, или как можно просчитывать такое количество импульсов?

1. Точно как-то можно ... Но я не мазохист ...
2. Конструевина , даже на CFC мастерится : R_TRIG > значение счетчика(Целочисленная переменная (WORD,DWORD) ) +1 , а CTU - это для ..."продвинутых электриков" на LD.
Я даже когда на Дельте работаю (там только LD) этими CTU не пользуюсь.

Dobrosed
17.08.2015, 07:14
так попробуйте, набрал с телефона в автобусе, поэтому не писал инициализацию каким должно быть время, ну и может ошибся где

Супер, спасибо большое! То, что надо. Только в строке tik(in:=not tik.q,pt:=tik.pt); объявление pt при вызове таймера лишнее, так как ранее и так было задано tik.pt.

Василий Кашуба
17.08.2015, 22:17
1) А на языке CFC как это сделать?
2) И ещё вопрос что можно сделать чтоб CTU мог считать больше 40.000 импульсов, или как можно просчитывать такое количество импульсов?
Можно совсем без CTU сделать. Например вот так.19585

grenz
18.08.2015, 12:08
Сначала вычисляете все размеры "палочек" и заносите их в массив. Его содержимое выводите на панель. Если оператора устраивает результат он нажимает старт, после чего берется размер из первого элемента массива и изготавливается первая "палочка". Сделали, берем размер из следующего элемента массива и делаем следующую "палочку". И так до конца.

Спасибо, amn, так я и думал. Как бы еще с массивом научиться работать. Может у кого пример есть, как вытащить данные из элементов массива? Извините за глупый вопрос. Я еще пока даже не программировать, я еще только читать учусь. Смотрим в книгу, видим ... информацию. Круто!

amn
18.08.2015, 20:00
Я так понял загнать в массив Вы уже умеете?
Например, есть массив из 10 элементов a:array[0..9] of real

var1:=a[0]; (*переменной var1 присвоили значение из нулевого элемента массива*)
var2:=a[1]; (*переменной var2 присвоили значение из первого элемента массива*)

подробней про массивы можно почитать в документации CoDeSys_V23_RU.pdf стр. 330

grenz
19.08.2015, 19:44
Я так понял загнать в массив Вы уже умеете?
Например, есть массив из 10 элементов a:array[0..9] of real

var1:=a[0]; (*переменной var1 присвоили значение из нулевого элемента массива*)
var2:=a[1]; (*переменной var2 присвоили значение из первого элемента массива*)

подробней про массивы можно почитать в документации CoDeSys_V23_RU.pdf стр. 330

Нет у меня в CoDeSys_V23_RU.pdf постраничной нумерации. Нумерация по разделам 3-14, 10-32, и т. д.
Но за консультацию спасибо. Найду в описании,- буду пробовать

Валенок
19.08.2015, 20:46
Нет у меня в CoDeSys_V23_RU.pdf постраничной нумерации...
Про массивы можно читать в литературе по любым языкам (почти)

Sergey666
19.08.2015, 22:54
Нет у меня в CoDeSys_V23_RU.pdf постраничной нумерации. Нумерация по разделам 3-14, 10-32, и т. д.
Но за консультацию спасибо. Найду в описании,- буду пробовать

Начните вообще ... про массивы .
Но !!!!! Тут надо ведь подумать , как это... "Голова у солдата чтобы думать , а мозги чтобы соображать !
Тема для раздумья - А что , на ПЛК в которых массивы не предусмотрены это низя сделать ? И как вы предлагаете Массив на панели отображать ? (ну я знаю 2 способа , если размерность известна )
Перед исполнением любой задачи надо :
1. Включить МОЗГИ.
2. Если не выполняется п.1 не браться за выполнение задачи .
3. Если мозги включены , то ... решение должно найтись без обращений на форум , а вот с проблемами ... обращайтесь.

Алексей Геннадьевич
20.08.2015, 15:20
В режиме эмуляции где настроить шаг времени при пошаговом исполнении программы?

Maxsvell
20.08.2015, 16:28
Всем привет! Основной алгоритм управления машиной был написан в виде нескольких СFC программ вызываемых из PLC_PRG. После аварийной остановки машины оператором нам требуется перезапустить все эти программы с начала, по умолчанию они продолжают свою работу с тех шагов, которые были активны до остановки. Как это сделать?

grenz
20.08.2015, 16:44
Начните вообще ... про массивы .
Но !!!!! Тут надо ведь подумать , как это... "Голова у солдата чтобы думать , а мозги чтобы соображать !
Тема для раздумья - А что , на ПЛК в которых массивы не предусмотрены это низя сделать ? И как вы предлагаете Массив на панели отображать ? (ну я знаю 2 способа , если размерность известна )
Перед исполнением любой задачи надо :
1. Включить МОЗГИ.
2. Если не выполняется п.1 не браться за выполнение задачи .
3. Если мозги включены , то ... решение должно найтись без обращений на форум , а вот с проблемами ... обращайтесь.

Понятно. Значит на халяву не получится.:D

Валенок
20.08.2015, 16:44
В режиме эмуляции где настроить шаг времени при пошаговом исполнении программы?
Нигде. Варианты : task менеджер/TON/SFC

Maxsvell
20.08.2015, 18:35
Всем привет! Основной алгоритм управления машиной был написан в виде нескольких СFC программ вызываемых из PLC_PRG. После аварийной остановки машины оператором нам требуется перезапустить все эти программы с начала, по умолчанию они продолжают свою работу с тех шагов, которые были активны до остановки. Как это сделать?

Никто не знает как это делается или никто не сталкивался с этим?

amn
20.08.2015, 18:59
Есть такой прием, как инициализация переменных при первом запуске ПЛК. Если этим воспользоваться, то можно сбросить все переменные к первоначальным в любой момент времени.

Maxsvell
20.08.2015, 19:08
Есть такой прием, как инициализация переменных при первом запуске ПЛК..

А можно отсюда по подробней...))ну или пример какой нибудь, чтоб оттолкнуться от чего можно было бы.

amn
20.08.2015, 19:15
В PLC_PRG создаете переменную init. В самой первой строке пишете
if not init then
init:= true;
(*здесь инициализируем нужные переменные*)
end_if

Если в дальнейшем понадобится снова проинициализировать переменные, то через триггер сбрасываем init:
init:=false;

Maxsvell
20.08.2015, 19:20
Это на языке CFC?

amn
20.08.2015, 19:24
Если Вы пишете на CFC, то ничего страшного не произойдет, если один ФБ у Вас будет написан на ST, где будут простые присвоения переменным, меньше места будет занимать на холсте :)

Maxsvell
20.08.2015, 19:29
так это должно быть написано в отдельной программе получается..

amn
20.08.2015, 19:36
Привыкайте разбивать проект на части. Все равно сложные задачи неудобно писать одним блоком, тем более на CFC. Чем раньше поймете, тем легче Вам будет в дальнейшем.

Maxsvell
20.08.2015, 19:44
19617
получилось как то так... Где D5 кнопка начало цикла, а D10 сброс RS тригеров в программах. Я правильно все написал?

amn
20.08.2015, 20:19
Я не знаю правильно или нет, так как сильно не вникал в Вашу программу. По идее при старте все триггеры должны быть просто сброшены. Смысл в том, чтобы в начале работы переменные имели нужные значения. Вот и смотрите, что чему должно быть равно и присваивайте нужные значения, проверьте, может где таймер окажется не отключен, тогда надо будет и его сбросить при инициализации.

Maxsvell
20.08.2015, 20:22
Спасибо большое за помощь.Буду пробовать на выходных.

Алексей Геннадьевич
20.08.2015, 21:40
Нигде.
Спасибо.
А то всю документацию перерыл.
Привык к этой фиче в ОЛ, вот результат:confused:

Варианты : task менеджер/TON/SFC
пока другим путём пошёл. Переменную завёл временную, для отладки.

Maxsvell
23.08.2015, 11:10
В PLC_PRG создаете переменную init. В самой первой строке пишете
if not init then
init:= true;
(*здесь инициализируем нужные переменные*)
end_if

Если в дальнейшем понадобится снова проинициализировать переменные, то через триггер сбрасываем init:
init:=false;

Не помогло! Или я (что вернее всего) не так что то делаю.

amn
23.08.2015, 18:23
Может не все нужные переменные проинициализировали. При отладке посмотрите какие переменные на сбросились и добавьте их обнуление при инициализации.

firetester
25.08.2015, 13:43
Всем привет! Подскажите, есть ли возможность запихать три разных USINT в нужные места переменной TIME? Например, из СКАДы приходят Часы, минуты и секунды. Можно ли как-то просто их разместить по нужным местам в переменную TIME или нужно их пересчитывать в милисекунды, складывать и класть UDINT_to_TIME?

Yegor
25.08.2015, 14:28
Вот в этой библиотеке гляньте: http://www.codesys.ru/docs/timeexp.zip Но как по мне, то проще пересчитать t := UDINT_TO_TIME((hr * 3600 + mn * 60 + sec) * 1000).

firetester
25.08.2015, 15:00
Спасибо. Я тоже пришел к этому мнению. Пишу на ЦФЦ чтоб было всем КИПовцам понятно (будут регулярно логику менять), и в нем это вычисление выглядит...не эстетично... А ради одного вычисления ФБ отдельный на СТ писать тоже как-то не то... Вот было бы здорово, еслиб можно было hours->UP_time.h; minutes->UP_time.min; seconds->UP_time.sec; :D

Валенок
26.08.2015, 06:09
Спасибо. Я тоже пришел к этому мнению. Пишу на ЦФЦ чтоб было всем КИПовцам понятно (будут регулярно логику менять), и в нем это вычисление выглядит...не эстетично... А ради одного вычисления ФБ отдельный на СТ писать тоже как-то не то... Вот было бы здорово, еслиб можно было hours->UP_time.h; minutes->UP_time.min; seconds->UP_time.sec; :D
Макрос не катит ?

petera
26.08.2015, 07:29
....Но как по мне, то проще пересчитать t := UDINT_TO_TIME((hr * 3600 + mn * 60 + sec) * 1000).

Спасибо. Я тоже пришел к этому мнению. Пишу на ЦФЦ чтоб было всем КИПовцам понятно (будут регулярно логику менять), и в нем это вычисление выглядит...не эстетично...
Это смотря как писать вычисления
19665

firetester
26.08.2015, 07:42
Это смотря как писать вычисления
19665

Ухть! ))) Я даже не знал что во вход можно наваять вычисления на СТ. ЗдОрово! Спасибо!

alex55
30.08.2015, 08:05
Подскажите пжс-та как сделать, чтобы в визуализации кдс можно было изменять значение Т# таймера, т.е, чтобы пользователь сам мог менять уставку времени на таймере не входя в программу. С другими переменными проблем нет, а вот с PT не получается..

Sergey666
30.08.2015, 08:35
Подскажите пжс-та как сделать, чтобы в визуализации кдс можно было изменять значение Т# таймера, т.е, чтобы пользователь сам мог менять уставку времени на таймере не входя в программу. С другими переменными проблем нет, а вот с PT не получается..

Привет земеля!
Чего так не внятно ?
В какой-такой визуализации ? Если визу КДС2 , то там все отображается вводится в формате Time , в описаловке есть , то-же в КДС3 .
Если работать с панелью , то вводится переменная целочисленная 2байта(напр. Time_tmr1) и в программе : Pt:=word_to_time(Time_tmr1*100(секунды с одной десяткой))

alex55
30.08.2015, 08:56
Спасибо за оперативность земляк-разобрался в кдс-2 все нашел, получилось.

Dusty16
02.09.2015, 16:38
Всем привет. Подскажите, плиз, какой ФБ аналогичен ТРМ12 с релейными выходами?

ESTerekhov
04.09.2015, 08:43
Всем привет, у меня такой вопрос: при первом создании проекта выскакивает окно выбора как на рисунке, что именно выбирать? В инструкции не сказано.
19769
И еще такой вопрос: мне говорили, что в программе довольно успешно реализована среда для "не программистов", как это сделать, если я не хочу изучать программный код, а собирать программу из готовых блоков?

capzap
04.09.2015, 08:48
Всем привет, у меня такой вопрос: при первом создании проекта выскакивает окно выбора как на рисунке, что именно выбирать? В инструкции не сказано.
19769
И еще такой вопрос: мне говорили, что в программе довольно успешно реализована среда для "не программистов", как это сделать, если я не хочу изучать программный код, а собирать программу из готовых блоков?

ищите в поиске ключевое слово таргет и не забудте вставить наименование Вашего плк