Вход

Просмотр полной версии : CoDeSys v2.3



Страницы : 1 [2]

Andrei Z
20.09.2012, 12:09
Почемуто у меня рассылка не пришла на видео главу 2 и главу три.. а я неделю жду прям измаялся продолжеения на обучение. На кодесис.РФ трудно оринтероваться где посмотреть бывшие главы, и перемсотреть видео. ((((((

Николаев Андрей
20.09.2012, 20:39
Для обсуждения книги создал отдельную тему:
http://www.owen.ru/forum/showthread.php?p=91337#post91337

Vukkub
23.11.2012, 17:48
В программу встроен декрементный счетчик CTD который не работает. Где ошибка подскажите?

Yegor
26.11.2012, 08:19
Вход LOAD не задействован.

vasylye
03.12.2012, 13:45
Здравствуйте!
ПЛК считывает информацию с нескольких устройств по модбас. В конфигурации ПЛК есть один мастер сети, и все устройства описаны как универсальные устройства.
Если, к примеру, одно из устройств перестанет отвечать, как обнаружить, с которым из них произошел сбой связи? Ведь если следующее ответит, то переменная Last Error установится в ноль.

Или нужно каждый цикл ПЛК читать эту переменную, и если она не равна нулю, тогда Last Address даст нам адрес этого устройства?
Правильно я думаю, или ошибаюсь ?

upd

Сомнения собственно в чем - За один цикл контроллера идет опрос только одного устройства? Или сколько получится ?

Гарчев Евгений
03.12.2012, 15:46
Здравствуйте!
Время опроса устройств при настройке через конфигурацию к времени цикла не привязано, опрос выполняется в фоновом режиме и зависит от времени выставленном в параметре polling time (подэлмент Universal ModBus Device).

S.A.D.
03.12.2012, 17:01
Если, к примеру, одно из устройств перестанет отвечать, как обнаружить, с которым из них произошел сбой связи? Ведь если следующее ответит, то переменная Last Error установится в ноль.

я сделал например вот так. но еще не тестил на стенде. Если найдете ошибку - поправьте.

IF LAST485ADR=12 AND LAST485ERR=81 THEN TIMER_MZD2(IN:=TRUE, PT:=T#1500ms);
ELSE MZD2_CON_ERR:=FALSE;
END_IF;
TIMER_MZD2();
MZD2_CON_ERR:=TIMER_MZD2.Q;

псевдокод: если последний адрес и последний код ошибки равны соответственно 12(адрес вашего устройства) и 81(код ошибки "нет связи"), то запустить таймер TON. Если по прошествии заданного времени PT условие продолжает фиксировать "LAST485ADR=12 AND LAST485ERR=81" То таймер дойдет до конца, выставит выход в true и переменной отвечающей за ошибку связи вашего модуля установится выходное значение таймера. В противном случае (если фиксируется сочитание отличное от заданного условия) переменная ошибки выставляется в FALSE. получается что у вас ничего не затирается и ошибка если есть пишется в спец.переменную

Terrano1992
03.12.2012, 20:20
В противном случае (если фиксируется сочитание отличное от заданного условия) переменная ошибки выставляется в FALSE.
...но при выполнении следующей строки программы безусловным образом заменится на действующее значение TIMER_MZD2.Q.

Вот такой вариант "на скорую руку", вроде бы, должен работать правильно:

IF LAST485ADR=12 AND LAST485ERR=81 THEN
ERR_ADR12:=TRUE;
END_IF;
IF LAST485ADR=12 AND LAST485ERR=0 THEN
ERR_ADR12:=FALSE;
END_IF;
TIMER_MZD2(IN:=ERR_ADR12, PT:=T#1500ms);
MZD2_CON_ERR:=TIMER_MZD2.Q;

Вместо булевской переменной ERR_ADR12 можно использовать SR-триггер, смысл от этого не изменится.

Yegor
04.12.2012, 10:06
Лаконичнее надо.
TIMER_MZD2(IN := LAST485ADR = 12 AND LAST485ERR = 81, PT := T#1500ms, Q => MZD2_CON_ERR)Не первый раз натыкаюсь на индусский код с булевыми на этом форуме. Народ зачем-то городит ветвления ифами и сравнивает булевые переменные с тру и фолс. Как-то так:
IF X = TRUE THEN
Y := FALSE;
END_IF
IF X = FALSE THEN
Y := TRUE;
END_IF

TIMER(IN := Y);И это вместо TIMER(IN := NOT X).

vasylye
04.12.2012, 15:39
Лаконичнее надо.

Нужно способ мышления вырабатывать такой :)

Спасибо всем за направление, в котором нужно думать !

Terrano1992
04.12.2012, 15:40
Лаконичнее надо.
Годится, но только если на этом интерфейсе висит одно-единственное устройство, с адресом 12. Или же если хотим следить лишь за отсутствием ошибок на данном интерфейсе, без уточнения конкретного устройства, вызвавшего ошибку (тогда адрес игнорируем, следим только за LAST485ERR).
Если же устройств два и более - то фиксировать ошибку обмена по "Last Address" и "Last Error" придется индивидуально для каждого адреса. Иначе результат условия LAST485ADR=12 AND LAST485ERR=81 не останется в TRUE на протяжении полутора секунд - ПЛК за это время перейдет к обмену с другим устройством, LAST485ADR станет уже не равным 12, таймер сбросится...
Предложенный мной вариант далек от изящества и сильно попахивает индусским кодом, но принцип иллюстрирует верно. Обнаружили ошибку обмена с данным адресом - запускаем TON, очередной обмен с этим адресом прошел успешно - сбрасываем. И так для каждого устройства на этом интерфейсе.

S.A.D.
20.12.2012, 10:42
Вот 100% рабочий вариант для большого количества устройств в сети.
VAR
TIMER_SKV1:TON;
SKV1_CON_ERR: BOOL;
END_VAR
(*переменные LAST485ADR и LAST485ERR объявляются непосредственно в конфигурации ПЛК*)

IF LAST485ADR={адрес устройства} AND LAST485ERR=81 THEN TIMER_SKV1(IN:=TRUE, PT:=T#1500ms);
ELSIF LAST485ADR={адрес устройства} AND LAST485ERR<>81 THEN TIMER_SKV1(IN:=FALSE);
END_IF;
SKV1_CON_ERR:=TIMER_SKV1.Q;

прошу прощения за индусский код.

ttimoh
06.02.2013, 09:48
Там нужно немного доделать самому и немного переделать, где то у меня была эта программа!

o_m
12.02.2013, 15:21
для этого случая можно без else, я так думаю:


(*lastNetAddr, lastNetErr - глобальные переменные с крайними
адресом и значением кода ошибки*)
VAR_OUTPUT
err1:BOOL;
err2:BOOL;
err3:BOOL;
END_VAR
...
CASE lastNetAddr OF
10:
err1TON(IN:=(lastNetErr=81 ) , PT:=T#1500ms, Q=>err1);
11:
err3TON(IN:=(lastNetErr=81 ) , PT:=T#1500ms, Q=>err3);
16:
err2TON(IN:=(lastNetErr=81 ) , PT:=T#1500ms, Q=>err2);
24:
;
32:
;
ELSE
;
END_CASE;
Как вариант.

Aleksey9952
01.03.2013, 12:11
У меня такая проблема.... Не знаю как сделать ротацию двигаделей через показания датчика давления... надо что бы например при давлении в 5 бар, включался таймер на 15 сек, и если давление не поднялось выше то включить второй двигатель... помогите плз...

Yegor
01.03.2013, 13:32
Мда. Окей, какая постановка задачи, такое и решение:
timer_on(IN := pressure = 5.0, PT := T#15s, Q => motor2);

Aleksey9952
01.03.2013, 13:52
Та нет, простой таймер и я могу написать))) я сам уже разобрался, спс)))

Асутупист
13.03.2013, 13:45
Здравствуйте, коллеги.
Попал мне в руки ПЛК 150. Экспериментирую и осваиваю CoDeSys.

Прочитал:
http://www.owen.ru/forum/attachment.php?attachmentid=8241&stc=1&d=1363171181

Сделал:
http://www.owen.ru/forum/attachment.php?attachmentid=8242&stc=1&d=1363171181

Собственно вопрос: А что я сделал не так?
Преобразование "REAL_TO_DWORD" очевидно, но непонятно зачем.

Вдогонку:
В списке адрес %QD7.0, а на панели "Базовые параметры" - %QB7
Вопрос 2: Чем чревато отличие в одной букве?

Yegor
13.03.2013, 16:46
Преобразование "REAL_TO_DWORD" очевидно, но непонятно зачем.Аккуратнее с такими «очевидностями».

Согласно руководству, вторая буква (D) это дескриптор размера, а не типа. И по такому определению на адрес %QD должны приниматься любые 32-битные значения, в том числе с плавающей запятой. Тем не менее, компилятор при обращении вот так по адресу допускает только целочисленные. То бишь баг или в руководстве, или в компиляторе.

Преобразование REAL_TO_DWORD здесь неуместно, т.к. дробная часть будет отброшена. Рекомендую избегать прямого обращения к таким адресам и присваивать имена в окне конфигурации.

Асутупист
13.03.2013, 18:50
Спасибо.
Потерю дробной части наблюдал воочию.

Валенок
15.03.2013, 08:31
...вторая буква (D) это дескриптор размера, а не типа....
+100500
Самые главные слова

drvlas
15.03.2013, 09:44
Аккуратнее с такими «очевидностями».Да... уж. Я, например, ошарашен тем, что к DINT компилятор в упор не хочет применять побитовые логические операции. Потом вычитал, что таки да, нужен BYTE, WORD, DWORD. И делаю тупое присваивание dw := di, чтобы потом покрутить полученное двойное слово.
С другой стороны, такая строгость системы иногда и спасает таких как я, читающих мануалы в последнюю очередь :)

Yegor
15.03.2013, 10:58
ошарашен тем, что к DINT компилятор в упор не хочет применять побитовые логические операцииТо же самое с INT и SINT. Потому что негоже биты в знаковых типах дёргать. Где вам это понадобилось вообще?

drvlas
15.03.2013, 11:15
Где вам это понадобилось вообще?Да просто выделить младшее слово, например. Я, к примеру, забрасываю DINT куда-то по словам.
Кроме того, бывают ситуации, когда просто однотипные операции делаю с разными типами. А разница между DWORD и DINT для переменных, которые по смыслу не бывают отрицательными - нулевая. Вот и бывает, что объявляю переменную DINT (за кумпанию с другими), а она, ну, может быть от 0 до 999999999. Пофиг, будет ли DWORD или DINT, так ведь? И вдруг выделить из нее некое поле операцией AND - низзя!
Конечно, все решаемо. Я не жалуюсь. Я просто ответил на вопрос.

capzap
15.03.2013, 16:11
Да просто выделить младшее слово, например. Я, к примеру, забрасываю DINT куда-то по словам.
Кроме того, бывают ситуации, когда просто однотипные операции делаю с разными типами. А разница между DWORD и DINT для переменных, которые по смыслу не бывают отрицательными - нулевая. Вот и бывает, что объявляю переменную DINT (за кумпанию с другими), а она, ну, может быть от 0 до 999999999. Пофиг, будет ли DWORD или DINT, так ведь? И вдруг выделить из нее некое поле операцией AND - низзя!
Конечно, все решаемо. Я не жалуюсь. Я просто ответил на вопрос.

Точно ни чего не путаете, а тогда зачем существует тип переменной UDINT если знака нет?

drvlas
15.03.2013, 16:27
тогда зачем существует тип переменной UDINT если знака нет?А зачем? Я в упор не вижу ни малейшей разницы в обработке 32-разрядного слова, если его старший разряд не есть знаковый. Покажите мне хоть одну операцию, в которой проц должен поступить неодинаково для типов DWORD и Вашего DUINT - и я все прощу :)

Василий Кашуба
17.03.2013, 19:02
Не знаю кто глючит, Эмулятор или КОДЕСИС. :confused:
Но в Овен Лоджике такого не происходит.:)

capzap
17.03.2013, 19:53
Не знаю кто глючит, Эмулятор или КОДЕСИС. :confused:
Но в Овен Лоджике такого не происходит.:)

А чего конкретно не так?

Василий Кашуба
17.03.2013, 20:22
А чего конкретно не так?

Разрешающего сигнала нет, а на выходе БЛИНКа "Истина" и ещё после R_TRIG "ложь", а BOOL_TO_DINT выдаёт "1".:confused:

capzap
17.03.2013, 21:17
Разрешающего сигнала нет, а на выходе БЛИНКа "Истина" и ещё после R_TRIG "ложь", а BOOL_TO_DINT выдаёт "1".:confused:

Вы видео покажите что с момента старта плк у Вас на выходе блинка ИСТИНА. А про преобразование на картинке не видно что у Вас единица. Тригер, что Р, что Ф практически не возможно увидеть на выходе ИСТИНА, потому что смена фронта длится один цикл, поставте минимальное время цикла в районе 100мс и увидите синюю полоску

Василий Кашуба
17.03.2013, 22:26
Вы видео покажите что с момента старта плк у Вас на выходе блинка ИСТИНА. А про преобразование на картинке не видно что у Вас единица. Тригер, что Р, что Ф практически не возможно увидеть на выходе ИСТИНА, потому что смена фронта длится один цикл, поставте минимальное время цикла в районе 100мс и увидите синюю полоску

Это не видео, а статическая картинка, сделана ножницами во время работы эмулятора.

rovki
17.03.2013, 23:07
На сколько я понял ,вопрос не в том ,что не видно короткого импульса на выходе R- триггера ,а в том почему после преобразования типа стоит 1 ,а на входе функции уже давно "0".

capzap
18.03.2013, 06:12
www.owen.ru/forum/showpost.php?p=104508&postcount=6
:) потому что потому.
Когда выключите управляющий вход во время состояния ФАЛЬШ, он же остается в выключенном состоянии.

Yegor
17.04.2013, 13:18
Я идейный баг нашёл. Вдумайтесь: VAR CONSTANT. Ведь если что-то констант, то оно уже не вар, и обратно. А ведь сюда ещё RETAIN дописать можно, и оно скомпилируется. Должно быть просто CONSTANT без VAR.

AlexeyA
17.06.2013, 13:08
подскажите пожалуйста, объем retain памяти в 4кВ, я как понял, позволяет сохранить 2048 переменный в 2 байта?
или я неправ?

lara197a
17.06.2013, 13:15
а еще можно расширить до 16к.

AlexeyA
17.06.2013, 13:26
у меня столько переменных нет.)

в чем же подводные камни?

IVAN05
20.07.2013, 09:49
Добрый день! В каком разделе можно задать :Вопросы типа почему я не могу найти что то или как мне записать программу -чтобы не удаляли а помогли. Прошлые бесплатные курсы изучил-составить программу самостоятельно не получается.
Спасибо.

Василий Кашуба
20.07.2013, 13:14
Добрый день! В каком разделе можно задать :Вопросы типа почему я не могу найти что то или как мне записать программу -чтобы не удаляли а помогли. Прошлые бесплатные курсы изучил-составить программу самостоятельно не получается.
Спасибо.
Задайте конкретный вопрос в теме "Вопрос - ответ".

Александр Ушаков
31.12.2013, 07:19
Здравствуйте.
В многозадачном проекте странно работают программы, вначале я думал что это проблема эмулятора но на железе всё тоже.
Я понимаю что сам делаю что то не так, но разобраться не смог.
Проблема вот в чём: есть многозадачный проект, две задачи включаются по событиям, события переменные SOB_1 и SOB_2 обьявленные в конфигураторе MODBUS SLAVE, програмки простенькие переменная S_1 включает обмотку K_1 и переменная S_2 включает обмотку К_2,программы в LD. Запускаем проект устанавливаем SOB_2 в TRUE переменную S_2 TRUE линия тока засвечивается синеньким и до обмотки и после неё, а вот сама обмотка К_2 не включается.
112561125711258
Помогите разобраться.
Спасибо.

capzap
31.12.2013, 10:29
Здравствуйте.
В многозадачном проекте странно работают программы, вначале я думал что это проблема эмулятора но на железе всё тоже.
Я понимаю что сам делаю что то не так, но разобраться не смог.
Проблема вот в чём: есть многозадачный проект, две задачи включаются по событиям, события переменные SOB_1 и SOB_2 обьявленные в конфигураторе MODBUS SLAVE, програмки простенькие переменная S_1 включает обмотку K_1 и переменная S_2 включает обмотку К_2,программы в LD. Запускаем проект устанавливаем SOB_2 в TRUE переменную S_2 TRUE линия тока засвечивается синеньким и до обмотки и после неё, а вот сама обмотка К_2 не включается.
112561125711258
Помогите разобраться.
Спасибо.
смотрите внимательно все ли действия выполнили, мне так кажется старт забыли нажать

Александр Ушаков
31.12.2013, 11:36
Если сначала установить в истина S_1 а потом SOB_1 то все работает, а вот если SOB_1 потом S_1 то дудки. Почему так?

capzap
31.12.2013, 12:15
потому что событие наступает один раз, и раз включаете сперва SOB_1 то программа видит низкий потенциал S_1 и соответственно не включает K_1. Это же простая логика, как в ней можно запутаться

Александр Ушаков
31.12.2013, 12:57
Так что же все переключения наступают только по фронту события и дальше в программах подключённых к задаче чтобы не происходило всё пофигу, вот это да.
Мысль была такая, при вызове экрана в панели устанавливается бит в ПЛК и по этому событию отрабатывались бы программы подключённые к задаче, и как реализовать хоть что то похожее.

capzap
31.12.2013, 13:08
Вы видимо не поняли, Ваши программы запускаются когда наступает событие изменение состояния переменной, один цикл выполнилась и все, ждет следующего изменения состояния, это совсем не то что программа работает пока состояние переменной TRUE, это надо организовывать по другому, с помощью цикличного вызова и первой строчкой программы, что то вроде этого
IF NOT SOB_1 THEN RETURN; END_IF;

Александр Ушаков
31.12.2013, 13:40
capzap! Спасибо за разьяснеия, для меня это удар проект большой одних экранов (читай задач) десяток причём они не зависимы друг от друга, а зачастую и взаимоисключающие, теперь надо обдумывать всю концепцию. А всё казалось так логично, век учись.

capzap
31.12.2013, 13:43
чего там обдумывать, просто добавлять такую строчку и взависимости от состояния переменной будет программа работать или сразу закроется, остальной код останется таким же

Единственно,я не могу показать как это в графических языках делается, так можно этот код сконвертировать в LD и всё

olegteh
01.01.2014, 13:11
Добрый день и с новым годом!
Прошу подсказать написание программы на языке cfc.
условие: имеем одну группу освещения и две кнопки на включение этой группы.
Необходимо реализовать включение и отключение света по [U]короткому[U] нажатию. А по " длинному" нажатию диммирование освещения.
Спасибо.

Валенок
02.01.2014, 12:59
Только сначала стишок рассказал бы штоли
PS
Остальное уже было

olegteh
02.01.2014, 13:43
Вот стишок:

Что такое Новый год?
Это всё наоборот:
Ёлки в комнате растут,
Белки шишек не грызут,

Зайцы рядом с волком
На колючей ёлке!
Дождик тоже не простой,
В Новый год он золотой,

Блещет что есть мочи,
Никого не мочит,
Даже Дедушка Мороз
Никому не щиплет нос.

Спасибо за подсказку по программе.

nikmal
03.01.2014, 10:01
Коллеги! Всем с Новым Годом!

У меня вопрос, есть ли версии codesys для операционной системы OS X (mac)? естественно, с поддержкой приборов ОВЕН.

Спасибо.
Извиняюсь, если повторяюсь, не нашёл в поиске.

Darkmen999
07.02.2014, 14:26
Здравствуйте. Возможно данный вопрос уже был, а значит заранее извиняюсь за повтор.
Скачал с сайта примеры программ и полезности для ПЛК63. При открытии появляется ошибка: "Ошибка чтения целевой платформы ", за ней следующая: "Файл описания модуля 'Module.Root' не найден".
Установил все библиотеки с диска, прилагающемся к ПЛК63. Установил все нужные target-файлы. Проблема не исчезла. Потом переустановил все заново, включая и саму Codesys. Не помогло. Эмулировать примеры естественно не могу, выскакивают ошибки определения идентификаторов.
Программой пользуюсь совсем недавно, может я что не так понял?
Большое спасибо.

capzap
07.02.2014, 15:00
Полное название плк и имена файлов таргетов можете выложить,лучше скрин папки где установились таргеты

Darkmen999
07.02.2014, 15:22
Сам ПЛК не покупал, а скачал только таргет к нему, дабы научиться сначала программированию ПЛК, прежде чем приобретать его.
Сразу поясню, папка с таргетами находится в разных местах жесткого диска. так получилось. Это может как то повлиять на возникновение ошибок? Ведь данные сбои возникают только при открытии примеров программ и полезности, в других случаях таргеты открываются нормально.
11775

capzap
07.02.2014, 15:26
Неправильно выразился, плк действительно в таком случае не нужен, проекты которые открываете скорее всего от других контроллеров, Вам стоит установить все,так проще, либо открыть проект текстовым редактором и найти под какой проект заточен

Darkmen999
07.02.2014, 15:30
Под какой проект заточен? Имеется в виду под какой ПЛК? Так вроде установлены все таргеты, под которые я открывал примеры.
А ошибка связанная с файлом описания модуля Module.Root, что может в этом случае означать?

capzap
07.02.2014, 15:34
Да все то же самое,невидит кдс Ваши таргеты, перенос делали ? Создайте пустой проект и когда предложат выбрать плк, посмотрите что есть в списке

Darkmen999
07.02.2014, 16:01
В списке указаны все целевые платформы. И работается на них стабильно. Пока дело не доходит до примеров.
Выполнил перенос. Удалил старые таргеты, установил по новому в папку с кдс. Заработало.
Спасибо вам!

Darkmen999
14.02.2014, 14:38
Добрый вечер всем. Недавно осваиваю CoDeSys, и появился вопрос. При работе с целевой платформой ПЛК73 решил создать простенькую программку с использованием дискретных входов и выходов. С входами вопросов нет. А вот выходы в конфигурации ПЛК имеют тип REAL, а не BOOL. Если к примеру мне нужно просто логическую единицу с входа передать на выход, то нужно использовать оператор преобразования BOOL TO REAL?
И как сказано в руководстве по программированию значение канала преобразуется в ШИМ-сигнал (непонятная для меня вещь), но зачем? Ведь ШИМ используется насколько я знаю в аналоговом управлении дискретными выходами(например управление Т.Э.Ном), а мне просто релюшку допустим включить нужно.
Извиняюсь за длинный текст, просто хотел выразиться как можно яснее.
Заранее спасибо.

Василий Кашуба
14.02.2014, 15:23
Добрый вечер всем. Недавно осваиваю CoDeSys, и появился вопрос. При работе с целевой платформой ПЛК73 решил создать простенькую программку с использованием дискретных входов и выходов. С входами вопросов нет. А вот выходы в конфигурации ПЛК имеют тип REAL, а не BOOL. Если к примеру мне нужно просто логическую единицу с входа передать на выход, то нужно использовать оператор преобразования BOOL TO REAL?
И как сказано в руководстве по программированию значение канала преобразуется в ШИМ-сигнал (непонятная для меня вещь), но зачем? Ведь ШИМ используется насколько я знаю в аналоговом управлении дискретными выходами(например управление Т.Э.Ном), а мне просто релюшку допустим включить нужно.
Извиняюсь за длинный текст, просто хотел выразиться как можно яснее.
Заранее спасибо.
Если выхода дискретные, сделайте присваивание по условию значение 1000(реал). Либо преобразовать через BOOL TO REAL и умножить на 1000.

Darkmen999
14.02.2014, 15:32
Василий Кашуба
Вот теперь вопрос от полного новичка. Как сделать присваивание по условию? Например в языках FBD и CFC? И зачем нужно умножать на 1000?
Извиняюсь за наглый вопрос, не разобрался еще.

Василий Кашуба
14.02.2014, 15:54
... Как сделать присваивание по условию? Например в языках FBD и CFC? И зачем нужно умножать на 1000?
...
1. http://www.owen.ru/forum/showthread.php?t=16616
2.Читайте мануал

Darkmen999
14.02.2014, 16:09
Василий Кашуба
Вот на мануал я вообще внимания не обратил.
Спасибо.

petera
14.02.2014, 16:16
Если выхода дискретные, сделайте присваивание по условию значение 1000(реал). Либо преобразовать через BOOL TO REAL и умножить на 1000.
Ни чего не надо умножать на 1000, просто использовать преобразование BOOL_TO_REAL и все, т.к. диапазон изменения значения для выхода дискретного типа от 0,0 до 1,0.

И как сказано в руководстве по программированию значение канала преобразуется в ШИМ-сигнал (непонятная для меня вещь), но зачем? Ведь ШИМ используется насколько я знаю в аналоговом управлении дискретными выходами(например управление Т.Э.Ном), а мне просто релюшку допустим включить нужно.
Извиняюсь за длинный текст, просто хотел выразиться как можно яснее.
Заранее спасибо.
Дискретный выход ПЛК73 имеет аппаратный ШИМ и выходные импульсы будут иметь скважность 0-100% пропорциональную значению для выхода от 0,0 - 1,0. Период повторения импульсов задается в настройках выхода.
Таким образом
-выходной сигнал 0,0 соответствует скважности 0% -дискретный выход выключен постоянно,
-выходной сигнал 1,0 соответствует скважности 100% -дискретный выход включен постоянно

Darkmen999
14.02.2014, 16:37
petera
Спасибо, разъяснили с этой тысячей. Я смотрю в цифры 0,0 и 0,1, и не могу понять, зачем множить? Но мануал все равно изучить придется.
С ШИМом тоже стало понятней. Я как понял ШИМ внедрен в ПЛК73 для точности управления дискретным выходом?
Такс, зреет еще один вопрос, сформулирую и задам.

Василий Кашуба
14.02.2014, 16:41
Ни чего не надо умножать на 1000, просто использовать преобразование BOOL_TO_REAL и все, т.к. диапазон изменения значения для выхода дискретного типа от 0,0 до 1,0...
Спутал с регистрами управления МВУ8Р.

petera
14.02.2014, 16:45
petera
С ШИМом тоже стало понятней. Я как понял ШИМ внедрен в ПЛК73 для точности управления дискретным выходом?
Такс, зреет еще один вопрос, сформулирую и задам.
Не для точности управления дискретным выходом, а для
...Ведь ШИМ используется насколько я знаю в аналоговом управлении дискретными выходами(например управление Т.Э.Ном)...
Вообщем Вы сами и ответили на свой вопрос зачем нужен ШИМ. А так как он выполнен аппаратно, то это может упростить программу.

Newcomer
02.03.2014, 11:27
Дискретный выход ПЛК73 имеет аппаратный ШИМ и выходные импульсы будут иметь скважность 0-100% пропорциональную значению для выхода от 0,0 - 1,0. Период повторения импульсов задается в настройках выхода.
Таким образом
-выходной сигнал 0,0 соответствует скважности 0% -дискретный выход выключен постоянно,
-выходной сигнал 1,0 соответствует скважности 100% -дискретный выход включен постоянно

Если не требуется аппаратный ШИМ, т.е. задается 0.0 или 1.0, то что должно быть задано в настройках шаблона PLC Configuration ?

ASo
02.03.2014, 11:44
Что угодно. Как и в случае с аналоговым выходом.

Newcomer
02.03.2014, 12:14
Что угодно. Как и в случае с аналоговым выходом.
Значит туда вообще можно не заглядывать ?

kgsh82
02.03.2014, 19:04
Значит туда вообще можно не заглядывать ?
Заглянуть надо. Посмотреть параметр "Безопасное состояние". Вдруг пригодится.

Newcomer
03.03.2014, 12:43
Заглянуть надо. Посмотреть параметр "Безопасное состояние". Вдруг пригодится.
По умолчанию все грамотно стоит.

ajonta
11.06.2014, 09:10
Добрый день! Подскажите, пожалуйста, как в Codesys можно проверить переменная увеличивается или уменьшается?

Вольд
11.06.2014, 09:46
Добрый день! Подскажите, пожалуйста, как в Codesys можно проверить переменная увеличивается или уменьшается?
Посмотреть на эту переменную в любом окне, где она присутствует и сделать вывод.

amn
11.06.2014, 10:08
делаете генератор импульсов, например через каждые 5 секунд. Когда пришел импульс смотрим, если текущая температура больше предыдущей, то значит температура повышается, если меньше, то понижается. Далее сохраняем текущую температуру, через 5 секунд она нам понадобится как предыдущая для дальнейшего анализа.

petera
11.06.2014, 11:19
Во как все запутано:)

Вспоминаем мат.анализ. В частности поиск интервалов возрастания, убывания и точек экстремума функций с помощью производных.
Как гласит мат.анализ
– если первая производная на интервале больше 0, то функция возрастает на данном интервале;
– если первая производная на интервале меньше 0, то функция убывает на данном интервале.
Нахождение точек максимума и минимума опустим.
Таким образом для решения задачи можно использовать ФБ DERIVATIVE (численное дифференцирование) из стандартной библиотеки Util.
На вход подаем анализируемую переменную. Если на выходе имеем значение >0, то переменная возрастает, если <0, то переменная уменьшается, если =0, то переменная не изменяется во времени.
Удачи:rolleyes:

Yegor
24.07.2014, 14:44
Попался экземпляр стандарта IEC61131-3 за 2003 год. Офигеть: оказывается, после END_IF, END_CASE, END_FOR и т.п. должна ставиться точка с запятой.
IF a THEN
b();
END_IF;

Вольд
25.07.2014, 08:54
Во все алгоритмических языках операторы заканчиваются ;

Василий Кашуба
03.09.2014, 18:05
14236142371423814239
Кино делать не умею, поэтому выкладываю картинки в порядке очерёдности. Вопрос, почему два одинаковых триггера работают по разному? Почему триггер DD3 не сбрасывается в исходное состояние?

приборист
03.09.2014, 18:18
14236142371423814239
Кино делать не умею, поэтому выкладываю картинки в порядке очерёдности. Вопрос, почему два одинаковых триггера работают по разному? Почему триггер DD3 не сбрасывается в исходное состояние?

Видимо потому, что таймер DD4 скидывается.
И соответственно выход DD4 становится false и соответственно DD3 опять срабатывает.

Василий Кашуба
03.09.2014, 21:20
Видимо потому, что таймер DD4 скидывается.
И соответственно выход DD4 становится false и соответственно DD3 опять срабатывает.
Выяснил, таймер просто не успевает заблокировать ФБ "И". В цепь сброса добавил формирователь импульса и всё заработало как надо.

Yegor
19.09.2014, 10:55
IEC 61131-3:
Multiple leading or multiple embedded underlines are not allowed; for example, the character sequences __LIM_SW5 and LIM__SW5 are not valid identifiers. Trailing underlines are not allowed; for example, the character sequence LIM_SW5_is not a valid identifier.Кодесису пофиг.

Yegor
08.12.2014, 13:57
i: INT;
i.FALSE := i.TRUE;

Ржака.

Yegor
15.12.2014, 12:35
arr: ARRAY[1..-1] OF INT;
Error 3801: The variable 'arr' is too large (-2 bytes).
Ржака.

