西门子V15及以上版本通用模拟量处理程序块:1200与1500模拟量滤波程序及报警功能
西门子1200和1500通用模拟量处理程序块模拟量滤波程序程序块可方便直接调用用于过滤峰值且可以方便调用模拟量高低报警。 博图版本V15及以上。工业现场模拟量信号处理总带着点玄学尤其是车间里那些老设备时不时给你来个信号跳变能把人整懵。去年在钢厂做连铸机改造时就遇到过这破事儿——热电偶信号抽风似的忽高忽低硬是逼着我搞了个通用滤波块。今天就把这个在1200/1500上都跑得溜的模拟量处理程序解剖给大伙儿瞧瞧。西门子1200和1500通用模拟量处理程序块模拟量滤波程序程序块可方便直接调用用于过滤峰值且可以方便调用模拟量高低报警。 博图版本V15及以上。先甩个程序框架镇楼FUNCTION_BLOCK AnalogProcessing VAR_INPUT RawValue : REAL; // 原始模拟量 SampleCount : INT : 10; // 采样次数 DeadBand : REAL : 2.0; // 死区范围 HiAlarm : REAL : 80.0; // 高报警值 LoAlarm : REAL : 20.0; // 低报警值 Reset : BOOL; // 报警复位 END_VAR VAR_OUTPUT FilteredValue : REAL; // 滤波后数值 Hi_Alarm : BOOL; // 高报警 Lo_Alarm : BOOL; // 低报警 END_VAR VAR Buffer : ARRAY[1..50] OF REAL; // 环形缓冲区 Index : INT : 1; ValidSamples : INT : 0; END_VAR这个滤波算法的核心是动态死区均值法。和传统移动平均不同咱这货会先过滤掉突变的野值当新采样值与前N次均值偏差超过死区时直接扔掉这个野孩子。具体看这段处理逻辑// 野值过滤 IF ValidSamples SampleCount THEN AvgValue : SUM(Buffer) / ValidSamples; IF ABS(RawValue - AvgValue) DeadBand THEN RETURN; // 异常值直接丢弃 END_IF; END_IF; // 环形缓冲区更新 Buffer[Index] : RawValue; Index : Index MOD SampleCount 1; ValidSamples : MIN(ValidSamples 1, SampleCount);报警处理这块加了点人性化设计——双条件触发机制。当连续3个滤波后的数值越限才触发报警避免设备抖动导致误报。看这段报警判断// 报警延迟触发 IF FilteredValue HiAlarm THEN Hi_Counter : Hi_Counter 1; ELSE Hi_Counter : 0; END_IF; Hi_Alarm : Hi_Counter 3 OR (Hi_Alarm AND NOT Reset);实际调用时简单得飞起在OB1里这么写就行#AnalogProc_1( RawValue : AI_1.Channel_0, SampleCount : 15, // 1.5秒采样周期假设100msOB DeadBand : 5.0, HiAlarm : 750.0, LoAlarm : 200.0 ); 温度显示 : #AnalogProc_1.FilteredValue; 超温报警 : #AnalogProc_1.Hi_Alarm;调试时踩过的坑得说道说道某次在真空炉项目里死区设了2%结果报警狂闪。后来发现是电磁阀动作时电源干扰把死区调到5%立马老实。还有个细节——程序里那个Buffer数组大小别抠门我设50是给采样次数留足余量毕竟博图对数组越界查得严。最后说下性能在1515F上实测同时处理32路模拟量CPU占用不到5%。这程序块最骚的是报警复位设计成脉冲触发避免了长信号导致的玄学问题。代码全开放爱咋改咋改记得把采样次数和死区的关系调明白了——采样次数越多死区可以越小但响应会变慢自己把握这个平衡点吧。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2409221.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!