Просмотр полной версии : ПЛК73-светодиоды
Здрасте всем.
Впервые столкнулся с программированием ПЛК, задачка такова:
в проекте пять ВУ: к1, к2, к3, к4(Р) и ttr (К) при их срабатывании необходимо засвечивать соответствующий светодиод. Как это реализовать? ПЛК73-ККККРРРР-М
Рабиндранат
04.05.2012, 12:52
А Вы на каком языке в CoDeSys пишете проект?
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 конечно
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).
алгоритм такой:
к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;
svet.0:=(k1=1000);
А вообще на равенство REAL проверять - неблагодарное дело.
Выход ПЛК73, по-моему от 0 до 1.
это уже лучше, но....
первый не реагирует,
второй включается, но не гаснет
третий также включается, но не гаснет
Это часом не потому что во всех трех Еlse гасится svet.0?
Рабиндранат
04.05.2012, 16:00
А вообще, зачем Вам эта тысяча?
Может, проще обозначить выход, да использовать выше предложенную конструкцию:
svet.0:=(k1=1000);
только вместо k1=1000 поставить х=TRUE (а х обозначить выход).
Вот так всё работает:
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;
СПАСИБО!!!
Ну, молодцы. Только перестаньте гонять 0 и 1 в буль.
Бит - это буль, булю можно присвоить буль, условие - имеет буль-результат => биту можно присвоить условие.
svet.0:=k1=1000;
..
Добрый день господа.
Не получается управление выходами 4-20мА на ПЛК73, программа работает но на выходе ПЛК73 либо максимальный 20мА, сигнал либо минимальный 4мА, проверяю состояние выхода на самом контроллере меняется исходя из задачи, нет изменения реального подключал вторичник ТРМ замерял мультиметров.
Добрый день господа.
Не получается управление выходами 4-20мА на ПЛК73, программа работает но на выходе ПЛК73 либо максимальный 20мА, сигнал либо минимальный 4мА, проверяю состояние выхода на самом контроллере меняется исходя из задачи, нет изменения реального подключал вторичник ТРМ замерял мультиметров.
Вот выдержка из РП
9625
Из чего следует, что в Вашей программе диапазон значений для переменных на выходах ПЛК(VIX1 и VIX2) должен быть 0...1(REAL), а Вы пытаетесь с помощью LIN_TRAFO подать на эти выходы значения в диапазоне 4...20
Выход? Правильно ли я понимаю, на выходе с программы градуировка от 0 до 1, что будет соответствовать диапазону 4-20.
Огромное спасибо, всё работает!
почему светодиоды по переменной не включаются? В программе есть переменная формата Byte, в которую упаковываю значения для каждого светодиода. На выходе значение корректное, например, 45. В конфигураторе Additional для Светодиоды присвоил название переменной. При работе программы переменная не доходит до светодиодов, значение=0. Если в конфигураторе присвоить строке Светодиоды ненулевое значение, светодиоды включаются согласно байту. Почему переменная не доходит до светодиодов?
Например, по причине наличия еще одной переменной с темже именем.
Например, по причине наличия еще одной переменной с темже именем.
а глянуть можно? у меня эта переменная встречается всего три раза: объявлена как Byte, присвоена на выходе блока Pack и указана в строке конфигуратора Светодиоды
Проект выложите. С телепатии в мире напряжёнка.
Но, судя по Вашим словам, Вы объявили ее как локальную в данном ФБ. Соответственно, дальше этого ФБ она и не уходит. Уберите объявление в ФБ.
алгоритм в CFC. Переменная ErrorLED
алгоритм в CFC. Переменная ErrorLED
Русским языком сказано было
Уберите эту переменную из области объявления переменных.
59108
может Вам интересно будет.. Проект для плк73 тест индикации (написал, пока вспоминал как вообще связь с ПЛК73 происходит - захотелось обновить опыт).
использование функций BLINK (UTIL.LIB), таймеров.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot