PDA

Просмотр полной версии : ПЛК73-светодиоды



Ozzz
04.05.2012, 11:44
Здрасте всем.
Впервые столкнулся с программированием ПЛК, задачка такова:
в проекте пять ВУ: к1, к2, к3, к4(Р) и ttr (К) при их срабатывании необходимо засвечивать соответствующий светодиод. Как это реализовать? ПЛК73-ККККРРРР-М

Ozzz
04.05.2012, 12:52
Делаю так:

Рабиндранат
04.05.2012, 12:52
А Вы на каком языке в CoDeSys пишете проект?

Ozzz
04.05.2012, 12:53
Сам проект на CFC

Ozzz
04.05.2012, 12:56
IF k1=1000 THEN svet:=s1;
ELSE svet:=0;
END_IF;

IF k2=1000 THEN svet:=S2;
ELSE svet:=0;
END_IF;

IF k3=1000 THEN svet:=s3;
ELSE svet:=0;
END_IF;

Запускаю ПЛК и срабатывает только третий светодиод

Рабиндранат
04.05.2012, 13:00
А какие значения у Вас стоят под s1,s2,s3?

Александр Ч.
04.05.2012, 13:22
Должны быть значения 1,2,4,8,16,32 по порядку и 0 конечно

Ozzz
04.05.2012, 13:28
PROGRAM swetodiod
VAR
END_VAR
VAR CONSTANT
s1:BYTE := 1;
s2:BYTE :=2;
s3:BYTE := 4;
s4:BYTE :=8;
s5:BYTE := 16;
END_VAR

Рабиндранат
04.05.2012, 14:10
Хм-м, если так посмотреть на программку Вашу, то получается что она сверху вниз проверяет все условия. И, в итоге, останавливается на последнем.
Т.е. k1=1000? да, значит 1 засвечивается (параметру Svet присваивается значение 1)
идем дальше k2=1000? да, засвечиваем второй (причем, первый гаснет, т.к. параметру Svet присваивается значение 2)
дальше k3=1000? да, засвечиваем третий (второй гаснет, т.к. параметру Svet присваивается значение 4).

Ozzz
04.05.2012, 14:21
алгоритм такой:
к1=1000 на 5сек (должен гореть первый 5 сек),
через 2 сек к2=1000 на 5 сек (должен гореть второй 5 сек),
через 2 сек к3=1000 на 5 сек (должен гореть третий 5 сек),
через 2 сек снова к1=1000 на 5 сек (должен гореть первый 5 сек),
через 2 сек снова к2=1000 на 5 сек (должен гореть второй 5 сек),
Из всего засвечивается только третий в момент к3=1000

Рабиндранат
04.05.2012, 14:29
Ну, правильно, программа же проверяет сверху вниз.
Когда Вы зажигаете первый идет код:

IF k1=1000 THEN svet:=s1;
ELSE svet:=0;
END_IF

и диод должен загореться, но программа читает дальше:

IF k2=1000 THEN svet:=S2;
ELSE svet:=0;
END_IF;

тут условие не выполняется и диод гаснет.

Надо саму программу переделать.

Рабиндранат
04.05.2012, 15:04
Попробуйте такую структурку:

IF k1=1000 THEN svet.0:=1;
ELSE svet.0:=0;
END_IF;
IF k2=1000 THEN svet.1:=1;
ELSE svet.1:=0;
END_IF;
IF k3=1000 THEN svet.2:=1;
ELSE svet.2:=0;
END_IF;

VitVir
04.05.2012, 15:09
svet.0:=(k1=1000);
А вообще на равенство REAL проверять - неблагодарное дело.
Выход ПЛК73, по-моему от 0 до 1.

Ozzz
04.05.2012, 15:17
это уже лучше, но....
первый не реагирует,
второй включается, но не гаснет
третий также включается, но не гаснет

YuriBel
04.05.2012, 15:46
Это часом не потому что во всех трех Еlse гасится svet.0?

