Выполнение 100 000 действий с помощью SMSD-1,5
 

Выполнение 100 000 действий с помощью SMSD-1,5

Автор Didro, 20 мая 2009, 15:14:18

« назад - далее »

Didro

Добрый день!

Мы управляем шаговым двигателем с помощью блока SMSD-1,5.

Необходимо выполнять большое количество одинаковых действий (>100000) вида поворот на 90 градусов влево-право.

В документации к блоку SMSD-1,5 на странице 11 (команда JMP L ddd) сказано, что есть ограничение по количеству повторов одного цикла (не более 255 раз).
В описании команды JMP L ddd сказано: "Выполнить программу от Метки ddd раз, где ddd - max 255".

Мы решили эту проблему вставкой большого количества последовательных циклов (один за другим), но при количестве повторов >4500 (примерно 17 циклов) после загрузки программы в память блок сообщает об ошибке исполнительной программы (диод мигает оранжевым цветом).

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

Вопрос: как решить такую проблему?
Есть предположение, что можно использовать вложенные циклы - поставить одну метку и несколько JMP.

Что скажете?

Спасибо.

Administrator

Скорее всего, слишком большое количество строк израсходовало всю память EEPROM.
А количество циклов для выполнения должно быть четко определено или возможно бесконечное повторение одного и того же цикла?

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

Didro

ЦитироватьСкорее всего, слишком большое количество строк израсходовало всю память EEPROM.
Для того чтобы точно знать, нам бы хотелось знать максимальную допустимую длину (http://www.electroprivod.ru/forums/index.php?topic=246.0) программы.

ЦитироватьА количество циклов для выполнения должно быть четко определено или возможно бесконечное повторение одного и того же цикла?
В идеальном случае четко определено. В компромиссном варианте, хотелось бы иметь возможность знать сколько циклов выполнения сделано на данный момент, чтоб иметь возможность нажать на СБРОС в нужный момент.

ЦитироватьЧтобы выставить бесконечное повторение цикла нужно поставить подряд одну за другой команды "Выполнить от метки ххх раз".
Сейчас программа выглядит след. образом:
LL*MV200*RS*SP3*JP254*JP254*JP254*JP254*JP254*...

Не могли бы вы на примере показать, как можно задать "бесконечное повторение цикла".

Спасибо

Administrator

Цитироватьхотелось знать максимальную допустимую длину программы
Объем памяти - 512байт. Каждая команда - 2 символа + параметры (если требуется). В память записываются только исполнительные команды.
Команды "начало программы" и "Конец программы" в память не записывается.

ЦитироватьВ идеальном случае четко определено. В компромиссном варианте, хотелось бы иметь возможность знать сколько циклов выполнения сделано на данный момент, чтоб иметь возможность нажать на СБРОС в нужный момент.
Нажатие "сброс" в нужный момент не гарантирует четкое число отработанных циклов.
Чтобы количество циклов было четко определено - это должно быть записано программно.

ЦитироватьСейчас программа выглядит след. образом:  LL*MV200*RS*SP3*JP254*JP254*JP254*JP254*JP254*...
Я неверно поняла Ваше предыдущее сообщение, посчитав, что Вы полностью прописываете один цикл за другим. Могу сказать, что блоки SMSD не поддерживают вложенные циклы. Приведенный Вами код никогда не завершится, блок вообще никогда не добрался бы до третьей команды JP254, т.к. зациклился бы на первых двух. Это как раз то, о чем я писала в предыдущем сообщении - поставить  одну за другой две команды *JP254.
Если нужно считать количество отработанных циклов, можно в конце каждого цикла ставить команду "Установить флаг" (SF), а где-нибудь в середине цикла - "снять флаг" (CF). Тогда после каждого цикла блок будет замыкать реле. Если замкнуть его на встроенный источник +5В, можно считать количество сигналов.

Чтобы в одной программе записать больше 255 циклов, их нужно полностью прописывать один за другим: LL*MV200*RS*SP3*JP254*LL*MV200*RS*SP3*JP254*LL*MV200*RS*SP3*JP254*LL*MV200*RS*SP3*JP254*LL*MV200*RS*SP3*JP254*LL*MV200*RS*SP3*JP254* и т.д. - сколько поместится в память блока.

ЦитироватьНе могли бы вы на примере показать, как можно задать "бесконечное повторение цикла".
LL*MV200*RS*SP3*JP254*JP254*

Administrator

#4
Да, приведенный Вами код ошибок не вызывает.
Возможно, Вы забываете в конце программы поставить команду "Завершить загрузку" (ED).

Но, как я уже написала, Ваш код не приведет к выполнению программы требуемое число раз.