PDA

Просмотр полной версии : VisuStructPoint (структура для точек многоугольника)



serg28serg
10.03.2015, 22:18
СПК107
нужно менять позиции точек многоугольника на экране
в хелпе есть, свойства элементов визуализации
Динамические значения (для элементов с несколькими позиционными точками: pPointArray, Count)
создаю по примеру
pPoints : POINTER TO ARRAY[0..100] OF VisuStructPoint;
создаю конечно структуру
VisuStructPoint

а состав структуры ни где не описан в хелпе
как описать структуру что бы Многоугольник брал координаты точек из неё ?

Yegor
11.03.2015, 06:54
Хелп написан диверсантами. Структура VisuStructPoint определена в библиотеке CmpVisuHandler. Добавляете эту либу, затем в PLC_PRG пишете что-нибудь типа
VAR
polyline: ARRAY [0..2] OF VisuStructPoint;
polylen: INT := 3;
END_VAR

polyline[0].iX := 0;
polyline[0].iY := 0;

polyline[1].iX := 10;
polyline[1].iY := 20;

polyline[2].iX := 20;
polyline[2].iY := 10;У элемента параметр Array of points делаете ADR(PLC_PRG.polyline), параметр Number of points ставите PLC_PRG.polylen, и получаете в верхнем левом углу визуализации закорючку.

serg28serg
11.03.2015, 19:24
Добавляете эту либу, затем в PLC_PRG пишете что-нибудь типа.
спасибо , так заработало

в пределах этого "резинового" многоугольника надо поместить например маленький элементик типа круг который медленно ползает в разных направлениях

есть какая либо-функция которая следит вышел кружок за рамки многоугольника или в пределах.

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

GoodLuck
02.07.2015, 13:23
Хелп написан диверсантами. Структура VisuStructPoint определена в библиотеке CmpVisuHandler. Добавляете эту либу, затем в PLC_PRG пишете что-нибудь типа
VAR
polyline: ARRAY [0..2] OF VisuStructPoint;
polylen: INT := 3;
END_VAR

polyline[0].iX := 0;
polyline[0].iY := 0;

polyline[1].iX := 10;
polyline[1].iY := 20;

polyline[2].iX := 20;
polyline[2].iY := 10;У элемента параметр Array of points делаете ADR(PLC_PRG.polyline), параметр Number of points ставите PLC_PRG.polylen, и получаете в верхнем левом углу визуализации закорючку.

Делаю все, как написал Yegor, но почему-то не получается. Многоугольник координат своих не меняет. Подскажите, пожалуйста, что не так?

Евгений Кислов
02.07.2015, 13:33
Делаю все, как написал Yegor, но почему-то не получается. Многоугольник координат своих не меняет. Подскажите, пожалуйста, что не так?

По-моему, у вас библиотека VisuElem3DPath не подцепилась. Удалите и добавьте ее снова, лучше версию 3.5.6.0.

Сергей_Сарапул
09.11.2015, 14:16
Работает, только у меня при объявлении потребовало записи вида "OF VisuElems.VisuStructPoint"

viktor__
10.11.2015, 07:53
По-моему, у вас библиотека VisuElem3DPath не подцепилась. Удалите и добавьте ее снова, лучше версию 3.5.6.0.
А где-ж ее взять-то эту либу (3.5.6.0)?!
У меня вообще ничего не работает! При этом заметил, что если записать в поля динамических точек всякую чушь - компилятор кушает и не давится... и рисовать них...а не хочет!

Евгений Кислов
10.11.2015, 07:55
А где-ж ее взять-то эту либу (3.5.6.0)?!
У меня вообще ничего не работает! При этом заметил, что если записать в поля динамических точек всякую чушь - компилятор кушает и не давится... и рисовать них...а не хочет!

Она входит в состав CODESYS 3.5 SP6. Но конкретно вам она вряд ли нужна - используйте библиотеку CmpVisuHandler.

viktor__
10.11.2015, 10:36
Она входит в состав CODESYS 3.5 SP6. Но конкретно вам она вряд ли нужна - используйте библиотеку CmpVisuHandler.

... :confused:наверное я схожу с ума... библиотека CmpVisuHandler добавлена. По крайней мере компилятор на VisuStructPoint не ругается. Вот код:
Глобальные переменные (это уже очередная проба, делал и переменные PLC_PRG):

VAR_GLOBAL
ptr_line: POINTER TO ARRAY[0..2] OF VisuStructPoint;
cnt_p: INT;
END_VAR


PROGRAM PLC_PRG
VAR
line: ARRAY[0..2] OF VisuStructPoint;
init: BOOL;
END_VAR

IF init THEN
;
ELSE
cnt_p := 3;

ptr_line := ADR(line);

line[0].iX := 100;
line[0].iY := 100;

line[1].iX := 200;
line[1].iY := 200;

line[2].iX := 400;
line[2].iY := 400;

init := TRUE;
END_IF

Создал визуализацию (проект для СПКх... (у меня 110)), разрешение экрана 800х480. Добавил элемент Ломанная, в свойствах
Массив точек: ptr_line
Число точек: cnt_p

