西门子流量累计FB块

科技   2024-12-17 22:00   广东  

西门子流量累计FB块(Function Block)是一种专门为处理和计算流量数据而设计的功能块,它通常在博途(TIA Portal)软件中被创建和使用。该功能块的意义在于将复杂的流量累计逻辑封装成一个易于使用的模块,从而简化了编程工作,提高了代码的可读性和维护性。



一、意义


  1. 简化编程:通过使用预先编写好的FB块,工程师可以快速地实现流量累计功能,而无需从头编写代码。

  2. 提高效率:由于FB块是针对特定任务优化过的,因此它们往往比手动编写的代码更加高效。

  3. 增强稳定性:经过测试的功能块通常更加稳定可靠,能够减少程序错误的可能性。

  4. 促进标准化:使用标准的功能块有助于在不同项目之间保持一致性的编程风格和技术规范。




二、主要应用场合



  1. 工业自动化:在化工、制药、食品饮料等行业的生产过程中,对液体或气体的流量进行精确测量和累计是非常重要的。例如,在配料系统中确保每种成分按照正确的比例加入。

  2. 能源管理:对于水、电、气等资源的消耗监控,利用流量累计FB块可以帮助企业更好地管理和优化其能源使用。

  3. 环境监测:在废水处理厂或其他需要排放控制的地方,准确记录进出水量对于遵守环保法规至关重要。

  4. 设备维护:基于流量数据的长期趋势分析可以预测设备的状态变化,提前安排预防性维护活动,降低故障风险。

  5. 质量控制:在制造过程中,通过对原材料或者产品的流量进行严格控制,以保证产品质量的一致性。

综上所述,西门子流量累计FB块因其简便性和高效性,在多个领域有着广泛的应用价值,特别是在那些要求高精度流量测量和数据分析的场合。




三、FB块封装


IF #run = TRUE  THEN
    #relay := 1;
END_IF;


IF #run = FALSE THEN
    #relay := 0;
    #initial := 0;
END_IF;


    #flow_VAL_1 := #flow_VAL / 36000;   
    
    IF #initial = 1 AND #relay = 1 THEN   
        
        FOR #i := 1 TO #Filter_Length BY 1 DO
            
            #FLOW_DATA[#i] := #flow_VAL_1;
            
        END_FOR;
        
    END_IF;
    
    IF #initial = 0 AND #relay = 1 THEN    
        
        FOR #i := 1 TO #Array_length BY 1 DO
            
            #FLOW_DATA[#i] := #flow_VAL_1;
            
        END_FOR;
        #initial := 1;
    END_IF;
    
    #FLOW_DATA_MAX := 0;    
    FOR #i := 1 TO #Array_length BY 1 DO
        
        IF #FLOW_DATA_MAX < #FLOW_DATA[#i] THEN
            
            #FLOW_DATA_MAX := #FLOW_DATA[#i];
            
        END_IF;
        
    END_FOR;
    
    #FLOW_DATA_MIN := #FLOW_DATA_MAX;   
    
    FOR #i := 1 TO #Array_length BY 1 DO
        
        IF #FLOW_DATA_MIN > #FLOW_DATA[#i] THEN
            
            #FLOW_DATA_MIN := #FLOW_DATA[#i];
            
        END_IF;
        
    END_FOR;
    
    #FLOW_DATA_SUM := 0;      
    
    FOR #i := 1 TO #Array_length BY 1 DO
        
        #FLOW_DATA_SUM := #FLOW_DATA[#i] + #FLOW_DATA_SUM;
        
    END_FOR;
    
    #FLOW_DATA_Average := (#FLOW_DATA_SUM - #FLOW_DATA_MIN - #FLOW_DATA_MAX) / (#Array_length - 2);
    
    
    FOR #i := 1 TO (#Array_length - #Filter_Length) BY 1 DO
        
        #FLOW_DATA_1[#i] := #FLOW_DATA[#i];
        
    END_FOR;
    
    FOR #i := 1 TO (#Array_length - #Filter_Length) BY 1 DO
        
        #FLOW_DATA[#i + #Filter_Length] := #FLOW_DATA_1[#i];
        
    END_FOR;
    
    
    
    IF #Array_length >= 10 THEN
        
        IF #Filter_strength > 3 THEN
            
            #Filter_strength := 3;
            
        END_IF;
        
        #Filter_Length := (#Array_length / 10) * 2 * #Filter_strength;
        
    END_IF;
    
    IF #Array_length < 10 THEN
        
        IF #Filter_strength > 2 THEN
            
            #Filter_strength := 2;
            
        END_IF;
        
        
        #Filter_Length := 2 * #Filter_strength;
        
    END_IF;
    
    #IEC_Timer_0_Instance(IN := NOT #IEC_Timer_0_Instance.Q,
                          PT := #Cycle_ms);
    
    IF #IEC_Timer_0_Instance.Q THEN
        
        #time_data := TIME_TO_DINT(#Cycle_ms);
        #Cycle_Real := DINT_TO_REAL(#time_data);
        
        #Accum := (#Last_Value + #flow_VAL_1) * #Cycle_Real / 2 + #Accum;
        
        #flow_out_put := #Accum;
        
        #Last_Value := #flow_VAL_1;
        
    END_IF;
    
     IF #Reset THEN    
         
         #Last_Value := 0.000000E000;
         #Accum := 0.000000E000;
         #flow_out_put := 0.000000E000;
         
     END_IF;




往期 · 推荐

都说外国电工布线牛到不行?今天就看看中国电工最强布线!

PLC对模拟量信号是如何转换的?

工程师惊心动魄的冒险瞬间!

网友贪便宜买了一个WiFi信号增强器,拆开后看到里面的用料我惊呆了......

领导看到厂里的电工清闲,安排去生产线帮忙,设备出现故障时,又让电工去维修,这样正常吗?

分享、在看与点赞,至少我要拥有一个吧!

工控论坛
工控论坛,自动化从业者的精神家园
 最新文章