У меня в прерывающей программе, которая вызывается с периодом 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; ...
Уточняю вопрос. Достаточно ли однократно вызвать
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
);
чтобы эти значения постоянно передавались посредством вызова SteppersConfig_Pru1MemoryTransfer(); в прерывающей программе ?
Последний раз редактировалось Вольд; 24.03.2017 в 13:04.
Что значит однажды?
При вызове SteppersConfig_Pru1MemoryTransfer(), в PRU передаются значения переменных блока SteppersConfig_Pru1MemoryTransfer.
Запись
Это абсолютно то же самое, что иКод:SteppersConfig_Pru1MemoryTransfer( STEPPER1_PRU1_dir := Dir, STEPPER1_PRU1_stepper_accel_ramp := Accel,...
Иными словами, запись SteppersConfig_Pru1MemoryTransfer(STEPPER1_PRU1_di r := Dir,) не несёт в себе какого-то магического "отныне STEPPER1_PRU1_dir будет отслеживать значение переменной Dir". STEPPER1_PRU1_dir и Dir это независимые переменные, поэтому, если нужно передавать новое значение Dir в PRU, то нужно и выполнять присваивание в переменную STEPPER1_PRU1_dir.Код:SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_dir := Dir; SteppersConfig_Pru1MemoryTransfer.STEPPER1_PRU1_stepper_accel_ramp := Accel; SteppersConfig_Pru1MemoryTransfer();
Вот так например
CASE N OF
10:
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
);
N := 20;
20:
;
END_CASE
Владимир Ситников
Отчитываюсь по своему проекту.
Произведен монтаж ПЛК в шкаф машины, компиляция кода использована версией 1.7.0, код работает отлично, сбоев за двое суток непрерывной работы не зафиксировано.
Есть небольшой вопросик. При выполнении в КДС Проект>Контроль>Неиспользуемые переменные выводит вот такую табличку:
Var.jpg
В принципе это не критично, но хотелось бы знать детали.
Здорово.
Идею с Hardella_SimulationDetector'ом подсказал Валенок: http://www.owen.ru/forum/showthread....l=1#post233794
Решаемая проблема в том, что программы MemoryRead/Write/Transfer не работают в режиме симуляции (КДС не симулирует работу PRU), поэтому чтобы проект не падал в запуске этой самой симуляции в коде нужно как-то определять выполняется ли код на реальном ПЛК или нет.
Там действительно переменные объявлены и не используются. Можно, наверное, сделать их "используемыми", чтобы не вызывали предупреждений.
В MemoryTransfer действительно неиспользуемые переменные. Надо убрать.
Я логику в Read/Write перенёс, а переменные остались.