基于PLC的饮料灌装线控制系统设计与组态监控实现

发布时间:2026/10/3 4:33:00
基于PLC的饮料灌装线控制系统设计与组态监控实现 去年做了一条小型饮料灌装线的控制系统改造客户原来的设备就是几个按钮加中间继电器启动、灌装、停止全靠操作工盯效率低不说灌装量还不稳定。我的任务是把它升级成基于PLC的饮料灌装控制系统配套一台上位机组态画面操作工能直观看到设备状态、灌装次数、报警记录。整个项目从梯形图编程到组态画面联调前后大约两周时间踩了不少坑也总结出一些可以直接套用的经验。这篇文章就按实际推进的顺序把这段实现过程完整过一遍给正在搞非标设备、PLC毕设或者说想从纯编程过渡到上位机联调的朋友一个参考。1. 灌装线工艺需求拆解与I/O分配先搞清楚设备想干什么很多人拿到这种项目就急着写梯形图其实第一步应该是把工艺彻底吃透。我一般会先在现场蹲半天看操作工怎么手动完成灌装再把这套手动流程翻译成传感器信号执行机构动作的序列最后才落到PLC的I/O分配上。1.1 工艺流程灌装线不是灌满就行这条灌装线的基本流程是空瓶随输送带进入灌装工位一个光电传感器检测到瓶子到位后挡瓶气缸伸出让瓶子停下来灌装阀打开等瓶内液位传感器检测到液体到达设定高度时关闭灌装阀气缸缩回输送带把灌好的瓶子带走同时计数器加一。这里有个关键选择为什么用液位传感器而不是用定时器控制灌装量因为灌装泵的压力并不是恒定的管道阻力、液体温度都会影响流量。用固定时间灌装第一批可能刚好多第二批就会少根本保证不了灌装量一致。而液位传感器是直接测量瓶内液面位置的只要安装位置准确每瓶灌装量能做到肉眼可见的一致。这个道理很简单但很多毕设论文里写的还是定时灌装这里建议如果条件允许优先选择液位检测方案。除此之外系统还要求有自动循环、手动/自动切换、产量计数、满箱停机。满箱停机指的是灌装数量达到预设值后输送带自动停止操作工把整箱搬走再按启动继续。这个需求看起来是加分项实际上客户提出来之后对梯形图结构影响很大所以一定要在I/O规划阶段就把它考虑进去。1.2 传感器与被控对象的选型思路控制器我选的是三菱FX3U-32MR继电器输出型。选它的原因很简单项目不需要高速脉冲输出不需要模拟量模块就是普通的开关量逻辑控制FX3U在性价比和稳定性之间平衡得比较好而且后面跟组态软件通信时FX3U的编程口协议非常成熟资料多踩坑容易查。传感器方面瓶子到位检测用对射式光电传感器这里不建议用漫反射式。我见过不止一个项目用漫反射传感器检测透明玻璃瓶结果瓶身透光反射面不稳定信号时好时坏。对射式是一边发射一边接收只有瓶子真正挡住光路才输出抗干扰能力要强得多。液位检测用光电式液位开关或者电容式液位开关都行装在灌装阀出口侧位置要能微调方便现场调整灌装量。执行机构上输送带电机用接触器控制灌装阀用电磁阀挡瓶气缸用两位五通电磁阀额外留一个蜂鸣器做报警输出。整体结构不复杂但I/O点一定要留余量我这次用了大概十一二个点选型时故意选了32点的主机给后续可能增加的检测元件留了位置。1.3 I/O分配表与接线细节I/O分配是梯形图设计的地图分配得好不好直接影响程序可读性。我最终的分配表大概是这样的PLC地址元件代号功能说明类型X0SB1系统启动按钮常开数字量输入X1SB2系统停止按钮常闭数字量输入X2SQ1瓶子到位检测对射光电数字量输入X3SL1液位到位检测数字量输入X4SQ2灌装工位满瓶检测备用数字量输入X5SA1手动/自动切换开关数字量输入Y0KM1输送带电机接触器继电器输出Y1YV1灌装阀电磁阀继电器输出Y2HL1运行指示灯继电器输出Y3HL2报警指示灯继电器输出Y4YV2挡瓶气缸电磁阀继电器输出Y5HA1满箱蜂鸣器继电器输出接线时有两个容易忽略的点第一停止按钮X1一定要用常闭触点对应梯形图里用常开指令指令比如LD X1来串联。这么做的好处是如果按钮接线断了或者线被拉掉PLC会认为停止信号一直有效系统无法启动这种故障安全设计在设备维护中很实用。如果你把停止按钮接成常开线断了系统反而不知道那就危险了。第二传感器选型要注意PNP和NPN的区别。FX3U的漏型输入这是多数型号的默认接法要求接NPN型传感器公共端接0V。如果现场买到了PNP传感器输出高电平接到FX3U输入点上信号可能不识别需要加中间继电器转换或者改接为源型输入。这个细节在采购前就应该确认好不然到了现场就是额外工时的浪费。2. 梯形图主程序骨架启动、停止与输送带控制I/O理清楚之后梯形图就可以开始写了。我习惯先把系统级的骨架搭好也就是启动、停止、运行标志这一类最基础的东西然后再去写具体的工艺控制。骨架写好了后面的循环逻辑才有地方挂。2.1 启动停止与运行标志运行标志用辅助继电器M0来担任意思就是系统总运行状态。M0接通后输送带、灌装、计数这些动作才有资格执行。核心程序是这样LD X0 OR M0 ANI X1 OUT M0这四行是梯形图里最经典的自锁保电路X0是启动按钮按下M0得电M0的常开触点并联在X0上松开按钮后M0自己保持X1是停止按钮常闭触点按下时X1信号断开M0失电。这就是按一下启动按一下停止的基础逻辑。有些人会在M0回路里加急停X6、热继电器X7一类的串联常闭点这样任何保护动作都能直接切断系统运行。这次项目客户没要求急停按钮但我在X4留了一个备用输入点后期接急停完全够用。建议你做类似项目时不管客户要不要先把急停的I/O点预留出来梯形图里也把位置留好不做总比做不了强。2.2 输送带运行控制输送带电机Y0的逻辑看起来简单但有一个重要的互锁考虑灌装的时候输送带必须停止否则瓶子会边走边灌液位检测根本没意义。所以我在Y0的回路里串联了灌装阀Y1的常闭触点LD M0 ANI Y1 OUT Y0意思很明确系统运行且灌装阀关闭时输送带才运行一旦灌装阀Y1打开Y0立即断开。这个互锁用梯形图的元素天然实现而不需要额外分支这就是梯形图的硬件级逻辑优势。这里要注意定时器/扫描周期的理解。有人会问Y1和Y0都在程序里改了输出会不会存在一个扫描周期里两个同时通的情况三菱PLC的程序从上到下扫描执行到Y0回路时如果Y1还没来得及刷新输出Y0可能会误接通一个扫描周期。但对于几十毫秒级的机械动作来说这个周期完全可忽略电磁阀和接触器的机械响应速度比扫描周期慢多了。除非是精密同步场景才需要考虑输出刷新和特殊指令的问题。2.3 手动/自动切换的总思路主程序里除了启动停止还有一个重要的逻辑是手动模式。客户要求操作工在检修和试机时能单独控制输送带、灌装阀。我用X5作为手动/自动切换开关X5断开是自动模式X5接通是手动模式。手动模式下M0依然有效但自动状态的执行被屏蔽。我额外做了一个手动点动回路LD X5 AND X10 OUT Y1X10是手动灌装按钮按下就开阀松开就关阀。这条回路和自动回路之间要注意输出竞争问题。三菱PLC中同一个线圈Y1如果在程序里出现两次OUT后面的会覆盖前面的结果这是梯形图的大忌。所以我对手动和自动灌装的逻辑采用了集中输出处理把Y1的最终输出放到程序最后统一计算手动模式下自动条件为0Y1只跟随手动按钮自动模式下相反。这段经验在初学阶段很容易踩在多个地方写OUT Y1程序编译不报错但行为完全不对排查起来特别费劲。我的建议是任何一个输出线圈在程序里只在最后一个区段统一写一次OUT前面全部用中间继电器M去组合逻辑条件。3. 梯形图核心循环用STL状态器实现到位—灌装—放行主程序骨架搭好后核心工艺循环是这条灌装线的灵魂。这一步我直接采用三菱的STL步进梯形图指令而不是用一大堆置位复位指令。原因后面会说。3.1 为什么用STL而不是纯置位复位纯置位复位的写法也能实现顺序控制比如SET Y1RST Y4但一旦工艺步骤超过五个程序的可读性就会急剧下降。维修工排查故障时很难从一堆SET/RST里判断当前设备处于哪个阶段。而STL指令天然把程序按状态划分每个状态一个区块当前执行到哪一步一看状态继电器就知道。这就像用章节号代替散落的一堆便签对后期维护的意义非常大。三菱FX3U的步进梯形图离不开状态器S。初始状态用S0自动工艺流程可以用S20、S21、S22这样的编号与手动、报警这些普通逻辑区分开。STL的另一个好处是只有当前激活的状态块会被扫描执行其他状态的输出自动断开这正好满足工艺上要么输送带运行、要么灌装开阀的互斥需求不需要额外写一堆互锁触点。3.2 完整灌装循环的状态转移实现我的灌装循环设计了四个状态S20等待/输送带运行S21灌装进行中S22灌装保持/关阀延时S23阻挡气缸释放/瓶子离开。完整逻辑如下; 初始状态S0 LD M0 ANI S20 OUT S0 STL S0 LD M0 AND X2 SET S20 RET ; S20输送带运行等待瓶子到位并稳定 STL S20 OUT Y0 LD X2 AND M0 OUT T0 K5 ; 0.5s稳定延时 LD T0 SET S21 RET ; S21灌装状态挡瓶气缸伸出、灌装阀打开等待液位信号 STL S21 SET Y4 ; 挡瓶气缸伸出 SET Y1 ; 灌装阀打开 LD X3 ; 液位到位 SET S22 RET ; S22灌装阀关闭保持一段时间让液面稳定 STL S22 RST Y1 ; 关闭灌装阀 OUT T1 K5 ; 0.5s保持 LD T1 SET S23 RET ; S23挡瓶气缸缩回等待瓶子离开 STL S23 RST Y4 ; 挡瓶气缸缩回 OUT T2 K3 ; 0.3s离开延时 LD T2 SET S20 RET这套代码在梯形图软件里完全可以原样翻译成步进梯形图块。几个关键点说一下第一S21里我用SET Y4和SET Y1而不是OUT Y4和OUT Y1。这样做的目的是让这两个输出在S21生效后一直保持直到我在后续状态里用RST把它们复位。因为STL状态转移本身不会自动切断SET过的线圈我需要显式复位。相反S20里的OUT Y0是普通输出离开S20后Y0自动断开这个特性正好满足灌装时输送带停的互锁要求。第二T0延时0.5秒是必须的。光电传感器检测到瓶子的瞬时瓶子其实还在输送带上往前跑没有完全停稳如果立刻伸出挡瓶气缸瓶子可能被气缸撞歪导致灌装阀对不准瓶口。加0.5秒延时后瓶子基本到位气缸再伸出去才稳。第三为什么要在S21状态里直接用X3置位S22因为X3是液位信号液位到达后X3会保持ON我必须在X3第一次上升沿时就完成状态转移这样才能保证计数准确。如果你把X3当成普通条件去触发计数它一直接通期间可能会产生重复计数。利用STL状态条件LD X3 / SET S22来转移整个过程只转移一次天然避免了重复计数问题。3.3 产量统计与满箱停机产量统计是客户提的明确需求我用计数器C0实现设定灌装数量K500灌满500瓶后停止自动循环并报警。LD X3 AND S21 OUT C0 K500 LD C0 OUT M2 ; 满箱标志这里再次强调计数指令的执行条件是X3的上升沿还是X3的持续电平因为我把这条计数逻辑写在了STL指令之外而X3在灌装过程中可能持续ON直接计数会乱掉。所以我用AND S21做条件意思是只有在S21灌装状态下液位信号X3从OFF变成ON的那一瞬间计数器加一。每瓶只会进入一次S21每次进入只会产生一个X3上升沿所以计数准确。满箱停机我是这样实现的M2置位后接通报警输出Y3和蜂鸣器Y5同时用M2的常闭触点串联在M0自锁回路里这样M2一置位M0就断开整个自动循环停止。这里有个小细节M2置位后不能靠继续灌装自动复位我把复位满箱标志做到了启动按钮X0上按启动时顺便RST M2这样操作工搬走整箱后按一下启动系统就能继续下一轮。最后为了防止在手动模式下误触发自动状态我在程序开头加了一段初始化LD M8002 ; 三菱PLC上电脉冲 ZRST S20 S23 ; 复位所有自动状态 OUT S0同时自动循环的启动条件里必须加上X5手动/自动切换开关处于自动位也就是X5的常闭触点。这些条件叠加后手动模式下无论如何都不会跳入自动状态。4. 组态画面搭建从变量表到动画连接梯形图写完并在线模拟通过之后就开始做上位机组态画面。这一步对很多做PLC的人来说是个坎其实组态软件跟PLC编程完全是两种思维PLC侧是扫描执行逻辑组态侧是事件驱动画面刷新。两者靠变量和通信搭桥。4.1 组态软件选型与通信建立我这次用的是MCGS嵌入版组态软件因为它和三菱FX系列PLC的驱动非常成熟驱动协议直接走FX编程口一条编程线就能连上不需要额外买通信模块。通信设置方面MCGS的设备窗口里添加三菱FX系列编程口驱动串口号选择电脑上实际识别的COM口波特率9600数据位8偶校验停止位1PLC站号默认0。这里有一个我在项目里反复遇到的现象设备窗口打开后驱动状态一直显示打开设备失败。排查套路基本是固定的先确认USB转编程线有没有被电脑识别设备管理器里COM口号是多少。把MCGS里串口号改成设备管理器里显示的COM口不要猜。确认PLC侧通信参数FX3U默认波特率是9600但有些老设备被人改过参数需要用GX Works读一下PLC参数里的通信设置。如果用了第三方的USB转RS422线存在兼容性问题换一根原装SC-09线再试。在设备窗口里把采集周期适当调大从默认的100ms改成500ms有时通信失败只是因为上位机请求太频繁PLC编程口忙不过来。通信一旦成功MCGS就能在设备窗口里读到PLC的X、Y、M、D等软元件值。这时就可以进入下一步的变量映射。4.2 画面分层主画面、监控画面、报警画面组态画面最忌把所有东西堆在一个页面上操作工想看什么都有但其实什么都看不清。我按使用场景把画面分成了四层主画面是设备整体布局画一条输送带、几个瓶子、灌装阀、灌装头操作工一打开屏幕就知道设备长什么样。运行监控画面显示当前运行状态比如输送带是否运行、灌装阀是否打开、当前产量数值、设定产量数值。报警画面专门显示报警信息包括满箱报警和传感器故障提示。产量趋势画面用实时曲线显示每小时的灌装数量这个对于客户统计产能很有用。每个画面之间通过用户窗口跳转按钮连接操作工点击按钮就能切换。MCGS里做这种跳转很简单放一个按钮控件在脚本程序里写一行窗口切换命令就行。4.3 变量映射和动画连接细节组态画面和PLC数据之间的桥梁是实时数据库里的数据对象。我在MCGS里建立了这样一组对应关系PLC软元件组态数据对象画面用途X2瓶子到位主画面瓶子位置指示灯Y0输送带运行输送带动画填充颜色Y1灌装阀开灌装阀图形颜色变化Y3报警指示报警画面状态灯M2满箱标志满箱提示和蜂鸣D0当前产量数值显示控件其中D0这个当前产量我在PLC里加了一条转移指令让计数器C0的值实时传送到数据寄存器D0LD X3 AND S21 MOV C0 D0这样每次满瓶计数的瞬间C0的值就会被复制到D0组态画面里的数值显示控件直接关联D0就能看到当前产量。比直接在组态侧做累加脚本要可靠因为PLC侧的计数才是真实产量组态做累加有可能因为通信刷新丢数据而算错。动画连接的细节我拿灌装阀开举例在MCGS主画面里画一个阀门形状的图形对象选中它在动画连接里配置填充颜色属性当灌装阀开这个数据对象为1时图形填充成绿色为0时填充成灰色。其他的电机运行、报警状态灯也都是类似的套路。瓶子在输送带上的移动效果纯开关量其实做不出平滑位移动画。如果非要炫一点可以做一个位置移动动画但驱动条件得靠模拟量或计数器变化用X2这种开关量只能做跳变。我最终选择不在画面上显示瓶子位置连续移动而是用一个到位指示灯表示当前是否有瓶在灌装位这个信息对操作工足够实用了。4.4 报警和历史记录的处理满箱报警和传感器故障报警我用MCGS的报警控件来实现。组态脚本里写If 满箱标志 1 Then 报警内容 灌装达到设定数量请更换储瓶箱 报警指示 1 EndIf历史记录方面MCGS有自带的实时数据库存盘功能。我在实时数据库里给当前产量报警指示这几个对象开启了允许存盘然后组态一个历史曲线控件就能看到产量随时间的变化曲线。这个功能客户非常满意因为以前只能靠人工记录现在随时能查。5. 联调阶段的实际问题地址映射、液位抖动和通信失败程序写完、画面做完不代表项目结束联调才是真正考验水平的阶段。我们这台设备在联调时遇到了好几个非常典型的问题我把排查过程和解决经验写下来。5.1 通信半通不通能读Y读不到XMCGS和设备连上后主画面里电机、阀门的颜色都能正常变化但瓶子到位这个点始终是灰色操作工很纳闷我也觉得奇怪。后来查下来是地址映射的坑三菱FX驱动里X输入端口的通道地址跟Y输出端口不是连续编的有的版本驱动里X0对应通道号0没错但有的版本需要给X地址加上基数偏移比如X0对应通道号1024之类的。这个问题的排查思路是先读Y0和M0如果这些软元件都正常说明通信链路没问题问题出在特定软元件的地址解析上。此时打开MCGS设备调试窗口手动填几个不同的通道号去试探观察能否读到X2的变化。最后我在驱动说明里找到了X地址的基址规则把设备通道重新配置后X2信号就正常了。这件事给我的教训是组态软件的地址映射一定要先查驱动的官方通道表不要凭直觉填。每个组态软件、每个PLC驱动对X、Y、M、D的通道号偏移规则都不一样。5.2 液位传感器抖动导致的重复灌装液位传感器在灌装刚开始时液面会有波动X3信号在PLC看来会闪几下这就导致一个问题有时候瓶子还没灌满X3却瞬间抖动了一下PLC认为液位到位了直接关闭灌装阀。结果是前面几瓶灌装量偏少。我通过趋势图发现这个问题后在梯形图里加了一个去抖延时。具体做法是把X3信号先经过一个延时导通定时器T10只有X3持续接通0.2秒以上才认为液位真正到位。改造后的转移条件变成LD X3 OUT T10 K2 LD T10 SET S22这个0.2秒的延时不会影响正常灌装因为正常灌装时液位到达后X3会一直保持ON只是过滤掉了那种几毫秒的抖动尖峰。类似的问题在光电传感器上也出现过我的处理方式是如果传感器离设备振动源很近尽量避免这样的安装位置或者用同样的去抖延时逻辑处理。5.3 组态采集周期对通信口压力的影响设备刚联调时我把MCGS的采集周期设成了100毫秒想着越实时越好。结果发现画面刷新很不流畅而且偶尔出现设备窗口报错通信超时。这是因为FX3U的编程口本身速度有限MCGS每100毫秒就要把所有关联的软元件读一遍通信口忙不过来形成堵塞。后来我把采集周期统一改成了1000毫秒也就是1秒刷新一次画面反而流畅了。对于开关量状态监控来说1秒的刷新延迟操作工完全感受不到只有报警提示我单独做了中断驱动的脚本保证了报警信息能及时弹出来。这算是一个不要过度实时的经验在RS485/编程口通信这种低速链路上尤其重要。5.4 手动模式切自动模式的状态残留最后一个坑是操作工发现的手动模式下他点动过一下灌装阀然后切到自动模式设备不会从初始状态开始跑而是卡在某个奇怪的状态里没动作。原因很简单手动阶段我用的辅助继电器M1被置位了切换到自动后M1这个状态残留导致自动循环的判断条件被干扰。解决方法是在手动/自动切换指令的后半段加入一个状态初始化逻辑在自动模式激活的上升沿时把所有手动用的辅助继电器和自动状态器全部复位LD X5 ANI X6 ZRST M1 M10 ZRST S20 S23这样操作工每次从手动切到自动系统都会从干净的初始状态重新开始不会再出现上一轮没走完下一轮被卡住的尴尬局面。6. 现场调试收尾时值得留心的几件事联调完成后设备试运行了三天整体稳定后面还做了一些小的完善。这个环节虽然没有太多技术难点但有些习惯对项目交付特别重要单独拎出来说。6.1 梯形图注释和I/O标签一定要写全我接手过不少别人写的PLC程序最头疼的就是没有任何注释一段梯形图里全是X0、Y1、M3这样的数字。三菱GX Works里可以对软元件做注释我这次把所有I/O点都加了中文标签比如X2瓶子到位光电Y1灌装阀M2满箱标志。每个状态块前面也都写了工艺说明。做完这些后期客户自己厂里的电工也能看懂改动逻辑不用每次出问题都找我。6.2 用组态画面反推排查故障比万用表快联调过程中我总结了一个特别实用的排查方法当设备报故障时先不拿万用表去量触点而是打开组态画面看对应信号的状态。比如操作工说按了启动没反应我先看画面上系统运行指示灯有没有变绿。没变绿再看启动按钮对应的输入信号在画面里有没有闪烁。如果启动按钮信号都没显示那问题可能出在按钮触点或输入接线如果显示有信号但运行灯不亮那就要查PLC程序里的启动条件。这套方法把故障范围从整个电气柜缩小到了PLC程序某个条件排查效率高了很多。尤其是那些时好时坏的接触不良组态画面能帮你捕捉到瞬间的信号变化比拿万用表盯着表笔方便得多。6.3 后续扩展从开关量控制走向更完整的产线数字化这套灌装控制系统做完后我心里一直有下一步的扩展计划。现在只做了开关量控制和基础产量统计如果要让设备的适用性更强有几个方向很明确一是输送带电机改变频控制通过模拟量模块输出0-10V或4-20mA信号控制电机转速不同瓶型、不同粘度的液体对应的最佳运行速度不同能做到更精细的调节。二是液位信号从开关量换成模拟量液位传感器这样灌装量不再是到线就停而是一个能够连续监测的数值配合PID调节程序灌装精度能上一个台阶。三是PLC和MES系统对接通过标准通信协议把产量数据、设备状态、报警记录上传到车间中控室这是很多工厂做数字化改造都会提的需求。这些扩展方向我在I/O规划阶段就做了预留比如主机选用32点、多留了输入点、通信口没有占用这些都需要提前想清楚不然后期升级成本会很高。整套系统试运行下来我对PLC梯形图解决控制逻辑组态画面解决人机交互这个分工的理解又深了一层——两者不是孤立的两块而是同一个自动化系统的一体两面梯形图的每一个状态变化都要能反映到画面上画面的每一次操作也要能准确传递到PLC里。能做到这一点项目离好用就不远了。