Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 21

Тема: Как из ФБ и Ф управлять DO

  1. #1

    По умолчанию Как из ФБ и Ф управлять DO

    Требуется примерно вот такое (по входу DI1 в течении 1 с включается DO1, отключается или через 1с или если DI2).

    TP1(IN:=DI1, PT:=T#1s);
    RS1(SET:=TP1.Q, RESET:=(TP1.ET=t#1s OR DI2);
    DO1:=RS1.Q;

    Таких DO у меня штук 20, я решил сделать функцию , которая будет выбирать какой DO дергать. Примерно вот так:

    Function DO_Choice: bool;
    Var_input
    DO_Num:usint;
    end_var

    if DO_Num=1 then DO=DO1
    ...
    elseif DO_Num=20 then DO=DO20
    end_if

    и в программе уже подставлять вместо конкретного DO1 переменную DO которая бы соответствовала правильному выходу плк.

    Вопрос - как жестко связать переменную с выходом плк, чтобы такая программа бы заработала?

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

    По умолчанию

    Ваша функция ничего не делает. Для выбора используйте конструкцию CASE.

    Не совсем ясно, в какой момент будет выбираться выход. Что должно произойти, если выбор сделан в момент, когда другой выход уже возведён в TRUE и идёт отсчёт таймера с ожиданием DI2? Что такое «правильный выход ПЛК», каким критерием определяется его правильность?

  3. #3

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Ваша функция ничего не делает. Для выбора используйте конструкцию CASE.

    Не совсем ясно, в какой момент будет выбираться выход. Что должно произойти, если выбор сделан в момент, когда другой выход уже возведён в TRUE и идёт отсчёт таймера с ожиданием DI2? Что такое «правильный выход ПЛК», каким критерием определяется его правильность?
    Не совсем понимаю, в чем будет разница если использовать CASE.

    "Правильный" - выбранный функцией в момент когда функция будет вызвана из ФБ. В принципе в программе будут опрашиваться по очереди все входы и соответственно включаться/выключаться все выходы. Идея была в том, чтобы не писать один и тот же алгоритм 20 раз, а сделать 1 функцию, которую 20 раз вызвать.

    Другой выход будет обрабатываться другим экземпляром ФБ, они могут параллельно включаться/выключаться.
    Последний раз редактировалось Barboris; 06.08.2012 в 20:07.

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

    По умолчанию

    будут опрашиваться по очереди все входы
    Согласно вашему описанию, входов там всего два. Оттого и непонятно, как и по какой такой очереди от них должны работать двадцать выходов.

    Возможно, подойдёт что-нибудь эдакое:


  5. #5

    По умолчанию Мой вариат

    Здравствуйте, Борис.
    Цитата Сообщение от Barboris Посмотреть сообщение
    Таких DO у меня штук 20, я решил сделать функцию , которая будет выбирать какой DO дергать.
    На первый взгляд логично сделать функциональный блок с Вашим алгоритмом. Делаете столько экземпляров сколько нужно и присваиваете входа/выхода которые нужно. Во вложении мой вариант.
    Изображения Изображения
    Последний раз редактировалось Gans; 06.08.2012 в 21:32.
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  6. #6

    По умолчанию

    Эх не успел, Егор уже ответил.
    У Егора правильнее (за что ему куча плюсиков и лайков), у меня читабелнее :-) Выбирать Борису
    Автоматизация Диспетчеризация Сервис
    e-mail: ads-kaluga@mail.ru

  7. #7

    По умолчанию

    Спасибо за варианты, у меня ближе к варианту Gans.

    Я как раз и хотел сделать нужное кол-во ФБ, но хотелось бы не присваивать 20 раз входы и выходы, а только номер от 1 до 20, а с помощью функции автоматически по номеру присваивались нужные входы/выходы.

    примерно вот так:

    if "включить1(DI_ON)" or "выключить1(DI_OFF)" then SW(1)
    elseif "включить2" or "выключить2" then SW(2)
    .. так до 20
    end.

    Function block SW(var_input SW_NUM)
    DIDO_Choice(sw_num);
    TP1(IN:=DI_ON, PT:=T#1s);
    RS1(SET:=TP1.Q, RESET:=(TP1.ET=t#1s OR DI_OFF);
    DO:=RS1.Q;
    end;

    Fuction DIDO_Choice (Var_input: DO_Num:usint; var_output: DI_ON, DI_OFF, DO);
    if DO_NUM=1 then DI_ON:=DI1; DI_OFF=DI2; DO:=DO1;
    elseif DO_NUM=2 then DI_ON:=DI3; DI_OFF=DI4; DO:=DO2;
    elsif.... до 20
    end;

    Естественно, так работать не будет, потому что изменение переменной DO не заставит включиться выходу DO1, в этом и весь вопрос.

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

    По умолчанию

    Мутность вашей идеи в том, что Вам нужно что-то 20 раз в цикле вызывать с номерами, а внутри этого заниматся перебором номеров до 20 раз. Т.е получается до 200 сравнений за цикл.
    А у Егора четко, лаконично и быстро. Сразу понятно что и куда физически привязано. И главное - переносимо без залезания внутрь фб. И сравнений вообще нет.

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

    По умолчанию

    Естественно, так работать не будет, потому что изменение переменной DO не заставит включиться выходу DO1, в этом и весь вопрос.
    В вашем решении функция-селектор должна возвращать указатель на выход (POINTER TO BOOL). От множественных присваиваний вы этим не избавитесь, т.к. по сути лишь перенесёте их в ту самую функцию. Сложность ради сложности.

    Если я правильно понял, то у каждого выхода есть свой набор входов и нет никаких пересечений. В этом случае городить огород точно не стоит.
    Последний раз редактировалось Yegor; 07.08.2012 в 19:18.

  10. #10

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    В вашем решении функция-селектор должна возвращать указатель на выход (POINTER TO BOOL). От множественных присваиваний вы этим не избавитесь, т.к. по сути лишь перенесёте их в ту самую функцию. Сложность ради сложности.

    Если я правильно понял, то у каждого выхода есть свой набор входов и нет никаких пересечений. В этом случае городить огород точно не стоит.
    Поскольку данный ФБ это только одна небольшая часть всего алгоритма работы устройства, то не хотелось бы перегружать основную программу, и хотелось бы чтобы ФБ делал законченную работу, чтобы он самостоятельно включал или выключал нужный выход без дополнительных движений извне.
    Про POINTER TO спасибо, буду разбираться.
    2Carzap: а с прямыми адресами и наименованиями каналов в конфигураторе у меня не получилось, ведь нужен именно указатель туда, а не прямо они.

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

Похожие темы

  1. трм 151 можно ли управлять к1 и к2 без
    от Ermak в разделе Эксплуатация
    Ответов: 14
    Последнее сообщение: 01.10.2010, 12:14
  2. управлять не через Scada
    от AntoNechayuk в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 23.12.2009, 09:11
  3. Вход 1-10В, управлять напряжением
    от termsl в разделе Эксплуатация
    Ответов: 0
    Последнее сообщение: 16.10.2008, 15:16
  4. Вход 1-10В, управлять напряжением
    от termsl в разделе Трёп (Курилка)
    Ответов: 0
    Последнее сообщение: 16.10.2008, 15:06
  5. Как управлять МВУ8 У с компьютера
    от Валера Храмцов в разделе Мх110
    Ответов: 4
    Последнее сообщение: 26.05.2008, 15:09

Ваши права

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