基于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

现在想想,这仿真项目最像真实开发的体验就是:永远有意想不到的边界条件在等着你。就像洗衣机明明流程清晰,真做起来才发现连"暂停后恢复该从哪个阶段继续"这种问题都能让人头大。不过话说回来,当看到虚拟洗衣机按真实流程转起来的时候,那成就感跟小时候拼好乐高似的——可能这就是工控编程的乐趣吧。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