PDA

Просмотр полной версии : Вопросы по поиску правильной архитектуры приложения.



Alex19
28.09.2016, 16:25
День добрый.
Только начинаю свое знакомство с ПЛК, поэтому появляются вопросы, связанные с архитектурой программ.

Что хотелось бы реализовать.
Давайте представим себе станок у которого несколько режимов работы, для простоты, предположим их 2: автоматический и ручной. Автоматический режим - простой конечный автомат, ручной режим - простой вызов отдельных модулей.

Пока все просто, теперь к проблеме:
Станок постоянно опрашивает один из входов контролера и если на нем появляется логический 0, станок должен остановится. При этом не важно в каком режиме работает данный станок, в каком шаге и т.д., он должен выполнить определенные действия в зависимости от шага автомата (отключить какое-то оборудования) и остановиться. А в автоматическом режиме, при появлении на данном входе 1, должен продолжить из места остановки.

Как мне видится решение данной проблемы.
1. Перед каждым шагом в условии if проверяем функцию. Функция проверяет вход, а если требуется остановка выполняет определенные действия (отключает какое-то оборудование) в зависимости от шага автомата.
Все просто, но минус если шагов сотни, то каждый раз прописывать if, ужасно не удобно.

Есть ли какие-то другие варианты реализации и если есть, то какие (интересует не код, а направление в какую сторону копать ).

Среда CoDeSys 2, контролер ПЛК110-24.60.К-М, языки ST или CFC.

И еще пару вопросов.
2. Можно ли загружать/сохранять какие-то переменные из USB?
Это требуется для настройки станка, для конкретного изделия.
3. Какие клавиатуры можно подключить к ПЛК110-24.60.К-М?

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

Alex19
28.09.2016, 19:52
Пример работы с USB - http://www.owen.ru/uploads/primer_raboti_s_usb_plk110-m02.pdf.

С клавиатурой, как я понял есть вариант использования матричной - http://www.owen.ru/forum/showthread.php?t=22233. Второй вариант кнопка вход:), благо выходы можно расширять.

Евгений Кислов
28.09.2016, 20:38
По-моему, проще весь CASE со всеми шагами разместить внутри IF с проверкой условия, а в ELSE - еще один CASE c действиями, которые надо сделать при остановке в зависимости от текущего шага.

Alex19
28.09.2016, 20:53
Спасибо за ответ.

Представим if, мы прошли данный if, потом пошли в case на конкретный пункт, а этот момент на входе образовался 0. Программа не должна будет выполнить содержания case, а выполнить в else действия которые надо сделать при остановке в зависимости от тек. шага. Есть риск выполнения case и остановке на следующем цикле, если я не прав, поправьте меня.

Владимир Ситников
28.09.2016, 20:59
потом пошли в case на конкретный пункт, а этот момент на входе образовался 0

Смотрите: значения входов меняются только _до_ начала работы программы, но никак не во время её работы.
Т.е. программа из if/case пишется из того расчёта, что значения входов НЕ меняются во время её работы.

Вопрос снят?

Евгений Кислов
28.09.2016, 21:01
пошли в case на конкретный пункт, а в этот момент на входе образовался 0.

Между проверкой IF и выполнением шага CASE нет операции чтения входов - так что мы не увидим этот 0 до следующего цикла ПЛК в любом случае, в моем понимании.

Alex19
28.09.2016, 21:11
Смотрите: значения входов меняются только _до_ начала работы программы, но никак не во время её работы.
Т.е. программа из if/case пишется из того расчёта, что значения входов НЕ меняются во время её работы.

Вопрос снят?
Спасибо за ответ.

Становится немного понятно принцип работы.
Нашел причину такого странного поведения ПЛК.

while(1)
{
ReadInputs();
PLC_PRG();
WriteOutputs();
}

Вопрос увы не снят, а изменился:).
Мы не можем получить новое значение, пока цикл не завершиться, но реальное значение может быть другим.
Как быть?

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

Alex19
28.09.2016, 21:14
Между проверкой IF и выполнением шага CASE нет операции чтения входов - так что мы не увидим этот 0 до следующего цикла ПЛК в любом случае, в моем понимании.
Спасибо, Вы правы.

Сейчас буду думать, как обойти эту не справедливость.

