Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 21

Тема: Как передать массив в функциональный блок если зарание не известно сколько элемнтов

  1. #1
    Пользователь Аватар для Serhioromano
    Регистрация
    15.09.2015
    Адрес
    Бишкек
    Сообщений
    265

    По умолчанию Как передать массив в функциональный блок если зарание не известно сколько элемнтов

    Предположим есть массивы

    Код:
    myArray1 := ARRAY[0..2] OF STRING;
    myArray2 := ARRAY[0..10] OF STRING;
    myArray3 := ARRAY[0..4] OF STRING;
    Конечно же все сложней. Это не строки а структура с многотиповым хранением данных.

    Есть так же универсальный функциональный блок который может их обработать. Он просто в цикле походит по каждому элементу и делает свое дело.

    Когда я поределяю входную переменную мне надо написать

    Код:
    In := ARRAY[0..2] OF STRING;
    И вот тут проблема. я ведь могу туда опустить любой массив а у меня разное количество элементов.

    Как мне сделать так что бы можно было передать массив с любым колличеством элементов?

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    добавляйте а свою структуру некий id, в фб передайте указатель, если у очередного элемента индекс равен нулю, значит массив закончился
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3
    Пользователь Аватар для Serhioromano
    Регистрация
    15.09.2015
    Адрес
    Бишкек
    Сообщений
    265

    По умолчанию

    Нет это понятно. Я могу пройти в цикле неопределенное количество элементов. Это не проблема. Как этот массив передать в FB? Ведь мне нужно декларировать переменную входную или локальную и там указвать зарание количество элементов в массиве, так что как я не передавай, входная переменная должна иметь тоже колличество.

  4. #4
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    массив, это уложенные последовательно в памяти однородные данные, ни какой массив передавать в ФБ я не предлагаю, а рекомендую передавать указатель на тип данных из которых сформирован массив, начиная с начального элемента массива, а далее как угодно, в цикле определяете когда данные закончились или с этим указателем передавайте количество элементов массива. В оскат библиотеке много таких примеров
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #5

    По умолчанию

    Когда работал с файлами, там тоже заранее неизвестно сколько и чего записывать надо обычно. Как советует capzap, то просто дать указатель и работать с ним. Также можно передавать и разнородную структуру. Мне было удобно указатель на байт и sizeof структуры, чтобы определить её границы.

  6. #6
    Пользователь Аватар для Serhioromano
    Регистрация
    15.09.2015
    Адрес
    Бишкек
    Сообщений
    265

    По умолчанию

    Можно примерчик указателя?

  7. #7
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от Serhioromano Посмотреть сообщение
    Можно примерчик указателя?
    Кусочно-линейная аппроксимация http://www.owen.ru/forum/showthread....l=1#post220263
    Код:
    FUNCTION MyGraf_p : REAL
    VAR_INPUT
    	IN: REAL;	(*Входной сигнал*)
    	pt : POINTER TO ARRAY[0..99] OF Point_GR;	(*Массив точек графика, не более 100 пар точек X,Y*)
    	size : UINT;
    END_VAR
    VAR
    	a: INT;	(*Начало интервала поиска*)
    	b: INT;	(*Конец интервала поиска*)
    	N: INT;	(*Число точек в графике*)
    	i: INT;
    END_VAR
    
    N:= SHR(size,3)-1;	(*Число точек в графике*)
    (*Начальные значения интнрвала поиска*)
    a:=0;
    b:=N-1;
    
    (*Обрезание графика для крайних точек*)
    IF IN<=pt^[0].X THEN
    	MyGraf_p:=pt^[0].Y;
    ELSIF IN>=pt^[N-1].X THEN
    	MyGraf_p:=pt^[N-1].Y;
    (*Теперь можно начать поиск*)
    ELSE
    	WHILE (b-a) <> 1 DO (*В конце концов, входной сигнал ТОЧНО попадет между двумя соседними точками X(a) и Х(а+1)*)
    	i:=(a+b)/2;	(*Делим интервал поиска пополам*)
    	IF IN=pt^[i+1].X THEN	(*Может нам повезло, и мы сразу нашли точку? *)
    	a:=i; b:=i+1;			(*Бинго! прекращаем итераций, нечего в пустую молотить :) *)
    	(*мимо :( ,тогда посмотрим в какую половину интервала попали*)
    	ELSIF IN>pt^[i].X THEN	(*Если входной сигнал больше середины интервала поиска,*)
    	a:=i;					 (*то следующий поиск будем делать начиная от середины и до конца массива*)
    	ELSE					(*А если входной сигнал меньше середины интервала поиска,*)
    	b:=i;					 (*то следующий поиск будем делать начиная от начала и до середины массива*)
    	END_IF
    (*Таким образом на каждой итерации отбрасываем из поиска заведомо ненужную половину значений
    две соседние координаты X(a) и Х(а+1), меду которыми попадает входной сигнал найдем очень быстро
    для 8 точек графика нужно не более 3 итераций
    при 9..16 точек в графике нужно не более 4 итераций
    при 17..32 точек в графике нужно не более 5 итераций
    при 33..64 точек в графике нужно не более 6 итераций
    при 65..128 точек в графике нужно не более 7 итераций
    инфа точная - 100% ;) *)
    END_WHILE
    (*Теперь самое простое - сделать линейную аппроксимацию по двум точкам ;) *)
    MyGraf_p:=pt^[b].Y-(pt^[b].X-IN)*(pt^[b].Y-pt^[a].Y)/(pt^[b].X-pt^[a].X);
    END_IF
    Сам массив структур передается в функцию через указатель, по этому вызывать ее нужно так
    MyGraf_p(IN, ADR(Имя_Массива), SIZEOF(Имя_Массива))

    Например
    Код:
    PROGRAM PLC_PRG
    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
    (*ВАЖНО!
    Таблица должна быть обязательно отсортирована по X в порядке возрастания значений.*)
    
    OUT:=MyGraf_p(IN, ADR(GR), SIZEOF(GR));
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  8. #8
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Сам массив структур передается в функцию через указатель, по этому вызывать ее нужно так
    это не совсем то про что я говорю,указатель на объект, из чего состоит массив, а не указатель на массив
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  9. #9

    По умолчанию

    как то так:

    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]; *)

  10. #10

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    это не совсем то про что я говорю,указатель на объект, из чего состоит массив, а не указатель на массив
    Вот интересно. Вроде, должен быть безопасный язык. А чуть что сразу работа с памятью и адресами.
    Была бы возможность передавать статические массивы.
    Или это в КДС3 уже сделано?

Страница 1 из 3 123 ПоследняяПоследняя

Похожие темы

  1. Функциональный блок PID
    от Hemann в разделе Программируемые реле
    Ответов: 78
    Последнее сообщение: 04.05.2017, 08:57
  2. LD + функциональный блок
    от дрю в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 26.04.2014, 09:47
  3. Функциональный блок для МЭ110-224.1М
    от rustam_m в разделе ПЛК3хх
    Ответов: 10
    Последнее сообщение: 10.03.2013, 20:07
  4. Пользовательский функциональный блок
    от fill-forty в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 17.08.2009, 09:49

Ваши права

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