Спасибо за ответ.
Становится немного понятно принцип работы.
Нашел причину такого странного поведения ПЛК.
Вопрос увы не снят, а изменилсяwhile(1)
{
ReadInputs();
PLC_PRG();
WriteOutputs();
}.
Мы не можем получить новое значение, пока цикл не завершиться, но реальное значение может быть другим.
Как быть?
И тут нужно разбираться с прерываниями, как происходит передача управления между основной программой и обработчиком прерывания.
Правильный вопрос.
Быть так, чтобы "в самой программе" выполнялось минимум кода.
Грубо, говоря, если зарядить вычисление 10000 цифр в числе pi, то, да, провороним как изменился вход.
Если основная программа только пару проверок сделает и всего делов, то следующий цикл наступит во время, и ПЛК опросит входы/выходы.
99%, что не надо.
Просто не выполняйте лишнего (закрывайте IFами лишнюю логику, или выводите её в отдельные более редкие программы) в программе и будет счастье.
Другими словами Вы предлагаете разбить код, таким образом, чтобы выполнение кода было максимально эффективным, логично. Тут может не получиться, у меня еще минимум 4 модуля расширения, панель оператора и клавиатура, надеюсь такое кол-во периферии не подвесят программу.
Идея была в том, чтобы свалиться в прерывание и перейти в начало программы.
Ради интереса потом гляну возможно ли это.
Сейчас надо переварить выше сказанное и разобраться с доп. защитами.
Спасибо всем за пояснение.
Последний раз редактировалось Alex19; 28.09.2016 в 21:39. Причина: Дополнение.
Так не работает.
Дело, например, в том, что помимо вашей программы, ПЛК выполняет обработку сети (ethernet, 485 и т.п.).
Если вы собрались занимать вообще всё процессорное время, то кто будет отвечать по сети?
Поэтому, цикл "1мс" существует специально для того, чтобы ПЛК мог выполнять свои задачи.
Например, пользовательская программа "вычислить 10 if'ов" занимает 0.1мс, а всё остальное время 0.9мс прошивка ПЛК использует для своих нужд (сеть экран вот это всё).
В общем "тут принято", без прерываний, и у всех работает (если правильно помню, то обрабатывают более 30 модулей, и цикл не превышает 2мс)
Да и сама моя идея, была не правильная, погорячился.
Самый верный подход, как мне кажется, это прерывание, в котом задаем переменную, а дальше, только в ответственных участках кода проверяем ее. Тогда все будет логично и правильно, надо только понять как происходит передача управления. В станке предусмотрено еще 2 уровня защиты, оба механических, на случай ошибок или выхода ПЛК из строя.
Разумеется, есть код, который выполняется за кулисами моей программы, который требует ресурсы.
Мне еще нужно понять, какой объем этих ресурсов требуется. Пока когда читаю документацию, удивляюсь скорости переключения выходов и т.д., правда там написано не более.
Вы зародили сомнения, в моем решении.
У Вас больше опыта с ПЛК, но мой предыдущий опыт (с обычными микроконтроллерами), говорит, что решить такую задачу в ПЛК без прерываний не возможно. Попробую разобраться с прерываниями, тогда все станет на свои места.
Придется расстаться с опытом с обычными микроконтроллерами. Нету в ПЛК прерываний, и работает он с физическими входами и выходами не так, как обычный микроконтроллер.
Рабочий цикл ПЛК.
1. Опрос физических входов
2. Сохранение образа состояния входов
3. Выполнение программы, при этом используются именно образ входов. Если в программе используются выходы ПЛК, то изменение их состояния происходит не на физ. выходах а в их образе.
4. Запись образа выходов на физические выходы ПЛК
5. Выполнение служебных задач.
Далее все повторяется
Все очень просто и без прерываний.Станок постоянно опрашивает один из входов контролера и если на нем появляется логический 0, станок должен остановится. При этом не важно в каком режиме работает данный станок, в каком шаге и т.д., он должен выполнить определенные действия в зависимости от шага автомата (отключить какое-то оборудования) и остановиться. А в автоматическом режиме, при появлении на данном входе 1, должен продолжить из места остановки.
Как мне видится решение данной проблемы.
1. Перед каждым шагом в условии if проверяем функцию. Функция проверяет вход, а если требуется остановка выполняет определенные действия (отключает какое-то оборудование) в зависимости от шага автомата.
Все просто, но минус если шагов сотни, то каждый раз прописывать if, ужасно не удобно.
Ясно, что для конечного автомата нужно использовать CASE.
Но вот вместо IF для каждого шага нужно вынести этот IF за пределы CASE, например перед ним.
И так остановка станка по условию появления 0 на определенном входе ПЛК это тоже некоторое состояние автомата. И его просто нужно описать в CASE. А во внешнем IF/ELSE, который перед CASE, проверять состояние входа ПЛК и если нужно выполнить стоп, то запомнить текущее состояние переменной CASE и присвоить ей номер состояния отработки остановки станка.
При появлении на входе ПЛК сигнала о продолжении работы, во внешнем IF/ELSE присвоить переменной CASE ранее сохраненное значение. И работа станка возобновиться из места остановки.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg