Я думаю, что без функций, которые сохраняет контекст в ОЗУ по абсолютным адресам и делают восстановление контекста не обойтись.
Владимир, а оформить этот код в виде функции, которая тупо переписывает регистры туда-сюда нельзя ?
Последний раз редактировалось IVM; 29.01.2018 в 12:17.
Может получится добавить команду для сохранения и загрузки переменных, относящихся к ФБ в память.
Ну, что-нибудь в духе
Переменные для обмена всё-равно придётся в двойном количестве создавать и вручную присваивать. Но LOAD/STORE сделать, наверное, можно.Код:stepper: PRU_STEPPER; ... LOAD stepper, 1000; (* восстанавливаем состояние stepper из памяти по адресу 1000 *) stepper.enable := enable1; (* передаём актуальные входные данные *) stepper.quantity := quantity1; stepper(); (* вызваем *) STORE stepper1, 1000; (* сохраняем значение stepper в память по адресу 1000 *) q1 := stepper.Q; (* читаем результат *) state1 := stepper.state;
Владимир, можно в Hardella оставить ФБ STEPPER и сделать на его базе ФБ STEPPER_M, в котором accel_ramp и decel_ramp объявить как DWORD и поправить расчеты если это действительно нужно. Я думаю Hardella от этого только выиграет.
Последний раз редактировалось IVM; 29.01.2018 в 13:49.
Привет всем!
Решил попробовать покрутить ШД. Скачал pru_stepper_v12.zip, создал простенькую программку - работает.
Скачал Hardella IDE 1.7.2, скомпилил предлагаемый проект для ШД, загрузил файлы и библиотеки - не работает. Попытался покопать: понял, что Pru0.prg это просто пустышка, резервирующая место под реальный код, который загружается из SteppersConfig_Pru0Init(). Но у меня сложилось впечатление, что в Init код для Pru0 неправильный - например сразу после его загрузки значение state принимает недопустимое значение и никак не меняется, и вообще всы выходные и внутренние переменные не меняются...
Это я что-то делаю не так или что-то не так в Hardella IDE?
Пробовал по разному, в том числе и код из примера https://hardella.com/docs/pru/examples/step-motor/
Вот скриншоты одного из вариантов:
На этой картинке виден код, нажато только "Подключение"
pru0-1.png
обратите внимание на state.
Теперь нажал "Старт
pru0-2.png
state становится "инвалидным" сразу после выполнения SteppersConfig_Pru0Init(), пробовал в пошаговом режиме.
После этого перестаёт работать и закоментированный код вверху (коментами я переключаю варианты), пока не перезапустишь контроллер. Т.е. SteppersConfig_Pru0Init() заменяет код PRU0.prg в контроллере нерабочим, а после перезапуска рабочий код PRU0.prg восстанавливается из flash.
Последний раз редактировалось UAVpilot; 05.02.2018 в 23:48.
Это как? Pru0Init меняет значение переменной из другой программы? Такого вообще не должно быть.
Значение STEPPER_PRU0_stepper_state меняется только в программе SteppersConfig_Pru0MemoryRead, и до вызова этой программы значение меняться никак не должно.
Технически, оборачивать вызов SteppersConfig_Pru0Init в "if init" смысла нет. В Init точно заходит? Судя по картинкам, конечно, заходит.
Но, лучше бы просто вызывали SteppersConfig_Pru0Init() и всего делов.
Можете выложить КДС проект?
Ну, т.е. который не работает в режиме: "перезагрузили ПЛК, заливаем проект".
Непонятно что значит "перестаёт работать". Вряд ли что-то хорошее получится, если выполнить SteppersConfig_Pru0Init, а потом пытаться работать через pru_stepper_v12. Как-никак это разный код и работать не будет.
По-хорошему, заливаем через SteppersConfig_Pru0Init(), и потом запускаем через SteppersConfig_Pru0MemoryWrite(...)
Проверил на своём ПЛК -- эффекта с неверным значением state не возникает. Может, зависит от того, что у вас настроено в PLC configuration?
Вот что у меня:
Снимок экрана 2018-02-11 в 17.42.28.png
Уже после нажатия run. Ещё я в начало SteppersConfig_Pru0MemoryRead добавил lastReadOk := TRUE (на работу не влияет, но это по-хорошему, сбрасывать в true нужно):
Снимок экрана 2018-02-11 в 17.43.07.png
Пробовал как с PRU0.prg из состава pru_stepper_v12, так и и тот PRU0.prg, который генерирует Hardella 1.7.2.
В обоих случаях STEPPER_PRU0_stepper_state остаётся в состоянии INIT.
Ну и добавил memorywrite -- импульсы побежали, выход FDO3 замигал:
Снимок экрана 2018-02-11 в 18.01.21.png
Это похоже на чей-то глюк. Удалил из ПЛК PRU0.prg, сделал заводской сброс, залил PRU0.prg в ПЛК - и всё заработало как и положено...
До этого пробовал поотдельности перезаливать PRU0.prg или делать заводской сброс - не помогало. Причём это самый первый проект на этом экземпляре контроллера после его покупки.
Благодарю за помощь!