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

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

1. 采样时间

  • 想要生成连续的波形图,本质就是在采样时间点上采集当前输出值,当采样点足够多的时候,在时间线上就形成了随时间变化的波形图了
    • 程序中基于定时器自己做了一个上半周期50ms,下半周期50ms,占空比50%的脉冲发生器(本身是个方波)
    • 程序输出两个bool量,一个50ms_up,一个50ms_down。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      //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
    1
    2
    3
    4
    5
    6
    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为生成波形需要的振幅
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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. 整体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#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;

PLC程序实现矩形波,三角波,正弦波
http://example.com/2024/07/21/PLC程序实现矩形波,三角波,正弦波/
作者
xiao cuncun
发布于
2024年7月21日
许可协议