Рабиндранат
04.05.2012, 16:00
А вообще, зачем Вам эта тысяча?
Может, проще обозначить выход, да использовать выше предложенную конструкцию:
svet.0:=(k1=1000);
только вместо k1=1000 поставить х=TRUE (а х обозначить выход).

Ozzz
10.05.2012, 09:47
Вот так всё работает:
IF k1=1000 THEN svet.0:=1;
ELSE svet.0:=0;
END_IF;
IF k2=1000 THEN svet.1:=1;
ELSE svet.1:=0;
END_IF;
IF k3=1000 THEN svet.2:=1;
ELSE svet.2:=0;
END_IF;
СПАСИБО!!!

Валенок
10.05.2012, 20:54
Ну, молодцы. Только перестаньте гонять 0 и 1 в буль.
Бит - это буль, булю можно присвоить буль, условие - имеет буль-результат => биту можно присвоить условие.

svet.0:=k1=1000;
..

Панарин
15.08.2013, 14:10
Добрый день господа.
Не получается управление выходами 4-20мА на ПЛК73, программа работает но на выходе ПЛК73 либо максимальный 20мА, сигнал либо минимальный 4мА, проверяю состояние выхода на самом контроллере меняется исходя из задачи, нет изменения реального подключал вторичник ТРМ замерял мультиметров.

petera
15.08.2013, 14:58
Добрый день господа.
Не получается управление выходами 4-20мА на ПЛК73, программа работает но на выходе ПЛК73 либо максимальный 20мА, сигнал либо минимальный 4мА, проверяю состояние выхода на самом контроллере меняется исходя из задачи, нет изменения реального подключал вторичник ТРМ замерял мультиметров.
Вот выдержка из РП
9625
Из чего следует, что в Вашей программе диапазон значений для переменных на выходах ПЛК(VIX1 и VIX2) должен быть 0...1(REAL), а Вы пытаетесь с помощью LIN_TRAFO подать на эти выходы значения в диапазоне 4...20

Панарин
15.08.2013, 15:18
Выход? Правильно ли я понимаю, на выходе с программы градуировка от 0 до 1, что будет соответствовать диапазону 4-20.

petera
15.08.2013, 15:49
Правильно!

Панарин
16.08.2013, 11:30
Огромное спасибо, всё работает!

kabayur
04.02.2022, 07:21
почему светодиоды по переменной не включаются? В программе есть переменная формата Byte, в которую упаковываю значения для каждого светодиода. На выходе значение корректное, например, 45. В конфигураторе Additional для Светодиоды присвоил название переменной. При работе программы переменная не доходит до светодиодов, значение=0. Если в конфигураторе присвоить строке Светодиоды ненулевое значение, светодиоды включаются согласно байту. Почему переменная не доходит до светодиодов?

ASo
04.02.2022, 07:39
Например, по причине наличия еще одной переменной с темже именем.

kabayur
04.02.2022, 09:18
Например, по причине наличия еще одной переменной с темже именем.

а глянуть можно? у меня эта переменная встречается всего три раза: объявлена как Byte, присвоена на выходе блока Pack и указана в строке конфигуратора Светодиоды

ASo
04.02.2022, 09:50
Проект выложите. С телепатии в мире напряжёнка.
Но, судя по Вашим словам, Вы объявили ее как локальную в данном ФБ. Соответственно, дальше этого ФБ она и не уходит. Уберите объявление в ФБ.

kabayur
04.02.2022, 10:41
алгоритм в CFC. Переменная ErrorLED

petera
04.02.2022, 10:58
алгоритм в CFC. Переменная ErrorLED

Русским языком сказано было
Уберите эту переменную из области объявления переменных.
59108

AUP_TRV
22.04.2022, 13:11
может Вам интересно будет.. Проект для плк73 тест индикации (написал, пока вспоминал как вообще связь с ПЛК73 происходит - захотелось обновить опыт).
использование функций BLINK (UTIL.LIB), таймеров.