Я имел в виду модули расширения :
https://owen.ru/product/moduli_diskr...rfejsom_rs_485
Я имел в виду модули расширения :
https://owen.ru/product/moduli_diskr...rfejsom_rs_485
Это я понимаю, но чтобы на выходе МУ что-либо поменялось оно должно получить команду по modbus.
Ну и в МУ нет возможности "генерировать указанное количество импульсов".
В целом, конечно, можно управлять ШД в режиме ШИМ выхода, но точность позиционировать будет плавать (т.к. сигналы по modbus ходят непонятно как)
Доброго времени!
Нужен частотомер на быстрых вх. ПЛК110М02. (от 100 до 10100 Гц)
Решил что надо писать прогу для PRU
но раньше ничего подобного на таких языках не делал.
Наваял вот что:
А как из харделлы скопировать код? )))
прикрепил проект.
если расширение сменить на msd то проект откроется в Hardella?
Идея такова: измеряем длительность паузы между импульсами. И исходя из полученного значения высчитываем частоту.
Если считать что время цикла 1 мкСек.
Но у меня на втором канале IDE подсвечивает переменные красным.
Его, 2 к***** я просто скопировал. И не могу понять что не так сделал.
Последний раз редактировалось TV13M; 06.07.2020 в 10:03.
Это плюс. Вроде, в ПЛК110М02 быстрые входы могут работать в режиме счётчика.
Тогда можно в обычной КДС программе считывать показатель этого счётчика, смотреть сколько оно намотало "за секунду" и усреднять, если нужно.
Так не работает?
Я не к тому, что Hardella не работает, а, скорее, к тому, что простой частотомер на fast counter'ах (из обычного КДС) может оказаться проще и понятнее.
Так сказать, не стрелять из пушки по воробьям.
Да, это непросто. Либо выделять всё и ctrl+c/v, либо папку с проектом сохранить в zip архив.
Переменные объявлены? Нет проблем в духе "русская буква C в названии переменной"?
По-хорошему, если переменные объявлены, то ctrl+пробел в Hardella должно показывать автодополнение и там эти переменные должны быть.
Если перейти на красную переменную (напр CounterCH2), и нажать ctrl+пробел, то что-нибудь будет?
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.
Подскажите пожалуйста:
Если я пишу программу для получения информации с быстрых входов (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.
https://hardella.com/docs/pru/featur...9A110-%D0%9C02
Первые два быстрых выхода запитаны от PRU0, поэтому если двух достаточно, то обмен городить не нужно.
Если нужен именно обмен между PRU0 и PRU1 (и обмен нужен быстрый), то делать нужно через ассемблерную вставку.
В самой серде, наверное, надо подумать как сделать пересылку данных. Объявлять где-то глобальную переменную что-ли, чтобы можно в pru0 в её записывать, а в pru1 читать.
Ага. Понятно.
Только смущают слова:то есть проверенного действом способа пока нет.наверное, надо подумать как сделать пересылку данных. Объявлять где-то глобальную переменную что-ли
Как и какую вставку делать нужно узнавать из документации по 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.