Страница 480 из 1046 ПерваяПервая ... 380430470478479480481482490530580980 ... ПоследняяПоследняя
Показано с 4,791 по 4,800 из 10453

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

  1. #4791

    По умолчанию

    Не архитектура ПЛК Вам мешает, а накопленный за годы багаж знаний и опыт.
    ПЛК работает по другому. Напишите в проекте:
    a:=a+1; И Вы увидите, что a будет постоянно инкриментироваться, пока не переполнится. Это и есть внутернний цикл ПЛК.
    Программа выполняется сверху вниз, записываются результаты, считывается область входов-выходов, и программа снова выполняется сверху вниз.
    Таймеры не надо отслеживать - таймеры отследятся сами при очередном проходе.
    Единственно для чего Вам нужен цикл - отключить работу логики когда условия выполнятся 100 раз.
    Для организации выполнения условия циклы не нужны. Я обычно использовал обыкновенный If
    Проще всего Вашу задачу вообще реализовать на SFC. Три блока, три условия перехода, три таймера. При выходе из последнего блока инкриментируем количество прошедших циклов.

  2. #4792

    По умолчанию

    Цитата Сообщение от Николаев Андрей Посмотреть сообщение
    a:=a+1; И Вы увидите, что a будет постоянно инкриментироваться, пока не переполнится. Это и есть внутернний цикл ПЛК.
    Попробовал, действительно так. Сбило с толку, что логические значения переменным не переприсваивались в цикле для дальнейшего присваивания выходу. Попробую реализовать все без внутренних программных циклов, в общем. Спасибо за подсказки!

  3. #4793

    По умолчанию

    А как повторить таймер-то без цикла? Даже функция Tim(IN:=TRUE, PT:=T#2S); без привязки к входным и выходным параметрам, выполнится только 1 раз и программа остановится, хотя согласно логике плк должна повторяться.

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

    По умолчанию

    Код:
    PROGRAM PLC_PRG
    VAR
        Aout: BOOL;
        Bout: BOOL;
        Start: BOOL;
        Tim: TON:=(PT:=T#3S);
        X: INT;
        L: INT;
        R_TRIG1: R_TRIG;
    END_VAR
    
    
    R_TRIG1(CLK:=Ain , Q=>Start );
    IF Start THEN X:=1; END_IF
    
    IF L<100 AND Ain THEN
    
    Tim(IN:= NOT Tim.Q );
    CASE X OF
    1:        Aout:=TRUE; X:=X+BOOL_TO_INT(Tim.Q);
    2:        Aout:=FALSE;  X:=X+BOOL_TO_INT(Tim.Q);
    3:        Bout:=TRUE; X:=X+BOOL_TO_INT(Tim.Q);
    4:        Bout:=FALSE; X:=X+BOOL_TO_INT(Tim.Q);
    5:        L:=L+1; X:=1;
    END_CASE
    ELSE
    X:=0;
    L:=0;
    Aout:=FALSE;
    Bout:=FALSE;
    Tim(IN:= FALSE );
    END_IF
    Как-то так.
    ЗЫ.
    Цитата Сообщение от Zik Посмотреть сообщение
    А как повторить таймер-то без цикла? Даже функция Tim(IN:=TRUE, PT:=T#2S); без привязки к входным и выходным параметрам, выполнится только 1 раз и программа остановится, хотя согласно логике плк должна повторяться.
    Таймер-то через 2с нужно перезапустить по входу IN.
    Вложение 23336
    У меня в примере так - Tim(IN:= NOT Tim.Q ), т.е. он сам себя перезапускает.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #4795

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Как-то так.
    Ох. Сейчас буду разбираться, спасибо. Кое-что новое в коде для меня есть.

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

    По умолчанию

    Цитата Сообщение от Zik Посмотреть сообщение
    Ох. Сейчас буду разбираться, спасибо. Кое-что новое в коде для меня есть.
    В примере не объявлена переменная Ain: BOOL;, предполагал, что это вход ПЛК, т.е. глобальная переменная
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  7. #4797

    По умолчанию

    это вход ПЛК, т.е. глобальная переменная
    Да, именно так.

  8. #4798

    По умолчанию

    У меня в примере так - Tim(IN:= NOT Tim.Q ), т.е. он сам себя перезапускает.
    Вот за наводку благодарен, крайне полезно мне будет. Спасибо за развернутый ответ, в целом.

  9. #4799

    По умолчанию

    Уважемые форумчане, вопрос по грамотной реализации задачи:

    Дано:
    20 емкостей требуется в них поддерживать темературу и давление согласно графика по 10 точками из HMI

    на входе данные:
    датчики температуры + датчики давления
    график температуры + давления от HMI на каждую емкость
    время и дата старта процесса на каждую емкость
    статусы емкости: емкость выключена, ручное управление, поддержание по графику

    на выходе:
    магнитные дискретные клапана подачи охлаждающей жижи и клапан сброса давления

    условие:
    Графики по 10 точкам , точность почасовая
    Температура и давление уставки на каджый момент должны расчитываться по графику между двумя точками, почасово.

    Формат данных:
    температура -5 до +40 градусов, точность 0,1
    давление 0 до 3 бара, точность 0,1 бара



    Я вижу реализацию этого так:
    В плк160 выступает сервером, создаем слэйв
    Создаем карту регистров , допустим 2 байтных

    Для каждой емкости регистры
    1: статус : емкость выключена, ручное управление, поддержание по графику
    2: дата-время старта процесса в часах от 0000 года
    3-13: с 0 по 10 точку графика время
    14-24: с 0 по 10 точку графика температуры
    25-35: с 0 по 10 точку графика время
    36-46: с 0 по 10 точку графика давления
    47: положение клапана температуры
    48: положение клапана давления
    49: текущая уставка расчетная Температуры
    50: текущая уставка расчетная Давления

    итого 20 емкостей х 50 данных = 1 000 разных данных !!!


    Это все ручками прописывать в codesys 2.3 в Конфигурации ПЛК и создавать 1000 регистров ?

    Или создавать двухмерный массив в VAR_GLOBAL на 20 х 50 ячеек INT задать каждой ячейке ссылку на адрес AT %.... и уже потом работать с ним, ?
    или массив для сохранности от выключения питания помещать в VAR_GLOBAL RETAIN ?

    типо:

    AR1: ARRAY [1..20,1..50] OF INT := AT %QD8.1.0 , AT %QD8.2.0, AT %QD8.3.0 .... и тд

    В "конфигурации задач" создаю новую задачу с интервалом в 1 час, у которой добавляю вызов программы, в которой делаю перебор массива по 20 емкостям, и для тех емкостей у которых статус "поддержание по графику" , делаем расчет на текущий момент значение уставки исходя из данных в массиве.

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


    Далее в цикле программа которая по гистерезису и тек измеренному значению рулит клапанами с учетом уставки.


    Ну и вроде все)))

    ну и главное ПЛК160 потянет вообще такую нагрузку ?



    Вот такие вопросы от новичка . Писать на ST видимо )

    Спасибо заранее

  10. #4800
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Это все ручками прописывать в codesys 2.3 в Конфигурации ПЛК и создавать 1000 регистров ?
    Можно обойтись и 51 точкой, из которых 50 это названные параметры, а 1 - номер ёмкости. Сильно зависит от способностей вашего HMI на самом деле.
    AR1: ARRAY [1..20,1..50] OF INT := AT %QD8.1.0 , AT %QD8.2.0, AT %QD8.3.0 .... и тд
    Так нельзя. Можно проще: объявить указатель на массив и направить его на область слейва, если не ссыкотно. AR1: POINTER TO ARRAY [1..50] OF TANK; AR1 := ADR(%...) или типа того. TANK - структура с вашими данными (так удобнее ведь).

Страница 480 из 1046 ПерваяПервая ... 380430470478479480481482490530580980 ... ПоследняяПоследняя

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

Ваши права

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