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

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

  1. #1

    По умолчанию Работа с массивами

    Как обнулить значения всех элементов массива без циклов?
    Как присвоить массиву из 100 элементов, значения двух массивов по 50 элементов, подряд?

  2. #2

    По умолчанию

    Посмотрите библиотеку SysLibMem.

  3. #3

    Thumbs up

    Цитата Сообщение от Леонид Посмотреть сообщение
    Как обнулить значения всех элементов массива без циклов?
    Как присвоить массиву из 100 элементов, значения двух массивов по 50 элементов, подряд?
    Необходимо учиться работать с памятью и указателями.
    Если это непосильно сложно, то все просто:

    Код:
    FOR i:=0 to 99 do
     if i <50 then
      a[i]:=b[i];
     else
      a[i]:=c[i-50];
     END_IF
    END_FOR
    где а - ваш массив, b и с два других.

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

    По умолчанию

    Цитата Сообщение от Леонид Посмотреть сообщение
    Как обнулить значения всех элементов массива без циклов?
    Функцией SysMemSet из библиотеки SysLibMem.

    Код:
    myArray: ARRAY [0..100] OF REAL;
    
    SysMemSet(dwDest:=ADR(myArray), bCharacter:= 0, dwCount:= SIZEOF(myArray));
    Цитата Сообщение от Леонид Посмотреть сообщение
    Как присвоить массиву из 100 элементов, значения двух массивов по 50 элементов, подряд?
    Двумя вызовами функции SysMemMove из библиотеки SysLibMem. По аналогии с примером выше.
    Подсказка: для второго вызова SysMemMove параметр dwDest равен ADR(myArray) + SIZEOF(Array_50_1)

    2 Предыдущим ораторам:
    Описание указателей в CodeSys и библиотеки SysLibMem настолько скудное, что складывается впечатление, что разработчики CodeSys ненавидят программистов ПЛК.
    Последний раз редактировалось Serge_UA; 23.06.2011 в 19:07. Причина: исправил опечатку

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    А вот другие немецкие разработчики (oscat) предлагают неплохой набор функций по работе с массивами
    ...реализованных на циклах и поэтому в десятки-сотни раз медленней, чем аналоги на SysMemLib

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Да уж и не докажешь что SysLibMem использует тоже цикл, да и ADR вместе с SIZEOF тоже без них необходятся. А чем кстати проверяли время в обоих случаях или чисто теория
    Проверял экспериментально в PLCWinNT. Я уверен что SysLibMem написана не на ST, поэтому " ADR вместе с SIZEOF" он точно не использует
    Написана либо на ассемблере, либо на С. Но "местные" вам точнее скажут

  7. #7

    По умолчанию

    Справка CoDeSys:
    Системные библиотеки дают доступ к специализированным и низкоуровневым функциям контроллера. Набор доступных библиотек зависит от аппаратной платформы.
    Я это понимаю так, что системные библиотеки реализованы в непосредственно в прошивке контроллера, открыв библиотеку в CoDeSys мы видим только раздел объявлений входных и выходных переменных, никакого ST нет и в помине.

  8. #8

    По умолчанию

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

  9. #9

    По умолчанию

    Для корректной работы необходимо прежде всего представлять последствия действий, связанных с применением системных функций, а также при работе с указателями и прямой адресацией.
    если бы мне предоставили те внутренние инструменты которыми оснащена эта библиотека
    Пожалуйста:
    SysLibMem- разрушение данных и программы в ОЗУ, зависание контроллера из-за нарушения выравнивания данных.
    SysLibFile - искажение или уничтожение системных файлов, загрузочного файла проекта, разрушение файловой системы контроллера вплоть до выхода из строя flash-памяти.
    SysLibCom - нарушение связи с внешними устройствами , подключенными в конфигураторе через COM-порты.
    Последний раз редактировалось Логвиненко Андрей; 23.06.2011 в 14:20.

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

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    Если бы dwDist и dwCount присваивались константы, то конечно, но на их вход подаются функции о которых я писал, выходит что участвуют.
    Это, извините, отмазка . Никто вам не запрещает присваивать этим параметрам константы, особенно параметру dwCount.
    Цитата Сообщение от capzap Посмотреть сообщение
    В любом случае, даже если это не так, циклы всеравно существуют
    Согласен, ведь процессор 32-разрядный и за один такт оперирует всего 4-мя байтами . Думаю в процессоре существуют аппаратные средства для копирования блоков памяти, обращение к которым осуществляется через инструкции процессора, доступ к которым в CodeSys реализован через обсуждаемую библиотеку. Например, тот же самый DMA.

    Цитата Сообщение от Логвиненко Андрей Посмотреть сообщение
    Все зависит от оптимальности кода, сгенерированого компилятором.
    Чесно говоря, не вижу, как можно оптимизировать один простой цикл так, чтобы увеличить производительность на несколько порядков.

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

Ваши права

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