PDA

Просмотр полной версии : Главный цикл



fzr125
12.06.2014, 10:37
Извиняюсь, если задаю глупый вопрос, однако освещен он слабо.

Как устроен главный цикл в плк?

Ну к примеру тип такого?

while(1)
{
do PLC_PRG();
}

Просто вот в чем возникло сомнение.
Есть примитивная "программа" :


LED = 255; //зажечь все светодиоды


После заливки и старта - выходит так - что светодиоды просто моргнули, но не зажглись.
Значит их значения сбросились в 0 и программа прекратила выполнение?

Вообщем довольно интересно как-там и что)

Scream
12.06.2014, 12:32
Что это за LED переменная? откуда она?
Плк итак за вас крутит цикл.
Устроенно так
1) опрос входов
2) выполнение прораммы
3) запись выходов
И так постоянно.

fzr125
12.06.2014, 12:51
Хех) Ну LED - это просто переменная приатаченная к состоянию светодиодов на лицевой панели плк.

Ну скажем чтоб зажечь самый первый светодиод нужно сделать так
LED.0 =1;

И т.д. - т.е. 8-битная переменная - если зажечь все т.е. LED=b'11111111' или по десятеричной LED=255;

А вот это:
"1) опрос входов
2) выполнение прораммы
3) запись выходов"
странно.

Ибо выходит так :

Бесконечный цикл
{
Опрос входов плк

"Зажечь все светодиоды"

Запись выходов.
}

По логике - они(светодиоды) - должны загореться и все. Но они тухнут.... Значит где-то что-то их сбрасывает.

Полная программа так и выглядит:

PROGRAM PLC_PRG
VAR
END_VAR

LED = 255;

Все. Т.е. они ни где не устанавливаются в 0. По логике - зажгли -и в следующем глобальном цикле плк - зажгли еще раз(т.е. ничего не меняем) и так и далее.

Как же так? Хм.....

Scream
12.06.2014, 13:15
Что за плк?
Светодиоды вы ведь можете зажечь только если будете включать выхода так?

Так на ST

IF pusk THEN (*PUSK - bool*)
LED:=255;
END_IF

Если на CFC, то так

13259

fzr125
12.06.2014, 13:33
Ну почему тогда у меня вот такая ситуация.
Если код выглядит так :
13260

То светодиоды вспыхивают и мгновенно тухнут.

А если код поправить так :
13261
Тогда при пуске - они загораются и горят. ну так то да - там же мною реализован бесконечный цикл.

Но почему не работает бесконечный цикл в первом случае?

Контролер - ПЛК73М

Признаюсь сразу - я с плк работаю впервые в жизни. Работаю уже целых 2 часа. Но в целом я хорошо знаю С++, так что вот не могу понять почему тот "автоматический бесконечный главный цикл - на деле не бесконечный"

Scream
12.06.2014, 13:57
Здесь цикл в цикле это не хорошо.
Очень надо аккуратно, потому что сидит ватч дог.
Всетаки где описана LED, в конфинураторе?
Почему бы вам не включить каждый выход отдельно и посмотреть?
О While забудьте пока что.

fzr125
12.06.2014, 14:00
Угу. LED - задана в конфигурации PLC. Раздел Additional[FIX] - а именно там где пишет "Светодиоды".

13264

Насчет каждого входа.
Я даже так писал :

LED.0 = 1;
LED.1 = 0;
LED.2 = 1;
LED.3 = 0;
LED.4 = 1;

Нифига - вспыхивают и мгновенно гаснут(

Мне необходимо это понять для того чтобы двигаться далее.

Валенок
12.06.2014, 14:03
1....

2. Ваше

temp := true
if temp then
led := 255
end_if

тавтология для человека программирующего вообще. Достаточно

led := 255;

Если ж хочется ровно 1 раз и все, то

if temp then
led := 255
end_if
temp := false;

Да и то, при условии
var
temp : bool := true;

2.

temp := true;
while temp do
led := 255;
end_while

Не надо ля-ля про то, что это работает как надо. Разве што только "надо" - это перезагрузка и обрыв связи.



так что вот не могу понять почему тот "автоматический бесконечный главный цикл - на деле не бесконечный"
См. внимательно

Что это за LED переменная? откуда она?
Плк итак за вас крутит цикл.
Устроенно так
1) опрос входов
2) выполнение прораммы
3) запись выходов
И так постоянно.


PS
Пока отвечал - некоторые вещи прояснились.
онлайн/старт - делаем после загрузки ?

fzr125
12.06.2014, 14:09
1. фулл код приведен в посте #5.
Какой еще вам код нужен?
Как привязан - показано в посте #7
Я сам не люблю Ванг)

2. Что ж. LED = 255; - я опробовал в самом начале - прежде чем писать всякую хрень с while)
>Если ж хочется ровно 1 раз и все, то
Хочется написать LED=255; - и чтобы светодиоды горели. А не моргнув тухли.

С while - я и так знаю что такое приведет к зимней лисичке) Это было сделано для разового теста - не более.

fzr125
12.06.2014, 14:10
>онлайн/старт - делаем после загрузки ?
Естественно)
Хотя..... сек...

Не, я уже сам перепугался. Пускаю. Заливаю так.
1) Компилируем
2) Online->Login
3) Run

Scream
12.06.2014, 14:40
Насчет тафтологии это я написал так, потому что не знаю что у него там дальше выполняется, если они загорелись должны были остаться, так то с вами согласен.
хз про эти светодиоды, никогда не пользовался, цепляйте лампочку на выход и играйтесь с выходом, чтобы понять.

