这套程序本来是在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;
标签:up,程序实现,正弦波,period,triangular,int,PLC,50ms,rectangle
From: https://www.cnblogs.com/xiacuncun/p/18188807