Все компилируется, логинится (в режиме эмуляции) Отладка->Старт и... НЕ РАБОТАЕТ!

Евгений Кислов
10.11.2015, 10:51
... :confused:наверное я схожу с ума... библиотека CmpVisuHandler добавлена. По крайней мере компилятор на VisuStructPoint не ругается. Вот код:
Глобальные переменные (это уже очередная проба, делал и переменные PLC_PRG):

VAR_GLOBAL
ptr_line: POINTER TO ARRAY[0..2] OF VisuStructPoint;
cnt_p: INT;
END_VAR


PROGRAM PLC_PRG
VAR
line: ARRAY[0..2] OF VisuStructPoint;
init: BOOL;
END_VAR

IF init THEN
;
ELSE
cnt_p := 3;

ptr_line := ADR(line);

line[0].iX := 100;
line[0].iY := 100;

line[1].iX := 200;
line[1].iY := 200;

line[2].iX := 400;
line[2].iY := 400;

init := TRUE;
END_IF

Создал визуализацию (проект для СПКх... (у меня 110)), разрешение экрана 800х480. Добавил элемент Ломанная, в свойствах
Массив точек: ptr_line
Число точек: cnt_p

Все компилируется, логинится (в режиме эмуляции) Отладка->Старт и... НЕ РАБОТАЕТ!

Я сейчас просто скопировал ваш код в свой проект и запустил на СПК - все отрисовалось.

Не используйте эмуляцию, если нет СПК - проверьте на виртуальном контроллере (см. п. 9.8 документа СПК.FAQ).

GoodLuck
10.11.2015, 11:04
viktor__

у меня ваш код нормально функционирует и в режиме эмуляции тоже.

viktor__
10.11.2015, 11:19
Кажется допер... Перед перерисовкой фигуры нужно ее отключать:
Вот приблизительно так:
en: BOOL. В свойстве фигуры Переменные состояний -> Невидимый: NOT(PLC_PRG.en)
...

а в коде приблизительно так
...
en := false;

for i
line[i].iX := ...;
line[i].iY := ...;
end_for;
en := true;

Так вроде работает и при эмуляции. Доделаю и скину примерчик..

Евгений Кислов
10.11.2015, 11:28
Кажется допер... Перед перерисовкой фигуры нужно ее отключать:
Вот приблизительно так:
en: BOOL. В свойстве фигуры Переменные состояний -> Невидимый: NOT(PLC_PRG.en)
...

а в коде приблизительно так
...
en := false;

for i
line[i].iX := ...;
line[i].iY := ...;
end_for;
en := true;

Так вроде работает и при эмуляции. Доделаю и скину примерчик..

В принципе, отключать необязательно.


https://www.youtube.com/watch?v=cuh3KS0gqxI

viktor__
10.11.2015, 12:25
Вот пример "бешенной синусоиды"
PROGRAM PLC_PRG
VAR
func: ARRAY[0..157] OF VisuStructPoint;
p_cnt: INT;

i: INT;
x, y: REAL;
init: BOOL;

scan, way: INT;
fwd: BOOL;
END_VAR

IF init THEN

IF (scan = 10) THEN

(* Смена направления движения *)
IF (way = 10) THEN
fwd := NOT(fwd);
way := 0;
ELSE
way := way + 1;
END_IF

IF (fwd) THEN
(* Перемещаем на 10 точек вправо *)
FOR i := 0 TO p_cnt - 1 DO
func[i].iX := func[i].iX + 10;
END_FOR
ELSE
(* Перемещаем на 10 точек влево *)
FOR i := 0 TO p_cnt - 1 DO
func[i].iX := func[i].iX - 10;
END_FOR
END_IF

scan := 0;
ELSE
scan := scan + 1;
END_IF

ELSE
p_cnt := 158;

FOR i := 0 TO p_cnt - 1 DO
x := i / 25.0;
y := SIN(x);

func[i].iX := 100 + REAL_TO_INT(x * 100);
func[i].iY := 240 - REAL_TO_INT(y * 100);
END_FOR

fwd := TRUE;
init := TRUE;
END_IF

Все работает в эмуляции, но только если вписать в свойствах "Переменные состояний->Невидимый" что-нибудь. Достаточно даже просто "FALSE", либо переменную, которую при инициализации обнулять ну и т.п. Если этого не сделать то на экране отражается первоначальная закорючка (я использовал кривую Безье). И что самое интересное, этот ... нюанс... ну нигде не обозначен!

GoodLuck
10.11.2015, 13:22
Все работает в эмуляции, но только если вписать в свойствах "Переменные состояний->Невидимый" что-нибудь. Достаточно даже просто "FALSE", либо переменную, которую при инициализации обнулять ну и т.п. Если этого не сделать то на экране отражается первоначальная закорючка (я использовал кривую Безье). И что самое интересное, этот ... нюанс... ну нигде не обозначен!

Не знаю как в других версиях Codesys, но на SP7 все работает и без этих заморочек.