В КДС3 (начиная с SP8) можно так (естественно, только для VAR_INPUT и VAR_IN_OUT):
30-03-2017 15-45-21.png
В КДС3 (начиная с SP8) можно так (естественно, только для VAR_INPUT и VAR_IN_OUT):
30-03-2017 15-45-21.png
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk
как то так:
FUNCTION_BLOCK FB
VAR_INPUT
In : POINTER TO STRING;
Sz: byte;
END_VAR
VAR
str: STRING;
END_VAR
где то в прграмме:
FB( In := adr( myArray1[0] ), Sz := 2 );
А это где то в теле FB:
можно в цикле от нуля до Sz
str := In^ - это myArray1[0];
In := In + sizeof( str ); (* теперь str := In^ - это myArray1[1]; *)
Короче 3 меня массив это анимация фонтана. Каждый элемент массива это струтура кторая хранит время, начальную точку, конечную точку, тип линейности и время паузы по достижении.
На фонтане 3 контура. Например пока один кнтур за 3 цикла поднимает от 0 до 100, другой контур 3 раза поднимает от 0 до 100 за это время. Значит в массиве первого контура один элемент, а в массиве второго контура 3 элемента.
Блок который это обрабатывает один и тот же. Вот в чем проблема. Если я сделал.
pt : POINTER TO ARRAY[0..99] OF Point_GR;
то и передать мне нужно будет массив с [0..99]. А как? ведь у меня разные длинны массива для каждого контура? Мне чтоделать разные копии блоков для этого? Но ведь я всегда могу добавить новые элементы для дополнительных узоров анимации, и что потом переделывать блоки?
Короче сейчас я делал так. Я передаю в блок просто номер программы. Массивы программы я сделал глобальными, а уже в нутри блока я использую CASE что бы обращаться к нужному массиву.
Пока так. Это вроде работает но мне кажется должен быть более элегантный способ решит эту задачу.
Как Вы смотрели пример http://www.owen.ru/forum/showthread....l=1#post242495
В функцииСам массив структур передается в функцию через указатель, по этому вызывать ее нужно так
MyGraf_p(IN, ADR(Имя_Массива), SIZEOF(Имя_Массива))
pt : POINTER TO ARRAY[0..99] OF Point_GR;
Это максимальное количество! Реальное количество определяется при вызове параметром SIZEOF(Имя_Массива)
в моем примере - это первая строка функции
N:= SHR(size,3)-1; (*Число точек в графике*)
В примере есть вызов функции для графиков с разным количеством точек, например 50 точек
VAR
GR: ARRAY [0..49] OF Point_GR:=
(X:=0, Y:=15),(X:=3, Y:=25),(X:=4, Y:=45),(X:=8, Y:=75),(X:=15, Y:=45),
(X:=16, Y:=45),(X:=20, Y:=65),(X:=22, Y:=75),(X:=40, Y:=95),(X:=50, Y:=105),
(X:=110, Y:=15),(X:=120, Y:=25),(X:=130, Y:=45),(X:=140, Y:=75),(X:=150, Y:=45),
(X:=160, Y:=45),(X:=200, Y:=65),(X:=220, Y:=75),(X:=240, Y:=95),(X:=250, Y:=305),
(X:=301, Y:=15),(X:=305, Y:=25),(X:=324, Y:=45),(X:=380, Y:=75),(X:=415, Y:=45),
(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),
(X:=511, Y:=15),(X:=515, Y:=25),(X:=524, Y:=45),(X:=580, Y:=75),(X:=615, Y:=45),
(X:=416, Y:=45),(X:=420, Y:=65),(X:=422, Y:=75),(X:=440, Y:=495),(X:=450, Y:=505),
(X:=621, Y:=15),(X:=625, Y:=25),(X:=634, Y:=45),(X:=680, Y:=75),(X:=695, Y:=45),
(X:=676, Y:=45),(X:=680, Y:=65),(X:=692, Y:=75),(X:=740, Y:=495),(X:=750, Y:=505);
IN: REAL;
OUT: REAL;
END_VAR
Вызов функции
OUT:=MyGraf_p(IN, ADR(GR), SIZEOF(GR));
Последний раз редактировалось petera; 31.03.2017 в 09:28.
Мой канал на ютубе
https://www.youtube.com/c/ПетрАртюков
Мой канал на РУТУБЕ
https://rutube.ru/channel/23641433/
Библиотека ГМ для СП300
https://disk.yandex.com/d/gHLMhLi8x1_HBg
Список - это определяемый пользователем тип данных под названием "перечисление". Посмотрите в документации "Руководство пользователя по программированию ПЛК в CODESYS" (файл CoDeSys_V23_RU.pdf стр. 334) на диске, который идет с ПЛК или на сайте Овена.
Короче вчера все переписал. Спасибо. Поинтеры работают отлично. А вот как в моем случае использовать перечисления или как Валенок написал списки, я так и не понял.
Понятно. Я вообщем то программист. Хотя и вышел и прикладного программирования. В КДС программирую пару лет. Знаю пяток языков.
Но у меня все еще вопрос что такое списки? На что вы ссылаетесь по этим термином? Думаете я не погуглил по теме списков и КДС? Нет, я погуглил, но ни чего не нашел. Этот термин мне ни о чем не говорит уж извините меня. В КДС есть структуры, есть массивы но списков я не нашел.
Приведите пример хоть как декларировать список в ST? Что за тип данных? Или хотя бы скажите английский термен который используется для этого. По слову list ни чего нет.
Если вы ссылаетесь в общем на концепт программирования или метод структоризации, то покажите как его реализовать в среде ST.
Спасибо.
Спасибо. Речь идет о перечеслениях. Я понял. Не сразу понял что вы называете списком.
К сожалению я не вижу как я могу заменить свой массив "списком". Вот что у меня. Печатаю без копи\вставить так что могут быть ошибки.
Теперь я объявляю глобальную переменную.Код:TYPE RepCyc STRUCT from:INT; to:int; ease:STRING; pause:INT; cycle:INT; END_STRUCT
И так далее. Где каждый элемент массива это задача как себя поведет фонтан от цикла к циклу.Код:VAR glbAnimationWave: ARRAY[1..5] OR RepCyc := (from:=20, to:=80, ease:='easeInCubic', pause:=2, cycle:=2)....... END_VAR
Перечесления же с другой стороны это
Хотя я понял о чем идет речь в смысле списков, можете мне посоветовать как мне оптимально их использовать в моей задаче?Перечисление - это определяемый пользователем тип данных, задающий несколько строковых псевдонимов для числовых констант.