Страница 825 из 869 ПерваяПервая ... 325725775815823824825826827835 ... ПоследняяПоследняя
Показано с 8,241 по 8,250 из 8683

Тема: Экспресс вопрос (ответ)

  1. #8241

    По умолчанию

    Цитата Сообщение от ST2K Посмотреть сообщение
    Прошу сильно не пинать, первые шаги в освоении ST....
    использовал учебник Иванова и мануал по ПР-205:
    решил с простого начать:

    Задача модели мониторить датчики в емкости и обрабатывать принудительный ручной запуск набора воды в емкость. Насос скважины качает соленую воду, прогоняет через осмос (в осмосе свой насос высокого давления)
    и набирает емкость 750 литров до уровня FULL. включение по датчику LOW. На всякий случай аварийный датчик переполнения, если с датчиком FULL что-то произойдет.
    В модели 4 клапана, один подает воду в емкость 750 литров, второй (на будущее) будет подавать воду во вторую емкость 5000 литров, если 750 наполнена уже или принудительно. Третий открывает дренаж на слив грязной воды.
    Четвертый открывается чтобы подавать неочищенную воду, естественно, закрывая все остальные.(это тоже TODO...)


    1. не совсем понял как в режиме симуляции в интерактивном режиме менять значения на входах реле, чтобы увидеть как работает модель.(выставлять 0 или 1 на выбранном входе и наблюдать изменения).
    нашел только что можно открыт окно просмотра при запущенной симуляции и там добавить вход и в нем поменять переменную... а вот чтобы щелкнуть на виртуальную кнопку (как, например, в Proteus) такого там нет?

    2. как работает в принципе функциональный блок, исполняется ли он в цикле или же разово? т.е. крутится в цикле, опрашивает входы или же выполняется как только происходит изменения на входных переменных?
    или же мониторинг входов нужно вешать на триггеры, которые срабатывают при изменении одного из входов и тогда запускать на выполнение функциональный блок? Хочу понять принцип и подход. Как я понимаю, постоянно гонять
    опрос входов - это грузить процессор на 100%? или тут другая ситуация?

    3. как отключить насос скважины через 5 секунд после остановки насоса осмоса. Не выключается выход реле через 5 секунд. Включение насоса c задержкой 10 секунд идет нормально, клапана тоже все открываются нормально, при сбросе I4 в 0 все выключается , а PumpSKV остается работать...
    d
    Код:
    //включение режима подачи воды из скважины и очистки ее установкой осмоса
    //с подачей очищенной воды в емкость 750 литров.
    function_block OsmosHomeMode
        
        var_input
            Level750_Overflow : bool;
            Level750_LOW : bool;
            Level750_FULL : bool;
            Manual_Start : bool;
        end_var
        
        var_output 
            PumpSKV : bool; //выход на контактор насоса скважины
            PumpOSMOS : bool; //выход на контактор насоса установки обратного осмоса
            
            Klapan750 : bool;//клапан на емкость 750 литров для подачи в дом
            Klapan5000 : bool;//клапан на емкость 5000 литров для полива
            KlapanSLIV : bool;//клапан открывает дренажную трубу для слива грязной воды, концентрата
            KlapanRAW : bool; //клапан подачи неочищенной воды 
        end_var
        
        var 
            OSMOSPump_ON_Delay : SYS.TON;
            SKVPump_OFF_Delay : SYS.TOF;
            NeedSTOP : bool;
            
        end_var
        IF Level750_LOW or Manual_Start THEN  //нажали кнопку с фиксацией или уровень упал ниже минимального
            Klapan750 := TRUE; //открываем клапан на набор очищенной воды в емкость 750л
            KlapanSLIV := TRUE; //открываем клапан на дренаж концентрата после осмоса
            Klapan5000 := FALSE; //закрываем клапан на емкость 5000
            KlapanRAW := FALSE; //закрываем клапан слива неочищенной воды
            
            PumpSKV:=TRUE; //включаем насос скважины
            OSMOSPump_ON_Delay(I:=Level750_LOW or Manual_Start,T:=T#10S,Q=>PumpOSMOS);//включение насоса осмоса через10 секунд после насоса скважины
        ELSE
            PumpOSMOS:=FALSE; //отключаем насос установки осмоса
            
            Klapan750 := FALSE; //закрываем клапан на набор очищенной воды в емкость 750л
            Klapan5000 := FALSE; //закрываем клапан на емкость 5000
            KlapanRAW := FALSE; //закрываем клапан слива неочищенной воды
            
            //NeedSTOP := NOT ((NOT Manual_Start) OR Level750_FULL or Level750_Overflow); //если отключится кнопка или сработает датчик наполнения или аварийный
    
            NeedSTOP:=TRUE;
            SKVPump_OFF_Delay(I:=NeedSTOP,T:=T#5S);//выключение насоса скважины через 5 секунд после насоса осмоса
            PumpSKV:=SKVPump_OFF_Delay.Q; //!!! насос не выключается через 5 секунд
    
            KlapanSLIV := FALSE; //закрываем клапан на дренаж
            
        END_IF;
    
    
    end_function_block
    1. В режиме симуляции - просто кликайте на квадратик входа и вход изменит своё состояние
    2. Код внутри ФБ выполняется ТОЛЬКО в тот момент, когда происходит его вызов (строка вида "ИмяФБ(...);"). В скобках может вообще ничего не быть - в этом случае блок обработает те значения, которые будут в этот момент на его входах.
    В промежутках между вызовами выходные переменные ФБ СОХРАНЯЮТ свои значения.
    3. п.2

  2. #8242
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,926

    По умолчанию

    Цитата Сообщение от ST2K Посмотреть сообщение
    Прошу сильно не пинать, первые шаги в освоении ST....
    использовал учебник Иванова и мануал по ПР-205:
    Найдите книжку Петрова И.В. Программируемые контроллеры Стандартные языки и приемы прикладного проектирования

    3. как отключить насос скважины через 5 секунд после остановки насоса осмоса. Не выключается выход реле через 5 секунд. Включение насоса c задержкой 10 секунд идет нормально, клапана тоже все открываются нормально, при сбросе I4 в 0 все выключается , а PumpSKV остается работать...
    Задержка отключения - если на входе пропал сигнал, то выход отключится через заданное время. У вас же вход просто взводится и все.
    Совет: не надо таймеры располагать под условием. Таймер у нас не аппаратный, который пнул и забыл, а программный, т.е. должен выполняться. В вашем примере: если низкий уровень уйдет раньше чем 10 секунд, то таймер не сработает и насос осмоса не запуститься. Но, зато, в следующий раз он может запуститься сразу, ведь 10 секунд уже пройдет.
    Далее, если вы явно пинаете таймер ton(I := true), то, где-то в коде обязательно должны его сбросить ton(I := false), иначе таймер сработает только один раз

    Вот, чуть поправил код
    Код:
    //включение режима подачи воды из скважины и очистки ее установкой осмоса
    //с подачей очищенной воды в емкость 750 литров.
    function_block OsmosHomeMode
        
        var_input
            Level750_Overflow : bool;
            Level750_LOW : bool;
            Level750_FULL : bool;
            Manual_Start : bool;
        end_var
        
        var_output 
            PumpSKV : bool; //выход на контактор насоса скважины
            PumpOSMOS : bool; //выход на контактор насоса установки обратного осмоса
            
            Klapan750 : bool;//клапан на емкость 750 литров для подачи в дом
            Klapan5000 : bool;//клапан на емкость 5000 литров для полива
            KlapanSLIV : bool;//клапан открывает дренажную трубу для слива грязной воды, концентрата
            KlapanRAW : bool; //клапан подачи неочищенной воды 
        end_var
        
        var 
            OSMOSPump_ON_Delay : SYS.TON;
            SKVPump_OFF_Delay : SYS.TOF;
            NeedSTOP : bool;
            pusk : bool; //флаг запуска
            
        end_var
        IF Level750_LOW or Manual_Start THEN  //нажали кнопку с фиксацией или уровень упал ниже минимального
            Klapan750 := TRUE; //открываем клапан на набор очищенной воды в емкость 750л
            KlapanSLIV := TRUE; //открываем клапан на дренаж концентрата после осмоса
            Klapan5000 := FALSE; //закрываем клапан на емкость 5000
            KlapanRAW := FALSE; //закрываем клапан слива неочищенной воды
            
            //PumpSKV:=TRUE; //включаем насос скважины
            //OSMOSPump_ON_Delay(I:=Level750_LOW or Manual_Start,T:=T#10S,Q=>PumpOSMOS);//включение насоса осмоса через10 секунд после насоса скважины
            pusk := true; //запускаем систему
        ELSE
            //PumpOSMOS:=FALSE; //отключаем насос установки осмоса
            
            Klapan750 := FALSE; //закрываем клапан на набор очищенной воды в емкость 750л
            Klapan5000 := FALSE; //закрываем клапан на емкость 5000
            KlapanRAW := FALSE; //закрываем клапан слива неочищенной воды
            
            //NeedSTOP := NOT ((NOT Manual_Start) OR Level750_FULL or Level750_Overflow); //если отключится кнопка или сработает датчик наполнения или аварийный
    
            //NeedSTOP:=TRUE;
            //SKVPump_OFF_Delay(I:=NeedSTOP,T:=T#5S);//выключение насоса скважины через 5 секунд после насоса осмоса
            //PumpSKV:=SKVPump_OFF_Delay.Q; //!!! насос не выключается через 5 секунд
    
            KlapanSLIV := FALSE; //закрываем клапан на дренаж
            pusk := false; //останавливаем систему
            
        END_IF;
    
        OSMOSPump_ON_Delay(I := pusk, T := t#10s, Q => PumpOsmos); //управление насосом осмоса
        SKVPump_OFF_Delay(I := pusk, T := t#5s, Q => PumpSKV); //управление насосом скважины
        
    end_function_block

  3. #8243
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,597

    По умолчанию

    Цитата Сообщение от ST2K Посмотреть сообщение
    Прошу сильно не пинать, первые шаги в освоении ST....]
    точно знаю что нейросеть не пинает в любом случае, вот её версия
    Код:
    // улучшенная версия
    FUNCTION_BLOCK OsmosHomeMode
    VAR_INPUT
        Level750_Overflow : bool;    // Датчик переполнения емкости 750л
        Level750_LOW     : bool;     // Датчик минимального уровня
        Level750_FULL    : bool;     // Датчик максимального уровня
        Manual_Start     : bool;     // Ручное управление
    END_VAR
    
    VAR_OUTPUT
        PumpSKV     : bool;          // Насос скважины
        PumpOSMOS   : bool;          // Насос осмоса
        Klapan750   : bool;          // Клапан емкости 750л
        Klapan5000  : bool;          // Клапан емкости 5000л
        KlapanSLIV  : bool;          // Клапан слива
        KlapanRAW   : bool;          // Клапан подачи сырой воды
    END_VAR
    
    VAR
        OSMOSPump_ON_Delay  : SYS.TON;    // Таймер включения насоса осмоса
        SKVPump_OFF_Delay   : SYS.TOF;    // Таймер выключения насоса скважины
        NeedSTOP           : bool;        // Флаг необходимости остановки
    END_VAR
    
    // Основной цикл работы
    IF Level750_LOW OR Manual_Start THEN
        // Режим запуска системы
        Klapan750 := TRUE;           // Открытие клапана подачи воды в емкость 750л
        KlapanSLIV := TRUE;          // Открытие дренажа концентрата
        Klapan5000 := FALSE;         // Закрытие клапана емкости 5000л
        KlapanRAW := FALSE;          // Закрытие клапана сырой воды
        
        PumpSKV := TRUE;             // Включение насоса скважины
        OSMOSPump_ON_Delay(IN := Level750_LOW OR Manual_Start, 
                           T := T#10S, 
                           Q => PumpOSMOS);  // Включение насоса осмоса через 10с
    ELSE
        // Режим остановки системы
        PumpOSMOS := FALSE;          // Отключение насоса осмоса
        
        Klapan750 := FALSE;          // Закрытие клапана подачи воды
        Klapan5000 := FALSE;         // Закрытие клапана емкости 5000л
        KlapanRAW := FALSE;          // Закрытие клапана сырой воды
        
        NeedSTOP := NOT((NOT Manual_Start) OR 
                        Level750_FULL OR 
                        Level750_Overflow);
        
        // Управление насосом скважины с задержкой выключения
        SKVPump_OFF_Delay(IN := NeedSTOP, 
                          T := T#5S, 
                          Q => PumpSKV);
        
        KlapanSLIV := FALSE;         // Закрытие дренажа
    END_IF;
    
    END_FUNCTION_BLOCK
    Screenshot 2025-04-04 080037.png
    Диаграмма показывает последовательность работы системы:

    При включении (Level750_LOW = TRUE) насос скважины запускается сразу
    Насос осмоса включается через 10 секунд после запуска насоса скважины
    При остановке сначала выключается насос осмоса
    Насос скважины выключается через 5 секунд после остановки насоса осмоса
    Клапаны синхронизируются с работой насосов

    Основные улучшения в коде:

    Оптимизация логики работы насосов:
    Добавлен таймер включения насоса осмоса (OSMOSPump_ON_Delay)
    Реализована последовательная запуска насосов с задержкой
    Улучшена логика остановки системы через NeedSTOP
    Улучшение структуры кода:
    Добавлены подробные комментарии на русском языке
    Группировка связанных действий
    Улучшена читаемость через правильное форматирование
    Безопасность работы:
    Проверка всех условий остановки через NeedSTOP
    Корректная последовательность закрытия клапанов
    Синхронизация работы всех компонентов

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


    на вопрос
    как отключить насос скважины через 5 секунд после остановки насоса осмоса. Не выключается выход реле через 5 секунд. Включение насоса c задержкой 10 секунд идет нормально, клапана тоже все открываются нормально, при сбросе I4 в 0 все выключается , а PumpSKV остается работать
    Проблема в том, что выход насоса скважины (PumpSKV) не отключается через 5 секунд после остановки насоса осмоса. Давайте рассмотрим, почему это происходит и как это исправить.
    Screenshot 2025-04-04 081736.png
    На диаграмме показана последовательность работы системы, где:

    Синяя линия показывает активное состояние компонента
    Стрелки показывают команды управления
    Проблема возникает в последней части, где насос скважины не выключается через 5 секунд

    Основная причина проблемы:

    Код:
    // Проблемный код
    NeedSTOP:=TRUE;
    SKVPump_OFF_Delay(I:=NeedSTOP,T:=T#5S);//выключение насоса скважины через 5 секунд
    PumpSKV:=SKVPump_OFF_Delay.Q; //!!! насос не выключается через 5 секунд
    Исправленная версия:
    Код:
    // Правильная реализация
    VAR
        SKVPump_OFF_Delay : SYS.TOF;  // Таймер выключения насоса скважины
        PumpSKV_State    : bool;      // Состояние насоса скважины
    END_VAR
    
    IF Level750_LOW OR Manual_Start THEN
        // Режим запуска
        PumpSKV_State := TRUE;
        PumpSKV := PumpSKV_State;
        SKVPump_OFF_Delay(IN := FALSE, PT := T#5S);  // Сброс таймера
        
        // Остальной код включения...
    ELSE
        // Режим остановки
        SKVPump_OFF_Delay(IN := TRUE, PT := T#5S);  // Запуск таймера
        PumpSKV_State := NOT SKVPump_OFF_Delay.Q;    // Управление через состояние
        PumpSKV := PumpSKV_State;
    END_IF;
    Ключевые изменения:

    Добавлен отдельный бит состояния насоса (PumpSKV_State)
    Таймер TOF используется правильно:
    IN := TRUE при остановке
    IN := FALSE при запуске
    PT := T#5S задает время задержки
    Управление насосом происходит через состояние, которое инвертируется по Q выходу таймера

    Проверка работоспособности:

    При включении:
    PumpSKV_State = TRUE
    Таймер сбрасывается
    Насос включается сразу
    При остановке:
    Таймер запускается (IN := TRUE)
    Через 5 секунд Q становится TRUE
    PumpSKV_State становится FALSE
    Насос выключается

    Теперь насос скважины должен корректно выключаться через 5 секунд после остановки насоса осмоса.


    как то так, главное в вопросах к нейросетям(phind.com, you.com) в начале указать в контексте какой сферы задается вопрос и она довольно быстро подберет правильное направление решения
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  4. #8244

    По умолчанию

    как работает в принципе функциональный блок, исполняется ли он в цикле или же разово?
    Я же специально для ПРщиков написал статью про Функцию и Функциональный блок. Простым языком. Без книжек. Бесплатно.
    И уже давал на неё ссылку. Разве сложно было почитать?
    Даю ещё раз: https://cs-cs.net/funkciya-fun-i-fun...esys-owenlogic
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  5. #8245
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,926

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    точно знаю что нейросеть не пинает в любом случае, вот её версия

    // улучшенная версия
    ...
    Все хорошо с ИИ, но, если кнопка Manual_Start будет без фиксации, то можем не дождаться включения насоса осмоса. А если с фиксацией, то не дождемся выключения насоса скважины

  6. #8246

    По умолчанию

    Всем спасибо за помощь, книжку Петрова от 2004 и 2016 годов нашел, изучаю.
    Таймер у нас не аппаратный, который пнул и забыл, а программный, т.е. должен выполняться
    Это важно, я думал он как отдельный thread стартует и висит самостоятельно до завершения.
    Последний раз редактировалось ST2K; 04.04.2025 в 09:58.

  7. #8247

    По умолчанию Здравствуйте.

    Нужен макрос который бы ограничел изминение целочисленного значения по вермени. Было число 5 изминилось 6 но на выходе висит 5 пока не истикло время и так на каждое изминение числа. Помогите пожалуйста может у кого есть что то подобное.
    Последний раз редактировалось TiiTan4ik; 04.04.2025 в 11:02.

  8. #8248
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,597

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Все хорошо с ИИ, но, если кнопка Manual_Start будет без фиксации, то можем не дождаться включения насоса осмоса. А если с фиксацией, то не дождемся выключения насоса скважины
    я не смогу продолжить с ней диалог, потому что закрыл вкладку. А с нуля начать может каждый, постепенно задавая ей уточняющие вопросы
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  9. #8249

    По умолчанию

    Цитата Сообщение от TiiTan4ik Посмотреть сообщение
    Нужен макрос который бы ограничел изминение целочисленного значения по вермени. Было число 5 изминилось 6 но на выходе висит 5 пока не истикло время и так на каждое изминение числа. Помогите пожалуйста может у кого есть что то подобное.
    Отсчет задержки постоянно ведётся или запускается при изменении значения на входе?

    PS
    В буквы "е" и "и" по какому принципу выбираете? )

  10. #8250

    По умолчанию

    Цитата Сообщение от TiiTan4ik Посмотреть сообщение
    Нужен макрос который бы ограничел изминение целочисленного значения по вермени. Было число 5 изминилось 6 но на выходе висит 5 пока не истикло время и так на каждое изминение числа. Помогите пожалуйста может у кого есть что то подобное.
    Как то так 1 Задержка.jpg
    Последний раз редактировалось kondor3000; 04.04.2025 в 13:53.

Страница 825 из 869 ПерваяПервая ... 325725775815823824825826827835 ... ПоследняяПоследняя

Похожие темы

  1. ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)
    от Serge_UA в разделе ПЛК (среда CoDeSys V2.3)
    Ответов: 11831
    Последнее сообщение: Сегодня, 14:41
  2. CODESYS V3.5. Вопросы и ответы
    от ООО "БЛС инжинеринг" в разделе ПЛК (среда CODESYS V3.5)
    Ответов: 8560
    Последнее сообщение: 23.12.2025, 10:13
  3. вопрос-ответ , или а поговорить????
    от Павел Братковский в разделе Трёп (Курилка)
    Ответов: 10
    Последнее сообщение: 24.01.2018, 11:05
  4. Преобразовать ответ
    от IIeroniux в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 05.10.2015, 17:45

Ваши права

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