以下是一个简单的SCL程序示例,用于配料过程的控制:
[code]FUNCTION_MATERIAL_MIXING : FUNCTION_BLOCK
VAR_INPUT
Fast_Speed_Time : TIME; // 快速模式下每个物料称重所需的时间
Slow_Speed_Time : TIME; // 慢速模式下每个物料称重所需的时间
Point_Comp_Time : TIME; // 点补模式下每个物料称重所需的时间
Recipe_Count : INT; // 配方数量
Material_Count : INT; // 物料种类数量
Material_Weight : ARRAY[1..8] OF REAL; // 每个物料的重量
Recipe : ARRAY[1..8, 1..8] OF REAL; // 每个配方中每个物料的重量
Allowable_Error : REAL; // 允许的偏差值
END_VAR
VAR_OUTPUT
Material_Weight_Result : ARRAY[1..8] OF REAL; // 实际称重得到的每个物料的重量
END_VAR
VAR
Current_Recipe_Index : INT := 1; // 当前使用的配方编号
Current_Material_Index : INT := 1; // 当前使用的物料编号
Mixing_Speed : INT := 0; // 当前混合速度(0:停止,1:快速,2:慢速,3:点补)
Mixing_Timer : TON; // 称重计时器
Mixing_Error : REAL; // 当前秤重的误差值
Material_Weight_Temp : REAL; // 当前物料的重量暂存值
Recipe_Target_Weight : REAL; // 当前配方所需的总重量
Recipe_Material_Weight : ARRAY[1..8] OF REAL; // 当前配方中每个物料需要的重量
END_VAR
Mixing_Timer(IN:=TRUE, PT:=Mixing_Speed_Time);
CASE Mixing_Speed OF
0: // 暂停状态
IF Mixing_Timer.Q THEN
Mixing_Timer(IN:=FALSE);
Mixing_Speed := 1;
END_IF
1: // 快速模式
IF Mixing_Timer.Q THEN
Mixing_Timer(IN:=FALSE);
Mixing_Speed := 2;
END_IF
2: // 慢速模式
IF Mixing_Timer.Q THEN
Mixing_Timer(IN:=FALSE);
Mixing_Speed := 3;
END_IF
3: // 点补模式
IF Mixing_Timer.Q THEN
Mixing_Timer(IN:=FALSE);
Mixing_Speed := 0;
Material_Weight_Temp := Scale_Read(); // 读取当次称出的物料重量
Mixing_Error := ABS(Material_Weight_Temp - Recipe_Material_Weight[Current_Material_Index]); // 计算偏差值
IF Mixing_Error <= Allowable_Error THEN // 偏差值在允许范围内,记录当前物料的称重结果
Material_Weight_Result[Current_Material_Index] := Material_Weight_Temp;
ELSE // 偏差值超出允许范围,重复此次物料的配制
Mixing_Speed := 3;
END_IF
IF Current_Material_Index = Material_Count THEN // 当前配制完成,进入下一个配方或结束程序
Recipe_Target_Weight := 0;
FOR i:=1 TO Material_Count DO
Recipe_Target_Weight := Recipe_Target_Weight + Recipe_Material_Weight[i];
END_FOR
IF ABS(Recipe_Target_Weight - Total_Material_Weight) <= Allowable_Error THEN // 配方总重量在允许范围内,记录当前配方的结果,进入下一个配方(如有)
FOR i:=1 TO Material_Count DO
Material_Weight[Current_Recipe_Index, i] := Material_Weight_Result[i];
END_FOR
IF Current_Recipe_Index < Recipe_Count THEN // 还有其他配方需要配制
Current_Recipe_Index := Current_Recipe_Index + 1;
Material_Weight_Result := 0; // 清空记录本次配制的实际物料重量
Mixing_Speed := 1;
ELSE // 所有配方均已配制完成
// 完成配方过程后的处理
END_IF
ELSE // 配方总重量不在允许范围内,重复此次配方的配制
Mixing_Speed := 1;
END_IF
Current_Material_Index := 1;
ELSE // 当前配制未完成,继续下个物料的配制
Current_Material_Index := Current_Material_Index + 1;
Mixing_Speed := 1; // 回到快速模式
END_IF
END_IF
END_CASE
Recipe_Material_Weight := Recipe[Current_Recipe_Index];
Mixing_Timer(IN:=TRUE, PT:=Fast_Speed_Time); // 初始化计时器,开始快速称重
Mixing_Speed := 1; // 进入快速模式
END_FUNCTION_BLOCK[/code]
需要注意的是,此程序仅为示例,其中的具体细节和实现方式可能会因不同的硬件设备和环境而有所区别。建议参照具体设备的文档和说明,进行相应的修改和调整。 |