ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

西门子PLC结构化编程_模拟量转换FC标准块

西门子PLC结构化编程_模拟量转换FC标准块 文章目录前言一、功能概述二、程序编写1. 新建数据类型“1_AnalogInPutType”2. 新建FC块“FC611_AnalogInPutConver”3. 编程三、程序调用总结前言之前我们分享过基于西门子博途V17平台的模拟量只读转换标准块《西门子PLC结构化编程_优化后的模拟量只读转换标准块》该程序使用FB功能块编写实际项目中发现每次调用都会生成一个背景数据块当模拟量较多时程序变得十分冗杂故本文在原程序基础上重新编写了FC块并对原始程序进行了优化。一、功能概述模拟量输入转换并设置超量程0-27648报警当输入值0或27648时输出值为0或27648同时报警设置采样频率正常情况下每个扫描周期计算一次加上采样周期后在每个设定时间内计算一次比如间隔300ms计算一次即需要每个300ms周期内产生一个高电平和一个低电平此程序将高电平所占时间设置为10ms则低电平时间为290ms均值滤波设置滤波次数(20次)一阶低通滤波滤波系数0.0-1.0采样周期范围0.01当设置为0.01时实际采样周期和程序扫描周期保持一致采样周期越大输出值曲线越平滑但滞后性会越大该参数同时作用于均值滤波算法和一阶低通滤波算法均值滤波次数范围1-20当设置为1时均值滤波功能失效一阶低通滤波器对高频信号有较大的阻碍作用对低频信号阻碍作用较低本程序滤波器算法基于后向差分法一阶低通滤波器参数范围0.0-1.0不包括0.0参数越小曲线越平滑但时效性越差参数越大滤波效果越差当设置为1.0时一阶低通滤波功能失效当CPU启动时的第一个扫描周期或按下“初始化按钮”后将模拟量参数设置为默认值其它情况下可在上位机界面修改当有多个模拟量时可将“外部初始化按钮”关联同一个变量当该变量置位时所有模拟量参数设定值同时初始化可设置死区值当模拟量实际值小于设定值时不进行报警。二、程序编写1. 新建数据类型“1_AnalogInPutType”图12. 新建FC块“FC611_AnalogInPutConver”建立如下引脚变量图23. 编程// 初始化设定// 参数赋值#Analog.InPut.AI_IN:#AI_IN;#Analog.InPut.IN_MIN:#IN_MIN;#Analog.InPut.IN_MAX:#IN_MAX;#Analog.HMI.ModeOut:#ModeOut;IF #FirstScan OR #Analog.HMI.InitialSet OR #HMIInitialSet THEN#Analog.HMI.OUT_MAX:#OUT_MAX;#Analog.HMI.OUT_MIN:#OUT_MIN;#Analog.HMI.LL_Set:#LL_Set;#Analog.HMI.L_Set:#L_Set;#Analog.HMI.H_Set:#H_Set;#Analog.HMI.HH_Set:#HH_Set;#Analog.HMI.CY_CYCLE:#CY_CYCLE;#Analog.HMI.Filt_Times:#Filt_Times;#Analog.HMI.ModeFilter:#ModeFilter;#Analog.HMI.Alpha:#Alpha;// #Analog.HMI.InitialSet : 0; // 初始化设定按钮自复位// #HMIInitialSet : 0; // 外部初始化设定按钮自复位END_IF;// 把浮点数转换为时间IF #Analog.HMI.CY_CYCLE0.01THEN#Analog.HMI.CY_CYCLE:0.01;END_IF;#Analog.Temp.CYCLE_Time:DINT_TO_TIME(REAL_TO_DINT(#Analog.HMI.CY_CYCLE*1000.0)-10);//DINT 1000转成TIME表示1S若CY_CYCLE1则实际时间为1s//“-10”是为了将1S分割成990ms低电平和10ms高电平注意这里调用了自定义边沿检测标准块“FC610_EdgeTrigger”见文章《西门子PLC结构化编程_自定义边沿检测功能块》。// 超量程报警IF #Analog.InPut.AI_IN#Analog.InPut.IN_MIN THEN#Analog.InPut.AI_IN:#Analog.InPut.IN_MIN;#Analog.Temp.Over_Alarm_L:1;ELSE#Analog.Temp.Over_Alarm_L:0;END_IF;IF #Analog.InPut.AI_IN#Analog.InPut.IN_MAX THEN#Analog.InPut.AI_IN:#Analog.InPut.IN_MAX;#Analog.Temp.Over_Alarm_H:1;ELSE#Analog.Temp.Over_Alarm_H:0;END_IF;IF #Analog.Temp.Over_Alarm_L OR #Analog.Temp.Over_Alarm_H THEN#Analog.HMI.Over_Alarm:1;#Analog.HMI.PV:99999.0;ELSIF(NOT #Analog.Temp.Over_Alarm_L)AND(NOT #Analog.Temp.Over_Alarm_H)THEN#Analog.HMI.Over_Alarm:0;END_IF;// 计算输出值// 计算没有经过滤波的4~20mA信号输出值#Analog.OutPut.OUT_Mode0:((INT_TO_REAL(#Analog.InPut.AI_IN-#Analog.InPut.IN_MIN)/INT_TO_REAL(#Analog.InPut.IN_MAX-#Analog.InPut.IN_MIN))*(#Analog.HMI.OUT_MAX-#Analog.HMI.OUT_MIN))#Analog.HMI.OUT_MIN;// 计算没有经过滤波的热电阻PT100信号输出值#Analog.OutPut.OUT_Mode1:INT_TO_REAL(#Analog.InPut.AI_IN)/10.0;// 模式选择及输出IF #Analog.HMI.ModeOut THEN#Analog.OutPut.OUT:#Analog.OutPut.OUT_Mode1;ELSE#Analog.OutPut.OUT:#Analog.OutPut.OUT_Mode0;END_IF;IF #Analog.Temp.TempBool2 THEN REGION 均值滤波 IF #Analog.HMI.Filt_Times20THEN#Analog.HMI.Filt_Times:20;END_IF;IF #Analog.HMI.Filt_Times1THEN#Analog.HMI.Filt_Times:1;END_IF;FOR #Analog.Temp.N:#Analog.HMI.Filt_Times TO1BY-1DO//从最后一个值开始依次将数组中的后一个值倒序赋给前一个值#Analog.Temp.Filts[#Analog.Temp.N]:#Analog.Temp.Filts[#Analog.Temp.N-1];END_FOR;#Analog.Temp.Filts[0]:#Analog.OutPut.OUT;//将输出值赋给数组中的第一个值#Analog.Temp.SUM:0;FOR #Analog.Temp.N:0TO #Analog.HMI.Filt_Times-1DO//计算滤波数组的和#Analog.Temp.SUM:#Analog.Temp.SUM#Analog.Temp.Filts[#Analog.Temp.N];END_FOR;#Analog.OutPut.MeanFilter_OUT:#Analog.Temp.SUM/#Analog.HMI.Filt_Times;//计算平均值END_REGION REGION 一阶低通滤波 IF #Analog.HMI.Alpha1.0THEN#Analog.HMI.Alpha:1.0;END_IF;IF #Analog.HMI.Alpha0.0THEN#Analog.HMI.Alpha:0.01;END_IF;#Analog.OutPut.RCFilter_OUT:(1.0-#Analog.HMI.Alpha)*#Analog.Temp.RCFilter_OUT_PreTime#Analog.HMI.Alpha*#Analog.OutPut.OUT;#Analog.Temp.RCFilter_OUT_PreTime:#Analog.OutPut.RCFilter_OUT;END_REGION END_IF;// 滤波器选择IF NOT #Analog.HMI.Over_Alarm THEN IF #Analog.HMI.ModeFilter THEN#Analog.HMI.PV:#Analog.OutPut.RCFilter_OUT;ELSE#Analog.HMI.PV:#Analog.OutPut.MeanFilter_OUT;END_IF;END_IF;// 复位IF #Analog.HMI.HMI_Rst THEN#Analog.HMI.LL_Latch:0;#Analog.HMI.L_Latch:0;#Analog.HMI.H_Latch:0;#Analog.HMI.HH_Latch:0;#Analog.HMI.LL_Alarm:0;#Analog.HMI.L_Alarm:0;#Analog.HMI.H_Alarm:0;#Analog.HMI.HH_Alarm:0;END_IF;#Analog.HMI.HMI_Rst:#Analog.HMI.HMI_Rst AND NOT #Analog.Temp.TempBool3;#Analog.HMI.InitialSet:#Analog.HMI.InitialSet AND NOT #Analog.Temp.TempBool4;#HMIInitialSet:#HMIInitialSet AND NOT #Analog.Temp.TempBool5;#Analog.Temp.TempBool3:#Analog.HMI.HMI_Rst;#Analog.Temp.TempBool4:#Analog.HMI.InitialSet;#Analog.Temp.TempBool5:#HMIInitialSet;三、程序调用创建一个DB块用来存放所有的模拟量数据。图3在主程序段中调用“FC611_AnalogInPutConver”并关联对应变量示例如下图4总结本文进一步优化了模拟量转换标准块。
返回列表