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

Grampus
06.09.2016, 13:11
Как в содесис на языке ст сделать следующее:

Процесс1 ( здесь алгоритм)
Процесс 2 ( здесь другой алгоритм)
Процесс 3 (здесь 3 алгоритм)

А потом если выполнился первый процесс через 10 секунд начать выполнять 2 процесс . и Т.Д.

petera
06.09.2016, 13:39
Как в содесис на языке ст сделать следующее:

Процесс1 ( здесь алгоритм)
Процесс 2 ( здесь другой алгоритм)
Процесс 3 (здесь 3 алгоритм)

А потом если выполнился первый процесс через 10 секунд начать выполнять 2 процесс . и Т.Д.

Например так
26185
Здесь вызов процессов зациклен, т.е. после выполнения Процесс 3 через 10 секунд цепочка процессов будет повторятся
Или так
26186
Здесь процессы будут выполнены по очереди один раз и в дальнейшем не выполняются. Для повторного выполнения цепочки нужно принудительно задать state:=0 в любом месте программы.

pikvikone
06.09.2016, 17:19
Люди добрые в чем косяк кода посмотрите уже задол
PROGRAM oo
VAR
oa: LIN_TRAFO;
temp_delta_real:REAL;
temp_delta_3X:REAL;
TON_3X:TON;
time_3x:TIME;
step_3x:BYTE;
out_ao:REAL;

END_VAR

oa(
IN:=(REAL_TO_WORD(AO_1)) ,
IN_MIN:=0,
IN_MAX:=32768 ,
OUT_MIN:=0 ,
OUT_MAX:=100 ,
OUT=>out_ao,
ERROR=> );

temp_delta_real:= TEMP_K1 - TEMP_GI1;

CASE STEP_3x OF (*управление 3x*)
0:
IF START_CAM1 AND NOT ERROR_SET THEN
STEP_3x:=1;
END_IF;
1:
IF Ton_3x.Q AND temp_delta_real > temp_delta_3x THEN
out_ao:=5;
step_3x:=2;
END_IF;
2:
IF temp_delta_real <= temp_delta_3x THEN
step_3x:= 1;
END_IF;
END_CASE;

TON_3x(IN:=(STEP_3x =0), PT:= time_3x);
Уже бошка трящит. не хочет работать и все тут.

pikvikone
06.09.2016, 17:25
Люди добрые в чем косяк кода посмотрите уже задол
PROGRAM oo
VAR
oa: LIN_TRAFO;
temp_delta_real:REAL;
temp_delta_3X:REAL;
TON_3X:TON;
time_3x:TIME;
step_3x:BYTE;
out_ao:REAL;

END_VAR

oa(
IN:=(REAL_TO_WORD(AO_1)) ,
IN_MIN:=0,
IN_MAX:=32768 ,
OUT_MIN:=0 ,
OUT_MAX:=100 ,
OUT=>out_ao,
ERROR=> );

temp_delta_real:= TEMP_K1 - TEMP_GI1;

CASE STEP_3x OF (*управление 3x*)
0:
IF START_CAM1 AND NOT ERROR_SET THEN
STEP_3x:=1;
END_IF;
1:
IF temp_delta_real > temp_delta_3x THEN
out_ao:=5;
step_3x:=2;
END_IF;
2:
IF Ton_3x.Q then
step_3x:=1;
3:
IF temp_delta_real <= temp_delta_3x THEN
out_ao:=0;
END_IF;
END_CASE;

TON_3x(IN:=(STEP_3x =0), PT:= time_3x);



Тех задание.
У нас есть 2 температуры и 1 дельта по которым должен работать 3х ходовой клапан.
1 температура - это температура входящего гликоля в 3х ходовой клапан.
2 температура- это температура камеры
3.температура дельты - для гликоля входящего.
Устройство управление электродвигатель на 04 20 мА с ходом 20 шток управляющейся 1 AO сигналом.
Принцип работы :
Если температура камеры - температура входящего гликоля > чем температура дельты то
Открыть клапан на 5%
следующий этап это таймер например с выдержкой 30 секунд после прохождения времени условие проверяется еще раз и если не равно то клапан открывается еще то есть будет плавный гистерезис.
Следующие условие если температура камеры - температура входящего гликоля <= температуры дельты то
Клапан возвращается в исходную точку то есть закрывается в ноль. тем самым закрываю подачу входящего гликоля.
Следующие условие если воздухохладитель и насос выключаются то клапан также возвращается в состояние ноль. и при старте программы клапан должен находиться в состоянии ноль.
Гидравлическая схема приложена.
AO сигнал типа WORD 04 20 мА.

krollcbas
06.09.2016, 19:46
Павел, проблема была есть и осталась.
Проблема (ИМХО) кроется в том, что Вы слабо представляя ту задачу, которая Вам нужна, пытаетесь её программировать не имея достаточного опыта.
Почему Вы так упорно сопротивляетесь графически изложить Ваш алгоритм?
И не надо притворяться новичком, по коду Вы давно не новичок.
Нарисовав и поняв то, что нужно сделать - намного проще программировать.

pikvikone
06.09.2016, 20:30
Павел, проблема была есть и осталась.
Проблема (ИМХО) кроется в том, что Вы слабо представляя ту задачу, которая Вам нужна, пытаетесь её программировать не имея достаточного опыта.
Почему Вы так упорно сопротивляетесь графически изложить Ваш алгоритм?
И не надо притворяться новичком, по коду Вы давно не новичок.
Нарисовав и поняв то, что нужно сделать - намного проще программировать.

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

krollcbas
06.09.2016, 21:39
Давай тебя бесплатно поучу этой рисовайке. Дам примеры (только по почте). Не все же ради денег)
Шаг за шагом.

pikvikone
07.09.2016, 05:15
Давай тебя бесплатно поучу этой рисовайке. Дам примеры (только по почте). Не все же ради денег)
Шаг за шагом.

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

Grampus
07.09.2016, 05:58
Например так
26185
Здесь вызов процессов зациклен, т.е. после выполнения Процесс 3 через 10 секунд цепочка процессов будет повторятся
Или так
26186
Здесь процессы будут выполнены по очереди один раз и в дальнейшем не выполняются. Для повторного выполнения цепочки нужно принудительно задать state:=0 в любом месте программы.



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

petera
07.09.2016, 07:27
А то что в скобках после процесс, туда можно свой алгоритм записать да?

Process_N() - вызов одноименной программы
26196
Таких программ здесь три.
Естественно " туда можно свой алгоритм записать"

krollcbas
07.09.2016, 08:21
Вот то, что написал г-н Petera
26197

pikvikone
07.09.2016, 16:19
Люди как сделать проверку условия при помощи таймера тон каждые 60 секунд.

CASE step OF
0:
IF t1 > t2 THEN
out_1:=5;
step:=1;
END_IF;
1:
IF ton_1.Q THEN
step:=0;
END_IF;
END_CASE;

TON_1(IN:=(step = 0) , PT:=time_1);

чет я туплю и таймер не запускается.

capzap
07.09.2016, 16:32
Люди как сделать проверку условия при помощи таймера тон каждые 60 секунд.

CASE step OF
0:
IF t1 > t2 THEN
out_1:=5;
step:=1;
END_IF;
1:
IF ton_1.Q THEN
step:=0;
END_IF;
END_CASE;

TON_1(IN:=(step = 0) , PT:=time_1);

чет я туплю и таймер не запускается.

а с чего он будет работать, если условие его работы когда он не нужен, смените ноль на единицу

petera
07.09.2016, 16:41
Люди как сделать проверку условия при помощи таймера тон каждые 60 секунд.

CASE step OF
0:
IF t1 > t2 THEN
out_1:=5;
step:=1;
END_IF;
1:
IF ton_1.Q THEN
step:=0;
END_IF;
END_CASE;

TON_1(IN:=(step = 0) , PT:=time_1);

чет я туплю и таймер не запускается.

Потому, что когда происходит
IF t1 > t2 THEN
out_1:=5;
step:=1;
END_IF;
step становится 1, а CASE для этого состояния будет выполнятся только в следующем цикле. А строка TON_1(IN:=(step = 0) , PT:=time_1); будет выполнена в текущем цикле, соответственно TON_1 сбросится (ведь step уже не равно 0).
Таким образом условие IF ton_1.Q не выполнится никогда.

pikvikone
07.09.2016, 17:23
Потому, что когда происходит
IF t1 > t2 THEN
out_1:=5;
step:=1;
END_IF;
step становится 1, а CASE для этого состояния будет выполнятся только в следующем цикле. А строка TON_1(IN:=(step = 0) , PT:=time_1); будет выполнена в текущем цикле, соответственно TON_1 сбросится (ведь step уже не равно 0).
Таким образом условие IF ton_1.Q не выполнится никогда.

ам как сделать не подскажите?)

petera
07.09.2016, 18:33
ам как сделать не подскажите?)

Например так http://www.owen.ru/forum/showthread.php?t=10555&p=219606&viewfull=1#post219606
т.е. смените ноль на единицу
TON_1(IN:=(step = 1) , PT:=time_1)

Grampus
08.09.2016, 08:49
Господа я все никак не могу запустить таймер в кодесис на st. пишу как указано в руководстве. и каждый раз разные ошибки. помогите пожалуйста. может есть какой то нюанс!?

capzap
08.09.2016, 08:51
Господа я все никак не могу запустить таймер в кодесис на st. пишу как указано в руководстве. и каждый раз разные ошибки. помогите пожалуйста. может есть какой то нюанс!?
ну если из кода показать не чего, покажите свои руки

pikvikone
08.09.2016, 09:12
ну если из кода показать не чего, покажите свои руки

Все сделал реально просто не правильно сделал таймер. все работает пересмотрел порядок. P.S руки нормальные.

Grampus
08.09.2016, 09:28
Все разобрался, просто тип TPinst устанавливается не как обычная переменная, а с библиотеки.
вот это в руководстве не написано!

capzap
08.09.2016, 09:56
Все разобрался, просто тип TPinst устанавливается не как обычная переменная, а с библиотеки.
вот это в руководстве не написано!

а это тогда что

energvk
08.09.2016, 18:13
Не могу понять, что происходит с расчётами. Прикладываю скрин эмуляции, где разные значения обратных вычислений.
26233

energvk
08.09.2016, 22:35
Не понимаю, то лыжи не едут, то ли я идиот. Перепробовал уже кучу вариантов, с переприсвоениями промежуточными и т.п. в итоге результат неправильный. Вплоть до формулы c:=a-b, где a и b REAL переменные. В режиме эмуляции присваиваю им соответственно 90916050086-90916000000, получаю с=50112 вместо 50086. Это как так может быть?

petera
09.09.2016, 06:50
Не понимаю, то лыжи не едут, то ли я идиот. Перепробовал уже кучу вариантов, с переприсвоениями промежуточными и т.п. в итоге результат неправильный. Вплоть до формулы c:=a-b, где a и b REAL переменные. В режиме эмуляции присваиваю им соответственно 90916050086-90916000000, получаю с=50112 вместо 50086. Это как так может быть?

Ну Вы даете!
Если диапазон представления чисел для REAL от -3.4028E+38 до 3.4028E+38, то это вовсе не означает, что можно одиннадцати разрядные числа использовать!
Ведь для мантиссы отводится всего 23 бита из 32. В стандарте IEEE 754 несколько значений данного типа зарезервировано для обеспечения возможности представления специальных значений. К ним относятся значения NaN (Not a Number, «не число») и +/-INF (Infinity, бесконечность), получающихся в результате операций деления на ноль или при превышении числового диапазона. Также сюда попадают денормализованные числа, у которых мантисса меньше единицы.

В любом случае числа REAL то приблизительные и точность ограничена разрядной сеткой процессора.
Для обычного REAL число десятичных знаков д.б. не более семи, а Вы пытаетесь скормить кодесису одиннадцать. Не знаю, как компилятор округляет, например, 90916050086 может так 9.0916052992E10?
https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D1%81_%D0%BF%D0%BB %D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D0%B7% D0%B0%D0%BF%D1%8F%D1%82%D0%BE%D0%B9

26236

Grampus
09.09.2016, 07:03
Например так
26185
Здесь вызов процессов зациклен, т.е. после выполнения Процесс 3 через 10 секунд цепочка процессов будет повторятся
Или так
26186
Здесь процессы будут выполнены по очереди один раз и в дальнейшем не выполняются. Для повторного выполнения цепочки нужно принудительно задать state:=0 в любом месте программы.