Валенок
12.06.2014, 15:09
Да нормально диоды работают. А моргают вроде при перезагрузке.
Упростим до нельзя. Весь код :
;

онлайн/подкл
онлайн/сброс заводской
онлайн/откл
проект/очистить все
онлайн/подкл

Тыркаем по led. Пишем 63. Что с диодами ?

fzr125
12.06.2014, 15:55
Упростил до точки с запятой.

Сделал - онлайн - подкл - сбос заводской (контроллер не имеет программы)
онлайн - откл,
проект - очистить все, онлайн - подключить

Прописал новое значение в led 63 - enter - и ............ блинк и фсёёёёё....

Yegor
12.06.2014, 16:14
Проект в студию!

Валенок
12.06.2014, 16:26
.. (С) Yegor
И что значит фсёёё ? Связь есть ? Щелкните из конфигурации выходом (если есть Р)

fzr125
12.06.2014, 17:30
Да сам проект воть:
https://yadi.sk/d/RPRGiBeRTBwVn

Дело в том что в debug окне - я вижу что переменная LED - устанавливается в 63 - и не меняется.
Однако светодиоды не хотят гореть))))

Сами светодиоды рабочие - т.е. от нажатий кнопок на лицевой панели - они загораются.
Может я создал переменную LED - которая только "для чтения" состояний? Ну т.е. не так задавать нид?

Валенок
12.06.2014, 18:44
выходы руками из конфигурации - щелкают ?
ps
А вы уверены что вообще соединяетесь нормально (gateway с com через tcp) ?

fzr125
12.06.2014, 18:46
Сейчас потестю

fzr125
12.06.2014, 18:54
Хех, выходы реле робят норм. Т.е. устанавливаю в 1 - слышу щелчек. Устанавливаю в 0 - слышно еще один. Т.е. отлип контакт. Значит что-то не то с светодиодами. Просто я умолчал об одной детали. Но не думаю что дело в ней. Суть в том - что изначально я не мог подключить плк к pc - пока не перепрошил его. Вернее прошивал не я - а мой отец. Но суть в том - что после прошивки он стал конектится.
Даже если подрубить либу Work_ololo.lib - и вывести на ЖКИ "Привет" - работает. Единственное что не хочет - это злые светодиоды =(
Видимо придется без них обойтись.

Валенок
12.06.2014, 19:40
выходы реле робят норм. Т.е. устанавливаю в 1 - слышу щелчек.

Надеюсь - из CDS
Могу сказать что тут - как у врача, лучше ничего не умалчивать. Например могли бы быть вопросы о соответствии версии прошивки и таргетов и т.п.
А так - в сервис.

приборист
14.06.2014, 13:38
А только ли лампочки так работают?

Попробуй выходу присвоить переменную.
И в программе включить его.

Код правильный, лампочки должны гореть.

fzr125
16.06.2014, 02:01
Да, к сожалению только светодиоды не работают от программы - зато весело загораются от нажатий клавиш. Ну да и фиг с ними) Я уже запилил девайс и слил заказчику. Вроде доволен.

Сам я программист - но пишу больше игры - вернее "отдельные части игр".
По сути понадобился смеситель - открывающий с разными импульсами два клапана.
Ну вроде - первый открыт 100мс, закрыт 1400мс, второй открыт 140мс, закрыт 3000мс.
Ну и чтобы все настраивалось в менюшках - с тарировкой и расчетам для каждого клапана в литрах в минуту.

В итоге :
- На подключение ПЛК к PC - ушло 2 дня (пока не прошил не было вообще связи)
- На составление алгоритма - 15 минут
- На написание программы - 60 минут (до этого в глаза не видел ST)

Сам язык мне не очень понравился((( Не знаю - возможно с непривычки после C++ и асма
Для достаточно сложного меню - это тонны повтроряющихся конструкций IF блаблабла THEN блаблабла END_IF
Решил не делать меню как советуют в книге - а запилил в монопольном режиме.

По поводу главного цикла то к примеру такого сделать без доп.флагов нельзя:
var count:int=0;

Таймер1 - на 100мс (если клапан закрыт)
Если таймер1 - то открыть клапан

Таймер2 - на 100мс (если клапан открыт)
Если таймер2 - то закрыть клапан

count:=count+1;

IF (count>100) Надпись на экране "Готово"

То надпись на экране готово - будет сразу же после старта, а не после 100 открытий/закрытий клапана. А все из-за реализации главного цикла.
Но это решилось с вводом дополнительных флагов. Так что небольшая проблема. Так что сам процесс "программирования" - заставил поверить - что и главный цикл и язык ST - позволяют пилить довольно сложные проекты в кратчайшие сроки(PS: я не про свою поделку на коленке)

Удивило что нельзя делать так :

IF (бла-бла-бла) THEN (Бла-бла-бла);
Ругается на отсутствие END_IF
Хотя для чего оно неясно. Компилятор не подхватывает видимо(

Ну язык-языком - а в целом ПЛК73 - мне понравился. Простой как тапки, неприхотлив в настройках, "сверх-быстрый" коддинг)). Надеюсь, что проживет долго в работе.

PS: А еще он песни поёт пищалкой)ыы

capzap
16.06.2014, 05:44
Забавно, посчитайте сами если цикл плк одна мс, то через сколько счетчик досчитает до ста? Практически для глаза незаметно, Ваше суммирование надо привязывать к триггеру фронта импульса открытия, тогда и будет подсчитывать работу,покрайней мере сли выдержка кода именно такая