用PLC改造洗衣机:状态机与参数化实现四重洗涤模式
2026/9/10 13:33:35 网站建设 项目流程

1. 为什么我会用PLC去改一台洗衣机

先说个背景。家里那台波轮洗衣机服役八年,最近电脑板开始抽风:时能启动时不能启动,偶尔洗到一半就罢工。维修师傅上门看了一眼,报价换板子六百多,上门费另算。我当时第一反应不是贵不贵,而是那台洗衣机的"大脑"——一块被胶封死的单片机板,修都没法修,只能整块换。关键在于,这种电脑板对你完全是个黑盒:进水多久、正反转怎么交替、脱水怎么判断衣服分布,厂家预设的逻辑你根本动不了。

恰好手里一直有一套西门子S7-1200 PLC和一台三菱FX3U闲置着。我当时就冒出一个念头:既然PLC最擅长的就是按时序控制电机、阀门和传感器,洗衣机本质上不就是一套典型的顺序控制设备吗?进水、洗涤、排水、脱水,每个环节都是"传感器反馈 → 逻辑判断 → 驱动执行器"的闭环。把一套PLC接到洗衣机上,完全可行。

这个项目做完后我最大的体会是:洗衣服这个日常动作,拆开看就是一组可编程的时序状态机,而四重洗涤模式,本质上是四组不同的时间和动作参数组合。你不需要改硬件,只需要改代码里的参数表,就能让同一台机器跑出完全不同的洗涤策略。这比原厂电脑板灵活太多。

所以这篇文章不是"用PLC复刻一个洗衣机控制器",而是带你走一遍完整思路:需求怎么拆解、硬件怎么规划、状态机怎么写、四重模式怎么用一套代码优雅切换、虚拟机里怎么调试。适合正在学PLC编程但缺一个完整实战项目的朋友,也适合想做设备改造又不想从零开始做控制逻辑的工程师。

2. 四重洗涤模式拆解:标准、轻柔、强力、快洗到底在切换什么

很多人一听到"四种模式"就以为要写四套程序。这是最大的误区。洗衣机所谓的不同模式,动的并不是程序框架,而是几个关键参数。把这一点想透,整台设备的控制逻辑就清晰了。

2.1 四种模式的本质是参数矩阵

我先把这四种模式的差异列出来,你感受一下:

模式目标水位洗涤时间电机节奏漂洗次数脱水时间
标准洗中水位8分钟正转10s/停2s/反转10s2次3分钟
轻柔洗低水位4分钟正转5s/停5s/反转5s1次1分钟
强力洗高水位12分钟正转15s/停2s/反转15s3次5分钟
快洗中低水位3分钟正转8s/停2s/反转8s1次2分钟

看到没有?四种模式的骨架完全一样,都是"进水—洗涤—排水—脱水—漂洗循环—最终脱水—结束",变的只是每个阶段的时长、循环次数和电机转动节奏。这就意味着你只需要写一套状态机,把可变的部分做成参数,模式切换就是加载不同参数组的事。

2.2 为什么模式参数不能写死

早期我确实干过蠢事:每个模式单独建一个子程序,复制粘贴改几行定时器预设值。程序量直接翻四倍,改一个细节得同步改四处,调试的时候手忙脚乱。后来做设备改造项目时接触到结构化编程的思路才明白,一个优秀程序应该做到"数据与逻辑分离"——逻辑只处理"当前处于什么状态、该执行什么动作",至于这个状态该维持多久、水位到什么位置,交给参数去决定。

这样做的实际好处有三点:第一,以后想加第五种模式,不需要动逻辑代码,只需新增一组参数;第二,现场调试改参数时不会误伤其他逻辑;第三,程序整体短,排查故障容易得多。我自己后来维修这台改造洗衣机时,基本都是看参数表而不是翻梯形图。

2.3 电机节奏里藏着的护衣逻辑

有一点需要注意:洗涤时的正反转不是简单地"正转一会儿,反转一会儿",中间必须加停止时间。原因有两层。

从机械层面说,电机带着衣物和水突然换向,冲击力很大,长期这样会加速离合器磨损。从控制层面说,如果正转接触器和反转接触器之间没有间隔,切换瞬间可能造成瞬间短路——PLC输出点的晶体管或继电器触点切换速度远快于接触器机械动作,一旦接触器还没完全断开另一个已经吸合,就是严重的设备事故。