Владимир Ситников
28.09.2016, 21:15
Как быть?
Правильный вопрос.

Быть так, чтобы "в самой программе" выполнялось минимум кода.
Грубо, говоря, если зарядить вычисление 10000 цифр в числе pi, то, да, провороним как изменился вход.

Если основная программа только пару проверок сделает и всего делов, то следующий цикл наступит во время, и ПЛК опросит входы/выходы.


И тут нужно разбираться с прерываниями, как происходит передача управления между основной программой и обработчиком прерывания.
99%, что не надо.

Просто не выполняйте лишнего (закрывайте IFами лишнюю логику, или выводите её в отдельные более редкие программы) в программе и будет счастье.

Alex19
28.09.2016, 21:36
Правильный вопрос.
Быть так, чтобы "в самой программе" выполнялось минимум кода.
Грубо, говоря, если зарядить вычисление 10000 цифр в числе pi, то, да, провороним как изменился вход.
Если основная программа только пару проверок сделает и всего делов, то следующий цикл наступит во время, и ПЛК опросит входы/выходы.

Другими словами Вы предлагаете разбить код, таким образом, чтобы выполнение кода было максимально эффективным, логично. Тут может не получиться, у меня еще минимум 4 модуля расширения, панель оператора и клавиатура, надеюсь такое кол-во периферии не подвесят программу.



99%, что не надо.

Просто не выполняйте лишнего (закрывайте IFами лишнюю логику, или выводите её в отдельные более редкие программы) в программе и будет счастье.
Идея была в том, чтобы свалиться в прерывание и перейти в начало программы.
Ради интереса потом гляну возможно ли это.

Сейчас надо переварить выше сказанное и разобраться с доп. защитами.
Спасибо всем за пояснение.

Владимир Ситников
29.09.2016, 00:12
Идея была в том, чтобы свалиться в прерывание и перейти в начало программы.
Ради интереса потом гляну возможно ли это.
Так не работает.
Дело, например, в том, что помимо вашей программы, ПЛК выполняет обработку сети (ethernet, 485 и т.п.).
Если вы собрались занимать вообще всё процессорное время, то кто будет отвечать по сети?

Поэтому, цикл "1мс" существует специально для того, чтобы ПЛК мог выполнять свои задачи.
Например, пользовательская программа "вычислить 10 if'ов" занимает 0.1мс, а всё остальное время 0.9мс прошивка ПЛК использует для своих нужд (сеть экран вот это всё).

В общем "тут принято", без прерываний, и у всех работает (если правильно помню, то обрабатывают более 30 модулей, и цикл не превышает 2мс)

Alex19
29.09.2016, 10:37
Так не работает.
Дело, например, в том, что помимо вашей программы, ПЛК выполняет обработку сети (ethernet, 485 и т.п.).
Если вы собрались занимать вообще всё процессорное время, то кто будет отвечать по сети?

Поэтому, цикл "1мс" существует специально для того, чтобы ПЛК мог выполнять свои задачи.
Например, пользовательская программа "вычислить 10 if'ов" занимает 0.1мс, а всё остальное время 0.9мс прошивка ПЛК использует для своих нужд (сеть экран вот это всё).

Да и сама моя идея, была не правильная, погорячился.

Самый верный подход, как мне кажется, это прерывание, в котом задаем переменную, а дальше, только в ответственных участках кода проверяем ее. Тогда все будет логично и правильно, надо только понять как происходит передача управления. В станке предусмотрено еще 2 уровня защиты, оба механических, на случай ошибок или выхода ПЛК из строя:).

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


В общем "тут принято", без прерываний, и у всех работает (если правильно помню, то обрабатывают более 30 модулей, и цикл не превышает 2мс)
Вы зародили сомнения, в моем решении.

У Вас больше опыта с ПЛК, но мой предыдущий опыт (с обычными микроконтроллерами), говорит, что решить такую задачу в ПЛК без прерываний не возможно:). Попробую разобраться с прерываниями, тогда все станет на свои места.

petera
29.09.2016, 11:28
Да и сама моя идея, была не правильная, погорячился.

Самый верный подход, как мне кажется, это прерывание, в котом задаем переменную, а дальше, только в ответственных участках кода проверяем ее. Тогда все будет логично и правильно, надо только понять как происходит передача управления. В станке предусмотрено еще 2 уровня защиты, оба механических, на случай ошибок или выхода ПЛК из строя:).

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


