//=====================================================================
// 液体混合搅拌控制程序 - SCL语言
// 工艺要求:根据液位传感器控制阀门、电机搅拌及排液全流程
//=====================================================================
//--------------------------变量定义区--------------------------------
VAR
// 输入信号
StartBtn : BOOL; // 启动按钮(触摸屏)
StopBtn : BOOL; // 停止按钮(触摸屏)
L_Low : BOOL; // 低液位传感器L(OFF=未动作,ON=动作)
M_Mid : BOOL; // 中液位传感器M
H_High : BOOL; // 高液位传感器H
FaultM2 : BOOL; // 变频器故障信号
// 输出信号
YV1 : BOOL; // 阀A(液体A进料)
YV2 : BOOL; // 阀B(液体B进料)
YV3 : BOOL; // 阀C(排液阀)
MotorM1_Run : BOOL; // 搅拌电机运行指令
MotorM1_Fwd : BOOL; // 电机正转指令
MotorM1_Rev : BOOL; // 电机反转指令
MotorM2_Run : BOOL; // 故障备用电机运行
MotorFreq : REAL; // 电机运行频率
// 系统状态
Step : INT := 0;// 步序号:0=初始,1=注A,2=注B+搅拌1,3=搅拌2,4=搅拌3,5=排液,6=结束
CycleCnt1 : INT := 0; // 搅拌1阶段循环计数
CycleCnt2 : INT := 0; // 搅拌2阶段循环计数
CycleCnt3 : INT := 0; // 搅拌3阶段循环计数
DrainTimer : TON; // 排液倒计时(9s)
StirTimer : TON; // 搅拌阶段计时
SystemActive : BOOL := FALSE; // 系统运行标志
END_VAR
//--------------------------步序控制主逻辑----------------------------
// 初始步:系统未运行,所有输出复位
IF Step = 0 THEN
YV1 := FALSE;
YV2 := FALSE;
YV3 := FALSE;
MotorM1_Run := FALSE;
MotorM1_Fwd := FALSE;
MotorM1_Rev := FALSE;
MotorFreq := 0.0;
CycleCnt1 := 0;
CycleCnt2 := 0;
CycleCnt3 := 0;
DrainTimer(IN:=FALSE);
StirTimer(IN:=FALSE);
// 按下启动按钮进入注A步
IF StartBtn AND NOT SystemActive THEN
SystemActive := TRUE;
Step := 1;
END_IF;
END_IF;
// 步1:注液体A,直到中液位
IF Step = 1 THEN
YV1 := TRUE;
IF M_Mid THEN // 到达中液位
YV1 := FALSE;
Step := 2;
StirTimer(IN:=TRUE, PT:=T#3S); // 搅拌前停3秒
END_IF;
END_IF;
// 步2:注液体B + 搅拌阶段1(10Hz,5s正转/反转+3s停)
IF Step = 2 THEN
YV2 := TRUE;
// 搅拌前等待3秒
IF StirTimer.Q THEN
StirTimer(IN:=FALSE);
// 搅拌阶段1循环控制
IF CycleCnt1 < 3 THEN
// 正转10Hz运行5s
IF NOT MotorM1_Run THEN
MotorM1_Run := TRUE;
MotorM1_Fwd := TRUE;
MotorFreq := 10.0;
StirTimer(IN:=TRUE, PT:=T#5S);
ELSIF StirTimer.Q AND MotorM1_Fwd THEN
MotorM1_Fwd := FALSE;
StirTimer(IN:=TRUE, PT:=T#3S); // 停3秒
ELSIF StirTimer.Q AND NOT MotorM1_Fwd AND NOT MotorM1_Rev THEN
MotorM1_Rev := TRUE;
StirTimer(IN:=TRUE, PT:=T#5S);
ELSIF StirTimer.Q AND MotorM1_Rev THEN
MotorM1_Rev := FALSE;
CycleCnt1 := CycleCnt1 + 1;
StirTimer(IN:=TRUE, PT:=T#3S); // 停3秒
END_IF;
ELSE
// 搅拌阶段1完成,等待高液位信号
IF H_High THEN
YV2 := FALSE;
Step := 3;
MotorM1_Run := FALSE;
StirTimer(IN:=TRUE, PT:=T#3S); // 停3秒
END_IF;
END_IF;
END_IF;
END_IF;
// 步3:搅拌阶段2(20Hz,5s正转/反转+3s停,3个周期)
IF Step = 3 THEN
IF StirTimer.Q THEN
StirTimer(IN:=FALSE);
IF CycleCnt2 < 3 THEN
IF NOT MotorM1_Run THEN
MotorM1_Run := TRUE;
MotorM1_Fwd := TRUE;
MotorFreq := 20.0;
StirTimer(IN:=TRUE, PT:=T#5S);
ELSIF StirTimer.Q AND MotorM1_Fwd THEN
MotorM1_Fwd := FALSE;
StirTimer(IN:=TRUE, PT:=T#3S);
ELSIF StirTimer.Q AND NOT MotorM1_Fwd AND NOT MotorM1_Rev THEN
MotorM1_Rev := TRUE;
StirTimer(IN:=TRUE, PT:=T#5S);
ELSIF StirTimer.Q AND MotorM1_Rev THEN
MotorM1_Rev := FALSE;
CycleCnt2 := CycleCnt2 + 1;
StirTimer(IN:=TRUE, PT:=T#3S);
END_IF;
ELSE
Step := 4;
MotorM1_Run := FALSE;
StirTimer(IN:=TRUE, PT:=T#3S); // 停3秒
END_IF;
END_IF;
END_IF;
// 步4:搅拌阶段3(50Hz,3s正转/反转+2s停,3个周期)
IF Step = 4 THEN
IF StirTimer.Q THEN
StirTimer(IN:=FALSE);
IF CycleCnt3 < 3 THEN
IF NOT MotorM1_Run THEN
MotorM1_Run := TRUE;
MotorM1_Fwd := TRUE;
MotorFreq := 50.0;
StirTimer(IN:=TRUE, PT:=T#3S);
ELSIF StirTimer.Q AND MotorM1_Fwd THEN
MotorM1_Fwd := FALSE;
StirTimer(IN:=TRUE, PT:=T#2S);
ELSIF StirTimer.Q AND NOT MotorM1_Fwd AND NOT MotorM1_Rev THEN
MotorM1_Rev := TRUE;
StirTimer(IN:=TRUE, PT:=T#3S);
ELSIF StirTimer.Q AND MotorM1_Rev THEN
MotorM1_Rev := FALSE;
CycleCnt3 := CycleCnt3 + 1;
StirTimer(IN:=TRUE, PT:=T#2S);
END_IF;
ELSE
Step := 5;
MotorM1_Run := FALSE;
StirTimer(IN:=TRUE, PT:=T#3S); // 停3秒
END_IF;
END_IF;
END_IF;
// 步5:排液阶段(阀C打开+10Hz正转搅拌)
IF Step = 5 THEN
IF StirTimer.Q THEN
StirTimer(IN:=FALSE);
YV3 := TRUE;
MotorM1_Run := TRUE;
MotorM1_Fwd := TRUE;
MotorFreq := 10.0;
// 低液位触发后启动9s倒计时
IF NOT L_Low THEN
DrainTimer(IN:=TRUE, PT:=T#9S);
END_IF;
// 倒计时结束完成周期
IF DrainTimer.Q THEN
YV3 := FALSE;
MotorM1_Run := FALSE;
MotorM1_Fwd := FALSE;
Step := 6;
END_IF;
END_IF;
END_IF;
// 步6:周期结束,复位到初始状态
IF Step = 6 THEN
SystemActive := FALSE;
Step := 0;
END_IF;
// 故障处理:变频器故障时备用电机M2运行
IF FaultM2 THEN
MotorM2_Run := TRUE;
ELSE
MotorM2_Run := FALSE;
END_IF;
// 紧急停止处理(任意步序均可复位)
IF StopBtn THEN
Step := 0;
END_IF; 去感谢豆包吧