Сообщение от
IVM
То о чем я писал в предыдущем посте сделать можно ?
Тут 2 варианта:
1) Я могу выкатить версию, которая по-прежнему объединяет все ФБ в одну программу, но которая использует память при нехватке регистров.
Тогда вы сможете поправить ФБ PRU_STEPPER так, чтобы этот блок вызывался в разных PRU циклах на разных данных.
Т.е. примерно так:
Код:
vars
stepper: PRU_STEPPER;
current: BOOL;
quantity1, accel1, decel1, ...: ...; (* данные для 1-го ШД *)
quantity2, accel2, decel2, ...: ...; (* данные для 2-го ШД *)
код:
if current THEN
stepper.quantity := quantity1;
stepper.accel := accel1;
...
ELSE
stepper.quantity := quantity2;
stepper.accel := accel2;
...
end_if;
stepper(); (* обрабатываем данные *)
if current THEN
quantity1 := stepper.quantity; (* запоминаем состояние ФБ, чтобы переиспользовать через цикл *)
end if;
Т.е. запоминать состояние нужно будет вручную, в специально подготовленных переменных
2) Делать поддержку "переиспользования кода ФБ" в самом компиляторе Hardella непросто, т.к. в системе команд PRU "обращение к памяти" может выполняться либо по абсолютному адресу (не подходит, т.к. нам нужно более одного экземпляра ФБ), либо через регистр R0. Вызов процедур -- значит нужен стек, и для обращения к стеку снова придётся использовать этот самый R0. Т.е. нужно продумывать жонглирование регистрами. На первый взгляд, это непростая задача.
Возможно, проще придумать и реализовать работу с массивами, и вынести математическую часть в КДС-код. PRU код станет меньше, точность вычислений повысится, и заодно появится возможность менять параметры хода на ходу.