楼主最近还看过
// 在OB35组织块中编写(OB35默认循环中断时间为100ms)
FUNCTION_BLOCK "FlowTotalizer"
VAR
// 输入变量
FlowRate : REAL; // 瞬时流量值 (m³/h)
Reset : BOOL; // 累计值复位信号
// 输出变量
TotalFlow : REAL; // 累计流量值 (m³)
// 内部变量
LastScanTime : TIME; // 上次扫描时间
TimeInterval : REAL; // 时间间隔(小时)
END_VAR
// 主程序
METHOD Calculate : VOID
VAR_TEMP
CurrentTime : TIME;
DeltaTime : TIME;
END_VAR
BEGIN
// 获取当前时间
CurrentTime := TIME();
// 计算时间差(第一次运行时LastScanTime为0)
IF LastScanTime = T#0s THEN
DeltaTime := T#100ms; // 初始值设为100ms
ELSE
DeltaTime := CurrentTime - LastScanTime;
END_IF;
// 转换为小时单位 (100ms = 0.1s = 0.1/3600 h)
TimeInterval := REAL_TO_TIME(DeltaTime) / 3600000.0;
// 流量累计(梯形法积分)
TotalFlow := TotalFlow + FlowRate * TimeInterval;
// 复位处理
IF Reset THEN
TotalFlow := 0.0;
END_IF;
// 更新上次扫描时间
LastScanTime := CurrentTime;
END_METHOD
回复本条