Добавлено: Ср 24 Сен, 2008 6:01:36 Заголовок сообщения: Оптимизация времени выполнения
Процессор SLC 5/04
Среда RSLogix 500
Задача:
Есть некий массив (N10:0-127).
Необходимо отследить изменение в нем любого бита,
и вычислить соответствующие номер слова и номер бита.
Каждый проход программы достаточно находить один изменившийся бит.
Минимизировать время одного прохода программы (хотя бы в режиме когда изменений небыло).
Мое решение:
Создал другой массив (N11:0-127) в который сохранял все найденные изменения в N10.
Находил сначала изменившееся слово - сравнивая N10 и N11 по слову, в случее их не равенства переходил на поиск изменившегося бита в найденном слове.
Код:
Если N10:0 <> N11:0, то "номер слова" = 0, и переход на поиск бита
Если N10:1 <> N11:1, то "номер слова" = 1, и переход на поиск бита
....
Если N10:127 <> N11:127, то "номер слова" = 127, и переход на поиск бита
выход из п/п
Поиск бита: ...
...
выход из п/п
Вопрос как можно еще более ускорить поиск изменений. А особенно их отсутствие, чтобы не теряя времени переходить к другим задачам. Есть ли какие-нибудь стандартные операторы для этого.
Добавлено: Ср 24 Сен, 2008 7:46:10 Заголовок сообщения: Re: Оптимизация времени выполнения
BuNi писал(а):
Процессор SLC 5/04
.....
Вопрос как можно еще более ускорить поиск изменений. А особенно их отсутствие, чтобы не теряя времени переходить к другим задачам. Есть ли какие-нибудь стандартные операторы для этого.
Есть, но не в SLC.
Для условия:
BuNi писал(а):
Каждый проход программы достаточно находить один изменившийся бит.
Вводи переменную: номер бита.
И примени косвенную адресацию бита (может придется перейти на тип данных B).
Сравние делай командой MEQ, в маски имей один бит полученный из счетчика битов.
Если помошь нужна кодом - давай свой e-mail.
Сравние делай командой MEQ, в маски имей один бит полученный из счетчика битов.
Не понял что за "счетчик битов"
Предлогается при поиске бита проверять в цикле все биты слова?
В связи с необходимостью оптимизации времени я отказался от циклов, т.к. например при раскрытии цикла поиска слова вида
Код:
i=0
next: Если #N10:0<>#N11:0, то переход к поиску бита
i=i+1
Если i<=127, то переход к next
иначе выход из п/п
поиск бита:
...
выход из п/п
(i - индексный регистр S:24)
в режиме отсутствия изменений (выполнена последовательная проверка всех слов) удалось уменьшить время прохода одного цикла программы с 20 до 8 мс
Поиск бита я также расписал побитно внутри найденого слова.
Каждый проход программы достаточно находить один изменившийся бит.
То есть нашел изменение одного бита, а остальные проверит в след. цикле.
Скорость будет больше если поверять диапазон N7:0-127 как можно большими кусками(, а затем переходить на проверку меньшей части)
Если проверять побитно, то в одном цикле программа выполнит минимум 128*16 операций.
Если по слову, то в одном цикле программа выполнит минимум 128*1 операций.
В идеале одна операция сранивающая два массива и отвечающая идентичны ли они.
Это все при условии что изменений не было, самый частый и самый длительный режим!
Или надо найти первый изменившийся бит, а остальные потом?
Именно. Если изменение есть, то оно должно быть найдено в том же скане.
Реакция на изменение должна быть также минимальна (далее будет соответствуящая обработка найденного изменения и его индикация).
Сейчас по полученному опыту оптимизации этой п/п, оптимизирую другие выполняющиеся также постоянно, в каждом цикле.
Или надо найти первый изменившийся бит, а остальные потом?
Именно. Если изменение есть, то оно должно быть найдено в том же скане.
Это меняет суть дела.
Для скорости надо заменить SLC на что-то из Logix - там это делается одной командой и процессор шустрее.
Из опыта работы с PLC-5 - файловые команды медленные, но при этом увеличивают время скана незаметно (многопроцессорная система).
"Мы создаем себе трудности, чтобы потом их героически преодолевать".
Озвучил Леонид Марков в фильме "Коней на переправе не меняют"
К чему эта фраза?
Не зная конечной цели трудно предложить оптимальное решение.
Циклы в контроллерах вред. На этом форуме уже было обсуждение про время реакции - автор потом сознался, что у него был цикл, но те кто пытался ему помочь даже представить себе не могли, что у него цикл.
А команды JMP не должно быть, т.к. от нее может быть вред даже при переходах вперед.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
Smart Solutions VDT GmbH | Friedrich-List-Allee 38, D-41844 Wegberg-Wildenrath, Germany Tel.: +49 2432 933 57 83 | e-Mail: office@vdt-solutions.de Все товарные знаки и торговые марки являются собственностью их владельцев.
При использовании материалов сайта ссылка на данный сайт обязательна. Открытие страницы: 0.138 секунды