Вы зародили сомнения, в моем решении.

У Вас больше опыта с ПЛК, но мой предыдущий опыт (с обычными микроконтроллерами), говорит, что решить такую задачу в ПЛК без прерываний не возможно:). Попробую разобраться с прерываниями, тогда все станет на свои места.

Придется расстаться с опытом с обычными микроконтроллерами. Нету в ПЛК прерываний, и работает он с физическими входами и выходами не так, как обычный микроконтроллер.
Рабочий цикл ПЛК.
1. Опрос физических входов
2. Сохранение образа состояния входов
3. Выполнение программы, при этом используются именно образ входов. Если в программе используются выходы ПЛК, то изменение их состояния происходит не на физ. выходах а в их образе.
4. Запись образа выходов на физические выходы ПЛК
5. Выполнение служебных задач.
Далее все повторяется

Станок постоянно опрашивает один из входов контролера и если на нем появляется логический 0, станок должен остановится. При этом не важно в каком режиме работает данный станок, в каком шаге и т.д., он должен выполнить определенные действия в зависимости от шага автомата (отключить какое-то оборудования) и остановиться. А в автоматическом режиме, при появлении на данном входе 1, должен продолжить из места остановки.

Как мне видится решение данной проблемы.
1. Перед каждым шагом в условии if проверяем функцию. Функция проверяет вход, а если требуется остановка выполняет определенные действия (отключает какое-то оборудование) в зависимости от шага автомата.
Все просто, но минус если шагов сотни, то каждый раз прописывать if, ужасно не удобно.
Все очень просто и без прерываний.
Ясно, что для конечного автомата нужно использовать CASE.
Но вот вместо IF для каждого шага нужно вынести этот IF за пределы CASE, например перед ним.
И так остановка станка по условию появления 0 на определенном входе ПЛК это тоже некоторое состояние автомата. И его просто нужно описать в CASE. А во внешнем IF/ELSE, который перед CASE, проверять состояние входа ПЛК и если нужно выполнить стоп, то запомнить текущее состояние переменной CASE и присвоить ей номер состояния отработки остановки станка.
При появлении на входе ПЛК сигнала о продолжении работы, во внешнем IF/ELSE присвоить переменной CASE ранее сохраненное значение. И работа станка возобновиться из места остановки.

petera
29.09.2016, 12:43
Вот маленький пример, который демонстрирует выше сказанное

PROGRAM PLC_PRG
VAR
state: INT;
Pusk: BOOL;
A: INT;
B: INT;
PAUSA: BOOL;
old_state: INT;
C: INT;
D: INT;
END_VAR
F PAUSA AND state<>999 THEN
old_state:=state;
state:=999;
END_IF

CASE state OF
0:
IF Pusk THEN state:=1; END_IF
1:
A:=A+1;
C:=A;
IF A >=100 THEN state:=2; END_IF
2:
B:=B+1;
D:=B;
IF B >=150 THEN state:=3; END_IF
3:
A:=A-1;
C:=A;
IF A = 0 THEN state:=4; END_IF
4:
B:=B-1;
D:=B;
IF B =0 THEN state:=1; END_IF
999:
C:=0;
D:=0;
IF NOT PAUSA THEN
state:=old_state;
END_IF
END_CASE


https://www.youtube.com/watch?v=jHcQjb1QXeI

Чтобы понять разницу между ПЛК и микроконтроллером просто поставьте точку останова и пройдите программу по шагам.

https://www.youtube.com/watch?v=aZaJO6T4G2A
И сразу станет понятно, что программа не останавливается внутри CASE для какого-либо состояния до начала следующего цикла, а обрабатываются все строки программы до конца и в следующем цикле программа всегда начинается с первой строчки кода, а не внутри CASE.
Поэтому можно во внешнем IF поменять значение переменной для CASE и СASE начнется с нового состояния, а не с текущего.

Yegor
29.09.2016, 13:28
У Вас больше опыта с ПЛК, но мой предыдущий опыт (с обычными микроконтроллерами), говорит, что решить такую задачу в ПЛК без прерываний не возможно:). Попробую разобраться с прерываниями, тогда все станет на свои места.Какую задачу? Остановить станок по входу? Ну я решал без всяких прерываний, например. Если ПЛК по вашим расчётам не может сделать этого достаточно быстро - решайте другими средствами, делов-то.

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

