Вход

Просмотр полной версии : Обычные выходы как выходы с ШИМ



Dmitry Dedkov
15.07.2024, 16:49
Ранее была тема по поводу мерцаний самописного ШИМ сигнала для обычных DO ПЛК210-03. Проблема была решена после того, как замкнул быстрый вход и обычный выход в цепь. Но вот возникла другая проблема: частота. Частота получается около 15Гц, что мало для работы клапанов манипулятора. Нужно хотя бы 50Гц получить, это было бы уже приемлемо для их работы. Вот код ШИМ, который по итогу получился:


PROGRAM BLINKER
VAR_INPUT
pwm_coef: UDINT;
END_VAR
VAR
flag1: BOOL;
in: BOOL;
isPWM: BOOL;
B_TRIG: OSCAT_BUILDING.OSCAT_BASIC.B_TRIG;

x: UINT := 0;
COEF17: ARRAY [0..5] OF BOOL := [1,0,0,0,0,0];
COEF34: ARRAY [0..5] OF BOOL := [1,1,0,0,0,0];
COEF50: ARRAY [0..5] OF BOOL := [1,1,1,0,0,0];
COEF67: ARRAY [0..5] OF BOOL := [1,1,1,1,0,0];
//COEF84: ARRAY [0..5] OF BOOL := [1,1,1,1,1,0];

counter: INT := 0;
out_value: BOOL;
END_VAR
VAR_OUTPUT
END_VAR



IF flag1 AND in THEN
isPWM := TRUE;
flag1 := FALSE;

ELSIF NOT flag1 AND NOT in THEN
isPWM := TRUE;
flag1 := TRUE;
END_IF

IF isPWM THEN
CASE pwm_coef OF
0:
out_value := FALSE;
1:
out_value := COEF17[x];
2:
out_value := COEF34[x];
3:
out_value := COEF50[x];
4:
out_value := COEF67[x];
5:
out_value := TRUE;
END_CASE

x := x+1;

isPWM := FALSE;

IF x >= 5 THEN
x := 0;
END_IF
END_IF

Александр Пинэко-Скворцов
16.07.2024, 09:13
Ранее была тема по поводу мерцаний самописного ШИМ сигнала для обычных DO ПЛК210-03. Проблема была решена после того, как замкнул быстрый вход и обычный выход в цепь. Но вот возникла другая проблема: частота. Частота получается около 15Гц, что мало для работы клапанов манипулятора. Нужно хотя бы 50Гц получить, это было бы уже приемлемо для их работы. Вот код ШИМ, который по итогу получился:


PROGRAM BLINKER
VAR_INPUT
pwm_coef: UDINT;
END_VAR
VAR
flag1: BOOL;
in: BOOL;
isPWM: BOOL;
B_TRIG: OSCAT_BUILDING.OSCAT_BASIC.B_TRIG;

x: UINT := 0;
COEF17: ARRAY [0..5] OF BOOL := [1,0,0,0,0,0];
COEF34: ARRAY [0..5] OF BOOL := [1,1,0,0,0,0];
COEF50: ARRAY [0..5] OF BOOL := [1,1,1,0,0,0];
COEF67: ARRAY [0..5] OF BOOL := [1,1,1,1,0,0];
//COEF84: ARRAY [0..5] OF BOOL := [1,1,1,1,1,0];

counter: INT := 0;
out_value: BOOL;
END_VAR
VAR_OUTPUT
END_VAR



IF flag1 AND in THEN
isPWM := TRUE;
flag1 := FALSE;

ELSIF NOT flag1 AND NOT in THEN
isPWM := TRUE;
flag1 := TRUE;
END_IF

IF isPWM THEN
CASE pwm_coef OF
0:
out_value := FALSE;
1:
out_value := COEF17[x];
2:
out_value := COEF34[x];
3:
out_value := COEF50[x];
4:
out_value := COEF67[x];
5:
out_value := TRUE;
END_CASE

x := x+1;

isPWM := FALSE;

IF x >= 5 THEN
x := 0;
END_IF
END_IF


Добрый день.

По Вашему коду получается, что каждый из массивов COEFx проходится за 6 циклов ПЛК (обычно это 10 мс). 60 мс - это как раз около 15 Гц.
Рассмотрите вместо этого использование блока PWM_PW из библиотеки OSCAT_BASIC. https://ftp.owen.ru/CoDeSys3/98_Books/oscat_basic333_ru.pdf

Dmitry Dedkov
16.07.2024, 10:12
По Вашему коду получается, что каждый из массивов COEFx проходится за 6 циклов ПЛК (обычно это 10 мс). 60 мс - это как раз около 15 Гц.
да, забыл сказать, что эта часть кода выведена как отдельная задача. Там цикл поставил 3 мс (ТЕ 6 циклов = 18 мс), но получается почему-то те самые 15 Гц


Рассмотрите вместо этого использование блока PWM_PW из библиотеки OSCAT_BASIC. https://ftp.owen.ru/CoDeSys3/98_Book...asic333_ru.pdf
Попробую

Dmitry Dedkov
16.07.2024, 14:51
Попробовал, но частота плавает, сигнал не постоянный. Есть варианты как можно сделать сигнал стабильным?