Здравствуйте! объясните пожалуйста строчку 1: state := BOOL_TO_INT((TIME()-old>=T#10s)+1
что как работает!?

amn
09.09.2016, 07:54
TIME()-old>=T#10s - условие: если прошло не меньше 10 секунд, то выражение будет TRUE иначе будет FALSE.
BOOL_TO_INT преобразует тип BOOL в тип INT. То есть если значение выло true, то в результате будет 1, а если false, то будет 0.

Аналогично можно было записать так:
...
1: IF TIME()-old>=T#10s THEN
state:=2;
END_IF
...

energvk
09.09.2016, 09:24
Petera, спасибо за ликбез. В общем суть понял. Что осталось непонятным, это то,что на скриншоте вычисления с 1 по 9-ю строку и с 12 по 14-ю выполняются правильно. Вообще, я пытался обработать ваше гениальное решение по преобразованию времени в одну переменную для ПР200. И если значение даты удалось обработать, то на времени получается то что на скрине ((

capzap
09.09.2016, 09:53
Petera, спасибо за ликбез. В общем суть понял. Что осталось непонятным, это то,что на скриншоте вычисления с 1 по 9-ю строку и с 12 по 14-ю выполняются правильно. Вообще, я пытался обработать ваше гениальное решение по преобразованию времени в одну переменную для ПР200. И если значение даты удалось обработать, то на времени получается то что на скрине ((

непонятно зачем только Вы в реал всё переводите, DWORD в плк как раз и будет соответствовать без знаковому целому в ПР

energvk
09.09.2016, 10:11
непонятно зачем только Вы в реал всё переводите, DWORD в плк как раз и будет соответствовать без знаковому целому в ПР

Так не умещается в dword это число

petera
09.09.2016, 10:18
непонятно зачем только Вы в реал всё переводите, DWORD в плк как раз и будет соответствовать без знаковому целому в ПР

+100500%
Не надо заниматься ерундой, в кодесис переменные DATA_AND_TIME или DT уже упакованы в 32-х битную величину, которая не что иное как время UNIX или другое название - POSIX. Это число секунд с 0 часов 1 января 1970г. Дискретность в 1 секунду считается достаточной для большинства практических задач.
Осталось только передать в ПР значение DWORD в двух соседних регистрах и "склеит" их в ПР в одну переменную.
Для извлечения отдельных значений года, дня, месяца и т.д. нужно будет делать макросы. Вроде я где-то показывал, как в кодесисе их извлекать.
Для расширения кругозора почитайте статью И.Петрова Программируем временные сложности (http://prolog-plc.ru/docs/TimeExperience.pdf)

petera
09.09.2016, 10:39
Так не умещается в dword это число

В секундах умещается. Естественно, не от сотворения мира, а с 0 часов 1 января 1970г.

FUNCTION toDT : DT
VAR_INPUT
year: INT;
month: INT;
day: INT;
hour: INT;
minute: INT;
second: INT;
END_VAR
VAR
count: INT;
SET_DATE: DWORD;
END_VAR
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
toDT := DWORD_TO_DT(SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600);
На входе отдельно год, месяц,...сек.
На выходе упакованные в формат DATE_AND_TIME
Или сразу в DWORD

FUNCTION UCT_TO_DWORD : DWORD
VAR_INPUT
year: INT;
month: INT;
day: INT;
hour: INT;
minute: INT;
second: INT;
END_VAR
VAR
count: INT;
SET_DATE: DWORD;
END_VAR
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
UCT_TO_DWORD := SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600;
26247

ЗЫ.
Сегодня
26246

petera
09.09.2016, 11:30
Для полноты картины аналогичные функции для текущих даты и времени в ПЛК. Функции выше были для произвольных значений.

FUNCTION curDT : DT (* Текущие дата и время в формате POSIX как число секунд с 0 часов 1 января 1970г*)
VAR_INPUT
END_VAR
VAR
CurTimeExInst: CurTimeEx;
CurSystemTimeDate: SystemTimeDate;
CurSysTime64: SysTime64;
year: INT;
second: INT;
day: INT;
hour: INT;
minute: INT;
month: INT;
count: INT;
SET_DATE: DWORD;
END_VAR
CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
year :=CurSystemTimeDate.Year;
month :=CurSystemTimeDate.Month;
day :=CurSystemTimeDate.Day;
hour :=CurSystemTimeDate.Hour;
minute :=CurSystemTimeDate.Minute;
second :=CurSystemTimeDate.Second;
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
curDT := DWORD_TO_DT(SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600);
Здесь никаких входных переменных нет, функция просто возвращает текущие дату и время в формате DT.
Или такая функция - возвращает текущие дату и время сразу в формате DWORD

FUNCTION curDT_DWORD : DWORD (* Текущие дата и время в формате POSIX как число секунд с 0 часов 1 января 1970г*)
VAR_INPUT
END_VAR
VAR
CurTimeExInst: CurTimeEx;
CurSystemTimeDate: SystemTimeDate;
CurSysTime64: SysTime64;
year: INT;
second: INT;
day: INT;
hour: INT;
minute: INT;
month: INT;
count: INT;
SET_DATE: DWORD;
END_VAR
CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
year :=CurSystemTimeDate.Year;
month :=CurSystemTimeDate.Month;
day :=CurSystemTimeDate.Day;
hour :=CurSystemTimeDate.Hour;
minute :=CurSystemTimeDate.Minute;
second :=CurSystemTimeDate.Second;
(*------------------------------------------------------------------------*)
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
SET_DATE := (INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400;
(*------------------------------------------------------------------------*)
curDT_DWORD := SET_DATE
+ INT_TO_DWORD(SECOND) + INT_TO_DWORD(MINUTE) * 60
+ INT_TO_DWORD(HOUR) * 3600;
Используется библиотека SysLibTime.lib

GuntanaMo
09.09.2016, 12:10
Всем привет. Простой вопрос простого новичка. Как можно управлять ПЛК 100 с ПК окромя codesys. Чтоб у "оператора-пользователя" не было возможности поломать что либо в коде.

_Mikhail
09.09.2016, 12:14
Поставь на ПК Скаду

GuntanaMo
09.09.2016, 12:26
А теперь более подробно (я параллельно гуглю конечно, но что подсказывает то так быстрей)

Grampus
09.09.2016, 13:13
Господа подскажите пожалуйста как записать такое выражение. начало 1 процесса : проверять значение давления в течении 15 минут если все хорошо то перейти на процесс 2 , а если в какой то момент значение меньше допусти 25 то вкл авария.

petera
09.09.2016, 13:17
Господа подскажите пожалуйста как записать такое выражение. начало 1 процесса : проверять значение давления в течении 15 минут если все хорошо то перейти на процесс 2 , а если в какой то момент значение меньше допусти 25 то вкл авария.
А что это http://www.owen.ru/forum/showthread.php?t=10555&p=219513&viewfull=1#post219513 не помогло?

energvk
09.09.2016, 17:47
Наконец то добрался до компьютера... Petera, я видел Вашу тему http://www.owen.ru/forum/showthread.php?t=24999. Супер решение, которое легко реализуемо на ПЛК. И которое можно преобразовать на СКАДА или СПК, Вы так и на СП чтение организовали. Наткнувшись на эту тему, я то и задумал перейти наконец-то от 12 используемых регистров (чтение/запись) в 2. Но я также применяю и ПР200, где хотелось бы сделать что-то похожее. Но, что пугает :) это обратное преобразование в ПР полученного значения. Поэтому поискав по форуму наткнулся на макрос rovki http://www.owen.ru/forum/showthread.php?t=23807&p=205123&viewfull=1#post205123. Показалось классным решением до 2099 года. Решил посмотреть как это будет выглядеть в ПЛК на ST, из чего начали появляться мои посты :rolleyes:. По сути хотелось бы с ПР/ПЛК отправлять на верхний уровень одну переменную в dword(ну или на крайний случай float, так как у ПР200 сетевые целочисленные переменные 16-битные, а на стороне ПР разбивать 32 бита на 2 по 16 и склеивать потом не очень хотелось заморачиваться), и, соответственно на ПР/ПЛК принимать одну переменную для записи. В Скада съэкономиться 10 тэгов сразу :). Как то так, в общем. Не знаю, получилось ли объяснить свою задумку или нет, но я честно старался :rolleyes:

petera
09.09.2016, 21:20
Наконец то добрался до компьютера... Petera, я видел Вашу тему http://www.owen.ru/forum/showthread.php?t=24999. Супер решение, которое легко реализуемо на ПЛК. И которое можно преобразовать на СКАДА или СПК, Вы так и на СП чтение организовали. Наткнувшись на эту тему, я то и задумал перейти наконец-то от 12 используемых регистров (чтение/запись) в 2. Но я также применяю и ПР200, где хотелось бы сделать что-то похожее. Но, что пугает :) это обратное преобразование в ПР полученного значения. Поэтому поискав по форуму наткнулся на макрос rovki http://www.owen.ru/forum/showthread.php?t=23807&p=205123&viewfull=1#post205123. Показалось классным решением до 2099 года. Решил посмотреть как это будет выглядеть в ПЛК на ST, из чего начали появляться мои посты :rolleyes:. По сути хотелось бы с ПР/ПЛК отправлять на верхний уровень одну переменную в dword(ну или на крайний случай float, так как у ПР200 сетевые целочисленные переменные 16-битные, а на стороне ПР разбивать 32 бита на 2 по 16 и склеивать потом не очень хотелось заморачиваться), и, соответственно на ПР/ПЛК принимать одну переменную для записи. В Скада съэкономиться 10 тэгов сразу :). Как то так, в общем. Не знаю, получилось ли объяснить свою задумку или нет, но я честно старался :rolleyes:
Я думаю, что не надо изобретать велосипед в виде собственного представления упакованного времени, а взять то, что уже придумано до нас и широко используется. А именно создать для ПР макрос, аналогичный тем, что выше. Т.е. и в ПР использовать время в формате POSIX. Будет преемственность и со скадой и с ПЛК.
Думаю, что DWORD раскидать по соседним сетевым переменным можно прямо на выходе макроса.
26263

Дополнительные преимущества формата DT для ПР в том, что с упакованными дата_время переменными можно выполнять арифметические операции +/-, т.е. легко определять/задавать интервалы для событий реального времени, например для вкл/выкл по расписанию.

petera
10.09.2016, 21:31
Я думаю, что не надо изобретать велосипед в виде собственного представления упакованного времени, а взять то, что уже придумано до нас и широко используется. А именно создать для ПР макрос, аналогичный тем, что выше. Т.е. и в ПР использовать время в формате POSIX. Будет преемственность и со скадой и с ПЛК.
Думаю, что DWORD раскидать по соседним сетевым переменным можно прямо на выходе макроса.
26263

Дополнительные преимущества формата DT для ПР в том, что с упакованными дата_время переменными можно выполнять арифметические операции +/-, т.е. легко определять/задавать интервалы для событий реального времени, например для вкл/выкл по расписанию.

Дословный перевод FUNCTION UCT_TO_DWORD для ПР
26269
Как проверить? Онлайн конвертер http://www.cy-pr.com/tools/time/
26270

ЗЫ.
Сам макрос здесь http://www.owen.ru/forum/showthread.php?t=23807&p=219896&viewfull=1#post219896

energvk
11.09.2016, 03:16
petera, огромное спасибо, но я уже сам макрос написал (ну как написал, переложил вашу функцию под Лоджик :rolleyes::rolleyes:). Практически закончил макрос обратного преобразования (дни недели осталось). Как доделаю выложу на форум.

petera
11.09.2016, 04:09
petera, огромное спасибо, но я уже сам макрос написал (ну как написал, переложил вашу функцию под Лоджик :rolleyes::rolleyes:). Практически закончил макрос обратного преобразования (дни недели осталось). Как доделаю выложу на форум.

Дни недели здесь не самое сложное
26289

Пн - 1, .. Вс - 7

ЗЫ.

ну как написал, переложил вашу функцию под Лоджик
Обязательно проверьте свой макрос для третьего месяца.
Из-за того, что в лоджике нет целых переменных со знаком, то для этого фрагмента
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
..............
Для month=3
При выполнении операции SHR(month - 4,1) в кодесис получим "-1", а в лоджике получим 2147483647 т.к (4294967295/2)=2147483647
Соответственно для месяца=3
в кодесис count + SHR(month - 4,1)=59
а в лоджике получится 2147483707
Пришлось в лоджике добавить проверку месяца на 3 и вычитать явную 1 из count
26290

energvk
11.09.2016, 11:58
Дни недели здесь не самое сложное
26289

Пн - 1, .. Вс - 7

ЗЫ.

Обязательно проверьте свой макрос для третьего месяца.
Из-за того, что в лоджике нет переменных со знаком, то для этого фрагмента
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
..............
Для month=3
При выполнении операции SHR(month - 4,1) в кодесис получим "-1", а в лоджике получим 2147483647 т.к (4294967295/2)=2147483647
Соответственно для месяца=3
в кодесис count + SHR(month - 4,1)=59
а в лоджике получится 2147483707
Пришлось в лоджике добавить проверку месяца на 3 и вычитать явную 1 из count
26290

Ой, конечно же я это не учёт и в голову бы не пришло. Спасибо за поправку)

770001
11.09.2016, 12:37
Всем привет!
Не могу сохранить значение суммарного расхода. При перезагрузке значение сбрасывается в 0.
Проект на ПЛК160-АМ + СП307Р по ethernet через свитч. В проекте считается суммарный расход через расходомер. Ни как не получается сохранить это значение, что бы при перезагрузке это суммарное значение сохранялось и дальнейшее суммирование продолжалось с последнего значения...
Сделал в PLC_PRG глобальную переменную RETAIN
26292
в которую из экземпляра фб пишется суммарный расход
26293
присвоил адрес %QD7.15.0. В конфигурации ПЛК присваиваю эту переменную Float переменной %QD7.15.0 для отправки в панель, но вылетает ошибка "...несколько объявлений с одинаковым идентификатором".
26294
Пробовал через UDP, та же ошибка... В принципе не пойму логики сохранения значения переменной. Так же пытался сохранять значение переменной в файл через SysLibFile, но тоже не получилось ...
Пишу логику на CFC. ST на перспективу, сейчас хочу понять основы на понятном мне языке.
Может кто-нибудь на пальцах расскажет как можно решить эту задачу. Читал руководство по codesys, но так и не разобрался.
Понятно что я делаю все не так, но так же читал про аккумулятор, и проблему записи RETAIN,но все же хочу решить задачу программно.
Может нужно в фб делать переменную в которую пишется суммарный расход in-out, у меня просто out. И в фб локальные переменные...
26295
Вобщем помогите плиз кто-нибудь.

Andrew_Stranger
11.09.2016, 13:00
Зачем вы объявляте переменную по десять раз. Пропишите ее в конфигураторе и все. Панель у вас мастер?

petera
11.09.2016, 13:07
Всем привет!
Не могу сохранить значение суммарного расхода. При перезагрузке значение сбрасывается в 0.
Проект на ПЛК160-АМ + СП307Р по ethernet через свитч. В проекте считается суммарный расход через расходомер. Ни как не получается сохранить это значение, что бы при перезагрузке это суммарное значение сохранялось и дальнейшее суммирование продолжалось с последнего значения...
Сделал в PLC_PRG глобальную переменную RETAIN
26292
в которую из экземпляра фб пишется суммарный расход
26293
присвоил адрес %QD7.15.0. В конфигурации ПЛК присваиваю эту переменную Float переменной %QD7.15.0 для отправки в панель, но вылетает ошибка "...несколько объявлений с одинаковым идентификатором".
26294
Пробовал через UDP, та же ошибка... В принципе не пойму логики сохранения значения переменной. Так же пытался сохранять значение переменной в файл через SysLibFile, но тоже не получилось ...
Пишу логику на CFC. ST на перспективу, сейчас хочу понять основы на понятном мне языке.
Может кто-нибудь на пальцах расскажет как можно решить эту задачу. Читал руководство по codesys, но так и не разобрался.
Понятно что я делаю все не так, но так же читал про аккумулятор, и проблему записи RETAIN,но все же хочу решить задачу программно.
Может нужно в фб делать переменную в которую пишется суммарный расход in-out, у меня просто out. И в фб локальные переменные...
26295
Вобщем помогите плиз кто-нибудь.
Надеюсь, что панель у Вас мастер? В этом случае в ПЛК ВСЕ переменные в модуле Slave являются
а) - глобальными
б) - retain по умолчанию.
По этому:
1. Выкинуть из глобальных переменных все упоминания о "CO1rashod", оставить ее имя только в конфигурации слейва.
2. "в фб делать переменную в которую пишется суммарный расход in-out"

Andrew_Stranger
11.09.2016, 13:21
Тоже вопрос из той серии назрел. Petera, скажите пожалуйста в чем проблема. У меня на установке стоит сп270(мастер) и плк 160(slave). Проблема в том что при отключении питания все параметры, заданные на панели скидываются в ноль. Грешу на аккумулятор, но как подобного избежать, надеясь на худшее и задействовать память сп270. Такая же проблема при глобальном измении кода в ПЛК, приходится перезабивать все параметры.

energvk
11.09.2016, 13:52
Начитавшись про батарейку плк160 я сразу написал блок записи для переменных retain в файл (пишу в память плк при изменении, отключении питания и периодически раз в сутки). При включении плк уставки считываются из памяти. Если интересно вечером вам сброшу там ничего сложного.

petera
11.09.2016, 14:00
Тоже вопрос из той серии назрел. Petera, скажите пожалуйста в чем проблема. У меня на установке стоит сп270(мастер) и плк 160(slave). Проблема в том что при отключении питания все параметры, заданные на панели скидываются в ноль. Грешу на аккумулятор, но как подобного избежать, надеясь на худшее и задействовать память сп270. Такая же проблема при глобальном измении кода в ПЛК, приходится перезабивать все параметры.

Смотрим в Моих темах http://www.owen.ru/forum/showthread.php?t=21387 про Старт СП270 и ПЛК с ретайн при включении питания (http://www.owen.ru/forum/showthread.php?t=15707).

petera
11.09.2016, 22:24
petera, огромное спасибо, но я уже сам макрос написал (ну как написал, переложил вашу функцию под Лоджик :rolleyes::rolleyes:). Практически закончил макрос обратного преобразования (дни недели осталось). Как доделаю выложу на форум.

Кто не успел, тот опоздал. http://www.owen.ru/forum/showthread.php?t=25068&p=219991&viewfull=1#post219991

energvk
11.09.2016, 22:36
Нда, спасибо, видел уже, вся моя работа на смарку :(.

Andrew_Stranger
12.09.2016, 06:58
Petera спасибо за помощь.

770001
12.09.2016, 20:48
Надеюсь, что панель у Вас мастер? В этом случае в ПЛК ВСЕ переменные в модуле Slave являются
а) - глобальными
б) - retain по умолчанию.
По этому:
1. Выкинуть из глобальных переменных все упоминания о "CO1rashod", оставить ее имя только в конфигурации слейва.
2. "в фб делать переменную в которую пишется суммарный расход in-out"

Да, панель мастер.
Все, разобрался. У меня суммарный расход считался в фб1, фб1 вызывается в фб2, in-out нужно было делать для фб1 и фб2. А переменную, в которую пишется суммарный расход только в PLC_PRG.
Всем спасибо за пояснения!:)

Grampus
13.09.2016, 06:43
Добрый день господа! Подскажите пожалуйста, как записать контроль за параметром в течении определенного времени. например при испытаниях изделия в течении 15 минут контроль давления. если за время давление не упало то гуд. если упало то авария.

Grampus
13.09.2016, 07:12
А что это http://www.owen.ru/forum/showthread.php?t=10555&p=219513&viewfull=1#post219513 не помогло?

Помогло, а как в самом процессе записать сnрочку. через WHILE или IF??? щас попробую разобраться

petera
13.09.2016, 11:48
Помогло, а как в самом процессе записать сnрочку. через WHILE или IF??? щас попробую разобраться
WHILE на 15 минут?
Не получится, в ПЛК так нельзя.

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

PROGRAM PLC_PRG
VAR
Pusk: BOOL; (*Старт тестирования, например Н.Р. кнопка*)
Stop: BOOL; (*Стоп тестирования, например Н.Р. кнопка, для прерывания процесса тестирования*)
Sbros: BOOL; (*Сброс аварийного состояния, например Н.Р. кнопка*)
P: REAL:= 20; (*Измеренное давление*)
time_Test: TIME := t#40s; (*Время испытания изделия*)
limit_P: REAL := 10; (*Допустимое значение падения давления.*)
Trig1: R_TRIG;
time_Start: TIME ;
state: INT;
END_VAR

CASE state OF
0: (*Исходное состояние*)
Trig1(CLK:=Pusk); (*Ожидаем сигнал на старт тестирования*)
state:=BOOL_TO_INT(Trig1.Q);
1:
(*здесь добавить действия
например включить клапан
.................................................. .
и т.д.*)
state:=2;
time_Start:=TIME();
2: (*Собственно процесс тестирования*)
IF P < limit_P THEN state:=3; END_IF; (*если упало то авария*)
IF TIME() - time_Start >= time_Test OR Stop THEN state:=4; END_IF (*Если время тестирования закончилось, или его нужно прервать*)
3: (*Состояние для аварии*)
(*Здесь написать действия при аварии, например
снять давление(откл.клапан) или вкл. сигнализацию
.................................................. .
и т.д.*)
IF Sbros THEN
(*здесь добавить действия
например откл сигнализацию
.................................................. .
и т.д.*)
state:=0; (* Перейти в начало*)
END_IF
4: (*Состояние при нормальном завершении теста*)
(*здесь добавить действия
например сбросить давление, включить лампу "ОК"
.................................................. .
и т.д.*)
state:=0; (* Перейти в начало*)
END_CASE

andrsoon
13.09.2016, 14:50
Помощь нужна? Температурный график расчет 43 строки данных типа при 10 градусах подача 36.6. те.есть должна автоматически меняться уставка температуры исходя расчета графика температуры.

petera
14.09.2016, 00:16
Помощь нужна? Температурный график расчет 43 строки данных типа при 10 градусах подача 36.6. те.есть должна автоматически меняться уставка температуры исходя расчета графика температуры.
И зачем 43 точки в отопительном графике?
Вы что-нибудь про кусочно-линейную аппроксимацию слышали?
http://files3.vunivere.ru/workbase/00/04/01/95/images/image001.gif
F(x)=f(xi) + [x - x(i)] / [x(i+1) - x(i)] * [f(xi+1) - f(xi)]
Это когда непрерывная функция заменяется ломаной линией с конечным числом прямолинейных отрезков. Т.е. график по оси Х разбивается на N частей, для каждого X(i) по графику непрерывной функции определяется значение Y(i). При чем интервалы по оси Х не обязательно должны быть равномерными! Полученные пары значений записываются в таблицу.
Теперь в программе, для текущего значения Х, нужно найти интервал между соседними точками X(i) и X(i+1) в который попадает Х.
Т.е. в таблице из N строк, найти номер строки - i для которой выполняется условие
Х(i) < X <= X(i+1)
И по приведенной выше формуле рассчитать значение Y.
Если делать поиск простым перебором во всех строках, то нужно проделать от 1 до N итераций.
Не мудрено для большой таблицы, вызвать злую собаку.
Может Вам и 10 точек хватит?
Хотя, "Я угадаю эту мелодию с шести нот", в смысле могу предложить способ, при котором для таблицы из 43 строк понадобится не более ШЕСТИ итераций.:rolleyes:
И чем больше строк в таблице, тем более экономичным будет поиск по сравнения с тупым перебором.
для 8 точек графика нужно не более 3 итераций
при 9..16 точек в графике нужно не более 4 итераций
при 17..32 точек в графике нужно не более 5 итераций
при 33..64 точек в графике нужно не более 6 итераций
при 65..128 точек в графике нужно не более 7 итераций
и т.д. согласно - два в степени(кол.итераций).
Для этого я применю метод поиска делением интервала пополам, известный также как двоичный поиск или Дихотомия (https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%85%D0%BE%D1%82%D0%BE%D0%BC%D0%B8%D 1%8F).
Метод деления отрезка в золотом сечении я еще не пробовал.
И так, у меня получилась вот такая функция

FUNCTION MyGraf_p : REAL
VAR_INPUT
IN: REAL; (*Входной сигнал*)
pt : POINTER TO ARRAY[0..99] OF Point_GR; (*Массив точек графика, не более 100 пар точек X,Y*)
size : UINT;
END_VAR
VAR
a: INT; (*Начало интервала поиска*)
b: INT; (*Конец интервала поиска*)
N: INT; (*Число точек в графике*)
i: INT;
END_VAR

N:= SHR(size,3)-1; (*Число точек в графике*)
(*Начальные значения интнрвала поиска*)
a:=0;
b:=N-1;

(*Обрезание графика для крайних точек*)
IF IN<=pt^[0].X THEN
MyGraf_p:=pt^[0].Y;
ELSIF IN>=pt^[N-1].X THEN
MyGraf_p:=pt^[N-1].Y;
(*Теперь можно начать поиск*)
ELSE
WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
i:=(a+b)/2; (*Делим интервал поиска пополам*)
IF IN=pt^[i+1].X THEN (*Может нам повезло, и мы сразу нашли точку? *)
a:=i; b:=i+1; (*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
(*мимо :( ,тогда посмотрим в какую половину интервала попали*)
ELSIF IN>pt^[i].X THEN (*Если входной сигнал больше середины интервала поиска,*)
a:=i; (*то следующий поиск будем делать начиная от середины и до конца массива*)
ELSE (*А если входной сигнал меньше середины интервала поиска,*)
b:=i; (*то следующий поиск будем делать начиная от начала и до середины массива*)
END_IF
(*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину значений
две соседние координаты X(a) и Х(а+1), меду которыми попадает входной сигнал найдем очень быстро
для 8 точек графика нужно не более 3 итераций
при 9..16 точек в графике нужно не более 4 итераций
при 17..32 точек в графике нужно не более 5 итераций
при 33..64 точек в графике нужно не более 6 итераций
при 65..128 точек в графике нужно не более 7 итераций
инфа точная - 100% ;) *)
END_WHILE
(*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
MyGraf_p:=pt^[b].Y-(pt^[b].X-IN)*(pt^[b].Y-pt^[a].Y)/(pt^[b].X-pt^[a].X);
END_IF
Здесь для таблицы используется пользовательский тип данных - Point_GR

TYPE Point_GR :
STRUCT
X,Y: REAL;
END_STRUCT
END_TYPE
Максимальное кол. точек в график ограничил 100. Хотя если надо можно и больше, только не знаю, где такой график может понадобиться. Если реально будет меньше точек, то в функции ничего не менять! Все само подстроится под нужный размер.
Сам массив структур передается в функцию через указатель, по этому вызывать ее нужно так

MyGraf_p(IN, ADR(Имя_Массива), SIZEOF(Имя_Массива))

Пример программы на ST

PROGRAM PLC_PRG
VAR
GR: ARRAY [0..49] OF Point_GR:=
(X:=0, Y:=15),(X:=3, Y:=25),(X:=4, Y:=45),(X:=8, Y:=75),(X:=15, Y:=45),
(X:=16, Y:=45),(X:=20, Y:=65),(X:=22, Y:=75),(X:=40, Y:=95),(X:=50, Y:=105),

(X:=110, Y:=15),(X:=120, Y:=25),(X:=130, Y:=45),(X:=140, Y:=75),(X:=150, Y:=45),
(X:=160, Y:=45),(X:=200, Y:=65),(X:=220, Y:=75),(X:=240, Y:=95),(X:=250, Y:=305),

(X:=301, Y:=15),(X:=305, Y:=25),(X:=324, Y:=45),(X:=380, Y:=75),(X:=415, Y:=45),
(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),

(X:=511, Y:=15),(X:=515, Y:=25),(X:=524, Y:=45),(X:=580, Y:=75),(X:=615, Y:=45),
(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),

(X:=621, Y:=15),(X:=625, Y:=25),(X:=634, Y:=45),(X:=680, Y:=75),(X:=695, Y:=45),
(X:=676, Y:=45),(X:=680, Y:=65),(X:=692, Y:=75),(X:=740, Y:=495),(X:=750, Y:=505);

IN: REAL;
OUT: REAL;
END_VAR
(*ВАЖНО!
Таблица должна быть обязательно отсортирована по X в порядке возрастания значений.*)

OUT:=MyGraf_p(IN, ADR(GR), SIZEOF(GR));

Пример программы на CFC
56577

ЗЫ.
ВАЖНО!
Таблица должна быть отсортирована по X в порядке возрастания.

Grampus
14.09.2016, 06:13
Спасибо большое ! буду изучать дальше!!! очень мне помогают ваши советы!

Paveldr
14.09.2016, 10:50
День добрый. Подскажите кто нибудь подключал ПЛК и ПКП1 через 4..20мА (для управления)???

Grampus
14.09.2016, 12:39
Вот снова я завис!!!(
Процессы выполняются друг за другом, но в первом процессе я включаю кнопки на TRUE во втором выключаю. циклы повторяются и после прохождения первого цикла кнопки остаются включены. в реальной жизни ПЛК как себя поведет в такой ситуации. ? что будет с кнопками!? или делать сброс всех , но тогда в первом цикле все сброситься и что потом будет?

petera
14.09.2016, 14:04
Вот снова я завис!!!(
Процессы выполняются друг за другом, но в первом процессе я включаю кнопки на TRUE во втором выключаю. циклы повторяются и после прохождения первого цикла кнопки остаются включены. в реальной жизни ПЛК как себя поведет в такой ситуации. ? что будет с кнопками!? или делать сброс всех , но тогда в первом цикле все сброситься и что потом будет?

В реальном ПЛК все кнопки, на дискретных входах, глобальные, т.е. в любой программе это одни и те же кнопки.
А если Вы пообъявляли в каждой программе по кнопке, то это совсем разные кнопки, даже если у них одинаковые имена.
По этому, даже если у Вас нет ПЛК, все равно сразу присваивайте имена кнопкам в конфигурации ПЛК
26388
При этом из разделов объявления переменных всех программ удалить все кнопки.

Это касается и физических выходов ПЛК.

А если не знаете какой ПЛК будет, то глобальные переменные, например, кнопки и выходы будущего ПЛК объявлять в специальном разделе
26389
Туда их сразу можно поместить в процессе написания программы, когда выскакивает это окно
26390

petera
14.09.2016, 14:41
Спасибо большое ! буду изучать дальше!!! очень мне помогают ваши советы!

Можете поиграться с графиками


https://www.youtube.com/watch?v=9Vgrn8JdhSI

Grampus
14.09.2016, 14:51
В реальном ПЛК все кнопки, на дискретных входах, глобальные, т.е. в любой программе это одни и те же кнопки.
А если Вы пообъявляли в каждой программе по кнопке, то это совсем разные кнопки, даже если у них одинаковые имена.
По этому, даже если у Вас нет ПЛК, все равно сразу присваивайте имена кнопкам в конфигурации ПЛК
26388
При этом из разделов объявления переменных всех программ удалить все кнопки.

Это касается и физических выходов ПЛК.

А если не знаете какой ПЛК будет, то глобальные переменные, например, кнопки и выходы будущего ПЛК объявлять в специальном разделе
26389
Туда их сразу можно поместить в процессе написания программы, когда выскакивает это окно
26390

если я правильно понял то при объявлении переменной в конфигурации . в первом процессе кнопки должны будут выключиться когда произойдет переход на процесс 2

petera
14.09.2016, 14:55
если я правильно понял то при объявлении переменной в конфигурации . в первом процессе кнопки должны будут выключиться когда произойдет переход на процесс 2

Ну если во втором процессе выключаете, то да.

Эдуард_Н
15.09.2016, 04:56
Если вход привязать к уличной температуре то иксовые точки можно указать с минусом, я правильно понимаю?

petera
15.09.2016, 05:41
Если вход привязать к уличной температуре то иксовые точки можно указать с минусом, я правильно понимаю?

Без проблем, функция http://www.owen.ru/forum/showthread.php?t=10555&p=220263&viewfull=1#post220263 универсальная. Обе координаты точек (X, Y) графика могут задаваться и положительными и отрицательными числами. Единственное ограничение - таблица должна быть отсортирована по X в порядке возрастания.

Эдуард_Н
15.09.2016, 14:09
Без проблем, функция http://www.owen.ru/forum/showthread.php?t=10555&p=220263&viewfull=1#post220263 универсальная. Обе координаты точек (X, Y) графика могут задаваться и положительными и отрицательными числами. Единственное ограничение - таблица должна быть отсортирована по X в порядке возрастания.

Подскажите как эту функцию приладить к такому графику:26404
где:
Х0 - точка излома
Y0 - величина излома
X1 - -26°С
X2 - 8°С
Y1 - 80°С
Y2 - 60°С

Иван64
15.09.2016, 14:19
Добрый день уважаемые коллеги!
Помогите пожалуйста не ударить в грязь лицом перед моим руководством.
Не могу настроить PID регулятор.В деталях:
среда - Codesys v2.3
менеджер библиотек - Util.lib
функциональный блок - PID.
Проблема:
Y_MIN и Y_MAX - минимум и максимум управляющего воздействия по факту не ограничивают то самое управляющее воздействие, т.е. при Y_MAX= 1000
Y(выход блока) может быть больше, аналогично Y_MIN=0 воздействие уходит в отрицательную сторону.
Подскажите пожалуйста что не так.

petera
15.09.2016, 14:48
Подскажите как эту функцию приладить к такому графику:26404
где:
Х0 - точка излома
Y0 - величина излома
X1 - -26°С
X2 - 8°С
Y1 - 80°С
Y2 - 60°С
Блин, зачем здесь такая сложная функция, когда нужно проверить всего ОДНО условие x>=X0 ?

Владимир Ситников
15.09.2016, 15:01
Блин, зачем здесь такая сложная функция, когда нужно проверить всего ОДНО условие x>=X0 ?
Тут не только x>=x0 нужно проверить, а вычислить значение Y.

Так должно заработать:

(X:=-100500, Y:=Y1),
(X:=X1, Y:=Y1),
(X:=X0, Y:=Y0),
(X:=X2, Y:=Y2),
(X:=100500, Y:=Y2)

petera
15.09.2016, 15:26
Тут не только x>=x0 нужно проверить, а вычислить значение Y.

Так должно заработать:

(X:=-100500, Y:=Y1),
(X:=X1, Y:=Y1),
(X:=X0, Y:=Y0),
(X:=X2, Y:=Y2),
(X:=100500, Y:=Y2)
Проще сделать совсем другую функцию

FUNCTION EDWARD : REAL
VAR_INPUT
X0: REAL;
Y0: REAL;
X1: REAL;
Y1: REAL;
X2: REAL;
Y2: REAL;
x: REAL;
END_VAR
VAR
a: REAL;
b: REAL;
c: REAL;
d: REAL;
END_VAR
IF x < X1 THEN EDWARD:= Y1;
ELSIF x > X2 THEN EDWARD:= Y2;
ELSE
a:= X1;
b:=X0;
c:=Y1;
d:=Y0;
IF x >= X0 THEN
a:= X0;
b:=X2;
c:=Y0;
d:=Y2;
END_IF
EDWARD:=d - (b - x) * (d - c) / (b - a);
END_IF
26412 26413

ЗЫ.

Если использовать функцию с таблицей, то достаточно задать только три точки
(X:=X1, Y:=Y1),
(X:=X0, Y:=Y0),
(X:=X2, Y:=Y2),
Потому, что в самой функции уже есть в самом начале:

(*Обрезание графика для крайних точек*)
IF IN<=pt^[0].X THEN
MyGraf_p:=pt^[0].Y;
ELSIF IN>=pt^[N-1].X THEN
MyGraf_p:=pt^[N-1].Y;

petera
15.09.2016, 16:12
Функцию для Эдуарда можно даже упростить,
учитывая, что это ФУНКЦИЯ, а не ФБ выбросил промежуточные переменные

FUNCTION EDWARD : REAL
VAR_INPUT
X0: REAL;
Y0: REAL;
X1: REAL;
Y1: REAL;
X2: REAL;
Y2: REAL;
x: REAL;
END_VAR
VAR
END_VAR
IF x < X1 THEN EDWARD:= Y1;
ELSIF x > X2 THEN EDWARD:= Y2;
ELSE
IF x >= X0 THEN
X1:= X0;
X0:= X2;
Y1:= Y0;
Y0:= Y2;
END_IF
EDWARD:=Y0 - (X0 - x) * (Y0 - Y1) / (X0 - X1);
END_IF

Эдуард_Н
15.09.2016, 16:55
Спасибо, очень интересно. Будем изучать.:)

zetx16
19.09.2016, 14:22
Какой по умолчанию интервал у PLC_PRG? ПЛК110

Uran
22.09.2016, 13:27
Здравствуйте.
Помогите, пожалуйста.
Codesys 3.5.7.4.
Необходимо ввести уставку в окне проекта.
Создаю элемент.>Конфигурация ввода>OnMouseClick>Конфигурация>Записать переменную>>
Открывается окошко "Записать переменную".
Только нет полей для задания переменной, поле "тип ввода" - урезанное, есть поля "мин", "макс", "заголовок диалога".
Не могу понять где косяк.
В примерах с сайта Овена в созданных элементах - все работает, при попытке создания нового элемента - такая же петрушка.
Помогите разобраться или посоветуйте, как по другому вводить Real с панели.
Спасибо

RV9WFJ
23.09.2016, 08:03
Вот эти две настройки проверьте:
26540

26541

Uran
23.09.2016, 11:15
26547
26548
А у меня вот так.
Голову сломал.
Или я дурак или лыжи не едут

Евгений Кислов
23.09.2016, 11:19
26547
26548
А у меня вот так.
Голову сломал.
Или я дурак или лыжи не едут

Это ошибка локализации, в англоязычный версии такой проблемы нет.

Вот соответствие номеров строк в этом меню и привязанного к ним типа ввода:

1 - по умолчанию;
2 - Ввод текста (для клавиатуры);
3 - Ввод текста с ограничениями (для клавиатуры);
4 - Keypad;
5 - Numpad.

energvk
23.09.2016, 11:31
Это ошибка локализации, в англоязычный версии такой проблемы нет.

Вот соответствие номеров строк в этом меню и привязанного к ним типа ввода:

1 - по умолчанию;
2 - Ввод текста (для клавиатуры);
3 - Ввод текста с ограничениями (для клавиатуры);
4 - Keypad;
5 - Numpad.

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

Uran
23.09.2016, 11:32
Ответили из поддержки.
Да, косяк.
Надо сменить язык и перезагрузить codesys.
Проверил.
Может кому пригодится.

26550

Автовазов
23.09.2016, 15:15
Вопрос по таймерам и переключателям в ПЛК 100 и Codesys. Ранее все программы писал для Сименс ЛОГО, сейчас начал осваивать codesys и вот возникают огромное множество вопросов например как сделать таймер который по поступлению сигнала ожидал бы 5 секунд и после этого включал свой выход, причем входной сигнал не статичен, а пришел только импульсом (ну т.е. без фиксации)? Таймеры TP, TON, TOF мне не подходят, т.к. им на входе постоянно нужно наличие сигнала, чтоб не сброситься.

Василий Кашуба
23.09.2016, 15:43
Вопрос по таймерам и переключателям в ПЛК 100 и Codesys. Ранее все программы писал для Сименс ЛОГО, сейчас начал осваивать codesys и вот возникают огромное множество вопросов например как сделать таймер который по поступлению сигнала ожидал бы 5 секунд и после этого включал свой выход, причем входной сигнал не статичен, а пришел только импульсом (ну т.е. без фиксации)? Таймеры TP, TON, TOF мне не подходят, т.к. им на входе постоянно нужно наличие сигнала, чтоб не сброситься.
ТР управляется импульсом.

melky
23.09.2016, 15:48
Василий Кашуба тольуо вот TP не дает предварительной задержки перед включением выхода.

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

Василий Кашуба
23.09.2016, 15:52
Василий Кашуба тольуо вот TP не дает предварительной задержки перед включением выхода.

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

energvk
23.09.2016, 17:15
После ТР поставить TON как вариант?

Василий Кашуба
23.09.2016, 18:34
Вопрос по таймерам и переключателям в ПЛК 100 и Codesys. Ранее все программы писал для Сименс ЛОГО, сейчас начал осваивать codesys и вот возникают огромное множество вопросов например как сделать таймер который по поступлению сигнала ожидал бы 5 секунд и после этого включал свой выход, причем входной сигнал не статичен, а пришел только импульсом (ну т.е. без фиксации)? Таймеры TP, TON, TOF мне не подходят, т.к. им на входе постоянно нужно наличие сигнала, чтоб не сброситься.
А вообще то, TP+F_TRIG+RS и дают нужный функционал.

pikvikone
25.09.2016, 14:27
Товарищи нужна помощь , проблема такова мне нужно подобие мото часов. часы должны включаться и останавливаться по кнопке старт стоп конечное время 1 год.

pikvikone
25.09.2016, 20:47
FUNCTION_BLOCK Counter
VAR_INPUT
Start, Reset : BOOL;
END_VAR
VAR_IN_OUT
Second : UDINT; (*в ретайне*)
END_VAR
VAR
TM, T, Rem : TIME; (*для повышения точности Rem тоже можно вывести во внешний ретайн*)
M : BOOL;
END_VAR
-------------
IF Reset THEN
Second := 0;
Rem := T#0s;
ELSIF Start THEN
TM := TIME();
T := SEL(M, TM, T);
Rem := Rem + (TM - T);
T := TM;
Second := Second + TIME_TO_DWORD(Rem) / 1000;
Rem := Rem - Rem / 1000 * 1000;
END_IF
M := Start AND NOT Reset;


а расшифровку можно. чет вобше не вьехал))

Владимир Ситников
25.09.2016, 20:57
а расшифровку можно. чет вобше не вьехал))

Не удержался:



БЛОК РАССЧЁТ_МОТОЧАСОВ_Ы-1
ВХОДЫ
сказали_запускаться, сказали_сбросить : ТОЛИДАТОЛИНЕТ;
КОНЧИЛИСЬ
ВЫХОДОВХОДЫ
НАРАБОТКА_СЕКУНД : ЧИСЛОКАКОЕТО; (*в ретайне*)
ТОЖЕ_КОНЧИЛИСЬ
ВРЕМЕННЫЕ
КОТОРЫЙ_ЧАС, ПОСЛЕДНИЙ_ПИСК, НАРАБОТКА : ВРЕМЯ; (*для повышения точности НАРАБОТКА тоже можно вывести во внешний ретайн*)
МЫЧИМ : ТОЛИДАТОЛИНЕТ;
И_ЭТИ_КОНЧИЛИСЬ
-------------
ЕЖЕЛИ сказали_сбросить ТОГДА
НАРАБОТКА_СЕКУНД := 0;
НАРАБОТКА := T#0s;
ЕСЛИЖЕ сказали_запускаться ТОГДА
КОТОРЫЙ_ЧАС := СВЕРИМ_ЧАСЫ();
ПОСЛЕДНИЙ_ПИСК := ЧТО_ПРОИСХОДИТ?(МЫЧИМ, КОТОРЫЙ_ЧАС, ПОСЛЕДНИЙ_ПИСК);
НАРАБОТКА := НАРАБОТКА + (КОТОРЫЙ_ЧАС - ПОСЛЕДНИЙ_ПИСК);
ПОСЛЕДНИЙ_ПИСК := КОТОРЫЙ_ЧАС;
НАРАБОТКА_СЕКУНД := НАРАБОТКА_СЕКУНД + ВРЕМЯ_В_МИЛЛИСЕКУНДАХ(НАРАБОТКА) / 1000;
НАРАБОТКА := НАРАБОТКА - НАРАБОТКА / 1000 * 1000;
БЕЗ_ВАРИАНТОВ;
МЫЧИМ := сказали_запускаться И НЕ сказали_сбросить;

pikvikone
25.09.2016, 21:06
Не удержался:

Спасибо конечно что прям заморочились аш по руски записали. но я имел виду как фб пользоваться. а не что к чему относиться. в коде я разобрался дай бох с этим все хорошо. инструкцию к применению просил вот и все.

Автовазов
26.09.2016, 08:28
А вообще то, TP+F_TRIG+RS и дают нужный функционал.

Большое спасибо. Теперь все как надо.

pikvikone
27.09.2016, 08:57
Коммент - хорош )) А пользоваться - попробуйте запустить, среда подскажет если что, глаза - покажут

