先交代一下背景。洗衣机的PLC控制是工控入门阶段非常经典的教学项目,也是实际工程里经常拿来练手的对象。很多朋友学完PLC基础指令之后,最大的困惑是“这些指令连起来到底能干啥”。洗衣机这套案例,恰好把开关量输入、定时器、计数器、状态转移、电机正反转控制、上位机监控这些知识点全部串起来了,而且逻辑清晰、看得见摸得着,非常适合拿来作为第一个完整小项目去做。
我这次用西门子S7-200 PLC搭配组态王,做一个全自动洗衣机的控制系统,从I/O分配、硬件接线思路,到梯形图逻辑设计、组态王画面组态,再到现场调试的坑,一次性完整拆开讲清楚。这套方案覆盖了从“纯按钮启停”到“人机交互监控”的全过程,不管你是刚入门的PLC学习者,还是需要在实训室搞一套演示系统的老师或工程师,都可以照着这个思路落地。
很多人会把重点放在PLC程序上,但我个人经验是,真正花时间的反而是上位机组态和设备通信。这部分我后文会详细展开,包括组态王怎么定义设备、怎么关联变量、怎么让画面里的水波动画跟着PLC状态走。
1.1 控制需求拆解:先把洗衣流程变成PLC能认的逻辑
做任何一台设备的PLC控制系统,第一步都不是写程序,而是把设备的工艺动作整理成一张流程表。全自动洗衣机的标准流程大致是:启动→进水→洗涤→排水→脱水→停止。但在真实控制里,每一步还能继续拆细。
- 启动条件:门锁关闭、桶内无水或水位在低位以下、程序处于初始状态。
- 进水阶段:打开进水阀,当水位到达高水位时关闭进水阀。
- 洗涤阶段:电机正转15秒→停3秒→反转15秒→停3秒,如此循环,洗涤总时间比如设定10分钟。
- 排水阶段:打开排水阀,等待水位降到低位以下。
- 脱水阶段:关闭排水阀,启动脱水离合器,电机高速旋转,持续3分钟。
- 结束:回到初始状态,等待下一次启动。
如果做成更高级的,还可以加温度检测、泡沫检测、预约启动等功能,但基础版建议先把上面这六步跑通。这里有一个很关键的思路:不要把洗衣流程塞在一个大的主程序里顺序扫描,而是拆成若干个“状态”,每个状态只处理自己该做的事,状态之间通过转换条件来跳转。这其实就是状态机编程思想,也是后面所有复杂逻辑的底层框架。
1.2 硬件选型与I/O分配:S7-200的输入输出到底怎么规划
S7-200是西门子小型PLC里的经典系列,虽然现在新项目更多用S7-1200/200 SMART,但S7-200在存量设备里保有量非常大,而且它的指令体系是理解西门子逻辑的基础。我这里用的是CPU 226,两个通讯口,输入24点、输出16点,做洗衣机这种十几个I/O点的项目毫无压力。
先说输入信号规划。洗衣机的输入主要来自操作面板和传感器:
- 启动按钮(常开)
- 停止按钮(常闭)
- 高水位开关
- 低水位开关
- 门开关(门锁到位信号)
这5个数字量输入对应I0.0到I0.4。水位开关用的是浮子式液位开关,实际就是干接点信号,COM端接PLC的1M,信号线接对应输入点,不需要额外转换电路,非常省事。门锁开关我建议用常开触点,门关好才闭合,逻辑上更安全。
输出点就稍微多一点:
- 进水阀:Q0.0
- 排水阀:Q0.1
- 洗涤电机正转接触器:Q0.2
- 洗涤电机反转接触器:Q0.3
- 脱水离合器+电机高速接触器:Q0.4
- 蜂鸣器/指示灯:Q0.5
- 门锁电磁铁:Q0.6
输出模块这里建议用继电器输出型,因为要直接驱动220V交流接触器和电磁阀,继电器输出型带负载能力强,不需要中间再加小型继电器。当然,如果你手头是晶体管输出型,那就要在PLC输出和负载之间加中间继电器,否则容易烧输出点。这是很多初学者没注意到的细节,我在现场见过不止一次因为输出类型选错而烧点的情况。
S7-200的I/O地址分配,我整理了一个表格方便对照:
| 信号类型 | I/O地址 | 含义说明 | 备注 |
|---|---|---|---|
| 数字量输入 | I0.0 | 启动按钮 | 常开 |
| 数字量输入 | I0.1 | 停止按钮 | 常开 |
| 数字量输入 | I0.2 | 高水位开关 | 水位到高限闭合 |
| 数字量输入 | I0.3 | 低水位开关 | 水位低于低限闭合 |
| 数字量输入 | I0.4 | 门锁到位开关 | 门关闭到位闭合 |
| 数字量输出 | Q0.0 | 进水阀 | 220VAC |
| 数字量输出 | Q0.1 | 排水阀 | 220VAC |
| 数字量输出 | Q0.2 | 电机正转 | 驱动接触器 |
| 数字量输出 | Q0.3 | 电机反转 | 驱动接触器 |
| 数字量输出 | Q0.4 | 脱水 | 驱动离合器/高速 |
| 数字量输出 | Q0.5 | 蜂鸣器 | 提示 |
| 数字量输出 | Q0.6 | 门锁电磁铁 | 上锁 |
这里有一个容易被忽略的细节:低水位开关的接线逻辑。洗衣机在脱水前必须确认水已排空,常见做法是低水位开关在“水位高于低限”时断开、在“水位低于低限”时闭合。所以当排水阀打开,水位逐渐下降,低水位开关从断开变成闭合,PLC就认为排水完成,可以进入脱水。如果PLC程序里把常开常闭搞反了,后果就是程序永远检测不到“水排空”,脱水步骤永远卡住。
1.3 为什么选择S7-200配组态王而不是触摸屏
可能有人会问:这套系统用个国产触摸屏不是更省事?组态王还得配电脑、还得装授权,成本不是更高吗?这个问题其实得分场景。
触摸屏的优势是集成度高、现场占用空间小、稳定性好,适合产品化的设备。但如果你是在做课程设计、技能竞赛训练、或者需要做工艺参数记录分析的实验室项目,组态王的优势就很明显了。首先,组态王可以跑在任意一台普通电脑上,画面开发自由度高,能够实现数据报表、历史曲线、报警记录等触摸屏上比较难做的功能;其次,组态王支持的驱动非常多,以后你换了PLC品牌,只需要改一下设备驱动和变量映射就行,不需要重写整个系统。
对学习者来说,组态王的价值在于“可视化你的程序逻辑”。你把PLC里的每一个位、每一个字都在组态王画面上显示出来,程序跑到哪一步、进水阀有没有开、电机是不是在正转,一眼就能看到。这种直观反馈对理解PLC扫描执行过程非常有帮助,比接一堆指示灯然后猜状态高效得多。
S7-200和组态王之间的通信方式也有意思。S7-200上自带的PPI通讯口,本身是西门子私有的PPI协议,组态王通过PC/PPI电缆或USB-PPI编程电缆就能连上,不需要额外加通讯模块。PC/PPI电缆还有个用处就是下载PLC程序,所以实际上你只需要一根线,既能下载程序又能连组态王通讯,硬件成本极低。这里提醒一句:如果用的是USB转串口的编程电缆,注意在组态王里选择对应的COM口号,并且要确认PC/PPI电缆上的DIP开关拨到了正确的波特率位置。
如果你手头的S7-200刚好有两个通讯口,那就更方便了。一个口接组态王,另一个口还可以再挂一台触摸屏或者接其他设备,做通讯实验很灵活。不过,如果只有一个通讯口,建议把组态王作为主站,PLC作为从站,保持一主一从的通信结构,不要多个上位机软件同时去抢同一个PPI口,容易把通讯搞挂。
2. PLC梯形图核心逻辑实现
2.1 程序架构设计:不要把顺序控制写成一大坨
洗衣机控制的梯形图如果全堆在主程序里,用启保停电路一步一步往下写,虽然能跑,但是逻辑非常难维护——你想加一个暂停功能,就得把整个程序翻一遍。我强烈建议采用“状态位法”,也就是用M存储器的位作为各个阶段的标志,程序分成4段独立逻辑:
- 第一段:启动、停止、状态切换逻辑,负责把当前所处的阶段状态位置位或复位。
- 第二段:进水阶段逻辑,检测水位信号,控制进水阀,输出状态转换信号。
- 第三段:洗涤逻辑,调用定时器循环计时,控制电机正反停。
- 第四段:排水与脱水逻辑,控制排水阀和脱水接触器。
这样做的好处,是每一段程序只对“当前状态”负责,其他状态即使误动作也不会干扰全局。我一般会用M0.0到M0.6作为状态位,M0.0代表待机/初始,M0.1代表进水,M0.2代表洗涤正转,M0.3代表洗涤停,M0.4代表洗涤反转,M0.5代表排水,M0.6代表脱水。
状态切换的梯形图模板可以这样理解:假设要从M0.0切到M0.1,条件就是“启动按钮被按下并且门锁到位”,那么程序就是“M0.0的常开触点 + I0.0启动 + I0.4门锁 → 置位M0.1,同时复位M0.0”。每个状态切换都是一套置位/复位组合,状态之间不会互相干扰。这个方法不仅适用于洗衣机,你用同样的思路去做自动售货机、皮带传送线、立体车库,框架都通用。
为什么推荐用置位/复位而不是用MOVE指令或者跳转指令?因为S7-200的老型号CPU对复杂跳转的支持和在线监控的友好程度不如现在的新型PLC,置位复位写法简单直观,而且在线监控时看M位的通断,一眼就能判断当前在哪个状态。相比之下,跳转指令的排错体验差很多,你很难一眼看出CPU到底跳到了哪一段。
2.2 进水与排水逻辑:小心水位信号的常开常闭
进水逻辑是最简单的,但也最考验细节。进水状态M0.1置位之后,输出Q0.0进水阀得电开始进水。什么时候停止进水?检测到高水位开关I0.2闭合。所以进水停止条件,就是在状态M0.1前提下,当I0.2为ON,复位M0.1,同时置位M0.2进入洗涤正转阶段。
排水逻辑则刚好相反。排水时打开Q0.1排水阀,同时要监控低水位开关I0.3。前面我提到低水位开关在低于低水位时闭合,所以程序判断“排水完成”的条件就是I0.3由0变成1,或者保持为1一段时间。
这里有个实际调试中经常踩的坑:水位开关的信号在临界位置会出现抖动,也就是水面波动导致浮球反复通断。这种抖动在PLC程序里会表现为状态反复切换,甚至让进水阀一下开一下关。解决办法有两个,一个是硬件上用带套管阻尼的液位开关,另一个是在程序里加一个延时确认,例如I0.2导通之后延时2秒再认为“确实到高水位了”。我通常两个都做,硬件选型上不留隐患,程序里加延时做二次确认,这样现场调试会轻松很多。
S7-200的定时器有TON、TONR、TOF三种。做延时确认时用TON,延时时间到之后定时器位变为1。注意一个问题:定时器的分辨率跟编号有关,S7-200里T37、T38这些是100ms分辨率,T33、T34是10ms分辨率。如果你要延时2秒,用T37设定值20就是2秒。这个换算关系新手经常搞错,把20当成20毫秒,结果程序等半天不动作,其实时间早就过了。
2.3 电机正反转与洗涤节奏:巧用循环定时器
洗涤过程是整个梯形图里最“有节奏感”的部分。目标动作是正转15秒、停3秒、反转15秒、停3秒,循环10分钟。实现这个节奏,我用两个定时器配合状态位来做:
- T37:正转计时15秒,计时到则复位正转状态,置位暂停状态。
- T38:暂停计时3秒,计时到则复位暂停状态,置位反转状态。
- T39:反转计时15秒。
- T40:暂停计时3秒。
四个定时器轮流工作,循环次数通过计数器C0来累计,设C0计数目标为20次(每次循环包含正转15秒+停3秒+反转15秒+停3秒,一个循环大概36秒,10分钟大约可以跑16到17个循环。如果你要精确控制总时间,可以用总洗涤时间定时器来终结洗涤过程,而不是用固定循环次数)。
这两种方案我都试过,用总时间定时器更贴近“全自动洗衣机”的实际逻辑,因为用户关心的洗10分钟还是洗15分钟。但用循环次数做也有优势,逻辑上更容易理解。我的建议是,如果只是演示教学,用计数循环更直观;如果是模拟真实设备,用总时间T41设定600(100ms×600=60秒)作为洗涤总时长,时间到就进入排水状态。
电机互锁必须强调。正转接触器和反转接触器在硬件上要加电气互锁,程序里也要加软件互锁,即Q0.2导通时Q0.3必须被强制断开。电子互锁和机械互锁双保险,才能防止两个接触器同时吸合导致短路。在梯形图里,互锁就是把对方的常闭触点串在自己的输出回路里。
很多初学者写出来的梯形图,表面看没问题,但一上电就跳闸,八成就是互锁没做好。程序虽然是“软”的东西,但它控制的接触器是“硬”的,两个接触器同时吸合,相间短路瞬间就能把空开打掉。所以在写电机正反转控制时,互锁这个习惯最好从一开始就养成,不要等出事再补。
2.4 脱水和安全联动逻辑
洗涤结束之后进入排水状态M0.5,排水阀打开,等低水位开关I0.3闭合,说明水排得差不多了,这时才允许进入脱水状态M0.6。
脱水输出Q0.4需要同时满足三个条件:门锁到位(I0.4闭合)、排水完成、洗涤电机停止。门锁联锁是硬性安全要求,脱水时滚筒高速旋转,如果门没锁好,一旦打开盖子,衣物甚至人手被绞入,后果不堪设想。S7-200程序里可以这样写:M0.6置位的前提是I0.4为ON,脱水过程中一旦I0.4断开,立刻复位所有输出,强制回到待机状态,并且要等门重新关好并且再次按启动才能恢复。
这里体现了一个设计原则:安全类信号必须用“断开有效”的逻辑而不是“闭合有效”的逻辑。什么意思?门锁到位用常开触点时,正常关门后I0.4闭合,但如果门锁的线被老鼠咬断了或者接触器损坏,PLC看到的就是I0.4始终断开,会认为处于“开门状态”,输出强制停止,这样反而安全。反过来,如果你用常闭触点做门锁信号,线断了PLC反而以为门一直锁着,那才是真正的隐患。
脱水结束的标志可以设一个定时器T42,设定为3分钟,时间到之后复位M0.6,置位M0.7(结束提示),同时Q0.5蜂鸣器响5秒提示洗衣完成,然后回到M0.0待机。
3. 组态王上位机画面搭建与变量关联
3.1 组态王工程创建:从新建工程到添加西门子设备
组态王是一个国产组态软件,在工控圈子里用得非常多。因为它上手相对容易、驱动支持丰富,而且中文界面,对国内工程师来说门槛低。要做组态王和S7-200的通信,需要在组态王里正确添加设备驱动,设置通讯参数,然后定义变量,最后把变量和画面元素绑定。
首先要说的是组态王版本,我用的是组态王6.55,兼容性和稳定性都比较好。如果你用的是6.53或更老版本,驱动支持的PLC型号会少一些,建议直接用6.55或6.60。安装时注意:组态王软件对操作系统有要求,老版本建议用Windows XP或Windows 7 32位系统来运行。如果在Win10 64位环境下运行老版本组态王,容易出现画面闪烁、驱动加载失败等问题。如果必须用Win10,优先装6.60及以上版本。
创建工程的步骤:
- 打开组态王工程管理器,新建工程,命名“洗衣机控制系统”。
- 进入开发系统,双击左侧工程的“设备”——“COM1”或“COM2”,在弹出的窗口中选择“PLC”——“西门子”——“S7-200(PPI)”。
- 给设备命名,比如“PLC1”,然后设置串口参数,波特率9600,数据位8,停止位1,偶校验,这些参数要和S7-200系统块里设置的PPI通讯参数完全一致。
- 指定PLC地址,默认是2,这是S7-200在PPI网络上的站地址。如果你不确定PLC站地址,可以在Step 7 Micro/WIN的通讯设置里查看,默认是2,一般不用改。
串口参数的一致性是我见过最容易出问题的地方。PLC PPI口的波特率如果改过,但组态王里没同步,就会出现设备报错或者变量读不上来。判断方法很简单:组态王下方状态栏会显示设备连接状态,或者直接看变量是否能读到值。
如果你用的是USB转串口编程电缆,那要去设备管理器确认一下USB转出来的是COM几。现在的笔记本往往没有物理串口,你需要装好USB转串口驱动,然后在组态王里选择对应的COM口号。注意:组态王的COM口号和Windows设备管理器里的COM口号必须对应,不要看到COM3就选COM3,先确认一下是不是那个USB转出来的口。
另外提示一下:如果PC/PPI电缆的驱动类型选择出错,也会导致通信失败。S7-200的PC/PPI电缆有两种模式:一种是编程模式,用于Step 7 Micro/WIN下载程序;另一种是PPI模式,用于和上位机组态软件通信。有的USB-PPI电缆上有个拨码开关或者自动切换功能。如果你发现组态王读不到数据,而Micro/WIN能正常下载程序,多半就是电缆工作在编程模式而不是PPI模式。
3.2 组态王变量定义:I/O变量和内存变量的区别
设备添加完成后,接下来一步就是定义变量。组态王里变量分两大类:内存变量和I/O变量。内存变量只在组态王内部使用,不跟PLC通信;I/O变量才真正跟PLC交换数据。
做洗衣机监控画面,需要定义的I/O变量如下:
| 变量名 | 变量类型 | 连接设备 | 寄存器 | 数据类型 | 读写属性 |
|---|---|---|---|---|---|
| 启动按钮 | I/O离散 | PLC1 | I0.0 | Bit | 只读 |
| 停止按钮 | I/O离散 | PLC1 | I0.1 | Bit | 只读 |
| 高水位 | I/O离散 | PLC1 | I0.2 | Bit | 只读 |
| 低水位 | I/O离散 | PLC1 | I0.3 | Bit | 只读 |
| 门锁信号 | I/O离散 | PLC1 | I0.4 | Bit | 只读 |
| 进水阀 | I/O离散 | PLC1 | Q0.0 | Bit | 读写 |
| 排水阀 | I/O离散 | PLC1 | Q0.1 | Bit | 读写 |
| 电机正转 | I/O离散 | PLC1 | Q0.2 | Bit | 读写 |
| 电机反转 | I/O离散 | PLC1 | Q0.3 | Bit | 读写 |
| 脱水 | I/O离散 | PLC1 | Q0.4 | Bit | 读写 |
| 蜂鸣器 | I/O离散 | PLC1 | Q0.5 | Bit | 读写 |
| 状态显示 | I/O整型 | PLC1 | VB0 | Byte | 只读 |
关于寄存器地址的写法,S7-200的位存储区对应到组态王里有些细节。I0.0在组态王里就写成I0.0,Q0.0写成Q0.0,这些比较简单。但如果要读M区或者V区的数据,需要特别注意地址映射方式。组态王里S7-200的V区寄存器地址通常是从VB0开始,一个V字节对应一个字节地址。比如PLC里VW100存储了当前状态字,组态王变量寄存器就填VW100。
这里有个常见的坑:S7-200的V区地址在组态王里有时要加偏移。不同版本的组态王驱动定义不一样,有的需要你选择寄存器类型为V,有的则直接填十进制偏移。建议添加变量之前先查一下组态王安装目录下的驱动帮助文档,或者直接用“寄存器”下拉框选V,然后填偏移量。别问我为什么,这个我调过一次,折腾了大半天才发现是偏移量的问题。
组态王里还支持直接读写M区,但S7-200的M区地址比较特殊,建议在程序里把需要传给组态王的中间状态量都搬运到V区,用V区作为PLC与组态王之间的共享数据区。比如把M0.0到M0.7的状态传送到VB100,组态王直接读VB100的值,通过值的大小判断当前在哪个状态,简单又稳定。
如果你要做的只是监控画面,不需要在组态王里直接操作PLC输出,那输出变量全部设成“只读”就行了。但实际项目中,为了演示方便,我一般会在组态王画面上放一个“手动开关进水阀”的调试按钮,对应的Q0.0就设成“读写”。这里还是建议小心使用,调试结束后把画面上的手动操作按钮遮住或删除,防止误操作。
3.3 监控画面设计:让水流动画与设备状态联动
组态王画面设计的核心是“动画连接”,也就是把图元的属性(颜色、填充、位置、可见性)跟变量的值绑定起来。
洗衣机画面我一般这样布局。顶部是水箱/滚筒的剖面图,用矩形表示桶体,桶体中间是一个圆形表示滚筒。画面左侧竖排“启动”“停止”按钮,右侧是状态指示灯。底部放一个蓄水池形状,用来表示排水过程。
关键动画设计:
- 进水动画:画一个从顶部进入桶内的管道,桶内画一个矩形,用“填充”动画连接关联到高水位变量。当高水位信号从0变成1,填充高度从0到100%。由于洗衣过程里高水位只是开关量,所以填充变化是阶跃式的,不能做连续动画。要做连续动画,需要在PLC里用模拟量采集或者把水位传感器的连续信号传给组态王,开关量做不了平滑效果。
- 正反转动画:给滚筒图元添加“旋转”动画连接,关联电机正转和反转变量。正转时旋转角度从0到360度循环,反转时反向。如果不用旋转,也可以做颜色变换。很多人发现滚筒旋转速度很难调——组态王里旋转动画的旋转速度,可以通过脚本里反复改变旋转角度来实现,比如每秒增加30度,这样模拟出来的转速就比较接近真实效果。
- 排水动画:排水阀打开时,桶内矩形填充逐渐下降,下方水池填充逐渐上升。这个过程如果只靠排水阀的开关量,同样做不出连续效果,只能做阶梯效果。但是可以通过脚本控制,比如排水阀Q0.1为ON时,每隔100ms把桶内填充高度减1,水池高度加1,模拟水位变化。
- 状态指示:用文本显示当前阶段。定义内存字符串变量,通过脚本判断VB100的值,如果是1就显示“进水”,2显示“洗涤”,3显示“排水”,4显示“脱水”。注意,脚本要写在“应用程序命令语言”的事件里,而不是写在画面图元的动画连接里。
这里补充说明组态王脚本语言的基本结构。组态王的脚本类似C语言,有If—Then—Else判断、For循环等等,还能操作变量和图元属性。在画面空白处右键,选择“画面属性”→“命令语言”,可以给整个画面添加周期性执行的脚本。常用的写法就是“IF (变量名 == 条件) THEN 图元.属性 = 值;ENDIF”。组态王的语法跟标准C略有差异,变量名和函数之间要用空格隔开,赋值语句末尾要用分号。
3.4 历史报表与实时曲线:让系统具备数据记录能力
这个功能算是组态王相对触摸屏的一个明显优势。触摸屏虽然有历史曲线功能,但是存储容量、数据导出都受限,而组态王可以配合SQL数据库、Excel来保存历史数据。这个项目里可以设置一个历史趋势曲线窗口,把水位、电机状态等关键变量记录下来,观察整个洗衣周期。
组态王里做历史曲线的基本步骤:
- 在开发系统左侧找到“数据库”——“数据词典”,把需要记录历史的变量(如状态字VB100、高水位、低水位、进水阀等)定义成I/O变量。
- 双击变量,在“记录和安全区”选项卡里勾选“记录”,并选择“历史数据记录”。
- 新建一个画面,在工具箱里选择“趋势曲线”控件,绑定对应的变量。
- 选择历史曲线控件或实时曲线控件,设定时间范围、曲线颜色、坐标轴范围。
历史趋势曲线对于排查问题非常有用。比如你怀疑某次洗涤过程中电机中途停了但没报故障,通过历史曲线看状态字的变化,就能知道状态是从洗涤切到了停止还是切到了暂停。这种事后回溯的能力,是纯靠PLC程序监控做不到的。
设置数据报表稍微复杂一点,但也是常规操作。组态王自带报表控件,可以按时间段查询历史数据并生成报表。做法是新建一个报表画面,拖入报表控件,然后编写查询脚本。核心脚本是调用组态王提供的“ReportSetHistData”或者类似的数据查询函数。新手刚开始会觉得函数参数多、语法严格,但只要把起始时间、步长等参数填对,基本就能出结果。
再提一句:组态王的历史数据默认存在本机的KingHistorian数据库文件里,如果你要长时间运行、记录大量数据,注意及时清理或者迁移数据库存储路径,否则工控机硬盘会被撑爆。这个坑我见过两次,都是在连续运行半个月以上的设备上出现的。
4. 调试过程与常见问题排查
4.1 通信故障排查:组态王读不到PLC数据的处理思路
做这套系统,大概率你遇到的第一个问题不是梯形图跑不起来,而是组态王连不上PLC。下面我把高频问题按可能性从高到低列出来:
第一个是物理连接和串口问题。先确认PC/PPI电缆是否插好,设备管理器里是否能够看到COM口。然后在组态王里选对COM口号。如果你电脑的USB口供电不足,也会导致USB转串口线不稳定,表现为设备时通时断,这时候换一个USB口或者用带外部供电的USB-HUB能解决。
第二个是通讯参数不一致。这个非常关键。S7-200的PPI协议默认波特率为9600,但也有设备改过。你可以用Step 7 Micro/WIN连接PLC之后,进入“系统块”,查看PPI波特率设置,然后去组态王设备配置里改成一致。注意组态王设备配置波特率时,不是越大越好,而是要跟PLC实际保持一致。这里有个很容易被忽略的点:PC/PPI电缆上DIP开关的波特率设置如果跟软件设置不一致,也会导致通信失败。
第三个是PLC通讯口模式问题。S7-200的PORT0通讯口默认是PPI从站模式。如果你用组态王连接时,Micro/WIN的上位机编程软件还在占用这个口,会出现通讯口被占用的现象。所以调试的时候,组态王和Micro/WIN不要同时打开去连同一个PLC的同一个口。
第四个是站地址问题。S7-200的默认站地址是2,如果多个PLC挂在同一条总线上,地址必须区分开。你在组态王设备里填写的PLC地址要跟PLC系统块里设置的站地址一致,否则通讯会超时。
我把排查流程整理成一个表,方便照着查:
| 故障现象 | 可能原因 | 排查动作 |
|---|---|---|
| 变量全部显示“**”或不可用 | 设备连接失败 | 先查看组态王信息窗口的错误代码 |
| 设备报错代码为2 | 串口被占用或接收不到数据 | 关闭Micro/WIN,检查电缆连接,对调收发线 |
| 设备报错代码为3 | 波特率、数据位等参数不匹配 | 检查组态王与PLC的PPI通讯参数 |
| 偶发连上但是变量刷新慢 | 通讯超时导致反复重连 | 检查是否串口缓冲区设置过小或系统负载过高 |
| 能连上但寄存器值不对 | 寄存器地址映射错误 | 核对寄存器类型和偏移量 |
在实际调试过程中,组态王和信息窗口会给出通信错误码,这些错误码在不同驱动里含义不完全一样,但通常数值越小越接近“物理层没问题、参数没对上”这一类问题。我每次排查通信问题都先看错误码,再根据错误码缩小范围,省很多时间。
4.2 梯形图逻辑设计中的典型错误与改正
程序逻辑问题比通讯问题更隐蔽,因为它不会直接报错,而是表现为“设备动作不对”。总结三个典型错误,都是初学者高频踩坑。
第一个是状态互锁不完整。有些人在程序里只做了电机正转和反转的互锁,却没有做“进水阀和排水阀不能同时开”的互锁。如果程序逻辑有漏洞,可能进水阀和排水阀同时打开,水一边进一边排,整个洗涤时间无限延长,还浪费水资源。解决方式是在进水阀输出和排水阀输出回路中互相串入对方的常闭点,并从程序结构上保证进水状态和排水状态不会同时置位。
第二个是定时器复位不及时。洗涤过程中用了多个定时器依次循环,如果上一个定时器没有被准确复位,下一个循环启动时,定时器的当前值可能从上次中断的位置继续累积,导致节拍混乱。解决方式是每个定时器在完成自己的使命之后,用复位指令(R)把它复位,或者利用定时器本身特性写清零逻辑。注意TON定时器在输入条件断开时当前值自动清零,但如果你的输入条件是常ON,那定时器就不会自动复位。我通常会用“定时器计时到”时的状态位去断开定时器的输入回路,同时复位自身。
第三个问题是停止功能没做到位。很多初学者定义的停止,只是让当前输出全部断开,但状态位没有复位。结果就是设备虽然停了,但再次按启动时,系统从“半路”继续跑,而不是从头开始。正确的停止逻辑应该是:按停止后,不仅要断开当前输出,还要复位所有状态位,让系统回到M0.0待机状态。最好还要让进水阀、排水阀都保持关闭,防止中途停机后水继续流。
4.3 现场调试与安全注意事项
现场调试之前,第一步不是运行程序,而是检查接线和供电。PLC的220V供电要经过隔离变压器或者带漏保的空开,防止触电和短路。电机和电磁阀这些感性负载,一定要在触点两端并联RC阻容吸收或压敏电阻,否则断电瞬间产生的反电动势容易把PLC继电器触点打坏。
程序调试要分三步走。先把PLC切到STOP模式,用万用表测量输入信号的通断,确认每个按钮、水位开关、门锁开关在动作时,对应的PLC输入指示灯是否跟着变化。再切到RUN模式,把电机主回路的接触器输出先断开,仅测试PLC输出信号的变化。这样可以防止程序逻辑错误直接驱动电机动作,造成安全事故。第三步再接上接触器和电机,进行带载调试。整个过程中,急停按钮要放在触手可及的位置,以备不时之需。
带载调试时最好有两个人配合,一个人在设备旁观察机械动作,一个人盯着电脑屏幕看组态王变量变化。两人之间提前约定好口令,遇到异常情况立刻按下急停。调试完成后,把PLC程序备份到电脑,组态王工程也要做好备份,标注好版本号和调试日期。我就是因为吃过亏,后来才养成一个习惯:每次现场改动程序,不管多小,都必须同步备份,并记录修改日志。半年后如果有人问你“这里当时为什么这么写”,你看一眼日志就能回忆起来。
4.4 组态王画面常见异常与修正方法
画面组态过程中最常见的问题就是“运行画面和开发画面不一致”。这个问题的根源通常是画面尺寸和分辨率设置不一致。开发画面默认是800×600,但运行起来会拉伸到当前桌面的分辨率,导致元件错位或者显示不全。解决办法是在组态王开发系统的“画面属性”里设定固定尺寸,然后在运行系统里选择“画面自适应屏幕”或者“按实际大小显示”,不要用拉伸模式。如果想要运行画面像手机App那样整体缩放,可以把画面放到一个“主画面”容器里,调整缩放模式。
另一个问题是动画连接失效。很多新手以为给图元加了变量关联,图元就会自动变化,但实际上组态王里动画连接必须设置“表达式”和“动画类型”。比如颜色变化要选中“颜色”并设置前景色或背景色的变化条件;填充要选中“填充”并设置填充方向和填充百分比的来源变量;位置移动要选中“水平移动”或“垂直移动”并设置移动距离对应的变量值范围。如果忘了设置具体类型或者表达式写错,图元自然就不动。
还有一个情况是变量闪烁。组态王里想要模拟指示灯闪烁效果,通常要借助脚本或者在变量值变化的基础上结合画面的“可见性”连接。但如果变量刷新过快,画面可能出现闪烁感,人眼很不舒服。解决办法是在组态王里设置较低的变量采集周期,或者接受这种物理现象,不强行追求高频刷新。指示灯的开关状态本来也不需要毫秒级刷新,把采集周期设成500毫秒就够了。
5. 系统扩展与进阶方向
5.1 从单机洗衣到小型自动线控制
把这套洗衣机控制方案吃透之后,你会发现你掌握的不仅仅是一个家电控制逻辑,而是一整套机电联调能力。同样的状态机设计方法,把进水阀、排水阀、电机正反转等动作单元替换成气缸、传送带、分拣机构,就可以延伸到饮料灌装线、小型组装设备等更复杂的自动线控制。核心思路都一样:把连续的生产过程拆解成离散状态,每个状态由一组输出表达,状态之间按条件跳转,再加上故障和急停分支。
5.2 引入模拟量与变频调速
做完开关量控制的基础版之后,我建议下一步往模拟量方向发展。把水位开关换成液位变送器,输出4-20mA电流信号,接到S7-200的模拟量输入模块EM231上,程序里通过PID或者简单的比较指令控制进水阀开度,实现精确注水。同样地,洗涤电机换成变频器,通过模拟量输出控制变频器频率,实现洗涤转速可调、脱水转速分档切换,这样整个系统的技术含量就上了一层台阶。
S7-200读取模拟量的核心是模拟量输入值的转换。Micro/WIN的库里有模拟量比例换算指令,也可以自己用整数运算指令做归一化处理。比如4-20mA对应0到32000的数字量,你需要把它映射到实际水位对应的工程值。这个映射关系直接决定了PLC能不能准确判断水位高低,值得仔细推敲。
5.3 上位机报表与数据追溯的工程价值
如果你未来进入流程工业或者设备制造行业,会发现很多设备验收时都要求提供数据追溯能力。组态王的历史曲线和报表功能在这一块价值极大。这台洗衣机系统虽然简单,但完全可以作为练习“数据追溯”的载体。设置好历史数据存储之后,跑一个完整的洗衣周期,然后生成数据报表,证明整个过程可控、参数可查。这种能力在真实项目里甲方非常看重,也是你手里可以展示给面试官的干货。
我现在遇到类似小项目,重点已经不在“能不能控制”上了,而是更关注“能不能记录、能不能追溯、能不能远程运维”。这也是行业发展的趋势,低速控制和逻辑控制不再是最值钱的部分,数据采集和状态可视化才是真正提高设备附加值的所在。
5.4 关于PLC学习的延伸建议
如果你是因为这个项目刚开始接触PLC,我特别想提醒一句:梯形图只是工具,真正的核心是调试能力和对设备工艺的理解。同样是洗衣机控制,教学设备和真实家电的差别很大。真实家电的控制器是单片机,用专用控制芯片,讲究成本和低功耗;而PLC方案更多用在工业场景,比如大型工业洗衣机、隧道式洗衣机、医院洗涤中心的后整理设备。所以这个项目训练的不是“修洗衣机”,而是搞清楚“位移和状态、反馈和控制”这些工业控制的基本功。
学完洗衣机项目,下一个比较好的进阶项目是红绿灯控制或机械手控制。红绿灯可以练时序控制和时间基准;机械手更适合练步进指令和位置控制。等你把传感器、执行器、通信都玩过一轮,再回头看这个洗衣机项目,你会发现很多东西都通了。
6. 我的一点实操体会
做这个项目的过程中,我最大的感受是:PLC梯形图本身的指令其实不难,难的是把“设备怎么动、什么时候动、动多久、不满足条件怎么办”这些问题全部想清楚。很多时候程序出Bug,不是因为指令写错,而是因为工艺逻辑没梳理透。
把整个流程拆成状态之后,再用状态位去表达,程序的可读性和维护性一下子就上来了。这个习惯让我在后期调试中少走了非常多弯路。组态王做上位机也是一个熟能生巧的过程,尤其是变量定义和设备通信,第一次做肯定会有坑,但整套流程跑通之后,你就有了一套可以复用的模板。
如果你也是刚接触这个方向,我建议先不要追求代码数量和技术复杂度,而是把手头的小项目反复吃透。你今天把洗衣机控制的“进水—洗涤—排水—脱水”逻辑弄明白了,明天去做灌装线、去做恒压供水、去做小型自动化设备,底层思路都是一样的。希望这篇记录能帮你少踩一些我当年踩过的坑,快速搭建出自己顺手的一套全自动洗衣机PLC控制与监控系统。