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

Тема: Стек, динамический массив в ПЛК, Codesys

  1. #1

    По умолчанию Стек, динамический массив в ПЛК, Codesys

    Добрый день. Необходим совет.
    Хочется считывать значения с датчика в динамический массив типа стек или очередь (в конец массива вставил новый элемент, с начала 1 удалил), для последующего усреднения. Как бы это аккуратно и безболезненно организовать?

  2. #2
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    Через цикл FOR.
    По команде, к примеру когда новое значение не равно старому, запускаете цикл и присваиваете значения от предпоследнего к последнему и...до верха.

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

    По умолчанию

    Цитата Сообщение от Frayl Посмотреть сообщение
    Добрый день. Необходим совет.
    Хочется считывать значения с датчика в динамический массив типа стек или очередь (в конец массива вставил новый элемент, с начала 1 удалил), для последующего усреднения. Как бы это аккуратно и безболезненно организовать?
    Обращайтесь к библиотеке oscat, в папке Logic\memory есть реализации и стека и "певый вошел первый вышел"

  4. #4

    По умолчанию

    Рабочая схема. Только немного неудобно цикл в цикле делать. Вроде бы попроще нашел. Может пригодится кому (или покритикует).
    PROGRAM PLC_PRG
    VAR
    ar:ARRAY[1..10]OF BYTE:=0,1,2,3,4,5,6,7,8,9;
    i:BYTE:=10;
    END_VAR
    SysMemMove(dwDest:=ADR(ar[1]),dwSrc:=ADR(ar[2]), dwCount:=9);
    ar[10]:=i;
    i:=i+1;
    IF i=255 THEN i:=0; END_IF;

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

    По умолчанию

    а разве цикл в цикле работает на ПЛК?

  6. #6

    По умолчанию

    не пробовал. поэтому сделал без FOR

  7. #7
    Пользователь
    Регистрация
    19.06.2009
    Адрес
    Киев
    Сообщений
    120

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    а разве цикл в цикле работает на ПЛК?
    писал, работает! приходилось и дважды цикл вкладывать на ПЛК100!

  8. #8

    По умолчанию

    Если усреднение это простое среднее из 10 то необязательно чтобы в буфере (массиве) они были по порядку. В смысле среднее равно сумме значений в буфере поделенное на их количество. Если так то можно без копирования. Просто затирать в массиве самый "древний" результат.

    PROGRAM PLC_PRG
    VAR
    ar:ARRAY[1..10]OF BYTE:=0,1,2,3,4,5,6,7,8,9;
    nP: INT;
    yNew: BYTE; (* новое значение чего то там *)
    END_VAR

    **********

    nP:= nP + 1;
    IF nP > 10 THEN
    nP := 1;
    END_IF;

    ar[nP] := yNew;
    Последний раз редактировалось lazy; 29.05.2012 в 15:11.

  9. #9

    По умолчанию

    значения новые по времени и идут постоянно по времени опроса датчика. В конкретном случае тензодатчика. Усреднение для понижения шума и вибраций
    предыдущий вариант понравился. Но величина массива нужна переменная. Памяти то можно выделять по переменной.
    Последний раз редактировалось Frayl; 29.05.2012 в 15:39.

  10. #10

    По умолчанию

    В таком случае цикл программы может "покрутиться" несколько раз в то время как значения с датчиков могут оставаться без изменений. Поэтому важно в массив "класть" действительно "новые" значения. Если память нужно выделять "динамически". Попробуйте SysMemAlloc. Но работать придется не с индексами массива а с "указателем" на выделенную память.

    dwBuffer: POINTER TO BYTE (* буфер *)
    dwPointer: POINTER TO BYTE; (* указатель на текщее значение в буфере *)
    dwSize: DWORD; (* размер буфера *)
    yNew: BYTE; (* новое!!! значение с датчиков *)
    bInit: BOOL;

    *****************

    IF NOT bInit THEN

    dwBuffer:= SysMemAlloc ( dwSize + 1 ); (* + 1 на всякий случай *)
    dwPointer := dwBuffer;
    bInit := TRUE;

    ELSE

    IF (* если пришло новое значение *) THEN

    dwPointer^ := yNew;

    dwPointer := dwPointer + 1;
    IF dwPointer > dwBuffer + dwSize THEN
    dwPointer := dwBuffer;
    END_IF;

    END_IF;

    END_IF;

    как то так. но нужно протестить. ) в кодесисе не запускал.
    А можно заранее объявить массив размером с наибольший разумный буфер. Но пользоваться лишь его частью. Типа динамически ))
    Последний раз редактировалось lazy; 29.05.2012 в 16:44.

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

Похожие темы

  1. Не работает "Динамический текст" (Dynamic texsts)
    от Солнечный заяц в разделе СПК1хх
    Ответов: 13
    Последнее сообщение: 25.03.2014, 15:36
  2. Входные переменные в массив
    от kuguar в разделе ПЛК1хх
    Ответов: 12
    Последнее сообщение: 06.06.2011, 09:25
  3. массив не помещается....
    от Дмитрий Артюховский в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 04.12.2010, 12:50
  4. массив
    от freak в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 01.07.2010, 03:14
  5. Узнать динамический Ip
    от Zjrin Alexandr в разделе ПЛК1хх
    Ответов: 7
    Последнее сообщение: 26.03.2010, 13:23

Ваши права

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