var
counter : counter; //в процессе иногда поднимаем и опускаем
tof : tof := (pt := t#10s500ms); //поднимаем руками in в онлайне
..
var retain
second : udint; //.. зырим сюды и думаем думу
------------
tof();
tof.in := false;
counter(start := tof.q; second := second);

Здрасте вроде разобрался только а как сделать стоп часов не сброс а стоп ?

pikvikone
27.09.2016, 16:34
Скажите как перестать считать время а то чет хз.

amn
27.09.2016, 17:53
Заблокируйте "старт" и будет вам "стоп".

MasterAndy
27.09.2016, 18:10
Уважаемая техподдежка.

Расскажите пожалуйста, как полностью деинсталировать CoDeSys v23 с компьютера.
Раньше была установлена система для WAGO (тоже на базе CoDeSys), ее удалил стандартными средствами, начал устанавливать
CoDeSys v23 и видно, что все перемешалось, остались старые настройки путей, редакторов и т.д.

AlexMo
28.09.2016, 10:59
Доброго времени, уважаемые.

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

1). Возможно ли в Codesys 3.5 конвертирование языков в LD, к примеру из CFC?
2). Как организовать связь по RS-485 СПК207 и ПЧВ на языке LD? (работа с командным словом, словом состояния, пересчетом значений мощности, напряжения, частоты, тока, уставками задания).
И если можно, то ткните носом на доступную для понимания литературу или примеры рабочих проектов работы на LD в Codesys 3.5.
Данную среду начал изучать недавно, поэтому прошу не пинать, ну или хотя бы не сильно ;)

Hex16
11.10.2016, 13:06
Здравствуйте.
Матерится компилятор на несоответствие типов. А хочу число REAL отправить по модбасу создав элемент "FLOAT". Адрес его кстати не как у контроллера %QR x.x.x:REAL, а %QD x.x.x:REAL - почему? Для эксперимента создал 4байта и 2байта, и получил по честному %QD x.x.x: DWORD и %QW x.x.x:WORD.
В чем ошибка? И как исправить?
Благодарю

26991

pikvikone
11.10.2016, 14:06
Здравствуйте , можете помочь в настройке пид регулятора. 1 датчик температуры уставка 20. на выходе аналоговый выход на 04 20 ма типа word хочу подставить в пид но там в реале выход как мне выход промаштобировать в реал. если не библиотекой lin_trafo.26992

RV9WFJ
12.10.2016, 04:53
Доброго времени, уважаемые.

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

1). Возможно ли в Codesys 3.5 конвертирование языков в LD, к примеру из CFC?
2). Как организовать связь по RS-485 СПК207 и ПЧВ на языке LD? (работа с командным словом, словом состояния, пересчетом значений мощности, напряжения, частоты, тока, уставками задания).
И если можно, то ткните носом на доступную для понимания литературу или примеры рабочих проектов работы на LD в Codesys 3.5.
Данную среду начал изучать недавно, поэтому прошу не пинать, ну или хотя бы не сильно ;)Раз недавно изучаете, откуда такие требования. Интерфейс реализовать на LD практически интим. Ищите примеры на ST,, ну или будете первопроходцем в ненужном направлении.

RV9WFJ
12.10.2016, 05:05
В ModBus по стандарту нет Float, но 4 байта послать никто не запрещал. Поэтому QD. Для того, чтобы компилятор не ругался не нужно работать с адресами памяти напрямую. Или в PLC Configuration нарямую сопоставляем Ain_dlta. Или в GLOBAL_VARS пишем сточку Ain_dlta AT QD10.1.0: REAL; Из SCADA_Map все убираем, асе должно работать.

RV9WFJ
12.10.2016, 05:12
Здравствуйте , можете помочь в настройке пид регулятора. 1 датчик температуры уставка 20. на выходе аналоговый выход на 04 20 ма типа word хочу подставить в пид но там в реале выход как мне выход промаштобировать в реал. если не библиотекой lin_trafo.26992
А вам не кажется что вы в lin_trafo входы/выходы местами перепутали? Да и вообще достаточно y_min и y_max соответствующие клапану поставить в вашем случае. Хотя мне привычнее все таки 0...100, а потом калибровать, но вы все равно какую-то ерунду задаете туда.

pikvikone
12.10.2016, 08:23
А вам не кажется что вы в lin_trafo входы/выходы местами перепутали? Да и вообще достаточно y_min и y_max соответствующие клапану поставить в вашем случае. Хотя мне привычнее все таки 0...100, а потом калибровать, но вы все равно какую-то ерунду задаете туда.

я незнаю как пид настраивать вот я и думаю что делать мне с выходом тама реал у меня ворд. преобразовоать и делить на 10 ?

capzap
12.10.2016, 08:34
я незнаю как пид настраивать вот я и думаю что делать мне с выходом тама реал у меня ворд. преобразовоать и делить на 10 ?

на той картинке всё не так, последовательность выполнения нарушена, про лин_трафо уже объяснили, одной и той же переменной присваивают свои значения и пид и лин_трафо. Семеновский ворд как реал чтоб получить зачем делить на десять, если вам нужно от нуля до ста?

Andrew_Stranger
14.10.2016, 15:14
Господа, как подать сигнал сброса из главного POU в вызываемый POU, к примеру на счетчик CTU.
Пока на ум приходит только:
CTU1(reset:=1);
CTU1(reset:=0);

