PDA

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



Леонид
04.11.2015, 01:32
Главный вопрос - это опрос ПЛК по RS и самое главное изменение значений переменных в плк при вводе с экрана СПК107.
Я так понял что средсвами CDS это никак не реализовано?
Спасибо!

energvk
04.11.2015, 02:06
Средствами CDS реализовано и то и другое

Леонид
04.11.2015, 02:28
Я имею ввиду отправку команды на запись переменной с СПК на ПЛК (Например 110), только в момент изменения ее значения в СПК.

capzap
04.11.2015, 08:33
Я имею ввиду отправку команды на запись переменной с СПК на ПЛК (Например 110), только в момент изменения ее значения в СПК.

событие нажатия может запустить запись регистра в режиме по команде, разве не так?

Сергей0308
05.11.2015, 02:06
Мне представляется как-то так:
20655

P_Ilya
05.11.2015, 14:14
СПК - это не панель оператора. Отсюда и все проблемы.

Надо писать свой код для опроса слейвов, отслеживания изменений переменных и отправки новых значений слейвам. Я на каждый регистр выделяю по два слова: 1) для визуализации (и ввода нового значения оператором); и 2) для получения значения от слейва. После ввода оператором нового значения оно отсылается слейву; до успешной передачи значения слейву игнорирую те значения, которые получаю от слейва.

Илья

energvk
06.11.2015, 02:28
А почему для визуализации не использовать значения от слэйва?

P_Ilya
06.11.2015, 14:10
А почему для визуализации не использовать значения от слэйва?

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

Илья

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

Илья

А как тогда отслеживается, что слэйв изменил значение?

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

P_Ilya
06.11.2015, 18:06
А как тогда отслеживается, что слэйв изменил значение?

Для чего отслеживать изменение значения слейвом? Какое действие, кроме визаулизации, нужно сделать на панели оператора при изменении значения слейвом? (Случай, когда слейв управляет визуализацией не рассматриваем.)

Если мастер занимается управлением и должен отслеживать изменение значений слейвом, то для этого нужно ещё по одной переменной для каждого такого значения.


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

Предложение не понял. Понял только, что есть две переменные. Ну так и у меня по две переменные на каждое значение.

Если вы как-то иначе отслеживаете изменение значений оператором (крутилками, кнопочками и всем прочим, т.е. в общем случае), то было бы интересно об этом узнать.

Илья

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

Илья

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

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

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

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

P_Ilya
20.11.2015, 06:37
Хотелось бы всё же конкретный кейс рассмотреть, где требуется игнорировать не успевшие измениться значения от слейва.Зачем отслеживать новое оно или нет?

Чтобы отправить новое значение слейву. Если использовать только одну переменную, то значение, которое получим от слейва, может затереть то значение, которое ввёл оператор.


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

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


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

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

У вас панели оператора или СПК? В панелях оператора, с которыми я работал, эта сихронизация выполняется на системном уровне. СПК -- это не панель оператора.

Илья

P_Ilya
20.11.2015, 07:01
А может кто знает, как поиметь информацию о удачно завершенном диалоге ввода с цифровой клавиатуры?

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

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

Илья

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

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

20916 20917

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

20918

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

20919

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

20920

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

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

20921

То есть результат ввода запоминается для отправки, потом отправляется вместе с так же запомненной командой и в считанные миллисекунды актуальное значение оказывается в переменной 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В конфигурации ничего хитрого:

20922 20923

P_Ilya
20.11.2015, 08:17
Тут я немного сдамся. Дело в том, что я избегаю таких элементов на главных экранах.

Ну вот! А я то думал! :-)


А главная хитрость в том, что значение из диалога пишется не в ту переменную, которая идёт от слейва, а в другую:
[skip]
То есть результат ввода запоминается для отправки, потом отправляется вместе с так же запомненной командой и в считанные миллисекунды актуальное значение оказывается в переменной heaterSetpoint обеих панелей.

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

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

Илья