Страница 48 из 66 ПерваяПервая ... 38464748495058 ... ПоследняяПоследняя
Показано с 471 по 480 из 658

Тема: Функциональные блоки на языке ST

  1. #471

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Мой вопрос не по таймерам. Просьба перечитать внимательнее.

    Я прочитал и понял - на входах таймеров используются переменные, объявленные как выходы. Я тоже их часто использую для промежуточных вычислений.
    В "урезанном" виде у меня такой пример работает - по скрину же не видно, как изменяются остальные переменные. А может проблемы из-за использовании в этом месте пользовательских функций.


    Если есть ФБ, работающий неправильно, не проще было его выложить?

    Код:
    function_block functionblock1 //имя функционального блока.
    
        var_input //объявление входных переменных
           in1 : bool; 
         end_var
    
        var_output //объявление выходных переменных
           Q1 : bool; 
           Q2 : bool; 
        end_var
    
        var //объявление локальных переменных
           TOF1 : SYS.TOF;
           TOF2 : SYS.TOF;
        end_var
    
        TOF1(I:=(Q1 AND Q2), T:=t#5s);
        Q1 := (TOF1.Q AND NOT Q2) or in1;
        
        TOF2(I:=Q1, T:=t#10s);
        Q2 := TOF2.Q;
        
    end_function_block

  2. #472

    По умолчанию

    1exan Выкладываю. Вот в виде кода. На CodeSys 3.5 работает норм.

    ДОПОЛНЕНИЕ: ВОПРОС СНЯТ. Всё-таки глюк был именно в моём исходном соде на CodeSys 3.5. Вот видео: https://cs-cs.net/ExxChange/CSDrvPwrDir-BugDemo.avi
    На нём видно, что после выключения первого реле второе "мигает", а должно работать с задержкой.

    Здесь он уже портирован на OWL, и там переменные типа TIME на входах переведены в UDINT и мсек.

    PHP код:
    FUNCTION_BLOCK CSDrivePwrDir //имя функционального блока.
    (*
    TODOПроверить глюк реле Dir при командах остановкионо тут кратковременно включаетсяхотя не должно!
    TODOДобавить отсчёт времени работы блока (через BLINK по секундно)
    *)


    (* 
    Универсальный блок драйвера сигналов Power/Direction для управления кранамишторами и другими
    устройствами
    которые управляются сигналами Питание (реле 1и Направление (реле 2).
    По входу такой блок принимает множество настроек и видов команд для управления по длительности
    или от начала до конца
    Внутри блока находится конечный автоматкоторый правильно отслеживает
    нужные состояния блока
    .
    Сам блок поддерживает состояния выдержки перед подачей команд Питания и Направления и противоположных
    команд открытия и закрытия
    чтобы реле их управления не слипались.
    Блок портирован из CodeSys 3.5Copyright © 2023-2024 Cs-Cs.Net Lab https://cs-cs.net *)
    VAR_INPUT
        
    //Команды управления блоком
        
    OpValue                BOOL;        //Команда: Открыть-Закрыть ПО УРОВНЮ (TRUE - Открыть, FALSE - Закрыть), активируется по WorkModeByValue

        
    CmdStop                BOOL;        //Команда: Немедленно остановить операцию, наплевав на остальные команды

        
    CmdOpenPart            BOOL;        //Команда: Открывать, пока действует уровень (TRUE - идёт процесс ОТкрытия, FALSE - стоп)
        
    CmdClosePart           BOOL;        //Команда: Закрывать, пока действует уровень (TRUE - идёт процесс ЗАкрытия, FALSE - стоп)

        
    CmdOpenFull            BOOL;        //Команда: Открыть полностью до конца (TRUE - команда начинает выполняться по фронту)
        
    CmdCloseFull           BOOL;        //Команда: Закрыть полностью до конца (TRUE - команда начинает выполняться по фронту)

        //Настройка главного режима работы блока
        
    WorkModeByValue        BOOL := FALSE;    //Включить управление блоком ПО УРОВНЮ (OpValue) - команды импульсного управления будут недоступны

        //Настройки режимов работы блока
        
    UseStopByFullSame      BOOL := FALSE;    //Останавливать текущую операцию (аналог CmdStop) при повторном нажатии на кнопку CmdxxxFull
        
    UseStopByFullRev       BOOL := FALSE;    //Останавливать текущую операцию (аналог CmdStop) при нажатии на противоположную кнопку CmdxxxFull
        
    UseWorkTimer           BOOL := TRUE;     //Использовать подачу команд по таймеру (для уровней и Полных), иначе - всегда (TimeWorkTime)
        
    UseDelayITL            BOOL := TRUE;     //Использовать задержку между противоположными командами (TimeDelayITL)
        
    UseDelayDIR            BOOL := TRUE;     //Использовать задержки между командами Питания и Направления (TimeDelayDIR)
        
    UseReverseDIR          BOOL := FALSE;    //Инвертировать сигнал открытия (будет FALSE - Открыть, TRUE - Закрыть)

        //Времена режимов работы блока
        
    TimeWorkTime           UDINT := 25;    //Время длительности выполнения одной операции (секунд)
        
    TimeDelayITL           UDINT := 250;   //Время выдержки при подаче противоположных команд (Открыть <> Закрыть, UseDelayITL) (мсек)
        
    TimeDelayDIR           UDINT := 500;   //Время выдержки между сигналами Питание и Направление (UseDelayDIR) (мсек)
    END_VAR
    VAR_OUTPUT
        
    //Выходные переменные
        
    RelayPower             BOOL;           //Сигнал на реле: Питание
        
    RelayDir               BOOL;           //Сигнал на реле: Направление
        
    StateInOp              BOOL;           //Статус: Текущая операция выполняется (любая)
        
    StateOpening           BOOL;           //Статус: Идёт открытие
        
    StateClosing           BOOL;           //Статус: Идёт закрытие
        
    TimeRemainOp           UDINT;          //Оставшееся время до конца операции (секунд)
    END_VAR

    END_FUNCTION_BLOCK 
    ДОПОЛНЕНИЕ: Убрал код реализации. Не хочу его сильно прям вот распространять. Да и на OWL он плохо работает ещё.

    PS. Как так ты красиво код вставил?
    Последний раз редактировалось Cs-Cs; 13.05.2024 в 13:31. Причина: Убрал палевный код (я - жадина) / Добавил описание
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  3. #473

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    1exan Выкладываю. Вот в виде кода. На CodeSys 3.5 работает норм.
    Здесь он уже портирован на OWL, и там переменные типа TIME на входах переведены в UDINT и мсек.

    TODO: Проверить глюк реле Dir при командах остановки: оно тут кратковременно включается, хотя не должно!

    PS. Как так ты красиво код вставил?
    Не понял, что надо сделать чтобы щёлкнуло Dir? По командам OpenPart и OpenFull/Stop вроде нормально отрабатывает

    Кнопочка # в Расширенном режиме редактирвания - вставляет тег [CODE]

    P.S.
    Нашел нужную комбинацию
    Последний раз редактировалось 1exan; 08.05.2024 в 15:54.

  4. #474

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Не понял, что надо сделать чтобы щёлкнуло Dir? По командам OpenPart и OpenFull/Stop вроде нормально отрабатывает.
    Я в эмуляции тыркал OpenPart/ClosePart между собой. Собственно от подачи этих команд и наворочена защита (FBшка может управлять шторами, рольставнями, кранами воды).
    На CodeSys, повторюсь, работает прям отлично. А тут чего-то подтупливает (или я где-то сделал ошибку, которая в CodeSys прокатывает).

    У тебя CODE как-то красиво комментарии расцветил, а у меня только чёрно-белым всё показывал (
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  5. #475
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,732

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Так. У меня назрели вопросы и заметки.
    1. Зачем переименовали стандартные как в CodeSys названия блоков и их переменных?
    * Вместо R_TRIG - RTRIG и так далее
    * Вместо IN, PT, OUT - I, T, Q
    Портировать из CodeSys ни фига не удобно.
    ..
    Надеятся что Овен кинется переделывать смысла нет.

    Вариант 1.
    Прям в Кодесис замастрячить набор оберток-близнецов ложика и юзать в кодесис только их.
    Портирование из кодесис - копипасте.

    Вариант 2.
    Прям в Ложике замастрячить набор оберток-близнецов кодесис и юзать в ложике только их
    Портирование из кодесис - копипасте.

    Не благодарите.

  6. #476

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Я в эмуляции тыркал OpenPart/ClosePart между собой. Собственно от подачи этих команд и наворочена защита (FBшка может управлять шторами, рольставнями, кранами воды).
    На CodeSys, повторюсь, работает прям отлично. А тут чего-то подтупливает (или я где-то сделал ошибку, которая в CodeSys прокатывает).

    У тебя CODE как-то красиво комментарии расцветил, а у меня только чёрно-белым всё показывал (
    По-ходу надо перенести управление Power:
    Код:
    tmPwOffDelay(I:= (UseDelayITL AND UseDelayDIR AND RelayDir AND RelayPower), T:= UDINT_TO_TIME(TimeDelayDIR / 2));
    
    (* Тут обрабатываем задержу сигнала Power, если сигнал "Направление" (RelayDir физически) равен TRUE
    Привязка к физическому RelayDir нужна из-за того что у нас может быть включен режим инверсии DIR, и поэтому
    при команде закрытия реле Dir может быть TRUE.
    Основной алгортим следующий: при активном DIR включается таймер задержки (если эта настройка включена),
    а реальный сигнал Power выдаётся сразу (если настройка выключена) или после таймера задержки. *)
    
    
    (* Чтобы выдать сигнал Питания, надо учесть следующие условия:
    а) Это просто операция закрытия: выдаётся без задержек
    б) Это операция открытия без DIRDelay: выдаётся сразу
    в) Это операция открытия с DIRDelay: выдаётся после выдержки
    Значение для пунктов "б" и "в" выбирается при помощи SEL. *)
    RelayPower := bRlyClose OR (bRlyOpen AND SEL_B((UseDelayDIR = TRUE), RelayDir, tmPwDelay.Q));    
    
    
    //Формируем физический сигнал DIR таким, каким он должен быть с учётом выдержки
    RelayDir := (tmPwOffDelay.Q AND (NOT RelayPower)) OR (SEL_B(UseReverseDIR, bRlyOpen, bRlyClose));
    
    //Теперь обрабатываем таймер задержки Power (он работает всегда, так как настройку могут изменить на лету,
    //и таймер должен подхватить выдержку на лету)
    tmPwDelay(I:= RelayDir, T:= UDINT_TO_TIME(TimeDelayDIR)); //Реле питания работает, если есть хоть одна команда
    Я ничего не красил - просто прямо из OL скопировал

  7. #477

    По умолчанию

    У меня не вышло. Тестил вот сейчас - всё раво мигает. Сделаю тогда через промежуточные переменные и тупо воткну задержку на 50 мсек, что ли. Как костыль.
    Ведь тут никакой отладки нет, ничего не видно, и приходится только гадать ((

    Дополнение. Я добавил задержку на 10 мсек, и в эмуляторе стало хорошо. Муть в общем...
    Дополнение 2. Портировал ещё один ПРОСТОЙ блок управления шторами, мать его, из CodeSys 2.3. Тоже НЕ работает!!! Причём на команду Полного Открытия!!!
    Какая ж хрень: отладить не получается, и ещё и работает не так, как в CodeSys!!!!! Я крайне ЗОЛ, и мне хочется снова бить лица!!!
    ...я завтра перепишу этот простой FB на FBD в OWL и посмотрю, как он там работать будет. Если и правда заработает - то буду бить всех, кто под руку попадёт.
    Последний раз редактировалось Cs-Cs; 09.05.2024 в 22:32.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  8. #478

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    У меня не вышло. Тестил вот сейчас - всё раво мигает. Сделаю тогда через промежуточные переменные и тупо воткну задержку на 50 мсек, что ли. Как костыль.
    Ведь тут никакой отладки нет, ничего не видно, и приходится только гадать ((

    Дополнение. Я добавил задержку на 10 мсек, и в эмуляторе стало хорошо. Муть в общем...
    Дополнение 2. Портировал ещё один ПРОСТОЙ блок управления шторами, мать его, из CodeSys 2.3. Тоже НЕ работает!!! Причём на команду Полного Открытия!!!
    Какая ж хрень: отладить не получается, и ещё и работает не так, как в CodeSys!!!!! Я крайне ЗОЛ, и мне хочется снова бить лица!!!
    ...я завтра перепишу этот простой FB на FBD в OWL и посмотрю, как он там работать будет. Если и правда заработает - то буду бить всех, кто под руку попадёт.
    Ну не знаю - после того, как я перенес присваивание RelayPower до присваивания RelayDir - у меня перестало кратковременно отключаться (один цикл) RelayDir при отключении RelayPower

  9. #479

    По умолчанию

    Цитата Сообщение от 1exan Посмотреть сообщение
    Ну не знаю - после того, как я перенес присваивание RelayPower до присваивания RelayDir - у меня перестало кратковременно отключаться (один цикл) RelayDir при отключении RelayPower
    Давай тогда сравним версии OwenLogic. Моя 2.6.345.0
    Я ща перерисую более простую FBшку из CodeSys 2.3 на FBD, тестану и тогда выдам вердикт.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  10. #480

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Давай тогда сравним версии OwenLogic. Моя 2.6.345.0
    Я ща перерисую более простую FBшку из CodeSys 2.3 на FBD, тестану и тогда выдам вердикт.
    У меня 348

    Я думаю, что на ПЛК цикл программы гораздо более короткий, и там отключение дискретного выхода на 1 цикл проходит незамеченным для промежуточного выходного реле. На ПР цикл больше и реле успевает немного щёлкнуть. И в эмуляции я ничего не заметил (пока пошагово не запустил), а вот в железе было слышно некое движение
    Последний раз редактировалось 1exan; 10.05.2024 в 12:34.

Страница 48 из 66 ПерваяПервая ... 38464748495058 ... ПоследняяПоследняя

Похожие темы

  1. ПЛК73 (Функциональные кнопки)
    от necro в разделе ПЛК63/73
    Ответов: 8
    Последнее сообщение: 18.05.2022, 10:03
  2. Функциональные блоки
    от ribamuka в разделе СПК2xx (архив)
    Ответов: 4
    Последнее сообщение: 08.04.2018, 15:01
  3. Функциональные блоки насосов в CoDeSys
    от Алексей Ермолаев в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 28.03.2017, 13:50
  4. Функциональные блоки- где искать?
    от Xops в разделе ПЛК1хх
    Ответов: 16
    Последнее сообщение: 01.03.2016, 11:07
  5. СПК функциональные клавиши
    от Lyohin в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 30.03.2015, 15:10

Ваши права

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