首页 > 编程语言 >PLC程序实现矩形波,三角波,正弦波

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

时间:2024-05-13 11:41:16浏览次数:18  
标签:up 程序实现 正弦波 period triangular int PLC 50ms rectangle

这套程序本来是在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

相关文章

  • 在PLC的扫描特性下,FOR循环里面套IF或者定时器会发生什么?
    1.为什么会提出这个题目在PLC指令的执行过程中,FOR循环会在每个扫描周期执行完一个循环,然后程序才会接着往下扫描在PLC指令的执行过程中,IF判断会在每次扫描中判断一次条件,满足则进入执行体,不满足则跳出IF把IF放在FOR循环里面,会导致循环体执行时间过长,或者其他问题吗?(答案是不会......
  • PLC的开放式用户协议
    1.OUC开放式用户协议,包括ISO,ISO-on-TCP,TCP/IP,UDP四种。西门子PLC中有多种不同的方式建立连接。2.在硬件组态中建立TCP通信打开硬件组图,网络视图添加新连接填入本地ID,关于本地ID:针对1513实测过,ID的取值范围从16#01到16#999,但是16#01-16#99大概率被系统占用了,可用范围从1......
  • 232自由口转Profinet网关接基恩士扫码枪与PLC通讯案例
     232自由口转Profinet网关(XD-PNR100/300)是一款作用于将232自由口转换为Profinet协议,实现不同网络之间的无缝通信和数据交换。232自由口转Profinet网关具有极高的灵活性和可靠性,为工业控制系统提供了强大的支持。通过将自由口信号转换为Profinet协议,可以轻松实现不同设备之间的......
  • snap7读写PLC变量
    1.读DB'''#copysnap7.dll&snap7.libfilestopythonrootpathfirstpipinstallsnap7'''importsnap7importstructfromsnap7importutil#创建通讯客户端实例plc=snap7.client.Client()#连接至PLCplc.connect('192.1......
  • C#与PLC变量在数据交互上的一些探索
    1.基于C#的数据交互A.S7,usingS7.Net,后文读写数据时二次封装过S7协议,这里暂且不表,只列举S7协议最原始的应用。new一个PLC对象//idenfybasiclinkparamsprivatestringplc_ip;privateCpuTypeplc_type;privateshortplc_rack,plc......
  • 基于1500/1200 PLC的webserver---用户自定义页面
    1.创建html页面页面需要包含字符集信息:<metahttp-equiv="content-type"content="text/html;charset=utf-8">包含AWP命令的html文件,大小限制为64KB最简单的页面自动刷新:<metahttp-equiv="Refresh"content="10">2.AWP指令AWP命令公式中""之......
  • 232自由口转Profinet网关接AB扫码枪与PLC通讯案例
     232自由口转Profinet网关(XD-PNR100/300),是一种用于将自由协议转换为Profinet协议的设备,可以实现不同网络之间的通信和数据交换。232自由口转Profinet网关高度的灵活性和可靠性使其成为工业自动化领域的重要工具,并将其与Profinet网络无缝集成,实现数据的快速传输和交换。另外23......
  • C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)
    前言本文介绍了如何使用三菱提供的MXComponent插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考。 用到的软件:1.PLC开发编程环境GXWorks2,GXWorks2下载链接 https://www.mitsubishielectric-......
  • 232Modbus转Profinet网关接扫码枪与PLC通讯
    Modbus转Profinet网关(XD-PNR100/300)的主要作用是实现Modbus协议和Profinet协议之间的转换和通信。本案例是用Modbus转Profinet网关接扫码枪与PLC通讯,扫码枪通常通过特定的接口与计算机或其他设备传输数据,而PLC(可编程逻辑控制器)则通常使用Profinet等工业通信协议。要将扫码枪通过......
  • PLC程序中的配方应用
    建立ARRAYDB集合配方需要的所有元素结构,组成一个UDT(包含范围最全)新建一组ARRAYDB,元素的个数就是配方需要的副本的个数数组DB勾选仅存储在装载内存中,以便数据量大的配方不占用数据工作存储器空间,节省资源在ARRAYDB的起始值处填写配方的具体值1200不支持ARRAYDB,所以用普......