Страница 114 из 117 ПерваяПервая ... 1464104112113114115116 ... ПоследняяПоследняя
Показано с 1,131 по 1,140 из 1349

Тема: Hardella IDE

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

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

    По умолчанию

    Цитата Сообщение от TV13M Посмотреть сообщение
    Подскажите пожалуйста:
    Если я пишу программу для получения информации с быстрых входов (1 и 2) и воздействия на быстрые выходы (с 1-го по 4-ый), мне нужно писать 2 программы? Одна для PRU0, вторая для PRU1. Так?
    https://hardella.com/docs/pru/featur...9A110-%D0%9C02

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

    Если нужен именно обмен между PRU0 и PRU1 (и обмен нужен быстрый), то делать нужно через ассемблерную вставку.



    В самой серде, наверное, надо подумать как сделать пересылку данных. Объявлять где-то глобальную переменную что-ли, чтобы можно в pru0 в её записывать, а в pru1 читать.

  2. #2

    По умолчанию

    Цитата Сообщение от TV13M Посмотреть сообщение
    То есть такая программа для PRU0 корректа?
    IF counter1 = FinalValueCH1 AND counter2 = FinalValueCH2 THEN
    portion_ready := TRUE;
    CASE CurrentOutputs OF
    1: FAST_OUTPUTS(out1 := FALSE);
    2: FAST_OUTPUTS(out2 := FALSE);
    3: FAST_OUTPUTS(out3 := FALSE);
    4: FAST_OUTPUTS(out4 := FALSE);
    END_CASE;
    ELSE
    CASE CurrentOutputs OF
    1: FAST_OUTPUTS(out1 := TRUE);
    2: FAST_OUTPUTS(out2 := TRUE);
    3: FAST_OUTPUTS(out3 := TRUE);
    4: FAST_OUTPUTS(out4 := TRUE);
    END_CASE;
    END_IF;
    По-хорошему, должна быть ошибка компиляции про out3, out4, т.к. управлять 3-4 выходами из pru0 невозможно.

  3. #3

    По умолчанию

    Ага. Понятно.
    Только смущают слова:
    наверное, надо подумать как сделать пересылку данных. Объявлять где-то глобальную переменную что-ли
    то есть проверенного действом способа пока нет.
    Как и какую вставку делать нужно узнавать из документации по AM1808?
    Apd.:
    However for
    passing information between PRUs, each PRU can access the data ram of the ‘other’ PRU through address 0x0000 2000.
    Переводчик: Однако для
    передавая информацию между PRU, каждый PRU может получить доступ к полосе данных 'другого' PRU по адресу 0x0000 2000.
    Как из Харделлы сделать переменные, для их записи из программы для PRU0 в Data RAM1 (PRU1)?
    Последний раз редактировалось TV13M; 07.07.2020 в 12:36.

  4. #4

    По умолчанию

    Пишем ASM -- появляется ассемблерная вставка (возможно, ctrl+пробел поможет).

    И далее команды типа
    -- Передаём данные из PRU0 в PRU1
    SBCO R29.b0, 4, 100, 1 ; пишем данные из регистра R29 в память по адресу 100

    -- Читаем данные в PRU1 и далее используем их
    LBCO R29.b0, 4, 100, 1 ; загружаем данные в регистр R29 из байта по адресу 100

    Если не ошибаюсь, то 4 это есть указание на то, что "работаем с памятью другого ядра"

    Вроде, вместо регистра в LBCO / SBCO должно быть возможно указывать переменные (но в последнем параметре нужно верно указывать размер читаемых-записываемых данных)

    Сейчас Hardella использует память только для обмена с основной программой, поэтому использовать адреса большие 100 безопасно.

  5. #5

    По умолчанию

    Эх...
    А про команды ассемблера для этого контроллера где почитать? Если на вскидку? как задать поиск в гугле?
    А вообще. Пока откажусь от идеи передавать данные между РПУ((((
    Поставлю на костыли (буду работать 2 каналами и переключать их рэлюхами
    А пока скомпилировал проект в Hardella
    скоро запилю на реальное железо и буду тестить.

  6. #6

    По умолчанию

    Цитата Сообщение от TV13M Посмотреть сообщение
    Эх...
    А про команды ассемблера для этого контроллера где почитать? Если на вскидку? как задать поиск в гугле?
    Например: "PRU Assembly Instruction User Guide", AM1808

    Для обмена нужны инструкции SBCO и LBCO.

  7. #7

    По умолчанию

    Доброго времени.
    Испытал в железе.
    Основа работает!
    Огромное спасибо Владимиру! (как сдам проект, ещё спасибо "скажу")

    Но пока есть момент, измеренные показания очень сильно скачут. +\- 70 Гц.
    Может кто может высказать критику по поводу моего кода:

    "(* Первый канал *)
    IF StartCounter1 THEN (* проверяем флаг начала отсчёта, если счёт идёт то ждём передний фронт второго импульса: *)
    IF R_TRIG(CLK := inputs.in1).Q THEN (* если словили передний фронт сигнала то: *)
    counter1Hz := Counter1; (* записать значение из счётчика 1 в переменную памяти *)
    Counter1 := 0; (* обнулить счётчик *)
    ELSE
    Counter1 := Counter1 + 1; (* иначе прибавляем к счётчику 1 и ждём в следующем цикле *)
    END_IF;
    (* флаг начала отсчёта не установлен *)
    ELSE
    IF F_TRIG(CLK := inputs.in1).Q THEN (* тогда ждём задний фронт сигнала *)
    StartCounter1 := TRUE; (* словили задний фронт. Будем начинать счёт. Устанавливаем флаг начала отсчёта. *)
    Counter1 := Counter1 + 1; (* прибавляем 1 к счётчику *)
    END_IF;
    END_IF; "

    Весь код, это + ещё один канал и 4 строчки воздействия на выходы.

    CoDeSys запрашивает данные каждый новый цикл... (может из за этого косяк?)
    Если во время обмена данными, PRU не выполняет программу, тут то погрешность и вылезает? Может можно и нужно сбрасывать измерения которые были не закончены во время когда пришёл запрос от КДС?

    Пишу новую "поэму" с усреднением из 10 измерений, но не уверен что это самый лучший вариант, да и обсчёт двух каналов, а потом ещё сложение и деление из 10 измерений... (тут я уже точно выхожу за рамки 1 мкСек.
    Последний раз редактировалось TV13M; 21.07.2020 в 22:47.

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

    По умолчанию

    "поэму" с усреднением из 10 измерений
    Может перенести это в основную ПОУ? Т. е. ПРУ будет показывать насчитанное между передними фронтами inputs.in1 без промежуточных данных, а основная программа в ПЛК будет усреднять данные. Вроде даже в библиотеке OSCAT уже есть готовые ФБ усреднения.

  9. #9

    По умолчанию

    Тут вылезают не контролируемые (а так ли это?) задержки реакции выхода на достижение заданного значения.
    (из за того что время обработки программы в КДС не стабильное. +\- мСек...)
    У меня в коде ошибка. Я не сбрасываю "флаг" что отсчёт уже идёт...
    Последний раз редактировалось TV13M; 22.07.2020 в 08:50.

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,254

    По умолчанию

    не брезгуйте конструкцией IF...ELSIF
    И вместо ФБ ловли фронтов используйте
    Код:
    foo :=  inputs.in1
    (*где то потом*)
    IF foo and NOT bar THEN
       ...
    ELSIF NOT foo and bar THEN
       ...
    END_IF;
    bar := foo;
    должно стать более читаемо и менее затратно
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 114 из 117 ПерваяПервая ... 1464104112113114115116 ... ПоследняяПоследняя

Ваши права

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