Страница 134 из 136 ПерваяПервая ... 3484124132133134135136 ПоследняяПоследняя
Показано с 1,331 по 1,340 из 1358

Тема: Hardella IDE

  1. #1331

    По умолчанию

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

  2. #1332

    По умолчанию

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

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

  3. #1333

    По умолчанию

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

    Но пока есть момент, измеренные показания очень сильно скачут. +\- 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.

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

    По умолчанию

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

  5. #1335

    По умолчанию

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

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

    По умолчанию

    не брезгуйте конструкцией 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

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

  7. #1337

    По умолчанию

    Если усреднять за 16, то вместо деления можно использовать сдвиг -- будет гораздо быстрее.

    IF ... IF F_TRIG -- с этим поосторожнее нужно быть. Сам по себе триггер же сбрасывать нужно, а, если внешняя проверка не выполнена, то и триггер не сбросится.

    Если есть Hardella проект -- могу прогнать на эмуляторе -- посмотреть сколько тактов занимает программа

  8. #1338

    По умолчанию

    На какой частоте приходят данные?

    Вообще говоря, обмен с КДС выполняется как часть задержки между циклами. Иначе говоря, PRU прогамма могла бы просто сделать задержку до следующего цикла, но перед этим происходит обмен (если нужен).

    Сам обмен довольно быстрый. Вроде, 20нс на переменную или около того.

  9. #1339
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    1,705

    По умолчанию

    все ничего, но это что то вирусное
    Counter1 := Counter1 + 1; (* прибавляем 1 к счётчику *)

  10. #1340
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    1,705

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    не брезгуйте конструкцией IF...ELSIF
    И вместо ФБ ловли фронтов используйте
    Код:
    foo :=  inputs.in1
    (*где то потом*)
    IF foo and NOT bar THEN
       ...
    ELSIF NOT foo and bar THEN
       ...
    END_IF;
    bar := foo;
    должно стать более читаемо и менее затратно
    Код:
    if input.in1 xor x then
      x := not x;
      if x then
        .. 
      else
        ..
      end_if
    end_if
    имхо еще менее затратно. Тут же какие-то мкс/нс ловят )) ?

Страница 134 из 136 ПерваяПервая ... 3484124132133134135136 ПоследняяПоследняя

Ваши права

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