Grampus
19.10.2016, 09:55
Помогите пожалуйста не понимаю программа запускается но работает не так как написано!



SRinst(SET1 := Pusk, RESET := Sbros); ** нажали кнопку пуск включили насос**

Nasos := SRinst.Q1;
IF P>5 THEN Sbros:=TRUE; END_IF; ** когда давление больше 5 насос выключается через ресет **
FTRIGinst (CLK:=Nasos); ** когда насос выключился включается таймер через переменную Т **
T:= FTRIGinst.Q;

TPinst(IN:=T, PT:= T#10s); ** когда прошло 10 секунд насос включился снова **
Nasos := TPinst.Q;

GoodLuck
19.10.2016, 10:36
Помогите пожалуйста не понимаю программа запускается но работает не так как написано!



SRinst(SET1 := Pusk, RESET := Sbros); ** нажали кнопку пуск включили насос**

Nasos := SRinst.Q1;
IF P>5 THEN Sbros:=TRUE; END_IF; ** когда давление больше 5 насос выключается через ресет **
FTRIGinst (CLK:=Nasos); ** когда насос выключился включается таймер через переменную Т **
T:= FTRIGinst.Q;

TPinst(IN:=T, PT:= T#10s); ** когда прошло 10 секунд насос включился снова **
Nasos := TPinst.Q;
По такому алгоритму у вас насос никогда и не включится, потому что переменная Nasos всегда равна FALSE.

Александр_Остриков
20.10.2016, 11:58
Здравствуйте, коллеги!

Я создал на youtube сообщество, видео уроки на котором отвечают на вопросы новичка возникающие в codesys. Если данная информация будет полезна, то я буду только рад.

https://www.youtube.com/channel/UCxT0ngJYg3YvQzVy_zElTrw

С уважением, Александр.

Denis_Kay
28.10.2016, 08:00
27313

Добрый день!
Очень нужна помощь.
Я новичек в Codesys и с ПЛК ОВЕН (в данном случае ПЛК160), до этого работал с ПЛК siemens, так что какие то элементарные знания и навыки работы с плк есть (но это вступление).
Для вопросов я подготовил картинку, ссылаюсь на нее в вопросах.

Итак, вопросы:
1) Нигде не нашел примера того можно ли обращаться к входам выходам по адресам (не по именам переменных, типо а b с как в примере)?
если можно, то примерчик обращения, а лучше несколько;

2)у меня есть два энкодера, согласно руководству я могу их подлкючить на "быстрые входы", делаю так
1й энкодер вперед на f1, назад на f2 \ 2й энкодер вперед f3, назад f4 (см. на рис под цифрой 1)
нужно ли мне что то еще настраивать в среде, чтобы считывать их значения типо (см. на рис под цифрой 3), если можно пример обработки или ссылку где можно посмотреть;

3)И наконец, если я использую быстрые входа (4 входа), то у меня еще 12 входов контроллера но (см.2) я вижу 16 входов по ветке Discrete input, я предполагаю что из них какие то четыре не используются.
подскажите пожалуйста какие не используются (a b с d e f... и тд) или поправте меня если я не прав.

_Mikhail
28.10.2016, 12:59
Добрый день!
Очень нужна помощь.
Я новичек в Codesys и с ПЛК ОВЕН (в данном случае ПЛК160), до этого работал с ПЛК siemens, так что какие то элементарные знания и навыки работы с плк есть (но это вступление).
Для вопросов я подготовил картинку, ссылаюсь на нее в вопросах.

Итак, вопросы:
1) Нигде не нашел примера того можно ли обращаться к входам выходам по адресам (не по именам переменных, типо а b с как в примере)?
если можно, то примерчик обращения, а лучше несколько;

2)у меня есть два энкодера, согласно руководству я могу их подлкючить на "быстрые входы", делаю так
1й энкодер вперед на f1, назад на f2 \ 2й энкодер вперед f3, назад f4 (см. на рис под цифрой 1)
нужно ли мне что то еще настраивать в среде, чтобы считывать их значения типо (см. на рис под цифрой 3), если можно пример обработки или ссылку где можно посмотреть;

3)И наконец, если я использую быстрые входа (4 входа), то у меня еще 12 входов контроллера но (см.2) я вижу 16 входов по ветке Discrete input, я предполагаю что из них какие то четыре не используются.
подскажите пожалуйста какие не используются (a b с d e f... и тд) или поправте меня если я не прав.

1) Можно. Например для входа 5 (на схеме а) обращение будет %IX1.0.0
3) не используются m,n,o,p - там же в байте написано, что используется только 4 бита.

EKITK
28.10.2016, 13:19
Приветствую! Что-то прям сразу споткнулся, подскажите пожалуйста: 27316

Denis_Kay
28.10.2016, 14:44
Приветствую! Что-то прям сразу споткнулся, подскажите пожалуйста: 27316

Я тут тоже новенький, но мне кажется вы не установили библиотеки, у вас я так понял голый codesys
установите автоматический установщик библиотек (ПЛК100/150/154/110/160/63/73)
http://www.owen.ru/catalog/codesys_v2/67395347
и таргет файлы на соответсвующий ПЛК
http://www.owen.ru/catalog/codesys_v2/41147932
должно помочь

EKITK
28.10.2016, 16:25
Спасибо за попытку. Разобрался. Не живет он с CodeSys от SEW-Eurodrive (PLCEditor). Надо сносить и вычищать потом еще через regedit moviplc.dll.

RomanR
28.10.2016, 21:26
Здравствуйте.
Сам только начинаю заниматься программированием ПЛК. Подскажите пожалуйста, на сайте Овен есть пример подсчёта времени станка, я попробовал его повторить с ПЛК 110-32 М02, дошёл до функциональных блоков SEL и SUB, я кажется всё перекопал но таких блоков в CDS 2.3 не нашёл. Библиотеки установлены все, какие только смог найти.

RomanR
28.10.2016, 23:31
Всё, разобрался. Огромное спасибо Александру Острикову за его канал на ютубе.

Электрон 82
29.10.2016, 20:00
Здравствуйте.
Немного предистории.
Я студент 6 курса специальность АТПП заочное отделение. Попал на эту специальность случайно на 4 курс после того как расформировали учебное заведение в котором я обучался уже на 6 курсе по специальности материаловедение в машиностроении .
В данный момент пишу Д/П на тему "Автоматизация процесса управления работой АВО(Аппаратами воздушного охлаждения)"
Первоначально выбрал плк сименс но потом полазив по интернету остановился на плк овен. Выбор связан с тем что хочу поддержать отечественного производителя(поддерживается комиссией) далее более понятная среда программирования, ну и естественно соотношение цена-качество что важно для экономической составляющей проекта.
Теперь по проекту.
АВО обеспечивают ожлаждение воды участвующей в охлаждении элементов основного оборудования сталеплавильного цеха. Всего подводится 4 контура вод к АВО . Аппаратов всего 20 . Принцип работы аппарата напоминает работу радиатора автомобиля только вентилятор приводится эл двигателем который запускается кнопкой дежурным оператором непосредственно у аппарата.Количество одновременно работающих аппаратов зависит от темп подводимой воды чем выше темп тем больше аппаратов.
Задумка такая . Спомощью плк овен создать автоматизированный комплекс выполняющий следущие требования
1 Наличие возможности ручного и автоматического управления работой аво
2 Наличие защиты и мониторинга работы эл двигателей аво
3 Возможность вывода основных данных работы аво на комп оператора(какие аппараты в работе ,эл характеристики двиг, темп воды до аппарата и после) и возможность задания режима ручной или авт с комп оператора например с использованием мастер скада.
На данный момент перечитал 3 части книги Гайнутдинова Кирила посмотрел с несколько десятов видео Владимира Петренко, Alexa, канал овен. производственное объеденение и тд.
Входе рассмотрения вставшей проблемы возникают вопросы
вот сегодня просматривал очередные уроки и читая книгу встал следущий вопрос какой максимум я смогу описать в дипломе не имея железа те собственно плк датчиков ит д из всего я понял что максимум это визуализация в кодесис. Теперь по написанию программы не могу понять алгоритм моей программы вроде как понятен процесс тк сам работаю дежурным энергослужбы и включаю коогда надо аво но немогу склеить в алгаритм . Теперь с языком написания вроде как разбираюсь в электрике и немного в электронике думал писать на лд но уроки в видео в основном на CFC. И вот таких вопросов море. Когда просматриваю уроки видео уже на слух знаю что элемент что вход выход ит д . До этого с программированием не имел дела да и плк видел только на работе и то сименс. Чего хочу от вас может кто направит в нужное русло чего подскажет совет какой .Хочу сделать сам проект не заплатив за готовый может в жизни пригодятся полученные навыки.

Andrew_Stranger
29.10.2016, 22:34
Все получится, главное побольше уверенности, она вам в будущем пригодится.

Woolfy
31.10.2016, 06:48
ТС-у. Дерзайте, и всё у вас получится!
Я бы взял за основу ПЛК110-24.60.К-М(М02). У этой серии "косяков" вроде бы меньше, чем у других. На первом этапе сделайте локальное управление системой АВО, на втором - удалённый мониторинг и управление. АВО я бы разбил на 4 группы по 5 шт. в каждой (или как на месте удобнее). Предусмотрел задержанные включения-отключения э/дв. в группе - правильнее нагружается/разгружается электросеть. Термодатчики лучше использовать с унифицированным токовым выходом 4-20 мА. Сначала составляется структурная и функциональная электросхема, потом под неё пишется (составляется) программа. Скорее всего, программу вам будет удобнее составлять в CFC. Это для старта.
Недавно автоматизировал управление парой маленьких градирен (борьба с обмерзанием зимой). Использовал связку ПЛК110 + ТРМ148 (который уже валялся в конторе). Управление пока только локальное...

Mgonch
02.11.2016, 12:05
Здравствуйте. Подскажите пожалуйста как правильно ввести в СПК207 время в которое он должен сделать определенное действие. И как это время сравнить с реальным временем?

Mgonch
02.11.2016, 14:18
Еще такой вопрос. Как решить проблему с конфигуратором ввода. Отсутствует область ввода переменной.27413

vano_id
03.11.2016, 14:10
Добрый день.
Подскажите, есть ли возможность стартовать или останавливать программу ПЛК (100-й) из-вне, например по дискретному входу, или при поступлении по модбас true|false.
Спасибо

melky
03.11.2016, 14:18
есть возможность. для этого надо предусмотреть в программе.

vano_id
03.11.2016, 14:21
а подробнее подскажите?

melky
03.11.2016, 14:24
А что тут тут должно быть подробнее ? вы же делаете старт-стоп насосу в программе по дискретному входу ? так чем вся программа отличается от одного насоса ?

НИЧЕМ, просто в старт-стопе будет весь алгоритм, что предусмотрите, то и будет.

vano_id
03.11.2016, 14:32
Вопрос не в выполнении или невыполнении всей программы, а именно старте и остановке работы программы в ПЛК. Кнопка "Старт/Стоп на самом ПЛК отключена из-за известного глюка. Оборудование будет стоять в поле, где связи вообще никакой. Будет панель оператора. Случайный останов программы (причина непринципиальна) и надо как-то стартовать программу без снятия питания. Кнопкой на шкафу(физической) или кнопкой на панели оператора (modbus)

melky
03.11.2016, 14:46
есть какая-то принципиальная разница ?

vano_id
03.11.2016, 14:51
да, если сделать, как предложили вы, то после, например CoDeSys->ОнЛайн->Стоп подать "1" на какой-то, предусмотренный вход, программа не стартует, т.к. она остановлена и реакция на эту "1" не обработается, подозреваю что это, если вообще возможно, можно сделать посредством прерываний, но вот какая команда старта PLC_PRG

Владимир Ситников
03.11.2016, 15:09
да, если сделать, как предложили вы, то после, например CoDeSys->ОнЛайн->Стоп подать "1" на какой-то, предусмотренный вход, программа не стартует, т.к. она остановлена и реакция на эту "1" не обработается, подозреваю что это, если вообще возможно, можно сделать посредством прерываний, но вот какая команда старта PLC_PRG

Вы для себя определитесь что значит "команда старта".
Если какая-нибудь часть программы ориентируется на текущее/прошедшее время. Должно ли время замереть?
Должен ли станок встать как вкопанный или должен ли он перейти в безопасное состояние?

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

Ответьте для себя на эти и подобные вопросы, и тогда станет яснее "кто виноват и что делать".


И, да,
В начале PLC_PRG можно разместить такое:

IF морская_фигура_замри THEN
сюда_нужно_добавить_действия_при_замирании_наприме р_перевод_выходов_в_безопасное_состояние
RETURN;
END_IF;

1 шанс из миллиона что такой способ "остановить программу" вам подойдёт (по причинам в вопросах выше)

melky
03.11.2016, 16:17
vano_id извините, а на кой останавливать программу из CDS ? CDS только для режима отладки, на рабочем объекте он не упал ни разу так как есть входы, выходы и переменные Modbus...

RV9WFJ
04.11.2016, 06:11
Добрый день.
Подскажите, есть ли возможность стартовать или останавливать программу ПЛК (100-й) из-вне, например по дискретному входу, или при поступлении по модбас true|false.
СпасибоМне кажется вы один раз столкнулись с граблями кнопки Старт/Стоп и теперь думаете что ПЛК может просто так взять и уйти в Стоп. Кроме как от кнопки или с компа больше его остановить ничто не может. Поэтому и чумиться не стоит. У меня 6 ПЛК100 еще с 2009 года в поле стоят и прекрасно насосами управляют по GSM. И если бы не новогодние танцы операторов то и вообще бы никаких проблем с ними не было.

Serega_80
06.11.2016, 15:14
Приветствую! Подскажите, пожалуйста, как добавить ModBUS в ПЛК73. Интерфейсную плату заменил на ПИ73-2. В Codesys 2.3 в конфигурации контроллера не активна строчка "добавить подэлемент". Может нужен другой файл конфигурации? Или нужна другая прошивка ПЛК? Заранее благодарен.27457

RV9WFJ
07.11.2016, 06:56
Прочитать инструкцию по работе с ModBus в ПЛК63/73. Она сильно отличается от ПЛК1хх.

Serega_80
07.11.2016, 13:14
Прочитать инструкцию по работе с ModBus в ПЛК63/73. Она сильно отличается от ПЛК1хх.
Очень хороший ответ:) Можно было в заголовке форума написать: "Читайте книжки! Не надо общаться на форумах! В книжках все есть!"
Я понимаю, что нет охоты тратить время, выдумывать, как же ответить на такой элементарный вопрос, но тема вроде для новичков. И перед тем, как написать свой вопрос, я кое-где поискал, кое-что полистал, согласен, может невнимательно, поэтому и решил спросить здесь.

melky
07.11.2016, 14:08
ну вы же согласились, что читали невнимательно :)

slave встроен в ПЛК63/73. Мастер только через библиотеку...

Николаев Андрей
07.11.2016, 14:46
В ПЛК73 в конфигураторе нельзя добавить никакие объекты кроме папок и переменных для экрана.
Настройка обмена по ModBus в режиме мастера осуществляется просто - установкой галочки в переменной - обмен по сети.
Для организации ModBus Master надо использовать библиотеку. Сама библиотека и пример ее использования приложены на диске с прибором.

vardrager
09.11.2016, 13:22
Здравствуйте Используя пример использования библиотеки ModBus изменил параметры для передачи значений на СМИ2, в MB_WR_SNG_REG изменил адрес на 16 и регистр для переменной 25, переменная int передается отлично ,а в функции MB_WR_REGS регистр поставил 27 и кол-во регистров 2 и на индикаторе одни ноли, тоесть ваш пример не рабочий? ПЛК73. В конфигураторе СМИ2 выставил отображение переменной float

capzap
09.11.2016, 13:30
Здравствуйте Используя пример использования библиотеки ModBus изменил параметры для передачи значений на СМИ2, в MB_WR_SNG_REG изменил адрес на 16 и регистр для переменной 25, переменная int передается отлично ,а в функции MB_WR_REGS регистр поставил 27 и кол-во регистров 2 и на индикаторе одни ноли, тоесть ваш пример не рабочий? ПЛК73. В конфигураторе СМИ2 выставил отображение переменной float

все дело может быть либо в последовательности байт, в правильной адресации, в правильном выборе функции

vardrager
09.11.2016, 21:30
последовательность байт соответствует примеру, а пример я думаю составлял грамотный человек, адресация согласно РЭ , выбор функции... в соответствии с примером для передачи переменной типа real требуется именно такая функция, соответственно либо неверно составлена функция, либо ошибка в РЭ .
Куда копать??

capzap
09.11.2016, 21:39
последовательность байт соответствует примеру, а пример я думаю составлял грамотный человек, адресация согласно РЭ , выбор функции... в соответствии с примером для передачи переменной типа real требуется именно такая функция, соответственно либо неверно составлена функция, либо ошибка в РЭ .
Куда копать??
а пример сделан специально под сми2? То что пример сделан, но вариантов подобных примеров множество, в спецификации не оговорено как должен быть устроен слейв. Читайте оба регистра, вот если они оба будут ровны нулю, тогда и флоат становится нулем по вине мастера

ec73
10.11.2016, 01:06
Приветствую. ПЛК-160-М. ОЧень простой проект:
PROGRAM PLC_PRG
VAR
in1: BOOL;
in2: BOOL;
out1: BOOL;
out2: BOOL;
END_VAR
Прошиваю контроллер - меняю состояние на входе, выхода не реагируют (реакцию определяю по индикатору запрограммированного выхода)
Меняю имена переменных на aaa251, aaa252, aaa253, aaa254 - плк работает как надо, выход отрабатывает по команде со входа.
Не подскажете в чем дело и где копать?

capzap
10.11.2016, 08:13
Приветствую. ПЛК-160-М. ОЧень простой проект:
PROGRAM PLC_PRG
VAR
in1: BOOL;
in2: BOOL;
out1: BOOL;
out2: BOOL;
END_VAR
Прошиваю контроллер - меняю состояние на входе, выхода не реагируют (реакцию определяю по индикатору запрограммированного выхода)
Меняю имена переменных на aaa251, aaa252, aaa253, aaa254 - плк работает как надо, выход отрабатывает по команде со входа.
Не подскажете в чем дело и где копать?

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

ec73
10.11.2016, 09:24
Все самое простое из книжки - вход, выход - один инверсный.
Если убрать первый символ "а" из переменной и в конфигурации, то после прошивки - в контроллере команды не отрабатывают (выходное реле не замыкается, индикации включения нет).
27510

petera
10.11.2016, 10:03
Все самое простое из книжки - вход, выход - один инверсный.
Если убрать первый символ "а" из переменной и в конфигурации, то после прошивки - в контроллере команды не отрабатывают (выходное реле не замыкается, индикации включения нет).
27510

Странный проект.
Нет кода в PLC_PRG
27511

Или Вы думаете, что сигнал со входа ПЛК на выход будет сам собой передаваться?
Но это еще не все.
Зачем Вы в разделе объявления переменных в PLC_PRG объявили входы и выходы ПЛК?
Теперь они в программе будут локальными и не каким образом не смогут быть соотнесены с физическими входами и выходами ПЛК
Про разницу между локальными и глобальными переменными см. справку
27512

Обратите внимание: Если в некотором программном компоненте проекта объявлена локальная переменная, имя которой совпадает с именем глобальной переменной, то в данном компоненте будет работать локальная переменная!

ec73
11.11.2016, 05:41
Вот как-то так для меня проще - глобальные переменные=состояния (входов)выходов; локальные переменные - те, что крутятся внутри контроллера. Создал новый проект в котором состояние со входа передается в локальную(промежуточную переменную), а состояние этой переменной передал на выход - в глобальную переменную. Ваш совет помог. По изменению входного состояния отработал выход контроллера.
Кстати, не знаю почему у вас не отображен код в PLC_PRG. Код там есть. Приложу файл.
И вообще, правилен ли ход моих мыслей?
27517

petera
11.11.2016, 07:57
Вот как-то так для меня проще - глобальные переменные=состояния (входов)выходов; локальные переменные - те, что крутятся внутри контроллера. Создал новый проект в котором состояние со входа передается в локальную(промежуточную переменную), а состояние этой переменной передал на выход - в глобальную переменную. Ваш совет помог. По изменению входного состояния отработал выход контроллера.
Кстати, не знаю почему у вас не отображен код в PLC_PRG. Код там есть. Приложу файл.
И вообще, правилен ли ход моих мыслей?
27517

Ненужна никакая промежуточная переменная!
1. Убираете в PLC_PRG все объявления тех переменных, которым присвоены имена в конфигурации.
2. А теперь в программе просто присваиваете выходной переменной(глобальной из конфигурации) значение из входной переменной из конфигурации.

ec73
11.11.2016, 09:35
Вот епрст! Все получилось!
Оказывается, перемудрил - все гораздо проще.
Спасибо, пошел осваивать дальше.))

Tomade
11.11.2016, 11:45
В CFC создал функциональный блок (FB). Экспортировал его в библиотеку с именем name.exp.
В пределах текущего проекта FB вызывается обычно: вставляю в проект элемент, ввожу в него название FB и он появляется.
В любом другом проекте, чтобы вызвать этот FB, делаю так: проект>импорт> имя ФБ> открыть. Codesys сообщает, что FB импортирован. Но сам FB в проект не вставляется! То есть когда ввожу в новый элемент имя импортированного FB, то получается просто прямоугольник с введённым именем, без входов и выходов.
Подскажите, что делаю не правильно.

capzap
11.11.2016, 11:49
В CFC создал функциональный блок (FB). Экспортировал его в библиотеку с именем name.exp.
В пределах текущего проекта FB вызывается обычно: вставляю в проект элемент, ввожу в него название FB и он появляется.
В любом другом проекте, чтобы вызвать этот FB, делаю так: проект>импорт> имя ФБ> открыть. Codesys сообщает, что FB импортирован. Но сам FB в проект не вставляется! То есть когда ввожу в новый элемент имя импортированного FB, то получается просто прямоугольник с введённым именем, без входов и выходов.
Подскажите, что делаю не правильно. не подскажем, пока скрины не выложите, как было как стало

Sizov_Alex
11.11.2016, 11:51
Следующая ситуация. Необходимо управлять с ПЛК 110-30 драйвером шагового двигателя SMSD-1.5 rs-485(производитель НПФ Электропривод). Этот драйвер не поддерживает никаких протоколов обмена, кроме своего собственного. В паспорте этого драйвера есть список команд. Команды передаются в порт RS-485 в виде ASCII символов, побайтно. Вопрос: каким образом организовать передачу с ПЛК 110-30 ASCII символов, побайтно в CoDeSys?

Михаил22
11.11.2016, 12:23
Здравствуйте, по поисковику не нашел данной проблемы. Вопрос по плк 154. Выход D02 скорее всего залип в замкнутом положении в нашей схеме (проверяли мультиметром) при том что он должен быть нормально разомкнутый. И теперь на электро привод клапана на калорифер постоянно передается сигнал на закрытие. Что можно сделать с данным ПЛК 154. И слетит ли программа при сбросе?

http://s020.radikal.ru/i719/1611/90/638fba6d310dt.jpg (http://radikal.ru/big/7anknyipeek1g)

Вольд
11.11.2016, 12:44
Следующая ситуация. Необходимо управлять с ПЛК 110-30 драйвером шагового двигателя SMSD-1.5 rs-485(производитель НПФ Электропривод). Этот драйвер не поддерживает никаких протоколов обмена, кроме своего собственного. В паспорте этого драйвера есть список команд. Команды передаются в порт RS-485 в виде ASCII символов, побайтно. Вопрос: каким образом организовать передачу с ПЛК 110-30 ASCII символов, побайтно в CoDeSys?