lara197a
29.09.2016, 14:05
Для станка программу пишут в ладере, без всяких условий иф и кассе.
Эти условия вас приведут к нехорошим вещам, т.к. нужно следить за окончанием выполнения операций внутри них.
таймеры к примеру и т.п.
Пишется отдельно для каждой операции ФБ
внутри него строка начинается с контакта АУ, другая РУ.
Если не контакт не включен строка далее ПЛК не проверяется.
Строки будут почти одинаковые.
При отладке и поиске неисправностей оч. удобно, что все в одном месте.
В плсипрг просто последовательно записываются эти блоки.
Прерывания используются только для скоростных операций.
Насколько Овен подойдет вашей задачи, смотрите сами.

Alex19
29.09.2016, 16:48
Извините за паузу, только освободился на работе.

Конечно, я понимал, что Владимир скорее всего прав, учитывая его опыт.
Но меня смутило это видео, которое вечером постараюсь повторить и пройтись по нему отладчиком.

https://www.youtube.com/watch?v=yw-wYfObQA0

Потом petera, подтвердил, выше сказанное Владимиром .

Придется расстаться с опытом с обычными микроконтроллерами. Нету в ПЛК прерываний, и работает он с физическими входами и выходами не так, как обычный микроконтроллер.
Рабочий цикл ПЛК.
1. Опрос физических входов
2. Сохранение образа состояния входов
3. Выполнение программы, при этом используются именно образ входов. Если в программе используются выходы ПЛК, то изменение их состояния происходит не на физ. выходах а в их образе.
4. Запись образа выходов на физические выходы ПЛК
5. Выполнение служебных задач.
Далее все повторяется

Спасибо за подробное пояснение.



Все очень просто и без прерываний.
Ясно, что для конечного автомата нужно использовать CASE.
Но вот вместо IF для каждого шага нужно вынести этот IF за пределы CASE, например перед ним.
И так остановка станка по условию появления 0 на определенном входе ПЛК это тоже некоторое состояние автомата. И его просто нужно описать в CASE. А во внешнем IF/ELSE, который перед CASE, проверять состояние входа ПЛК и если нужно выполнить стоп, то запомнить текущее состояние переменной CASE и присвоить ей номер состояния отработки остановки станка.
При появлении на входе ПЛК сигнала о продолжении работы, во внешнем IF/ELSE присвоить переменной CASE ранее сохраненное значение. И работа станка возобновиться из места остановки.
Большое спасибо за подробное описание с кодом и видео.
Саму схему представлял себе примерно так же, но вот разницы между ПЛК и контролером пока не увидел. Мы так же идем в цикле while, цикл за циклом с верху вниз, разумеется если нет прерываний, которые могут сломать это поведение.


Какую задачу? Остановить станок по входу? Ну я решал без всяких прерываний, например. Если ПЛК по вашим расчётам не может сделать этого достаточно быстро - решайте другими средствами, делов-то.

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

Но выходит, что это единственно правильная/возможная схема работы.
Учитывая что Вы все предлагаете делать именно так.

Alex19
29.09.2016, 16:53
Для станка программу пишут в ладере, без всяких условий иф и кассе.
Эти условия вас приведут к нехорошим вещам, т.к. нужно следить за окончанием выполнения операций внутри них.
таймеры к примеру и т.п.
Пишется отдельно для каждой операции ФБ
внутри него строка начинается с контакта АУ, другая РУ.
Если не контакт не включен строка далее ПЛК не проверяется.
Строки будут почти одинаковые.
При отладке и поиске неисправностей оч. удобно, что все в одном месте.
В плсипрг просто последовательно записываются эти блоки.
Прерывания используются только для скоростных операций.
Насколько Овен подойдет вашей задачи, смотрите сами.
Что такое ладер?

Мне требуется ПЛК из-за его надежности.
Поэтому буду стараться изменить свое мышление.

Yegor
29.09.2016, 16:58
Что такое ладер?Ladder Logic. Язык, который заставляет применять ПЛК строго по их назначению =)