arr2: ARRAY [0..-1] OF INT;
0 Error(s), 0 Warning(s)
Уохахаха

Yegor
24.12.2014, 08:12
array_initialization ::= '[' array_initial_elements {',' array_initial_elements} ']'
arr: ARRAY [0..2] OF INT := 1, 2, 3;0 Error(s), 0 Warning(s)
arr: ARRAY [0..2] OF INT := [1, 2, 3];Error 3760L PLC_PRG (4): Erroneous initial value

codesys, please

Yegor
25.12.2014, 06:42
VAR CONSTANT RETAIN0 Error(s), 0 Warning(s)

http://i.imgur.com/JqaeAQa.png

Yegor
26.12.2014, 09:53
А функциональные блоки являются типом данных или нет? Не вижу нигде ссылки на это в стандарте, но почему-то кодесис проглатывает это:
TYPE subtype : TON := (PT := T#3s); END_TYPE

amn
26.12.2014, 13:43
Мы же можем объявить переменную типа TON. А это и есть функциональный блок.

Yegor
26.12.2014, 22:33
У меня вопрос больше теоретический. С одной стороны, в стандарте в определении типа никак не упоминаются функциональные блоки. С другой, инстанциируются они как переменные структурного типа (опять же по стандарту). Если кто-то ещё стандарт точит — особенно третью его версию, которую я не могу себе позволить — то поделитесь своим мнением.

Конечно, я тут сам прибегаю к эмпирическому методу — смотрю, как ведёт себя кодесис. Но с учётом вот этих глупых расхождений, которые я показал в предыдущих сообщениях, доверия к нему у меня нет.

Кто с другими средами работает? Напишите, можно ли там тип от функционального блока объявлять как в сообщении 337. Спасибо.

Yegor
13.01.2015, 16:35
А вот это уже не смешно (d1: DATE):

16141

capzap
13.01.2015, 17:33
А вот это уже не смешно (d1: DATE):

16141

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

ЗЫ
d1:=DATE#2015-01-13 - T#1h;
d2:=DATE_TO_DWORD(DATE#2015-01-13);
d3:=TIME_TO_DWORD(T#1h);
d4:=DWORD_TO_DATE(d2-d3);

Yegor
13.01.2015, 19:29
а попробуйтеЭто уже будет обход бага. Мы проверяем неявное, а не явное приведение типов.
почему же он должен корректно производить арифметические действия с несовместимыми типами?Он должен вываливаться с ошибкой типизации примерно вот так:

16143

Зависимость результата от порядка слагаемых в таком случае говорит о приведении по левому операнду. Значит, должно происходить неявное приведение правого операнда к совместимому налево типу, но этого явно не происходит. Это примерно как reinterpret_cast когда должно быть static_cast (C++). Представьте, что пытаясь сложить REAL#3.42 и DINT#5 в DINT вы получаете DINT#12000334 вместо ошибки (если сильная типизация) или DINT#8 с предупреждением о потере точности (если слабая типизация). Но именно такая хрень типа DINT#12000334 получается с комбинацией "DATE слева TIME справа". И по всем признакам (вроде необходимости делать REAL_TO_DINT) языки IEC61131 должны быть сильно типизированными.

Даже ещё проще. Если возможно неявное приведение TIME к DATE в качестве одного из арифметических операндов, то должно быть возможно и приведение в качестве правого операнда присваивания, но ведь его нет:

16145

Тупо баг компилятора, причём в третьей версии то же самое.

capzap
14.01.2015, 08:23
Если возможно неявное приведение TIME к DATE в качестве одного из арифметических операндов

нет там никакого приведения, арифмитическая операция в процессоре идет не типами данных,а 32-разрядными словами, код я привел как получается ложная дата

Yegor
14.01.2015, 09:08
нет там никакого приведения
Implicit type conversion, also known as coercion, is an automatic type conversion by the compiler. (http://en.wikipedia.org/wiki/Type_conversion#Implicit_type_conversion)Не будь приведения, была бы ошибка (см. скриншот 1 в посте №342).
арифмитическая операция в процессоре идет не типами данных,а 32-разрядными словамиТипы у процессора свои (32-разрядное целое — один из них).
код я привел как получается ложная датаНе важно как и не важно ложная ли. Попытка сложить DATE и TIME с целью получить DATE должна считаться ошибкой в любом случае примерно как попытка сложить DINT и REAL в DINT (оба этих типа тоже можно интерпретировать как 32-разрядные целочисленные — см. на скриншоте как я заставляю это делать компилятор C++). У кодесиса факап ещё на этапе семантического анализа в части типобезопасности, а не на этапе кодогенерации или исполнения.

Yegor
14.01.2015, 09:37
Картина маслом: симулятор смотрит на компилятор с недоумением и молчит

16154

capzap
14.01.2015, 09:39
Не будь приведения, была бы ошибка (см. скриншот 1 в посте №342).... ...я заставляю это делать компилятор C++).

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

Марат Перухин
11.03.2015, 19:48
Подскажите как в CoDeSys привязать визуализацию процесса к программе? Например, должно происходить наполнение бака жидкостью до определенного момента, после чего начинается опорожнение.

Николаев Андрей
12.03.2015, 11:36
Алгоритм описывается в программе. И только в программе.
А визуализация привязывается просто к значениям переменной. В визуализации добавляете бар, и указываете в нем переменную, отвечающую за уровень бака. И БАР будет просто отображать значение этой переменной.

adamst
08.06.2015, 11:44
Подскажите как в CoDeSys привязать визуализацию процесса к программе? Например, должно происходить наполнение бака жидкостью до определенного момента, после чего начинается опорожнение.
на ютубе видел примеры работы с барами по визуализации вот у этого человека в частности http://www.youtube.com/user/nhfdybr/videos

adamst
08.06.2015, 11:46
подскажите пожалуйста нормальные методы загонять bit в word и нооборот
вот тут я выложил пример http://www.owen.ru/forum/showthread.php?t=10555&p=172551&viewfull=1#post172551 не уверен что действую правильно

Providec_1
18.08.2015, 15:23
Как избавиться от зюзь в комментариях , т.е. русифицировать ее под Win7?

Pvalp
02.09.2015, 22:19
Как избавиться от зюзь в комментариях , т.е. русифицировать ее под Win7?
Проект -> Опции -> Редактор -> Шрифт -> выбрать "Arial" -> в Анимация с "Западноевропейский" переключить на "Кириллица" -> нажать "ОК"
19766
19767
19768

Yegor
14.09.2015, 14:53
WTF?

19942

joogorden
16.09.2015, 13:50
Добрый день!
Установщик библиотек (http://www.owen.ru/uploads/txtlic.php?url=http:/kipshop.ru/CoDeSys/bibl/Lib_setup.exe)
с вирусом "Trojan.Filecoder.W"

Yegor
24.11.2015, 10:42
Симулятор игнорирует NaNы!!! Стыд, позор, ппц.



PROGRAM PLC_PRG
VAR
bin: UDINT := 2#0111_1111_1000_0000_0000_0000_0000_0001;
nan: POINTER TO REAL;
equ: BOOL;
END_VAR


nan := ADR(bin);
equ := nan^ = nan^;ПЛК160:

21021


Симулятор:


21022

Бонус:

21023


А ещё нет способа задать NaN напрямую и 0.0 / 0.0 не компилируется.

UPD! Ой мама дорогая... Держите меня семеро:

21024 21025

Похоже, моим мечтам о NaN'ах в Кодесисе не суждено сбыться. По крайней мере тестировать код не получится.

rapucha
02.12.2015, 04:43
А вот это уже не смешно (d1: DATE):

16141

Ыыы. Зато в докуменитации описаны функции приведения к дате булевских типов:

"BOOL_TO Conversions
Conversion from type BOOL to any other type:
.......

t:=BOOL_TO_TIME(TRUE);
(* Result is T#1ms *)

tof:=BOOL_TO_TOD(TRUE);
(* Result is TOD#00:00:00.001 *)

dat:=BOOL_TO_DATE(FALSE);
(* Result is D#1970 *)

dandt:=BOOL_TO_DT(TRUE);
(* Result is DT#1970-01-01-00:00:01 *)"

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

PROGRAM PLC_PRG
VAR
ind_temp: INT;
ton1,ton2: TON;
df: DECODE_FLOAT;
ust_temp: REAL;
temp_pod_i: INT;
first_start: BOOL := TRUE;
(*old_mode: INT;
old_pod_ust: INT;
old_ust_temp_z: INT;*)
temp_pod, ust_temp_f: REAL;
temp_nv: REAL;
delta: REAL;
ind_temp1: REAL;
END_VAR
VAR RETAIN
temp: ARRAY [0..78] OF REAL;
(*mode_r: INT;
pod_ust_r: INT;
ust_temp_r: INT;*)
NaprReg_r:REAL;
END_VAR

…………………………………………………………………………………………………………………………………… …………………………….


NaprReg := NaprReg_r;


IF first_start THEN
(* +8 +7.5 +7 +6.5 +6 *)
temp[0] := 35; temp[1] := 36; temp[2] := 36; temp[3] := 36; temp[4] := 36;
(* +5.5 +5 +4.5 +4 +3.5 *)
temp[5] := 36; temp[6] := 36; temp[7] := 36; temp[8] := 36; temp[9] := 36.5;
(* +3 +2.5 +2 +1.5 +1 *)
temp[10] := 37; temp[11] := 37.5; temp[12] := 38; temp[13] := 38.5; temp[14] := 39;
(* +0.5 0 -0.5 -1 -1.5 *)
temp[15] := 39.5; temp[16] := 40; temp[17] := 40.5; temp[18] := 41; temp[19] := 41.5;
(* -2 -2.5 -3 -3.5 -4 *)
temp[20] := 42; temp[21] := 42.5; temp[22] := 43; temp[23] := 43.5; temp[24] := 44;
(* -4.5 -5 -5.5 -6 -6.5 *)
temp[25] := 44.5; temp[26] := 45; temp[27] := 45.5; temp[28] := 46; temp[29] := 46.5;
(* -7 -7.5 -8 -8.5 -9 *)
temp[30] := 47; temp[31] := 47.5; temp[32] := 48; temp[33] := 48.5; temp[34] := 49;
(* -9.5 -10 -10.5 -11 -11.5 *)
temp[35] := 49; temp[36] := 49; temp[37] := 49.5; temp[38] := 50; temp[39] := 50;
(* -12 -12.5 -13 -13.5 -14 *)
temp[40] := 50; temp[41] := 50.5; temp[42] := 51; temp[43] := 51; temp[44] := 51;
(* -14.5 -15 -15.5 -16 -16.5 *)
temp[45] := 51.5; temp[46] := 52; temp[47] := 52.5; temp[48] := 53; temp[49] := 53.5;
(* -17 -17.5 -18 -18.5 -19 *)
temp[50] := 54; temp[51] := 54.5; temp[52] := 55; temp[53] := 55.5; temp[54] := 56;
(* -19.5 -20 -20.5 -21 -21.5 *)
temp[55] := 56.5; temp[56] := 57; temp[57] := 57.5; temp[58] := 58; temp[59] := 58.5;
(* -22 -22.5 -23 -23.5 -24 *)
temp[60] := 59; temp[61] := 59.5; temp[62] := 60; temp[63] := 60.5; temp[64] := 61;
(* -24.5 -25 -25.5 -26 -26.5 *)
temp[65] := 61.5; temp[66] := 62; temp[67] := 62.5; temp[68] := 63; temp[69] := 63.5;
(* -27 -27.5 -28 -28.5 -29 *)
temp[70] := 64; temp[71] := 64.5; temp[72] := 65; temp[73] := 65.5; temp[74] := 66;
(* -29.5 -30 -30.5 -31 *)
temp[75] := 66.5; temp[76] := 67; temp[77] := 67.5; temp[78] := 68;




IF NaprReg=0.0 THEN
NaprReg := 0.5;
END_IF;
first_start := FALSE;
END_IF;



df( VALUE:=temp_pod_d, DEF_VALUE:= temp_pod);
CASE df._ERR OF
12: temp_pod_s := 2000; (* кз *)
13: temp_pod_s := 2001; (*обрыв *)
6,7,8,9,10,11,14,15: temp_pod_s := 2002; (*ошибка контроллера *)
ELSE
temp_pod_s := REAL_TO_INT(df.OUT_VALUE*10);
temp_pod := temp_pod_d;
END_CASE;

df( VALUE:=temp_nv_d, DEF_VALUE:=temp_nv);
CASE df._ERR OF
12: temp_nv_s := 2000; (* кз *)
13: temp_nv_s := 2001; (*обрыв *)
6,7,8,9,10,11,14,15: temp_nv_s := 2002; (*ошибка контроллера *)
ELSE
temp_nv_s := REAL_TO_INT((df.OUT_VALUE+50.0)*10);
temp_nv := temp_nv_d;
END_CASE;

ind_temp1 := temp_nv;
ind_temp := 16 - REAL_TO_INT(ind_temp1*2);
IF ind_temp < 0 THEN
ind_temp := 0;
ELSIF ind_temp > 78 THEN
ind_temp := 78;
END_IF;

IF mode = 1 THEN
ust_temp := temp[ind_temp]+pod_ust;
ELSE
ust_temp := ust_temp_z;
END_IF;


temp_pod_i := REAL_TO_INT(temp_pod);
ust_temp_f := (ust_temp);
ton1.PT := t#10m; ton2.PT := t#10s;
ton1(in :=TRUE); ton2(in :=TRUE);
IF ton1.ET >t#30s THEN
IF (temp_pod_i >ust_temp) AND (temp_pod_s <2000) AND ((temp_nv_s<2000) OR (mode=0)) THEN
delta :=(temp_pod - ust_temp_f)/500;
NaprReg := NaprReg +delta;
IF NaprReg > 0.90 THEN NaprReg := 0.90; END_IF;
END_IF;
IF (temp_pod_i delta :=(ust_temp_f - temp_pod)/500 ;
NaprReg := NaprReg -delta;
IF NaprReg < 0.0 THEN NaprReg := 0.0; END_IF;
END_IF;
ton1(in :=FALSE);
END_IF;

NaprReg_r := NaprReg;
napr_s :=REAL_TO_INT( NaprReg *1000);

IF ton2.ET >t#400ms THEN
ton2(in :=FALSE);
ClearScreen(0);
SetWorkScreen(0);

ShowString(0,0,0,'Тнв=');
CASE temp_nv_s OF
2000: ShowString(0,4,0,'КЗ ');
2001: ShowString(0,4,0,'Обр ');
2002: ShowString(0,4,0,'Ош. ');
ELSE
ShowReal(0, 4, 0, '%3.1f',temp_nv);
END_CASE;
ShowString(0,9,0,'Тп=');
CASE temp_pod_s OF
2000: ShowString(0,12,0,'КЗ ');
2001: ShowString(0,12,0,'Обр ');
2002: ShowString(0,13,0,'Ош. ');
ELSE
ShowReal(0, 12, 0, '%3.1f',temp_pod);
END_CASE;
ShowString(0,0,1,'Uуп='); ShowReal(0, 4, 1, '%4.2f',NaprReg*10);
END_IF;

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

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

andron7
21.03.2016, 10:13
Добрый день.
CodeSys Version 2.3.9.41 + ПЛК63-М (target_v 2.01), в режиме эмулятора, автоматически не инициализируются конфигурационные значения по умолчанию в SubMenu конфигурации.
Это глюк или нет?

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

Перейдите от работы с градусами к работе с десятыми градусов.

Кстати, точность задания уставки и точность поддержания уставки - это две большие разницы.

kvr15
27.04.2016, 09:27
Подскажите где взять описание протокола Modbus который используется в Codesys v2.3?

Scream
27.04.2016, 09:31
Подскажите где взять описание протокола Modbus который используется в Codesys v2.3?

;) который в codesys?
есть modbus rtu, есть modbus ascii, есть modbus tcp
выбирай и забивай в гугл.

kvr15
27.04.2016, 10:05
;) который в codesys?
есть modbus rtu, есть modbus ascii, есть modbus tcp
выбирай и забивай в гугл.

это я понимаю, просто пришёл блок питания,в описании сказано - Modbus RTU,а через Codesys считать/записать ничего не получается.
Отсюда вопрос - значит это не Modbus в блоке питания?

petera
27.04.2016, 11:38
Подскажите где взять описание протокола Modbus который используется в Codesys v2.3?
Здесь http://www.modbus.org/specs.php
например, http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf
или более ранняя версия стандарта http://www.modbus.org/docs/Modbus_over_serial_line_V1_02.pdf

https://docs.google.com/document/pub?id=1Khfd7rZEQasSyWY2tefnex0yVzmk09r54OvaJi00J-0