Показано с 1 по 10 из 33

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

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

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

    Становится немного понятно принцип работы.
    Нашел причину такого странного поведения ПЛК.
    while(1)
    {
    ReadInputs();
    PLC_PRG();
    WriteOutputs();
    }
    Вопрос увы не снят, а изменился.
    Мы не можем получить новое значение, пока цикл не завершиться, но реальное значение может быть другим.
    Как быть?

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

  2. #2

    По умолчанию

    Цитата Сообщение от Alex19 Посмотреть сообщение
    Как быть?
    Правильный вопрос.

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

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

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

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

  3. #3

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Правильный вопрос.
    Быть так, чтобы "в самой программе" выполнялось минимум кода.
    Грубо, говоря, если зарядить вычисление 10000 цифр в числе pi, то, да, провороним как изменился вход.
    Если основная программа только пару проверок сделает и всего делов, то следующий цикл наступит во время, и ПЛК опросит входы/выходы.
    Другими словами Вы предлагаете разбить код, таким образом, чтобы выполнение кода было максимально эффективным, логично. Тут может не получиться, у меня еще минимум 4 модуля расширения, панель оператора и клавиатура, надеюсь такое кол-во периферии не подвесят программу.

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    99%, что не надо.

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

    Сейчас надо переварить выше сказанное и разобраться с доп. защитами.
    Спасибо всем за пояснение.
    Последний раз редактировалось Alex19; 28.09.2016 в 21:39. Причина: Дополнение.

  4. #4

    По умолчанию

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

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

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

  5. #5

    По умолчанию

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

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

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

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

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

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

  6. #6
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,108

    По умолчанию

    Цитата Сообщение от Alex19 Посмотреть сообщение
    Да и сама моя идея, была не правильная, погорячился.

    Самый верный подход, как мне кажется, это прерывание, в котом задаем переменную, а дальше, только в ответственных участках кода проверяем ее. Тогда все будет логично и правильно, надо только понять как происходит передача управления. В станке предусмотрено еще 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

Похожие темы

  1. Выбор правильной конфигурации
    от maxsus в разделе Подбор Оборудования
    Ответов: 3
    Последнее сообщение: 07.09.2015, 16:39
  2. Друзья , нужна помощь в подключении и правильной работе МПР51
    от Виктор Иванов в разделе Эксплуатация
    Ответов: 11
    Последнее сообщение: 24.07.2015, 14:47
  3. ПЛК 304 автозапуск приложения
    от Шевцов Игорь в разделе ПЛК3xx (архив)
    Ответов: 24
    Последнее сообщение: 06.03.2015, 12:07
  4. Поделитесь опытом по поиску Заказчиков
    от dmm в разделе Трёп (Курилка)
    Ответов: 16
    Последнее сообщение: 11.12.2011, 22:21
  5. вопрос по выбору архитектуры
    от Kraft в разделе Помощь Разработчикам
    Ответов: 1
    Последнее сообщение: 09.02.2010, 07:11

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •