使用TC3的FB_CTRL_RAMP_GENERATOR时bValueReached提前为真的问题排查
问题场景
使用TC3的斜坡功能块FB_CTRL_RAMP_GENERATOR,配置及调用代码如下:
stCTRL_RAMP_GENERATOR_PARAMS.tTaskCycleTime := T#10s; stCTRL_RAMP_GENERATOR_PARAMS.tCtrlCycleTime := T#10s; stCTRL_RAMP_GENERATOR_PARAMS.fVeloPos:= (fTargetTemp-fInitTemp)/(60.0*fRampTime); (* in units per second *) stCTRL_RAMP_GENERATOR_PARAMS.fVeloNeg:= 0; (* in units per second *) bCTRL_RAMP_GENERATOR(bEnable := True, fStart := fInitTemp, fTarget := fTargetTemp, stParams:= stCTRL_RAMP_GENERATOR_PARAMS, fOut => fRampOut, bValueReached=> bValueReached, bError => bError, eErrorId => eErrorId);
将fStart设为25℃、fTarget设为30℃后,启动程序还未达到目标值时,bValueReached就提前变为True,需排查问题原因,重点确认fVeloPos和fVeloNeg的配置是否有误。
排查与解决方案
1. 正斜率速度fVeloPos计算逻辑错误
代码中fVeloPos的计算公式是(fTargetTemp-fInitTemp)/(60.0*fRampTime),这里默认fRampTime的单位是分钟,所以用60转换为秒。但如果fRampTime本身是以秒为单位,这个转换会直接把速度缩小60倍,导致斜坡变化极慢,甚至触发功能块的浮点误差容忍逻辑,提前判定目标达成。
举个例子:若预期斜坡时间为60秒,fRampTime设为60,计算出的速度为(30-25)/(60*60)≈0.00139℃/s,10秒任务周期下每次仅增加0.0139℃,远小于功能块默认的误差容忍阈值(通常±0.01℃左右),会直接触发bValueReached。
修正建议:
- 确认
fRampTime的单位:如果是秒,去掉60.0的转换,公式改为(fTargetTemp-fInitTemp)/fRampTime;如果是分钟,保留60.0转换,但要确保fRampTime的赋值正确。
2. 功能块目标值判断的容忍逻辑
大部分斜坡功能块会内置误差容忍范围,当当前输出与目标值的差值小于该范围时,就会触发bValueReached。如果速度配置过小,单次周期的增量远小于容忍值,可能第一次运行就触发信号。
验证方法:
- 实时监控
fRampOut的实际输出值,若输出仍在25℃左右就触发信号,说明速度配置导致增量过小,触发了误判。
3. 参数初始化与调用时机问题
- 确认
stCTRL_RAMP_GENERATOR_PARAMS的参数在功能块调用前完成初始化,且未被其他代码意外修改。 - 检查
bEnable的触发逻辑:若bEnable不是持续保持True,而是短暂触发后变为False,功能块可能直接判定目标已达成。
4. fVeloNeg配置的影响
当前fVeloNeg设为0,仅影响降斜坡的速度,而本次场景是升斜坡(25→30),所以该参数不是本次问题的原因,可以排除。
总结
大概率是fVeloPos的计算逻辑错误导致斜坡速度异常过小,触发了功能块的目标值容忍判断。先确认fRampTime的单位,修正速度计算公式,再监控fRampOut的变化情况即可定位问题。
内容的提问来源于stack exchange,提问作者Bubble Bub

