Страница 133 из 136 ПерваяПервая ... 3383123131132133134135 ... ПоследняяПоследняя
Показано с 1,321 по 1,330 из 1358

Тема: Hardella IDE

  1. #1321

    По умолчанию

    Цитата Сообщение от Lexey-ru Посмотреть сообщение
    Я имел в виду модули расширения :
    https://owen.ru/product/moduli_diskr...rfejsom_rs_485
    Это я понимаю, но чтобы на выходе МУ что-либо поменялось оно должно получить команду по modbus.
    Ну и в МУ нет возможности "генерировать указанное количество импульсов".

    В целом, конечно, можно управлять ШД в режиме ШИМ выхода, но точность позиционировать будет плавать (т.к. сигналы по modbus ходят непонятно как)

  2. #1322

    По умолчанию частотомер

    Доброго времени!
    Нужен частотомер на быстрых вх. ПЛК110М02. (от 100 до 10100 Гц)
    Решил что надо писать прогу для PRU
    но раньше ничего подобного на таких языках не делал.
    Наваял вот что:
    А как из харделлы скопировать код? )))
    прикрепил проект.
    если расширение сменить на msd то проект откроется в Hardella?

    Идея такова: измеряем длительность паузы между импульсами. И исходя из полученного значения высчитываем частоту.
    Если считать что время цикла 1 мкСек.

    Но у меня на втором канале IDE подсвечивает переменные красным.
    Его, 2 к***** я просто скопировал. И не могу понять что не так сделал.
    Изображения Изображения
    Вложения Вложения
    Последний раз редактировалось TV13M; 06.07.2020 в 10:03.

  3. #1323

    По умолчанию

    Цитата Сообщение от TV13M Посмотреть сообщение
    Доброго времени!
    Нужен частотомер на быстрых вх. ПЛК110М02. (от 100 до 10100 Гц)
    Решил что надо писать прогу для PRU
    но раньше ничего подобного на таких языках не делал.
    Наваял вот что:
    Это плюс. Вроде, в ПЛК110М02 быстрые входы могут работать в режиме счётчика.
    Тогда можно в обычной КДС программе считывать показатель этого счётчика, смотреть сколько оно намотало "за секунду" и усреднять, если нужно.

    Так не работает?

    Я не к тому, что Hardella не работает, а, скорее, к тому, что простой частотомер на fast counter'ах (из обычного КДС) может оказаться проще и понятнее.
    Так сказать, не стрелять из пушки по воробьям.


    Цитата Сообщение от TV13M Посмотреть сообщение
    А как из харделлы скопировать код? )))
    Да, это непросто. Либо выделять всё и ctrl+c/v, либо папку с проектом сохранить в zip архив.


    Цитата Сообщение от TV13M Посмотреть сообщение
    Но у меня на втором канале IDE подсвечивает переменные красным.
    Переменные объявлены? Нет проблем в духе "русская буква C в названии переменной"?
    По-хорошему, если переменные объявлены, то ctrl+пробел в Hardella должно показывать автодополнение и там эти переменные должны быть.
    Если перейти на красную переменную (напр CounterCH2), и нажать ctrl+пробел, то что-нибудь будет?

  4. #1324

    По умолчанию

    ctrl+пробел = успех.
    Хотя переменные объявлены... ну да ладно.
    В идеале я пытаюсь добавить управление быстрыми выходами. по достижении заданной частоты. (материал сыпится, время идёт... С кодесис тут наверняка будут мСек плясать не предсказуемо)
    ctrl+c/v не получается. Перемешиваются строки...
    PROGRAM FAST_COUNTER
    variables:
    @Export
    @Export
    inputs : FAST_INPUTS;
    CounterCH1 : WORD; (* счётчик для первого канала *)
    CounterCH2 : WORD; (* счётчик для второго канала *)
    StartCounter1 : BOOL; (* начался отсчёт по первому каналу *)
    StartCounter2 : BOOL; (* начался отсчёт по 2 каналу *)

    body:
    (* первый канал *)
    (* проверка флага начатого отсчёта *)
    IF StartCounter1 THEN (* если флаг установлен *)
    IF R_TRIG(CLK := inputs.in1).Q THEN (* ждём передний фронт второго импульса *)
    (* если импульс пришёл *)
    counter1 := CounterCH1; (* записываем значение на выход *)
    CounterCH1 := 0; (* обнуляем счётчик *)
    (* иначе, если флаг начала установлен, но пока нет переднего фронта второго импульса *)
    ELSE
    CounterCH1 := CounterCH1 + 1; (* считаем циклы *)
    END_IF;
    (* иначе, если флаг первого импульса не установлен *)
    ELSE
    IF F_TRIG(CLK := inputs.in1).Q THEN (* ждём заднего фронта первого импульса *)
    StartCounter1 := TRUE; (* если импульс пришёл, устанавливаем флаг начала счёта *)
    CounterCH1 := CounterCH1 + 1; (* и начинаем счёт циклов *)
    END_IF;
    END_IF;
    (* второй канал *)
    (* проверка флага начатого отсчёта *)
    IF StartCounter2 THEN (* если флаг установлен *)
    IF R_TRIG(CLK := inputs.in2).Q THEN (* ждём передний фронт второго импульса *)
    (* если импульс пришёл *)
    counter2 := CounterCH2; (* записываем значение на выход *)
    CounterCH2 := 0; (* обнуляем счётчик *)
    (* иначе, если флаг начала установлен, но пока нет переднего фронта второго импульса *)
    ELSE
    CounterCH2 := CounterCH2 + 1; (* считаем циклы *)
    END_IF;
    (* иначе, если флаг первого импульса не установлен *)
    ELSE
    IF F_TRIG(CLK := inputs.in2).Q THEN (* ждём заднего фронта первого импульса *)
    StartCounter2 := TRUE; (* если импульс пришёл, устанавливаем флаг начала счёта *)
    CounterCH2 := CounterCH2 + 1; (* и начинаем счёт циклов *)
    END_IF;
    END_IF;

    END_PROGRAM
    output counter1 : WORD; (* This variable will be visible in CoDeSys program *) output counter2 : WORD; (* период между импульсами в мкСек Канал ном.2 *)
    Хотя вроде ничего. А в блокнот, - так безобразие....
    Последний раз редактировалось TV13M; 06.07.2020 в 10:34.

  5. #1325

    По умолчанию

    Цитата Сообщение от TV13M Посмотреть сообщение
    В идеале я пытаюсь добавить управление быстрыми выходами. по достижении заданной частоты.
    Да, если управление, тогда действительно можно и в Hardella сделать PRU программу.

  6. #1326

    По умолчанию

    Подскажите пожалуйста:
    Если я пишу программу для получения информации с быстрых входов (1 и 2) и воздействия на быстрые выходы (с 1-го по 4-ый), мне нужно писать 2 программы? Одна для PRU0, вторая для PRU1. Так?
    Где почитать как взаимодействовать между PRU0 и PRU1?. (то есть, - если из пру0 я читаю входы и в зависимости от полученного результата воздействую на выходы 3 и 4, то как посылать данные о текущем состоянии входов на пру1?)

    Такая программа для PRU1 корректа?
    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;
    Последний раз редактировалось TV13M; 07.07.2020 в 11:13.

  7. #1327

    По умолчанию

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

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

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



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

  8. #1328

    По умолчанию

    Цитата Сообщение от 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 невозможно.

  9. #1329

    По умолчанию

    Ага. Понятно.
    Только смущают слова:
    наверное, надо подумать как сделать пересылку данных. Объявлять где-то глобальную переменную что-ли
    то есть проверенного действом способа пока нет.
    Как и какую вставку делать нужно узнавать из документации по 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.

  10. #1330

    По умолчанию

    Пишем 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 безопасно.

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

Ваши права

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