Этим драйвером можно также управлять через входа Step/Dir/En. А раз так, то можете воспользоваться инструментарием от В.Ситникова (http://www.owen.ru/forum/showthread.php?t=22169&page=29&p=221928&viewfull=1#post221928 и http://www.owen.ru/forum/showthread.php?t=22169&page=57&p=226390&viewfull=1#post226390). Правда ПЛК110 должен быть М02. У вас какой ?

Владимир Ситников
11.11.2016, 12:52
Этим драйвером можно также управлять через входа Step/Dir/En. А раз так, то можете воспользоваться инструментарием от В.Ситникова (http://www.owen.ru/forum/showthread.php?t=22169&page=29&p=221928&viewfull=1#post221928 и http://www.owen.ru/forum/showthread.php?t=22169&page=57&p=226390&viewfull=1#post226390). Правда ПЛК110 должен быть М02. У вас какой ?

А какой смысл управлять через STEP/DIR, если есть нормальный протокол через ASCII команды?
Неужели тяжело команду через 485 послать? Я думал, там всё просто должно быть.

Tomade
11.11.2016, 13:26
После обеденной перезагрузки компьютера всё стало работать.
Спасибо.

Sizov_Alex
11.11.2016, 13:38
А какой смысл управлять через STEP/DIR, если есть нормальный протокол через ASCII команды?
Неужели тяжело команду через 485 послать? Я думал, там всё просто должно быть.
Как раз вопрос в том, как послать команду через 485.
ПЛК110-220.30.К-М ОВЕН

capzap
11.11.2016, 13:54
Как раз вопрос в том, как послать команду через 485.
ПЛК110-220.30.К-М ОВЕН

http://www.owen.ru/forum/showthread.php?t=13585

Sizov_Alex
11.11.2016, 13:55
http://www.owen.ru/forum/showthread.php?t=13585

Уже конструктивно. Спасибо. Будем разбираться.

Владимир Ситников
11.11.2016, 13:57
Как раз вопрос в том, как послать команду через 485.
ПЛК110-220.30.К-М ОВЕН

Подход разобран тут: читаем нестандартный протокол (SysLibCom, SysLibMem) (http://www.owen.ru/forum/showthread.php?t=22498)

Sizov_Alex
11.11.2016, 14:01
Подход разобран тут: читаем нестандартный протокол (SysLibCom, SysLibMem) (http://www.owen.ru/forum/showthread.php?t=22498)

Спасибо. Буду разбираться

Владимир Ситников
11.11.2016, 14:08
Уже конструктивно. Спасибо. Будем разбираться.

К слову, вариант про ПЛК110 М02 и STEP/DIR управление тоже может иметь смысл: например, если есть М02, и нужно согласованное управление.

При управлении через 485 вы вряд ли сможете сделать согласованную работу экодера и ШД.
А при прямом управлении STEP/DIR степень контроля выше.

Но, конечно, если нет М02, или согласованная работа ШД не нужна и есть лишний 485 порт, то 485+ASCII вполне имеет право на жизнь.

Sizov_Alex
14.11.2016, 12:55
К слову, вариант про ПЛК110 М02 и STEP/DIR управление тоже может иметь смысл: например, если есть М02, и нужно согласованное управление.

При управлении через 485 вы вряд ли сможете сделать согласованную работу экодера и ШД.
А при прямом управлении STEP/DIR степень контроля выше.

Но, конечно, если нет М02, или согласованная работа ШД не нужна и есть лишний 485 порт, то 485+ASCII вполне имеет право на жизнь.

Скачал ваш инструмент. Библиотеку pru_stepper подключил, а вот как заливать PRU0.prg/PRU1.prg в контроллер , не ясно. прошу помощи.

Владимир Ситников
14.11.2016, 13:01
Скачал ваш инструмент. Библиотеку pru_stepper подключил, а вот как заливать PRU0.prg/PRU1.prg в контроллер , не ясно. прошу помощи.

Codesys -> Online -> Write file to PLC

Sizov_Alex
14.11.2016, 17:10
Codesys -> Online -> Write file to PLC

Правильно я понимаю, что для непосредственного управления шд мне необходим лишь выход PULSES_GENERATED, а STATE и CURRENT_SPEED лишь выходная информация?

Владимир Ситников
14.11.2016, 17:24
Правильно я понимаю, что для непосредственного управления шд мне необходим лишь выход PULSES_GENERATED, а STATE и CURRENT_SPEED лишь выходная информация?

Я бы предложил рассматривать STATE как основную, а PULSES_GENERATED/CURRENT_SPEED как вспомогательную информацию.
Дело в том, что если будете запускать ШД несколько раз, то нужно понимать "когда можно запускать в очередной раз". На этот вопрос и отвечает STATE.

Электрон 82
14.11.2016, 19:52
Ребята здравствуйте. Подскажите как в данном варианте реализовать исключение одновременного включения avt и ruch.

Владимир Ситников
14.11.2016, 20:10
Ребята здравствуйте. Подскажите как в данном варианте реализовать исключение одновременного включения avt и ruch.

Для исключения нужно использовать оператор исключения -- XOR.
В исключительных случаях исключающее или использовать исключается.


Но, лучше всё-таки заранее говорите какое поведение ожидаете от программы.

amn
14.11.2016, 21:34
Ребята здравствуйте. Подскажите как в данном варианте реализовать исключение одновременного включения avt и ruch.
Вам наверное нужно сделать так, чтобы при включенном ручном режиме не работал автоматический:
27599

Электрон 82
15.11.2016, 12:09
Может я плохо объяснил . Есть станок после нажатия старт я выбираю режим ручной или автоматический.Как сделать чтоб при ручном исключалась работа автоматического режима и наоборот. Чтоб на выходе шел сигнал по одной ветке булевый да а по другой нет и наоборот.

petera
15.11.2016, 14:27
Лучше вообще определится откуда эти авто и ручн. Зачем 2 сущности ? А если и не авто и не ручн - тогда что ?


Может я плохо объяснил . Есть станок после нажатия старт я выбираю режим ручной или автоматический.Как сделать чтоб при ручном исключалась работа автоматического режима и наоборот. Чтоб на выходе шел сигнал по одной ветке булевый да а по другой нет и наоборот.

Объяснили хорошо, но вот ничего слушать почему-то не хотите.

Лучше вообще определится откуда эти авто и ручн. Зачем 2 сущности ? А если и не авто и не ручн - тогда что ?
Ведь ручной и автоматический взаимоисключающие друг друга состояния.
Т.е. если ручной, то значит не автоматический. Или на оборот, если автоматический, то значит не ручной.
По этому достаточно иметь всего одну переменную, например - автоматический
27614

27615

27616

capzap
15.11.2016, 14:41
А если на дверце шкафа имеется две кнопки авто и ручной, тогда нужно добавлять блок который будет взаимоисключать одновременные нажатия, тут главное определиться с приоритетом, это можно сделать с помощью RS-триггера например.
А так для новичков рисующих в CFC, я бы рекомендовал написать свою задачку на ST, затем конвертировать в FBD и посмотреть как конвертор КДС создает графическую схему

FomichXOXO
15.11.2016, 17:03
Дамы и господа,здравствуйте.
Прошу вас помочь мне, суть вопроса такая.Нужно написать не большую программку в CodeSyS на ST:
1. Запустить насос с кнопки панель.
2. Если давление в трубе на РТ1( Датчик ) => 1 мПа то электрозадвижка открывается, если 2 мПа - закрывается.
3. Если в трубе на датчике РТ1 < 0,5 мПа - насос запускается, Если РТ1 > 2,0 мПа - насос останавливается.

Прошу,Вас,люди добрые , помогите мне новичку понять,как правильно пишется сие творение.

Woolfy
15.11.2016, 17:35
Может я плохо объяснил . Есть станок после нажатия старт я выбираю режим ручной или автоматический.Как сделать чтоб при ручном исключалась работа автоматического режима и наоборот. Чтоб на выходе шел сигнал по одной ветке булевый да а по другой нет и наоборот.
Я делаю такое с помощью явных обратных связей. 27620 Работает по принципу - "кто первый встал - того и тапки". Дальше нужен элемент памяти. Вариантов несколько, особенно для кнопок без фиксации.

Электрон 82
15.11.2016, 18:25
Ребята спасибо за участие. Вот что я за сегодня нагородил. Буду рад советам.
https://youtu.be/vJ5B6buAGNk
и файл

Электрон 82
15.11.2016, 18:47
Я делаю такое с помощью явных обратных связей. 27620 Работает по принципу - "кто первый встал - того и тапки". Дальше нужен элемент памяти. Вариантов несколько, особенно для кнопок без фиксации.

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

Glob
15.11.2016, 21:25
Всем привет, есть вопрос, буду благодарен за помощь)
(ПЛК63М)
При заливке проекта в плк, процесс доходит например 3000 из 3000 и зависает, т.е. все файлы копированы и зависает. Как решить данную проблему?
(Таргет файлы с сайта Овен)

RV9WFJ
16.11.2016, 07:06
Всем привет, есть вопрос, буду благодарен за помощь)
(ПЛК63М)
При заливке проекта в плк, процесс доходит например 3000 из 3000 и зависает, т.е. все файлы копированы и зависает. Как решить данную проблему?
(Таргет файлы с сайта Овен)Файл там копируется один. У ПЛК63/73 ресурсов совсем мало, поэтому дебаг там на пределе работает. Бывает что с первого раза программа не заливается большая. Еще в случае очень больших программ мне помогало залить сначала пустой проект, все привести к заводским и уже потом заливать большой проект.

Woolfy
16.11.2016, 07:24
схемка хорошая ,я тоже хотел делать по такой, но...

А што надо-то ?
Программа полностью зависит от:
1. Схемы электрической принципиальной;
2. Ваших хотелок;
3.Требований промышленной безопасности.
Ни первого, ни второго мы не увидели...

osvian
16.11.2016, 11:30
Как обратиться к флагам - первый цикл, арифметическое переполнение, временная метка - 1s, 5s...?

capzap
16.11.2016, 11:32
Как обратиться к флагам - первый цикл, арифметическое переполнение, временная метка - 1s, 5s...?

Вы не перепутали, это форум по работе с 3S, а не ТИАпорталом

osvian
16.11.2016, 11:39
Вроде не перепутал. Меня интересует возможность обращения к флагам PLC160 из CoDeSys. Если ошибся с адресом, мне куда?

capzap
16.11.2016, 11:49
В КДС нет таких флагов, это Вам в сименс

osvian
16.11.2016, 11:58
А что делать?

capzap
16.11.2016, 12:14
А что делать?

конструкция


VAR
flag:BOOL;
end_VAR
*****
IF NOT flag THEN
flag:=TRUE;
(*здесь можно выполнить действия при первом цикле*)
END_IF;



VAR
tik: TON;
end_VAR
*****
IF tik.Q THEN
(*здесь можно выполнить действия при периодическом выполнении*)
END_IF;
tik(IN:=NOT tik.Q,PT:=T#5s);

osvian
16.11.2016, 13:26
Спасибо. Хотя, что-то мне подсказывает, что и в архитектуре PLC все обычные для контроллеров флаги есть.

Glob
17.11.2016, 00:26
Появился такой вопрос: Как правильно конфигурировать переменные для обращения например из OPC сервера?
Например есть глобальная переменная типа BOOL в конфигурации добавлен подэлемент BOOL(var) задано имя и адрес переменной в модбас но при обращении c OPC переменная не меняет свое значение при изменении в плк.

Василий Кашуба
17.11.2016, 07:56
Появился такой вопрос: Как правильно конфигурировать переменные для обращения например из OPC сервера?
Например есть глобальная переменная типа BOOL в конфигурации добавлен подэлемент BOOL(var) задано имя и адрес переменной в модбас но при обращении c OPC переменная не меняет свое значение при изменении в плк.
Нужно, чтобы эта переменная была не только в конфигурации, но и в программе ПЛК. Не одноимённая, а эта же.

Glob
17.11.2016, 09:46
Нужно, чтобы эта переменная была не только в конфигурации, но и в программе ПЛК. Не одноимённая, а эта же.
Если у Вас будет время посмотрите пожалуйста конфигурацию ПЛК, в чем проблема? почему не могу достучаться до переменных TestBit и TestInt из OPC сервера по протоколу Modbus TCP/IP. Заранее спасибо за помощь.

ivydy
20.11.2016, 11:49
Здравствуйте. Ответьте на глупый вопрос. Имею температурный датчик ДТС125Л-РТ100.В3.60 (меняет сопротивление в зависимости от температуры. Диапазон измеряемых температур, °С : -60...+120 °C - написано на самом датчике). Подсоединил его к ПЛК B&R. С датчика приходит некое значение, в диапазоне , в зависимости от нагрева 230...280. Вопрос что это означает, и как мне его перевести в температуру. В инструкции нигде не могу найти ни коэффициентов, ни способов перевода. Спасибо

Вольд
20.11.2016, 12:34
И к какому модулю ты его подключил ?

ivydy
20.11.2016, 12:54
И к какому модулю ты его подключил ?

X20 AT 4222. Причем что интересно, сам датчик , если померить тестером, выдает примерно 110 Ом при комнатной температура, но в B&R отображается 262, хотя сконфигурировал вход именно как Pt100

Вольд
20.11.2016, 13:49
А датчик правильно подключил ?

ivydy
21.11.2016, 09:54
А датчик правильно подключил ?

Да, правильно, если его по-другому подключить, то он просто ошибку выдает. В общем проблема решилась, 262 - это соответствует температуре 26,2 'C.

Sizov_Alex
21.11.2016, 14:53
Я бы предложил рассматривать STATE как основную, а PULSES_GENERATED/CURRENT_SPEED как вспомогательную информацию.
Дело в том, что если будете запускать ШД несколько раз, то нужно понимать "когда можно запускать в очередной раз". На этот вопрос и отвечает STATE.

Подключил вашу библиотеку, при попытке приконектиться к ПЛК, чтобы загрузить PRU программы, кодесис выдает десять одинаковых ошибок "Ошибка 4001:PRU_STEPPER(тут цифра): Идентификатор "PRU_FB_SETPARAMETER" не определен". Прошу помощи.

Владимир Ситников
21.11.2016, 15:04
Подключил вашу библиотеку, при попытке приконектиться к ПЛК, чтобы загрузить PRU программы, кодесис выдает десять одинаковых ошибок "Ошибка 4001:PRU_STEPPER(тут цифра): Идентификатор "PRU_FB_SETPARAMETER" не определен". Прошу помощи.

Нужно подключить библиотеку pruAccessLib.lib. Библиотеку берут тут: http://www.owen.ru/forum/showthread.php?t=22169&p=180471&viewfull=1#post180471

Sizov_Alex
21.11.2016, 18:38
Нужно подключить библиотеку pruAccessLib.lib. Библиотеку берут тут: http://www.owen.ru/forum/showthread.php?t=22169&p=180471&viewfull=1#post180471

Ещё вопрос)
Правильно я понимаю, что PULSES_GENERATED - это информация о количестве сгенерированных сигналов?
Разьясните поподробнее следующую информацию "...При использовании PRU0.prg/PRU1.prg напрямую работать с fast output 3, 4 не получится. При использовании PRU1.prg выходы 1 и 2 будут доступны только через программу ШД..."
Необходимо загрузить обе PRU программы поочереди? Кроме этого с PRU программами надо что то делать?

Владимир Ситников
21.11.2016, 19:14
Ещё вопрос)
Правильно я понимаю, что PULSES_GENERATED - это информация о количестве сгенерированных сигналов?
Да. Её можно использовать, например, для отладки.


Разьясните поподробнее следующую информацию "...При использовании PRU0.prg/PRU1.prg напрямую работать с fast output 3, 4 не получится. При использовании PRU1.prg выходы 1 и 2 будут доступны только через программу ШД..."

Разъясняю:
1) Если нужно управлять одним ШД, то загружаем только PRU0.prg
2) Если нужно управлять двумя ШД, то загружать нужно и PRU0.prg и PRU1.prg в любом порядке (всё равно нужно сначала перезагрузить ПЛК)


Необходимо загрузить обе PRU программы поочереди? Кроме этого с PRU программами надо что то делать?
Загрузить prg файлы по необходимости и перезагрузить ПЛК. Загружать достаточно 1 раз. Больше делать ничего не нужно.

И ещё. Вопросы по PRU/ШД и т.п. лучше задавать в темах Программирование ПЛК110 М02 для задач реального времени (http://www.owen.ru/forum/showthread.php?t=22169) или Автодополнение при программировании для ПЛК (http://www.owen.ru/forum/showthread.php?t=23013&highlight=%E0%E2%F2%EE%E4%EE%EF%EE%EB%ED%E5%ED%E8% E5)

МегаВольт
23.11.2016, 08:53
Добрый день!Подскажите, пожалуйста! Для успешного обучения на Интернет-курсах «Программирование ОВЕН ПЛК1хх в среде CODESYS2.3» необходим только компьютер с установленной средой CODESYS2.3, или нужен еще реальный ПЛК?

Электрон 82
23.11.2016, 13:33
Здравствуйте. Такой вопрос как активировать растровый рисунок при true и при falseчтоб он был не видим в визуализации кодесис 2 ? Спасибо.

Sizov_Alex
23.11.2016, 17:09
Очередной вопрос. Подключил инкрементный энкодер Autonics E40S8-5000-3-T-24 к быстрым входам ПЛК110-30. Пример по этой ссылке у меня не работает https://www.youtube.com/watch?v=WfIRyDNOf3k . В обработчике прерывания на выходе функции sysPortIn все время значение 165. Проект прикрепляю.

Paveldr
24.11.2016, 12:29
День добрый. Подскажите каким еще способом можно подключить ПЛК73 к компьютеру оператора? Сейчас работает через прошивочный rs-232 (debug). А да забыл в нем стоит ПИ73-5 и один RS485 используется для обмена с MB110 и ПКП1.

Гарчев Евгений
24.11.2016, 18:42
Добрый день!Подскажите, пожалуйста! Для успешного обучения на Интернет-курсах «Программирование ОВЕН ПЛК1хх в среде CODESYS2.3» необходим только компьютер с установленной средой CODESYS2.3, или нужен еще реальный ПЛК?

Здравствуйте!
Ну для полноценного успешного обучения, конечно, не помешали бы реальные ПЛК, модули в/в, панель оператора, GSM-модем ...

Гарчев Евгений
24.11.2016, 18:44
Очередной вопрос. Подключил инкрементный энкодер Autonics E40S8-5000-3-T-24 к быстрым входам ПЛК110-30. Пример по этой ссылке у меня не работает https://www.youtube.com/watch?v=WfIRyDNOf3k . В обработчике прерывания на выходе функции sysPortIn все время значение 165. Проект прикрепляю.

Если энкодер подключен к первому и второму входу, то подавайте на вход CU бит out.0, а на вход CD бит out.1.

Гарчев Евгений
24.11.2016, 18:46
День добрый. Подскажите каким еще способом можно подключить ПЛК73 к компьютеру оператора? Сейчас работает через прошивочный rs-232 (debug). А да забыл в нем стоит ПИ73-5 и один RS485 используется для обмена с MB110 и ПКП1.


Через 2-ой RS485, если речь идет о диспетчеризации. Ну а если речь про подключение к CDS, то только Debug.

Гарчев Евгений
24.11.2016, 18:56
Здравствуйте. Такой вопрос как активировать растровый рисунок при true и при falseчтоб он был не видим в визуализации кодесис 2 ? Спасибо.

В свойствах элемента, есть группа "переменные", там есть параметр "невидимость". Работает наоборот относительно Вашего требования. Если необходимо именно, чтобы при значении "false", рисунок не отображался, то инвертируйте значение вашей переменной непосредственно в строке ввода параметра "невидимость" с помощью оператора "Not". Например, NOT(PLC_PRG.var1).

energvk
24.11.2016, 21:57
А как правильно присваивать адрес плк на разных интерфейсах? Можно один и тот же или они должны отличаться?

Электрон 82
24.11.2016, 22:02
В свойствах элемента, есть группа "переменные", там есть параметр "невидимость". Работает наоборот относительно Вашего требования. Если необходимо именно, чтобы при значении "false", рисунок не отображался, то инвертируйте значение вашей переменной непосредственно в строке ввода параметра "невидимость" с помощью оператора "Not". Например, NOT(PLC_PRG.var1).

Евгений спасибо. Сделал как вы сказали получилось.сначала делал так в переменные ставил в графе невидимость PLC_PRG.var1 а на управляющем выходе ставил инверсию вроде в визуализации работало нормально а в программе когда изображение неактивно выход висел активным.:) Спасибо.

RV9WFJ
25.11.2016, 07:44
А как правильно присваивать адрес плк на разных интерфейсах? Можно один и тот же или они должны отличаться?Между собой интерфейсы не связаны.. поэтому можно одинаковый, можно разный.

Александр Подыман
25.11.2016, 10:11
Доброго всем дня! Помощи прошу. Как из ПЛК100 передать переменную типа STRING в ОРС сервер по RS485 (как её (эту переменную) прописать в "конфигурации ПЛК"). Спасибо!

energvk
25.11.2016, 11:02
Между собой интерфейсы не связаны.. поэтому можно одинаковый, можно разный.

Спасибо. В принципе так и думал. но решил уточнить (вот просто спасибо не скажешь Б 10 символов :))

Гарчев Евгений
25.11.2016, 11:52
Доброго всем дня! Помощи прошу. Как из ПЛК100 передать переменную типа STRING в ОРС сервер по RS485 (как её (эту переменную) прописать в "конфигурации ПЛК"). Спасибо!

например, так:
27794

Александр Подыман
25.11.2016, 12:27
Спасибо! дошло!

Drahtor
03.12.2016, 23:40
Как загружать изменения в проект, чтобы не обнулились Retain-переменные, к примеру, счетчик моточасов? Если загружать только online-изменения, то при выключении питания изменения не сохраняются, в иных случаях обнуляются Retain.

slonegd
04.12.2016, 06:49
Если есть способ при заливке не трогать ретейн, то я тоже хотел бы знать. Если нет, то вместо ретейн используй запись в файл (лучше на флешке). При перезаливке проекта файлы не трогаются.

Drahtor
04.12.2016, 14:31
Как загружать изменения в проект, чтобы не обнулились Retain-переменные, к примеру, счетчик моточасов? Если загружать только online-изменения, то при выключении питания изменения не сохраняются, в иных случаях обнуляются Retain.
Изначально, в это м вопросе имелся в виду CDS 3.5, но оказалось, что чуть-чуть перепутал с веткой. Так что, если есть принципиальные отличия от CDS2.3, хотелось бы это узнать

студентГубкина
05.12.2016, 14:22
Здравствуйте , подскажите пожалуйста как написать программу для ПЛК73 , к которому подключён датчик ДТС125л в комплекте с НПТ по сигналу 4..20 . Программа должна выводить значение температуры на ЖКИ

