ну это должно быть возможно делать в виде конфигуратора ШД. Что куда подключено + тут же должны добавляться и настраиваться функции PLCOpen motion, и прописываться mapping между PRU и PLC Codesys
Dmitriy Murashov
SPS Software Engineer Automation Engineering RUS
выкладываю свой вариант кода для управления одним ШГ. У меня подключены 4 ШГ у контроллеру - работают нормально. по 2шт одновременно.
(* 1-й верхний*)
IF (state1=STOP_STEPPER OR state1=INIT_STEPPER) AND rungen1=FALSE THEN SetPos_1presHig1:=SetPos_1presHig; oldpos2:=Pos_1presHig; END_IF
IF SetPos_1presHig1<>Pos_1presHig AND rungen1=FALSE THEN
Way1PresHig:=SetPos_1presHig1>Pos_1presHig;
IF SetPos_1presHig>Pos_1presHig AND (state1=INIT_STEPPER OR state1=STOP_STEPPER) THEN
difpos1:=SetPos_1presHig1-Pos_1presHig;
ELSIF SetPos_1presHig1<Pos_1presHig AND (state1=INIT_STEPPER OR state1=STOP_STEPPER) THEN
difpos1:=Pos_1presHig-SetPos_1presHig;
END_IF
Way1PresHigOut:=NOT Way1PresHig;
IF state1=run_stepper OR state1=ACCEL_STEPPER OR state1=DECEL_STEPPER THEN Pos_1presHig:=oldpos2+pos1*BOOL_TO_WORD(Way1Preshi g)-pos1*(BOOL_TO_WORD(NOT Way1PresHig)); END_IF
IF state1=init_STEPPER THEN
rungen2:=TRUE;
END_IF
out1:=4;
ELSE
Way1PresHigout:=FALSE;
END_IF
IF state1=stop_stepper THEN rungen1:=FALSE; rungen2:=FALSE; END_IF
Gen1Hig( ENABLE:=rungen1 OR rungen2 , MIN_SPEED:=0 , MAX_SPEED:=Speed1PresHig , QUANTITY:= difpos1 , ACCEL_RAMP:=2000 , DECEL_RAMP:=2000, OUT_NUM:=out1 , STATE=>state1 , CURRENT_SPEED=> , PULSES_GENERATED=>pos1 );
Вариант использования PRU_Stepper для управления ШГ.
IF (state1=STOP_STEPPER OR state1=INIT_STEPPER) AND rungen1=FALSE THEN SetPos_1presHig1:=SetPos_1presHig; oldpos2:=Pos_1presHig; END_IF
IF SetPos_1presHig1<>Pos_1presHig AND rungen1=FALSE THEN
Way1PresHig:=SetPos_1presHig1>Pos_1presHig;
IF SetPos_1presHig>Pos_1presHig AND (state1=INIT_STEPPER OR state1=STOP_STEPPER) THEN
difpos1:=SetPos_1presHig1-Pos_1presHig;
ELSIF SetPos_1presHig1<Pos_1presHig AND (state1=INIT_STEPPER OR state1=STOP_STEPPER) THEN
difpos1:=Pos_1presHig-SetPos_1presHig;
END_IF
Way1PresHigOut:=NOT Way1PresHig;
IF state1=run_stepper OR state1=ACCEL_STEPPER OR state1=DECEL_STEPPER THEN Pos_1presHig:=oldpos2+pos1*BOOL_TO_WORD(Way1Preshi g)-pos1*(BOOL_TO_WORD(NOT Way1PresHig)); END_IF
IF state1=init_STEPPER THEN
rungen2:=TRUE;
END_IF
out1:=4;
Speed1PresHig:=3000;
Ramp:=2000;
ELSE
Way1PresHigout:=FALSE;
do4:=TRUE;
END_IF
IF state1=stop_stepper THEN rungen1:=FALSE; rungen2:=FALSE; END_IF
IF AlarmAktivGen THEN
Speed1PresHig:=0;
Ramp:=0;
Difpos1:=0;
IF State1=run_stepper OR state1=ACCEL_STEPPER OR state1=DECEL_STEPPER THEN
Rungen1:=NOT rungen1;
Rungen2:=FALSE;
ELSE
rungen1:=FALSE;
Rungen2:=FALSE;
END_IF
END_IF
Gen1Hig( ENABLE:=rungen1 OR rungen2 , MIN_SPEED:=0 , MAX_SPEED:=Speed1PresHig , QUANTITY:= difpos1 , ACCEL_RAMP:=ramp, DECEL_RAMP:=ramp, OUT_NUM:=out1 , STATE=>state1 , CURRENT_SPEED=> , PULSES_GENERATED=>pos1 );
Выпустил Hardella 1.6.0 (см https://hardella.com/download/) и запустил сайт: https://hardella.com/
В очередной версии:
- можно программировать оба PRU ядра, и полностью управлять 4 выходами и 2 входами
- встроен блок ШД
Если что-то не описал -- пишите в комментариях.
Если опечатки (или, например, непонятно написано), то можно выделить фрагмент на сайте и нажать ctrl+enter.
В основном да (см пример https://hardella.com/docs/pru/exampl...linkning-leds/ ), но я продублирую на английский.
PRU выполняется на другом процессоре. С точки зрения Codesys, заливка PRU программы выглядит как "запись байт по определённому адресу".
Программируется-то на языке ST, но с точки зрения КДС это выглядит как филькина грамота (т.е. как один массив байт)
Постарался тут описать: https://hardella.com/docs/pru/codesys-setup/
Ура, товарищи!
Последний раз редактировалось Владимир Ситников; 19.12.2016 в 16:26.
Возвращаясь к теме: в 1.6.0 я добавил блок управления ШД, который работает с постоянной длительностью цикла.
Грубо говоря, если длительность PRU цикла 1 мкс, то импульс может быть либо 1 мкс, либо 2 мкс, либо 3 мкс, ну вы поняли?
Казалось бы 1 мкс это довольно хорошо, но нет.
Например, если нужна частота 50кГц, то это будет 20 1мкс циклов.
21 цикл это 47619Гц, а 19 циклов это 52631 Гц.
Чтобы в таких условиях выполнять "плавный разгон", блок делает размазывание ошибки.
Если частота не попадает в "точное значение микросекунд", то блок выдаёт смесь (задержка становится то 19 то 20 мкс)
С математической точки зрения, конечно, всё хорошо.
Но интересно проверить работает ли это на практике
Внимание, вопрос: кто-нибудь может проверить работу ШД на реальном ШД?
На частотах до 10кГц вряд ли что-нибудь изменится, а вот на более высоких уже интереснее.
PS. Инструкция по ШД программе тут: https://hardella.com/docs/pru/examples/step-motor/
Запустил сайт, на котором буду размещать новые версии и документацию: https://hardella.com/
Если во всех браузерах не работает и браузеры обновлены, то проверьтесь на вирусы. Сайт работает под управлением cloudflare.com с их стандартными настройками безопасности. Если что-то не работает, то практически наверняка проблема на стороне браузера.
Уважаемые форумчане, в связи с тем, что в данной теме идет обсуждение Hardella IDE, название будет переименовано.
Посты по обсуждению Hardella IDE будут переноситься в данную тему.
Прошу также обсуждение данной среды вести на сайте разработчика hardella.com на форуме.