PLC程序实现矩形波,三角波,正弦波

这套程序本来是在Smart200上玩出来的,后来在PLC1200/PLC1500的环境下重写了PLC程序。换句话说,这要遵守程序里的算法公式,不管什么PLC都能做出这几种波形

1. 采样时间

  • 想要生成连续的波形图,本质就是在采样时间点上采集当前输出值,当采样点足够多的时候,在时间线上就形成了随时间变化的波形图了
    • 程序中基于定时器自己做了一个上半周期50ms,下半周期50ms,占空比50%的脉冲发生器(本身是个方波)
    • 程序输出两个bool量,一个50ms_up,一个50ms_down。
//create the 100ms pulse
IF NOT #Pls_50ms_up AND NOT #Pls_50ms_down THEN
    #Pls_50ms_up := TRUE;
    #Pls_50ms_down := FALSE;
    RESET_TIMER(#Ton_time1);
    RESET_TIMER(#Ton_time2);
END_IF;

#Ton_time1(IN:=#Pls_50ms_up,
          PT:=t#50MS);

IF #Ton_time1.Q THEN
    #Pls_50ms_up := FALSE;
    #Pls_50ms_down := TRUE;
    RESET_TIMER(#Ton_time1);
END_IF;

#Ton_time2(IN:=#Pls_50ms_down,
           PT:=T#50MS);

IF #Ton_time2.Q THEN
    #Pls_50ms_up := TRUE;
    #Pls_50ms_down := FALSE;
    RESET_TIMER(#Ton_time2);
END_IF;
#Out_50ms_up := #Pls_50ms_up;
#Out_50ms_Down := #Pls_50ms_down;

2. 计算需要的一些前期参数

  • 单周期内采样次数:外部设定的周期/循环时间(如果放入中断执行,那就是中断时间);#period_max := #In_sign_period / #OBcycle;
  • 1/2周期采样次数:#period_half := #period_max / 2;
  • 1/4周期采样次数:#period_quater := #period_half / 2;
  • 自己设定的循环时间(固定值或者中断执行时间)Constant Int OBCycle = 100
  • 圆周率Constant Real PAI = 3.1415926
OBcycle	Int	100
PAI	Real	3.14159

#period_max := #In_sign_period / #OBcycle;
#period_half := #period_max / 2;
#period_quater := #period_half / 2;

3. 矩形波

  • In_Amplitude为生成波形需要的振幅
IF #"50ms_up" AND NOT #pluse_bool[0] THEN
    
    //生成矩形波
    IF #rectangle_int < #period_max THEN
        #rectangle_int := #rectangle_int + 1;
    ELSE
        #rectangle_int := 0;
    END_IF;
    IF #rectangle_int < #period_half THEN
        #rectangle_wave := #In_Amplitude * 1;
    ELSE
        #rectangle_wave := #In_Amplitude * (-1);
    END_IF;

END_IF;
#pluse_bool[0] := #"50ms_up";

4. 三角波

  • 计算公式,VAL_TRI:=AMP*CURRNET_INT/QUATER
IF #"50ms_up" AND NOT #pluse_bool[0] THEN
    
    //生成三角波
    //VAL_TRI:=AMP*CURRNET_INT/QUATER
    IF #triangular_int <= (-#period_quater) THEN
        #triangular_bool := FALSE;
     ELSIF #triangular_int >= #period_quater THEN
         #triangular_bool := TRUE;
     END_IF;
     IF #triangular_bool THEN
         #triangular_int := #triangular_int - 1;
     ELSE
         #triangular_int := #triangular_int + 1;
     END_IF;
     #triangular_wave := (#In_Amplitude * #triangular_int) / #period_quater;

END_IF;
#pluse_bool[0] := #"50ms_up";

5. 正弦波

  • 计算公式:VAL_SINUS:=AMP*SIN(2*3.1415926*NSIN/MAX)
IF #"50ms_up" AND NOT #pluse_bool[0] THEN
    
     //生成正弦波
     //VAL_SINUS:=AMP*SIN(2*3.1415926*NSIN/MAX)
     IF #sine_int <= #period_max THEN
         #sine_int := #sine_int + 1;
     ELSE
         #sine_int := 0;
     END_IF;
     #sine_wave :=#In_Amplitude *SIN_REAL((2 * #sine_int * #PAI) / #period_max);

END_IF;
#pluse_bool[0] := #"50ms_up";

6. 整体代码如下

#period_max := #In_sign_period / #OBcycle;
#period_half := #period_max / 2;
#period_quater := #period_half / 2;#Pulser_100ms_Instance(Out_50ms_up=>#"50ms_up",
                       Out_50ms_Down=>#"50ms_down");

//实现的波形为矩形波,三角波,正弦波
//必要条件:最大整幅值,输出信号的周期
//思路:把每个周期划分为多个点,比如100个点,使用循环计数值,计算各个点的函数值

//求出周期循环计数器值


IF #"50ms_up" AND NOT #pluse_bool[0] THEN
    
    //生成矩形波
    IF #rectangle_int < #period_max THEN
        #rectangle_int := #rectangle_int + 1;
    ELSE
        #rectangle_int := 0;
    END_IF;
    IF #rectangle_int < #period_half THEN
        #rectangle_wave := #In_Amplitude * 1;
    ELSE
        #rectangle_wave := #In_Amplitude * (-1);
    END_IF;
    
    //生成三角波
    //VAL_TRI:=AMP*CURRNET_INT/QUATER
    IF #triangular_int <= (-#period_quater) THEN
        #triangular_bool := FALSE;
     ELSIF #triangular_int >= #period_quater THEN
         #triangular_bool := TRUE;
     END_IF;
     IF #triangular_bool THEN
         #triangular_int := #triangular_int - 1;
     ELSE
         #triangular_int := #triangular_int + 1;
     END_IF;
     #triangular_wave := (#In_Amplitude * #triangular_int) / #period_quater;
     
     //生成正弦波
     //VAL_SINUS:=AMP*SIN(2*3.1415926*NSIN/MAX)
     IF #sine_int <= #period_max THEN
         #sine_int := #sine_int + 1;
     ELSE
         #sine_int := 0;
     END_IF;
     #sine_wave :=#In_Amplitude *SIN_REAL((2 * #sine_int * #PAI) / #period_max);
    
END_IF;
#pluse_bool[0] := #"50ms_up";

//output
#Out_rectangle_wave := #rectangle_wave;
#Out_triangular_wave := #triangular_wave;
#Out_sine_wave := #sine_wave;
posted @ 2024-05-13 11:40  不愿透露姓名的小村村  阅读(108)  评论(0编辑  收藏  举报