Просмотр полной версии : Hardella IDE
Newcomer
09.07.2017, 17:41
Либо оставлять синхронизацию в ПЛК, но тогда нужно, чтобы PRU программа заканчивала генерацию не более чем за 14-15мс, чтобы у ПЛК был шанс обработать и перезапустить.
Я про это то же ранее писал.
Владимир Ситников
09.07.2017, 17:53
Я про это то же ранее писал.
А потом окажется новая проблема: "ой, генерация завершилась за 14мс, что делать".
Newcomer
09.07.2017, 17:59
А потом окажется новая проблема: "ой, генерация завершилась за 14мс, что делать".
Это не проблема. Главное что бы генерация завершилась не позднее 16,7 мс. Уменьшать минимальное значение интервала (14...15 мс) то же не хорошо, т.к. это ведет к увеличению расчетного значения accel_ramp, что может привести к пропуску импульсов ШД.
Newcomer
10.07.2017, 13:18
Владимир, задаю заведомо большее чем над accel_ramp и получаю совсем плохой результат. Пачка импульсов генерируется много дольше расчетного времени. Т.е. ФБ steper не верно интерпретирует accel_ramp, который ему задается.
Приподниму малость тему.
Моя разработка модуля PRU-энкодера с детектором машинного нуля уже успешно работает около трех месяцев в режиме 24\7.
После модернизации оборудования, при наладке, выявился интересный глюк. Установка имеет несколько электромагнитных клапанов, которые управляются с ПЛК через промежуточные реле. Напряжение питания их соленоидов 230VAC. При размыкании (отпускании) реле одного из соленоидов происходил сброс показаний энкодера в ноль. Флаг машинного нуля при этом не сбрасывался, как не наблюдалось сбоев и в ПЛЦ_ПРГ. Проблему мы конечно решили методом изменения и экранировки разводки, но как говорится, "осадочек остался". Я понимаю, что это вопрос к производителю ПЛК, однако я не могу понять почему сбрасывался один регистр ПРУ, но не сбрасывался другой.
--------------
Другой вопрос.
Есть задумка модернизации еще одной установки, но там нужен ПРУ-модуль почти как для ШД.
Установка содержит три не очень навороченных сервопривода с возможностью управления от Step\Dir.
Задача заключается в том, что бы на привод №1 выдать образцовую частоту вращения F, на привод №2выдать F +- дельта, где дельта= 3% с максимально плавной регулировкой, на привод №3 выдать F+5% с ограничением момента (это функционал привода).
Частота импульсов примерно 30-50кГц. Т.е. например на привод №1 отправляем 32500Гц, на привод №2 - 32614Гц, на привод №3 - 32894Гц. Направление менять не требуется, ибо вращение идет всегда только в одну сторону. Рассматриваю так же просто передачу уставки скорости по Модбасу, но там только в Гц, и думаю будет грубовато.
Собственно вопросы:
1). В процессе работы есть оперативная необходимость изменения частоты любого из приводов без останова генератора, т. к. останов недопустим. Получится ли сделать три таких независимых генератора импульсов?
2). Генераторы должны работать бесконечно.
Newcomer
05.10.2017, 10:46
А катушки ЭМ клапанов RC-цепочками зашунтированы ?
По второй задаче особых проблем не вижу. Но интересно что скажет отец основатель Hardella IDE В.Ситников.
Владимир Ситников
05.10.2017, 10:57
Приподниму малость тему.
Моя разработка модуля PRU-энкодера с детектором машинного нуля уже успешно работает около трех месяцев в режиме 24\7.
Это хорошо
Частота импульсов примерно 30-50кГц. Т.е. например на привод №1 отправляем 32500Гц, на привод №2 - 32614Гц, на привод №3 - 32894Гц. Направление менять не требуется, ибо вращение идет всегда только в одну сторону. Рассматриваю так же просто передачу уставки скорости по Модбасу, но там только в Гц, и думаю будет грубовато.
Т.е. установка уже может принимать уставку частоты по modbus с точностью до Гц, и вы всё равно хотите заменить?
Почему же тогда?
Вообще говоря, 32500Гц это 30769.2нс, а 32501 это 30768.3нс.
Если у вас установка может не только принимать "с точностью до Гц", но ещё и реально выставлять частоту с точностью до Гц, то зачем же её "модернизировать"?
Собственно вопросы:
1). В процессе работы есть оперативная необходимость изменения частоты любого из приводов без останова генератора, т. к. останов недопустим. Получится ли сделать три таких независимых генератора импульсов?
Там, говорите, серво?
Т.е. им можно выдавать приближенную частоту, а они подстроятся?
3 генератора сделать можно. И подстройку частоты тоже можно сделать.
Вопрос в точности, которая нужна.
Например, если поставить цикл PRU в 1мкс, то грубо говоря, генерируемые импульсы будут кратны 1мкс.
Импульс в 32мкс (16 единиц, 16 нулей) это 31'250Гц.
Импульс в 33мкс (17 единиц, 16 нулей) это 30'303Гц.
Импульс в 34мкс (17 единиц, 17 нулей) это 29'412Гц.
В итоге, при уставке в 30'000Гц PRU будет чередовать 33мкс и 34мкс импульсы примерно так: 33 34 33 ... Тут так получается, что 33+34+33=100мкс, а 3 импульса за 100мкс это как раз 30кГц=3/100мкс.
Вряд ли, конечно, вам будет это мешать, но вдруг.
Вы это понимаете, и вас устраивает?
2). Генераторы должны работать бесконечно.
Это, конечно, можно.
Т.е. установка уже может принимать уставку частоты по modbus с точностью до Гц, и вы всё равно хотите заменить?
Почему же тогда?
Уставка задается в Гц с точностью 0.01Гц в диапазоне 1.50...50.00 Гц. С имеющимися двигателями дискретность уставки получается примерно 0.3 об\мин. Вероятно хватит, но на всякий случай буду прорабатывать вариант с Степ\Дир. В данный момент используется аналоговое управление высокоточным многообортным переменным резистором (10 оборотов), для получения нужного результата оператору иногда приходится вращать ручку буквально на несколько градусов.
Вообще говоря, 32500Гц это 30769.2нс, а 32501 это 30768.3нс.
Приведенные мною цифры весьма условные, чисто для понимания задачи.
Там, говорите, серво?
Т.е. им можно выдавать приближенную частоту, а они подстроятся?
3 генератора сделать можно. И подстройку частоты тоже можно сделать.
Стоят асинхронные двигатели с установленными резольверами. В приводе резольверный сигнал преобразуется в "энкодерный" 1024имп\об. Для задачи частоты требуется подавать внешний сигнал по формуле 4х, т.е. чтобы вал двигателя повернулся на 1 оборот нужно выдать 4096 импульсов. Обычная скорость вращения - 300-600 об\мин. Да, привод подстраивает частоту, т.к. она немного плавает от внешних механических возмущений (люфты, неравномерность нагрузки и т.п.)
По факту получается, что нужно иметь генератор в диапазоне 20..50кГц с возможностью оперативного изменения частоты с дискретностью 1 Гц. Например для частоты 40000 Гц обороты двигателя будут равны 585,94 об\мин, для 40001 Гц это составит 585,95 об\мин. Грубо - 1Гц равен 0.01 об\мин. В принципе это очень высокая точность, даже излишняя. Думаю дискретности задающей частоты в 5 Гц будет достаточно. Это в 6 раз точнее, чем через Модбас.
Завтра понаблюдаю за реальными цифрами на пока еще живой установке)).
Вопрос в точности, которая нужна.
Импульс в 32мкс (16 единиц, 16 нулей) это 31'250Гц.
Импульс в 33мкс (17 единиц, 16 нулей) это 30'303Гц.
Импульс в 34мкс (17 единиц, 17 нулей) это 29'412Гц.
32мкс = 457,76 об\мин
33мкс = 443,89 об\мин
34мкс = 430,84 об\мин.
Это очень грубая дискретность.
Можно ли в ПРУ ставить время цикла меньше, чем 1 мкс?
А катушки ЭМ клапанов RC-цепочками зашунтированы ?
Не уверен что во всех (5 шт) есть помехоподавляющие цепи. Уже закуплены аналогичные катушки, но с напряжением 24VDC и помехоподавляющими приспособами. Поменять пока не получается, т. к. поскольку всё работает, меня не подпускают к машине ))).
Владимир Ситников
05.10.2017, 18:14
32мкс = 457,76 об\мин
33мкс = 443,89 об\мин
34мкс = 430,84 об\мин.
Это очень грубая дискретность.
Вы правильно поняли?
Вы тут оперируете словом "количество оборотов в минуту", а я говорю о том, что 33-34 мкс импульсы будут быстро-быстро меняться так, что "в среднем" (скажем, среднее за несколько секунд) окажется 33.333333.
Ну или пример для ваших "443,89 об\мин 430,84 об\мин"
Допустим, уставка 437.00 об\мин.
PRU может генерировать такие импульсы: 33 34 34 33 34 33 34 33 34 33 34 33 34 33 34 33 34 33 34 33 34 33 34 33 34...
Это 25 импульсов за 838мкс или 33.52мкс/импульс или 437.006 Гц в среднем за эту "секунду".
За это время (25 имп) вал провернётся на 1.83 градуса.
Вам точно такой точности не хватит?
Текущий ШД-блок именно так делает. Он размазывает импульсы и в среднем получается указанная частота.
Можно ли в ПРУ ставить время цикла меньше, чем 1 мкс?
Надо, конечно, смотреть PRU статистику. Может, и можно ставить меньше 1мкс, но сильно меньше не получится.
Ну, поставим 0.5мкс, но это всё равно не будет чем-то кардинально более точным.
Сделать "безцикловый режим", наверное, можно, но непросто. 1мкс это 1000нс, или 200 команд PRU процессора.
Я с самого начала говорил, что "точность в 1 Гц на частоте 30кГц" это то же самое, что и "точность в 1нс".
А PRU ядро на одну команду тратит 5нс. Как вы собираетесь делать точность в 1нс при этом?
Начнём с того, что (пишу по памяти):
1) Нужно сделать какой-то обмен между PRU и PLC_PRG. Он может занять, например, 100-200нс. Конечно, зависит от количества обменных переменных и т.п.
2) "Цикл ожидания времени" на PRU сам по себе занимает ~50нс
3) Ну и самое коварное: вы же хотите 3 генератора одновременно. Может так оказаться, что "нужно сгенерировать импульс через 50нс для 1-го, потом через 1нс импульс для 2-го и ещё через 2нс импульс для третьего генератора". Если "подождать 50нс до генерации 1-го импульса PRU ещё может", то после этого не так то и просто будет "за 1 нс сгенерировать второй импульс".
Либо вариант "2 ПЛК", "по 2 PRU ядра в каждом", "на каждом PRU ядре свой генератор". Но это, по-моему, дичь какая-то.
Посмотрел реальную ситуацию на реальной установке. Девиация оборотов в рабочем режиме под нагрузкой по индикации приводов составляет +-1 об\мин от установленного значения. Пришел к мысли, что наворачивать ШД-подобную логику не имеет смысла, вполне будет достаточно передавать уставку по Модбасу.
Так что, как говорится, прошу прощения за беспокойство.
Здравствуйте!
Подскажите, как можно изменить скорость шд на ходу через pru_stepper?
Владимир Ситников
21.11.2017, 18:40
Здравствуйте!
Подскажите, как можно изменить скорость шд на ходу через pru_stepper?
Сейчас нельзя.
А в чём заключается задача, когда нужно менять скорость на ходу?
Сейчас нельзя.
А в чём заключается задача, когда нужно менять скорость на ходу?
Задача перемотки ленты, которую производим. Перемотка с натяжением, иногда необходимо на ходу немного корректировать скорость этой перемотки. Это моментальная задача.
А вообще более глобальная задача - поддерживать определённую скорость, так как при перемотке изменяется диаметр намотки, соответственно скорость при одинаковых количествах импульсов изменяется.
Здравствуйте!
Подскажите, как можно изменить скорость шд на ходу через pru_stepper?
Написать самому ФБ для PRU. Как-то начал делать такой ФБ да не закончил.
To Владимир Ситников.
Обновил Java 8. Это не скажется на работоспособности Hardella IDE ?
Владимир Ситников
21.11.2017, 19:43
Обновил Java 8. Это не скажется на работоспособности Hardella IDE ?
Как раз для Hardella эта версия Java и нужна. Т.е. должно работать
Как раз для Hardella эта версия Java и нужна. Т.е. должно работать
Java 8 постоянно обновляется. Это не страшно ?
Владимир Ситников
22.11.2017, 11:37
Java 8 постоянно обновляется. Это не страшно ?
Не страшно. На Java 9 не запустится, а на 8-ой проблем быть не должно.
Написать самому ФБ для PRU. Как-то начал делать такой ФБ да не закончил.
Написать фб, конечно, можно. Интересовался, чтобы не изобретать велосипед.
Написать фб, конечно, можно. Интересовался, чтобы не изобретать велосипед.
Тогда за дело. ;)
Такой вопрос к В.Ситникову. Как максимально точно оценить за какое время ФБ Steper сгенерирует заданное количество импульсов ?
Владимир Ситников
29.11.2017, 18:38
Такой вопрос к В.Ситникову. Как максимально точно оценить за какое время ФБ Steper сгенерирует заданное количество импульсов ?
Например, запустить блок на эмуляторе.
Вот, например: https://github.com/vlsi/pru-emulator/blob/master/src/test/java/com/github/vlsi/pru/StepperTest.java#L182 указываем параметры, запускаем, смотрим на время.
Например, запустить блок на эмуляторе.
Вот, например: https://github.com/vlsi/pru-emulator/blob/master/src/test/java/com/github/vlsi/pru/StepperTest.java#L182 указываем параметры, запускаем, смотрим на время.
А как этот эмулятор запустить ? Насколько точно этот эмулятор замерит время ? Есть ли такой инструмент в Hardela - задаешь ускорение, замедление, количество импульсов, нажимаешь кнопку Start и получаешь на выходе это самое время.
Владимир Ситников
30.11.2017, 15:13
А как этот эмулятор запустить ?
Сейчас нужно скачать проект, открыть его в Java IDE (например, IntelliJ IDEA), указать параметры, запустить тест.
Вот как оно выглядит:
34385
Насколько точно этот эмулятор замерит время ?
Думаю, точность будет порядка 5-10нс. Осциллографом же проверяли ШИМ генераторы на основе Hardella -- теоретическая частота совпадает с практической.
STEPPER блок не зависит от основного цикла, поэтому там время работы весьма и весьма точное.
Если запуск выполняется из "основного цикла ПЛК", то, конечно, время реакции тоже нужно учитывать (+сколько-то миллисекунд).
Если же запуск выполняется из PRU, то нужно учитывать и время PRU цикла (+сколько-то микросекунд)
Есть ли такой инструмент в Hardela - задаешь ускорение, замедление, количество импульсов, нажимаешь кнопку Start и получаешь на выходе это самое время.
Вот тут вопрос целесообразности.
С одной стороны, встроить можно. С другой вопрос того, насколько часто оно нужно. Как-никак, встраивание это время на разработку.
Прямо нужен инструмент?
Если вопрос в обсчёте нескольких вариантов -- могу запустить.
Тут периодически возникает вопрос о смене подхода. Так, чтобы можно было менять параметры движения на ходу (например, менять количество импульсов или "внезапно" уменьшать-увеличивать скорость).
Разумеется, в случае "изменения скорости на ходу" и инструмент "нажимаешь кнопку Start и получаешь на выходе это самое время" будет несколько другим, ведь тогда будет зависеть не только от PRU, но и от того, в какой момент будут эти команды на смену режима работы.
ФБ Steper для PRU, который меняет параметры движения на ходу бы очень интересен.
Вот тут вопрос целесообразности.
С одной стороны, встроить можно. С другой вопрос того, насколько часто оно нужно. Как-никак, встраивание это время на разработку.
Прямо нужен инструмент?
Если вопрос в обсчёте нескольких вариантов -- могу запустить.
Такая утилита была бы очень полезна. Желательно бы было выводить:
1) время и число импульсов (n) при разгоне;
2) время и число импульсов при работы с постоянной скоростью;
3) время и число импульсов при торможении;
4) общее время и число импульсов.
Также хорошо бы было видеть графики f=F(t) и n=F(t).
Делать или нет решать вам. По хорошему фирме "ОВЕН" давно пора обратить внимание на Hardela и оплатить ваш труд. Инструментарий весьма добротный, ничего лучшего пока нет.
Еще один вопрос. Как узнать сколько памяти занимает программа для PRU ? Размер памяти - 1 кБ, так ?
Владимир Ситников
04.12.2017, 13:11
Еще один вопрос. Как узнать сколько памяти занимает программа для PRU ? Размер памяти - 1 кБ, так ?
Максимальный размер программы -- 1024 PRU команды (4096 байт). Суммарно может быть 2 программы одновременно (одна для PRU0, вторая для PRU1)
Размер занимаемой памяти видно в коде генерируемой ..._PruXInit программы.
Например:
...
PROGRAM BlinkningLeds_Pru1Init
(* Generated by Hardella IDE 1.8.0: https://hardella.com *)
VAR_INPUT
enable : BOOL := TRUE; (* PRU is reset on the R_TRIG(enable) *)
END_VAR
VAR_OUTPUT
running : BOOL := FALSE; (* TRUE when PRU is running *)
END_VAR
VAR
initDone : BOOL := FALSE;
enTrg : R_TRIG;
xx, yy : POINTER TO DWORD;
x, i : DWORD;
pruCode : ARRAY[1..38] OF DWORD :=
16#51000102, 16#15012121, 16#01002141, 16#15012161, 16#24f08082, 16#2402fac2, 16#91000303, 16#51000306, 16#51020301, 16#51030302
, 16#91040301, 16#24000003, 16#81000303, 16#24780ce3, 16#f1002383, 16#013ce3e3, 16#66e2e3f6, 16#00e2e0e0, 16#24780ce3, 16#f1002384
, 16#010ae4e4, 16#48e4e203, 16#240000e5, 16#21001ee1, 16#04e4e2e5, 16#c900e502, 16#1501e5e5, 16#5100e503, 16#0502e5e5, 16#6f00e5ff
, 16#e1002385, 16#11ffde82, 16#090841c2, 16#12c28282, 16#090961c2, 16#12c28282, 16#010082de, 16#210000e1;
END_VAR
...
Это означает (см объявление переменной pruCode), что программа BlinkningLeds занимает 38 из 1024 команд в PRU1.
Значит общая память 1024 команды для двух PRU. А деление памяти между PRU произвольное? Например 30% для PRU1 и 70% для PRU2.
Владимир Ситников
04.12.2017, 13:34
Значит общая память 1024 команды для двух PRU. А деление памяти между двумя PRU произвольное? Например 30% для PRU1 и 70% для PRU2.
Нет. У каждого PRU ядра своя память.
PRU0 -- 1024 команды
PRU1 -- 1024 команды
Все команды для PRU четырехбайтные ?
Владимир Ситников
04.12.2017, 13:48
Все команды для PRU четырехбайтные ?
Да, все занимают по 4 байта.
Максимальный размер программы -- 1024 PRU команды (4096 байт). Суммарно может быть 2 программы одновременно (одна для PRU0, вторая для PRU1)
Размер занимаемой памяти видно в коде генерируемой ..._PruXInit программы.
Например:
...
PROGRAM BlinkningLeds_Pru1Init
(* Generated by Hardella IDE 1.8.0: https://hardella.com *)
VAR_INPUT
enable : BOOL := TRUE; (* PRU is reset on the R_TRIG(enable) *)
END_VAR
VAR_OUTPUT
running : BOOL := FALSE; (* TRUE when PRU is running *)
END_VAR
VAR
initDone : BOOL := FALSE;
enTrg : R_TRIG;
xx, yy : POINTER TO DWORD;
x, i : DWORD;
pruCode : ARRAY[1..38] OF DWORD :=
16#51000102, 16#15012121, 16#01002141, 16#15012161, 16#24f08082, 16#2402fac2, 16#91000303, 16#51000306, 16#51020301, 16#51030302
, 16#91040301, 16#24000003, 16#81000303, 16#24780ce3, 16#f1002383, 16#013ce3e3, 16#66e2e3f6, 16#00e2e0e0, 16#24780ce3, 16#f1002384
, 16#010ae4e4, 16#48e4e203, 16#240000e5, 16#21001ee1, 16#04e4e2e5, 16#c900e502, 16#1501e5e5, 16#5100e503, 16#0502e5e5, 16#6f00e5ff
, 16#e1002385, 16#11ffde82, 16#090841c2, 16#12c28282, 16#090961c2, 16#12c28282, 16#010082de, 16#210000e1;
END_VAR
...
Это означает (см объявление переменной pruCode), что программа BlinkningLeds занимает 38 из 1024 команд в PRU1.
Владимир, у меня PRU1 управляет драйвером ШД. Код занимает 490 слов. Хочу управлять через PRU1 еще одним драйвером ШД. Правильно я понимаю, что памяти для этого хватит (490 + 490 = 980) ?
Владимир Ситников
15.01.2018, 17:04
Владимир, у меня PRU1 управляет драйвером ШД. Код занимает 490 слов. Хочу управлять через PRU1 еще одним драйвером ШД. Правильно я понимаю, что памяти для этого хватит (490 + 490 = 980) ?
Пробуйте. Да, может получиться.
И, да, если расскажете о задаче, может навести меня на какую-нибудь мысль.
Я всё подумываю добавить "изменение скорости на ходу" и т.п., но никак не приходит в голову как оно концептуально должно работать.
Как какая-то очередь команд что-ли?
Грубо говоря:
host -> pru: "едем 2 метра". "Ок, поехали"
host -> pru: "кстати, потом ещё метр". "Ясно, не забуду"
host -> pru: "а потом останавливаемся по DI1". "Ясно, не забуду"
host -> pru: "Эй, тормози прямо щас, там палец прижало!". pru: "Хорошо, стоим"
Так что-ли?
Я в своей задаче от идеи изменения скорости ШД на ходу отказался. Вместо этого хочу ввести в проект еще один ШД. Итого хочу управлять тремя ШД. Если от одного PRU получится управлять двумя ШД, то задача, скорее всего, будет решена. Памяти для программы вроде хватает, а вот хватит ли регистров для хранения переменных, объявленных в FB Steper. У меня в этом FB несколько переменных объявлены как DWORD. Компилятор Hardella выдаст сообщение если регистров не будет хватать ?
Владимир Ситников
15.01.2018, 18:09
Памяти для программы вроде хватает, а вот хватит ли регистров для хранения переменных, объявленных в FB Steper. У меня в этом FB несколько переменных объявлены как DWORD. Компилятор Hardella выдаст сообщение если регистров не будет хватать ?
Да, кстати, может не хватить. Если не хватит, то будет ошибка.
Еще вопрос. Как в программе для PRU объявить два одинаковых ФБ ?
Владимир Ситников
15.01.2018, 18:25
Еще вопрос. Как в программе для PRU объявить два одинаковых ФБ ?
Что значит "два одинаковых"?
Если они прямо совсем одинаковые, то достаточно один раз объявить, и при использовании создать 2 переменых.
Например:
drive1: PRU_STEPPER;
drive2: PRU_STEPPER;
Если немного разные, то, например, ctrl+c/v и вперёд.
Что значит "два одинаковых"?
Если они прямо совсем одинаковые, то достаточно один раз объявить, и при использовании создать 2 переменых.
Например:
drive1: PRU_STEPPER;
drive2: PRU_STEPPER;
Если немного разные, то, например, ctrl+c/v и вперёд.
Все ясно. Завтра попробую.
Что значит "два одинаковых"?
Если они прямо совсем одинаковые, то достаточно один раз объявить, и при использовании создать 2 переменых.
Например:
drive1: PRU_STEPPER;
drive2: PRU_STEPPER;
Если немного разные, то, например, ctrl+c/v и вперёд.
Владимир, что у меня не так ?
Владимир, что у меня не так ?
Вы stepper2 сделали функцией, а не программой. По этому выражение stepper2.Q - ошибка.
Вы stepper2 сделали функцией, а не программой. По этому выражение stepper2.Q - ошибка.
stepper1 - это экземпляр ФБ PRU_STEPPER, а stepper2 - это экземпляр ФБ PRU_STEPPER2.
Владимир Ситников
16.01.2018, 19:24
Владимир, что у меня не так ?
Тут, скорее всего, несколько ошибок.
Как правило, если что-то краснеет, и долгое время (напечатали, например, название переменной целиком) не приходит в норму, то это наверняка ошибка.
Если не исправляется по ctrl+пробел (автодополнение), то тоже наверняка ошибка.
По картинке нашёл такое:
1) Если скопировать вызов ФБ, то невозможно заменить переменную на другую.
Т.е. если написано stepper(), то после копирования этой строки заменить stepper() на stepper2() не получится (даже, если переменная stepper2 объявлена должным образом)
2) Аналогично, аргумент out4 := stepper2.Q. Тут снова почему-то не работает переименование.
В версии 1.7.2 всё выглядит точно так же -- нужно чинить ошибку. Как обходной вариант -- стереть "stepper2.Q" и написать заново. Аналогично с вызовом stepper2()
Каким образом удалось добиться покраснения параметров в @Export -- не знаю. Если расскажете, то и это можно будет починить.
Каким образом удалось добиться покраснения параметров в @Export -- не знаю. Если расскажете, то и это можно будет починить.
Я никак не могу понять как с нуля зачать строку с @Export. По этой причине я дважды скопировал целиком строку @Export с параметрами, а затем их отредактировал.
Владимир Ситников
17.01.2018, 12:41
Я никак не могу понять как с нуля зачать строку с @Export. По этой причине я дважды скопировал целиком строку @Export с параметрами, а затем их отредактировал.
Кхм. Рассказывайте как делаете.
Сначала нужно создать переменную любым образом. Например, нажимаем enter или копируем другую (ctrl+c/v или ctrl+d -- дублирует строку)
Как вариант, можно скопировать и имеющуюся строку с @Export, у которой удалить перечисление в скобках.
Варианты:
a) Переводим курсор в начало имени переменной и нажимаем @. При этом должно появиться @Export. Возможно, тут стоит сделать, чтобы срабатывало и посреди названия переменной, а не только в начале.
b) Можно навести курсор на название переменной и нажать alt+enter (ну или на лампочку слева от переменной) 35152
И там выбрать "exchange with host": 35153
c) В Hardella 1.7.x (например, в 1.7.2) появилась дополнительная выпадающая плашка. Она появляется через несколько секунд как курсор остановится. Нажимаем "exchange with host" -- появится @Export
35151
Вроде, в документации описано: https://hardella.com/docs/pru/data-exchange/#%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-pru
Перебил строки, краснота ушла, но компилятор выдает какие-то ошибки.
Еще вопрос: на какой картинке набито правильно, на второй или третьей ?
Владимир Ситников
17.01.2018, 14:16
Перебил строки, краснота ушла, но компилятор выдает какие-то ошибки.
RegAlloc-- это, да, ошибка "не хватило регистров".
Еще вопрос: на какой картинке набито правильно, на второй или третьей ?
Правильно на 2-ой картинке (где красного нет).
Владимир Ситников
17.01.2018, 14:36
А это тогда что значит ?
Скорее всего, вы изменили тип переменной (например, указали другой ФБ).
enable, quantity и т.п. это не просто текст, а это прямо ссылки на соответствующие переменные соответствующего ФБ.
Получается, что тип переменной stepper1 изменён, а enable/quantity/... внутри @Export по-прежнему указывает на "переменные старого ФБ".
Можно щёлкнуть мышкой с ctrl'ом -- и посмотреть куда оно перекинет (ошибку оно, конечно, не исправит, а просто даст понять логику возникновения ошибки).
Это тоже нужно править.
Скорее всего, вы изменили тип переменной (например, указали другой ФБ).
enable, quantity и т.п. это не просто текст, а это прямо ссылки на соответствующие переменные соответствующего ФБ.
Получается, что тип переменной stepper1 изменён, а enable/quantity/... внутри @Export по-прежнему указывает на "переменные старого ФБ".
Можно щёлкнуть мышкой с ctrl'ом -- и посмотреть куда оно перекинет (ошибку оно, конечно, не исправит, а просто даст понять логику возникновения ошибки).
Это тоже нужно править.
Щелкнул, перекинуло сюда (см.картинку).
Владимир Ситников
17.01.2018, 14:55
Щелкнул, перекинуло сюда (см.картинку).
Значит, так и есть. В переменной написано PRU_STEPPER, а перекидывает в PRU_STEPPER2.
По-хорошему, при изменении типа переменной должны обновляться данные в @Export.
Значит, так и есть. В переменной написано PRU_STEPPER, а перекидывает в PRU_STEPPER2.
По-хорошему, при изменении типа переменной должны обновляться данные в @Export.
И что мне надо сделать ?
Владимир, зачем у вас в ФБ PRU_STEPPER переменная min_speed объявлена как DWORD, там и WORD за глаза хватит.
С нехваткой памяти под переменные разобрался. Осталось с этим разобраться. Почему перекидывает на PRU_STEPPER2, в не на PRU_STEPPER3 ?
Владимир Ситников
17.01.2018, 15:41
И что мне надо сделать ?
Пока в проблемных случаях нужно перенабирать.
Владимир, зачем у вас в ФБ PRU_STEPPER переменная min_speed объявлена как DWORD, там и WORD за глаза хватит.
Кому хватит, а кому и нет. Но там сомневаюсь, что хватит одной замены одной переменной. Попробовать, конечно, можно, но, прохоже, стоит научить компилятор сохранять регистры в память.
Почему не возможно отредактировать ваш ФБ PRU_STEPPER ? Как сделать копию ФБ PRU_STEPPER, сменить название ФБ и отредактировать ?
Найти этот самый PRU_STEPPER (например, нажать с ctrl'ом).
Нажать на название PRU_STEPPER правой кнопкой, выбрать "show in logical view" -- этот самый PRU_STEPPER развернётся в левой части окна.
Его выделяем, нажимаем ctrl+c, переходим в "нашу часть проекта" (в левой части экрана), нажимаем ctrl+v.
Владимир, как мне это победить (первая картинка) ? Что значит перенабрать ? Перенабирал все что в скобках было и получилось это (вторая картинка).
Сделал PRU_STEPPER3 точно такой же как ваш PRU_STEPPER. С PRU_STEPPER3 компилятор пишет о нехватке памяти, а с PRU_STEPPER нехватки памяти нет.
Как это понимать ?
Владимир Ситников
18.01.2018, 12:09
Сделал PRU_STEPPER3 точно такой же как ваш PRU_STEPPER. С PRU_STEPPER3 компилятор пишет о нехватке памяти, а с PRU_STEPPER нехватки памяти нет.
Как это понимать ?
Просто в случае 3 ошибка возникла немного раньше.
Визуально не видно, но "stepper1.Q" указывает на "Q не того ФБ".
Если вы нажмёте на "pru" ("папка, в которой находятся ФБ") и выберете "Check Model", то оно-таки покажет ошибку вида "reference Q (...) is out of search scope".
Владимир, а на второй картинке в моем последнем посте что за ошибки и как их устранить ?
Владимир Ситников
18.01.2018, 13:22
Владимир, а на второй картинке в моем последнем посте что за ошибки и как их устранить ?
Предлагаю нажать "check model" -- оно покажет где именно проблемные места.
Предлагаю нажать "check model" -- оно покажет где именно проблемные места.
Где находится "check model" ?
Владимир Ситников
18.01.2018, 15:00
Где находится "check model" ?
Например:
а) Последнее предолжение в предыдущем ответе. (http://www.owen.ru/forum/showthread.php?t=23013&page=107&p=267477&viewfull=1#post267477)
35169
б) Или можно нажать Ctrl+Shift+A. Появится окошко "Find Action". В открывшемся окне напечатать "check model" и нажать Enter
в) Можно нажимать правой кнопкой по проекту и выбирать "Check Project":
35170
Нет у меня в выпадающем меню "check model".
Владимир Ситников
18.01.2018, 15:30
Нет у меня в выпадающем меню "check model".
Точно. У вас 1.6.1, а там действительно check model нет.
Может, обновитесь на 1.7.2?
В 1.6.1 стоит нажать по сообщению (ну, в нижней части "ошибки компиляции") "broken reference VariableReference ...". Будет понятно "в каком месте программы" собственно ошибка.
В 1.6.1 стоит нажать по сообщению (ну, в нижней части "ошибки компиляции") "broken reference VariableReference ...". Будет понятно "в каком месте программы" собственно ошибка.
"broken reference VariableReference ..." у меня то же нет.
Владимир Ситников
18.01.2018, 16:17
"broken reference VariableReference ..." у меня то же нет.
Это уже ошибка "IllegalStateException: RegAlloc...".
Означает "не хватило регистров".
Это уже ошибка "IllegalStateException: RegAlloc...".
Означает "не хватило регистров".
Владимир, сколько у PRU регистров и сколько байт в регистре ?
xapymam6ypoji
18.01.2018, 17:41
Приветствую.
При загрузке PRU0.prg в ПЛК 110 первые 4 входа ПЛК зависают в true. Есть ли возможность получить использования этих входов в обычном режиме, с учетом что PRU0.prg будет загружен?
Спасибо.
Владимир Ситников
18.01.2018, 17:43
Владимир, сколько у PRU регистров и сколько байт в регистре ?
https://hardella.com/docs/pru/features-and-limits/#%D0%A5%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80% D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B8-%D0%9F%D0%9B%D0%9A110-%D0%9C02
Объём регистровой памяти: около 30 DWORD регистров (около 120 байт)
https://hardella.com/docs/pru/features-and-limits/#%D0%A5%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80% D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B8-%D0%9F%D0%9B%D0%9A110-%D0%9C02
А если переменная объявлена как WORD, то она займет полрегистра, а вторые полрегистра будут не использованы и пропадут зря ?
Владимир Ситников
18.01.2018, 17:49
При загрузке PRU0.prg в ПЛК 110 первые 4 входа ПЛК зависают в true. Есть ли возможность получить использования этих входов в обычном режиме, с учетом что PRU0.prg будет загружен?
Если ключевой вопрос именно в части "в обычном режиме", то тут, к сожалению, только через ОВЕН. По крайней мере, мне не известно как "передавать данные в PLC Configuration".
Сами же входы можно задействовать, если в PRU программе сделать конструкцию "@Export inputs: FAST_INPUTS"
Т.е. просто объявить переменную inputs: FAST_INPUTS, добавить @Export, и уже пользоваться этим значением в основной программе (см, например, программу быстрого счётчика (https://hardella.com/docs/pru/examples/fast-counter/))
Владимир Ситников
18.01.2018, 17:53
А если переменная объявлена как WORD, то она займет полрегистра, а вторые полрегистра будут не использованы и пропадут зря ?
Зря они не пропадут.
В ошибке "нехватки регистров" на самом деле есть полная распечатка того, какие переменные и в каких регистрах хранились.
Если вы скопируете в буфер обмена строку с ошибкой "RegAlloc", и вставите её, например, в блокнот, то увидите, что там довольно много текста.
Владимир, у PRU кроме регистровой памяти есть оперативная память (ОЗУ). Значит есть возможность сохранять регистровую память в ОЗУ. Это надо делать после отработки каждого ФБ, т.е. перед началом выполнения ФБ читаем ОЗУ в регистры, а после выполнения ФБ сохраняем регистры в ОЗУ. В этом случае будет возможность выполнять в программе PRU разные ФБ и не будет никакой каши в регистровой памяти. Каждый ФБ сможет использовать для своих нужд до 30 регистров. Время выполнения программы PRU увеличиться, зато можно будет писать более сложные программы.
Еще лучше вместо ОЗУ использовать стековую память, если она имеется.
В ФБ PRU_STEPPER, который встроен в Hardella, переменный accel_rapmp и decel_ramp имеют формат WORD. Считаю, что эти переменные должны иметь формат DWORD. Бывают такие задачи когда за короткое время (например за 50 миллисекунд) надо сформировать пачку импульсов приличных размеров. В таких случаях ускорения и замедления должны иметь значения в сотни и миллионы единиц.
Дмитрий520
21.01.2018, 19:04
Добрый день! есть несколько вопросов по Hardella примеру с шаговым двигателем: 1. После записи файлов PRU0 и PRU1 не работают 4 первых дискретных входа ПЛК110-30(М02). Как можно это устранить? 2. Как удалить записанные файлы (PRU0 и PRU1) из ПЛК? По форуму лазил, в ПЛК браузере они не отображаются((. 3. Только разбираюсь с программами SteppersConfig_. Какой командой можно остановить ШД, не зависимо от quantity? то есть ШД еще не прошел заданный путь, а его нужно остановить. Заранее спасибо. Данную тему читал, но ответов на мои вопросы не нашел.
Владимир Ситников
21.01.2018, 19:48
Добрый день! есть несколько вопросов по Hardella примеру с шаговым двигателем: 1. После записи файлов PRU0 и PRU1 не работают 4 первых дискретных входа ПЛК110-30(М02).
Ответ был буквально на 4 сообщения выше:
Сами же входы можно задействовать, если в PRU программе сделать конструкцию "@Export inputs: FAST_INPUTS"
Т.е. просто объявить переменную inputs: FAST_INPUTS, добавить @Export, и уже пользоваться этим значением в основной программе (см, например, программу быстрого счётчика (https://hardella.com/docs/pru/examples/fast-counter/))
Овен не предоставляет средств, чтобы при заливке PRU0.prg можно было работать со входами через конфигурацию. Только через Hardella.
2. Как удалить записанные файлы (PRU0 и PRU1) из ПЛК? По форуму лазил, в ПЛК браузере они не отображаются((
plc browser, там набираем (без кавычек) "filedelete PRU0.prg", жмём enter. Как-то так
3. Только разбираюсь с программами SteppersConfig_. Какой командой можно остановить ШД, не зависимо от quantity? то есть ШД еще не прошел заданный путь, а его нужно остановить. Заранее спасибо. Данную тему читал, но ответов на мои вопросы не нашел.
Нужно передать enable:=FALSE.
Владимир Ситников
21.01.2018, 19:58
Владимир, у PRU кроме регистровой памяти есть оперативная память (ОЗУ). Значит есть возможность сохранять регистровую память в ОЗУ.
Мыслите правильно.
Я об этом же говорил:
прохоже, стоит научить компилятор сохранять регистры в память.
Скоро сделаю задействование ОЗУ, и с нехваткой регистров проблемы уйдут.
Скоро сделаю задействование ОЗУ, и с нехваткой регистров проблемы уйдут.
Отличная новость. Ждемс. ;)
А стековая память у PRU есть ? Вот такая: https://studfiles.net/preview/4339738/page:16/). Очень удобно прятать в ней регистры.
Дмитрий520
21.01.2018, 20:22
Спасибо за ответ! с Информацией в #1083 ознакомился, но не понял как быть с DI3 и DI4 ПЛК, они не буду работать в обычном режиме? просто не совсем понимаю как Овен в этом сможет помочь... Спасибо за Hardella, просто мне ее еще нужно проработать.
По вопросу 3. если enable:=FALSE, то шд не останавливается пока не выполнит заданное quantity или я что то не так делаю?
Владимир Ситников
22.01.2018, 02:34
Спасибо за ответ! с Информацией в #1083 ознакомился, но не понял как быть с DI3 и DI4 ПЛК, они не буду работать в обычном режиме?
Через Hardella можно задействовать DI1..DI4
DI3, DI4 должны работать. Например, так, как в примере про энкодер (https://hardella.com/docs/pru/examples/fast-encoder/)
По вопросу 3. если enable:=FALSE, то шд не останавливается пока не выполнит заданное quantity или я что то не так делаю?
Должно останавливаться с учётом decel_ramp.
Если перевод enable:=false не останавливает, то показывайте код (и рассказывайте какую версию Hardella используете).
но не понял как быть с DI3 и DI4 ПЛК, они не буду работать в обычном режиме?
Что имеется ввиду под словами "в обычном режиме"?
Владимир Ситников
27.01.2018, 18:13
Отличная новость. Ждемс. ;)
Вы хотите запитать 2 ШД?
Пробовали один в PRU0, второй в PRU1?
Один блок PRU_STEPPER без проблем помещается в одно ядро, поэтому непонятно зачем вы пытаетесь "поместить два блока в одно ядро".
Т.е. берите стандартный пример "step motors", там программа, которая управляет двумя ШД. Чем она не подошла?
Отличная новость. Ждемс. ;)
Сделал использование вспомогательной памяти, регистры теперь не заканчиваются, но это всё равно не решает проблему "размещения двух ШД блоков в одном ядре".
Если размещать 2 блока в одном ядре, то примерно 12-15 переменных не помещаются в регистры, и размер кода получается 1060 команд т.к. добавляется довольно много команд по передаче данных между регистрами и памятью. А памяти у каждого ядра всего на 1024 команды.
Да, 1060 и 1024 это не так далеко, и, возможно, если объединить какие-нибудь переменные (например, сделать accel_ramp всегда равным decel_ramp), то может и получиться ужать два блока в 1024 команды. Но какой смысл? Можно же просто выполнять один ШД в одном ядре, а второй во втором.
А стековая память у PRU есть ? Вот такая: https://studfiles.net/preview/4339738/page:16/). Очень удобно прятать в ней регистры.
Команд работы со стеком нет, но, "прятать" регистры -- не проблема. Проблема, что кода получается много. Например, если объявить (и вызвать) два ФБ PRU_STEPPER, то размер программы увеличивается более чем в два раза (по отношению к одному блоку).
Компилировать блок 1 раз и переиспользовать, конечно, можно, но:
1) Два ШД можно сделать и на существующем механизме
2) Подобная доработка компилятора может занять сравнимое время с разработкой механизма, когда часть программы выполняется в PRU, а часть в основной программе. При этом, у варианта "часть программы в основной КДС" преимущество в том, что в КДС программе более точные вычисления (FLOAT/REAL и т.п.), а в PRU только целочисленная арифметика.
Двумя ШД я управляю без проблем. Мне надо управлять тремя ШД.
Что-то мне не понятна ситуация с ФБ. Если создаются 2 экземпляра ФБ, то это не должно привести к двойному увеличению памяти программы, т.к. ФБ один и это его код занимает память. Ведь в том то и смысл использование ФБ. Памяти данных для двух экземпляров ФБ действительно понадобится в два раза больше. Если сохранять регистры после отработки экземпляра ФБ, то проблем с нехваткой регистров не должно быть.
Владимир, что мешает PRU циклически исполнять один и тот же код с двумя разными наборами данных ?
Последовательность действий такая:
1) загружаем в регистры первый набор данных;
2) исполняем код;
3) сохраняем регистры в ОЗУ;
4) загружаем в регистры второй набор данных;
5) исполняем код;
6) сохраняем регистры в ОЗУ.
Далее по кругу.
Владимир Ситников
28.01.2018, 15:18
Двумя ШД я управляю без проблем. Мне надо управлять тремя ШД.
Ясно.
Что-то мне не понятна ситуация с ФБ. Если создаются 2 экземпляра ФБ, то это не должно привести к двойному увеличению памяти программы, т.к. ФБ один и это его код занимает память. Ведь в том то и смысл использование ФБ. Памяти данных для двух экземпляров ФБ действительно понадобится в два раза больше. Если сохранять регистры после отработки экземпляра ФБ, то проблем с нехваткой регистров не должно быть.
Сейчас при компиляции Hardella подставляет всё-всё содержимое всех вложенных ФБ в финальную программу. Это упрощает компиляцию, т.к. в программе, где всё подставлено остаются лишь арифметико-логические операции и условные переходы.
То о чем я писал в предыдущем посте сделать можно ?
Владимир Ситников
28.01.2018, 18:07
То о чем я писал в предыдущем посте сделать можно ?
Тут 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 код станет меньше, точность вычислений повысится, и заодно появится возможность менять параметры хода на ходу.
Тут 2 варианта:
1) Я могу выкатить версию, которая по-прежнему объединяет все ФБ в одну программу, но которая использует память при нехватке регистров.
Тогда вы сможете поправить ФБ PRU_STEPPER так, чтобы этот блок вызывался в разных PRU циклах на разных данных.
Так памяти программ для для двух ФБ не хватает.
Владимир Ситников
28.01.2018, 18:41
Так памяти программ для для двух ФБ не хватает.
Так это будет один экземпляр, и один вызов. Просто перед вызовом нужно полностью заменить его состояние значениями из вспомогательных переменных.
Просто перед вызовом нужно полностью заменить его состояние значениями из вспомогательных переменных.
Для вспомогательных переменных то же память данных нужна, которой может не хватить.
Владимир Ситников
28.01.2018, 20:09
Для вспомогательных переменных то же память данных нужна, которой может не хватить.
Памяти переменным почти наверняка хватит.
Но там сложность будет в том, что, например, внутри блока PRU_STEPPER используется PRU_STEPPER_ACCEL_CALC. И переменные этого самого accelCalc тоже нужно будет сохранять-восстанавливать вместе с переменными PRU_STEPPER.
Когда я тупо объявлял 2 экземпляра ФБ в программе для PRU регистровой памяти не хватало.
Владимир Ситников
28.01.2018, 20:24
Когда я тупо объявлял 2 экземпляра ФБ в программе для PRU регистровой памяти не хватало.
Так я же говорю, что я научил компилятор задействовать ОЗУ при нехватке регистров.
Памяти там 4096 байт у каждого ядра, и расходуется она на "область обмена КДС-PRU" и "память для переменных". 4 килобайта уж наверняка хватит на 2 ШД, даже, если все переменные по 2-3 раза объявлять.
Я думаю, что без функций, которые сохраняет контекст в ОЗУ по абсолютным адресам и делают восстановление контекста не обойтись.
Так я же говорю, что я научил компилятор задействовать ОЗУ при нехватке регистров.
Памяти там 4096 байт у каждого ядра, и расходуется она на "область обмена КДС-PRU" и "память для переменных". 4 килобайта уж наверняка хватит на 2 ШД, даже, если все переменные по 2-3 раза объявлять.
Если все вопросы с сохранением регистровой памяти решены, то можно пробовать писать программу PRU для двух ШД. Напишите как сохранять регистровую память и как восстанавливать.
Владимир Ситников
29.01.2018, 11:21
Если все вопросы с сохранением регистровой памяти решены, то можно пробовать писать программу PRU для двух ШД. Напишите как сохранять регистровую память и как восстанавливать.
Вручную нужно переменные сохранять.
Если сохранять "все регистры" (а это можно даже в старой версии Hardella), то вместе с регистрами, отвечающими за PRU_STEPPER сохранятся и регистры, отвечающие за то, "который сейчас час". Т.е. регистр с прошедшим временем сохранять и восстанавливать не нужно. Конечно, можно после компиляции посмотреть в какие регистры попали данные по времени и их не восстанавливать, но это будет непойми какой хрупкий код.
Вручную нужно переменные сохранять.
И как это выглядит ?
Владимир, accel_ramp и decel_ramp в ФБ STEPPER как DWORD сделали ?
Владимир Ситников
29.01.2018, 12:05
И как это выглядит ?
Я начал уж было переписывать, но бросил на шаге "текущее время".
Выглядит примерно так:
PROGRAM STEPPER_PRU0
variables:
@Export
input dir : BOOL;
stepper : PRU_STEPPER;
@Export
input enable1 : BOOL;
@Export
input quantity1 : WORD;
@Export
output state1 : STEPPER_RUN_STATE;
@Export
output step_count1 : WORD;
@Export
input enable2 : BOOL;
@Export
input quantity2 : WORD;
@Export
output state2 : STEPPER_RUN_STATE;
@Export
output step_count2 : WORD;
first : BOOL;
body:
IF first THEN
ASM
SBCO R29.b0, 3, 100, 4 ; сохраняем R29
LDI R29.dw, 2000
LBCO R0.b0, 3, R29.dw, 120 ; загружаем все регистры из адреса 2000
LBCO R29.b0, 3, 100, 4 ; возвращаем R29 в прежнее состояние
END_ASM
stepper.enable := enable1;
stepper.quantity := quantity1;
ELSE
ASM
SBCO R29.b0, 3, 100, 4 ; сохраняем R29
LDI R29.dw, 3000
LBCO R0.b0, 3, R29.dw, 120 ; загружаем все регистры из адреса 3000
LBCO R29.b0, 3, 100, 4 ; возвращаем R29 в прежнее состояние
END_ASM
stepper.enable := enable2;
stepper.quantity := quantity2;
END_IF;
stepper();
IF first THEN
ASM
SBCO R29.b0, 3, 100, 4 ; сохраняем R29
LDI R29.dw, 2000
SBCO R0.b0, 3, R29.dw, 120 ; сохраняем все регистры по адресу 2000
LBCO R29.b0, 3, 100, 4 ; возвращаем R29 в прежнее состояние
END_ASM
state1 := stepper.state;
step_count1 := stepper.step_count;
ELSE
state2 := stepper.state;
step_count2 := stepper.step_count;
END_IF;
first := NOT first;
FAST_OUTPUTS(out3 := stepper.Q, out4 := dir);
END_PROGRAM
Смысл в том, что команда LBCO загружает данные из памяти, а команда SBCO пишет данные в память (из регистров).
Адрес превышающий 124 (или около того) в LBCO/SBCO не поддерживается, и нужно использовать вспомогательный регистр.
Команды имеют вид "LBCO регистр (который в прочитаются данные), 3 (означает "память текущего ядра"), 100 (смещение), 4 (количество байт, если больше размера регистра, то лишние данные попадут в следующие регистры по порядку)
Поэтому видно, что исходно в части "IF first" я хочу загрузить данные "как бы для 1-го ШД" из памяти (ну, я взял и волевым решением принял, что 1-ый ШД будет храниться по адресу 2000, а второй по адресу 3000). Для обращения к 2000 нужно это самое 2000 записать в регистр (я выбрал R29, но можно любой из R0..R29). Но в этом R29 могло находиться что-то полезное, поэтому я предварительно сохранил его в память по адресу 100.
Обмен с КДС находится по адресам 0.. и далее, поэтому до 1000 он уж точно не дойдёт.
Владимир, а оформить этот код в виде функции, которая тупо переписывает регистры туда-сюда нельзя ?
Владимир Ситников
29.01.2018, 12:16
Владимир, accel_ramp и decel_ramp в ФБ STEPPER как DWORD сделали ?
Вообще говоря, эти переменные сделаны WORD для экономии регистров. Можете привести пример установки, где нужен разгон быстрее, чем 65500 кГц/сек?
Прямо реально установка, которая за секунду с нуля до 65 кГц разгоняется? Обычно, такому разгону мешают силы инерции и т.п.
Да и точность, возможно, страдать будет, т.к. в нескольких местах происходит деление на accel_ramp. WORD тут как раз позволяет адаптировать формулы, чтобы точность вычислений несильно страдала.
Если прямо реально нужен разгон более быстрый, чем 65кГц/сек, то можно поправить формулы, чтобы значение считалось как, например, умноженное на 8.
Иными словами, передаём 65000, а разгон идёт как 65*8=520кГц/сек. Точность задания accel_ramp будет пониже, но максимальное значение побольше.
Вообще говоря, эти переменные сделаны WORD для экономии регистров. Можете привести пример установки, где нужен разгон быстрее, чем 65500 кГц/сек?
У меня такое работает на реальном железе. Я взял код стандартного ФБ STEPPER и заменил у разгона и торможения WORD на DWORD.
Вот кусок кода из рабочей программы.
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := Dir,
STEPPER1_PRU1_stepper_accel_ramp := Accel,
STEPPER1_PRU1_stepper_decel_ramp := 500000000,
STEPPER1_PRU1_stepper_max_speed := 300000,
STEPPER1_PRU1_stepper_min_speed := 300,
STEPPER1_PRU1_stepper_quantity := Quantity,
STEPPER1_PRU1_stepper_enable := TRUE
);
Accel у меня может быть несколько миллионов.
Владимир Ситников
29.01.2018, 12:31
У меня такое работает на реальном железе. Я взял код стандартного ФБ STEPPER и заменил у разгона и торможения WORD на DWORD.
Вот кусок кода из рабочей программы.
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := Dir,
STEPPER1_PRU1_stepper_accel_ramp := Accel,
STEPPER1_PRU1_stepper_decel_ramp := 500000000,
STEPPER1_PRU1_stepper_max_speed := 300000,
STEPPER1_PRU1_stepper_min_speed := 300,
STEPPER1_PRU1_stepper_quantity := Quantity,
STEPPER1_PRU1_stepper_enable := TRUE
);
Accel у меня может быть несколько миллионов.
Просто заменили на DWORD?
Можете ещё назвать Accel и Quantity? Интересно стало через эмулятор прогнать - посмотреть как там генерируются импульсы.
Просто заменили на DWORD?
Можете ещё назвать Accel и Quantity? Интересно стало через эмулятор прогнать - посмотреть как там генерируются импульсы.
Да, просто заменил.
Accel у меня может быть несколько миллионов.
Quantity может быть от нескольких десятков до нескольких сотен.
Владимир Ситников
29.01.2018, 12:36
Владимир, а оформить этот код в виде функции, которая тупо переписывает регистры туда-сюда нельзя ?
Может получится добавить команду для сохранения и загрузки переменных, относящихся к ФБ в память.
Ну, что-нибудь в духе
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;
Переменные для обмена всё-равно придётся в двойном количестве создавать и вручную присваивать. Но LOAD/STORE сделать, наверное, можно.
Владимир, можно в Hardella оставить ФБ STEPPER и сделать на его базе ФБ STEPPER_M, в котором accel_ramp и decel_ramp объявить как DWORD и поправить расчеты если это действительно нужно. Я думаю Hardella от этого только выиграет.
UAVpilot
03.02.2018, 04:00
Привет всем!
Решил попробовать покрутить ШД. Скачал pru_stepper_v12.zip, создал простенькую программку - работает.
Скачал Hardella IDE 1.7.2, скомпилил предлагаемый проект для ШД, загрузил файлы и библиотеки - не работает. Попытался покопать: понял, что Pru0.prg это просто пустышка, резервирующая место под реальный код, который загружается из SteppersConfig_Pru0Init(). Но у меня сложилось впечатление, что в Init код для Pru0 неправильный - например сразу после его загрузки значение state принимает недопустимое значение и никак не меняется, и вообще всы выходные и внутренние переменные не меняются...
Это я что-то делаю не так или что-то не так в Hardella IDE?
Владимир Ситников
03.02.2018, 12:10
Но у меня сложилось впечатление, что в Init код для Pru0 неправильный - например сразу после его загрузки значение state принимает недопустимое значение и никак не меняется, и вообще всы выходные и внутренние переменные не меняются...
Это я что-то делаю не так или что-то не так в Hardella IDE?
Как при этом выглядит код в КДС?
Пожажете чему равны значения переменных в online?
UAVpilot
05.02.2018, 00:19
Пробовал по разному, в том числе и код из примера https://hardella.com/docs/pru/examples/step-motor/
Вот скриншоты одного из вариантов:
На этой картинке виден код, нажато только "Подключение"
35405
обратите внимание на state.
Теперь нажал "Старт
35406
state становится "инвалидным" сразу после выполнения SteppersConfig_Pru0Init(), пробовал в пошаговом режиме.
После этого перестаёт работать и закоментированный код вверху (коментами я переключаю варианты), пока не перезапустишь контроллер. Т.е. SteppersConfig_Pru0Init() заменяет код PRU0.prg в контроллере нерабочим, а после перезапуска рабочий код PRU0.prg восстанавливается из flash.
Newcomer
11.02.2018, 12:04
В.Ситников куда-то пропал.
Владимир Ситников
11.02.2018, 18:03
state становится "инвалидным" сразу после выполнения SteppersConfig_Pru0Init(), пробовал в пошаговом режиме.
Это как? Pru0Init меняет значение переменной из другой программы? Такого вообще не должно быть.
Значение STEPPER_PRU0_stepper_state меняется только в программе SteppersConfig_Pru0MemoryRead, и до вызова этой программы значение меняться никак не должно.
Технически, оборачивать вызов SteppersConfig_Pru0Init в "if init" смысла нет. В Init точно заходит? Судя по картинкам, конечно, заходит.
Но, лучше бы просто вызывали SteppersConfig_Pru0Init() и всего делов.
Можете выложить КДС проект?
Ну, т.е. который не работает в режиме: "перезагрузили ПЛК, заливаем проект".
После этого перестаёт работать и закоментированный код вверху (коментами я переключаю варианты), пока не перезапустишь контроллер. Т.е. SteppersConfig_Pru0Init() заменяет код PRU0.prg в контроллере нерабочим, а после перезапуска рабочий код PRU0.prg восстанавливается из flash.
Непонятно что значит "перестаёт работать". Вряд ли что-то хорошее получится, если выполнить SteppersConfig_Pru0Init, а потом пытаться работать через pru_stepper_v12. Как-никак это разный код и работать не будет.
По-хорошему, заливаем через SteppersConfig_Pru0Init(), и потом запускаем через SteppersConfig_Pru0MemoryWrite(...)
Проверил на своём ПЛК -- эффекта с неверным значением state не возникает. Может, зависит от того, что у вас настроено в PLC configuration?
Вот что у меня:
35513
Уже после нажатия run. Ещё я в начало SteppersConfig_Pru0MemoryRead добавил lastReadOk := TRUE (на работу не влияет, но это по-хорошему, сбрасывать в true нужно):
35514
Пробовал как с PRU0.prg из состава pru_stepper_v12, так и и тот PRU0.prg, который генерирует Hardella 1.7.2.
В обоих случаях STEPPER_PRU0_stepper_state остаётся в состоянии INIT.
Ну и добавил memorywrite -- импульсы побежали, выход FDO3 замигал:
35515
Newcomer
12.02.2018, 12:22
To В.Ситников. Владимир, тут недавно поднимался вопрос о возможности управления двумя ШД от одного PRU. Мне эта тема то же интересна. Есть какие-то подвижки в этом вопросе ?
Владимир Ситников
12.02.2018, 13:15
To В.Ситников. Владимир, тут недавно поднимался вопрос о возможности управления двумя ШД от одного PRU. Мне эта тема то же интересна. Есть какие-то подвижки в этом вопросе ?
Пробовал сделать механизм LOAD/STORE (т.е. сохранять-загружать состояние ФБ в память), но там оказалось несколько трудностей.
В результате я размышляю о том, чтобы передавать в PRU цепочку команд. Там, конечно, тоже непросто, но по сложности разница невелика, а пользы больше будет.
Newcomer
12.02.2018, 13:58
Надеемся и ждем. Желаем успехов в вашем не легком, но благородном труде.
Надеемся и ждем. Желаем успехов в вашем не легком, но благородном труде.
Присоединяюсь.
Прочитал сегодня что JB выпустил продукт, чуть ли не дающий совместно работать нескольким разработчикам над одним проектом, сужу по ТИАпорталу, мне очень нравится, планируется ли в черепахе такое замутить
Владимир Ситников
12.02.2018, 21:45
Прочитал сегодня что JB выпустил продукт
О каком продукте речь?
чуть ли не дающий совместно работать нескольким разработчикам над одним проектом, сужу по ТИАпорталу, мне очень нравится, планируется ли в черепахе такое замутить
О чём речь? (с TIA вообще не знаком)
Чтобы было прямо как в Google Docs? (на одном компьютере что-то добавляем и на втором прямо сразу видны изменения)
Такое, наверное, непросто сделать.
С другой стороны, git/svn уже сейчас поддерживаются.
Иными словами, если разработчики работают над разными частями программы, то можно синхронизироваться через git. Если будут конфликтные изменения, то оно покажет "что менял(а) каждый" и спросит "что должно остаться в итоге".
Судя по http://w3.siemens.com/mcms/automation-software/en/tia-portal-software/tia-portal-options/videos/pages/video-multiuser-engineering.aspx , multi user engineering в TIA это, скорее, обвязка вокруг git. Такое сделать можно (но, в целом, и сейчас можно поместить проект в git и работать с ним).
у JB это япрочитал про datalore, а у портала да multiuser называется
UAVpilot
12.02.2018, 23:05
Это как? Pru0Init меняет значение переменной из другой программы? Такого вообще не должно быть.
Это похоже на чей-то глюк. Удалил из ПЛК PRU0.prg, сделал заводской сброс, залил PRU0.prg в ПЛК - и всё заработало как и положено...
До этого пробовал поотдельности перезаливать PRU0.prg или делать заводской сброс - не помогало. Причём это самый первый проект на этом экземпляре контроллера после его покупки.
Благодарю за помощь!
Newcomer
26.03.2018, 19:02
Всю голову сломал. Как избавиться от этой красноты ?
Владимир Ситников
26.03.2018, 19:21
Всю голову сломал. Как избавиться от этой красноты ?
Скорее всего, вы добавили запятую посредине названия переменной. Сейчас такое не поддерживается и нужно ставить запятую либо до либо после переменной. Либо после переменной нажимать Enter.
Т.е. удалить лишние символы (либо вообще удалить всё красное) и запятую ставить только тогда, когда сама переменная верная. Так понятнее?
Newcomer
27.03.2018, 11:28
Скорее всего, вы добавили запятую посредине названия переменной. Сейчас такое не поддерживается и нужно ставить запятую либо до либо после переменной. Либо после переменной нажимать Enter.
Т.е. удалить лишние символы (либо вообще удалить всё красное) и запятую ставить только тогда, когда сама переменная верная. Так понятнее?
Редактировать строку - это какое-то мучение.
Новости по Hardella какие-то есть ?
Менял на одной машине ПЛК по причине его выхода из строя, проект с использованием Hardella написан около года назад. Залил проект в ПЛК, а pru0.prg и pru1.prg не залил, хотя в предыдущем ПЛК они были залиты. Однако, всё заработало. Т. е. получается, что не очень-то эти файлы и нужны?
Владимир Ситников
09.04.2018, 10:44
Без этих файлов основная прошивка ПЛК пытается обращаться к PRU для отработки стандартной конфигурации (например, считывает показания быстрых входов)
Проблема в том, что даже после заливки PRU программы это не прекращается, т.к. основная прошивка не догадывается про Hardella.
Если же залить файл .prg, то основная прошивка перестаёт ломиться в PRU.
Как именно устроен штатный обмен не знаю, поэтому залить файл всё же стоит.
Спасибо, понял. При случае исправлю. Хотя машинка уже двое суток молотит без проблем.
Получается, что если и есть конфликт, то в данном случае его влияние не критично, но не факт, что не будет критичного влияния на других проектах с Hardella.
Newcomer
10.04.2018, 14:00
То Владимир Ситников.
Владимир, хочу сделать ФБ для управления ШД такого плана: ШД разгоняется и каждые 10 мс основная программа ПЛК на ходу (без останова ШД) меняет период следования импульсов. Фб для PRU считает все отработанные импульсы и передает их в основную программу ПЛК. Получится у меня такое сделать ?
Владимир Ситников
10.04.2018, 16:35
Владимир, хочу сделать ФБ для управления ШД такого плана: ШД разгоняется и каждые 10 мс основная программа ПЛК на ходу (без останова ШД) меняет период следования импульсов. Фб для PRU считает все отработанные импульсы и передает их в основную программу ПЛК. Получится у меня такое сделать ?
Ускорение-замедление на ходу за счёт PRU не реализовано, а вот просто разогнать и потом менять скорость на ходу может и получиться. Если менять раз в 10мс и несильно, то может и нормально работать.
Импульсы считаться тоже будут.
Newcomer
25.04.2018, 11:43
То Владимир Ситников.
Владимир, у вас в ШИМ блоке из стандартной библиотеки период и скважность в каких единицах задаются ?
Владимир Ситников
25.04.2018, 12:30
в ШИМ блоке из стандартной библиотеки период и скважность в каких единицах задаются ?
В количествах запусков.
Если ШИМ блок вызывается на каждом цикле PRU, то единица измерения совпадает с циклом PRU.
Если нужно реже, то можно с помощью блока PRU_CURRENT_TIME получать текущее время и, соответственно, вызывать ШИМ реже.
Newcomer
25.04.2018, 12:54
В количествах запусков.
Если ШИМ блок вызывается на каждом цикле PRU, то единица измерения совпадает с циклом PRU.
Если нужно реже, то можно с помощью блока PRU_CURRENT_TIME получать текущее время и, соответственно, вызывать ШИМ реже.
Если цикл PRU равен 1 мкс и мне надо получить скважность 2, а период 10 мкс, то perid надо задать 10. А какое значение должно иметь value (скважность) ?
Скважность - это отношение периода следования импульсов к длительности импульса и является безразмерной величиной.
Newcomer
25.04.2018, 14:32
FUNCTION_BLOCK PWM_DW (* Pulse Width Modulation generator *)
variables:
input value : DWORD;
input period : DWORD;
output Q : BOOL;
pos : DWORD;
body:
IF pos >= period THEN
pos := 1;
ELSE
pos := pos + 1;
END_IF;
Q := pos <= value;
Согласно вашему коду, если период следования импульсов должен быть 10 мкс, а скважность 2, то period надо задать 10, а value - 5. Я правильно понимаю ?
Владимир Ситников
25.04.2018, 14:43
Согласно вашему коду, если период следования импульсов должен быть 10 мкс, а скважность 2, то period надо задать 10, а value - 5. Я правильно понимаю ?
Да, верно. period=10, value=5 и будет 11111 00000 11111 00000
Владимир Ситников
25.04.2018, 15:21
Владимир, я немного расширил ваш код. Добавлен счетчик импульсов, состояние которого можно читать из основной программы ПЛК. Счетчик импульсов можно обнулять из основной программы ПЛК. Я все правильно сделал ?
Ну, да. Выглядит верно.
Я бы вместо IF (Q_P = FALSE AND Q = TRUE)
написал IF R_TRIG(CLK := Q).Q THEN. При этом переменная Q_P не нужна, и по-моему более понятна суть (см https://hardella.com/docs/pru/examples/fast-counter/ )
Newcomer
25.04.2018, 16:27
Владимир, value в FUNCTION_BLOCK PWM_DW правильно называть не скважность, а длительность импульса.
Newcomer
25.04.2018, 17:58
Владимир, как создать то, что на картинке ?
Владимир Ситников
25.04.2018, 18:29
Владимир, как создать то, что на картинке ?
https://hardella.com/docs/pru/data-exchange/#%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-pru
Newcomer
06.05.2018, 10:21
To В.Ситников.
Правильно я понимаю, что если в основной программе ПЛК сделать один раз вызов программы, то программа TEPPER3_PRU0_PWM будет постоянно выполнятся с заданными значениями ?
Владимир Ситников
06.05.2018, 12:05
то программа STEPPER3_PRU0_PWM будет постоянно выполнятся с заданными значениями ?
Да, программы в PRU выполняются сами собой и им не нужны какие-либо пинки снаружи.
Но стоит учитывать, что MemoryTransfer может завершиться с ошибкой и PRU программа данных не получит (см значение SteppersConfig_Pru0MemoryTransfer.writeFails)
Технически, MemoryTransfer делает 100 попыток и, если за эти 100 попыток PRU так и не ответит (например, PRU программа вошла в бесконечный цикл), то обмен отменяется.
На практике у меня данные передавались с 1-го раза, ну максимум со 2-3-4.
https://hardella.com/docs/pru/data-exchange/#%D0%9F%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-pru
Если щелкнуть по лампочке, то выскочит то, что на первой картинке, а надо ввести то, что на второй картинке.
Нужен шаблон @Export(). Как его вытащить ?
Владимир Ситников
07.05.2018, 15:20
Если щелкнуть по лампочке, то выскочит то, что на первой картинке, а надо ввести то, что на второй картинке.
Нужен шаблон @Export(). Как его вытащить ?
Вытащить что?
Нужно всё-таки объявить переменную (хотя бы указать её тип) и тогда уже можно будет рулить тем, какие из полей нужно-не нужно обменивать с основной программой.
Т.е. логика в том, что сначала создаём переменную в PRU программе, а потом уже указываем, что она (или её составные части) будут участвовать в обмене.
Кое как ввел то, что хотел, но что-то не так. В чем у меня ошибка ?
Ввел по новой STEP3 и STEP3.Q и все стало нормально.
Владимир Ситников
07.05.2018, 15:42
Кое как ввел то, что хотел, но что-то не так. В чем у меня ошибка ?
Скорее всего, STEP3() было получено копированием STEP2() и заменой 2 на 3. Так пока не работает (нужно чинить, но чего-то руки не доходили до этого).
Т.е. нунжо удалить STEP3(); и набрать заново.
Владимир, не подскажите почему у меня на ПК с Windows XP не устанавливается Java 8. Год назад ставил и все было нормально. Скачал с сайта jdk-8u171-windows-i586.exe и не могу поставить. Переустановка ОС ничего не дала.
Владимир Ситников
27.05.2018, 18:21
Владимир, не подскажите почему у меня на ПК с Windows XP не устанавливается Java 8. Год назад ставил и все было нормально. Скачал с сайта jdk-8u171-windows-i586.exe и не могу поставить. Переустановка ОС ничего не дала.
Хороший вопрос. А какую-нибудь ошибку показывает?
Хороший вопрос. А какую-нибудь ошибку показывает?
При запуске видно, что идет обращение к жесткому диску и все. Никаких сообщений не выдается. Похоже Windows XP перестала поддерживаться.
Владимир, такой вопрос. Файлы PRU*.prg нужно загружать в ПЛК каждый раз после корректировки программ для PRU или это надо сделать один единственный раз ?
Владимир Ситников
01.06.2018, 10:21
Владимир, такой вопрос. Файлы PRU*.prg нужно загрузить в ПЛК каждый раз после корректировки программ для PRU ?
Нет. PRU*.prg достаточно загрузить один раз. Эти файлы не меняются.
Владимир, не подскажите почему у меня на ПК с Windows XP не устанавливается Java 8. Год назад ставил и все было нормально. Скачал с сайта jdk-8u171-windows-i586.exe и не могу поставить. Переустановка ОС ничего не дала.на выходных был загородом, действительно есть проблемы с обновлением явы на ХР 32-бит, но на предприятиях я оставляю папку с явой прямо на флешке, она спокойно может работать и без установки
на выходных был загородом, действительно есть проблемы с обновлением явы на ХР 32-бит, но на предприятиях я оставляю папку с явой прямо на флешке, она спокойно может работать и без установки
Hardella не будет работать если на ПК не установлена JAVA 8. Как может помочь то, что вы выложили ?
Владимир Ситников
04.06.2018, 10:34
Hardella не будет работать если на ПК не установлена ява. Как может помочь то, что вы выложили ?
Будет.
Распакуйте jre1.8.0_171.rar в папку с Hardella, и переименуйте папку jre1.8.0_171 в просто jre.
Иными словами, рядом с hardella.bat должна быть папка jre в которой bin в которой java.exe
Да, нужно JRE включить в состав сборки.
чтоб не объяснять как добавлять путь в бат-файле я бы предложил содержимое архива "кинуть" в установленную папку с последним релизом
Будет.
Распакуйте jre1.8.0_171.rar в папку с Hardella, и переименуйте папку jre1.8.0_171 в просто jre.
Иными словами, рядом с hardella.bat должна быть папка jre в которой bin в которой java.exe
Да, нужно JRE включить в состав сборки.
Сделал, заработало. Спасибо capzap и Владимиру.
Владимир, гляньте, пожалуйста, опытным глазом правильно ли у меня все сделано. Правильно ли оформлена программа для PRU0 ? В PRU0 посредством ШИМ управляю входами Step двух драйверов ШД.
Владимир Ситников
05.06.2018, 13:58
Владимир, гляньте, пожалуйста, опытным глазом правильно ли у меня все сделано. Правильно ли оформлена программа для PRU0 ? В PRU0 посредством ШИМ управляю входами Step двух драйверов ШД.
Выглядит нормально.
input dir, наверное, лишняя переменная, но я так понимаю, не суть.
Выглядит нормально.
input dir, наверное, лишняя переменная, но я так понимаю, не суть.
Спасибо, input dir убрал. Программа для PRU0 правильно составлена ?
Владимир Ситников
05.06.2018, 14:15
Программа для PRU0 правильно составлена ?
Думаю, да.
leotiger
01.07.2018, 21:06
Владимир, можете пояснить есть ли возможность управлять с одной PRU 2-мя шаговыми двигателями?(всего нужно управлять 3-мя двигателями). Направление будет определятся обычными выходами контроллера
Данная чуть изменённая программа вызывает ошибку компиляции. из-за инициализации второго объекта PRU_STEPPER
37861
Спасибо!
Владимир, можете пояснить есть ли возможность управлять с одной PRU 2-мя шаговыми двигателями?(всего нужно управлять 3-мя двигателями). Направление будет определятся обычными выходами контроллера
Данная чуть изменённая программа вызывает ошибку компиляции. из-за инициализации второго объекта PRU_STEPPER
37861
Спасибо!
Так не получится, памяти не хватит.
Nikolay.L
14.07.2018, 10:37
Выкладываю свой Stepper, позволяющий крутить 4 шаговых двигателя на ПЛК-110 (по 2 на 1 сопроцессор)
Ограничение: Ускорение = Замедлению, Импульсы в 1 такт (у меня 10 мкс, так как у меня драйверы ЩД требуют от 5 до 7,5 мкс).
На моем рабочем проекте все работает, а у меня именно 4 шд и работают одновременно. Если хотите выложу видео.
Желаю и Вам удачи!
https://cloud.mail.ru/public/LXH8/shgj2EU4q - Программа для CoDeSys с тестированием
https://cloud.mail.ru/public/7CRH/g9pXhZ1bT - Проект в Hardella
https://cloud.mail.ru/public/5pCP/yn48UdAND - PruConfig для загрузки в CoDeSys
Ваш Stepper может выдавать максимум 50 кГц ?
Переменные в проекте для ПЛК не прокомментированы. Какая переменная сопоставлена Dir, а какая Step ШД ?
Nikolay.L
14.07.2018, 11:04
500 кГц, но нужно будет исправить время такта на 1 мкс, и в ФБ Stepper_light в 3-х местах где деление исправить с 100 000 на 1000 000.
Но тогда импульсы будут длительностью 1мкс.
Мои драйверы ШД при таких импульсах давали фризы, и так как у меня скорости не достигают и 10 кГц, то я и ввел эти ограничения.
Если у вас период 20 мкс, то максимальная частота будет не 500 кГц, а 50 кГц.
У вас в проекте для ПЛК нет вызова программ, отвечающих за обмен между ЦП и сопроцессорами. Или я что-то не пониvаю ?
Nikolay.L
14.07.2018, 11:41
если такт 10 мкс, то макс скорость 50 кГц
если такт исправить на 1 мкс (как описано выше) то макс скорость 500 кГц.
в ПЛК загружаете:
PruConfig.ZIP\PRU0.prg
PruConfig.ZIP\PRU1.prg
PruConfig.ZIP\PruConfig.exp
Nikolay.L
14.07.2018, 11:45
Dir - управляете из основного проекта в Codesys.
Мое решение генерирует импульсы на первые 4 быстрых выхода
в ПЛК загружаете:
PruConfig.ZIP\PRU0.prg
PruConfig.ZIP\PRU1.prg
PruConfig.ZIP\PruConfig.exp
Это само собой разумеется.
Не понятно почему у вас в программе нет вызова программ PruConfig_Pru1MemoryTransfer и PruConfig_Pru0MemoryTransfer.
Владимир Ситников
14.07.2018, 14:30
Выкладываю свой Stepper, позволяющий крутить 4 шаговых двигателя на ПЛК-110 (по 2 на 1 сопроцессор)
Ограничение: Ускорение = Замедлению, Импульсы в 1 такт (у меня 10 мкс, так как у меня драйверы ЩД требуют от 5 до 7,5 мкс).
На моем рабочем проекте все работает, а у меня именно 4 шд и работают одновременно. Если хотите выложу видео.
Желаю и Вам удачи!
https://cloud.mail.ru/public/LXH8/shgj2EU4q - Программа для CoDeSys с тестированием
https://cloud.mail.ru/public/7CRH/g9pXhZ1bT - Проект в Hardella
https://cloud.mail.ru/public/5pCP/yn48UdAND - PruConfig для загрузки в CoDeSys
Вах!
Не против, если я включу блок/пример в очередную версию Hardella?
Видео, да, было бы интересно посмотреть.
Nikolay.L
14.07.2018, 17:51
Как нет вызова программы:
38009
или я не эту загрузил?
Nikolay.L
14.07.2018, 17:57
Вах!
Не против, если я включу блок/пример в очередную версию Hardella?
Видео, да, было бы интересно посмотреть.
Конечно не против, я для этого её и выкладываю.
Я сам инженер конструктор, программировать станки стал ввиду удобства это делать самому, а не объяснять на пальцах программисту как это должно работать. Я сначала сделал управление 4-мя ШД на вашем блоке с запуском попеременно, но это потребовало дополнительных связей в программе и увеличило время цикла.
Про видео я спрошу у руководства, и если оно не против - выложу. Хотя там больше механика станка, но видно что двигатели работают одновременно.
Nikolay.L
Ваш вариант PRU-модуля может крутить ШД бесконечно? Задача такая - выставляем скорость и крутим\стоим по команде. Разгоны и торможения вообще не актуальны.
Как нет вызова программы:
38009
или я не эту загрузил?
И где там вызов PruConfig_Pru1MemoryTransfer и PruConfig_Pru0MemoryTransfer ?
Nikolay.L
Ваш вариант PRU-модуля может крутить ШД бесконечно? Задача такая - выставляем скорость и крутим\стоим по команде. Разгоны и торможения вообще не актуальны.
А как без разгона можно раскрутить ШД до большой скорости ?
Nikolay.L
16.07.2018, 12:51
И где там вызов PruConfig_Pru1MemoryTransfer и PruConfig_Pru0MemoryTransfer ?
Как и писал выше я не программист, но если правильно понимаю, то блоки "PruConfig_Pru1MemoryTransfer" и "PruConfig_Pru0MemoryTransfer" в поле основной программы "PLS_PRG" - это и есть вызов данных подпрограмм. По крайней мере у меня все так и работает.
Nikolay.L
16.07.2018, 12:59
А как без разгона можно раскрутить ШД до большой скорости ?
Если я правильно понимаю:
1- то ШД не предназначен для высоких скоростей,
2 - без плавного разгона ШД даже до средних скоростей может и не раскрутится, особенно если большая нагрузка.
Простой генератор импульсов без проблем можно написать самому. Задаете необходимую частоту, делением количества тактов в секунду (1 000 000 при такте 1мкс) на эту частоту получаете количество тактов на 1 импульс. запускаете счетчик, и при достижении заданного количества сбрасываете счетчик в ноль и формируете импульс.
Не забудьте предусмотреть выключение процесса (по сигналу с основного цикла ПЛК или по времени).
А как без разгона можно раскрутить ШД до большой скорости ?
Вообще-то я про большую скорость ничего не говорил. Я сочиняю шнековый дозатор, а там по конструкции выше 100 об\мин считается запредельной скоростью. Думаю даже ставить ШД с редукторами.
Nikolay.L
16.07.2018, 14:08
Вообще-то я про большую скорость ничего не говорил. Я сочиняю шнековый дозатор, а там по конструкции выше 100 об\мин считается запредельной скоростью. Думаю даже ставить ШД с редукторами.
а чем вам связка мотор редуктор с асинхронным двигателем + Частотный регулятор не устраивает? У нас на производстве ТПА как раз с такими стоят.
Nikolay.L
Потому что габариты. Диаметр шнеков 38 миллиметров. Четыре бункера с рецептурой по процентам сыпят в один, который командует всем стоять или всем ехать. Процентовка как раз и регулирует скорость.
Владимир Ситников
17.07.2018, 23:12
если такт 10 мкс, то макс скорость 50 кГц
Я так понимаю, константа 10мкс ещё в сам блок зашита, ведь сам блок Stepper_light не использует "текущее время".
Полагаю, если уменьшать эту константу, то точность "accel_period" испортится (т.к. деление 100000/accel целочисленное)
Некий минус, что тут нет "минимальной скорости". Т.е. стартует блок с нулевой скорости и это может приводить к пропускам импульсов на резонансных частотах.
На оборудовании такого не наблюдалось?
Для порядка попробовал Stepper_Light на "разных скоростях".
Честно говоря, не берусь судить, но, наверное, выше 15кГц на "10мкс цикле" вряд ли разумно крутить.
На картинке чёрными точками (их много и они слились просто) отмечены импульсы, выдаваемые блоком, а красная линия это "идеальная траектория" для указанных параметров движения.
accel=10кГц/сек, max_speed=50кГц, quantity=251000
При таком ускорении максимальная скорость должна набираться за 5 секунд и за эти 5 секунд ШД должен проехать 10000*5*5/2==125'000 импульсов.
Ещё столько же на торможение и 1000 посредине.
В целом, конечно, не так-то и плохо, но скачки между 20кГц, 25кГц, 33кГц, 50кГц (по сути это эффект того, что импульсы квантуются по 10мкс) выглядят сурово и едва ли ШД сможет перепрыгнуть с одной скорости на другую.
38031
В режиме accel=1кГц/сек, max_speed=5кГц, quantity=26000 выглядит ровнее
38032
В режиме accel=0.1кГц/сек, max_speed=0.5кГц, quantity=2560 ещё ровнее
38033
Nikolay.L
18.07.2018, 08:38
Я так понимаю, константа 10мкс ещё в сам блок зашита, ведь сам блок Stepper_light не использует "текущее время".
Полагаю, если уменьшать эту константу, то точность "accel_period" испортится (т.к. деление 100000/accel целочисленное)
Некий минус, что тут нет "минимальной скорости". Т.е. стартует блок с нулевой скорости и это может приводить к пропускам импульсов на резонансных частотах.
На оборудовании такого не наблюдалось?
Для порядка попробовал Stepper_Light на "разных скоростях".
Честно говоря, не берусь судить, но, наверное, выше 15кГц на "10мкс цикле" вряд ли разумно крутить.
На картинке чёрными точками (их много и они слились просто) отмечены импульсы, выдаваемые блоком, а красная линия это "идеальная траектория" для указанных параметров движения.
accel=10кГц/сек, max_speed=50кГц, quantity=251000
При таком ускорении максимальная скорость должна набираться за 5 секунд и за эти 5 секунд ШД должен проехать 10000*5*5/2==125'000 импульсов.
Ещё столько же на торможение и 1000 посредине.
В целом, конечно, не так-то и плохо, но скачки между 20кГц, 25кГц, 33кГц, 50кГц (по сути это эффект того, что импульсы квантуются по 10мкс) выглядят сурово и едва ли ШД сможет перепрыгнуть с одной скорости на другую.
38031
В режиме accel=1кГц/сек, max_speed=5кГц, quantity=26000 выглядит ровнее
38032
В режиме accel=0.1кГц/сек, max_speed=0.5кГц, quantity=2560 ещё ровнее
38033
Я и назвал Stepper_ligth. Для моего станка все идеально подошло (у меня 5кГц максимум).
Понятие минимальной скорости здесь не совсем уместно. Старт происходит с первого импульса, который привязан только к команде запуска, дальше в зависимости от ускорения. При замедлении стоит защита чтоб не менее 10 Гц.
По поводу 10мкс - это упрощение для моего проекта, мои драйверы требуют импульсы не менее 5мкс. Для большей точности можно без проблем изменить такт на 1мкс, нужно только поправить числитель в 3-х местах со 100 000 на 1 000 000. А для ширины импульса задать отдельный счетчик. Я просто не стал заморачиваться.
Я экспериментировал с 1мкс . Драйвера DM442 и AM882 -съедали без проблем, а вот дешевый DM422с - пропускал несколько шагов. При этом крутились все одновременно ровно, без рывков и заеданий. При переходе на 10мкс - крутились так же ровно, и DM422с стал отрабатывать как нужно.
Я скинул на 90% свой проект (у меня 1 шд работает в связке с энкодером) и думаю его без проблем можно адаптировать под другие требования, в том числе и по точности.
День добрый.
Перечитывать всё времени нет.
Сколькими ШД я могу управлять с помощью Hardella?
Так чтобы с ускорением\держанием заданной скоростью и тормозом независимо ШД друг от друга.
EN\Reverse допускается управление через обычные выхода.
Спасибо
Nikolay.L четырьмя ШД управляет.
Владимир Ситников
18.07.2018, 11:02
День добрый.
Перечитывать всё времени нет.
Сколькими ШД я могу управлять с помощью Hardella?
Так чтобы с ускорением\держанием заданной скоростью и тормозом независимо ШД друг от друга.
EN\Reverse допускается управление через обычные выхода.
Спасибо
С готовым блоком -- 2 ШД.
С Stepper_Light 4ШД, но там не реализовано удержание скорости. Нужно будет добавить пару условий, чтобы, например, при указании Quantity=100500 блок не переходил в режим замедления.
Nikolay.L
18.07.2018, 11:54
Как и обещал, выкладываю видео:
https://youtu.be/otC14QJJO_I
Станок ещё в отладке, поэтому не судите строго.
В разработку и изготовление станка вложены не малые деньги. Интересно каков срок окупаемости станка.
Nikolay.L
18.07.2018, 12:40
Точных цифр не скажу, но не более 2-х лет
Ide: Hardella 1.7.2
ПЛК: 110-30.К.М М02
Проблема
Загрузил пример BlinkningLeds, выхода моргают, но в конфигураторе codesys 2 быстрых входа (понятно что доступ из конфигуратора потерял к ним) и 3 обычных постоянно "горят" и никак не реагируют на внеш.воздействие.
Почему теряется возможность отслеживать простые 3 входа?
Если удалить PRU0 и PRU1, почистить проект и перезагрузить то всё работает в штатном режиме. До загрузки из hardella тоже кстати всё работало.
Вот скрин конфигуратора https://yadi.sk/i/jLSTcN2K1wcveg
В инструкции на сайте
Настройка CoDeSys для PRU программирования В двух словах: нужно загрузить .prg и .exp файлы, и добавить библиотеку pruAccessLib.lib. Этот файл можно взять...
В обновлении 24 янв 2017: v1.6.2
PRU: Подключать библиотеку pruAccessLib.lib больше не требуется
Так надо её подключать или не надо?
5й выход работает нормально, получается всегда первые 4 входа перестают работать, хотя быстрых только 2. Баг или фича? Как поправить?
Владимир Ситников
06.11.2018, 16:05
ПЛК: 110-30.К.М М02
Почему теряется возможность отслеживать простые 3 входа?
У меня 110-32.К.М М02
Тут, наверное, вопрос к ОВЕН. По известной мне информации, через PRU заведено 4 цифровых входа.
Если в 30.К.М М02 раскладка другая, то есть такие варианты:
1) Спросить у ОВЕН -- может, ответят
2) Подобрать. ПЛК же есть?
Попробуйте залить туда такую программу (для начала -- в PRU0):
@Export
output reg30 : DWORD;
...
ASM
ADD reg30, R31.dw, 0
END_ASM
Известные мне данные попадают в 2,3,21 и 22 биты регистра R31.
Возможно, 5-ый "потеряный" вход попадает в ещё какой-то бит регистра R31.
Или, возможно, эти данные приходят в PRU1 -- там можно аналогично посмотреть что приходит в R31.
К сожалению, сделать работу "через конфигуратор" невозможно -- тут ОВЕН не рассказывают про то, как прошивка ПЛК общается данными со "штатной" PRU программой. С другой стороны, если входы "загораются в конфигураторе", то для меня это намёк на то, что по факту, эти входы обрабатываются в PRU, и наверняка их можно распознать по R31 одного из PRU ядер.
Так надо её подключать или не надо?
С новой версией Hardella (начиная с 1.6.2) -- не надо. Да, надо обновить сайт.
Владимир Ситников
06.11.2018, 16:12
5й выход работает нормально, получается всегда первые 4 входа перестают работать, хотя быстрых только 2. Баг или фича? Как поправить?
А, 5-ый работает, тогда, скорее всего, дело в том, что первые 4 входа всегда заведены через PRU и обращаться к ним нужно через блок FAST_INPUTS для программы PRU0: https://hardella.com/docs/pru/standard-library/#fast_inputs
А, 5-ый работает, тогда, скорее всего, дело в том, что первые 4 входа всегда заведены через PRU и обращаться к ним нужно через блок FAST_INPUTS для программы PRU0: https://hardella.com/docs/pru/standard-library/#fast_inputs
Да действительно могу добраться до 3 и 4 через FAST_INPUTS, но судя из документации ПЛК это не быстрые.
Не понятно будут ли они работать так же как 1 и 2 или на них частоту такую же как на простые и не более? Похоже всё таки фича.
Да действительно могу добраться до 3 и 4 через FAST_INPUTS, но судя из документации ПЛК это не быстрые.
Не понятно будут ли они работать так же как 1 и 2 или на них частоту такую же как на простые и не более? Похоже всё таки фича.
О, тут capzap научился поиском работать
http://www.owen.ru/forum/showthread.php?t=29721&page=2&p=291841&viewfull=1#post291841
ответ тут
http://www.owen.ru/forum/showthread.php?t=23013&page=48&p=233734&viewfull=1#post233734
Владимир Ситников
06.11.2018, 17:07
Да действительно могу добраться до 3 и 4 через FAST_INPUTS, но судя из документации ПЛК это не быстрые.
Не понятно будут ли они работать так же как 1 и 2 или на них частоту такую же как на простые и не более? Похоже всё таки фича.
Насколько я помню, говорилось, что "быстрые" оптроны только на быстрых входах. Какие реально оптроны на 3 и 4 входах -- без понятия.
Владимир Ситников
06.11.2018, 17:08
ответ тут
http://www.owen.ru/forum/showthread.php?t=23013&page=48&p=233734&viewfull=1#post233734
Да, нужно приводить в порядок документацию на hardella.com. Когда писал мне казалось более-менее понятным. Сейчас смотрю -- действительно как-то косо написано.
P.Mikhail
08.03.2019, 20:39
Выкладываю свой Stepper, позволяющий крутить 4 шаговых двигателя на ПЛК-110 (по 2 на 1 сопроцессор)
Ограничение: Ускорение = Замедлению, Импульсы в 1 такт (у меня 10 мкс, так как у меня драйверы ЩД требуют от 5 до 7,5 мкс).
На моем рабочем проекте все работает, а у меня именно 4 шд и работают одновременно. Если хотите выложу видео.
Желаю и Вам удачи!
https://cloud.mail.ru/public/LXH8/shgj2EU4q - Программа для CoDeSys с тестированием
https://cloud.mail.ru/public/7CRH/g9pXhZ1bT - Проект в Hardella
https://cloud.mail.ru/public/5pCP/yn48UdAND - PruConfig для загрузки в CoDeSys
Помогите разобраться начинающему. Запускаю в КДС 2.3 программу - 4_Step_Motor.pro. У меня выскакивает предупреждение- ошибка чтения целевой платформы. Я так понял что не находит подходящий таргет файл. Но я все таргет файлы с диска овен загрузил. Может нужен какой-то определенный? Можете подсказать?
пс. Разобрался. надо было с сайта овен таргеты скачать.
Только сегодня заметил эту прекрасную тему. Хотел спросить, а проект жив еще?
Владимир Ситников
12.04.2019, 10:52
Только сегодня заметил эту прекрасную тему. Хотел спросить, а проект жив еще?
Что понимается под словом "жив"?
Работать -- работает.
В ближайших планах обновить платформу (сейчас, например, для работы требуется Java8, которую не так-то просто найти, а хочется, чтобы прямо из коробки работало)
Миних В.А.
12.04.2019, 11:02
Владимир, приветствую. Получилось сделать умный дом с помощью Hardella IDE?
Что понимается под словом "жив"?
Работать -- работает.
В ближайших планах обновить платформу (сейчас, например, для работы требуется Java8, которую не так-то просто найти, а хочется, чтобы прямо из коробки работало)
Просто смотрю последнее обновление в 2017. Испугался что проект заброшен. Конечно ваш труд это нечто!!! Огромный респект вам за такую прекрасную среду!!! Установил JDK11 и IDE'шку. Буду тестить свои проекты под ПЛК73.
Владимир Ситников
12.04.2019, 11:14
Владимир, приветствую. Получилось сделать умный дом с помощью Hardella IDE?
Пока по-простому: КДС и всего делов.
Владимир Ситников
12.04.2019, 11:15
Просто смотрю последнее обновление в 2017. Испугался что проект заброшен. Конечно ваш труд это нечто!!! Огромный респект вам за такую прекрасную среду!!! Установил JDK11 и IDE'шку. Буду тестить свои проекты под ПЛК73.
На JDK11 не заработает. Только JDK8. 8-ку можно взять, например, тут: https://bintray.com/jetbrains/intellij-jdk
На JDK11 не заработает. Только JDK8. 8-ку можно взять, например, тут: https://bintray.com/jetbrains/intellij-jdk
Она вообще запускаться не должна на JDK11?
42242
Так-то вроде запустилась.
Владимир Ситников
12.04.2019, 11:48
Она вообще запускаться не должна на JDK11?
42242
Так-то вроде запустилась.
Жесть какая. Я не пробовал. На macos на JRE11 точно не запускается. На Windows -- не знаю. А что покажет окошко Help -> About?
Жесть какая. Я не пробовал. На macos на JRE11 точно не запускается. На Windows -- не знаю. А что покажет окошко Help -> About?
Вот... WIN10 64bit
42244
JDK этот https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
Если что-то нужно по ПЛК73 и его бибкам то я готов чем-то помочь... А то у самого уже этот Codesys в печенках сидит... Пригорело уже за эти года... Буду пока изучать вашу IDE'шку.
Владимир Ситников
12.04.2019, 12:20
JDK этот https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
Посмотрите на картинку -- у вас JRE 1.8.0u201
При этом, JRE/JDK использование с сайта Oracle без лицензии запрещено. Иными словами, оно требует денег.
Кстати говоря, а навигации по проекту как на скрине ниже не планируется??
42254
Владимир Ситников
12.04.2019, 20:57
Кстати говоря, а навигации по проекту как на скрине ниже не планируется??
42254
Картинка интересная, но есть основания полагать, что стоит делить простыню на функции-процедуры.
Подобной навигации в продуктах JetBrains не видел, поэтому само собой в Hardella оно вряд ли появится, а я не думаю, что оно кардинально что-нибудь упростит.
В плане навигации забавнее какой-нибудь дракон (https://www.owen.ru/forum/showthread.php?t=27487) прикрутить.
Сижу, курю тему про ШД. Размышляю. Харделла - это здорово. Однако не нашел возможности рулить скоростью на ходу. А хочется. Задумался на тему стандартной фичи PWM на быстрых выходах. В power льем 50% для "ехать", и 0% для "стоять", скорость льем в period. Разгон\торможение задаем программно через рампу. Направление задаем с обычных выходов. Получится?
Сижу, курю тему про ШД. Размышляю. Харделла - это здорово. Однако не нашел возможности рулить скоростью на ходу. А хочется. Задумался на тему стандартной фичи PWM на быстрых выходах. В power льем 50% для "ехать", и 0% для "стоять", скорость льем в period. Разгон\торможение задаем программно через рампу. Направление задаем с обычных выходов. Получится?
Конечно получится. Сам так делал.
Владимир Ситников
На Харделла.ком ссылки на исходники примеров ведут на локалхост.Это так задумано?
43561
Владимир Ситников
На Харделла.ком ссылки на исходники примеров ведут на локалхост.Это так задумано?
43561
Да, Hardella подхватит этот пример и откроет его автоматом, крутая фича.
Тогда проблема. У меня Харделла в виртуальной машине без доступа к сети.
Р.Александр
14.07.2019, 10:08
Добрый день. Oracle закончили поддержку JDK8, по крайней мере на странице самой JDK (https://jdk.java.net/8/) висит такое обьявление, и ссылка для скачивания убрана. Сейчас везде продвигается JRE, однако с ним Hardella хотя и открывается. однако не компилируются конфигурационные файлы. Процесс вроде идет, однако в результате появляются файлы с нулевым размером.
Вопрос разработчику программы - можно ли использовать другие комплекты Java, к примеру JDK11? Стоит заниматься испытаниями , или сразу искать где то старые ссылки на левых сайтах, и нужен именно 8ой JDK ?
Владимир Ситников
14.07.2019, 10:46
Всё так, сейчас нужно JDK 1.8.
JDK 9/10/11 работать не будет -- переход на 11 ещё в процессе.
JDK можно взять отсюда (JBRSDK8): https://confluence.jetbrains.com/display/JBR/JetBrains+Runtime
Т.е. выбираем нужную ОС, переходим на закладку "files", и там файл jbrsdk-8u212...
Да, наверное нужно встраивать JDK в состав Hardella.
Р.Александр
14.07.2019, 12:46
Всё так, сейчас нужно JDK 1.8.
JDK 9/10/11 работать не будет -- переход на 11 ещё в процессе.
JDK можно взять отсюда (JBRSDK8): https://confluence.jetbrains.com/display/JBR/JetBrains+Runtime
Т.е. выбираем нужную ОС, переходим на закладку "files", и там файл jbrsdk-8u212...
Да, наверное нужно встраивать JDK в состав Hardella.
Там файл Java SE Development Kit, после установке при проверке в Hardelle Help-About вылазит JRE 1.8.0.
Я уже засомневался, может, что то не так с Java, или все таки не так в Hardella - при компиляции файлы PRU0 и PRU1 компилируются. в результате получаются файлы .prg размером 5 килобайт каждый, запись о создании файла .ехр тоже появляется. но самого файла нет, или он пустой , 0 байт обьемом, естественно, не экспортируется в КДС. Брал строго ваш пример с мигающими светодиодами (Blink), результат при неоднократных попытках - тот же самый. Хотя код блоков в Hardelle (CTRL+нажатие ) открывается.
Владимир Ситников
14.07.2019, 14:00
Там файл Java SE Development Kit, после установке при проверке в Hardelle Help-About вылазит JRE 1.8.0.
Я уже засомневался, может, что то не так с Java, или все таки не так в Hardella - при компиляции файлы PRU0 и PRU1 компилируются. в результате получаются файлы .prg размером 5 килобайт каждый, запись о создании файла .ехр тоже появляется. но самого файла нет, или он пустой , 0 байт обьемом, естественно, не экспортируется в КДС.
Скорее всего из-за русских букв в пути к Hardella. Предлагаю скопировать среду в c:\hardella и тогда заработает
Р.Александр
14.07.2019, 14:18
Она у меня сидит на С:\\ProgrammFiles\Hardella, но сейчас перекину. Также скачал JDK по вашей ссылке, однако там нет .bат (или какого другого ) файла запускающего установку.
Р.Александр
14.07.2019, 15:41
Она у меня сидит на С:\\ProgrammFiles\Hardella, но сейчас перекину. Также скачал JDK по вашей ссылке, однако там нет .bат (или какого другого ) файла запускающего установку.
Р.Александр
14.07.2019, 16:21
"Скорее всего из-за русских букв в пути к Hardella."
Почти правильно оказалось. Только не из за русских букв, а потому что я не убрал из названия папки с Hardella номер версии. То есть, не должно быть не только русских букв, но и ничего другого , кроме латинского шрифта. Стоило оставить Hardella7.1, как перестала компилировать файлы.
С JRE работает нормально.
Р.Александр
15.07.2019, 16:38
Еще вопрос к Владимиру: после импорта в КДС в POU перед PLC PRG (PRG) появляется Hardella_SimulationDetector(PRG). Что это такое, и если это имеет отношение к симуляции работы Hardella, как им воспользоваться ?
Владимир Ситников
15.07.2019, 16:59
Еще вопрос к Владимиру: после импорта в КДС в POU перед PLC PRG (PRG) появляется Hardella_SimulationDetector(PRG). Что это такое, и если это имеет отношение к симуляции работы Hardella, как им воспользоваться ?
Hardella_SimulationDetector нужно для того, чтобы обычная симуляция в КДС не ломалась.
Там дело в том, что в КДС симуляции нет такого понятия как "симуляция PRU", поэтому в генерированный код добавляется "если работаем в кдс симуляции, то не пытаться заливать код в PRU".
Эмуляция работы Hardella кода есть, но в виде Java библиотеки: https://github.com/vlsi/pru-emulator
Р.Александр
15.07.2019, 19:46
Hardella_SimulationDetector нужно для того, чтобы обычная симуляция в КДС не ломалась.
Там дело в том, что в КДС симуляции нет такого понятия как "симуляция PRU", поэтому в генерированный код добавляется "если работаем в кдс симуляции, то не пытаться заливать код в PRU".
Эмуляция работы Hardella кода есть, но в виде Java библиотеки: https://github.com/vlsi/pru-emulator
Понятно. Отсюда вопрос - при загрузке в реальный ПЛК, получается, необходимости в этой программе нет. Нужно ли ее удалять из списка POU при загрузке в реальный контроллер ?
Владимир Ситников
15.07.2019, 20:07
Понятно. Отсюда вопрос - при загрузке в реальный ПЛК, получается, необходимости в этой программе нет. Нужно ли ее удалять из списка POU при загрузке в реальный контроллер ?
Удалять не нужно. Необходимости в программе нет, но она ничего и не портит. Специально сделана так, чтобы ничего руками не трогать при заливке.
Р.Александр
15.07.2019, 21:19
Удалять не нужно. Необходимости в программе нет, но она ничего и не портит. Специально сделана так, чтобы ничего руками не трогать при заливке.
Спасибо. Пару дней поэкспериментирую с реальным ПЛК, благо только что получили новый как раз с открытыми выходами (без реле), причем шеф согласился пока оставить его для разных экспериментов , потом напишу результат. Пока - только о встроенных блоках ШД, составление проекта "с нуля" пока не пробовал.
Р.Александр
16.07.2019, 12:17
Можно подвести результат первого испытания . Все заработало сразу, с первой попытки.
Использовался ПЛК110-30М2, драйвер ШД PLD880, двигатель PL86H161, напряжение питания драйвера 48 вольт, ток 5а, деление шага от 1:2 до 1:32 (при разных частотах).
Максимально установленные параметры - ускорение 30000, замедление 10000, максимальная скорость 250000, количество импульсов 500000.
Все отработало нормально, причем с запасом. Больше я не пытался увеличивать скорость, так как при торможении загоралась лампа перегрузки драйвера .
Так что пока впечатления положительные.
Возникло несколько вопросов , один - после экспорта блока (программы) SteppersConfig_PRU0MemoryTransfer в КДС появляется комментарий Hardella о том, что данная программа устарела и будет удалена из следующих релизов, предлагается использовать MemoryRead и MemoryWrite.
При этом обе программы присутствуют и в данном примере, и , похоже, не участвуют в работе , так как данные принимает именно MemoryTransfer. Если возможно, прошу разьяснить данный момент. Можно, конечно, установить, что к чему экспериментально, однако не хочется тратить время.
Остальные вопросы будут после попытки составить свою программу, отличную от имеющихся готовых примеров.
Владимир Ситников
16.07.2019, 12:47
Все отработало нормально, причем с запасом.
Здорово.
Возникло несколько вопросов , один - после экспорта блока (программы) SteppersConfig_PRU0MemoryTransfer в КДС появляется комментарий Hardella о том, что данная программа устарела и будет удалена из следующих релизов, предлагается использовать MemoryRead и MemoryWrite.
При этом обе программы присутствуют и в данном примере, и , похоже, не участвуют в работе , так как данные принимает именно MemoryTransfer. Если возможно, прошу разьяснить данный момент. Можно, конечно, установить, что к чему экспериментально, однако не хочется тратить время.
Раздельные MemoryRead и MemoryWrite позволяют более внятно писать програму
MemoryRead(); // читаем состояние PRU
... обрабатываем, решаем что делать дальше
MemoryWrite(); // отправляем дальнейшую команду
Р.Александр
Вот как раз сейчас творю один двухосевой проект на ШД и Харделла. Пришла идея - спрятал все экспортные PRG харделлы в отдельную папочку, понравилось.
Р.Александр
25.09.2019, 19:27
Вопрос такой - в Hardella при управлении шаговым двигателем отключаются с первого по четвертый входы ПЛК. С отключением 1 и 2 входов все понятно - они тоже подключены к PRU, ресурсы которых используются для управления двигателем.
Однако, 3 и 4 входы (DI3 и DI4) на работают с PRU, тем не менее они тоже отключаются.
С чем это связано, и можно ли включить третий и четвертый входы, будет ли это влиять на работу программы STEPPER?
Владимир Ситников
25.09.2019, 20:40
https://hardella.com/docs/pru/features-and-limits/#%D0%A5%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80% D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B8-%D0%9F%D0%9B%D0%9A110-%D0%9C02
Модель ПЛК какая у вас?
Я так понимаю, DI3 и DI4 всегда через PRU распаяны (даже когда они простые, а не быстрые).
Т.е. DI3/4 нужно через PRU программу читать. Можно пробросить переменные. Для этого нужно объявить блок FAST_INPUTS и добавить сверху @Export(in3, in4)
Р.Александр
25.09.2019, 21:50
https://hardella.com/docs/pru/features-and-limits/#%D0%A5%D0%B0%D1%80%D0%B0%D0%BA%D1%82%D0%B5%D1%80% D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B8-%D0%9F%D0%9B%D0%9A110-%D0%9C02
Модель ПЛК какая у вас?
Я так понимаю, DI3 и DI4 всегда через PRU распаяны (даже когда они простые, а не быстрые).
Т.е. DI3/4 нужно через PRU программу читать. Можно пробросить переменные. Для этого нужно объявить блок FAST_INPUTS и добавить сверху @Export(in3, in4)
У меня ПЛК-110-30М2. Что то я сомневаюсь, что все 4 распаяны через PRU. Дело в том, что в ПЛК-110-30 всего два быстрых входа, и они имеют адреса %IX0.0 и %IX0.1, а 3 и 4 вход уже адресуется как %IB0.0 и %IB0.1, получается , они находятся в другом байте и включить их через PRU невозможно, и нет смысла распаивать через них.
Может быть, здесь нужно отключать только первый и второй входа, а отключение 4х делать только в ПЛК-110-60, в котором предусмотрено как раз 4 быстрых входа, и адреса у них %IX0.0 , %IX0.1, %IX0.2, %IX0.3 ?
Вот в этом случае они все, видимо, распаяны через PRU. Просто я не видел в инструкции на ПЛК-110-30 никаких ограничений на использование 3 и 4 входов .
Владимир Ситников
25.09.2019, 21:56
Что то я сомневаюсь, что все 4 распаяны через PRU
А проверить?
У меня ПЛК-110-32М2 и там, вроде, 3 и 4 через PRU, хотя тоже быстрых только 2.
Может быть, здесь нужно отключать только первый и второй входа
Отключаю не я, а прошивка ПЛК. И я на это повлиять не могу. Если из конфигурации перестают работать DI3/4, то это верный признак того, что они заведены через PRU0, и что через PRU0 должно получаться считывать их состояние.
Просто я не видел в инструкции на ПЛК-110-30 никаких ограничений на использование 3 и 4 входов
В инструкции на ПЛК-110 вообще ничего не говорится о возможности программирования PRU.
ПЛК-110-30М2
Именно на такой модели DI3 и DI4 при использовании PRU отключаются. Делал простую трансляцию из PRU-программы в программу хоста. Работает стабильно.
Р.Александр
26.09.2019, 06:51
Ну, понятно. В принципе, должно хватить остающихся 14 входов. Спасибо за ответ, а то я бы стал изгаляться над ПЛК, опытным путем выясняя все это. Плохо, что в инструкции к контроллеру ничего на эту тему нет.
В принципе, можно было бы файлы, создаваемые Hardella, прилагать к ПЛК как дополнительную библиотеку, описать процесс их использования , тогда разработчики шире использовали бы возможности PRU.
Р.Александр
29.09.2019, 20:48
В дополнение к предыдущему моему посту:
Все таки решив "вытащить" два входа , я попробовал "пробросить" их через PRU, решив, что все таки выходы 2 входа можно попробовать вытащить. Не получилось.
Стал проверять, что к чему, экспериментировать, получается, что все 4 входа заведены через PRU0. Потом нашел подтверждение этому на сайте :
"Следует помнить, что все входы заведены на PRU0, т.е. использовать FAST_INPUTS в программе для PRU1 не получится."https://hardella.com/docs/pru/standard-library/
То есть, если нужно использовать входа и один выход, нужно использовать входа на PRU0 и выход на PRU1.
Здравствуйте. 2 дня вожусь и не могу понять, почему Stepper_light для управления 4 шд не работает. До этого делал проект с двумя шаговиками, всё работает. С 4 шд программу запускаю, импульсы в CodeSys видно, что считаются, но на выходе плк всё тихо, индикаторы не моргают. PRU0 и PRU1 записаны в память плк, этот проект на 4 шд я и по своему переписал, сконвертировал в exp. Изменений никаких. В чём причина может быть?
ВЛ85
Вот это делали?
(*Запускаем PRU*)
PruConfig_Pru0Init(enable:=TRUE , running=>PRU_0_RUN );
PruConfig_Pru1Init(enable:= TRUE, running=>PRU_1_RUN );
Нет. Спасибо, попробую, как вернусь из командировки
Р.Александр
10.10.2019, 19:18
Вопрос Сотникову:
Меня интересует следующее: в некоторых случаях нет необходимости подавать на ШД импульсы с частотой несколько сот килогерц, достаточно сотни или даже меньше.
Нельзя ли при увеличении времени цикла PRU, допустим, до 10 мсек в одном PRU создать два независимых степпера (генератора импульсов для шагового двигателя), используя каждый быстрый выход в качестве step1 и step2. Направление вращения можно задавать обычным выходом ПЛК, так как там нет необходимости в большой скорости. Таким образом, можно было бы получить на одном ПЛК управление четырьмя двигателями.
Пока интересуюсь просто из любопытства.
Р.Александр
11.10.2019, 00:45
Вопрос Сотникову:
Меня интересует следующее: в некоторых случаях нет необходимости подавать на ШД импульсы с частотой несколько сот килогерц, достаточно сотни или даже меньше.
Нельзя ли при увеличении времени цикла PRU, допустим, до 10 мсек в одном PRU создать два независимых степпера (генератора импульсов для шагового двигателя), используя каждый быстрый выход в качестве step1 и step2. Направление вращения можно задавать обычным выходом ПЛК, так как там нет необходимости в большой скорости. Таким образом, можно было бы получить на одном ПЛК управление четырьмя двигателями.
Пока интересуюсь просто из любопытства.
Да, нужно смотреть архив сообщений, прежде чем писать новые темы. Оказывается, такое решение уже есть т описано на форуме.. Снимаю вопрос.
ВЛ85
Вот это делали?
(*Запускаем PRU*)
PruConfig_Pru0Init(enable:=TRUE , running=>PRU_0_RUN );
PruConfig_Pru1Init(enable:= TRUE, running=>PRU_1_RUN );
Попробовал. Не работает. Хотя у меня они называются SteppersConfig_Pru0Init и SteppersConfig_Pru1Init, и в этих блоках уже внутри enable:=TRUE.
При подключении к ПЛК running=>PRU_0_RUN должно быть TRUE, это говорит о том, что PRU-программа работает. Переменные PRU_0_RUN и PRU_1_RUN просто объявлены и нигде далее не используются, служат просто для контроля работы PRU.
но на выходе плк всё тихо, индикаторы не моргают
Индикаторы могут не моргать по причине очень короткого импульса, т. е. глазом просто не видно. Я вешал обычную индикаторную светодиодную лампочку на 24В на выход Step. И второе - на клемму +U1 ПЛК необходимо подавать +24В, все клеммы COMхх должны быть объединены и подключены на 0В.
При подключении к ПЛК running=>PRU_0_RUN должно быть TRUE, это говорит о том, что PRU-программа работает. Переменные PRU_0_RUN и PRU_1_RUN просто объявлены и нигде далее не используются, служат просто для контроля работы PRU.
Индикаторы могут не моргать по причине очень короткого импульса, т. е. глазом просто не видно. Я вешал обычную индикаторную светодиодную лампочку на 24В на выход Step. И второе - на клемму +U1 ПЛК необходимо подавать +24В, все клеммы COMхх должны быть объединены и подключены на 0В.
Лампой увидел, что импульсы идут! Спасибо. Смутило просто, что в проекте на 2 шд от Ситникова выхода моргали, а здесь на 4 шд нет.
Вопрос по управлению ШД.
Будет ли достаточным для перезапуска генератора импульсов следующий алгоритм:
1 .В конце PLC_PRG перед записью в PRU переменная "запуск ШД" := FALSE.
2. В начале PLC_PRG переменная "запуск ШД" :=TRUE.
3. Цикл в PRU = 10mks.
Увидит ли PRU в момент технологического цикла ПЛК после выполнения скана PLC_PRG то, что "запуск ШД" был сначала TRUE, потом FALSE, потом опять TRUE?
Р.Александр
01.11.2019, 22:08
Вопрос по библиотекам.
При работе после установки библиотек CoDeSys на другой компьютер в нем оказалось две библиотеки PruAccess - старая знакомая PruAccessLib.lib 2014, и, получается, новая, 2019 года, OwenLibPruAcces.lib . Кто знает, в чем разница и какую предпочтительнее применять с контроллерами последних (2019 года) выпусков ?
С последней версией Hardella никакие PruAccessLib.lib не нужны. Из самой Hardella нужны только файлы, которая она генерирует, а именно - две "затычки" pru0.prg и pru1.prg, которые просто кладутся в корень самого ПЛК, и файл *.exp собственно проекта, который импортируется в проект Кодесиса.
Р.Александр
03.11.2019, 19:54
С последней версией Hardella никакие PruAccessLib.lib не нужны. Из самой Hardella нужны только файлы, которая она генерирует, а именно - две "затычки" pru0.prg и pru1.prg, которые просто кладутся в корень самого ПЛК, и файл *.exp собственно проекта, который импортируется в проект Кодесиса.
Спасибо. Кстати, без "затычек" вроде тоже работает, я как то во время экспериментов забыл поставить их на новый ПЛК, двигатель закрутился. Не стал тогда дальше разбираться, что к чему, не было времени, но должны получить новые ПЛК-110-32, тогда проверю.
Разработчик Hardella говорит, что без "затычек" работать будет, но могут быть неадекватности. С ними же сопроцессор быстрых входов-выходов будет слушаться только программы в PRU.
Р.Александр
04.11.2019, 12:26
Понятно. Спасибо за разьяснение.
Добрый день.
Хотел харделлу запустить, но вот такая ошибка, скачал всё заново, всё равно такая ошибка
Internal error. Please report to http://jb.gg/ide/critical-startup-errors
java.lang.RuntimeException: com.intellij.ide.plugins.PluginManager$StartupAbor tedException: Fatal error initializing 'jetbrains.mps.repository.RepositoryInitializingCo mponent'
at com.intellij.idea.IdeaApplication.run(IdeaApplicat ion.java:200)
at com.intellij.idea.MainImpl$1.lambda$null$0(MainImp l.java:47)
at java.desktop/java.awt.event.InvocationEvent.dispatch(Invocation Event.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.j ava:770)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessI mpl.doIntersectionPrivilege(ProtectionDomain.java: 85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java: 740)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEv entQueue.java:358)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThre ad.java:90)
Caused by: com.intellij.ide.plugins.PluginManager$StartupAbor tedException: Fatal error initializing 'jetbrains.mps.repository.RepositoryInitializingCo mponent'
at com.intellij.ide.plugins.PluginManager.handleCompo nentError(PluginManager.java:246)
at com.intellij.openapi.components.impl.PlatformCompo nentManagerImpl.handleInitComponentError(PlatformC omponentManagerImpl.java:43)
at com.intellij.openapi.components.impl.ComponentMana gerImpl$ComponentConfigComponentAdapter.getCompone ntInstance(ComponentManagerImpl.java:536)
at com.intellij.openapi.components.impl.ComponentMana gerImpl.createComponents(ComponentManagerImpl.java :119)
at com.intellij.openapi.application.impl.ApplicationI mpl.lambda$createComponents$228(ApplicationImpl.ja va:429)
at com.intellij.openapi.progress.impl.CoreProgressMan ager$3.run(CoreProgressManager.java:170)
at com.intellij.openapi.progress.impl.CoreProgressMan ager.registerIndicatorAndRun(CoreProgressManager.j ava:494)
at com.intellij.openapi.progress.impl.CoreProgressMan ager.executeProcessUnderProgress(CoreProgressManag er.java:443)
at com.intellij.openapi.progress.impl.ProgressManager Impl.executeProcessUnderProgress(ProgressManagerIm pl.java:54)
at com.intellij.openapi.progress.impl.CoreProgressMan ager.runProcess(CoreProgressManager.java:155)
at com.intellij.openapi.application.impl.ApplicationI mpl.createComponents(ApplicationImpl.java:436)
at com.intellij.openapi.components.impl.ComponentMana gerImpl.init(ComponentManagerImpl.java:103)
at com.intellij.openapi.application.impl.ApplicationI mpl.load(ApplicationImpl.java:392)
at com.intellij.openapi.application.impl.ApplicationI mpl.load(ApplicationImpl.java:384)
at com.intellij.idea.IdeaApplication.run(IdeaApplicat ion.java:193)
... 15 more
Caused by: java.lang.NoClassDefFoundError: sun/misc/Launcher
at jetbrains.mps.reloading.CommonPaths.findBootstrapJ arByName(CommonPaths.java:168)
at jetbrains.mps.reloading.CommonPaths.addJarForName( CommonPaths.java:159)
at jetbrains.mps.reloading.CommonPaths.getJDKClassPat h(CommonPaths.java:153)
at jetbrains.mps.reloading.CommonPaths.getJDKPath(Com monPaths.java:86)
at jetbrains.mps.reloading.CommonPaths.getMPSPaths(Co mmonPaths.java:54)
at jetbrains.mps.project.Solution.updateBootstrapSolu tionLibraries(Solution.java:193)
at jetbrains.mps.project.Solution.updateModelsSet(Sol ution.java:176)
at jetbrains.mps.project.AbstractModule.initFacetsAnd Models(AbstractModule.java:536)
at jetbrains.mps.project.AbstractModule.attach(Abstra ctModule.java:693)
at jetbrains.mps.smodel.MPSModuleRepository.registerM odule(MPSModuleRepository.java:152)
at jetbrains.mps.smodel.ModuleRepositoryFacade.regist erModule(ModuleRepositoryFacade.java:281)
at jetbrains.mps.smodel.ModuleRepositoryFacade.newSol utionInstance(ModuleRepositoryFacade.java:270)
at jetbrains.mps.smodel.ModuleRepositoryFacade.create Module(ModuleRepositoryFacade.java:244)
at jetbrains.mps.library.SLibrary.collectAndRegisterM odules(SLibrary.java:109)
at jetbrains.mps.library.SLibrary.attach(SLibrary.jav a:84)
at jetbrains.mps.library.LibraryInitializer.updateSta te(LibraryInitializer.java:163)
at jetbrains.mps.library.LibraryInitializer.access$20 0(LibraryInitializer.java:45)
at jetbrains.mps.library.LibraryInitializer$1.run(Lib raryInitializer.java:140)
at jetbrains.mps.smodel.WriteActionDispatcher.run(Wri teActionDispatcher.java:39)
at jetbrains.mps.smodel.WorkbenchModelAccess$3.run(Wo rkbenchModelAccess.java:136)
at com.intellij.openapi.application.impl.ApplicationI mpl.runWriteAction(ApplicationImpl.java:898)
at jetbrains.mps.smodel.WorkbenchModelAccess.runWrite Action(WorkbenchModelAccess.java:145)
at jetbrains.mps.smodel.ModelAccessBase.runWriteActio n(ModelAccessBase.java:63)
at jetbrains.mps.library.LibraryInitializer.update(Li braryInitializer.java:126)
at jetbrains.mps.library.LibraryInitializer.loadRefre shed(LibraryInitializer.java:90)
at jetbrains.mps.repository.RepositoryInitializingCom ponent$1.lambda$load$0(RepositoryInitializingCompo nent.java:98)
at com.intellij.openapi.application.impl.ApplicationI mpl.runWriteAction(ApplicationImpl.java:898)
at jetbrains.mps.repository.RepositoryInitializingCom ponent$1.load(RepositoryInitializingComponent.java :97)
at jetbrains.mps.repository.RepositoryInitializingCom ponent$1.run(RepositoryInitializingComponent.java: 92)
at com.intellij.openapi.application.impl.ApplicationI mpl.invokeAndWait(ApplicationImpl.java:626)
at jetbrains.mps.repository.RepositoryInitializingCom ponent.initComponent(RepositoryInitializingCompone nt.java:85)
at com.intellij.openapi.components.impl.ComponentMana gerImpl$ComponentConfigComponentAdapter.getCompone ntInstance(ComponentManagerImpl.java:518)
... 27 more
Caused by: java.lang.ClassNotFoundException: sun.misc.Launcher
at com.intellij.util.lang.UrlClassLoader.findClass(Ur lClassLoader.java:214)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:5 88)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:5 21)
... 59 more
C:\Users\User>java -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
А отматать несколько страниц назад не пробовали?
java version "11.0.1" 2018-10-16 LTS
Харделла работает только на восьмой джаве.
Харделла работает только на восьмой джаве.
хм, онли 8, понятно, спасибо, проблемка конечно..
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot