FUNCTION FC1 : void
VAR_INPUT
frekans_Hz: REAL; //çalışması istenilen frekansın griş değeri
ON_value: REAL; // çalışması istenen ON oranı yüzde cinsinden
END_VAR
VAR_OUTPUT
pwm_out: BOOL; // çıkış olarak darbe genlik modülasytonlu talkt
END_VAR
VAR_TEMP
k:REAL; // katsayı
T:REAL; // periyot
ON:REAL; // pwm çıkışının açık kaldı değer
OFF:REAL; // pwm çıkışının kapalı kaldığı değer
ON_time:TIME; // pwm çıkışının açık kaldığı sürenin time cinsinden değeri
OFF_time:TIME; // pwm çıkışının kapalı kaldığı sürenin TIME cinsinden değeri
p_edge:BOOL; // üretilen sinyalin pozitif alternansının hissedilmesini sağlayan değişken
n_edge:BOOL; // üretilen sinyalin negatif aternansının hissedilmesini sağlayan değişken
x:BOOL; // kenar algılanmasında kullanılacak
y:BOOL; // kenar algılanmasında kullanılacak
//timer1(ON) için gereli değişkenler
ON_time_out:WORD; //timer1 word cinsinden atanacağı değişken
ON_time_BI:WORD; //timer1 in hex cinsinden aktarılacağı değişken
ON_time_Q:BOOL; //timer1 in çıkış değişkeni
//timer2(OFF) için gereli değişkenler
OFF_time_out:WORD; //timer2 word cinsinden atanacağı değişken
OFF_time_BI:WORD; //timer2 nin hex cinsinden atanacağı değişken
OFF_time_Q:BOOL; //timer2 nin çıkış değişkeni
END_VAR
BEGIN
// periyodun bulun ma işlemi
T:=1/frekans_Hz;
// ON ve OFF sürelerinin hesaplanması için gereken katsayının hesabı
k:=1/T;
// pwm çıkışında çıkışın aktif(1) olduğu sürenin hesaplanması (REAL cinsinden)
ON:=k*ON_value;
//pwm çıkışında çıkışın pasif(0) olduğu sürenin hesaplanması (REAL cinsinden)
OFF:=k*(100 - ON_value);
//dönüşüm işlemleri
ON_time:=DINT_TO_TIME(REAL_TO_DINT(ON));
OFF_time:=DINT_TO_TIME(REAL_TO_DINT(OFF));
// zamanlayıcıların kurulması
ON_time_out:=S_PULSE(T_NO:=T1, S:=true, TV:=ON_time, R:=OFF_time_Q, BI:=ON_time_BI, Q:=ON_time_Q);
OFF_time_out:=S_ODTS(T_NO:=T2, S:=true, TV:=OFF_time, R:=ON_time_Q, BI:=OFF_time_BI, Q:=OFF_time_Q);
// çıkışın kenar algılanmalarına göre kurulması
// negatif kenar tetiklemenin yapılması
IF NOT ON_time_Q AND NOT y THEN y:=true; n_edge:=true;
IF n_edge AND NOT p_edge THEN pwm_out:=false; n_edge:=false; END_IF; //pwm çıkışın oluştrulması
ELSE n_edge:=false;
END_IF;
IF ON_time_Q AND y THEN y:=false;
END_IF;
//pozitif kenar tetiklemenin yapılması
IF OFF_time_Q AND NOT x THEN x:=true; p_edge:=true;
IF p_edge AND NOT n_edge THEN pwm_out:=true; p_edge:=false; END_IF; // pwm çıkışın oluştrulması
ELSE p_edge:=false;
END_IF;
IF NOT OFF_time_Q AND x THEN x:=false;
END_IF;
END_FUNCTION