所以我在模式参数里专门设计了"换向停止时间"这个字段。轻柔洗设5秒,标准洗设2秒,强力洗也设2秒。这个时间放在实战里不是可有可无的小细节,而是涉及设备安全的核心保护逻辑。

3. 硬件接线与I/O规划:先让PLC"摸得到"洗衣机

程序写得再好,硬件接不对全部白搭。洗衣机改造和纯逻辑仿真最大的区别就在于:你面对的是220V强电、交流电机、电磁阀,还有水位传感器、门磁开关这些信号源。规划好输入输出点是第一步,也是最容易出问题的一步。

3.1 I/O点分配表

我选的方案是用中间继电器做隔离,PLC不直接驱动220V负载,所有强电回路都走继电器触点。这样做的好处是保护PLC输出点,后者一旦被感性负载的反向电动势打穿,维修成本远高于几个继电器。

类型地址信号说明实际接法
输入I0.0启动按钮常开触点,并联启动指示灯
输入I0.1停止按钮常闭触点,急停逻辑
输入I0.2门盖安全开关常开,盖好才闭合
输入I0.3高水位开关浮子式水位开关
输入I0.4低水位开关浮子式水位开关
输入I0.5模式选择旋钮4档旋转开关,对应四组参数
输出Q0.0进水电磁阀经继电器控制220V进水阀
输出Q0.1排水电磁阀经继电器控制220V排水阀
输出Q0.2电机正转接触器驱动洗衣机电机正转
输出Q0.3电机反转接触器驱动洗衣机电机反转
输出Q0.4蜂鸣器洗涤结束后提示
输出Q0.5运行指示灯状态指示

这里我重点提醒两个坑。

第一个是水位开关。很多滚筒或波轮洗衣机用的是气压式水位开关,接出来是三根线——一根公共端,一根高水位触发,一根低水位触发。改造前最好用万用表量一遍,确认常开还是常闭,以及水位变化时通断状态如何切换。我改造时就用万用表对着水位开关在不同的吹气压力下测通断,才确定了对应逻辑。

第二个是模式选择旋钮。如果你用的是洗衣机原装的旋转开关,它可能是个多刀多掷开关,不同档位会同时切换好几组触点。而PLC输入点有限,不可能一个档位接一个输入点。实际做法是利用电阻分压加模拟量输入,或者干脆用二进制编码:三组触点组合出四个档位。我图省事,直接用了三个输入点接旋钮的三组独立触点,编码分别为001标准洗、010轻柔洗、011强力洗、100快洗。

3.2 强电侧的继电器选型

继电器选型是个看似不起眼但很关键的环节。洗衣机电机功率大约200W到400W,启动电流可能达到正常运行电流的5到7倍。我实测过一台普通波轮洗衣机,电机启动瞬间电流能到6A左右。所以中间继电器不能选那种只有1A触点容量的信号继电器,至少要用触点容量10A的功率继电器,最好是带底座的插拔式继电器,方便坏了直接换。

另外接触器选型时,线圈电压要和你继电器配合好。我用的继电器线圈是DC24V,PLC输出也是DC24V,直接驱动正好。交流接触器线圈则选AC220V,由继电器的常开触点控制。整个链路是:PLC输出 → 中间继电器线圈 → 中间继电器触点 → 接触器线圈 → 接触器主触点 → 电机。

接线时特别注意:电机正转和反转接触器的主触点在电气上必须互锁,也就是正转接触器的常闭辅助触点串联在反转接触器的线圈回路里,反之亦然。PLC程序里的互锁只是逻辑层面的第一道保险,硬件接触器互锁是第二道,两者缺一不可。

4. 一套状态机打天下:程序结构的设计思路

这是整个项目的核心。四重洗涤模式要"一套代码"搞定,就不能用传统的顺序功能图一个状态写死一组梯形图,而要把状态和参数剥离开。

4.1 用状态机而不是顺序控制

初学者最爱用M继电器的置位复位做顺序控制:M0是进水、M1是洗涤、M2是排水……每个M对应一段固定的程序。这种写法在简单流程里很好用,但一旦要支持四种模式,你会发现每种模式下各阶段的持续时间不同、漂洗次数不同,M继电器逻辑会被参数判断塞满,程序立刻膨胀。

