做工业自动化这行组态软件里MCGS一直有一批忠实用户很多做设备调试的朋友入门触摸屏HMI都是从它开始的。MCGS6.2作为使用量很大的一个版本里面有个特别适合练手的玩法——拿饮料混合工艺做仿真工程把液位、配比、搅拌这些看不见的过程通过实时曲线、历史曲线和报警功能变成能看、能查、能交互的演示系统。这篇内容不是基础操作手册而是按照我实际搭建这套仿真项目的顺序把从数据建模、画面组态到报警配置、曲线调通的完整思路捋一遍。不管你是刚学组态软件的学生还是被安排“三天内做个演示系统”的工程师按这套路走都能省不少弯路。不接真实PLC纯靠MCGS内部变量和脚本就能把整个工艺逻辑跑通这在项目前期验证方案时非常实用。1. 整体设计思路为什么拿饮料混合练手1.1 饮料混合工艺背后的控制需求饮料混合在食品饮料行业里是特别典型的批处理工艺。想象一下两条管路一条走糖浆或者浓缩料另一条走水通过泵送进同一个混合罐罐里装搅拌器混合到目标液位后开启出料泵把成品送到下道工序。控制上要盯住几个关键点——罐体液位不能超上限不能低于下限两种料的累计量比例要接近设定配方搅拌器要按时间启停。这几个点恰好是组态软件最擅长展示的东西液位是模拟量泵和搅拌器是开关量累计量和配比是计算量而超限、偏差就是报警和曲线的天然素材。我选择饮料混合而不是别的工艺还有个原因它的因果关系非常直观。泵一开液位就涨搅拌器一转配比就趋于均匀出料泵一开液位就降。这种一对应的逻辑在仿真阶段特别好排查问题。如果选一套复杂的连续加热炉或者多段温控工艺变量之间有耦合新手很容易被绕晕。1.2 MCGS组态环境的四个核心窗口MCGS的工程由几个组态环境组成各干各的活理解清楚它们的关系搭建工程的顺序就自然出来了。设备窗口负责和外部硬件通信比如通过串口或以太网连接PLC、仪表。仿真时可以不挂真实设备但也可以选一个模拟设备让变量主动跳变。实时数据库这是全工程的中枢。所有变量都住在这里画面上的显示、脚本里的运算、报警里的判断最终都是针对这些数据对象进行的。用户窗口就是我们画画面的地方按钮、泵、罐体、曲线、报警列表都在这个舞台上。运行策略用脚本实现逻辑控制的地方。饮料混合仿真的核心脚本比如液位累加、配比计算都是在这里用循环策略驱动的。很多初学者上来就打开用户窗口画图画完发现画面是死的什么也不会动。原因就是没理解实时数据库和运行策略才是后驱引擎。正确顺序应当是先把工艺分析变成数据对象清单再确定哪些用脚本模拟然后才轮到画面。1.3 为什么用MCGS6.2来做这套仿真选MCGS6.2的原因首先是它有完整的模拟运行机制。在组态环境里点一下“模拟运行”不接PLC也能把整个工程跑起来这对验证画面逻辑和报警曲线帮助很大。其次它的脚本语法和构件体系在国产组态软件里算比较成熟的尤其是实时曲线、历史曲线和报警显示这块组态时不需要写大量代码多用属性配置就能实现。另外MCGS6.2做出来的工程可以直接部署到对应的触摸屏硬件上也就是说仿真项目的成果不只是“看一看”还能为后续真机程序打下基础。我在实际项目里就有过这种经历先在仿真里把画面布局和变量结构定下来现场只改设备窗口的通讯参数就能用省掉了大量现场调试时间。2. 实时数据库设计先把数据的骨架搭稳2.1 新建工程时容易被忽略的两个坑新建工程时选择触摸屏型号这一步很多人随便点一下结果画面组件一放就超出边界。MCGS6.2的模拟运行使用的是工程的显示分辨率TPC型号决定了默认画布尺寸。建议根据目标触摸屏选型号比如7寸屏就选对应7寸的型号画面设计才有参考系。另外工程名称和保存路径尽量用拼音或英文触摸屏运行环境对中文路径的兼容性不如英文路径稳这是我在拷贝工程到屏上时才发现的。新建完成后不要急着画画面先把实时数据库建起来。实时数据库相当于整个工程的“变量表”后面画面绑定的数据对象、脚本引用的变量名、报警关联的对象全部出自这里。变量名一旦确定后面大量构件都要引用改起来牵一发动全身所以第一步宁可多花半小时把变量理顺。2.2 饮料混合系统的数据对象清单我按工艺把数据对象分成了三类输入输出类、计算类、报警辅助类。下表是一份可以直接照抄的清单类型和初始值都标好了。数据对象名类型初始值用途说明进料泵B开关型0B料泵启动信号1为运行进料泵C开关型0C料泵启动信号1为运行搅拌机开关型0搅拌器启停信号出料泵开关型0出料泵启停信号罐体液位数值型0混合罐当前液位0~100%B料累计量数值型0B料泵运行时间折算的累计量C料累计量数值型0C料泵运行时间折算的累计量目标配比数值型30B料目标占比实际配比数值型0B料当前实际占比液位上限数值型80液位高报警阈值液位下限数值型20液位低报警阈值罐满标志开关型0液位达到上限时的状态标志这里有两个设计思路要说一下。泵和搅拌器用开关型是最合理的因为它们本质上就两种状态运行和停止。罐体液位用数值型且小数点位数设为1位这样显示的时候液位精度够用曲线也平滑。开关型变量在MCGS里占用字节少数值型则是32位浮点别一股脑全部用数值型不必要的精度换来的是存储空间的浪费尤其是后面要历史存盘的变量多了之后差距很明显。2.3 变量命名的经验变量命名这件事很多人不重视等到写脚本报错才发现问题。MCGS的脚本语言对变量名大小写不敏感但要求名字里不能用特殊符号和中文。我见过有人用“液位#1”这种名字脚本里引用报错后花了很长时间才找到问题。我习惯的命名规则很简单设备或用途参数类型比如进料泵B、罐体液位、液位上限。如果变量较多加前缀区分区域比如U1_液位、U1_温度。这套仿真项目里变量不算多按工艺命名就够了但规则一定要统一。另外所有变量建议在实时数据库里顺手把“初始值”填好否则PLC未连接或者脚本未执行时画面上会出现一个硕大的0或随机数第一次模拟运行时很容易被吓一跳。3. 画面组态与动画连接让工艺动起来3.1 画布布局与图元放置用户窗口打开后先把背景色设成浅灰色这种颜色对泵、阀门、管路图元的辨识度最高。罐体可以用矩形和椭圆组合实现顶部画一个椭圆表示罐盖中间画矩形作为罐壁底部再画一个小梯形作为锥底。管路的线条用工具箱里的管道图元设置线宽为4像素颜色用深蓝色区分液料管路。摆放图元时注意对齐MCGS里选中多个图元后可以用工具条上的对齐命令这个操作看似简单实际画面干净程度全靠它。泵的图形可以用一个圆加内部箭头旋转表示电机用方块加字母M。搅拌器放在罐体中央画一个竖直轴加两片桨叶桨叶可以用两个旋转45度的矩形拼出来。3.2 液位动画的核心百分比填充液位动起来是这套仿真最直观的效果MCGS里最常用的实现方式是在罐体矩形上叠加一个“填充”构件。选中罐壁矩形右键点击动画连接选择“填充”关联到罐体液位数据对象。属性设置里有几个关键点。填充方向必须选“从下到上”这样才能模拟液体从罐底上涨填充颜色建议用浅蓝色和罐壁的灰色形成对比百分比映射范围设为0到100对应液位数据对象的取值范围。填充构件会按照变量值自动改变矩形底部的填充高度看起来就和真实液位上涨一模一样。有一个细节需要注意填充构件默认是覆盖在整个矩形上的如果罐壁矩形本身带边框填充构件应该放在矩形内部、不覆盖边框。这样液位到顶时边框依然清晰可见不会出现“液体溢出罐外”的假象。我一开始没注意这个层次关系模拟运行后液位一到100%就把罐体边框淹没了特别别扭。3.3 按钮、指示灯与数值显示的组合主画面上的操作按钮有三个启动进料、启动搅拌、启动出料。每个按钮都关联一个脚本动作比如“启动进料”按钮按下事件里写两行脚本进料泵B 1 进料泵C 1这样画面上的泵状态就能被按钮控制。按钮的文本颜色和填充色可以设置运行后按钮按下的视觉效果要明显一点我用的是按下时文字变白、背景变深。指示灯用椭圆图元加颜色动画连接实现。选中泵旁边的指示灯动画连接选“颜色变化”关联对应泵的开关型变量设置0时为灰色1时为绿色。状态一目了然比单纯看泵图标的旋转要直观得多——泵图形旋转动画偏向装饰指示灯才是真正的状态体现。数值显示用“显示构件”关联罐体液位、实际配比、B料累计量等变量设置整数位数和小数位数后运行环境就会实时刷新。操作员输入框也用显示构件里的输入模式绑定液位上限这样仿真运行中操作员可以临时改报警阈值反复演示报警效果而不用回组态环境改参数。3.4 多窗口切换报警和曲线建议放在单独的用户窗口主窗口保持简洁。在主画面加一个“报警画面”按钮脚本写!ChangeWindow(报警窗口)返回按钮就写!ChangeWindow(主窗口)这种切换方式在MCGS里非常常用多个画面之间用按钮跳转模拟运行时也支持。多窗口还有一个额外好处报警窗口和历史曲线窗口分开数据对象绑定时不容易互相干扰而且部署到触摸屏上以后分页显示比叠在一起操作手感好很多。4. 报警功能配置让系统学会主动提醒4.1 报警的数据流理解MCGS报警机制是一条链数据对象超限 → 运行环境产生报警事件 → 报警显示构件展示、声音提示、历史记录。很多人报警不触发问题往往出在前面两环的一个小细节上——数据对象没有勾选“允许报警”属性。在实时数据库里双击一个数据对象进入属性对话框切换到报警属性页。页面上有类型选择、上下限数值、报警注释几个关键字段。对罐体液位我设置了四个层次报警类型触发值注释文本上上限报警90液位超高紧急停车上限报警80液位偏高注意下限报警20液位偏低补料下下限报警10液位过低禁止出料4.2 报警属性设置细节报警注释文本一定要写清楚因为报警显示构件里展示出来的就是这段文字。“液位偏高注意”和“液位超高紧急停车”在实际运行中操作员看到后的动作完全不同注释写得模棱两可是大忌。开关型变量也能报警针对进料泵B可以设置“故障时报警”报警类型选开关量报警当变量值变为1时触发。仿真中我用这种方式模拟泵故障——某个按钮按下后把进料泵B置1警报立刻弹出整个演示效果很有冲击力。报警声音的处理有两种方式。一种是在用户窗口放一个报警声音构件配置对应报警事件的声音文件另一种是用脚本函数播放声音在报警显示构件的“报警事件”里调用。工程里我用了报警声音构件触发条件关联液位上上限和泵故障这两个事件比较紧急适合用响亮的声音提醒操作员。声音文件建议用WAV格式MCGS对MP3的兼容性不如WAV稳定这是我踩过坑后的经验。4.3 报警显示与报警浏览构件主画面上放一个报警显示构件属性里关联需要显示的报警数据对象运行后报警列表会实时滚动。这个构件支持按时间排列、状态着色报警触发时行文字变红确认后变绿恢复后自动消除。报警浏览构件是另一个角色它和报警显示的区别在于支持历史查询和人工确认。报警浏览更适合放在单独的报警查询画面操作员可以按日期、类型筛选历史报警记录。我在报警窗口里同时放了这两个构件上方用报警浏览按时间倒序列出所有触发的报警下方一个报警显示只显示当前生效的报警。有一点要特别说明——报警确认。MCGS的报警事件发生后如果在报警浏览构件上不点“确认”按钮即使当前故障消失了报警记录里仍会保留一条未确认记录。这在真实工程里是故意的设计防止操作员漏看报警。做仿真演示时要把这个交互画龙点睛地讲出来报警不只是弹出来看一眼还要人工闭环确认这才是工业报警的正确姿势。4.4 报警触发条件的脚本联动报警触发除了靠数据对象的属性设置还可以在循环脚本里写条件判断产生更复杂的报警逻辑。比如罐体液位太高时我希望进料泵自动停止脚本里可以写IF 罐体液位 液位上限 THEN 进料泵B 0 进料泵C 0 ENDIF这个逻辑放在运行策略的循环策略里循环周期100毫秒。一旦液位达到80%循环脚本会把泵断开同时液位继续缓慢上升到90%触发上上限报警。这样仿真过程就形成了完整的联锁——报警不只是“喊一声”而是会主动“动手处理”。这个细节在真实现场就是联锁回路在仿真工程里用脚本模拟出来原理完全一样。5. 曲线功能配置让历史看得见5.1 实时趋势曲线与历史趋势曲线的定位曲线功能是MCGS最直观的数据展示手段。实时趋势曲线显示当前变量在一段时间窗口内的变化像示波器一样不停滚动历史趋势曲线则是从存盘数据中读取过去某段时间的记录相当于回放。两者的底层机制不同实时曲线不依赖存盘历史曲线必须有存盘数据支撑。这句话记住后面排查历史曲线空白问题会省很多事。MCGS里有两个构件容易混淆实时趋势曲线和历史趋势曲线。它们都在工具箱的“曲线”分类里。实时趋势曲线构件专门用于展示实时数据历史趋势曲线构件则必须先配置历史数据来源。另外还有一个历史数据浏览构件功能更全面支持时间段选择、游标读数、数据导出适合做分析画面。5.2 存盘设置是历史曲线的前提历史曲线空白几乎都是因为数据对象没设存盘属性。在实时数据库里选中罐体液位、实际配比、B料累计量这几个需要回放的变量进入属性对话框找到存盘属性页勾选“周期存盘”存盘周期设为1秒。存盘周期的选择有讲究。周期太短数据量大一天下来几十万条记录容易占满存储空间周期太长曲线细节丢失液位快速变化时看得到台阶不连续。对饮料混合这种秒级响应的工艺1秒存盘够用了如果需要更细的分析可以设为500毫秒但要注意存储空间对应增大。仿真工程演示一两小时这点数据量完全没问题。5.3 实时趋势曲线的配置过程用户窗口放一个实时趋势曲线双击进入属性设置。曲线构件属性有“曲线”标签页里面有笔号、颜色、线型、数据对象等条目。一个构件可以同时显示最多6条曲线我配置了罐体液位和实际配比两条分别用蓝色和红色。时间轴设置上时间跨度我选了60秒这样液位从0涨到80大概需要两分钟左右60秒的窗口能看到上涨的中间过程有动态感。数值轴范围设为0到100对应百分比。曲线背景可以加网格运行时观察读数方便很多。运行时你会发现液位曲线先是一段平滑上升泵停后变成一条水平直线出料时又下降。曲线斜率的变化对应着工艺状态的变化这就是组态软件里“看到过程”的价值所在。我把实时趋势曲线放在单独画面不遮挡主画面同时配了一个数值显示构件显示曲线末点的实时值方便对照。5.4 历史趋势曲线的配置和回放历史趋势曲线构件的配置比实时曲线多一个步骤要先在构件属性里选“历史数据来源”数据对象然后同样添加曲线。运行后历史趋势曲线默认显示最近一段时间的存盘数据支持通过工具栏的放大、缩小、平移按钮去浏览不同时间段的走势。用历史趋势曲线看饮料混合仿真有个特别有意思的用法——对比批次。第一次运行进料泵B和C同时开液位上到80后停泵第二次运行我故意错开两台泵的启动时间先进B料再进C料。两条液位曲线放在同一时间轴上形状明显不同实际配比曲线的收敛速度也能看出差别。这个对比在演示“配比控制”效果时非常管用比单纯口述工艺逻辑生动得多。MCGS历史曲线还支持曲线游标读数把鼠标放到曲线上会显示对应时间和数值。在分析液位最高点、判断是否超限时这个功能比肉眼看坐标轴精确得多。我做仿真调试时频繁用游标去对报警出现的时间点和曲线拐点确认逻辑顺序确实正确。6. 仿真运行与常见问题排查实录6.1 让画面“活”起来的循环脚本饮料混合仿真最核心的脚本在运行策略里。新建一个循环策略循环周期设为100毫秒脚本内容如下IF 进料泵B 1 THEN 罐体液位 罐体液位 0.5 B料累计量 B料累计量 0.5 ENDIF IF 进料泵C 1 THEN 罐体液位 罐体液位 1.0 C料累计量 C料累计量 1.0 ENDIF IF 出料泵 1 AND 罐体液位 1 THEN 罐体液位 罐体液位 - 0.8 ENDIF IF 罐体液位 0 THEN 罐体液位 0 ENDIF注意C料流量设得比B料大这样实际配比天然达到30%左右——B料每周期加0.5C料加1.0总量1.5中B料占三分之一。实际配比的计算放在另一个策略里IF (B料累计量 C料累计量) 0 THEN 实际配比 B料累计量 / (B料累计量 C料累计量) * 100 ELSE 实际配比 0 ENDIF这套脚本就是整个仿真的引擎。40次/秒的刷新频率液位上升速率大概是每秒0.75个百分点从0到80大约需要100秒节奏刚好适合演示。脚本调试的窗口在运行环境的“调试”菜单里可以实时查看变量值变化排查计算错误时非常方便。6.2 常见问题排查与速查表仿真跑起来之后常见的坑我基本都踩过一遍整理成表格供参考。现象可能原因解决办法液位动画不动填充构件没关联到液位变量检查动画连接里的数据对象名重新绑定液位超过100%后填充溢出液位变量超过映射上限脚本里加IF限制或者把填充映射范围设为0~150报警窗口一直空白数据对象没勾选允许报警在实时数据库报警属性页开启报警设置限值报警触发但没声音声音文件格式不支持改用WAV格式或者检查报警声音构件的事件关联历史曲线空白无数据数据对象没设置存盘周期在存盘属性页选周期存盘设置合理周期历史曲线数据断层存盘周期太长缩短到1秒或500毫秒脚本不执行循环策略没启用或周期太短确认策略循环周期检查启动循环策略选项画面切换无反应用户窗口名写错核对!ChangeWindow参数窗口名用英文或拼音其中一个最隐蔽的问题是MCGS里绑定构件时选择数据对象后如果实时数据库里后来把变量删了又重新建构件的绑定关系会断掉但界面上看不出来运行后就发现这里不显示、那里不报警。排查的时候要逐个构件重新选择数据对象很费时间。所以变量一旦建好轻易不要删除重建改属性比换变量稳妥得多。6.3 多个界面协同与演示节奏整套仿真工程我分了三个用户窗口主操作画面、报警查询画面、曲线分析画面。主画面上有三个切换按钮分别跳转到报警和曲线画面这两个画面各自带有返回按钮。这样演示时先在主画面启动进料看到液位上涨后切到曲线画面等液位接近上限时切到报警画面正好看到报警弹出和声音响起整套流程行云流水。演示时还有一个节奏技巧脚本里把泵的启动写在按钮按下事件里但搅拌机的启动可以稍微延后几秒再让操作员点。这样混合过程能分成两个阶段——进料阶段和搅拌阶段。配合实际配比曲线的变化观众能看到搅拌对配比均匀性的影响其实在仿真里搅拌不改变累计量但如果你在脚本里加上搅拌时配比向50%逼近的算法展示效果会更好。仿真模型是可以适当“理想化”的这没有关系。关键是把报警和曲线的整个链路练熟真实系统里的数据来源变了但显示、存储、报警的配置逻辑完全一致。我后来做现场项目时新增一个报警变量、加一条历史曲线基本都是对着仿真工程抄流程效率很高。6.4 工程部署与备份的补充经验仿真工程做完后如果想把它部署到真实触摸屏上需要先通过MCGS的“工具”菜单做编译下载。编译时注意勾选“支持工程上传下载”生成的文件直接拷到触摸屏的工程目录里。对于不带外壳的触摸屏可以通过以太网下载IP地址在设备窗口和设备属性里配置确保电脑和触摸屏在同一网段。另外工程备份是我吃了亏之后养成的好习惯。每次完成一个阶段性版本比如报警功能调通、曲线功能调通就用日期后缀另存一份工程文件。有一次我在仿真工程里改历史曲线配置改着改着把构件属性搞乱了幸好有前一天备份恢复后才继续。代码和组态工程都适用这条规则版本管理永远是救命的。MCGS这套工程做下来最大的收获不在画面多漂亮而在于把数据对象、循环脚本、报警、存盘、曲线这条完整链路跑通了。仿真阶段理不顺的逻辑到了现场只会更麻烦。趁报警和曲线功能都触发过、回放过、确认过把这套知识固化下来以后遇到涉及过程控制的HMI需求心里就有底了。最后分享一个我实际工作中的小技巧每次拿到一个新工艺做组态不要急着画画面先把工艺描述里的设备列表、控制点、安全条件全部翻译成数据对象列成表格和工艺工程师逐条确认。这一步做完后面80%的组态问题都不会发生。组态的功夫一半在工程之外这话放在饮料混合仿真上一样成立。