Страница 2 из 1041 ПерваяПервая 123412521025021002 ... ПоследняяПоследняя
Показано с 11 по 20 из 10404

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #11
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Согласен. Читаемость машины состояний отличная. Но в моем случае она неприменима.

    Раз уж разговор завязался, опишу свою задачу - это обработка последовательного протокола обмена данными, который, естественно, содержит обработку ошибок. Именно для обработки ошибок мне и нужны переходы. Решения без goto я пока не нашел и уже склоняюсь к прекращению поиска и использованию LD вместо ST.
    Думаю, это очевидно, что для этой задачи одним из самых важных требований является быстродействие алгоритма. Читаемость кода - вторична. К тому же у меня есть дополнительное ограничение: алгоритм должен быть реализован в одном POU (а конкретно FB).

    П.С. Даже ярые ненавистники goto (в том числе те, кто слепо твердит: "Количество GOTO в программе обратно пропорционально качеству программиста" )
    оправдывают применение goto для обработки ошибок (например см. Википедию). И я за них счастлив.

  2. #12
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Уж не связано ли это с привычкой ноу хау протект делать на блок. В КДС можно отдельно сделать библиотеку из блоков под паролем, чтом никто не читал Ваше творение, а только пользовался.
    Нет, такой привычки нет. Это требование заказчиков, продиктованное, как я понимаю, желанием сделать использование этого FB максимально простым и удобным для конечных пользователей.


    П.С. Перефразируя: "ноу-хау протект для честных людей".
    Он легко вскрывается.

  3. #13
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Для конечного пользователя главное безаварийная работа, а как выглядит исходный код они вообще не должны знать. ФБ для них должен выглядить в виде прямоугольника с ножками входов/выходов.
    Согласен. Вот поэтому я и написал, что читаемость кода - вторична. Пользователь должен видеть один прямоугольник с ножками.

    Цитата Сообщение от capzap Посмотреть сообщение
    А внутри программист должен использовать предоставленное ему разнообразие стандартных языков максимально эффективно, в моем понимании это включает и разбиение на подпрограммы (дополнительные ФБ и ФС) каждая из которых отвечает за свое событие, функцию и т.д.
    Чтобы использовать внутри "дополнительные FB и FC", их сначала нужно добавить во вкладке POUs, что противоречит требованию "один POU". Использовать же несколько языков в теле одного POU CoDeSys не позволяет. Или я упустил что-то важное в идеологии CoDeSys'а?

  4. #14
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Спасибо за идею.

  5. #15

    По умолчанию

    Цитата Сообщение от Serge_UA Посмотреть сообщение
    ...Использовать же несколько языков в теле одного POU CoDeSys не позволяет. Или я упустил что-то важное в идеологии CoDeSys'а?
    Правый клик на POU --> Add Action выбираем язык и описываем нужную задачу на другом языке. Получается, что в пределах одного POU мы используем несколько языков.

  6. #16

    По умолчанию

    В CoDeSys есть уникальная штука. Функциональный блок может иметь Действия. Это свои встроенные подпрограммы блока. Удобно каждое состояние описывать своим действием и вызывать их из ‘голого’ case. Николай выше уже подсказал, что действия могут быть на разных языках.

    Машина состояний с CASE меняет состояние между циклами. Для перехода в состояние ошибки это может быть медленно. Вызываем специальное действие 'Ошибки', приводящие выходы в безопасное состояние (если надо); меняем переменную состояния на ошибочное; вставим RETURN. POU мгновенно вылетает, отдает управление драйверам для реакции железа, вызывается снова уже в состоянии ошибки. Быстрее некуда.

    Еще вариант: делаете отдельную задачу - обработчик ошибок, вызываемую по фронту логической переменной. В любом месте проекта, при обнаружении ошибки, взводим переменную и ставим RETURN.

    Практически все стеки полевых сетей, даже такой сложный как CANopen, написаны в самом CoDeSys на ST с машиной состояний и иногда в несколько задач.

  7. #17
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Николай Суриков, Игорь Петров спасибо. Действия я упустил из вида. Почему-то был уверен, что они предназначены только для SFC. Нужно внимательней читать документацию .

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    Машина состояний с CASE меняет состояние между циклами. Для перехода в состояние ошибки это может быть медленно. Вызываем специальное действие 'Ошибки', приводящие выходы в безопасное состояние (если надо); меняем переменную состояния на ошибочное; вставим RETURN. POU мгновенно вылетает, отдает управление драйверам для реакции железа, вызывается снова уже в состоянии ошибки. Быстрее некуда.
    Красивое решение. Обязательно его попробую. Но не в данном проекте.

  8. #18
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А чего так ?
    Смущает необходимость ждать целый цикл ПЛК, чтобы выполнить операции которые я мог выполнить еще в прошлом цикле. Как-то так

    А еще, открою военную тайну , я уже реализовал этот проект для Siemens и Allen Bradley ПЛК (с использованием ненавистных всем goto). И кардинально менять структуру программы для CoDeSys смысла я не вижу.

  9. #19
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А что слабо перейти к другому шагу в этом же цикле ?

    Вы меня поставили в тупик.
    ...Тогда теряется смысл машины состояний.

    Цитата Сообщение от capzap Посмотреть сообщение
    и как это? goto во время цикла у Вас убегает в верх программы и снова начинает спускаться, если это конечно не SFC.
    В данном проекте у меня все goto "убегают" только вниз. И в программе нет ни одного цикла. В них не было нужды. Goto использовались для решения двух задач: обработка ошибок и пропуск больших кусков кода. Ну а в языке IL, который пришлось активно использовать в сименсе, goto - это единственный способ выполнить цикл или ветвление.

    Цитата Сообщение от capzap Посмотреть сообщение
    А может лучше так CASE предварительно заключить в
    WHILE TRUE DO
    ...
    ...
    END_WHILE;


    помоему это все можно делать и в КДС
    В средах программирования указанных выше контроллеров язык ST является платным дополнением. А заказчики умеют считать деньги

  10. #20
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Для этого и иф подойдет.
    Кейс позволяет избавиться от головозаворачиволок типа длинноветвящихся ифов, и разложить кусты в простые линейные цепи - где на порядок выше читаемость/понимаемость/ошибкозамечаемость/исправляемость
    И убрать кучу лишних флажков и тп.
    В языках, которые мне были доступны (IL, LD, FBD) нет конструкций IF и CASE, поэтому для реализации ветвлений использовались goto.

Страница 2 из 1041 ПерваяПервая 123412521025021002 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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