Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 21

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

  1. #11

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Была бы возможность передавать статические массивы.
    так передавай, хоть по ссылке хоть через указатель. и во втором. в третьем ввобще ссылки есть как сущность )

    var_in_out
    arr: ARRAY [0..255] OF BYTE; ссылка
    end_var

    var_in_out
    parr: pointer to ARRAY [0..255] OF BYTE; указатель
    end_var

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

  2. #12
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,162

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Была бы возможность передавать статические массивы.[Или это в КДС3 уже сделано?
    В КДС3 (начиная с SP8) можно так (естественно, только для VAR_INPUT и VAR_IN_OUT):

    30-03-2017 15-45-21.png

  3. #13

    По умолчанию

    Цитата Сообщение от lazy Посмотреть сообщение
    так передавай, хоть по ссылке хоть через указатель. и во втором. в третьем ввобще ссылки есть как сущность )
    Не понимаю. Разве можно передать массив так, чтобы "на принимающей стороне" компилятор проверял код и сообщал о выходах за границы массива?

    Цитата Сообщение от lazy Посмотреть сообщение
    кста, не знаю чо будет если в эти переменные скормить массив меньшей длинны. хозяину
    Во во. Я и говорю, что в КДС2 нет возможности сделать блок-обработку массива, который мог бы принимать массивы разных размеров и при этом проверялись границы массива на этапе компиляции.

  4. #14

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    который мог бы принимать массивы разных размеров и при этом проверялись границы массива на этапе компиляции.
    как на этапе компиляции можно знать длину переменного массива? )

    а вообще массив с переменной длинной в кодесисе можно самому сделать.

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

    По умолчанию

    Короче 3 меня массив это анимация фонтана. Каждый элемент массива это струтура кторая хранит время, начальную точку, конечную точку, тип линейности и время паузы по достижении.

    На фонтане 3 контура. Например пока один кнтур за 3 цикла поднимает от 0 до 100, другой контур 3 раза поднимает от 0 до 100 за это время. Значит в массиве первого контура один элемент, а в массиве второго контура 3 элемента.

    Блок который это обрабатывает один и тот же. Вот в чем проблема. Если я сделал.

    pt : POINTER TO ARRAY[0..99] OF Point_GR;

    то и передать мне нужно будет массив с [0..99]. А как? ведь у меня разные длинны массива для каждого контура? Мне чтоделать разные копии блоков для этого? Но ведь я всегда могу добавить новые элементы для дополнительных узоров анимации, и что потом переделывать блоки?

    Короче сейчас я делал так. Я передаю в блок просто номер программы. Массивы программы я сделал глобальными, а уже в нутри блока я использую CASE что бы обращаться к нужному массиву.

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

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

    По умолчанию

    Цитата Сообщение от Serhioromano Посмотреть сообщение
    Короче 3 меня массив это анимация фонтана. Каждый элемент массива это струтура кторая хранит время, начальную точку, конечную точку, тип линейности и время паузы по достижении.

    На фонтане 3 контура. Например пока один кнтур за 3 цикла поднимает от 0 до 100, другой контур 3 раза поднимает от 0 до 100 за это время. Значит в массиве первого контура один элемент, а в массиве второго контура 3 элемента.

    Блок который это обрабатывает один и тот же. Вот в чем проблема. Если я сделал.

    pt : POINTER TO ARRAY[0..99] OF Point_GR;

    то и передать мне нужно будет массив с [0..99]. А как? ведь у меня разные длинны массива для каждого контура? Мне чтоделать разные копии блоков для этого? Но ведь я всегда могу добавить новые элементы для дополнительных узоров анимации, и что потом переделывать блоки?
    Как Вы смотрели пример 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/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

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

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А зачем тут вообще массивы ? Может списки ?
    Как образуются данные ?
    Можно пример списка? Не пойму о чем речь.

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

    По умолчанию

    Понятно. Я вообщем то программист. Хотя и вышел и прикладного программирования. В КДС программирую пару лет. Знаю пяток языков.

    Но у меня все еще вопрос что такое списки? На что вы ссылаетесь по этим термином? Думаете я не погуглил по теме списков и КДС? Нет, я погуглил, но ни чего не нашел. Этот термин мне ни о чем не говорит уж извините меня. В КДС есть структуры, есть массивы но списков я не нашел.

    Приведите пример хоть как декларировать список в ST? Что за тип данных? Или хотя бы скажите английский термен который используется для этого. По слову list ни чего нет.

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

  9. #19
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    357

    По умолчанию

    Список - это определяемый пользователем тип данных под названием "перечисление". Посмотрите в документации "Руководство пользователя по программированию ПЛК в CODESYS" (файл CoDeSys_V23_RU.pdf стр. 334) на диске, который идет с ПЛК или на сайте Овена.

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

    По умолчанию

    Цитата Сообщение от amn Посмотреть сообщение
    Список - это определяемый пользователем тип данных под названием "перечисление". Посмотрите в документации "Руководство пользователя по программированию ПЛК в CODESYS" (файл CoDeSys_V23_RU.pdf стр. 334) на диске, который идет с ПЛК или на сайте Овена.
    Спасибо.

    Цитата Сообщение от Валенок Посмотреть сообщение
    Издеваетесь ?
    function_block item //элемент списка
    var ...
    ... //данные
    var_output
    next : dword; //суть - pointer to item;
    end_var
    -------------
    ... //творим


    пример прогона списка

    var
    list, //сам список
    p : pointer to item; //времянка
    ------------
    p := list;
    while p <> 0 do
    p^( ..., next => p);
    end_while
    Спасибо. Речь идет о перечеслениях. Я понял. Не сразу понял что вы называете списком.

    К сожалению я не вижу как я могу заменить свой массив "списком". Вот что у меня. Печатаю без копи\вставить так что могут быть ошибки.

    Код:
    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
    И так далее. Где каждый элемент массива это задача как себя поведет фонтан от цикла к циклу.

    Перечесления же с другой стороны это

    Перечисление - это определяемый пользователем тип данных, задающий несколько строковых псевдонимов для числовых констант.
    Хотя я понял о чем идет речь в смысле списков, можете мне посоветовать как мне оптимально их использовать в моей задаче?

Страница 2 из 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

Ваши права

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