做自动化项目这些年,类似“全自动洗衣机控制系统”这种题目看着基础,但真正落地的时候会发现,它把PLC控制里最核心的几件事全串起来了:时序逻辑设计、传感器信号处理、执行机构互锁、上位机组态、串口通信调试。西门子S7-200 PLC加MCGS组态画面的组合,又是工控圈里最经典也最实用的一套搭配,资料多、上手快、成本低,很适合拿来作为控制系统入门的完整案例。
这篇文章把我的完整做法拆开来讲,从硬件选型、I/O分配、程序状态机设计,到MCGS画面组态、PPI通信配置,最后还有驱动文件自定义的思路和联调排错记录。无论你是刚接触PLC的学生,还是想快速搭一套小型控制系统的工程师,按这个思路走一遍,基本能把整个流程吃透。
1. 项目整体设计与方案选型
1.1 先搞清楚洗衣机控制对象的本质
全自动洗衣机控制系统的核心,不是“把衣服洗干净”这个物理过程,而是一个典型的时序逻辑控制问题:进水、洗涤、排水、脱水、漂洗,再排水再脱水,最后蜂鸣提示。每一步动作都有明确的触发条件和结束条件,而且条件之间存在着严格的先后顺序和互斥关系。
举个例子,进水阀打开的充要条件是“处于进水阶段且水位未到高水位”,排水阀打开的充要条件是“处于排水阶段”,而电机正反转则只能在洗涤和脱水阶段工作。这些条件交织在一起,如果用普通继电器电路去搭,线路会非常复杂,改一个时序就要重新接线。用PLC来做,本质就是把这一套逻辑用程序固化下来,改参数只需要改定时器和计数器,改流程只需要调整状态切换条件,灵活性和可维护性完全是两个量级。
整个控制对象可以拆成下面几个部分:
- 输入信号:启动按钮、停止按钮、高水位开关、低水位开关、门开关
- 输出对象:进水电磁阀、排水电磁阀、洗涤电机正转、洗涤电机反转、脱水离合器、蜂鸣器
- 控制核心:S7-200 PLC,负责读入信号、执行逻辑、输出动作
- 人机交互:MCGS组态画面,显示当前工序、水位状态、电机状态,并下发启动停止指令
1.2 为什么选择S7-200加MCGS这套组合
S7-200虽然已经停产多年,但存量设备非常多,很多高校、培训机构和中型设备至今还在用,原因很现实:编程软件STEP 7-Micro/WIN简单易用,指令系统不复杂,相关资料和例程遍地都是,非常适合学习和快速开发。对于洗衣机这种I/O点数不多、控制逻辑中等复杂的项目,S7-200的性能绰绰有余。
MCGS组态软件的优势在于上手门槛低。它不像WinCC那样需要复杂的组态环境配置,也不需要专门的HMI硬件,通用版可以直接跑在PC上,嵌入式版则运行在MCGS触摸屏里。设备驱动库自带主流PLC的驱动,西门子S7-200 PPI驱动是默认就有的,不需要自己写通信协议,选对型号填对参数就能建立起数据通道。
我做方案选型的时候也对比过其他组合,整理了一张表,方便你判断:
| 方案组合 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| S7-200 + MCGS | 成本低、资料多、教学案例丰富、PPI驱动现成 | S7-200停产,新项目不建议选 | 学习、实验、存量设备改造 |
| S7-1200 + WinCC | 性能强、支持以太网、扩展性好 | 成本高、组态复杂度大、学习曲线较陡 | 中大型工业项目 |
| 三菱FX + 昆仑通态 | 日系设备生态、支持Modbus | 部分驱动需要自己配 | 日系PLC为主的生产线 |
| 单片机 + 串口屏 | 成本极低、硬件自由度高 | 开发周期长、可靠性不如PLC | 小批量消费类产品 |
综合下来,做教学和小型项目,S7-200 + MCGS是最舒服的组合,这也就是我最终确定这套方案的原因。
2. 硬件配置与I/O分配
2.1 元器件选型要留好余量
PLC型号选的是CPU 224,自带14个数字量输入和10个数字量输出,这个点数对洗衣机来说足够了,还有富余。有些同学可能会选更便宜的CPU 221,但CPU 221只有6输入4输出,做这个项目会显得比较紧张,而且程序存储区小,后续想扩展功能会很被动。选型的时候一定要给后续留点余量,这是经验。
水位检测用的是浮球式液位开关,分别安装在高水位和低水位位置。浮球式开关原理简单、价格便宜、可靠性高,唯一的缺点是机械结构有惯性,水位波动剧烈时可能会有信号抖动,后面程序里我会加延时滤波来处理。
输出端执行元件包括:
- 进水电磁阀:220V AC供电,PLC输出不能直接驱动,需要通过中间继电器扩展
- 排水电磁阀:同上
- 洗涤电机:单相电容运转电机,正反转通过两个接触器切换
- 脱水离合器:电磁铁驱动,输出信号给接触器或者固态继电器
- 蜂鸣器:24V DC蜂鸣器,PLC输出可以直接驱动,但注意要加续流二极管
2.2 I/O分配表和接线注意事项
下面这是我用的I/O分配表,写程序之前先把这张表定好,后面所有工作都围着它转:
| PLC地址 | 信号名称 | 类型 | 说明 |
|---|---|---|---|
| I0.0 | 启动按钮 | 输入 | 常开,按下启动洗衣流程 |
| I0.1 | 停止按钮 | 输入 | 常开,按下停止当前流程 |
| I0.2 | 高水位开关 | 输入 | 到达高水位时闭合 |
| I0.3 | 低水位开关 | 输入 | 低于低水位时断开 |
| I0.4 | 门开关 | 输入 | 门关好时闭合 |
| Q0.0 | 进水电磁阀 | 输出 | 通过中间继电器驱动 |
| Q0.1 | 排水电磁阀 | 输出 | 通过中间继电器驱动 |
| Q0.2 | 电机正转 | 输出 | 通过接触器驱动 |
| Q0.3 | 电机反转 | 输出 | 通过接触器驱动 |
| Q0.4 | 脱水离合器 | 输出 | 脱水时吸合 |
| Q0.5 | 蜂鸣器 | 输出 | 结束指示 |
接线上有几个坑必须提醒你。第一,电机正反转接触器必须在电气回路里加互锁,也就是正转接触器的线圈回路串入反转接触器的常闭触点,反之亦然,防止两个接触器同时吸合造成短路。第二,PLC程序里也要做软件互锁,双保险。第三,所有感性负载(接触器线圈、电磁阀线圈)必须并联RC吸收回路或续流二极管,不然断电瞬间产生的反电动势很容易干扰PLC运行,严重时直接损坏输出点。
还有一个容易忽略的地方:PLC的输入公共端和输出公共端要分开接,输入用DC 24V传感器电源,感性负载的输出回路单独用AC 220V。混在一起接,轻则信号干扰,重则烧模块。
3. PLC控制程序:把洗衣流程写成状态机
3.1 工序状态划分与状态迁移条件
洗衣机的全自动流程,我把它划分成几个明确的状态,用状态寄存器M来标记。S7-200的位存储器M0.0到M0.7正好可以表示0到7八个状态,我用M0.0表示待机,M0.1表示进水,M0.2表示洗涤,M0.3表示排水,M0.4表示脱水,M0.5表示漂洗进水,M0.6表示漂洗排水,M0.7表示结束。
状态之间的迁移条件都是单一的、明确的:
| 当前状态 | 迁移条件 | 下一状态 |
|---|---|---|
| 待机 | 按下启动按钮且门已关 | 进水 |
| 进水 | 高水位开关动作 | 洗涤 |
| 洗涤 | 洗涤时间到 | 排水 |
| 排水 | 低水位开关断开后延时30秒 | 脱水 |
| 脱水 | 脱水时间到且按设定漂洗次数判断 | 结束 或 漂洗进水 |
| 漂洗进水 | 高水位开关动作 | 洗涤 |
| 漂洗排水 | 低水位开关断开后延时30秒 | 脱水 |
| 结束 | 蜂鸣10秒或按下停止 | 待机 |
为什么要用状态机而不是用简单的时序链条?因为状态机让程序结构变得非常清晰,每一段逻辑只关心“当前状态是什么,迁移条件是否满足”,不会出现一段程序里塞了一堆互锁条件导致逻辑混乱的情况。后期调试的时候,看状态位就知道洗衣机走到哪一步了,问题定位快得多。
3.2 核心程序逻辑与互锁设计
程序用STEP 7-Micro/WIN编写,我习惯用STL指令表来写,因为它跟梯形图可以随时切换,而且用文本方式调试和讲解都比较方便。
启动和状态切换的核心逻辑如下:
// 启动:待机状态下按下启动按钮,且门开关闭合 LD M0.0 A I0.0 A I0.4 S M0.1, 1 R M0.0, 1 // 进水完成:高水位到达,进入洗涤状态 LD M0.1 A I0.2 S M0.2, 1 R M0.1, 1这里面有个关键点:状态切换必须用置位和复位指令,并且旧状态要复位,新状态要置位。很多初学者用输出线圈写状态标志,结果状态位互相覆盖,程序跑起来就是一团乱麻。S和R指令是锁存型的,不用担心扫描周期内状态丢失的问题。
洗涤阶段的正反转交替逻辑是洗衣机程序里最经典的一段。我用两个定时器配合:T37控制正转时间,T38控制停止和反转时间。
// 洗涤状态,正反转循环 LD M0.2 AN T37 = Q0.2 // 正转输出 LD M0.2 TON T37, 80 // 正转8秒 LD M0.2 A T37 AN T38 = Q0.3 // 反转输出 LD M0.2 A T37 TON T38, 80 // 反转8秒注意T37计时到后Q0.2断开,紧接着Q0.3接通,中间没有专门的停止延时。如果希望电机换向有个缓冲,可以在T37和T38之间再加一个2秒的停止定时器,实际设备上更安全,可以减小换向瞬间对机械结构的冲击。
排水和脱水阶段的逻辑稍微复杂一点:
// 排水:洗涤结束或漂洗结束进入排水 LD M0.3 A I0.3 // 低水位开关还闭合,说明水还没排完 = Q0.1 // 排水阀打开 LD M0.3 AN I0.3 // 水位已低于低水位开关 TON T39, 300 // 再延时30秒排干管道余水 LD M0.3 A T39 S M0.4, 1 R M0.3, 1 // 进入脱水 // 脱水输出 LD M0.4 = Q0.1 // 排水阀保持打开 = Q0.4 // 脱水离合器吸合 = Q0.2 // 电机正转高速运行 LD M0.4 TON T40, 3000 // 脱水5分钟脱水时务必保证门开关状态安全,如果程序里检测到门开关断开,必须立即切断脱水输出。实际接线中,门开关可以串接在接触器线圈回路里做硬件急停,程序里再做一层软件判断,双重保护。
3.3 参数设定与计算逻辑
洗衣机的参数很多是工程经验值,没有标准答案,但设定逻辑是有讲究的。
洗涤时间一般设定10到15分钟。判断标准是水温和衣物量,水温低、衣物多,时间要加长。我用了一个可调的数值寄存器VW100存洗涤时间,组态画面上用输入框修改,省去每次改程序重新下载的麻烦。
进水保护时间也很重要。假设进水阀流量是10升每分钟,洗衣机桶容量是50升,那么理论进水时间最多5分钟。我设置了15分钟的上限保护,如果水位开关故障或者水压过低导致进不满水,程序会自动报警并退出进水状态。这个保护逻辑在工业现场叫“超时联锁”,很多事故就是因为缺少超时保护导致设备空转或者溢水。
漂洗次数我用计数器C0实现,设定值取2。洗涤脱水完成后C0加1,如果C0当前值小于设定值,就重新进入漂洗进水状态;等于设定值就进入结束状态。计数器的复位放在启动按钮按下时处理,保证每次启动都是从头开始。
4. MCGS组态画面设计与通信配置
4.1 S7-200与MCGS的PPI通信配置
MCGS和S7-200的通信,最常规的方式是走PPI协议。PPI是西门子的点对点接口协议,基于RS-485物理层,S7-200的Port 0口默认就是PPI协议。MCGS里面自带“西门子S7-200 PPI”设备驱动,不需要自己写通信代码,但配置参数必须和PLC侧完全一致。
通信参数按下面的方式来配:
| 参数项 | PLC侧设置 | MCGS侧设置 |
|---|---|---|
| 协议 | PPI(默认) | 选择“西门子S7-200 PPI”驱动 |
| 波特率 | 9600(默认) | 9600 |
| 数据位 | 8 | 8 |
| 停止位 | 1 | 1 |
| 校验位 | 偶校验 | 偶校验 |
| 站号 | 2 | 2 |
有一个容易忽略的点:S7-200的Port 0默认站号是2,但如果你用USB-PPI编程线连接过电脑,线缆那头会占用一个站号,有时候会冲突。调试的时候先把PLC侧的站号确认清楚,MCGS设备窗口里的设备地址要填PLC站号,不要填成电脑的COM口号。
接线方面,PC上跑MCGS通用版一般用USB转RS-485线缆连接S7-200的Port 0口。注意RS-485是A/B两根线,A接A、B接B,接反了通信肯定不通。MCGS触摸屏则直接通过COM口连接PLC,同样需要确认A/B方向。
4.2 组态画面布局与动画连接
MCGS的画面设计我分成三个层次来做,避免一股脑全堆在主界面上。
主画面是设备运行监控界面,我用绘图工具画了一个简化版的洗衣机剖面。桶体用矩形和椭圆组合,水位动态效果用“填充”构件绑定水位高度,水位开关量变化时填充高度跟着变化。进水阀和排水阀用两个矩形表示,阀门打开时填充颜色从灰色变成绿色,这个用MCGS的“可见度”或者“颜色动画连接”就能实现。电机位置放了一个旋转动画构件,正转时设置顺时针旋转,反转时设置逆时针旋转,这样操作人员看到画面就知道当前洗涤状态。
控制面板画面上放置启动按钮、停止按钮、模式选择下拉框和参数设定输入框。各按钮的数据对象连接到MCGS实时数据库里的开关型变量,而这些变量在设备窗口里又和PLC的M区地址关联。按下启动按钮,MCGS把M0.0对应的位写1,PLC程序检测到M0.0置位后就进入启动逻辑。
当前工序显示我用了一排文字标签,分别写“待机”“进水”“洗涤”“排水”“脱水”“结束”。每个标签的可见度连接对应状态位,哪个状态位置了位,哪个文字就显示出来。这个方法比用一个字符串变量去拼要可靠得多,因为PLC侧不擅长处理字符串,完全靠位状态驱动显示,不会出现乱码或者刷新不及时的问题。
4.3 运行策略与报警记录处理
MCGS运行策略是一个容易被忽略但非常实用的功能。我用循环策略实现了一个周期性的脚本检查,每500毫秒检查一次PLC的报警位。比如进水超时位M1.0置位后,脚本会弹出一个报警提示框,同时把报警事件写入MCGS数据归档文件中。
报警记录在组态工程里要提前建好对应的数据对象,并把“允许报警”属性打开。报警类型、报警值、报警文本都定义好以后,运行环境下有报警产生,MCGS会自动弹出报警窗口,并在报警数据库中做记录。这个功能在实验演示和考核评分中很加分,因为评委能看到完整的报警历史,而不是只有一个画面光秃秃地跳一下。
MCGS的脚本语言是类Basic语法,写起来比较顺手。这里分享一个判断当前工序并记录日志的脚本片段:
IF M0.1 = 1 THEN !LogCurrentStep("进水") ENDIF IF M0.2 = 1 THEN !LogCurrentStep("洗涤") ENDIF这种写法本质上是在MCGS运行环境里做一次变量扫描,每500毫秒执行一次,实时性完全够用。如果要做秒级的精确控制,还是建议在PLC里做,组态脚本只负责显示和辅助逻辑,分工要清晰。
5. MCGS驱动文件的机制与自定义编写思路
5.1 为什么驱动文件是个绕不开的话题
MCGS本身自带了很多主流PLC的驱动,西门子S7-200 PPI驱动就是现成的,直接用。但实际项目中经常遇到两个情况:一是PLC型号比较冷门,MCGS驱动列表里没有对应驱动;二是现有驱动能通信,但访问不了某些特殊寄存器区域,需要自己扩展。比如有些同学手上有一台伟创PLC,MCGS老版本里没找到对应驱动,但又不想换设备,这时候就必须理解MCGS驱动文件的机制,自己动手写。
MCGS的设备驱动本质上是一个动态链接库文件,后缀是DLL,存放在MCGS安装目录的驱动文件夹里。MCGS运行时通过加载这个DLL,与外部设备建立数据通道。设备驱动要完成的事情很纯粹:把MCGS的通道读写请求翻译成目标PLC能理解的报文,然后把PLC返回的数据解析成MCGS能识别的数据。通信协议链路这一层全靠驱动来处理。
理解了这一点,你就能明白为什么类似“光洋K协议”这种专用协议会有单独的驱动文件。光洋PLC的K协议有特定的帧格式和寄存器编号规则,跟Modbus完全不同,MCGS的通用Modbus驱动不可能直接兼容,所以官方或者第三方会提供单独的K协议驱动。装驱动的时候,本质上是让MCGS学会说这种PLC的语言。
5.2 驱动文件编写步骤与接口设计
编写MCGS设备驱动,官方有设备驱动开发包(设备驱动SDK),一般用VC++ 6.0或Visual Studio配合开发。驱动开发包里包含了一套完整的接口定义和设备模板,开发者需要实现的核心接口包括设备打开、设备关闭、设备读取、设备写入和设备校验。
驱动接口的典型设计思路如下。首先是初始化阶段,MCGS调用设备的打开接口,传入串口号、波特率、设备地址等参数,驱动内部建立串口句柄并初始化通信参数。然后是周期性的读写阶段,MCGS运行环境的实时数据库需要刷新数据时,会调用读取接口,驱动把要读取的寄存器地址列表转换成报文字节,通过串口发送给PLC,再在超时时间内等待响应帧并进行解析。写入操作类似,只是方向相反,MCGS把设定值传给驱动,驱动组帧发往PLC。
假定你要为伟创PLC写一个简单的Modbus RTU驱动,读取保持寄存器功能码03的接口逻辑可以简化成下面的伪代码:
int DeviceRead(DEVICE_READ_PARAM *param) { unsigned char sendBuf[8]; unsigned char recvBuf[64]; int len = 0; unsigned short crc = 0; // 构造读保持寄存器请求:地址 + 功能码03 + 起始寄存器 + 寄存器数量 + CRC sendBuf[len++] = param->deviceAddr; sendBuf[len++] = 0x03; sendBuf[len++] = (param->regAddr >> 8) & 0xFF; sendBuf[len++] = param->regAddr & 0xFF; sendBuf[len++] = (param->regCount >> 8) & 0xFF; sendBuf[len++] = param->regCount & 0xFF; crc = GetCRC16(sendBuf, len); sendBuf[len++] = crc & 0xFF; sendBuf[len++] = (crc >> 8) & 0xFF; // 发送请求,等待响应 WriteSerialPort(sendBuf, len); len = ReadSerialPort(recvBuf, sizeof(recvBuf), timeoutMs); // 解析响应,跳过设备地址、功能码、字节数,把寄存器值写入param->data memcpy(param->data, &recvBuf[3], recvBuf[2]); return 0; }这里面有几个细节值得注意。第一,CRC16校验在Modbus协议里是低位字节在前,别搞反,否则通信一直超时。第二,超时时间不宜过长,一般建议50到200毫秒,太长了会影响MCGS的数据刷新周期。第三,串口读写函数要加互斥锁,MCGS可能同时调用读取和写入接口,不加锁会导致串口数据交错,报文全部损坏。
驱动编写完成后,把DLL文件复制到MCGS安装目录的驱动文件夹下,打开MCGS设备窗口,点击“新增设备”,驱动列表中就会出现你新加的驱动名称。选择它,然后设置串口参数和设备地址,再在设备通道里建立寄存器地址映射表,通讯调试通过后,就可以在画面里连接数据对象了。
测试自定义驱动的时候,MCGS调试助手是一个很好用的工具。它可以在不启动整个运行环境的情况下,直接模拟设备通道的读写,向串口发送测试报文,然后观察返回数据。我习惯的流程是:先用串口调试助手直接发报文验证PLC侧的逻辑,确认协议格式没问题后,再在MCGS调试助手里建立相同通道做联调,最后才接入正式组态工程。这一步一步来,出问题了也容易定位是PLC侧还是驱动侧的问题。
6. 联调过程、常见问题与排查技巧
6.1 分步联调流程
整套系统联调的时候,千万不要一上来就把PLC和MCGS全部启动然后祈祷它一次通过,工程上最稳妥的是分步验证。
第一步是PLC单机调试。把PLC切换到RUN状态,先不接电机和电磁阀的动力线,用强制功能直接给Q0.0、Q0.1等输出点置位和复位,观察输出指示灯是否正常亮灭,确认输出点本身没问题是后面一切调试的基础。
第二步是PLC逻辑调试。不连接MCGS,直接使用按钮和水位开关给输入信号,通过STEP 7-Micro/WIN的程序状态监控功能观察M0.x状态位的跳变过程和Q输出的变化。这时候主要验证状态机切换是否正确、定时器时序是否符合预期、正反转是否互锁可靠。
第三步是通信联调。在PC上打开MCGS调试助手,创建S7-200 PPI通道,向PLC发送读取指令,看返回数据是否正常。如果发现通信失败,不要急着去怀疑协议问题,先检查硬件链路:串口号是否正确、RS-485的A/B线是否反了、PLC通信口是否被编程线占用。
第四步才是整机运行。在MCGS运行环境下,用画面按钮下发启动指令,观察整个洗衣流程是否严格按照状态顺序执行。这个阶段主要验证的是画面操作与PLC逻辑之间的联动,以及报警功能是否及时触发。
6.2 典型问题速查与排查思路
联调过程中我整理了一些常见问题和排查思路,做成一个速查表,实际项目中很有参考价值:
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| MCGS画面数据不动 | 串口参数不一致、站号错误、A/B接反 | 先用调试助手单独通信测试 | 统一波特率、校验位、站号 |
| 启动按钮按下无反应 | M区地址映射错误、PLC未进入RUN | 检查设备窗口通道地址与PLC程序地址 | 核对M0.0等变量映射 |
| 水位信号抖动 | 浮球开关老化、线缆过长干扰 | 示波器或万用表测波形、程序加延时滤波 | 程序加20ms延时确认,换屏蔽线 |
| 电机换向时跳闸 | 接触器硬件互锁缺失 | 检查接触器线圈回路 | 增加电气互锁,确保程序互锁可靠 |
| PLC程序下载后丢失 | CPU内部EEPROM故障、编程线干扰 | 重新下载并执行上电初始化 | 检查编程线质量,程序下载后用RUN保持 |
| 组态画面报警不弹出 | 数据对象报警属性没打开 | 检查数据对象属性、报警窗口是否拖入画面 | 启用“允许报警”,在主画面放报警显示构件 |
其中最典型的坑是通信失败。很多人一上来就在MCGS里改驱动参数,但实际是USB转RS-485的驱动没装好,设备管理器里根本没有虚拟COM口。记住一个原则:先物理层,再协议层,最后应用层。物理层通了,再谈协议和驱动。
6.3 我踩过的几个坑
第一个坑是接线上的。第一次做电机正反转控制的时候,我只做了程序互锁,没在接触器线圈回路里加硬件互锁。结果PLC程序因为某些原因瞬间输出异常,正反转接触器同时吸合,车间空开直接跳闸,接触器触点烧黑了一片。从那以后我给自己定了一条死规矩:正反转控制必须电气互锁加程序互锁双保险,绝对不能省。
第二个坑是MCGS变量地址类型对不上。我把PLC里的VW100(字变量)在MCGS里映射成了开关型变量,结果画面数值要么是0要么乱七八糟,数据完全不对。后来才意识到,字变量在MCGS里要用数值型数据对象,位变量(比如M0.1)才对应开关型。这个映射关系在设备通道建立的时候就要想清楚,不然后面排查特别费时间。
第三个坑是排水阶段的水位判断。最初我写的逻辑是排水阀打开后,只要低水位开关断开就立刻进入脱水状态。实际运行时发现低水位开关刚断开的瞬间,桶内余水还在慢慢流,排水管里还有水,直接切脱水会导致脱水时桶内有大量余水,电机负载过大。后来在排水结束条件里加了一个30秒的定时延时,让管道余水排干净再切脱水,问题就解决了。这种细节在书本上看不到,必须在现场试过才知道。
第四个坑是关于MCGS与PLC的通信地址映射。S7-200的V区地址在MCGS里要写成VW100这样的完整格式,同时要注意字节顺序。S7-200默认的是高位字节在前,有些驱动需要数据交换设置,否则你读到的数值高低字节是反的。比如PLC里VW100存的值是0x1234,MCGS里显示出来是0x3412,这种低级错误排查起来非常头疼,所以建议在通信联调阶段,先在PLC里给VW100写一个已知数值,再在MCGS里读出来验证字节序是否正确。
最后再说几句
做这个系统的过程中,我最大的感受是:一个看似简单的洗衣机控制项目,其实把工业控制的核心问题都覆盖了一遍。从状态机设计到通信协议,从画面组态到报警处理,从电气互锁到超时保护,每个环节单独拿出来都可以深入研究。而这些基本功,恰恰是很多自动化工程师在工作两三年后才慢慢补齐的。
如果后续想在这个基础上扩展,有几个方向可以参考:一是把洗涤电机换成变频器,实现无极调速和软启动,对衣物磨损更小;二是增加温度传感器和加热管,做成带热水洗涤功能的控制系统;三是通过MCGS的以太网扩展或者物联网网关,把洗衣机的运行状态远程传到手机端。这些扩展的核心逻辑不变,变的只是传感器和执行器的类型,PLC程序和组态画面的框架是可以直接复用过去的。