全自动工业洗衣机运行控制系统
全自动工业洗衣机运行控制系统一、拖动方案设计一工业洗衣机由一台三相异步电动机驱动。电动机的控制由一台PLC结合变频器、接触器实现。二、运行过程1、三相电源接通后,PLC得电,系统进入初始状态。2、按下启动按钮,随即开始进水(以HL1指示灯亮表示),水位到达高水位时(用接近开关LS1检测),停止进水,并以35Hz频率开始洗涤正转。6秒后暂停2秒,之后以35Hz频率开始洗涤反转。6秒后暂停2秒为一次小循环,若小循环不足3次,则返回洗涤正转;3、若小循环达3次,则开始排水(用HL1指示灯按0.5Hz频率闪烁表示)。水位下降到低水位时(用接近开关LS2检测)开始脱水(电动机以工频50Hz正转)并继续排水。脱水5秒即完成一次大循环。大循环不足3次,则返回进水,进行下一次大循环。4、若完成3次大循环,则进行洗完报警(用HL2指示灯按1Hz频率闪烁表示),报警3秒结束全部过程,自动停机。下次按下启动按钮重复上述过程。三、控制要求1、洗涤由PLC结合变频器实现(变频控制,加、减速时间均为1s);2、脱水由PLC结合接触器实现(工频控制)。3、启动按钮还可作为暂停按钮使用(即在正常运转时按下此按钮可停止,再按此按钮继续运行)。4、工频控制时,以热继电器作为过载保护。根据以上内容用博图的SCL语言编写一套控制程序,采用标准化编程,详细一点!
程序如下:
FUNCTION_BLOCK FB_WashingMachine_Control
TITLE = "Washing Machine Control"
VAR_INPUT
StartBtn : BOOL; // 启动按钮
PauseBtn : BOOL; // 暂停/继续按钮
END_VAR
VAR_OUTPUT
HL1 : BOOL; // 指示灯 - 进水/排水
HL2 : BOOL; // 指示灯 - 完成报警
MotorForward : BOOL; // 电动机正转
MotorReverse : BOOL; // 电动机反转
DrainPump : BOOL; // 排水泵
END_VAR
VAR
State : INT; // 状态机
WaterLevel : INT := 0; // 水位计数器
WashCycle : INT := 0; // 洗涤循环计数器
LargeCycle : INT := 0; // 大循环计数器
StartTime : TIME := T#0s; // 计时器
MotorSpeed : REAL := 35; // 电动机转速
DrainSpeed : REAL := 0.5; // 排水泵转速
Pause : BOOL := FALSE; // 暂停状态
END_VAR
// 定义常量
CONST
WaterHighLevel : INT := 100; // 高水位
WaterLowLevel : INT := 50; // 低水位
MaxWashCycle : INT := 3; // 洗涤小循环最大次数
MaxLargeCycle : INT := 3; // 大循环最大次数
WashDuration : TIME := T#8s; // 洗涤持续时间
PauseDuration : TIME := T#2s; // 暂停时间
DrainDuration : TIME := T#5s; // 排水持续时间
MaxTime : TIME := T#3s; // 报警闪烁最大时间
END_CONST
// 状态定义
CONSTANT
STATE_INIT : INT := 0; // 初始状态
STATE_FILL_WATER : INT := 1; // 进水
STATE_WASH_FORWARD : INT := 2; // 洗涤正转
STATE_PAUSE_1 : INT := 3; // 暂停1
STATE_WASH_REVERSE : INT := 4; // 洗涤反转
STATE_PAUSE_2 : INT := 5; // 暂停2
STATE_DRAIN_WATER : INT := 6; // 排水
STATE_SPIN : INT := 7; // 脱水
STATE_ALARM : INT := 8; // 报警
STATE_STOP : INT := 9; // 停止
END_CONSTANT
// PLC处理
CASE State OF
STATE_INIT:
// 初始化
HL1 := FALSE;
HL2 := FALSE;
MotorForward := FALSE;
MotorReverse := FALSE;
DrainPump := FALSE;
WaterLevel := 0;
WashCycle := 0;
LargeCycle := 0;
Pause := FALSE;
IF StartBtn THEN
State := STATE_FILL_WATER;
StartTime := T#0s;
END_IF
STATE_FILL_WATER:
// 进水
HL1 := TRUE;
HL2 := FALSE;
MotorForward := FALSE;
MotorReverse := FALSE;
DrainPump := FALSE;
IF WaterLevel < WaterHighLevel THEN
WaterLevel := WaterLevel + 1;
IF WaterLevel = WaterHighLevel THEN
State := STATE_WASH_FORWARD;
StartTime := T#0s;
END_IF
END_IF
STATE_WASH_FORWARD:
// 洗涤正转
HL1 := TRUE;
HL2 := FALSE;
IF NOT Pause THEN
MotorForward := TRUE;
MotorReverse := FALSE;
END_IF
DrainPump := FALSE;
IF StartTime >= WashDuration THEN
WashCycle := WashCycle + 1;
IF WashCycle >= MaxWashCycle THEN
WashCycle := 0;
State := STATE_DRAIN_WATER;
StartTime := T#0s;
ELSE
State := STATE_PAUSE_1;
StartTime := T#0s;
END_IF
END_IF
STATE_PAUSE_1:
// 暂停1
HL1 := FALSE;
HL2 := FALSE;
MotorForward := FALSE;
MotorReverse := FALSE;
DrainPump := FALSE;
IF NOT Pause THEN
IF StartTime >= PauseDuration THEN
State := STATE_WASH_REVERSE;
StartTime := T#0s;
END_IF
END_IF
STATE_WASH_REVERSE:
// 洗涤反转
HL1 := TRUE;
HL2 := FALSE;
IF NOT Pause THEN
MotorForward := FALSE;
MotorReverse := TRUE;
END_IF
DrainPump := FALSE;
IF StartTime >= WashDuration THEN
WashCycle := WashCycle + 1;
IF WashCycle >= MaxWashCycle THEN
WashCycle := 0;
State := STATE_DRAIN_WATER;
StartTime := T#0s;
ELSE
State := STATE_PAUSE_2;
StartTime := T#0s;
END_IF
END_IF
STATE_PAUSE_2:
// 暂停2
HL1 := FALSE;
HL2 := FALSE;
MotorForward := FALSE;
MotorReverse := FALSE;
DrainPump := FALSE;
IF NOT Pause THEN
IF StartTime >= PauseDuration THEN
State := STATE_WASH_FORWARD;
StartTime := T#0s;
END_IF
END_IF
STATE_DRAIN_WATER:
// 排水
HL1 := NOT HL1;
HL2 := FALSE;
MotorForward := FALSE;
MotorReverse := FALSE;
IF WaterLevel > WaterLowLevel THEN
WaterLevel := WaterLevel - 1;
IF WaterLevel = WaterLowLevel THEN
DrainPump := TRUE;
IF StartTime >= DrainDuration THEN
LargeCycle := LargeCycle + 1;
IF LargeCycle >= MaxLargeCycle THEN
State := STATE_ALARM;
StartTime := T#0s;
ELSE
State := STATE_SPIN;
StartTime := T#0s;
END_IF
END_IF
END_IF
END_IF
STATE_SPIN:
// 脱水
HL1 := NOT HL1;
HL2 := FALSE;
IF NOT Pause THEN
MotorForward := TRUE;
MotorReverse := FALSE;
END_IF
DrainPump := TRUE;
IF StartTime >= DrainDuration THEN
State := STATE_DRAIN_WATER;
StartTime := T#0s;
END_IF
STATE_ALARM:
// 报警
HL1 := NOT HL1;
HL2 := NOT HL2;
MotorForward := FALSE;
MotorReverse := FALSE;
DrainPump := FALSE;
IF StartTime >= MaxTime THEN
State := STATE_STOP;
StartTime := T#0s;
END_IF
STATE_STOP:
// 停止
HL1 := FALSE;
HL2 := FALSE;
MotorForward := FALSE;
MotorReverse := FALSE;
DrainPump := FALSE;
IF NOT StartBtn THEN
State := STATE_INIT;
END_IF
END_CASE
// 暂停按钮处理
IF PauseBtn THEN
Pause := NOT Pause;
END_IF
END_FUNCTION_BLOCK
程序中使用了一个状态机来控制洗衣机的运行过程,同时定义了一系列状态和常量来方便代码的编写。每个状态都对应着洗衣机运行过程中的一个操作,通过计时器和计数器来控制状态的切换和循环。同时还考虑了暂停按钮的处理以及报警闪烁的最大时间限制等细节问题。该程序应能够实现根据要求自动控制工业洗衣机的运行。 上述程序的时间计时是如何控制的,编写详细的程序 天道酬勤2023 发表于 2023-04-27 15:05
上述程序的时间计时是如何控制的,编写详细的程序 ...
在PLC编写程序时,可以使用定时器和计数器来实现时间计时的功能。具体实现方法如下:
首先定义需要使用到的变量:
VAR_TEMP
// 定义定时器和计数器
Timer_Washing: TON; // 洗涤循环定时器
Timer_Draining: TON; // 排水定时器
Counter_Loop: CTU := (pv:=3); // 大循环计数器,计数值为3
END_VAR
接下来,进行程序的编写。在程序中,需要对启动按钮、暂停按钮等按钮状态进行检测,并根据状态进行相应操作。
洗涤过程的程序如下:
// 如果启动按钮被按下,开始运行程序
IF StartBtn THEN
// 如果计时器未启动,启动计时器
IF NOT Timer_Washing.IN THEN
// 设定定时器预设时间为14秒
Timer_Washing(IN:=TRUE, PT:=T#14S);
END_IF
// 判断水位是否到达高水位
IF LS1 THEN
// 如果水位到达,停止进水
// 并开始变频器控制电机正转35Hz运转
HL1 := TRUE;
Motor_Run(Fwd:=TRUE, Freq:=35);
// 定时器启动后开始计时
IF Timer_Washing.Q THEN
// 启动暂停按钮
IF PauseBtn THEN
// 如果暂停按钮按下,停止计时器
Timer_Washing(IN:=FALSE);
END_IF
// 到达预设时间后暂停2秒,然后反转35Hz运转
IF Timer_Washing.Q THEN
Motor_Run(Fwd:=FALSE, Freq:=35);
Timer_Washing(IN:=TRUE, PT:=T#2S);
// 如果计时器计满一次,就执行Counter_Loop计数器加1操作
IF Timer_Washing.Q THEN
Counter_Loop(CU:=TRUE);
END_IF
END_IF
END_IF
END_IF
// 如果大循环计数器计满3次,开始进行排水和脱水过程
IF Counter_Loop.Q THEN
// 停止电机和洗涤指示灯
Motor_Stop();
HL1 := FALSE;
// 排水时间为10秒,并且倒计时指示灯闪烁表示
HL1 := NOT TL0s10.Q;
Timer_Draining(IN:=TL0s10.Q);
// 判断水位是否降到低水位,开始脱水
IF NOT LS2 THEN
// 变频器控制电机正转50Hz运转
Motor_Run(Fwd:=TRUE, Freq:=50);
// 定时器启动后开始计时
IF Timer_Draining.Q THEN
// 启动暂停按钮
IF PauseBtn THEN
// 如果暂停按钮按下,停止计时器
Timer_Draining(IN:=FALSE);
END_IF
// 等待5秒后完成一次脱水
IF Timer_Draining.Q THEN
// 如果计时器计满一次,就执行Counter_Loop计数器减1操作
Counter_Loop(CD:=TRUE);
END_IF
END_IF
END_IF
END_IF
// 如果大循环计数器计满3次,全过程结束,触发报警灯
IF Counter_Loop.CQ THEN
HL2 := TRUE;
END_IF
ELSE
// 如果启动按钮未按下,停止电机和计时器
Motor_Stop();
Timer_Washing(IN:=FALSE);
Timer_Draining(IN:=FALSE);
END_IF
暂停/继续过程的程序如下:
// 如果暂停按钮被按下,暂停当前定时器
IF PauseBtn THEN
Timer_Washing(IN:=FALSE);
Timer_Draining(IN:=FALSE);
Motor_Stop();
ELSE
// 如果暂停按钮未被按下,继续当前定时器
IF Timer_Washing.IN THEN
Timer_Washing(IN:=TRUE);
END_IF
IF Timer_Draining.IN THEN
Timer_Draining(IN:=TRUE);
END_IF
END_IF
完整的程序如下: 上述程序中的子程序,
Motor_Stop();
Motor_Run(Fwd:=TRUE, Freq:=50);
进行详细程序编写 天道酬勤2023 发表于 2023-04-27 15:15
上述程序中的子程序,
Motor_Stop();
Motor_Run(Fwd:= ...
可以在程序中定义Motor_Stop()和Motor_Run()两个函数块来控制电机的启停及运行方向和频率。具体实现代码如下:FUNCTION_BLOCK FB_Motor_ControlTITLE = "Motor Control"VAR_INPUT Fwd : BOOL; // 电机正转/反转标志位 Freq : INT; // 电机频率END_VARVAR_OUTPUT Run : BOOL; // 电机运行状态 Stop : BOOL; // 电机停止状态END_VARVAR_INPUT_OUTPUT InOverload : BOOL; // 过载保护信号 OutOverload : BOOL; // 输出过载保护信号END_VARDATA // 定义常量 const MaxFreq : INT := 50; // 最大频率值END_DATATIMER TON1(IN:=FALSE, PT:=T#10S, Q=>Stop); // 定时器1,用于软件停止DELAY D1(IN:=Run, PT:=T#150MS); // 延时D1,控制电机启停DELAY D2(IN:=Run, PT:=T#1000MS); // 延时D2,控制电机正反转END_VARIF Fwd THEN // 电机正转 Motor_Start(HighFreq:=Freq, LowFreq:=Freq, HighTime:=T#1S, LowTime:=T#1S, AccTime:=T#1S, DecTime:=T#1S);ELSE // 电机反转 Motor_Start(HighFreq:=0, LowFreq:=Freq, HighTime:=T#0S, LowTime:=T#1S, AccTime:=T#1S, DecTime:=T#1S);ENDIFTimer_TON1(IN:=NOT InOverload AND NOT Stop, Q=>OutOverload);Delay_D1(IN:=NOT InOverload AND Run AND NOT Stop, PT:=T#150MS);Delay_D2(IN:=NOT InOverload AND Run AND NOT Stop, PT:=T#1000MS);IF Stop THEN // 停止电机 Motor_Stop(AccTime:=T#1S, DecTime:=T#1S);ELSE // 启动电机 Motor_Run(HighFreq:=MaxFreq, LowFreq:=Freq, HighTime:=T#1S, LowTime:=T#1S, AccTime:=T#1S, DecTime:=T#1S);ENDIF其编程思路为:根据输入的Fwd标志位判断电机正转/反转,根据输入的频率值Freq控制电机运行的频率。同时,根据定时器和延时器的控制,实现电机的启停及正反转功能。过载保护信号InOverload由外部输入,输出过载保护信号OutOverload用定时器TON1实现,延时D1和D2用于控制Motor_Run和Motor_Stop的运行时间。 请将上述程序转换为博图的SCL语言进行编写
天道酬勤2023 发表于 2023-04-27 15:17
请将上述程序转换为博图的SCL语言进行编写 ...
程序如下:FUNCTION_BLOCK FB_WashingMachine_ControlTITLE = 'Washing Machine Control';VAR_INPUT StartBtn : BOOL; // 启动按钮 PauseBtn : BOOL; // 暂停/继续按钮END_VARVAR_OUTPUT HL1 : BOOL; // 指示灯,表示当前是否有水 HL2 : BO
页:
[1]