Просмотр полной версии : VisuStructPoint (структура для точек многоугольника)
serg28serg
10.03.2015, 22:18
СПК107
нужно менять позиции точек многоугольника на экране
в хелпе есть, свойства элементов визуализации
Динамические значения (для элементов с несколькими позиционными точками: pPointArray, Count)
создаю по примеру
pPoints : POINTER TO ARRAY[0..100] OF VisuStructPoint;
создаю конечно структуру
VisuStructPoint
а состав структуры ни где не описан в хелпе
как описать структуру что бы Многоугольник брал координаты точек из неё ?
Хелп написан диверсантами. Структура 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 все работает и без этих заморочек.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot