PLC药片装瓶机控制系统:从选型到高速计数与抗干扰设计全解析
药片装瓶这个环节看起来就是把药片数一数、往瓶子里一倒、拧上盖子没什么技术含量。但真要把一台装瓶机稳定跑起来尤其是要应对药厂GMP验收、连续生产8小时不出错、换批次不用停机半小时里头的门道一点都不少。我去年完整做了一套基于PLC的药片自动装瓶机控制系统从硬件选型到程序逻辑再到和上位机通讯全都自己来。这篇文章就把整个设计过程、选型思路、程序架构和调试踩坑记录分享出来给正在做类似设备或者准备做PLC毕业设计、竞赛项目的朋友一个参考。不管是准备自己搭一台样机还是想理解工业设备控制系统的完整套路这篇的内容都能直接拿来用。1. 先搞清药片装瓶到底难在哪工艺流程与核心指标做控制系统之前我习惯先把机械动作吃透。很多朋友一上来就问“PLC选什么型号”“用哪种语言编程”其实这个顺序反了。算法和服务对象没搞清楚选再贵的CPU也是白搭。1.1 一台药片装瓶机的工作循环整套设备的基本动作流程大致是这样空瓶通过理瓶转盘排列整齐由送瓶螺杆推到工位瓶口对准下料通道挡料气缸打开药片从振动料斗/数片盘落下光电传感器对下落的药片逐粒计数达到设定粒数比如每瓶30片时电磁挡板立刻关闭装好药的瓶子被推入剔废工位系统检查是否有缺片、卡瓶合格瓶进入封盖机构拧盖、压盖最后经出瓶传送带送走进入贴标/装箱工序。整个过程看起来不复杂但有一个核心难点节拍快而且不允许错。药片落下的速度是很快的每秒可能掉10到20粒而且颗粒很小直径几毫米。如果用普通PLC扫描的方式去读光电传感器扫描周期哪怕只有10ms也很容易漏计数。另一个麻烦是灰尘和静电。药片在塑料下料槽里高速摩擦会产生静电吸附灰尘甚至导致传感器误触发药片本身的粉尘也会慢慢糊住光电传感器的镜头。这些都是实际项目里比编程更折磨人的问题。1.2 控制系统必须死磕的三项指标我给自己定了三条硬指标后续所有选型和程序设计都围绕它们展开指标具体要求对应设计措施计数精度每瓶粒数误差为0不允许缺片或多片高速计数中断 传感器信号滤波 末端复核生产节拍稳定运行不小于每分钟40瓶以30片/瓶为例气缸动作并行化、状态机缩短等待时间故障可追溯堵瓶、缺瓶、计数异常必须实时报警并记录完整的故障诊断逻辑 触摸屏报警画面 数据上抛这三条只要有一条做不到设备到现场就会被产线投诉。尤其是计数精度我后面试运行阶段真的被静电干扰坑过一次这个放到第5节详细说。2. 硬件平台的选型逻辑I/O统计表比CPU型号更重要我的习惯是先列I/O清单再反过来定PLC型号。很多新手是反着来的先买一块流行型号的PLC然后发现点不够用或者通讯口数量不对被迫加扩展模块既浪费钱还拖慢进度。2.1 我把I/O点从头到尾盘了一遍以一条单工位、产能在40瓶/分钟左右的自动装瓶线为例I/O规划大致如下数字量输入DI启动按钮、停止按钮、急停按钮3点理瓶转盘电机过载信号1点变频器或热继送瓶螺杆到位/原点1点接近开关瓶到位检测装瓶工位、剔废工位、封盖工位3点光电传感器药片下落计数信号1点专用高速输入接光电传感器各气缸到位信号挡料气缸开/关、剔废气缸、压盖气缸上/下多个磁性开关算下来约6点缺瓶检测、堵瓶光电检测2点DI合计约17点。数字量输出DO各电磁阀控制挡料开、挡料关、剔废气缸、压盖气缸4~6点理瓶转盘电机启停1点接触器/变频器端子送瓶螺杆电机启停1点出瓶皮带电机启停1点三色报警灯红/黄/绿3点蜂鸣器1点DO合计约13点。模拟量/通讯变频器通过RS485走Modbus RTU不需要模拟量调速端子触摸屏走以太网口后续如果要上MES预留一个以太网口给OPC UA。这么一盘16DI/16DO级别的PLC就够用。我当时选的是西门子S7-200 SMART SR3018DI/12DO搭配一个EM DR08扩展模块8DO实际使用还有不少余量。如果选三菱FX3U对应就是FX3U-32MT也没问题。汇川、信捷、台达这些国产PLC同级别都有对应型号核心逻辑一样。2.2 传感器选型的两个坑这里必须提两个别人很少讲但很关键的细节第一计数传感器的响应速度和检测面宽度。药片下落速度很快普通光电的响应时间如果大于1ms高速下一定漏数。我当时用的是基恩士或者奥托尼克斯的高速光电响应时间0.1ms级别检测区域是一条约15mm宽的线状光幕而不是单点光束。单点光束的问题是药片如果翻转或者位置偏移会从光束缝隙漏过去线状光幕基本能罩住整个落料通道。第二传感器供电要稳定。药厂车间里变频器、电机频繁启停电网波动很厉害。传感器如果直接从开关电源取24V电机一启动电压跌落就可能误动作。我的做法是计数传感器单独用一个24V稳压电源并且和变频器动力线彻底分开走线。后面调试时发现这个决定救了我好几次——旁边一台设备一启动共用的那个电源就波动单独供电的传感器纹丝不动。2.3 电控柜安装的洁净区约束这套设备如果放在GMP车间里电控柜的防护等级、走线方式都有讲究。普通工厂可以用壁挂式电控柜药厂洁净区更倾向做成嵌入式控制面板操作界面嵌在设备台面上柜体和线槽都要密封避免积灰。我当时的设计是在设备侧面做一个不锈钢控制盒防护等级IP54触摸屏嵌在面板上。所有进出线用防水接头锁紧内部走线槽全程密闭。不要让线缆裸奔药厂检查人员看到裸线会直接开不符合项。3. 程序的核心不是“数数”而是“节奏”三段式PLC逻辑程序架构我拆成三块自动流程状态机、高速计数与滤波、故障诊断与数据管理。这三块分别解决“按顺序做动作”“不数错”“坏了自己知道”三个需求。3.1 自动流程用步进指令搭状态机自动流程是典型的顺序控制。顺序控制如果用置位复位指令满天飞程序会乱成一锅粥改一个动作要翻半天。我用的是类似三菱STL步进梯形图、S7-200 SMART里用SCR顺序控制继电器指令的常规做法或者直接用带编号的状态寄存器条件跳转。核心状态大概这样定义S0待机/复位S1送瓶理瓶转盘运转送瓶螺杆推瓶到位S2就位检测确认瓶子到位等待S3下料计数开挡料药片下落高速计数中断累计S4关挡料推瓶计数达到设定值挡料关闭推瓶气缸动作S5剔废检查缺瓶/多片检测S6封盖S7出瓶状态的跳转条件要写得明确比如S3切S4触发条件是中断累计值设定值且下料延时已到。不要光靠计数中断一个信号因为药片下落的最后一片还在通道里机械挡板关闭需要时间这时要给一个“封口延时”比如多等80ms再切状态确保最后一片不卡在挡板缝隙里。这里有几个细节经验每个状态进去之前先复位与下一步无关的输出避免“上个动作还没停下个动作就开始”状态跳转条件里必须加“已进入本状态”的确认标志防止信号毛刺导致跨状态跳转急停信号在任何状态都要优先响应程序里用中断或最高优先级逻辑单独处理。3.2 高速计数与滤波——药片掉落的防抖处理这一块是整套程序的技术核心。药片下料速度按每秒15粒算每粒间隔约66ms对于PLC扫描周期来说似乎来得及但实际情况是光电传感器检测到药片的时刻是不均匀的药片可能两粒几乎同时落下间隔只有几毫秒或者半粒被通道壁弹了一下光幕瞬间被遮挡两次。普通扫描根本扛不住必须用PLC的高速计数通道高速计数器HSC或中断输入来捕获。我用的是S7-200 SMART的高速计数器模式把计数传感器接到I0.0HSC0输入设置成单相计数、复位为当前值的模式。程序里不靠扫描周期累计而是靠中断服务程序累计。大致的逻辑结构是// 主程序里初始化HSC0 // 计数方向增计数 // 中断事件当前值等于设定值 // 预设值每瓶设定粒数 // 中断程序中做 // 1. 累计总量加1 // 2. 触发挡料关闭输出 // 3. 当前值清零准备下一瓶这样设计的好处是CPU不需要每扫描一次都去读计数器当前值只有达到设定粒数时中断程序才处理一次。计数频率再高只要不超过HSC硬件极限S7-200 SMART单个高速计数器可到200kHz都不会漏。但光有HSC还不够还得处理信号抖动。药片边缘经过光幕时光电输出波形不是理想的方波会有上升沿/下降沿的抖动尤其药片表面有糖衣、颜色浅的时候波形更难看。如果直接把抖动都当成有效脉冲一瓶会多出好几粒。我试过几种滤波方式最有效的是时间窗口电平确认法检测到下降沿后启动一个2ms定时2ms后再次读传感器电平如果仍然是遮挡状态才认为是有效药片如果2ms后已经恢复通光认定是干扰脉冲丢弃。这个2ms窗口值根据实际下料速度调一般1~3ms合适。太快了滤不掉干扰太慢了高速时会把相邻两粒合并。我当时是通过示波器看波形后定的2ms实测误计数率从最初每分钟十几次降到零。3.3 故障诊断逻辑让设备自己说哪里坏了药厂设备不能等操作工来问“机器为什么不转了”。我的故障逻辑分成两级一级是硬件直接报警急停按下、电机过载、气压不足等直接停机亮红灯。二级是工艺异常报警设备还在转但状态不对。比如瓶子到位检测3秒内没检测到瓶子报“缺瓶”连续缺3个瓶自动停线下料时间超过设定上限比如设定30片需时2s但2s还没数完报“计数异常”说明传感器被堵或者药片卡在下料槽封盖工位卡住压盖气缸下行超时报“封盖卡阻”。实现方式就是在每个状态跳转处加上超时监控。我给每个工步都设了一个“最长允许时间”到了时间还没跳转就进入故障子程序。故障子程序把当前状态编号、故障代码、发生时间存到V区掉电保持区同时点亮对应报警灯。这一步做得好设备调试时能省大量时间。机器停了你不用拿着万用表到处戳直接看触摸屏就知道是哪个传感器没信号。3.4 掉电保持与批次数据管理药片装瓶的一个硬性要求是批次可追溯今天8点到12点这个班次装了多少瓶有没有报警报警时停在哪个瓶子都得有记录。数据管理我放在PLC里做具体包括当前批次产量累计装瓶数V区掉电保持断电不丢当日总产量班次切换前自动存入历史批次区最近20条报警记录故障代码时间戳环形队列存储每瓶实际数片时间记录最后100瓶的下料时长用于判断设备状态是否退化。掉电保持的设置不要忘了。S7-200 SMART默认V区有一部分是掉电保持的三菱FX3U则用D10以后加电池保持。如果没设置好生产到一半突然停电产量全部清零操作工会崩溃的。这个细节在调试阶段就要验证断电重启后数据还在。4. PLC如何与变频器、触摸屏、MES对话通讯方案落地现在做设备通讯方案基本是标配。变频器调速、触摸屏显示、上位机数据采集哪一个都绕不开。我的通讯方案分三层PLC与变频器走Modbus RTU、PLC与触摸屏走以太网、PLC与上位机走OPC UA通过Modbus TCP网关桥接或直接使用支持OPC UA的新型PLC。4.1 与变频器的Modbus RTU交换理瓶转盘和出瓶皮带的速度不需要太精确用变频器足够了。我用的变频器支持Modbus RTU和S7-200 SMART的Port0口用RS485连接。通讯参数设置要统一波特率9600、8数据位、无校验、1停止位。PLC里写轮询程序写控制字启动/停止写设定频率转盘速度、皮带速度读运行状态当前频率、电流、故障代码。一个很重要的经验不要每瓶都去读变频器数据。轮询周期我设在500ms左右就够用了。如果和上位机通讯共用同一个串口轮询周期还要错开。我见过有人把通讯周期写到50ms结果PLC扫描周期被拖慢直接影响高速计数响应这种问题特别隐蔽。还有一个坑RS485通讯时变频器侧必须接终端电阻屏蔽层单端接地。不然变频器一启动通讯就偶尔报错。这个在现场测试才能发现前期画图时就要注意选带屏蔽层的双绞线。4.2 触摸屏那点事触摸屏我用的是国产知名品牌的常规款和PLC走以太网。画面设计主要做这几页主画面设备当前状态、当前瓶数/累计瓶数、设定粒数、速度显示参数画面每瓶粒数、下料延时、剔废开关、封口延时这几个参数操作工会经常调一定要放一层手动画面每个气缸单独动作按钮调试时用来单个执行机构测试报警画面实时报警和报警历史故障代码对应的中文描述产量统计按班次、按批次查询产量和报警记录。触摸屏的使用寿命和抗干扰也值得说一句。药厂车间有时候会有蒸汽、水汽触摸屏尽量选防护等级高一点的而且面板安装时密封要做好。我见过设备运行半年后触摸屏边缘发黄、触控失灵的基本都是安装时没有做密封条。4.3 OPC UA打通到上位机很多工厂现在要上MES或者SCADA设备数据不能只停留在PLC. 我这边给设备预留了OPC UA能力。如果你用的是西门子S7-1200/1500或者汇川AM系列这类原生支持OPC UA的PLC直接启用服务端配置安全策略即可上位机用UA Expert或者工厂的MES采集程序直接读点位。但像S7-200 SMART这种经济型PLC没有原生OPC UA服务通常的做法是PLC侧通过Modbus TCP服务器功能把数据映射到指定保持寄存器区上位机侧用Modbus TCP转OPC UA网关把寄存器地址映射成OPC UA节点或者直接用IO采集软件从PLC读Modbus TCP再走OPC UA给MES。上位机采集的数据点我是这么设计的数据点地址/寄存器数据类型说明当前产量保持寄存器1UInt32累计装瓶数当前状态保持寄存器2UInt160待机/1运行/2故障当前故障码保持寄存器3UInt16故障编码当前班次保持寄存器4UInt16班次编号报警记录区寄存器20~40String/Int环形队列通讯轮询周期上位机一般设1秒就足够了生产数据不是控制数据不需要毫秒级。但要注意上位机写操作权限别开太多只给需要控制的点比如启动、复位其他点全设只读防止误操作。5. 试运行阶段我踩过的坑与调试心得硬件装好、程序写完最关键的其实是现场调试。这一部分我踩过的坑每一个都值得单独记录。5.1 静电干扰导致误计数试运行第一天空机测试一切正常。装上真实药片开始连续生产十分钟后我发现产量统计比实际多出好几瓶——也就是计数多算了。排查过程是这样的我先用示波器看光电传感器的波形在药片掉落时信号基本正常但偶尔会出现无规律的窄脉冲宽度只有几百微秒非常短我以为是传感器接线接触不良把接头重新压了一遍问题还在然后我怀疑是PLC高速计数口受共模干扰给信号线加了磁环问题仍然存在最后我把下料通道的塑料挡板拆下来发现药片在通道里高速滑落时因为摩擦产生了大量静电同时塑料通道表面积灰传感器镜头边缘也有粉尘。这个问题的根源其实是静电放电导致传感器输出毛刺再加上药粉污染影响光路。解决措施在下料通道靠近药片滑落的位置加接地铜箔把静电导入大地光电传感器镜头改成凸出安装并加压缩空气吹扫口每隔10分钟自动吹一次程序里把2ms滤波窗口提到4ms牺牲一点点计数速度极大提升稳定性。处理完后再跑连续8小时计数一次都没错。所以说程序滤波也好硬件屏蔽也好都不能只靠一项现场现象是组合原因。5.2 气缸到位检测与节拍匹配另一个折磨人的问题是偶尔瓶子推过来时气缸不到位导致下一工位堵瓶。一开始我以为是气缸气压不足调大了气压问题改善了一部分但偶尔还会出现。后来发现是磁性开关的位置安装不对气缸在高速动作时活塞杆到达末端会有轻微反弹磁性开关刚好在临界位置瞬间信号丢失。解决方法是调整磁性开关位置让它不要正好卡在活塞运动的终点极限而是稍微向气缸中间偏一点保证活塞到位后能够稳定触发。这一步花了我一上午时间一个一个气缸调。接下来就是节拍匹配气缸动作时间、光电检测延时、下料时间三者之间要找到一个合理的平衡点否则就会出现“气缸还没到位瓶子已经挤过来”的情况。我最后把每个工位的动作时序列成了一张表用触摸屏上的延时参数一点点微调才达到40瓶/分钟的稳定节拍。这里有个建议调试阶段一定要把触摸屏上的延时参数做成可调而且存掉电保持区不要每次断电都回到默认值否则一天要重新调十遍。5.3 试运行的产能记录与参数整定试运行我做了连续48小时测试每小时记录一次产量和报警情况。数据是很有价值的这里分享两个我发现的现象转速也不是越高越好。转盘送瓶速度调高后瓶颈出现在送瓶螺杆和瓶子的对位精度上瓶子倾斜、倒瓶概率上升反而拖慢整体节拍下料延时和挡料关闭延时必须动态配合。药片如果批次不同表面摩擦系数不一样下落速度也会有变化。固定延时在生产中会很脆弱换成“计数完成后再延迟50ms关闭挡料”的方式适应性明显更好。最终48小时连续测试数据是总产量4700瓶计数错误0次设备故障报警3次都是外部气压波动节拍稳定在43瓶/分钟。这个结果比预期目标要好一些。最后说一句实在的。做药片装瓶机控制系统PLC编程本身只占整个项目的一部分真正的难点在于理解工艺、把信号抗干扰做到位、把故障场景都想透。很多刚入门的朋友问我“学PLC先学哪本书”我的回答一直是先把设备看明白再来谈程序怎么写。这套系统的完整设计思路尤其是高速计数和抗干扰那部分换成做螺丝计数、颗粒包装、甚至电子元件编带机都是通用的底层逻辑。把这套思路吃透了换个设备也就是换张工艺流程图的事。