接了个小项目的活儿,给一套两泵交替运行的气力除灰系统做控制,从PLC梯形图到MCGS组态基本上一人包圆。这套系统要说复杂也不算复杂,两个仓泵、四个电动球阀、两个气动阀、几路模拟量,自动循环加上故障联锁,但真正从梯形图一路写到组态画面,中间踩的坑比想象中多得多。
趁项目收尾还有记忆,把整个过程捋一遍:为什么选这套方案、梯形图里哪些逻辑容易写错、组态软件配置变量和通讯时有哪些容易忽视的细节,还有现场调试时查过的那些疑难杂症。不管是正在做课程设计的学生,还是被安排维护除灰系统的工程师,或者是想从零手搓一套小型PLC控制系统的朋友,这篇文章里应该有对你有用的东西。
1. 项目背景与整体方案设计
1.1 除灰控制系统到底在控制什么
气力除灰是电厂、水泥厂、化工厂里常见的粉状物料输送方式,基本原理不复杂:除尘器收集下来的灰通过进料阀进入仓泵,达到一定料位后关闭进料阀;然后向仓泵内通入压缩空气,压力升到设定值后打开排料阀,灰被压送到远处的灰库;排料结束后排空仓泵内余气,回到初始状态,开始下一轮循环。
控制系统的任务就是把这个循环管好:进料阀、进气阀、排料阀按顺序动作,同时监视料位、压力、阀位反馈,异常时及时联锁停机并报警。项目里是两台仓泵,要求自动运行时交替循环,这样输灰效率高,系统不空等。
为什么非要“手搓”?当时市面上成套的除灰控制柜报价不低,而且程序逻辑对方不给开源,后期想根据现场情况调整就得加钱。自己用PLC加组态软件做,硬件成本不到成套方案的零头,程序完全掌握在自己手里,加联锁、改参数都方便。这种小规模系统用通用PLC做,技术上完全够用,没必要上专用的除灰控制箱。
1.2 方案选型:PLC、组态、通讯方式
PLC选了常见的日系小型机,我用的三菱FX3U,理由很直接:指令入门容易,SFC和步进指令天生适合顺序控制,价格也合理。上位机组态选了MCGS通用版,理由同样实用:
- MCGS支持三菱FX系列串口和以太网驱动,自带实时数据库和历史存储,不需要额外写代码。
- 画面组态用拖拽方式,能快速做出设备流程图,适合一个人赶工期。
- 资料多、网上教程和案例多,遇到问题好查,不像某些组态软件文档写得云里雾里。
PLC与上位机的通讯方式,有条件就直接上以太网。FX3U本体没有网口,我加了一块以太网模块;如果预算紧张,串口RS422也能做,但速率慢、容易受干扰。现场实地调试时你会发现,以太网通讯排查起来比串口省心太多,ping一下就知道通不通。
为什么不选Qt做组态?Qt做组态首先要自己解决设备图元库、变量驱动、数据采集线程、历史存储、报警系统,这一整套下来没有几个月下不来。它适合有特殊定制需求或者想做产品化的场景,手搓一个项目没必要给自己加这种难度。Web组态(比如基于HTML5的2.5D设备库方案)更适合远程可视化、大屏展示,但中小型除灰项目只要本地控制,MCGS足够。
1.3 硬件拓扑与控制柜布局
硬件组成不算多:PLC主单元FX3U-32MR(16输入16输出)、模拟量模块FX3U-4AD(4路4-20mA输入)、以太网模块FX3U-ENET,再加上中间继电器、断路器、开关电源和一台工控机跑MCGS。
I/O分配是开工第一步。输入侧有进料阀开到位/关到位、排料阀开到位/关到位、料位计高料位、手动/自动旋钮、启停按钮、压力变送器4-20mA信号。输出侧有进料阀开/关指令、进气阀、排料阀开/关指令、气源电磁阀、运行指示灯和报警灯。
有个选型经验可以分享:如果你只是做本地显示,用带MCGS嵌入版的触摸屏一体机更省事;但如果要远程监控和趋势记录,工控机加MCGS通用版更灵活,而且MCGS通用版可以跑在普通电脑上,调试时直接插笔记本就能看画面。
2. 梯形图编程:核心逻辑与踩坑实录
2.1 先把工艺动作转换成状态图,再谈编程
拿到需求不要急着打开编程软件,我习惯先画“状态转移图”。这套除灰系统的工艺循环可以拆成这几个状态:
S0 初始状态,等待启动信号 S1 进料状态,开进料阀,等待高料位信号或进料超时 S2 加压状态,关进料阀,开进气阀,等待压力上升到上限 S3 输送状态,开出料阀,保持进气,等待压力落到下限或输送超时 S4 排空状态,关出料阀、关进气阀,开排气阀,等待压力回零 S5 回到S0,自动模式下切到另一台仓泵,开始下一轮
画状态图最大的好处是逻辑分支一目了然。特别容易漏的是异常跳转:仓泵在进料过程中压力突然高了怎么办?排料过程中料位计卡在高位怎么办?这些边界分支不提前想清楚,写出来的程序就是“主流程能跑,异常就乱套”。
另一个经验是:状态图必须带超时保护。任何一步卡住(阀门不到位、压力上不去),系统必须在设定时间内报警并跳安全状态,否则轻则堵管,重则设备损坏。这个习惯帮我在后面省了很多现场调试时间。
2.2 顺序控制的两种实现方式:STL步进指令 vs 置位复位
三菱FX系列有STL步进指令,专为流程控制设计。用STL实现状态图非常自然,每一状态对应一个S状态位,动作和转移条件写清楚就能跑。我最终用这种方式,在GX Works里按状态图逐块编写,每一块对应一个状态,转移条件就是各输入信号的组合。
另一种常见方案是“置位复位+M辅助继电器”方式:用M辅助继电器表示当前状态,状态切换就是RST旧状态、SET新状态,再配合TON定时器做延时。
两种方式的取舍参考:
| 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| STL步进指令 | 状态结构清晰、流程修改方便、便于评审 | 对初学者有理解门槛、转移条件需严格互斥 | 顺序控制明确、状态较多的流程 |
| 置位复位+M | 灵活、逻辑不受指令限制、支持复杂分支 | 状态多了容易乱、可读性差 | 简单流程、状态少或需要混合逻辑 |
除灰系统既有时间条件又有压力、料位等输入条件,我选了STL方案。实际写下来,后面加联锁、加手动/自动切换,都是在对应状态块里加行,改动范围小,不容易碰坏其它逻辑。网上有人问“三菱SFC怎么转换成梯形图”,其实在GX Works里可以直接建SFC程序,也可以先画SFC再转换为梯形图块,这一点我建议新手上手先用梯形图块配合STL指令,比直接画SFC更直观。
2.3 双线圈、扫描周期与联锁保护
踩的第一个大坑就是双线圈。“双线圈”指的是同一个Y输出在多段梯形图里被OUT指令赋值两次以上。PLC扫描是从上到下逐行执行的,后执行的那次赋值会覆盖先执行的结果。
比如进料阀开输出Y0,自动程序里写了OUT Y0,手动程序里也写了OUT Y0,自动模式下如果手动程序段里的条件也满足了,结果是后扫描到的那段说了算。这个问题在现场表现很随机,有时好使有时乱动,排查起来非常头疼。
正确做法是:程序里不直接OUT Y输出,而是把控制结果汇总到M辅助继电器,最后在程序结尾统一把M映射到Y。例如:
LD M100 OR M110 ANI M120 OUT Y0这样Y0只被赋值一次,逻辑全部集中在M区,排查起来也方便。控制逻辑和物理输出分开,这个习惯我一直保持。
扫描周期也要注意。PLC扫描周期通常几毫秒到几十毫秒,高速动作的联锁如果判断条件分布在较长程序段里,可能延迟一个扫描周期才能生效。对除灰这种秒级动作的系统,延迟一个扫描周期问题不大,但不要在程序中间修改自己本轮扫描中刚用到的状态位,否则容易出现“同一周期前后不一致”的怪问题。
联锁保护是这套系统的命根子。我设计了三路与状态无关的独立联锁段,任何状态下都生效:
- 联锁1:压力大于0.35MPa,直接切故障状态,关进气阀。
- 联锁2:开出料阀指令后15秒内开到位信号没来,判断阀卡涩,报警并自动关闭进气阀保压。
- 联锁3:进气阀开指令执行5秒后压力仍低于0.05MPa,判断气源压力不足,报警提示。
这些联锁是调试过程中不断补出来的。第一次上电试运行,排料阀卡滞导致仓泵压力憋到0.5MPa,机械安全阀直接跳了。当时才意识到,联锁设计不能只停留在“主流程跑通”,异常兜底才是控制系统的价值。
2.4 三台电机顺序启动逆序停止的经典逻辑
项目里输灰系统配了三台气源风机,要求顺序启动、逆序停止:启动顺序M1→M2→M3,每台间隔5秒;停止顺序M3→M2→M1,每台间隔5秒。这个题目在很多招聘笔试里出现过,实际项目里也确实常用。
实现思路不复杂。启动条件:按下启动按钮,且当前处于“未启动”状态。启动过程用两个定时器做延时,每5秒投入一台电机。停止过程反过来,先停M3、再停M2、再停M1。
关键点在于:启动过程中按了停止按钮怎么办?停止过程中按了启动按钮怎么办?必须用一个“正在启动/正在停止”的状态锁存,让两种操作互斥。否则就会出现启动到一半被打断,设备状态混乱的问题。
我用了M区状态位实现:
- M101=启动中,M102=停止中。
- 启动按钮:SET M101,RST M102,前提是M102为OFF。
- 停止按钮:SET M102,RST M101,前提是M101为OFF。
- 启动中:T0定时5秒到,M1保持运行,M2输出ON并重新启动T0;再5秒后M3输出ON。
- 停止中:T1定时5秒到,M3先停,M2保持运行;再5秒后M2停,M1最后停。
每一台电机输出都要串上“启动中/停止中”对应状态位,并且附加故障输出OFF的联锁。比如风机过载热继电器动作,必须无条件停掉对应风机,还要把后面未启动的电机锁死,防止二次启动。
这里我反而建议用M加定时器方式而不是STL。因为启停流程是纯时间顺序,没有输入条件判断,用定时器链更直接。顺序启动逆序停止的梯形图网上版本很多,但大多没有处理启动/停止互斥的细节,这是实际项目里最容易出问题的地方。
2.5 模拟量处理与比较指令
FX3U-4AD模拟量模块接收4-20mA压力变送器信号,转换后的数值范围通常是0-4095。我把量程设置为0-1.0MPa对应0-4095。
换算公式很简单:实际压力(MPa)= 数字量 / 4095 × 1.0。
但FX3U做浮点运算相对麻烦,实际上我用的是整数运算:先把数字量乘以1000再除以4095,得到0-1000的“千分值”,组态画面上直接除以10就显示成MPa。指令写法大致是:
MUL D100 K1000 D110 DIV D110 K4095 D112这样D112里就是千分压力值,组态读取后显示为“xx.x MPa”。PLC侧比较时直接用D112和设定值比较,比如压力上限350对应千分值350。
模拟量滤波是必须做的。现场压力信号在阀门动作瞬间会有波动,直接用原始值做比较容易误动作。我做了滑动平均值处理:每100ms采样一次,把最近10次采样的平均值作为当前值。数字滤波虽然不能完全替代硬件滤波,但对这种秒级响应的系统足够。
还有个容易踩的坑:模拟量模块通道地址没弄对。FX3U-4AD通过FROM/TO指令读取缓冲存储区,通道1的地址是BFM #5,通道2是#6。我第一次把两个通道读反了,调试时发现压力值一直显示另一个点位的数值。后来养成习惯,先给每个通道单独强制加信号,确认地址无误再往下做。
2.6 梯形图调试:仿真和实物的差别
梯形图写完,先用GX Works的仿真功能跑一遍逻辑。仿真时可以用软元件测试功能故意给M、D赋值,模拟传感器信号,把主逻辑跑通。但仿真毕竟不是实物:
- 仿真不知道实际IO的响应时序,比如开关阀门需要几十秒,仿真里瞬间就到位了。
- 仿真不好模拟模拟量跳变、通讯延迟这类实际问题。
- 仿真的扫描周期与实际硬件有差异,联锁时序问题只能在现场暴露。
所以我的调试顺序是:先仿真跑主流程和异常分支,再上真机空载测试(不接真实阀门,用按钮模拟到位信号),最后接真实阀门带压测试。空载测试这一步能发现大量接线和地址映射问题,千万不要省。
现场调试时我喜欢用GX Works的在线监视功能,一边看梯形图状态(绿色高亮表示导通),一边强制M变量模拟条件。组态画面那边同步看效果,两边对照,排查效率高很多。
3. 组态软件选型与画面搭建
3.1 为什么选MCGS而不是自己写
MCGS组态软件分通用版和嵌入版,通用版跑在Windows上,适合配合普通电脑或工控机;嵌入版跑在触摸屏里。这次用通用版,原因是需要数据历史记录和灵活的报表功能。
对比一下市面常见方案:
| 方案 | 上手难度 | 成本 | 适用场景 |
|---|---|---|---|
| MCGS组态 | 低 | 较低 | 中小型系统、国产触摸屏/工控机配套 |
| 组态王 | 中 | 中 | 国内老项目多、资料多、生态成熟 |
| WinCC | 中高 | 高 | 西门子生态、大型项目、与TIA深度集成 |
| Web组态(自研HTML5/2.5D设备库) | 高 | 开发成本高 | 远程监控、大屏展示、产品化需求 |
| Qt自研组态 | 高 | 开发成本高 | 特殊定制、无现成组态可用 |
对除灰控制系统这种中小型项目,MCGS已经能覆盖:设备通讯、实时数据库、画面动画、报警、趋势、用户权限,全都有。上手周期大概一到两周。如果项目要求高,比如上百个变量、大量历史报表、复杂用户权限分级,再考虑组态王或WinCC也不迟。
3.2 设备通讯与变量连接
MCGS里最核心的两块是设备窗口和实时数据库。先添加设备驱动:我用的是三菱FX系列以太网驱动,通讯参数要填对:PLC IP设为192.168.1.10,工控机IP设为192.168.1.20,同一网段。通讯周期建议500ms左右,太快会增加PLC负担,太慢画面会卡顿。
然后建立设备通道,把PLC里的D、M、X、Y映射到MCGS通道。这个项目主要用的通道:
- Y输出状态:运行指示、故障指示。
- D112:压力实际值(千分值)。
- D120:当前状态编号,方便画面上显示“进料中/输送中”等文本。
- M区状态位:手动/自动、报警状态等。
实时数据库变量与通道绑定后,画面图元才能通过变量取数。这里有几个隐蔽的坑:
第一个是地址偏移。不同驱动的地址对应关系有区别,有的驱动D0对应PLC的D0,有的驱动从D1开始对应PLC的D0。建立通道后一定要先在设备调试里读一下,确认数值对上了再继续做画面。
第二个是变量属性设置。MCGS变量有“读写”属性,按钮需要写入的变量必须设为读写,否则运行后点击按钮没反应。这个坑很隐蔽,因为在组态环境里按钮能拖能保存,就是运行时不动作。
第三个是通道类型匹配。D是字寄存器,M是位寄存器,搞混了画面会显示一堆乱码或常量。建立通道时选错数据类型,排查起来非常费时间。
3.3 画面设计:从操作员的视角出发
画面不是给自己看的,是给现场操作工看的。操作工不需要看懂梯形图,也不关心程序怎么写的,他要的是“现在设备什么状态、下一步该干嘛、有问题点哪里报警就出来”。
我做的画面结构分五个页面:
- 系统总览:整个输灰流程图,两台仓泵、管道、阀门、风机全部画出来,用颜色区分运行/停止/故障。
- 单泵操作画面:手动/自动切换、各阀手动动作按钮、当前流程状态显示。
- 参数设置画面:压力上下限、进料时间、输送超时时间等设定值,可从组态写入PLC。
- 报警画面:实时报警列表、历史报警查询、报警确认按钮。
- 趋势画面:压力实时趋势、历史趋势曲线。
图元用MCGS自带图形库拼,管线用线段,阀门用圆形加颜色变化。在动画连接里设置“颜色动画连接”:Y0为1时阀门图元变绿色,为0时变灰色。这样操作工一眼能看出哪个阀是开着。
操作权限设置了三档:操作员、工程师、管理员。操作员能手动开关阀、切换自动手动;工程师能改参数;管理员能修改用户权限。按钮上做了安全确认弹窗,防止误触。
我个人觉得,画面设计最容易被新手忽略的是“当前状态文本显示”。在一堆图形动画里,直接显示一行文字“1号仓泵:输送中”,比各种颜色动画都直观。我在组态里用条件判断脚本,根据D120的值显示对应状态文本,操作工反馈特别好。
3.4 报警与趋势曲线
MCGS报警功能配置不复杂。在实时数据库里给需要报警的变量建“报警组”,设置上限/下限或上下限值,报警类型选“开关量报警”或“数值越限报警”。运行时报警自动记录时间、变量名、当前值、报警类型。
这个项目配置的报警项:
- 压力高报:大于0.35MPa。
- 气源压力低报:小于0.05MPa。
- 阀开到位超时:开出料阀指令后15秒未到位。
- 风机过载:热继电器动作。
- 通讯故障:PLC通讯断开。
报警记录默认存MCGS自带数据库。建议在运行策略里配置“数据对象”定时存储,把关键数据周期性写入数据库,方便事后查曲线。
趋势曲线的坑很典型:历史趋势曲线显示空白。多半原因是变量没有配置“数据存盘周期”,或者存盘周期没启动。把变量加进存盘数据组,存盘周期设1秒,重新运行工程就有了。实时趋势曲线要设置采样周期,一般1秒就够。
3.5 组态画面“动起来”的调试
组态做完不要直接上真机,先用MCGS自带的模拟运行方式。把PLC侧程序停掉,MCGS用模拟设备驱动或直接给变量赋测试值,看画面动画是否按预期变化。这一步能过滤掉80%的变量地址错、动画连接错的问题。
上真机调试时,打开MCGS设备调试窗口,逐个看PLC侧变量值是否正常刷新。我习惯在PLC程序里加一段测试逻辑:上电后D120自动置1、2、3循环,这样不操作外部设备也能用组态观察状态显示是否正常。测试完记得把这段逻辑删掉,否则现场跑起来状态会乱跳。
还有一点:画面刷新速度设置不要太激进。MCGS画面扫描周期默认值一般够用,强行调小可能导致CPU占用率飙升,整个上位机卡顿,反而影响操作体验。这个参数在运行策略里调整,不要为了追求“实时”把系统搞死。
3.6 远程监控扩展:Web组态与2.5D设备库
最后说说Web组态。现在有一些开源的Web组态方案,基于HTML5、Canvas或SVG,适合做远程监控大屏,还有2.5D设备库能做出很漂亮的设备效果。但现实问题是:自己做Web组态要处理浏览器与PLC的通讯(通常需要中间网关或MQTT转发)、前端图元库、实时数据刷新、历史存储,工程量比本地组态大很多。
除非项目有明确的远程监控、大屏展示需求,否则没必要在起步阶段就上Web组态。如果后续要扩展,我建议在MCGS工程稳定运行后,用MQTT网关采集PLC数据,再对接前端可视化,两边互不影响。这样既有了远程能力,又不影响本地控制的稳定性。
4. 常见问题与排查技巧实录
4.1 PLC与组态通讯掉线
现象:画面所有数据停止刷新,报警记录里出现通讯故障,但PLC运行指示灯正常。
排查步骤一般是:
- 确认网络连接:在工控机上ping PLC的IP,不通就查网线、交换机、IP配置。
- 确认MCGS设备驱动是否在线:设备窗口里驱动状态是否显示正常。
- 确认通讯周期是否过短:500ms以下容易在高负载时超时,适当放宽到800ms。
- 确认是否有两个程序同时占用PLC通讯端口:MCGS在调试时,如果又开了GX Works在线监视,两个连接会互相挤占,导致掉线。
经验之谈:现场用过串口RS422通讯,距离超过30米后偶尔掉线,后来换以太网模块彻底解决。能用以太网就不建议用串口,尤其是需要长时间连续运行的除灰系统。
4.2 数据显示“#”或乱码
现象:MCGS画面里压力值显示“####”,按钮状态显示乱码,模拟量显示一个巨大数字。
原因基本是通道地址或数据类型配置错误。最典型的有这几类:
- D地址和M地址搞混。
- 16位有符号数和无符号数混用,压力值超过32767后变成负数。
- 模拟量数字量与工程量换算没做,直接显示4095这种原始值。
- 通道偏移一位:PLC的D100在驱动里配成了D101。
排查办法:打开设备调试窗口,看原始值是否正常;把变量删掉重新建立通道,不要图省事复制旧通道改地址,复制出来的通道经常带着旧配置,容易背锅。
4.3 定时器时间不准确
现象:进料延时设定60秒,但实际有时50秒有时70秒。
原因主要集中在定时器类型和调用方式上。FX系列定时器分100ms、10ms、1ms三种:T0-T199是100ms定时器,T200-T245是10ms定时器,T246-T255是1ms