状态机写法的核心是:用一个整数变量记录当前状态,用CASE指令(SCL里)或比较跳转指令(梯形图里)按状态值分发逻辑。每个状态处理三件事:进入时的动作、执行中的条件判断、退出的条件。

我把洗涤流程拆成了9个状态:

状态值状态名称进入时动作退出条件
0待机所有输出复位按下启动且门盖闭合
1进水开进水阀达到该模式目标水位
2洗涤电机按节奏正反转洗涤时间到
3排水开排水阀低水位开关断开且排水延时到
4脱水电机高速正转脱水时间到
5进水漂洗开进水阀达到目标水位
6漂洗电机按节奏正反转漂洗时间到
7排水漂洗开排水阀低水位开关断开且排水延时到
8完成蜂鸣器鸣叫3秒手动按停止复位

状态0和状态8是首尾;状态1到状态4是主洗流程;状态5到状态7是漂洗循环,循环次数由模式参数决定。整个状态机的精华在状态4到状态5的跳转判断里——脱水完成后,如果当前漂洗次数小于目标次数,状态回到5开始下一轮漂洗;如果已经完成了,状态跳到8结束。

4.2 参数数据结构化:UDT的妙用

为了实现"逻辑不动、参数可换",我在博途里定义了一个UDT(用户自定义数据类型),用来描述一种洗涤模式的全部特征:

TYPE WashMode : STRUCT waterLevel : INT; // 0=低水位, 1=中水位, 2=高水位 washTimeSec : INT; // 主洗时间(秒) rinseCycles : INT; // 漂洗次数 spinTimeSec : INT; // 最终脱水时间(秒) fwdTimeMs : INT; // 正转时间(毫秒) stopTimeMs : INT; // 换向停止时间(毫秒) revTimeMs : INT; // 反转时间(毫秒) END_STRUCT END_TYPE

然后在全局数据块里建一个长度为4的WashMode数组,下标0到3分别对应四种模式:

VAR GLOBAL gWashModes : ARRAY[0..3] OF WashMode := [ (waterLevel:=1, washTimeSec:=480, rinseCycles:=2, spinTimeSec:=180, fwdTimeMs:=10000, stopTimeMs:=2000, revTimeMs:=10000), // 标准洗 (waterLevel:=0, washTimeSec:=240, rinseCycles:=1, spinTimeSec:=60, fwdTimeMs:=5000, stopTimeMs:=5000, revTimeMs:=5000), // 轻柔洗 (waterLevel:=2, washTimeSec:=720, rinseCycles:=3, spinTimeSec:=300, fwdTimeMs:=15000, stopTimeMs:=2000, revTimeMs:=15000), // 强力洗 (waterLevel:=1, washTimeSec:=180, rinseCycles:=1, spinTimeSec:=120, fwdTimeMs:=8000, stopTimeMs:=2000, revTimeMs:=8000) // 快洗 ]; END_VAR

这下四种模式的差异被压缩进了这一小块数据定义里。主逻辑不需要知道自己在跑什么模式,只需要根据当前模式索引去读取对应的参数,执行统一的状态机流程。这就是"一套代码玩转四重模式"的底层原理。

4.3 主程序流程:SCL做状态机,梯形图做互锁

我最终采用的是SCL和梯形图混编的方案。状态机的状态转换逻辑用SCL写,因为CASE语句在状态分发上比梯形图跳转指令高效得多,代码可读性也强。电机正反转互锁、接触器驱动、手自动切换这些偏底层的逻辑用梯形图写,便于现场电工维护。

原因很简单:状态机的流转逻辑属于"面向逻辑"的代码,适合用结构化文本表达;而电机驱动和互锁属于"面向硬件"的电路控制,梯形图最直观,也最符合电气维修人员的读图习惯。很多工程师只擅长一种语言就一条道走到黑,实际上不同语言各有适用场景,混编才是工业项目的常态。

5. 核心代码实现:状态机与模式切换实例

这一节直接上实操代码。我用西门子博途的SCL写状态机主体,但思路同样适用于三菱GX Works、汇川、台达等品牌——它们都有类似的结构化文本或位置控制指令,翻译过去就行。

5.1 SCL状态机主体代码

状态机部分我放在一个FB块里,输入是启动、停止、传感器状态和模式索引,输出是各路执行器控制信号。核心结构如下:

FUNCTION_BLOCK FB_WashMachine VAR_INPUT startBtn : BOOL; // 启动按钮 stopBtn : BOOL; // 停止按钮 doorClosed : BOOL; // 门盖闭合检测 highLevel : BOOL; // 高水位开关 lowLevel : BOOL; // 低水位开关 modeIndex : INT; // 当前模式索引 0~3 END_VAR VAR_OUTPUT inletValve : BOOL; // 进水阀 drainValve : BOOL; // 排水阀 motorFwd : BOOL; // 电机正转 motorRev : BOOL; // 电机反转 buzzer : BOOL; // 蜂鸣器 END_VAR VAR state : INT := 0; // 状态机当前状态 cycleCount : INT := 0; // 已完成漂洗次数 tonMain : TON; // 主定时器 motorSeqTimer : TON; // 电机节奏定时器 motorPhase : INT := 0; // 电机当前相位:0停 1正转 2反转 modeParams : WashMode; // 当前加载的模式参数 drainDelayTimer : TON; // 排水延时定时器 END_VAR

状态转换部分,我简化核心逻辑如下:

// 模式参数加载 modeParams := gWashModes[modeIndex]; // 模式参数加载,启动时锁定,防止运行中切换 IF startBtn AND state = 0 AND doorClosed THEN state := 1; // 进入进水 cycleCount := 0; END_IF; // 停止按钮或门盖打开则复位 IF stopBtn OR NOT doorClosed THEN state := 0; inletValve := FALSE; drainValve := FALSE; motorFwd := FALSE; motorRev := FALSE; buzzer := FALSE; tonMain.IN := FALSE; tonMain.R := TRUE; END_IF; CASE state OF 0: // 待机,只有按下启动门盖闭合才启动 inletValve := FALSE; drainValve := FALSE; motorFwd := FALSE; motorRev := FALSE; 1: // 进水 inletValve := TRUE; // 达到目标水位就停止进水 IF (modeParams.waterLevel = 0 AND lowLevel) OR (modeParams.waterLevel = 1 AND highLevel) OR (modeParams.waterLevel = 2 AND highLevel) THEN inletValve := FALSE; state := 2; // 进入洗涤 tonMain.IN := TRUE; tonMain.PT := INT_TO_TIME(modeParams.washTimeSec * 1000); END_IF; 2: // 洗涤 tonMain.IN := TRUE; // 调用电机节奏子程序 runMotorSequence(modeParams.fwdTimeMs, modeParams.stopTimeMs, modeParams.revTimeMs); IF tonMain.Q THEN tonMain.IN := FALSE; state := 3; // 洗涤结束,进入排水 END_IF; 3: // 排水 drainValve := TRUE; // 低水位开关断开 + 延时30秒,确保排空 IF NOT lowLevel THEN drainDelayTimer.IN := TRUE; drainDelayTimer.PT := T#30S; IF drainDelayTimer.Q THEN drainValve := FALSE; drainDelayTimer.IN := FALSE; state := 4; // 进入脱水 tonMain.IN := TRUE; tonMain.PT := INT_TO_TIME(modeParams.spinTimeSec * 1000); motorPhase := 1; // 脱水时强制正转高速 END_IF; ELSE drainDelayTimer.IN := FALSE; END_IF; 4: // 脱水 motorFwd := TRUE; // 脱水时电机始终正转 IF tonMain.Q THEN tonMain.IN := FALSE; motorFwd := FALSE; // 判断漂洗是否完成 cycleCount := cycleCount + 1; IF cycleCount < modeParams.rinseCycles THEN state := 5; // 还有漂洗轮次,进入进水漂洗 ELSE state := 8; // 全部完成 END_IF; END_IF; 5: // 进水漂洗 inletValve := TRUE; IF highLevel THEN inletValve := FALSE; state := 6; tonMain.IN := TRUE; tonMain.PT := T#3M; // 漂洗默认3分钟 END_IF; 6: // 漂洗 tonMain.IN := TRUE; runMotorSequence(modeParams.fwdTimeMs, modeParams.stopTimeMs, modeParams.revTimeMs); IF tonMain.Q THEN tonMain.IN := FALSE; state := 7; // 进入排水漂洗 END_IF; 7: // 排水漂洗 drainValve := TRUE; IF NOT lowLevel THEN drainDelayTimer.IN := TRUE; drainDelayTimer.PT := T#30S; IF drainDelayTimer.Q THEN drainValve := FALSE; drainDelayTimer.IN := FALSE; state := 4; // 再次脱水 tonMain.IN := TRUE; tonMain.PT := INT_TO_TIME(modeParams.spinTimeSec * 1000); motorPhase := 1; END_IF; ELSE drainDelayTimer.IN := FALSE; END_IF; 8: // 完成 buzzer := TRUE; // 蜂鸣器响3秒后自动停,或按下停止键复位 tonMain.IN := TRUE; tonMain.PT := T#3S; IF tonMain.Q THEN buzzer := FALSE; state := 0; END_IF; END_CASE;

5.2 电机节奏子程序:正反转互锁与暂停

电机节奏的逻辑单独封装成一个子程序,好处是整个状态机里不用反复写电机控制细节。核心是用一个小的内部定时器,在正转、停止、反转三个相位间循环切换:

FUNCTION runMotorSequence : BOOL VAR_INPUT fwdTimeMs : INT; stopTimeMs : INT; revTimeMs : INT; END_VAR VAR_OUTPUT motorFwd : BOOL; motorRev : BOOL; END_VAR CASE motorPhase OF 0: // 停止相位 motorFwd := FALSE; motorRev := FALSE; motorSeqTimer.IN := TRUE; motorSeqTimer.PT := INT_TO_TIME(stopTimeMs); IF motorSeqTimer.Q THEN motorSeqTimer.IN := FALSE; motorPhase := 1; END_IF; 1: // 正转相位 motorFwd := TRUE; motorRev := FALSE; motorSeqTimer.IN := TRUE; motorSeqTimer.PT := INT_TO_TIME(fwdTimeMs); IF motorSeqTimer.Q THEN motorSeqTimer.IN := FALSE; motorPhase := 0; // 先回停止相位再切反转 END_IF; 2: // 反转相位 motorFwd := FALSE; motorRev := TRUE; motorSeqTimer.IN := TRUE; motorSeqTimer.PT := INT_TO_TIME(revTimeMs); IF motorSeqTimer.Q THEN motorSeqTimer.IN := FALSE; motorPhase := 0; END_IF; END_CASE;

注意我是从正转相位退出后先回到停止相位,再在下一个扫描周期进入反转相位。这样即使PLC程序层面的互锁失效,至少时间上隔了一个相位周期,给了接触器充分的机械释放时间。这个设计思路在所有电机正反转场景里都适用。

5.3 梯形图互锁与输出驱动

SCL写状态机,梯形图写输出驱动。在梯形图里,我对Q0.2和Q0.3做双重重保护:

第一个网络是软件互锁:

Q0.2(正转输出) ---|/|--- Q0.3(反转输出) Q0.3(反转输出) ---|/|--- Q0.2(正转输出)

第二个网络是通过辅助继电器把SCL里的motorFwd和motorRev信号汇集到实际输出,同时加入急停停止按钮的常闭触点。这样无论程序状态机怎么走,只要停止按钮被拍下,电机输出必然被切断。

如果你用的是三菱FX系列,思路完全一样——状态机可以用ST程序写,输出驱动放到梯形图里,用SET/RST配合互锁触点。不同品牌PLC的语言差异不会改变控制逻辑的本质。

6. VMware虚拟调试要点:网络模式选对,仿真才不坑

这个项目我并没有一开始就接真实洗衣机,而是在博途里完成程序后,用PLCSIM做了软件仿真,然后在VMware虚拟机里跑了整机虚拟验证,最后才动硬件。这里要专门说一下虚拟机连PLC的问题,因为很多人在这一步卡住。

6.1 虚拟机网络连接模式选择

VMware给虚拟机提供了三种常用网络模式:桥接模式、NAT模式、仅主机模式。和PLC仿真通信相关的核心原则是:虚拟机必须能和宿主机处于同一局域网,且能收发广播包。

桥接模式是最佳选择。在桥接模式下,虚拟机网卡直接连接物理网络,虚拟机和真实PLC、真实电脑都处在同一网段,博途的在线访问功能可以正常扫描到设备IP。NAT模式本质是虚拟机背后有一台虚拟路由器做地址转换,虚拟机能访问外网,但外部设备主动访问虚拟机、或者收到虚拟机发出的广播帧都异常缓慢甚至丢失,这会导致博途"可访问的设备"列表里扫不到S7-1200。仅主机模式就更不用提了,它只能和宿主机通信,连PLC的物理网段都进不去。

具体操作上,VMware里选中虚拟机 → 编辑设置 → 网络适配器 → 选择桥接模式,并在"复制物理网络连接状态"前打勾。虚拟机里的系统(我用的Windows 10专业版)网络IP要手动设置成和PLC同一网段,比如PLC的IP是192.168.10.1,虚拟机就设192.168.10.50。宿主机也设同一个网段。只要三者同段,博途基本稳定在线。

6.2 仿真验证中的几个实用技巧

首先,博途的PLCSIM在连接虚拟机里的TIA时要注意:PLCSIM是一个独立的仿真进程,不依赖网卡,所以虚拟机网络模式对PLCSIM本身的连接影响不大。真正依赖网络的是你从虚拟机里访问真实PLC——如果你手里有实体S7-1200,想在虚拟机里下载程序,那桥接模式就是必须的。

其次,在没有真实PLC的情况下,你可以用S7-PLCSIM和WinCC Runtime一起跑模拟。步骤是:先在TIA里启动仿真,下载完程序后在虚拟机里打开WinCC运行系统,画面上的按钮对应PLC输入,灯对应PLC输出。这样整个洗衣机的控制逻辑和HMI交互全部都能在虚拟机里闭环验证,不需要碰任何硬件。

我实际验证中发现一个比较隐蔽的问题:PLCSIM仿真时,I0.0到I0.5这些数字量输入默认是0,你需要在仿真界面上手动强制为1来模拟按钮按下、门盖闭合、水位开关动作。很多人仿真跑不起来以为程序错了,其实是没强制输入点。另一个坑是TON定时器在仿真里跑得很快(PLCSIM有个"减少扫描周期"的选项默认开启,定时器时间会加速),我一开始以为代码有问题,结果查了半天发现是仿真的时间压缩效应。

7. 从仿真到真机:实测效果与后续扩展

程序在虚拟机里验证通过后,我开始动真机。接线用了大约两个小时,其中一半时间花在确认原机的电机、水位开关、进水阀线的颜色和功能上。第一次上电我先只给PLC供电,把所有输出强制复位,逐个手动强制输出继电器通断,确认每个执行器动作正确后才把程序下载进去跑完整流程。

实测效果符合预期:标准洗从进水到结束约40分钟,和原机逻辑基本一致;轻柔洗明显更安静,电机启停冲击小;强力洗脱水转速高,衣物脱水后明显更干。从用户体验角度,这套改造方案已经完全替代原电脑板了。

几处我实际踩过的坑,在这里重点强调:

水位的判断逻辑必须和实际浮子开关的机械位置配合。我一开始用高水位开关作为"达到目标水位"的信号,结果低水位模式时水还没到高水位就提前进洗涤了。后来给每个模式加了水位档位判断,问题才解决。

排水延时是必要的。光靠低水位开关断开判断排空不可靠,因为波轮洗衣机排水管里残留的水可能让浮子开关抖动。加30秒延时后,脱水前的排水彻底干净,消除了脱水时进水阀带水的异响。

电机正反转的换向停止时间不能设太短。我试过把停止时间改成1秒,洗涤时撞击声马上变大,能明显感觉到离合器受到的冲击。最终恢复为2到5秒,噪音和冲击大幅下降。

后续我打算再做三件事:一是加一个触摸屏HMI,通过MODBUS TCP连接PLC,把运行状态、模式选择、故障报警都可视化;二是用变频器替换原来的机械式电机控制,实现无级调速——这样洗涤转速、脱水转速都可以精确设定,衣服磨损会更小;三是在进水管上加一个流量计,把进水量精确量化,代替水位开关的粗略判断。

最后说点个人体会。这个项目给我的收获远超花钱买一台新洗衣机。它让我更深刻地理解了顺序控制的本质——不管工艺多复杂,最终都可以拆成"状态×参数"的组合。你把状态机写得干净了,参数做成可配置的数据结构,那么以后不管面对什么设备改造,都能快速套用这套方法论。洗衣机的四重模式只是个开始,同样的思路拿来控制注塑机、包装线、小型机械手,只是换了一组输入输出和一套参数表而已。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询