Да именно, остановить станок, безопасность операторов.
По идее он должен успеть, но такой подход мне показался не правильным. Электромеханикой делайте в обход контроллера. Это ж безопасность, ё-маё. Мы для одной большой печки не поленились вообще режим "без контроллера" сделать, чтобы деталь в печке спасти можно было. А когда людей спасать требуется, тут точно надо делать так, чтобы оно не могло не сработать.

Alex19
29.09.2016, 17:09
Вам 5 мс погоду делают или нет? Что это за вход вообще и что за станок?
Да, погоды не сделает.
Но я хотел понять, как вообще это делают.

Что касается станка, это термопластавтомат.
У которого еще до электронной защиты, есть механические. Это плата, которая агрегирует разные входы, начиная от защитных шиберов, кончая датчиками уровня, температуры масла и так далее.

Alex19
29.09.2016, 17:19
Ladder Logic. Язык, который заставляет применять ПЛК строго по их назначению =)
Понятно, спасибо за пояснения буду смотреть.



Электромеханикой делайте в обход контроллера. Это ж безопасность, ё-маё. Мы для одной большой печки не поленились вообще режим "без контроллера" сделать, чтобы деталь в печке спасти можно было. А когда людей спасать требуется, тут точно надо делать так, чтобы оно не могло не сработать.
Уже есть электромеханика везде, если относится к безопасности оператора, на дверях еще электрогидравлика. Электроника это дополнительный уровень защиты оператора и защита оснастки, форм и т.д.

Владимир Ситников
29.09.2016, 17:25
Понятно, спасибо за пояснения буду смотреть.
Лучше не надо =)

Yegor
29.09.2016, 18:33
как вообще это делают
выход_на_моторчик := NOT стоп AND (крутить_моторчик OR другие_условия_кручения_моторчика)И всё, остальное главный цикл сделает за вас. Причём желательно, чтобы это было единственное место записи в выход_на_моторчик; в кодесисе даже проверка есть, в скольких местах переменная записывается. Если что-то можно сделать без ветвления, на ПЛК это надо делать без ветвления.

BETEP
29.09.2016, 19:44
Если в контроллере выходы меняются после цикла проги, кто мешает в самом конце проги, при отсутствии сигнала на входе контроллера выполнить по триггеру действия при обнаружении перехода 1-0, а далее тупо обнулять выходы пока ноль на входе?
Вроде элементарно, вроде такой подход защищает от ошибок в будущем, при изменении проги, когда уже почти забыл где что.

Нужна максимальная скорость? поставьте в начале проги переход в конец по условию входа. (кстати заморозите все переменные, может пригодится при возврате к автомату.)

Нафига городить строки

выход_на_моторчик := NOT стоп AND (крутить_моторчик OR другие_условия_кручения_моторчика)


Причём желательно, чтобы это было единственное место записи в выход_на_моторчик;
Вопрос у ТС был довольно интересный, про архитектуру,
В подходе из цитат, архитектурой даже не пахнет.

-------------------
Архитектура, это когда прога разбита на кучу подпрограм и функций, а в нужный момент работают только те куски, которые нужны именно в этот момент. Так вообще то писать намного проще.

Владимир Ситников
29.09.2016, 19:48
Вопрос у ТС был довольно интересный, про архитектуру,
В подходе из цитат, архитектурой даже не пахнет.
К сожалению. Такая тема мимо ушла...

capzap
29.09.2016, 20:24
Вопрос у ТС был довольно интересный, про архитектуру,
В подходе из цитат, архитектурой даже не пахнет.

-------------------
Архитектура, это когда прога разбита на кучу подпрограм и функций, а в нужный момент работают только те куски, которые нужны именно в этот момент. Так вообще то писать намного проще.

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

Alex19
29.09.2016, 21:38
Да ушел от темы, как и задал вопрос слишком преждевременно, погорячился. Надо было больше почитать и проверить свои идеи.

В обычном микроконтроллере, это выглядело бы как обычный конечный автомат.
Было бы объявлено какой-то enum, ну к примеру:

