Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 11 по 20 из 32

Тема: Работа с массивами

  1. #11
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Опаньки ...


    Спор ни о чем. Вычислите адрес массива один раз при старте контроллера и используйте эту переменную. Почти константа.

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

    Вечером выложу свои результаты тестов SysMemLib.

  2. #12

    По умолчанию

    Вот мой тест , разница по времени более чем на порядок, чего и следовало ожидать.
    Вложения Вложения

  3. #13

    По умолчанию

    Передача 32767 байт в цикле -100 мс, через SysMemSet - 7 мс.

  4. #14

    По умолчанию

    Эмулятор не показатель, а в PLCWinNT оба варианта дают менее 1 мс

  5. #15
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от Логвиненко Андрей Посмотреть сообщение
    Эмулятор не показатель
    SysMemLib это внешняя библиотека. А внешние библиотеки не работают на эмуляторе.

  6. #16
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    Lightbulb

    Мой тест

    Методика:
    Код выполнялся в PLCWinNT v2.4 в freeweeling задаче с отключенным watchdog таймером.
    Измерялась длительность одного цикла задачи таймером TON.
    Измерения повторялись несколько раз. Разброс результатов 2-5%.

    Область объявлений:
    Код:
    VAR CONSTANT
    	MAX_ELEMENT: INT := 32000;
    	ITERATIONS_NUMBER: INT:=10000;
    END_VAR
    VAR
    	destination: ARRAY [0..MAX_ELEMENT] OF BYTE;
    	destinationPtr: POINTER TO BYTE;
    
    	sourcePtr: POINTER TO BYTE;
    	source: ARRAY [0..MAX_ELEMENT] OF BYTE := 8, MAX_ELEMENT(8);
    	
    	i: INT;
    	j: UDINT;
    END_VAR

    Код №1. Используется SysMemLib.
    Время выполнения 78 мс.
    Код:
    FOR j:= 1 TO ITERATIONS_NUMBER DO
    	SysMemMove(dwDest:=ADR(destination), 
    	dwSrc:=ADR(source), dwCount:=MAX_ELEMENT+1);
    END_FOR
    Код №2. Используется косвенная адрессация через указатели
    Время выполнения 7856 мс.
    Код:
    FOR j:= 1 TO ITERATIONS_NUMBER DO
    	sourcePtr:= ADR(source);
    	destinationPtr:= ADR(destination);
    	FOR i:= 0 TO MAX_ELEMENT DO
    		destinationPtr^ := sourcePtr^;
    		destinationPtr := destinationPtr+1;
    		sourcePtr:=sourcePtr+1;
    	END_FOR
    END_FOR
    Код №3. Используется адресация по индексу в массиве
    Время выполнения 3860 мс.
    Код:
    FOR j:= 1 TO ITERATIONS_NUMBER DO
    	FOR i:= 0 TO MAX_ELEMENT DO
    		destination[i] := source[i];
    	END_FOR
    END_FOR
    Цикл по j во всех вариантах добавлен для увеличения точности измерения.

    Комментарии и критика "чистоты эксперимента" приветствуются.

  7. #17
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Вот проект с тестом
    Вложения Вложения

  8. #18

    По умолчанию

    SysMemLib это внешняя библиотека. А внешние библиотеки не работают на эмуляторе.
    И я про это, только термины Вы попутали:
    Порядок программирования контроллеров семейства ПЛК1хх (ПЛК100, ПЛК150, ПЛК154, ПЛК110):
    External Library (внутренние библиотеки) – это библиотеки, исполняемый код которых содержится в ядре внутреннего программного обеспечения контроллера. Это, как правило, системные библиотеки, реализовывающие связь со встроенным оборудованием контроллера или библиотеки специального назначения. Данные библиотеки не могут использоваться в режиме эмуляции. Внутренние библиотеки создает производитель контроллера и компания 3S Software – создатель среды CoDeSys. Их список не может быть расширен потребителем.
    Мой тест...
    А на ПЛК не пробовали?
    Последний раз редактировалось Логвиненко Андрей; 23.06.2011 в 22:21.

  9. #19
    Пользователь
    Регистрация
    10.05.2011
    Адрес
    Харьков
    Сообщений
    21

    По умолчанию

    Цитата Сообщение от Логвиненко Андрей Посмотреть сообщение
    И я про это, только термины Вы попутали
    Это не я попутал, это переводчики пролога попутали
    External Library - внешняя библиотека (а не внутренняя).

    Цитата Сообщение от Логвиненко Андрей Посмотреть сообщение
    А на ПЛК не пробовали?
    Нет. В настоящее время у меня нет доступа к ПЛК.

  10. #20

    По умолчанию

    Спасибо за подробное обсуждение вопроса!
    Я где то в глубине разума подозревал, что это можно сделать быстрее чем в цикле, потому и задал вопрос!
    Вот только до нужной библиотеки не дошел!
    Спасибо всем участникам спора, ибо в споре рождается истина, вследствии более детального изучения проблемы!

Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Ваши права

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