基于mcgs触摸屏的智能洗衣机仿真可以进行洗衣模式的选择切换,同时其工作流程更符合家用洗衣机的...
洗衣机这玩意儿吧,说简单也简单,但真要模拟它的工作流程,特别是用MCGS这种工控屏搞仿真,里头还真有点门道。基于mcgs触摸屏的智能洗衣机仿真可以进行洗衣模式的选择切换,同时其工作流程更符合家用洗衣机的实际工作流程,先进行洗涤,洗涤结束后再排水脱水,待洗涤剂排除干净后再进水进行洗涤流程。基于mcgs触摸屏的智能洗衣机仿真可以进行洗衣模式的选择切换,同时其工作流程更符合家用洗衣机的实际工作流程,先进
基于mcgs触摸屏的智能洗衣机仿真可以进行洗衣模式的选择切换,同时其工作流程更符合家用洗衣机的实际工作流程,先进行洗涤,洗涤结束后再排水脱水,待洗涤剂排除干净后再进水进行洗涤流程
洗衣机这玩意儿吧,说简单也简单,但真要模拟它的工作流程,特别是用MCGS这种工控屏搞仿真,里头还真有点门道。最近在实验室折腾了个智能洗衣机的仿真项目,发现最核心的其实就是状态切换的逻辑——就像你妈在家洗衣服,绝对不可能边脱水边倒洗衣粉对吧?
先看模式切换这块。MCGS的触摸按钮事件处理是关键,比如说这个模式选择按钮组:
Sub btn_mode_click(index)
If gWashingStatus = 0 Then '只有当洗衣机空闲时才能切换模式
gCurrentMode = index
lbl_mode.Caption = "当前模式:" & Choose(index+1, "标准", "快洗", "羊毛")
Beep(100) '滴一声反馈
Else
ShowMessage("工作中无法切换模式!")
End If
End Sub
这段代码有个反直觉的细节:用Choose函数处理索引值的时候,index是从0开始算的,所以得+1才能对应到预设的选项。这个坑我当初调试的时候愣是卡了半小时,最后发现是数组越界导致的界面显示异常。所以说工控编程和普通软件开发还真不太一样,得时刻惦记着硬件索引从0还是1开始。
流程控制才是重头戏。真实的洗衣机流程根本不是简单的定时器堆砌,而是有严格的状态机:
Sub MainProcess()
While True
Select Case gCurrentState
Case STATE_IDLE
If btn_start.Pressed Then
gCurrentState = STATE_FILLING
SetValve(INLET_VALVE, ON)
End If
Case STATE_FILLING
If WaterLevel >= SET_LEVEL Then
SetValve(INLET_VALVE, OFF)
gCurrentState = STATE_WASHING
StartAgitator()
End If
Case STATE_WASHING
If TimerExpired(WASH_TIMER) Then
StopAgitator()
gCurrentState = STATE_DRAINING
SetPump(DRAIN_PUMP, ON)
End If
Case STATE_DRAINING
If WaterLevel <= LOW_LEVEL Then
SetPump(DRAIN_PUMP, OFF)
gCurrentState = STATE_SPIN
StartSpinner(1200) '转速1200rpm
End If
Case STATE_SPIN
If TimerExpired(SPIN_TIMER) Then
StopSpinner()
If NeedRinse() Then '判断是否需要二次漂洗
gCurrentState = STATE_FILLING
Else
gCurrentState = STATE_IDLE
PlayCompleteMelody()
End If
End If
End Select
Sleep(100) '防止CPU跑满
Wend
End Sub
这个状态机有几个有意思的点:首先是脱水结束后自动判断是否需要二次注水漂洗,这个逻辑用了个NeedRinse()函数,其实背后是根据当前洗涤模式决定的。比如羊毛模式可能跳过漂洗直接结束,而标准模式可能要循环两次。
基于mcgs触摸屏的智能洗衣机仿真可以进行洗衣模式的选择切换,同时其工作流程更符合家用洗衣机的实际工作流程,先进行洗涤,洗涤结束后再排水脱水,待洗涤剂排除干净后再进水进行洗涤流程
再就是那个Sleep(100),千万别小看这行代码。最早没加这延时的时候,整个状态机循环跑得飞快,直接把MCGS的CPU占用率干到90%以上,触摸屏反应慢得跟树懒似的。后来加了个100ms的延时,界面立马流畅了——这经验可是用一下午的卡顿换来的。
说到传感器模拟,有个骚操作:直接用进度条控件模拟水位变化。在MCGS里绑定个变量,注水时每200ms增加1%,排水时每秒减5%,配合着阀泵状态,效果意外地真实:
Sub SimulateWaterLevel()
While True
If gInletValveStatus = ON Then
gWaterLevel = Min(gWaterLevel + 1, 100)
ElseIf gDrainPumpStatus = ON Then
gWaterLevel = Max(gWaterLevel - 5, 0)
End If
UpdateProgressBar(prg_water, gWaterLevel)
Sleep(200)
Wend
End Sub
这种伪传感器实现虽然简陋,但胜在调试方便。有次模拟排水故障,故意把减数改成-1,立马能看到水位下降变慢,连带后续脱水流程无法触发——这种可视化调试比看日志直观多了。
最后说个血泪教训:状态切换一定要加互锁!最早版本忘记在脱水过程中禁用开门操作,结果仿真时点开门按钮直接导致程序跑飞。后来加了个全局状态判断:
Sub btn_door_click()
If gCurrentState = STATE_SPIN Then
ShowMessage("脱水时禁止开门!")
Exit Sub
End If
gDoorOpen = Not gDoorOpen
AnimateDoor(gDoorOpen)
End Sub
现在想想,这仿真项目最像真实开发的体验就是:永远有意想不到的边界条件在等着你。就像洗衣机明明流程清晰,真做起来才发现连"暂停后恢复该从哪个阶段继续"这种问题都能让人头大。不过话说回来,当看到虚拟洗衣机按真实流程转起来的时候,那成就感跟小时候拼好乐高似的——可能这就是工控编程的乐趣吧。

更多推荐
所有评论(0)