前几天有个朋友找我,说手头有一个“61#西门子S7-200PLC和MCGS自动洗衣机控制系统组态模拟仿真控制系统”项目文件,名字里还带“组态王PLC程序”字样,想让我帮他捋一捋从PLC逻辑到组态画面这一整套到底怎么搭。这其实是工科里非常经典的一套实训题:用西门子S7-200PLC做自动洗衣机的顺序控制,再用MCGS或组态王这类上位机组态软件做监控画面,最后通过组态模拟仿真在电脑上把进水、洗涤、排水、脱水整个流程完整跑出来。项目虽然叫“仿真”,但涉及的知识点一点不少:PLC编程、通信配置、变量映射、动画联动、联调排错,全串在一起了。
这篇文章我就按自己实际做过的路子,把从零开始设计到联调跑通的全过程写下来。包括洗衣流程怎么拆成PLC状态机、梯形图的核心逻辑怎么写、MCGS画面怎么和S7-200变量接上、仿真联调时最容易踩的几个坑,以及组态王和MCGS在使用思路上怎么迁移。想照着做课程设计、比赛项目,或者第一次接触“PLC+组态”这套开发模式的朋友,可以直接拿这篇当参考底稿。
1. 拆掉“61#”编号:这类洗衣机仿真实训项目的真实任务
1.1 一个“小项目”练到的四样硬功夫
先说这个项目的本质。很多人看到“自动洗衣机控制系统”,第一反应是“不就是控制几个电机和阀门嘛”,确实,从工艺上看它不算复杂,但这类项目之所以在实训体系里长盛不衰,是因为它把工业自动化项目里最常见的几项能力全串起来了。
第一是PLC程序结构设计。洗衣流程是一个典型的顺序控制过程,每一步都有明确的进入条件和退出条件,天然适合用状态机思路来写。状态机写好了,程序逻辑清楚,出了毛病也好查。第二是组态软件的使用。不管是MCGS还是组态王,核心都是两件事:把现场设备的运行状态变成画面上的动画,把操作员的指令变成PLC能认的信号。第三是通信配置。S7-200和MCGS之间走的是PPI协议,串口参数、站号、驱动型号,哪一个不对都连不上。第四是仿真联调的思路。仿真不是把程序写完了点一下运行就完事,而是要模拟出真实的操作条件,比如用M区变量代替物理按钮和液位开关,这本身就是工程调试思维的训练。
所以别小看这个“61#”编号下的项目,它麻雀虽小,五脏俱全。认真做完一遍,你对整个工控项目的开发流程会有一个完整的概念,后面再去碰汇川、三菱、西门子1200/1500,或者WinCC、组态王之类的大系统,很多思路是通的。
1.2 把洗衣流程翻译成控制任务
自动洗衣机的工艺流程,按波轮式洗衣机的标准动作来分解,大致是这样一个循环:启动、进水、洗涤(正转-停止-反转-停止,反复多次)、排水、脱水,然后再进水进行漂洗,漂洗也分“加水→搅动→排水→脱水”,一般做两遍,最后蜂鸣提示结束。
把这段文字翻译成PLC要处理的控制任务,其实就几条:
- 进水阶段:进水阀得电打开,水位到达高水位开关后关闭进水阀。
- 洗涤阶段:洗涤电机先正转10秒,停2秒,再反转10秒,停2秒,这样循环多次;这个过程中进水阀保持关闭,排水阀也关闭。
- 排水阶段:排水阀打开,把水排到低水位开关以下,再继续排空一段时间,确保桶内没有残留。
- 脱水阶段:脱水电机(或者同一个电机切换到脱水状态)启动运转,持续几十秒。
- 漂洗阶段:重新打开进水阀进水,然后重复洗涤、排水、脱水的动作,做两遍。
- 结束阶段:蜂鸣器响几秒,所有输出复位。
到这一步可以看出来,PLC要控制的输出点大概是这么几个:进水阀、排水阀、洗涤正转接触器、洗涤反转接触器、脱水接触器、蜂鸣器。输入点则是启动按钮、停止按钮、高水位开关、低水位开关。这个划分非常关键,因为后面I/O分配和程序结构都建立在它之上。
有一个细节需要提前说清楚:在纯仿真项目里,启动按钮、停止按钮、高低水位开关这些物理输入,通常不会真的接硬件,而是靠MCGS画面上的按钮和开关来模拟。这就涉及到M区映射的思路,我在第三章专门讲,先在这里埋个伏笔。
1.3 硬件选型和I/O分配:动手前先画一张表
S7-200家族里,做这种小型实训项目,CPU224或者CPU226都够用,因为输入输出点数很少。CPU224自带14个数字量输入、10个数字量输出,I/O点绰绰有余。如果是实物接线,还需要考虑接触器、热继电器、开关电源、模拟水箱等等,但如果是纯组态仿真,重点是PLC程序里的地址分配要和MCGS的变量一一对应。
以这个洗衣机项目为例,我建议I/O分配表做成这样:
| 类型 | 地址 | 信号名称 | 说明 |
|---|---|---|---|
| 输入 | I0.0 | 启动按钮 | 常开触点,按下启动洗衣流程 |
| 输入 | I0.1 | 停止按钮 | 常闭触点,按下强制停止 |
| 输入 | I0.2 | 高水位开关 | 水位到达高水位时接通 |
| 输入 | I0.3 | 低水位开关 | 水位低于低水位时断开 |
| 输出 | Q0.0 | 进水阀 | 得电打开,断电磁阀关闭 |
| 输出 | Q0.1 | 排水阀 | 得电打开排水 |
| 输出 | Q0.2 | 洗涤电机正转 | 驱动正转接触器 |
| 输出 | Q0.3 | 洗涤电机反转 | 驱动反转接触器 |
| 输出 | Q0.4 | 脱水电机 | 驱动脱水接触器 |
| 输出 | Q0.5 | 蜂鸣器 | 洗涤结束后鸣响 |
这个表一旦定了,后面所有变量映射都围绕它展开。我见过不少初学者上来就写程序,写到一半发现自己I/O点分得乱七八糟,回头改程序改到崩溃。务必记住一点:PLC项目的第一张图纸不是梯形图,而是I/O分配表。
2. S7-200PLC梯形图核心:用状态机搭出洗衣机时序
2.1 状态分配:一个M位代表洗衣机的“当前动作”
洗衣流程是顺序控制,最清晰的写法就是用状态机。S7-200里做状态机,传统而实用的办法是用一组M中间继电器当作“状态位”,每个M位代表洗衣机当前处于哪个阶段,任意时刻只允许一个状态位为ON,这样程序读起来就像看表一样。
我给这个项目分配的状态位如下:
- M0.1:进水状态,进水阀打开,等待高水位信号。
- M0.2:洗涤正转状态,电机正转,T37计时10秒。
- M0.3:洗涤停止状态,正转结束后停2秒,等待T38计时。
- M0.4:洗涤反转状态,电机反转,T39计时10秒。
- M0.5:洗涤停止状态,反转结束后再停2秒,等待T40计时。
- M0.6:排水状态,排水阀打开,等待排水结束。
- M0.7:脱水状态,脱水电机运行,等待脱水结束。
漂洗阶段的处理逻辑可以复用M0.1到M0.7这组状态,只要在程序里加入“当前是第几次漂洗”的计数判断就行。状态位不新增,计数判断用计数器C0来记录洗涤循环次数,C1记录漂洗次数,后面会详细讲。
用M位做状态机的好处是,程序里的每个输出都可以直接写成“某个状态位=ON时输出线圈得电”,例如M0.2=1时Q0.2得电,M0.6=1时Q0.1得电。这样做逻辑链非常透明,仿真联调时哪一个状态不对,直接监控M区变量,立刻就能定位卡在哪一步。
2.2 定时器选型与参数计算:为什么正转10秒要用T37且PT=100
S7-200的定时器分TON(接通延时)、TOF(断开延时)、TONR(保持型接通延时),洗衣机控制里最常用的是TON。选定时器有个特别容易踩的坑:不是所有定时器的时基都一样。S7-200的定时器时基分配如下:
| 定时器号 | 时基 | 最大计时范围 |
|---|---|---|
| T32、T96 | 1ms | 32.767秒 |
| T33~T36、T97~T100 | 10ms | 327.67秒 |
| T37~T63、T101~T255 | 100ms | 3276.7秒 |
这意味着,同样写“PT=100”,T32计时100×1ms=0.1秒,T37计时100×100ms=10秒,差了整整100倍。很多初学者在仿真器上看到定时器动作时间和自己预期的完全不对,问题多半就出在时基选择上。
我做的设计里,T37用来给洗涤正转计时10秒,那么T37属于100ms时基组,PT值应该写100,100×100ms=10000ms=10秒。T38用来给正转和反转之间的停止计时2秒,PT写20。T39给反转计时10秒,PT写100。T40给反转后的停止计时2秒,PT写20。T41用来给排水后的排空延时计时30秒,PT写300。T42给脱水计时60秒,PT写600。T43给蜂鸣器计时10秒,PT写100。
这样一来,所有时间参数都变成可计算、可调整的,想改洗涤时间直接改PT值,而不用动整个程序结构。把时间参数做成表,也是后面调试时对照检查的利器。
2.3 核心网络说明:进水、洗涤循环、排水、脱水、结束的STL片段
S7-200的梯形图和STL(语句表)是等价的,很多人在电脑上习惯用梯形图,但看程序逻辑时STL反而更紧凑。我这里用STL把几个核心网络写出来,配合文字解释,大家转到梯形图里也很容易对应。
先看进水控制网络。进入M0.1状态后,进水阀Q0.0得电,同时监视高水位开关I0.2。当I0.2接通,说明水位已到位,就要复位M0.1,置位M0.2,进入洗涤正转。
// 网络:进水控制 LD M0.1 AN I0.2 = Q0.0 LD M0.1 A I0.2 R M0.1, 1 S M0.2, 1洗涤正转这步是核心中的核心。M0.2状态下Q0.2得电,同时T37开始计时10秒。T37计时到后,T37常开触点动作,复位M0.2,置位M0.3(停止状态)。注意,M0.2状态的复位要放在T37的常开触点之后,否则T37会被连带复位,逻辑就乱了。
// 网络:洗涤正转 LD M0.2 AN Q0.3 = Q0.2 TON T37, 100 LD T37 R M0.2, 1 S M0.3, 1接下来是整个洗涤循环里比较有意思的地方:M0.3是停止状态,它本身不驱动任何电机,只负责计时。T38计时2秒结束后,置位M0.4进入反转。反转状态M0.4和正转状态M0.2的结构完全对称,T39计时10秒结束后,置位M0.5,再停2秒。
反转停止结束后,需要判断洗涤循环是否达到3次。这个判断放在M0.5的结束处:计数器C0加1,如果C0当前值小于3,回到M0.2继续正转循环;如果C0等于3,复位C0,置位M0.6进入排水状态。
// 网络:洗涤循环计数 LD M0.5 A T40 LD M0.5 A T40 LD M0.2 CTU C0, 3 LD C0 R M0.5, 1 S M0.6, 1 R C0, 1这里用CTU计数器要注意一个细节:S7-200的计数器和定时器一样,有保持特性,如果不在合适的时机复位,计数结果会一直保留。因此我在C0驱动状态转移后立刻复位C0,保证下一次洗涤循环时计数器从0重新开始。
排水和脱水相对简单。M0.6状态下Q0.1得电,排水阀打开。当低水位开关I0.3断开后,继续延时30秒(T41),确保桶底残水排干净。延时结束后置位M0.7进入脱水。M0.7状态下Q0.4得电,T42计时60秒,脱水结束。
所有的工艺动作都完成之后,需要置位M0.8作为结束状态,让Q0.5蜂鸣器得电,T43计时10秒,之后用一个总的复位网络把所有状态位和计数器全部复位,系统回到初始待机状态。
2.4 互锁和停机:仿真里容易忽略的保护逻辑
写洗衣机梯形图时,正反转互锁必须做。洗涤电机如果正转和反转同时得电,轻则接触器打火,重则烧电机。在仿真里虽然没有物理电机,但这个习惯必须养成。做法很简单,正转输出Q0.2的回路里串入反转输出Q0.3的常闭触点,反转输出Q0.3的回路里串入正转输出Q0.2的常闭触点。我在上面的STL片段里已经写进去了(AN Q0.3),这是最基本的电机控制素养。
停机逻辑也要想清楚。停止按钮I0.1在实物里一般接常闭触点,程序里用I0.1的常开触点去复位状态位。为什么?因为PLC的输入回路如果断线,常闭触点对应的输入点会断开,程序里I0.1常开触点也就断开,就无法停机了,这有安全隐患。但反过来,如果I0.1接常开,断线时逻辑上等于按下停止,更安全。这里我建议按教学项目习惯,程序里用输入点I0.1的常闭触点加上软件互锁,实际接线时按安全规范来。
另外,仿真时使用M区变量模拟启动按钮和停止按钮,M0.0可以作为总运行标志,启动信号置位M0.0,停止信号复位M0.0以及所有状态位。这样做的好处是,MCGS画面上的“启动”按钮对应M0.0,画面上的“停止”按钮对应复位M0.0,逻辑上非常干净。
3. MCGS组态画面设计:让洗衣流程从PLC里“长”出来
3.1 新建工程与S7-200PPI设备驱动配置
MCGS全称是“MCGS工控组态软件”,常见的有嵌入版和通用版。做触摸屏项目一般用嵌入版,对应TPC系列触摸屏;电脑上做画面设计和模拟运行也用嵌入版组态环境。新建工程时有一步特别关键,就是要选择触摸屏型号,比如TPC7062K,这个型号会决定画面分辨率、脚本函数集以及支持的设备驱动范围。
工程建好之后,第一件事不是画画面,而是配置设备驱动。进入“设备窗口”,在设备工具箱里找到“西门子S7-200PPI”,双击添加。然后双击设备元件打开属性设置,重点检查通信参数:
- 串口端口:COM1(如果通过USB转PPI线缆,通常是COM3或COM4,以自己的电脑实际分配为准)
- 波特率:9600
- 数据位:8位
- 停止位:1位
- 校验方式:偶校验
- PLC站号:2
这组参数和S7-200 CPU通信口默认的PPI参数是一致的。S7-200的PPI协议默认波特率就是9600、8位数据、1位停止位、偶校验,PLC站地址默认是2。MCGS这边只要有一项对不上,比如校验方式选成了无校验,通信就会失败。这个坑我在联调部分还会专门讲。
3.2 变量数据库的建立:M区映射是仿真项目最关键的思路
MCGS画面本身不直接“看到”PLC的任何地址,所有数据都通过变量来传递。在MCGS的实时数据库里新建变量时,除了变量名、变量类型,最重要的是把“通道连接”和PLC的地址绑定。
但这里有个非常关键的坑:PLC的输入映像区I区只能由外部输入信号驱动,上位机通过PPI无法对I区写入。所以如果仿真项目里“启动按钮”直接连I0.0,MCGS画面上你怎么点按钮,PLC的I0.0都不会变,因为上位机写不进去。
解决办法就是前面提到的M区映射。把物理输入信号搬到M区:
| MCGS变量名 | PLC地址 | 方向 | 作用 |
|---|---|---|---|
| 启动 | M0.0 | 可写 | 模拟启动按钮,置位运行标志 |
| 停止 | M0.1 | 可写 | 模拟停止按钮,复位所有状态 |
| 高水位 | M0.2 | 可写 | 模拟高水位开关,1代表水位到达 |
| 低水位 | M0.3 | 可写 | 模拟低水位开关,0代表低于低水位 |
| 进水阀 | Q0.0 | 只读 | 显示进水阀状态 |
| 排水阀 | Q0.1 | 只读 | 显示排水阀状态 |
| 正转 | Q0.2 | 只读 | 显示电机正转状态 |
| 反转 | Q0.3 | 只读 | 显示电机反转状态 |
| 脱水 | Q0.4 | 只读 | 显示脱水状态 |
| 蜂鸣 | Q0.5 | 只读 | 显示蜂鸣状态 |
注意,PLC程序里所有使用I0.0、I0.1、I0.2、I0.3的地方,都要在仿真时替换成M0.0、M0.1、M0.2、M0.3。如果你希望程序在实物接线和仿真两种模式下都能用,可以把物理输入点作为并联支路,比如M0.2和I0.2并联对应高水位信号,实物模式下用I0.2,仿真模式下用M0.2。不过为了程序清晰,我这里建议仿真项目就直接用M区,逻辑更简单。
3.3 画面布局与动画连接:水位、电机、管道怎么做
MCGS的画面设计,重点不是画得有多花哨,而是信息层次清楚,动画逻辑能准确反映设备状态。我的做法是分成三个区域:最左边是操作区,放启动按钮、停止按钮、蜂鸣复位等;中间是洗衣机的剖面图,用矩形代表滚筒,用填充属性表现水位;最下边是状态指示区,用文字和指示灯表达进水、排水、正转、反转、脱水、蜂鸣。
水位动画是用“填充属性”实现的。先画一个矩形作为水箱容器,然后叠加一个内部矩形作为水体,把水体图形的“填充”属性关联到变量“水位显示值”,填充方向选“自下而上”,填充比例范围设0到100。这样当“水位显示值”从0变到100时,图形看起来就是水面从底部慢慢涨到顶部。
电机旋转动画可以这样处理:在滚筒位置放一个圆形叶片图形,把它的“旋转角度”属性关联到变量“电机转速”,在脚本里让“电机转速”变量持续累加。当正转变量或反转变量为ON时,每500毫秒让“电机转速”增加30度,画面上的叶片看起来就在转。停止时让变量保持不变,叶片就静止。这个办法虽然粗暴,但在教学仿真里视觉效果好,又不用复杂的图片切换。
管道变化用的是“可见度”属性。进水管的颜色可以在进水阀变量为ON时显示成蓝色,排水管在排水阀为ON时显示成水流状,这些都通过把管道图形的可见度属性关联到对应的开关量变量来实现。简单说,变量为1时图形显示,变量为0时图形隐藏,来回切换就能模拟管道的通断。
3.4 循环脚本让水位渐变:一个让画面不“跳变”的技巧
如果“水位显示值”直接就等于高水位信号或低水位信号,画面上水位的呈现会非常突兀:满水状态直接跳出来,或者瞬间消失,看起来像是坏掉了。实际水箱的水位变化是连续的,所以我要在MCGS的循环脚本里加一个渐变逻辑。
在MCGS的“运行策略”里新建一个循环脚本,执行周期设为500毫秒,然后写类似这样的逻辑:
If 高水位 = 0 And 低水位 = 1 Then 水位显示值 = 水位显示值 + 5 EndIf If 水位显示值 > 100 Then 水位显示值 = 100 EndIf If 高水位 = 1 And 低水位 = 1 Then 水位显示值 = 100 EndIf If 高水位 = 0 And 低水位 = 0 Then 水位显示值 = 水位显示值 - 5 EndIf If 水位显示值 < 0 Then 水位显示值 = 0 EndIf这段脚本的意思很直白:当低水位信号为1而高水位信号为0时,说明水箱正在进水途中,水位显示值每次加5;当低水位为0时,说明排水已经排到低水位以下,水位显示值每次减5。这样一来,画面上的水面会平滑地上升或下降,同时PLC程序里的水位开关状态还是严格按二进制开关量来判定,PLC逻辑不受任何影响。
这个渐变技巧看着不起眼,但对仿真体验的提升非常明显。评委或者老师看图时,一个平滑过渡的画面观感是“这项目做得很细”,而一个跳变的水位会让人怀疑程序有问题。有时候仿真项目给人“假”的感觉,不是因为逻辑不对,而是细节没做到位。
4. 组态模拟仿真联调:把PLC逻辑和画面接在一起跑
4.1 三种调试环境怎么搭
项目做完了,最终要把PLC程序和MCGS画面接起来跑。这里根据手里有没有硬件,有三种调试环境可选。
第一种是最理想的情况:有真实的S7-200 PLC,也有MCGS触摸屏。把PLC程序通过编程软件下载到PLC,触摸屏和PLC之间用PPI线连起来,触摸屏仿真运行或者直接下载到真机。这种模式最接近实际工程项目,通信、地址映射都是真刀真枪,但需要硬件设备齐全。
第二种是PLC仿真器加MCGS模拟运行。电脑上装S7-200仿真器,把STL或梯形图程序导入仿真器运行;MCGS这边用模拟运行环境启动工程。这里的麻烦在于,S7-200仿真器模拟的是PLC本身,但PPI通信的对外接口不一定能暴露给MCGS,所以在很多情况下,这种方式并不像听起来那么顺畅。通常的做法还是用第三方S7-200仿真器 + MCGS的模拟设备驱动来做,前提是仿真器支持COM口映射,这个要看具体仿真器的功能。
第三种是最省事的方案:纯MCGS内部仿真。PLC程序不在仿真器里跑,而是把洗衣流程完全用MCGS的脚本和内部变量实现,画面、按钮都是真的,只是没有真正的PLC程序参与。这种方案适合先做画面验证或者功能演示,但严格来说已经偏离了“PLC+组态”的项目初衷。
我实际推荐的做法是第二种加第三种结合:先用纯MCGS画面模拟把动画逻辑跑通,再把PLC程序导入S7-200仿真器,尽量验证PLC逻辑的正确性,最后有条件就接真机。总之别指望仿真器能100%替代真机,仿真器对定时器、计数器的运行机制模拟大体是准的,但部分扩展指令、通信指令可能不支持,遇到异常不要死磕仿真器。
4.2 联调失败排查:通信不上、变量不动、动画乱跳
联调时最容易遇到三个问题,我把排查思路和解决办法写出来。
第一个是通信不上。MCGS设备窗口里的通信状态指示灯一直是红色,或者变量值显示为“#设备失败”之类的异常。排查顺序是:先用串口调试助手看COM口有没有数据收发,排除USB转串口的驱动问题;再确认MCGS设备驱动的通信参数要和S7-200一致,重点看波特率、校验方式、数据位、停止位;接着看PLC站号,S7-200默认站号是2,MCGS设备属性里也要填2;最后看PLC程序里有没有把通信口占用的指令,比如自由口通信指令没关掉,PPI协议就起不来。
第二个是变量不动。PLC程序运行正常,状态位在PLC仿真器里都能看到翻转,但MCGS画面上对应的状态灯不亮。这种问题十有八九是变量通道连接错了。检查实时数据库里每个变量的“设备通道”是否指向了正确的PLC地址,特别是把M0.2误连到I0.2,把Q0.2误连到M0.2,这类低级错误非常容易发生。另外还要检查变量类型,开关量要选“开关型”,数值量要选“数值型”,类型不匹配时MCGS读回来的值可能一直为0。
第三个是动画乱跳。画面上的水位忽上忽下,或者电机叶片无规律旋转。这个问题多半出在循环脚本的周期和执行条件上。循环脚本的执行周期如果设得太短,比如100毫秒,水位加减的速度会快到看不清,而且多个脚本同时操作同一个变量时会出现竞争。我建议执行周期统一设500毫秒以上,而且水位渐变脚本里一定要加上限位判断(小于0赋0,大于100赋100),防止积分漂移。
4.3 调试顺序建议:先逻辑后画面,先点位后动画
最后给一个调试顺序的建议,这个顺序我自己用了很多次,效率高,出问题也好定位。
第一步,先单独验证PLC程序。在PLC仿真器里手动强制M0.0启动,监控M0.1到M0.8这些状态位的翻转顺序,确认进水、洗涤、排水、脱水的状态切换和时间参数都符合设计。这一步不和MCGS发生任何关系,逻辑对了再往下走。
第二步,单独验证MCGS变量驱动。在MCGS里打开设备窗口,看能不能读到PLC的Q区输出和M区状态,如果通信正常,设备窗口的通信状态应该是绿色,变量值能实时变化。这一步的核心是确认“桥”通了。
第三步,验证操作指令。在MCGS画面上点“启动”按钮,看M0.0是否被置位;点“停止”,看所有状态是否复位。如果按钮操作没反应,优先查变量连接方向,按钮的“按下”动作要连接到变量的“写”通道,而不仅仅是“读”。
第四步,逐步验证自动流程。在画面模拟高水位、低水位信号,观察进水阀、排水阀、电机的状态变化是否和预期一致。这里建议把高水位、低水位的模拟开关放到操作区,方便手动控制。
第五步,全部动作正常后,最后做完整跑流程。一键启动,看着画面自己走完进水、洗涤、排水、脱水、漂洗、结束的完整流程,顺带验证蜂鸣器动画和复位逻辑。
这套顺序的核心思路是:先确保PLC逻辑没有问题,再确保通信没有问题,最后才做画面联动和动画效果。最怕的就是画面、PLC、通信三样东西缠在一起有问题,那样排查起来会很痛苦。
5. 从MCGS延伸到组态王:组态软件选型与工程经验
5.1 MCGS和组态王的定位差异
标题里同时出现了MCGS和组态王,这其实是两类很常见的组态软件。很多初学者会把它们混在一起,其实它们的定位和适用场景是有些差别的。
MCGS的优势在于和昆仑通态触摸屏的配合生态,嵌入版对触摸屏硬件的适配度很高,做小型人机界面项目效率非常快。它的变量管理、画面设计、脚本系统都围绕触屏交互来设计,适合做设备端的人机界面。组态王则是北京亚控的产品,它的强项是作为PC上位机监控平台,在大中型SCADA系统里用得很多,可以同时连接多个PLC、多个采集设备,历史曲线、报表、报警系统这些功能比MCGS嵌入版要完整得多。
选哪个,取决于你的项目形态和技术方向。如果做的是单台设备的触摸屏界面,选MCGS嵌入版更顺手;如果做的是多设备集中监控,或者需要和数据库、Web发布对接,组态王更合适。两者的核心逻辑其实高度相似:变量驱动、画面动画、设备通信,学透一个再学另一个,成本很低。
5.2 组态王里做延时和通信驱动的一个思路
网上搜这个项目的时候,经常会看到“组态王画面如何设置延时”这种问题。组态王里做延时没有像MCGS那样直接的“延时刷新”函数,常用的办法是用数据词典里的变量配合“应用程序命令语言”来实现。
一种是利用系统变量“$时间”或“$秒”,在命令语言里记录一个起始时间,在循环脚本里不断比较当前时间和起始时间的差值,差值超过目标延时后就执行对应动作,并重置起始时间。另一种是直接调用WinAPI的Sleep函数,在弹起事件里写延时,但这个方式会阻塞界面线程,执行期间画面会卡住,不太推荐。还有一种相对优雅的思路是借助组态王的“定时器”对象,或者用“画面打开”时的命令语言启动一个周期任务,在周期任务里做计时判断。
组态王连接S7-200,和MCGS类似,有现成的S7-200 PPI驱动或通过第三方网关走Modbus。如果走Modbus RTU,S7-200需要在程序里用自由口初始化指令把通信口配置成Modbus模式,这个对初学者来说门槛略高。所以教学项目里,我建议能用PPI驱动就优先用PPI,配置工作量小,通信也稳定。
5.3 状态机思路在大中型PLC项目里怎么复用
最后聊点延伸的东西。你在洗衣机项目里用的这套“M位状态机”方法,并不是只在教学项目里才有效。实际工业项目里,比如汇川PLC、西门子1200/1500的程序,顺序控制同样大量使用类似状态机的思想,只不过实现方式可能从M继电器变成了SCL语言里的枚举类型变量,或者功能块内部的状态寄存器。
核心要领是一样的:先把工艺流程分解成有限个状态,再定义状态之间的转换条件,然后按状态驱动输出。这比用一堆自锁互锁电路来实现顺序控制要清晰得多。遇到几十步的复杂工艺流程,比如注塑机、包装线、机械手工作站,一旦程序是用状态机写的,调试时只要监控状态变量,就能一眼看出整个设备当前在执行哪一步、为什么卡住、该满足什么条件才能往下走。如果没有这个结构,那排查起问题来就是噩梦。
所以别看这个洗衣机项目好像只是一个“仿真实训”,它真正的价值在于训练你的模块化拆解能力。把复杂流程拆成有限状态,把状态之间的耦合降到最低,把时间和计数参数集中管理,这套方法论放到任何品牌、任何规模的PLC项目里都不过时。
还有个小建议,项目做完之后,可以把状态转移表和I/O分配表整理成一页文档,放进工程文件夹里。以后哪怕是半年之后回来看这个工程,只要表格在,三五分钟就能想起来整个程序的结构。养好这个习惯,对你做后续更复杂的项目会很有帮助。