假设燃油调节阀开度与风门调节阀开度线性匹配,燃油调节阀开度分成了10段(P0_Fuel,P1_Fuel,....P9_Fuel),风门调节阀也分成10段(P0_Air,P1_Air,...P9_Air),当燃油调节阀开度处于某个数值(比如介于P2_Fuel和P3_Fuel之间),求此时风门调节阀开度,在博途用SCL实现很简单:
// ========== 边界处理 ==========
IF #Fuel_Open <= #P_Fuel[0] THEN
#Air_Open := #P_Air[0];
RETURN;
END_IF;
IF #Fuel_Open >= #P_Fuel[9] THEN
#Air_Open := #P_Air[9];
RETURN;
END_IF;
// ========== 查找所在区间 ==========
FOR #i := 1 TO 9 DO
IF #Fuel_Open <= #P_Fuel[#i] THEN
#LowerIndex := #i - 1;
#UpperIndex := #i;
EXIT;
END_IF;
END_FOR;
// ========== 线性插值计算 ==========
#Slope := (#P_Air[#UpperIndex] - #P_Air[#LowerIndex]) /
(#P_Fuel[#UpperIndex] - #P_Fuel[#LowerIndex]);
#Air_Open := #P_Air[#LowerIndex] +
#Slope * (#Fuel_Open - #P_Fuel[#LowerIndex]);
但是由于200smart不支持SCL,所以只能用STL,程序如下,不过只有边缘值检测可以按预期运行,中间值算出来都是0,或者就是没有执行,帮我分析一下哪里有问题
// 网络1: 边界检查 - 小于 P0_Fuel
LD Always_On
MOVD #pFuelTable, AC1
LDR<= #Current_Fuel, *AC1
JMP 1
// 网络2: 边界检查 - 大于 P9_Fuel
LD Always_On
MOVD #pFuelTable, AC1
+D 36, AC1
LDR>= #Current_Fuel, *AC1
JMP 2
// 网络3: 初始化查表指针
LD Always_On
MOVD #pFuelTable, AC1
MOVD #pAirTable, AC2
MOVW 0, #i
// 网络4: 查表循环
LBL 4
LDW>= #i, 9
JMP 5
// 未找到,移动指针
+D 4, AC1
+D 4, AC2
+I 1, #i
MOVR *AC2, #Output_Air
JMP 4
// 网络5: 输出 P0_Air
LBL 1
MOVD #pAirTable, AC2
MOVR *AC2, #Output_Air
JMP 5
// 网络6: 输出 P9_Air
LBL 2
MOVD #pAirTable, AC2
+D 36, AC2
MOVR *AC2, #Output_Air
JMP 5
// 网络7: 插值计算
LBL 3
MOVR *AC2, #Air_L
+D 4, AC2
MOVR *AC2, #Air_R
-D 4, AC2
MOVR #Current_Fuel, #Ratio
-R #Fuel_L, #Ratio
MOVR #Fuel_R, #Temp_Real
-R #Fuel_L, #Temp_Real
/R #Temp_Real, #Ratio
MOVR #Air_R, #Temp_Real
-R #Air_L, #Temp_Real
*R #Ratio, #Temp_Real
MOVR #Air_L, #Result
+R #Temp_Real, #Result
MOVR #Result, #Output_Air
// 网络8: 结束
LBL 5