Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 16 из 16

Тема: СПК 107 в качестве панели оператора

  1. #11

    По умолчанию

    Цитата Сообщение от P_Ilya Посмотреть сообщение
    Потому что нужно отслеживать ввод нового значения оператором. В общем случае это можно сделать только сравнивая значение используемое системой визуализации и сохранённое значение. Ну и значение, которое присылает слейв, не должно затирать значение введённое оператором (до тех пор, пока новое значение не будет отправлено слейву).

    Илья
    О вижу проникшегося проблемой человека!

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

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

    По умолчанию

    Хотелось бы всё же конкретный кейс рассмотреть, где требуется игнорировать не успевшие измениться значения от слейва.
    нужно отслеживать ввод нового значения оператором
    Зачем отслеживать новое оно или нет? Даже подтверждение ввода отслеживать не требуется. Достаточно просто поймать попытку ввода, т.е. закрытие диалога, и это делается без проблем. И по закрытию в любом случае пишем в слейв хоть старое значение, хоть новое. Какая разница?

    Я не голословно утверждаю. У меня сразу две панели мастерами для ПЛК были как-то. И на обеих надо было отображать одно и то же включая вводимые оператором уставки. И там не было ни строчки кода для какой-то синхронизации или сравнения текущих значений с введёнными.

  3. #13
    Пользователь
    Регистрация
    27.08.2015
    Адрес
    Екатеринбург
    Сообщений
    22

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Хотелось бы всё же конкретный кейс рассмотреть, где требуется игнорировать не успевшие измениться значения от слейва.Зачем отслеживать новое оно или нет?
    Чтобы отправить новое значение слейву. Если использовать только одну переменную, то значение, которое получим от слейва, может затереть то значение, которое ввёл оператор.

    Цитата Сообщение от Yegor Посмотреть сообщение
    Даже подтверждение ввода отслеживать не требуется. Достаточно просто поймать попытку ввода, т.е. закрытие диалога, и это делается без проблем.
    А вот с этим поподробнее, пожалуйста! Как отследить завершение ввода нового значения с помощью Slider'а, Checkbox'а, Potentiometr'a и т.п. Я ведь не зря написал "В общем случае". Даже поймать закрытие диалога недостаточно, если обмен выполняется в параллельной задаче.

    Цитата Сообщение от Yegor Посмотреть сообщение
    И по закрытию в любом случае пишем в слейв хоть старое значение, хоть новое. Какая разница?

    Я не голословно утверждаю. У меня сразу две панели мастерами для ПЛК были как-то. И на обеих надо было отображать одно и то же включая вводимые оператором уставки. И там не было ни строчки кода для какой-то синхронизации или сравнения текущих значений с введёнными.
    У вас панели оператора или СПК? В панелях оператора, с которыми я работал, эта сихронизация выполняется на системном уровне. СПК -- это не панель оператора.

    Илья

  4. #14
    Пользователь
    Регистрация
    27.08.2015
    Адрес
    Екатеринбург
    Сообщений
    22

    По умолчанию

    Цитата Сообщение от Леонид Посмотреть сообщение
    А может кто знает, как поиметь информацию о удачно завершенном диалоге ввода с цифровой клавиатуры?
    На самом деле, написать свой диалог для ввода цифровой информации очень просто. В этом случае можно отслеживать всё что угодно. Как это делать со стандартным диалогом -- не разбирался даже, слишком уж мелкие кнопки у стандартного диалога.

    В теме http://www.owen.ru/forum/showthread.php?t=22601 есть огрызки моего проекта, там диалог есть.

    Илья

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

    По умолчанию

    Чтобы отправить новое значение слейву. Если использовать только одну переменную, то значение, которое получим от слейва, может затереть то значение, которое ввёл оператор.
    Ещё конкретнее. Прямо совсем конкретно. Температура там, скорость.
    У вас панели оператора или СПК? В панелях оператора, с которыми я работал, эта сихронизация выполняется на системном уровне. СПК -- это не панель оператора.
    С СПК110 я работал.
    А вот с этим поподробнее, пожалуйста! Как отследить завершение ввода нового значения с помощью Slider'а, Checkbox'а, Potentiometr'a и т.п. Я ведь не зря написал "В общем случае". Даже поймать закрытие диалога недостаточно, если обмен выполняется в параллельной задаче.
    Тут я немного сдамся. Дело в том, что я избегаю таких элементов на главных экранах. Любые реальные действия — только через диалоги. На экранах только навигация и вызов диалогов. Ну, подробнее так подробнее...

    Вот экранчик на СПК110 в конструкторе и при исполнении:

    desginer.png manual_overview2.png

    Там есть вот эти поля:

    input.png

    Это температурная уставка. Её текущее значение всегда и постоянно берётся со слейва (ПЛК110) без дополнительных условий. Переменная heaterSetpoint это просто результат разбора содержимого регистров слейва:

    heaterSetpoint.png

    В событиях этого поля ввода творится следующее:

    ondialogclosed.png

    То есть при вызове диалога запоминается команда «Установить температуру». При закрытии диалога эта команда передаётся на ПЛК вместе с уставкой. Ну то есть как передаётся... У меня первые три регистра отведены под команду: соответственно, код команды, аргумент 1 и аргумент 2. Остальные регистры отведены на передачу показаний с контроллера-слейва на панели. Тут тоже ничего хитрого — контроллер натыкается на команду «установить температуру», меняет какие-то свои внутренние переменные и заодно выставляет новое значение регистра, из которого СПК показывает значение уставки.

    А главная хитрость в том, что значение из диалога пишется не в ту переменную, которая идёт от слейва, а в другую:

    another_var.png

    То есть результат ввода запоминается для отправки, потом отправляется вместе с так же запомненной командой и в считанные миллисекунды актуальное значение оказывается в переменной heaterSetpoint обеих панелей.

    SendPlcCmd вот:
    Код:
    FUNCTION SendPlcCmd : BOOL
    VAR_INPUT
        Cmd: SCommand;
        Arg0, Arg1: WORD;
    END_VAR
    
    IF CMD_CTRL.cmdCount < 51 THEN
    
        CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][0] := Cmd;
        CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][1] := Arg0;
        CMD_CTRL.cmdQueue[CMD_CTRL.cmdCount][2] := Arg1;
        CMD_CTRL.cmdCount := CMD_CTRL.cmdCount + 1;
    END_IF
    CMD_CTRL вот:
    Код:
    PROGRAM CMD_CTRL (* Sends commands to the PLC *)
    VAR_INPUT
        Cmd, Arg0, Arg1: WORD;
        cmdQueue: ARRAY[0..50] OF ARRAY [0..2] OF WORD;
        cmdCount: INT;
    END_VAR
    VAR
        Checksum: WORD;
        Pulse: TON := (PT := T#300MS);
        tx: BOOL;
        cmdIdx: INT;
        edge: R_TRIG;
    END_VAR
    
    (* Command conveyor, up to 50 commands in queue *)
    tx := FALSE;
    edge(CLK := cmdCount > 0);
    Pulse(IN := NOT Pulse.Q AND cmdCount > 0);
    IF (Pulse.Q OR edge.Q) AND cmdIdx < cmdCount THEN
        Cmd := cmdQueue[cmdIdx][0];
        Arg0 := cmdQueue[cmdIdx][1];
        Arg1 := cmdQueue[cmdIdx][2];
        Checksum := Cmd + Arg0 + Arg1;
        tx := TRUE;
        cmdIdx := cmdIdx + 1;
    ELSIF Pulse.Q THEN
        Cmd := 0;
        cmdIdx := cmdCount := 0;
    END_IF
    В конфигурации ничего хитрого:

    cmd0.png cmd1.png
    Последний раз редактировалось Yegor; 20.11.2015 в 07:40.

  6. #16
    Пользователь
    Регистрация
    27.08.2015
    Адрес
    Екатеринбург
    Сообщений
    22

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Тут я немного сдамся. Дело в том, что я избегаю таких элементов на главных экранах.
    Ну вот! А я то думал! :-)

    Цитата Сообщение от Yegor Посмотреть сообщение
    А главная хитрость в том, что значение из диалога пишется не в ту переменную, которая идёт от слейва, а в другую:
    [skip]
    То есть результат ввода запоминается для отправки, потом отправляется вместе с так же запомненной командой и в считанные миллисекунды актуальное значение оказывается в переменной heaterSetpoint обеих панелей.
    Так об этом я и пишу с самого начала! Только у меня сразу для каждой "переменной" (для каждого регистра модбас) выделяется два слова: одно для визуализации (и изменения оператором с последующей отправкой слейву), и другое для получения от слейва! В результате мне не нужно специальным образом оформлять изменение значения переменной оператором (или в программе). При внесении изменений другим человеком, не знакомым с применяемой методологией, у меня всё будет сделано автоматически. А у Вас -- другому человеку сначала нужно будет вникнуть... :-)

    Ну и если ограничиться вводом новых значений через диалоги, то Ваш подход правильный. Я так же хотел сделать, но решил себя не ограничивать.

    Илья

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. Codesys и СПК 107
    от Чайник в разделе СПК1хх
    Ответов: 9
    Последнее сообщение: 13.10.2015, 11:04
  2. Спк 107
    от razr1993 в разделе СПК1хх
    Ответов: 1
    Последнее сообщение: 07.10.2014, 09:18
  3. СПК 107 и retain
    от Туман в разделе СПК1хх
    Ответов: 7
    Последнее сообщение: 24.08.2014, 21:14
  4. Проблема с СПК 107
    от KSergey в разделе СПК1хх
    Ответов: 8
    Последнее сообщение: 04.07.2014, 06:38

Ваши права

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