Показано с 1 по 10 из 1349

Тема: Hardella IDE

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    При экспорте проекта PRU появляется много POU, не могу сообразить как к ним обращаться из PLC_PRG. С либами все проще. Во всяком случае для меня.
    ЗЫ: Прошу сильно не пинать - я не профессиональный программист.
    Здесь пример "как обращаться из plc_prg": https://hardella.com/docs/pru/codesys-setup/

    По факту, никаких отличий от lib нет, за исключением того, что код попадает непосредственно в проект.
    Тут есть и положительный момент: если не переимпортировать exp файл, то код PRU программы останется тем же самым и ничего не сломается. А с библиотеками нужно следить за версиями.

  2. #2
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,480

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Здесь пример "как обращаться из plc_prg"
    Правильно ли я понимаю, что инициализацию PRU в PLC_PRG можно сделать так:

    var
    init:BOOL; (*Флаг инициализации*)
    end_var

    IF NOT init THEN
    <<<вызов хххх_Pru0Init() и хххх_Pru1Init() с пустыми параметрами>>>
    init:=TRUE;
    END_IF;
    <<<обращение к POU ххх_Pru0(1)MemoryTransfer с разными параметрами>>>

  3. #3

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    Правильно ли я понимаю, что инициализацию PRU в PLC_PRG можно сделать так:

    var
    init:BOOL; (*Флаг инициализации*)
    end_var

    IF NOT init THEN
    <<<вызов хххх_Pru0Init() и хххх_Pru1Init() с пустыми параметрами>>>
    init:=TRUE;
    END_IF;
    <<<обращение к POU ххх_Pru0(1)MemoryTransfer с разными параметрами>>>
    Да, так можно.

    А можно и без if not init (внутри хххх_Pru0Init тоже есть аналогичная переменная).

    Если точнее, то хххх_Pru0Init принимает аргумент enable:BOOL и по переднему фронту проводит сброс PRU ядра и заливку программы. Так можно менять PRU программы на ходу.

  4. #4
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,480

    По умолчанию

    Владимир Ситников
    Вопрос по ххх_Pru0(1)MemoryTransfer.
    Могу ли я в основном проекте в начале PLC_PRG (в начале цикла) обратиться к ххх_Pru0(1)MemoryTransfer только с чтением переменных обмена (чтение из PRU), а в конце PLC_PRG (в конце цикла) к этой же ххх_Pru0(1)MemoryTransfer, но только к записи переменных обмена (запись в PRU)?
    Или будет достаточно просто один раз прописать сопоставление переменным ххх_Pru0(1)MemoryTransfer с переменными PLC_PRG в начале цикла?

  5. #5

    По умолчанию

    Сейчас MemoryTransfer производит обмен всех переменных.
    Потому вызывать MemoryTransfer нужно согласно купленным билетам, т.е. согласно тому, как необходимо по логике.

    Просто стоит учитывать, что между вызовами MemoryTransfer (даже в рамках одного цилка ПЛК) PRU программа может успеть выполнить несколько итераций.



    Цитата Сообщение от Sulfur Посмотреть сообщение
    обратиться к ххх_Pru0(1)MemoryTransfer только с чтением переменных обмена (чтение из PRU), а в конце PLC_PRG (в конце цикла) к этой же ххх_Pru0(1)MemoryTransfer, но только к записи переменных обмена (запись в PRU)?
    Да, так можно.
    Фактически тут будет "запись тех же самых значений, что записывались ранее".
    Вообще, мысль разделить чтение и запись интересная.

    Если хотите, можно использовать такой синтаксис:
    Код:
    MemoryTransfer.motor_enable := TRUE;
    MemoryTransfer.fast := TRUE;
    
    MemoryTransfer(); (* собственно, обмен *)
    
    motorState := MemoryTransfer.motorState; (* чтение *)
    Цитата Сообщение от Sulfur Посмотреть сообщение
    Или будет достаточно просто один раз прописать сопоставление переменным ххх_Pru0(1)MemoryTransfer с переменными PLC_PRG в начале цикла?
    Зависит от того, какая логика нужна. Вызывать MemoryTransfer можно много раз внутри одного цикла ПЛК, и каждый раз можно получать "более новые" значения.

  6. #6
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,480

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение

    Зависит от того, какая логика нужна.
    Логика простая - в начале цикла опрашиваем всё, что опрашивается, делаем вычисление, и пишем результаты во всё, что пишется. В данном случае фазы "опрашивается" и "пишется" объединены в одном модуле.

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    Просто стоит учитывать, что между вызовами MemoryTransfer (даже в рамках одного цилка ПЛК) PRU программа может успеть выполнить несколько итераций.
    Я это понимаю. Именно из этих соображений критичные ко времени действия организованы в PRU-части. В ПЛЦ_ПРГ остается только "обслуга", либо медленные процессы\счетчики.

  7. #7

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    Логика простая - в начале цикла опрашиваем всё, что опрашивается, делаем вычисление, и пишем результаты во всё, что пишется. В данном случае фазы "опрашивается" и "пишется" объединены в одном модуле.
    Получается, если вместо одной текущей программы memorytransfer сделать две (для опроса и для записи), то будет понятнее?

    В остальном работает?

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •