Hardella IDE написана на JetBrains MPS.
Да, сделать компиляцию ST -> IL можно.
Delta на может IL в текстовом виде обрабатывать?
Вид для печати
Hardella IDE написана на JetBrains MPS.
Да, сделать компиляцию ST -> IL можно.
Delta на может IL в текстовом виде обрабатывать?
На DELTA PLC (для ПЛК DVP серии) в среде ISPSoft IL можно только копи пастом, есть импорт и экспорт (но формат там не текстовый)
Да, в 1.6.2 не работает обмен.
Если других дополнений нет, то выложу обновление с таким составом:
Статистика времени выполнения выводится в MemoryRead следующим образом.Цитата:
Сообщение от Hardella 1.7.0
Фактическая длительность PRU цикла. Т.е. время от одной записи выходов до следующей.
Например, если указать "min cycle: 1µs", и PRU программа очень простая (всегда укладывается в 1мкс), то OutputWriteTimeMicros будут равны 1.0Код:maxOutputWriteTimeMicros : REAL; (* макс. длительность цикла за всё время работы ПЛК, мкс *)
lastOutputWriteTimeMicros : REAL; (* последняя длительность цикла, считанная из PRU, мкс *)
Ну, мы указали, что хотим 1 мкс цикл, его и получили.
Если же программа заняла дольше, то тут будет фактическое значение.
Разумеется, второй вопрос "а сколько реально занимает программа, без учёта ожиданий?"
Для этого выведены переменные про длительность полезного кода (это длительность программы + 2 опроса входов с фильтрацией + приём-передача)
Код:maxCycleTimeMicros : REAL; (* макс. длительность работы PRU программы за всё время работы ПЛК, мкс *)
lastCycleTimeMicros : REAL; (* последняя длительность работы PRU программы, считанная из PRU, мкс *)
Владимир Ситников
Спасибо! Протестирую и сообщу о результатах.
Кстати, на следующей неделе предстоит воплощение одного из проектов на реальном железе в реальной установке. Будет использоваться сокращенная версия моего проекта. Будет использоваться только PRU-энкодер с детектором машинного нуля.
Владимир, какое минимальное время допустимо между этим
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := FALSE);
и этим
SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_st epper_enable := TRUE);
операторами ?
Если цикл PRU 1 мкс, то 2...3 мкс ?
А обмен между ЦП и PRU постоянно идет ? Когда начинается и когда заканчивается обмен между ЦП и PRU ? Или как прошло это
SteppersConfig_Pru0Init();
SteppersConfig_Pru1Init();
так и пошел обмен ?
Или надо постоянно делать это иначе обмена не будет?
SteppersConfig_Pru0MemoryTransfer();
SteppersConfig_Pru1MemoryTransfer();
Да.
PRU программа выполняет следующее:
Иначе говоря, большую часть времени PRU ядро ждёт от КДС программы команд на чтение-запись PRU данных.Код:t0 := засекаем_время();
WHITE TRUE
USER_PROGRAM(); (* вызываем программу, указанную в pru configuration *)
REPEAT
обрабатываем_обмен_данными_с_host();
читаем_входы();
UNTIL время < t0 + мин_ц
END_REPEAT;
t0 := засекаем_время();
записываем_выходы();
читаем_входы();
END_WHILE;
Но эти данные PRU программа сможет использовать только на следующем PRU цикле.
Возвращаясь к исходному вопросу "когда можно перезапускать stepper". После перевода enable в false нужно выполнять memoryread и ждать когда блок сменит состояние. В целом, за одну-две микросекунды это может и случиться, т.е. можно это выполнять и в рамках одного цикла ПЛК (while stepper.state<>... memory read ...).
Нет. После Init запускается только "ответная" сторона в PRU. Сами данные идут только по управлению КДС программы.
Чтобы данные реально ходили нужно вызывать MemoryTransfer или MemoryRead или MemoryWrite.
При каждом вызове Memory* будет новый обмен.