А на каком софте основана сама Hardella IDE? Есть возможность компилировать ST в код IL (все описание самого кода есть). Интересна возможность запилить поддержку Delta PLc. На которых нет ST.
А на каком софте основана сама Hardella IDE? Есть возможность компилировать ST в код IL (все описание самого кода есть). Интересна возможность запилить поддержку Delta PLc. На которых нет ST.
Hardella IDE написана на JetBrains MPS.
Да, сделать компиляцию ST -> IL можно.
Delta на может IL в текстовом виде обрабатывать?
На DELTA PLC (для ПЛК DVP серии) в среде ISPSoft IL можно только копи пастом, есть импорт и экспорт (но формат там не текстовый)
Владимир, какое минимальное время допустимо между этим
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();
Последний раз редактировалось Вольд; 23.03.2017 в 00:07.
Да.
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* будет новый обмен.
У меня в прерывающей программе, которая вызывается с периодом 200 мкс записано
SteppersConfig_Pru1MemoryTransfer();
Допустим в основной программе ПЛК однажды записано так
SteppersConfig_Pru1MemoryTransfer(
STEPPER1_PRU1_dir := Dir,
STEPPER1_PRU1_stepper_accel_ramp := Accel,
STEPPER1_PRU1_stepper_decel_ramp := 200000000,
STEPPER1_PRU1_stepper_max_speed := 200000,
STEPPER1_PRU1_stepper_min_speed := 0,
STEPPER1_PRU1_stepper_quantity := Quantity,
STEPPER1_PRU1_stepper_enable := TRUE
);
Правильно ли я понимаю, что каждые 200 мкс между программой PRU и основной программой будут передаваться указанные выше значения ?
Если MemoryTransfer() вызывается в 200мкс таймере, то в основной программе достаточно просто менять-читать значения переменных:
Либо просто в 200мкс таймере вызывать MemoryTransfer со всеми параметрами.Код:SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_dir := Dir; SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_stepper_accel_ramp := Accel; ...