Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 19

Тема: Не могу добить код на ST

  1. #1

    По умолчанию Не могу добить код на ST

    Добрый вечер. Суть вопроса такая 40 датчиков температуры и 40 клапанов к каждому. Есть фиксированная температура уставки, соответственно опрашивается каждый датчик, и если T[i] превышает Ust, то клапан V[i] открывается до стабилизации темп-ры. И при этом, вот в этом и затык у меня почему-то, если хотя бы одна T[i]>Ust, то должно сигнализироваться (грубо говоря лампочка горит). Код на ST вот так выглядит (для простоты пока выбрал массив не из 40, а из 3 элементов), но вот хоть убей, клапана отрабатывают нормально, а вот лампочка загорается/гаснет, только когда выполняется условия для третьего клапана. Не могу понять, в чём дело? Понимаю, что задача фигня, но вот ступор какой-то. Особо программированием не занимался, если что, познаю сейчас.

    PROGRAM PLC_PRG
    VAR
    Ust: REAL:=5;//Температура уставки
    Temp: ARRAY [1..3] OF REAL;//Измеренная температура
    Valve: ARRAY [1..3] OF BOOL;//Клапан
    lamp: BOOL;//Сигнальная лампа
    i: BYTE;
    END_VAR

    Тело программы

    FOR i:=1 TO 3 DO;
    IF Temp[i] > UST THEN
    lamp:=TRUE;
    Valve[i]:=TRUE;

    ELSE
    Valve[i]:=FALSE;
    lamp:=FALSE;

    END_IF
    END_FOR

  2. #2
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,665

    По умолчанию

    Так у вас если НЕ, то лампа гаснет... Лампа то у вас не [i] а надо чтобы тоже бала lamp[i] и потом уже проверка, если хоть одна true то и лампочка Гори...

    через OR все Valve[i] соберите и на лампу, без всяких уже там лампа true не true...

  3. #3

    По умолчанию

    Так лампа одна на все 40 узлов. Если на CFC я понимаю как сделать, то тут что-то никак. Но, на CFC это такое полотно получится )

  4. #4
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,665

    По умолчанию

    я вижу что одна. Ну вот клапан 2 сработал, а последний 40-й выключен и лампа у вас будет выключена вполне естественно.
    Как вариант в своем цикле можете делать ADD на все ваши true и после цикла проверять >0 - лампа гори.
    перед началом цикла соответственно обнулять переменную lamp
    Последний раз редактировалось melky; 20.09.2023 в 23:53.

  5. #5

    По умолчанию

    Понял, попробую.
    Последний раз редактировалось Клаус; 20.09.2023 в 23:57.

  6. #6
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,665

    По умолчанию

    можно так же, но потом в цикле проверять же. Лучше сделайте перед циклом lamp := 0;

    если условие выполняется то lamp := lamp + 1;
    если не выполняется, ничего не делайте, а после цикла IF lamp > 0 THEN "гори", если Не, то гасни...

  7. #7

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    можно так же, но потом в цикле проверять же. Лучше сделайте перед циклом lamp := 0;

    если условие выполняется то lamp := lamp + 1;
    если не выполняется, ничего не делайте, а после цикла IF lamp > 0 THEN "гори", если Не, то гасни...
    Спасибо огромное!!! Вот так заработало:

    PROGRAM PLC_PRG
    VAR
    Ust: REAL:=5;//Температура уставки
    Temp: ARRAY [1..3] OF REAL;//Измеренная температура
    Valve: ARRAY [1..3] OF BOOL;//Клапана
    lamp: BOOL;//Сигнальная лампа
    xlamp: INT;
    i: BYTE;
    END_VAR

    xlamp:=0;
    FOR i:=1 TO 3 DO;
    IF Temp[i] > UST THEN
    xlamp:= xlamp + 1;
    Valve[i]:=TRUE;
    ELSE
    Valve[i]:=FALSE;
    END_IF
    IF xlamp > 0 THEN Lamp:=TRUE;
    ELSE lamp:=FALSE;
    END_IF
    END_FOR

  8. #8

    По умолчанию

    Можно было проще, вернее без суммирования. Я например для механизма с 32мя возможными авариями делаю так:
    AlarmSum:=false
    Далее в цикле:
    If alarm(i) then alarmSum:=true
    Условие "иначе" не ставлю, просто взвел бит и все.
    И в итоге ваш код почти такой же, но не суммирую и не проверяю что больше нуля.

  9. #9

    По умолчанию

    Lamp:=false;
    FOR i:=1 TO 3 DO;
    IF Temp[i] > UST THEN
    lamp:= true;
    Valve[i]:=TRUE;
    ELSE
    Valve[i]:=FALSE;
    END_IF
    END_FOR

  10. #10

    По умолчанию

    Цитата Сообщение от МихаилГл Посмотреть сообщение
    Можно было проще, вернее без суммирования. Я например для механизма с 32мя возможными авариями делаю так:
    AlarmSum:=false
    Далее в цикле:
    If alarm(i) then alarmSum:=true
    Условие "иначе" не ставлю, просто взвел бит и все.
    И в итоге ваш код почти такой же, но не суммирую и не проверяю что больше нуля.
    Спасибо, возьму на вооружение!

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Не могу запрограммировать ТРМ-12
    от dimas022 в разделе Эксплуатация
    Ответов: 6
    Последнее сообщение: 14.03.2022, 10:48
  2. Не могу подключить ПР к ПК
    от GladiK в разделе Программируемые реле
    Ответов: 1
    Последнее сообщение: 06.04.2018, 15:59
  3. Не могу разобраться с ТРМ-202
    от Хитрожопый негр в разделе Эксплуатация
    Ответов: 12
    Последнее сообщение: 23.02.2015, 12:51
  4. не могу сбросить плк-100
    от MCBK в разделе ПЛК1хх
    Ответов: 8
    Последнее сообщение: 16.12.2009, 13:54

Ваши права

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