energvk
06.12.2016, 23:09
Здравствуйте! Выявилась непонятная для меня проблема. Есть программа, в которой опрашиваются модули ввода/вывода:



CASE casestate OF
0:
IF enMU16R_1 THEN

MU16R_1(
enable:= TRUE, setMask:= bitMaskMU16R_1, devAdress:= addrMU16R_1, portNum:= portNum, timeout:= toutMU16R_1, max_try_count:= mtcMU16R_1, timerOff:= tOffMU16R_1,
Done=> ,
Data=> ,
ErrSet=> errCommModuls.MU16R_1_set,
ErrGet=> errCommModuls.MU16R_1_get,
CodeErrSet=> ,
CodeErrGet=> ,
CountErr=> countErrMU16R_1);
IF MU16R_1.Done THEN SysMemCpy(ADR(dataMU16R_1), ADR(MU16R_1.Data),2); MU16R_1( enable:= FALSE); casestate := 1; END_IF;
ELSE casestate := 1; MU16R_1( enable:= FALSE);
END_IF;

1:
IF enMV16DN_1 THEN

MV16DN_1(
enable:= TRUE, devAdress:= addrMV16DN_1, portNum:= portNum, timeout:= toutMV16DN_1, max_try_count:= mtcMV16DN_1, timerOff:= tOffMV16DN_1,
Done=> ,
Data=> ,
Err=> errCommModuls.MV16DN_1_get,
CodeErr=>,
CountErr=> countErrMV16DN_1);
IF MV16DN_1.Done THEN
IF NOT MV16DN_1.Err THEN
SysMemCpy(ADR(DataMV16DN_1), ADR(MV16DN_1.Data),2);
END_IF;
MV16DN_1(enable:= FALSE); casestate := 2;
END_IF;
ELSE casestate := 2;
END_IF;


Выделенным копирую полученные в ФБ WORD в булевые структуры:
TYPE dataMU16R :
STRUCT
offVv1energ :BOOL :=FALSE; (* Отключение 380 в от привода задвижки Резервуар №1 *)
offVv2energ :BOOL :=FALSE; (* Отключение 380 в от привода задвижки Резервуар №2 *)
offVv3energ :BOOL :=FALSE; (* Отключение 380 в от привода задвижки Резервуар №3 *)
offVv4energ :BOOL :=FALSE; (* Отключение 380 в от привода задвижки Резервуар №4 *)
ZonaBalarm :BOOL :=FALSE; (* Авария зоны С *)
rez1 :BOOL :=FALSE; (* Резервный вход 1 *)
rez2 :BOOL :=FALSE; (* Резервный вход 2 *)
rez3 :BOOL :=FALSE; (* Резервный вход 3 *)
ventKF1OnOff :BOOL :=FALSE; (* Вентилятор камеры фильтров №3 Вкл\Откл *)
ventKF1OffEnerg :BOOL :=FALSE; (* Отключение 380 в от вентилятора камеры фильтров №3 при пожаре *)
vKlap1close :BOOL :=FALSE; (* Воздушный клапан камеры фильтров №3 закрыть *)
vKlap1open :BOOL :=FALSE; (* Воздушный клапан камеры фильтров №3 открыть *)
ventKF2OnOff :BOOL :=FALSE; (* Вентилятор камеры фильтров №4 Вкл\Откл *)
ventKF2OffEnerg :BOOL :=FALSE; (* Отключение 380 в от вентилятора камеры фильтров №4 при пожаре *)
vKlap2close :BOOL :=FALSE; (* Воздушный клапан камеры фильтров №4 закрыть *)
vKlap2open :BOOL :=FALSE; (* Воздушный клапан камеры фильтров №4 открыть *)
END_STRUCT
END_TYPE

TYPE dataMV16 :
STRUCT
KF1auto :BOOL :=FALSE; (* Оборудование камеры фильтров №3 управляется в автоматическом (дистанционном) режиме *)
ventKF1avaria :BOOL :=FALSE; (* Авария по току вентилятора камеры фильтров №3 *)
vKlap1opened :BOOL :=FALSE; (* Воздушный клапан камеры фильтров №3 открыт *)
vKlap1closed :BOOL :=FALSE; (* Воздушный клапан камеры фильтров №3 закрыт *)
KF2auto :BOOL :=FALSE; (* Оборудование камеры фильтров №4 управляется в автоматическом (дистанционном) режиме *)
ventKF2avaria :BOOL :=FALSE; (* Авария по току вентилятора камеры фильтров №4 *)
vKlap2opened :BOOL :=FALSE; (* Воздушный клапан камеры фильтров №4 открыт *)
vKlap2closed :BOOL :=FALSE; (* Воздушный клапан камеры фильтров №4 закрыт *)
zatopl12 :BOOL :=FALSE; (* Затопление колодца задвижки резервуара №1 *)
offLev12 :BOOL :=FALSE; (* Уровень отключения питания задвижки резервуара №1 *)
zatopl3 :BOOL :=FALSE; (* Затопление колодца задвижки резервуара №2 *)
offLev3 :BOOL :=FALSE; (* Уровень отключения питания задвижки резервуара №2 *)
zatopl4 :BOOL :=FALSE; (* Затопление колодца задвижки резервуара №3,4 *)
offLev4 :BOOL :=FALSE; (* Уровень отключения питания задвижки резервуара №3,4 *)
rezerv1 :BOOL :=FALSE;
rezerv2 :BOOL :=FALSE;
END_STRUCT
END_TYPE

Данные структуры объявлены в глобальных переменных (возможно это не правильно):


dataMV16DN_1 :dataMV16; (* структура данных с модуля дискретного ввода МВ110-16ДН *)
dataMU16R_1 :dataMU16R; (* структура данных модуля релейногых выходов МВ110-16Р (аналогична битовой маске) *)


Так вот, маска считанных выходов из модуля МУ16Р копируется нормально, а маска входов с МВ16ДН не копируется - два первых входа в ошибке висят, остальные по нулям. Не могу понять что не так, в структуру больше нигде ничего не пишется, только читается.

Также есть структура:


TYPE sendHMI :
STRUCT
mu16rHMI :WORD :=0; (* состояние выходов модуля дискр. вывода МУ110-16Р для HMI *) (* 7 *)
md16dnHMI :WORD :=0; (* состояние входов модуля дискр. ввода МВ110-16ДН для HMI *) (* 8 *)
END_STRUCT
END_TYPE


в которую в другой программе пишутся данные:

SysMemCpy(ADR(HMIsend1.mu16rHMI),ADR(DataMU16R_1), 2);
SysMemCpy(ADR(HMIsend1.md16dnHMI),ADR(DataMV16DN_1 ),2);

где DataMU16R_1 и DataMV16DN_1 - те же структуры из глобальных переменных, и получаю HMIsend1.mu16rHMI и HMIsend1.md16dnHMI равными 0. Сломал голову, причину не выяснил. Что здесь не так?

evgens4
07.12.2016, 12:28
Здравствуйте. Вопрос такой есть удаленный объект на котором стоит плк и другой объект где стоит такой же плк. Может плк второго объекта управлять первым и наоборот. как реалезовать это?если есть пример буду очень благодарен.

melky
07.12.2016, 12:31
evgens4 может, поднять каналы связи между объектами .

energvk
07.12.2016, 13:42
Не так понимание типов данных и их внутреннего представления.

Возможно, не спорю:)
Но казалось бы Word - 2 байта (16 бит), структура также 2 байта (16 бит - 16 булевых переменных). Почему нельзя скопировать одно в другое?

RV9WFJ
07.12.2016, 15:20
Возможно, не спорю:)
Но казалось бы Word - 2 байта (16 бит), структура также 2 байта (16 бит - 16 булевых переменных). Почему нельзя скопировать одно в другое?

В структуре один BOOL это 8 бит.

energvk
07.12.2016, 17:21
В структуре один BOOL это 8 бит.

Чёрррт! Тяжело быть идиотом)

RV9WFJ, спасибо

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

В конфигурации с дискретными входами/выходами это как то сделано

Werder
07.12.2016, 23:38
При очередной заливке программы в ПЛК63-Р-М - связь зависла - в правом нижнем углу появилась буковка Э. Связь с контроллером потеряна... Посоветуйте, что нужно сделать в такой ситуации. Спасибо!

melky
08.12.2016, 08:48
Прочитайте руководство по эксплуатации, там есть возможность запустить ПЛК без запуска программы.

Werder
08.12.2016, 11:28
Сочетания клавиш при включении питания контроллера ПУСК/СТОП+ВЫХОД+ВВОД=Перезагрузка прибора, а также АЛЬТ+ВЫХОД+ВВОД=Отладочный режим - не дают результата, также в правом нижнем углу буковка Э. Может еще чего посоветуйте...Спасибо!

melky
08.12.2016, 11:37
В дополнение к основным функция кнопок в контроллере имеются еще дополнительные сочетания кнопок:
1) Для того, чтобы пользовательская программа не запускалась, следует,
удерживая кнопку (ПУСК/СТОП) , включить питание контроллера. Это может понадобиться, например, для того, чтобы программа не занимала COM-порт (подробнее см. п. 3.5.1) или при неправильном функционировании прибора, когда выполнение кода приводит к постоянной перезагрузке прибора.

Тоже пробовали ?

Werder
08.12.2016, 11:48
При таком запуске вместо буквы Э дисплей ПЛК выдает верхний ряд "закрашенных" индикаторов. Программа в ПЛК не загружается - Ошибка связи #0...

melky
08.12.2016, 12:46
Посмотрите возможность перепрошить ПЛК прошивкой. Должен быть переходник в коробке и расписана процедура.

Werder
08.12.2016, 14:34
Установил прошивку v2.12 - следую согласно пунктам мастера прошивки, который мне выдает (после выбора COM-порта) сперва: "Не установлена связь между компьютером и прибором по протоколу ОВЕН" и предлагает "Нажмите кнопку "Вперед", если известно, что у прибора сбой программы, и Мастер прошивки не может связаться по протоколу ОВЕН", и в самом конце пишет "Нет связи с USART".
Многократно перегружал комп, использовал 3 разных адаптера USB-СOM, 2 кабеля КС1, 2 платы DBGU...может винду (7) сменить... Не знаю уже куда смотреть... Может еще что-то нужно сделать? Посоветуйте. Спасибо!

melky
08.12.2016, 14:50
Тогда пожалуй в сервис...

ООО "БЛС инжинеринг"
09.12.2016, 22:46
Добрый вечер!
1) Можно в CoDeSys V2.3 на языке LD снимать значение с TON или CTU то есть то значение которое находится на выходе CV и ET (отработанное) сделать переименую?
2) И как можно на языке LD использовать арифметические операторы, операторы сравнения?

Заранее благодарен.

melky
09.12.2016, 23:20
Panalexfix так WORD_TO_BYTE, при необходимости сдвиньте при помощи SHL или SHR

aleksandr270763
10.12.2016, 13:42
Расскажите пожалуйста, для валенка , как запустить HMI-демо в кодесисе v2 пошагово для созданного проэкта и готовой визуализацией?

ООО "БЛС инжинеринг"
10.12.2016, 15:33
Добрый вечер!
1) Можно в CoDeSys V2.3 на языке LD снимать значение с TON или CTU то есть то значение которое находится на выходе CV и ET (отработанное) сделать переименую?
2) И как можно на языке LD использовать арифметические операторы, операторы сравнения?

Заранее благодарен.
Можно или нет?

alex55
10.12.2016, 15:52
1. Можно, вот в школе пример делал

ООО "БЛС инжинеринг"
10.12.2016, 16:12
1. Можно, вот в школе пример делал

Вот скрин 28030 как эти переменные можно считывать?

Спасибо.

alex55
10.12.2016, 16:35
Я их использовал только в визуализации для контроля, и никаких операций с ними не делал, не было необходимости, на st проще, а на LD надо изучить вопрос..

melky
10.12.2016, 18:04
ООО "БЛС инжинеринг" создайте переменную TIME и просто напишите ее название на ET выходе таймера.

например time_ton1: TIME;

и напишите напротив ET - time_ton1

На счет CV аналогично, только посмотрите какой тип переменной у функционального блока счетчика.

ООО "БЛС инжинеринг"
10.12.2016, 19:20
ООО "БЛС инжинеринг" создайте переменную TIME и просто напишите ее название на ET выходе таймера.

например time_ton1: TIME;

и напишите напротив ET - time_ton1

На счет CV аналогично, только посмотрите какой тип переменной у функционального блока счетчика.

Спасибо вам получилось.

Andrew_Stranger
11.12.2016, 16:46
Господа, подскажите с решением задачи. Имеется бункер с весами, который заполняется продуктом. Как можно рассчитать скорость поступления продукта?

Andrew_Stranger
12.12.2016, 09:50
Вот десять символов интересуют.

Вольд
12.12.2016, 09:58
Вот десять символов интересуют.

Cкорость поступления продукта - это приращение веса продукта за единицу времени. Если за 5 сек. насыпало 1000 кг, то средняя скорость поступления продукта будет 200 кг/сек.

ООО "БЛС инжинеринг"
12.12.2016, 23:39
Здравствуйте!
Подскажите как можно сбросить сказу несколько регистров который идут по протоколу модбас.28058
Принцип такой, оператор работал в HMI и включал какие то биты в PLC (это было ручное управление) но по ошибке их вдруг не выключил.
Как можно сразу наложить RESET указать с какова и по какой на несколько регистров в конфигураторе или познаванию переменой?

ООО "БЛС инжинеринг"
13.12.2016, 17:27
Здравствуйте!
Подскажите как можно сбросить сказу несколько регистров который идут по протоколу модбас.28058
Принцип такой, оператор работал в HMI и включал какие то биты в PLC (это было ручное управление) но по ошибке их вдруг не выключил.
Как можно сразу наложить RESET указать с какова и по какой на несколько регистров в конфигураторе или познаванию переменой?

Кто посоветует как сбросить???

capzap
13.12.2016, 17:38
кто бы еще понял что конкретно Вы хотите, вроде все элементарно, но раз вопрос задаете значит есть какой то подвох, о нем Вы не сказали ни слова

ООО "БЛС инжинеринг"
13.12.2016, 18:37
кто бы еще понял что конкретно Вы хотите, вроде все элементарно, но раз вопрос задаете значит есть какой то подвох, о нем Вы не сказали ни слова

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

capzap
13.12.2016, 20:00
опять же не понятно, что Вы хотите. В описании рассказываете что с определенного бита определенное количество, а на картинках сброса по байтно, так как Вам понимать, если тупо байты, да еще ив cfc, берете элемент move с EN, на разрешающий вход свой бит сброса и присваиваем байту конфигуратора ноль

Гарчев Евгений
13.12.2016, 20:01
Суть заключается в том чтоб одним битом можно сбросить одновременно несколько битовых регистров в конфигураторе, при этом указать только на определенные регистры или биты 28070
Можно сбрасывать биты простым способом 28071 можно и таким способом сбросить но в первом варианте мы указывает с какого и по какой бит необходимо сбросить,
предпочтительно найти решение к первому варианту.

Можно через промежуточные переменные и указатель на массив из булей.

capzap
13.12.2016, 20:02
Можно через промежуточные переменные и указатель на массив из булей.

Оххохо, Вы пробовали так?

Гарчев Евгений
13.12.2016, 20:52
Оххохо, Вы пробовали так?

Вроде бы то, о чем спрашивали, если я правильно понял ...:

capzap
13.12.2016, 21:07
с телефона сижу не вижу проекта, только указатели работают начиная с байт, да и размер массива булей проверьте

Гарчев Евгений
13.12.2016, 21:37
так для соответствия по размеру указателя и булей и нужны промежуточные переменные (программные були, которым присваиваем конфигурационные).