enum TPAAutomaticStepCycleEnum
{
/// <summary>
/// Не выбран
/// </summary>
TPAASC_None = 0,
/// <summary>
/// Смыкание формы
/// </summary>
TPAASC_CloseForm = 1,
/// <summary>
/// Выс. давл. дожатия
/// </summary>
TPAASC_CloseFormHighPressureSqueezing = 2
};
Переменная, как stateTPA которая хранит переменную.
Дальше проверка if, которая проверяет вход, и если на нем 0, идем в функцию которая отключает оборудование в зависимости от последнего пункта, каким образом мы не идем дальше, если 1 идем дальше.

После это проверка выбранного режима, как правило они жестко забиты, поэтому это был бы if, а в нем функции TPAWAutomatic(), TPAWSemiAutomatic(), TPAWManual() и т.д.. Каждая функция TPAWAutomatic и TPAWSemiAutomatic представляет собой отдельный конечный автомат на case, к примеру так.
switch (stateTPA)
{
case TPAASC_CloseForm:
func1(&stateTPA);
break;
case TPAASC_CloseFormHighPressureSqueezing:
func2(&stateTPA);
break;
}
При появлении нового шага, нам нужно добавить дополнительную строку в enum, поменять нумерацию и добавить дополнительную обработку в case. Сами обработчики это функции и т.д.

Это, что касается расширения программы.
Что касается обработчика защиты, то мы просто читаем в критическим моментах порт. Или создаем прерывание и пробуем перейти в 0 адрес программы.

Не являюсь профессионалом, поэтому возможно вариант не идеальный. И да

Alex19
29.09.2016, 21:56
выход_на_моторчик := NOT стоп AND (крутить_моторчик OR другие_условия_кручения_моторчика)И всё, остальное главный цикл сделает за вас. Причём желательно, чтобы это было единственное место записи в выход_на_моторчик; в кодесисе даже проверка есть, в скольких местах переменная записывается. Если что-то можно сделать без ветвления, на ПЛК это надо делать без ветвления.
Вы предлагаете, проверять в критических моментах. Но имеет ли смысл, если пока мы не перешли к следующему циклы, значения портов не изменятся.

Alex19
29.09.2016, 22:14
Если в контроллере выходы меняются после цикла проги, кто мешает в самом конце проги, при отсутствии сигнала на входе контроллера выполнить по триггеру действия при обнаружении перехода 1-0, а далее тупо обнулять выходы пока ноль на входе?
Вроде элементарно, вроде такой подход защищает от ошибок в будущем, при изменении проги, когда уже почти забыл где что.

Очень интересно, есть какой-то триггер, который может обнаружить переход состояния входа 1-0. Идея действительно правильная, но мне мешало ее увидеть привычка, что изменение выхода происходит мгновенно. По сути триггер с проверкой в конце цикла, это то, что мне нужно, надо разобраться, что за зверь и как это работает. Спасибо за идею.



Нужна максимальная скорость? поставьте в начале проги переход в конец по условию входа. (кстати заморозите все переменные, может пригодится при возврате к автомату.)

Вы говорите о метках или goto, разумно.



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

Alex19
29.09.2016, 22:29
но он то совсем про другое, ему казалось что бесконечный цикл решит все проблемы и неподозревал что плк это делает и так. Под прерываниями он тоже имел ввиду не то что считается в контроллерах
Возможно я не правильно выразился.
Меня интересовала возможность расширения и уход от повторяемости кода.

lara197a
29.09.2016, 22:30
Alex19
на пластавтомате нет быстрых процессов.
там ни переходы, ни менеджер задач не нужны.
А программа пишется примерно так:

Alex19
29.09.2016, 23:13
Alex19
на пластавтомате нет быстрых процессов.
там ни переходы, ни менеджер задач не нужны.
А программа пишется примерно так:
Честно говоря у меня еще нет полного представления о работе ТПА.
Сейчас собираю документацию на машину.

Как понял у Вас используется последовательный вызов функций/методов.
А если режимов работы несколько?

В одном случае, автомат, переход из функции в функцию, в другом случае вызов по нажатию. В этом случае Вам нужно будет делать проверку на входе каждой, можно так же поставить их по режимам работы. К примеру if и потом череду функций с доп. проверками, но тогда у нас получаются лишние вызовы, case позволяет избежать их.

Alex19
29.09.2016, 23:18
Нужно отдыхать:), завтра в командировку.
На следующей неделе попробую проверить все идеи.

Большое спасибо, всем кто уделил мне время.