ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

S7-1200物流分拣程序系统设计:从硬件拓扑到状态机调试全解析

S7-1200物流分拣程序系统设计:从硬件拓扑到状态机调试全解析 做物流分拣这类项目S7-1200的出镜率是真的高。我上个月刚交付完一套双工位自动分拣线从程序架构设计到现场联调花了将近三周时间回头看最大的体会是决定项目成败的往往不是你会写几条指令而是系统设计阶段有没有把控制流程、硬件选型、通信协议和故障边界想透。这篇就把我个人的S7-1200物流分拣程序系统设计思路完整拆一遍从需求分析、硬件拓扑、程序架构到通信调试给准备上手这类项目的朋友一个能直接对着落地的参考。适合刚接触S7-1200的电气工程师也适合做非标设备、想自己搞定控制系统的机械设计朋友。1. 先想清楚再写程序物流分拣系统到底在解什么题很多朋友拿到分拣项目第一反应就是写代码上来就拖梯形图。实际上PLC程序只是整个系统设计的一部分分拣线真正复杂的是需求拆解。一套典型的物流分拣系统无论规模大小本质上都在解决三个问题货物怎么进来、往哪去、怎么统计对应到控制层面就是输送控制、分拣路由、数据管理。先说说常见的分拣形态这直接决定程序架构。低成本方案是推杆式分拣货物在皮带上行走光电传感器检测到位后气缸推动推杆把货物拨到侧向滑道适合中小型包裹、每小时600到1500件的场景。中高端一点用摆轮分拣每个分拣位有一组可旋转的摆轮通过改变摆轮角度让货物沿不同方向滑出速度更快、对货物更友好但机械结构贵不少。还有一种交叉带分拣那是大型分拣中心用的S7-1200也能做小车控制但整套系统规模远超本文范围。我下面以推杆式分拣为主来展开这也是中小型项目里性价比最高的方案。确定分拣形态后要把控制对象一个个列出来。输送线电机、分拣气缸电磁阀、光电传感器、编码器、条码扫描枪、触摸屏、三色报警灯、急停按钮这些基本是标配。以我做的双工位分拣线为例一共两段皮带输送两个分拣出口一个供包台货物在入口处由条码枪读码根据货物条码信息决定是一号口出还是二号口出无法识别的货物直接送到末端收集箱。这套系统的I/O点并不复杂DI大概14个点DO 10个点但真正考验人的是流程编排和异常处理。这里就要说到为什么选S7-1200而不是200 SMART或1500。200 SMART价格低、上手快但模块化能力和通信能力弱做三五个工位的分拣还行一旦要挂变频器、接条码枪、上触摸屏、还要跟MES或上位机走TCP200 SMART就吃力了。1500确实强大但中小型项目用1500属于杀鸡用牛刀成本上老板第一个不答应。S7-1200正好卡在中间支持Profinet、Modbus RTU、Modbus TCP自带高速计数器程序块结构跟1500一脉相承后期真要升级1500程序迁移成本极低。我自己习惯选1214C DC/DC/DC14个DI、10个DO不够就加SM1223数字量扩展模块CPU自带一个网口和一个信号板插槽灵活度很高。需求拆解还有个容易忽略的点就是故障边界。分拣线在客户现场最怕什么货物卡在推杆下、气缸中途卡死、变频器过载报警、条码枪读不出码。这些不是如果发生的问题而是一定发生的问题。所以系统设计阶段就得把每种异常定义好状态、给到触摸屏提示、触发声光报警有些还要自动停机避免货物堆叠。我的习惯是在需求确认表里专门列一栏异常场景与处理策略跟客户一条条过把意外都变成程序里提前写好的分支后期调试能省掉大量救火时间。2. 硬件拓扑与I/O分配程序好不好写一半取决于接线规划程序写得再漂亮硬件接线乱了照样跑不起来。分拣系统的硬件拓扑我一般这样搭S7-1200 CPU作为控制核心Profinet网口连接KTP1200触摸屏RS485通信板或CM1241通信模块挂载变频器走Modbus RTU高速计数器通道接旋转编码器数字量输入接光电传感器、气缸磁性开关、急停按钮数字量输出接接触器、电磁阀线圈、报警灯。条码枪如果走串口就接到通信模块的第二个串口如果走网口就直接进交换机。I/O地址分配是设计阶段就必须定死的千万不能到现场边接线边规划。我给一套参考分配表对应双工位分拣线的典型配置地址信号类型说明I0.0供包台光电DI检测货物进入I0.1读码区光电DI货物到位触发读码I0.2一段皮带变频器故障DI变频器报警信号I0.3二段皮带变频器故障DI变频器报警信号I0.4编码器A相DI/HSC高速计数器通道0I5.0推杆1气缸伸出到位DI磁性开关I5.1推杆1气缸缩回到位DI磁性开关I5.2推杆2气缸伸出到位DI磁性开关I5.3推杆2气缸缩回到位DI磁性开关I5.4急停按钮DI常闭输入Q0.0一段皮带接触器DO变频器启停Q0.1二段皮带接触器DO变频器启停Q0.2推杆1电磁阀DO三位五通或二位五通Q0.3推杆2电磁阀DO三位五通或二位五通Q0.4三色灯-绿灯DO运行指示Q0.5三色灯-黄灯DO预警Q0.6三色灯-红灯蜂鸣器DO故障报警这里有个很重要的细节急停按钮一定要接常闭触点用PLC程序里串联常开触点来逻辑取反。这样做的好处是急停回路断线或者急停按钮被按下PLC都能第一时间检测到符合安全回路设计的基本逻辑。我见过不少新手把急停接成常开结果急停线被老鼠咬断后整个系统彻底失去保护这是非常危险的。关于传感器信号类型S7-1200的集成输入是源型输入也就是PNP传感器直接接。很多人被NPN传感器坑过这里把接法说清楚。S7-1200输入端子的M端接0VPNP传感器输出高电平信号这匹配。如果手头只有NPN传感器输出是低电平有效直接接上去PLC读不到信号解决办法有三个一是换PNP型传感器二是加中间继电器转换三是把PLC输入公共端接法调整。具体说第三种S7-1200某些型号的输入模块支持改变公共端接法来实现NPN对接但集成输入不行只能改M端接法来适配操作有风险建议加继电器安全又便宜。现场遇到NPN传感器时我的方案是花十几块钱买个8路中间继电器底座把所有NPN信号过一遍继电器转成PNP省心且彻底。I/O规划还有一个建议就是预留备用点。我在项目里通常要求至少留20%的备用DI和DO别把点用满。分拣线客户特别爱在验收后加需求比如再帮我加一个到位检测这里加个拍照触发预留点能让你不至于要加扩展模块改动成本完全不同。3. PLC程序架构用FB/FC把分拣逻辑拆成可维护的模块程序架构决定了后续调试、维护、客户改需求的成本。我见过有人把整套分拣逻辑塞进OB1几千行梯形图拉到底加一个功能要翻半天查一个信号要用交叉引用反复跳转那酸爽谁接盘谁知道。S7-1200继承了1500的块结构思想用FB函数块、FC函数、DB数据块拆分逻辑这才是正确的打开方式。我的程序块划分大概是这样块名称类型功能OB1组织块主循环按顺序调用各功能块OB40硬件中断高速计数器中断处理位置到达FB100功能块分拣核心逻辑状态机FB200功能块输送线控制变频器启停、速度给定FC300功能报警汇总与三色灯控制FC400功能数据统计分拣计数、效率计算DB50数据块系统全局数据运行状态、参数DB100数据块分拣FB背景数据块DB200数据块输送控制背景数据块DB500数据块报警缓冲与历史记录主循环OB1的工作就是把它们串起来读输入、刷新状态、执行分拣逻辑、控制输出、处理报警、刷新统计。这里有个顺序问题报警检测应该放在半程或末尾避免报警还没赋值就被后面的逻辑覆盖。实际项目里我习惯把OB1调用顺序固定并在每个块里加一个上次执行周期时间的诊断变量方便以后做性能分析。分拣核心用状态机实现这是整个程序最重要也最应该封装好的部分。状态机的好处是逻辑清晰、边界明确每个状态做什么、状态之间怎么迁移写出来就是一目了然的表后期维护比一锅粥的梯形图强太多。我一般把推杆分拣过程拆成5个状态空闲等待、货物进入、位置计算到达、推杆推出、推杆缩回复位。用SCL写出来大概是这样CASE #state OF 0: // 空闲等待 // 光电传感器上升沿触发 IF DB50.start_pos_enable THEN #start_pos : HSC1_Count; // 记录当前编码器位置 DB50.start_pos_enable : FALSE; #state : 1; END_IF; 1: // 等待货物到达推出位置 // 当前位置 - 起始位置 推出点脉冲距离触发推杆 IF (HSC1_Count - #start_pos) DB50.push_pos_pulse THEN Q0.2_push1_valve : TRUE; // 推杆1电磁阀动作 #state : 2; END_IF; 2: // 等待推杆伸出到位 IF I5.0_cyl1_extend THEN // 到位后保持一个延时再缩回保证货物完全脱离推杆 #extend_timer(IN : TRUE, PT : T#200MS); IF #extend_timer.Q THEN Q0.2_push1_valve : FALSE; #state : 3; END_IF; END_IF; 3: // 等待推杆缩回到位 IF I5.1_cyl1_retract THEN #state : 0; // 回到空闲等待下一件货物 END_IF; ELSE // 异常状态复位 #state : 0; END_CASE;注意这里用编码器测距代替了简单的定时器延时这是分拣程序的一个关键选择。定时器方案在皮带速度稳定时勉强能用但皮带一旦打滑、变频器调速、负载变化导致速度波动货物位置就会漂移推杆要么推早了要么推晚了。编码器测距方案是检测到货物时记录当前位置当编码器累计脉冲达到设定距离时才触发推出机械打滑和速度波动的影响被降到最低这也是我认为分拣程序最基本的设计理念之一。程序里还有一类细节容易被忽视就是上一次状态位处理。比如光电传感器检测货物不能直接用常开点要捕捉上升沿。在OB1里我习惯用临时变量保存上一周期的输入状态通过当前值 AND NOT 上次值来生成一个周期脉冲信号。这个技巧在分拣逻辑里用得非常多比如供包台光电每次上升沿代表一件新货物进入计数器加一每段皮带上货物进入和离开都要靠沿信号来更新状态。触摸屏和PLC之间的变量管理我放在这个章节一起说。KTP1200在博途里通过Profinet组态连接S7-1200变量用HMI变量表引用PLC变量。有个很常见的坑是触摸屏上改了时间之后显示不信任或者是画面里PLC状态异常——这是因为WinCC Comfort的面板与PLC之间存在证书和时间戳校验逻辑。触摸屏时间如果和PLC时间差太多可能导致安全证书信任关系失效表现就是HMI提示不信任PLC、连接时断时续。解决方法是把PLC设置为时间主站HMI通过NTP方式同步PLC时间或者每次修改时间后重新编译下载一遍HMI组态。我踩过这个坑之后直接在KTP1200的Runtime设置里勾选从PLC获取时间一劳永逸。4. 通信实战变频器、触摸屏和条码设备的接入分拣系统里通信模块的代码量其实不小而且通信调试往往是整个项目里耗时最长的部分。常见的有三类变频器Modbus RTU、触摸屏Profinet、条码枪串口或TCP。每一类都有固定的套路写之前把参数表准备好能少走很多弯路。先讲变频器Modbus RTU。不管你是用ABB、施耐德ATV930还是国产汇川原理都一样PLC作为Modbus RTU主站变频器作为从站通过读写保持寄存器来控制启停和频率。S7-1200做Modbus RTU需要一个串口通道可以用CM1241 RS485通信模块也可以用信号板CB1241我用的是CM1241带两个串口一个给变频器一个给条码枪正好。博途里做Modbus RTU主站先用Modbus_Comm_Load指令配置端口再循环调用MB_MASTER指令。端口配置参数给个参考波特率9600数据位8无校验1个停止位站号按变频器实际设定比如1号变频器站号1响应超时1000ms。这个参数组合在现场的兼容性最好如果你发现通信时好时坏先别怀疑程序把波特率降到9600检查一下通信线是不是双绞屏蔽线、屏蔽层是否单端接地。MB_MASTER的调用有一个大坑就是DATA_ADDR的计算。以ABB变频器为例控制字通常在40001地址但Modbus协议里保持寄存器的实际地址编号是0开头如果你在变频器手册里看到的是4xxxx格式需要转成十六进制或者按偏移换算。更稳妥的做法是先把DATA_ADDR设为十六进制的控制字地址比如40001对应16#000040002对应16#0001。变频器给定频率地址通常是40002读取实际频率可能是40323这些每个品牌都不同一定要以具体变频器手册的Modbus寄存器表为准。我曾经在ATV930上吃了这个亏地址偏了一位写入频率死活不生效查了两天才发现手册里保持寄存器起始地址是41001不是40001。变频器启停控制的时序也要注意。很多变频器需要先给运行命令再给频率或者频率和命令同时给但我遇到的安全做法是先给频率延时200ms再给启停命令同时把最大频率给定限幅在50Hz。这样做的目的是防止启动瞬间频率为0导致变频器报失速也防止程序初始化时误发一个启动命令给变频器。这个延时和顺序问题在程序里看起来是小细节但对现场设备稳定性的影响非常大。然后是触摸屏Profinet连接。KTP1200和S7-1200通过Profinet通信组态步骤就是创建子网、把CPU和HMI加到同一个子网、设置IP地址在同一网段、在HMI变量表里建立连接。如果出现连接不上优先查IP地址和子网掩码其次查博途项目里硬件标识符。好多人忽略的一点是S7-1200的以太网端口默认支持Profinet和普通TCP并存但同一个IP只能在同一个子网如果现场有其他设备占用了这个网段通信就会出现诡异故障。条码枪接入这块我用的是自由串口协议。现在市面上的条码枪基本都支持串口输出设置为连续扫描模式数据以回车换行结尾波特率9600或115200。S7-1200自由串口接收需要用到串口接收指令配置消息结束字符为十六进制0x0D 0x0A这样PLC就能按完整帧接收数据。接收到条码后存到DB里的字符串变量然后调用解析功能块把条码字符串和分拣路由表比对决定货物去哪个出口。这个路由表通常放在数据块里客户后期增减路由不用改程序直接在触摸屏上维护一个表格就行。通信里还有一个高频问题就是TCP和上位机连接只要重启才能连上一分钟。这个现象在工程师群里见过很多次原因通常是S7-1200作为TCP Server时TSEND_C和TRCV_C连接没有正确配置具体说就是保持连接选项没勾上或者上位机端没有周期发送心跳数据导致连接被系统回收。排查思路很明确先抓PLC侧程序确认TSEND_C/TRCV_C的EN_R和REQ信号是不是每个周期都激活然后确认连接参数里没有勾选仅在通信建立时保持最后在上位机端加一个心跳包机制每3到5秒发送一次握手信号。我遇到过一例是上位机软件NAT端口映射设置了超时释放跟PLC关系不大所以通信问题要两头一起查别只盯着PLC。5. 分拣逻辑的几种经典写法和关键参数计算分拣位置控制业内主流做法就是两种定时分拣和测距分拣。定时分拣实现最简单光电检测到货物后启动定时器延时固定时间后推出。它只适用于皮带速度恒定、机械不打滑的场合。如果你的输送线用的是变频器而且频率会调整或者皮带偶尔打滑或者说你希望客户随便改速度都不用重新对参数那就必须上测距分拣。测距分拣的核心是编码器。编码器安装在主动滚轮的轴端或从动滚轮上通过联轴器或同步带连接滚筒每转一圈编码器发出固定数量的脉冲PLC用高速计数器HSC实时累加这些脉冲。这样货物在皮带上的位移就被转化成可计算的脉冲数精度能达到毫米级。脉冲当量是个必须算准的参数。一套常用配置驱动滚筒直径80mm编码器600脉冲/圈那么每个脉冲对应的皮带位移是π×80/600约0.4189mm。如果要求分拣位置误差在±5mm以内那么允许的脉冲误差大约12个脉冲这个精度完全够用。实际项目中还要考虑齿轮减速比如果编码器不是直接装在滚筒轴上而是装在电机轴上那就要把减速比乘进去公式是脉冲当量 (π×滚筒直径) / (编码器脉冲数×减速比)。我建议把脉冲当量算出来后做成一个参数放在DB里现场标定时可以微调而不是直接写在程序里写死。分拣推出位置的标定方法也有讲究。先让货物正常走一圈记录从检测光电到推杆中心位置的脉冲数填入DB参数。这个标定值不光取决于机械距离还和光电传感器的安装位置、反射板灵敏度有关所以不能完全依赖图纸尺寸一定要实测。测出来之后再把推杆动作的提前量加进去因为气缸从电磁阀通电到推杆真正碰到货物有响应时间一般提前30到80ms具体要看实际运行效果。节拍和产能估算这块客户通常会问这条线一小时能分拣多少件你总得给个靠谱数字。分拣线有效节拍取决于两个因素货物最小间距和皮带速度。设皮带速度V0.8m/s货物最小间距L1.2m理论节拍就是1.5s/件一小时2400件。但实际要考虑读码时间、气缸响应、推杆缩回时间以及货物在皮带上的摩擦打滑通常打个75%到85%的效率系数。我在方案书里通常写额定产能不低于1800件/小时既能满足客户预期又给自己留了余地。需要注意的是计量单位要统一有的客户用每小时有的用每天别到最后对不上。分拣数据的统计逻辑也值得说。客户经常要求看总处理件数、各出口件数、未识别件数。我的做法是在DB里建一个统计数据块用6个DINT变量分别记录总数、出口1件数、出口2件数、未识别件数、当前班次时间、当班效率。每个分拣动作完成后对应计数器加一触摸屏直接显示。这里要注意DINT的溢出问题理论上不会溢出但数据上传MES系统时如果按有符号整数解析值超过21亿会变负数所以建议统计值用DWORD或直接用LReal省得给自己埋雷。6. 调试阶段我踩过的坑与排查方法项目写完了真正考验人的是现场调试。我记得有一回调试分拣线程序逻辑仿真全通过但一上电推杆就乱动最后发现是变频器启停瞬间的电磁干扰串进了传感器信号。从那以后我对现场布线的要求变得苛刻动力线、信号线分开走线槽间距至少20cm屏蔽层单端接地所有传感器用屏蔽电缆。这些在图纸阶段就写进要求电气装配照着做能省很多现场问题。还有气缸磁性开关误触发的问题。推杆气缸动作时震动大磁性开关偶尔会瞬间误通程序如果没做滤波处理就会误判到位导致状态机跳错。处理办法很简单在程序里给磁性开关信号加一个20到50ms的软件滤波用定时器迟滞一下确认信号连续有效再认。这个软件滤波我基本成了标准动作所有DI信号都过一遍滤波再参与逻辑。分享一个我调试中遇到的最诡异的问题分拣线一切正常但每到下午三点左右就偶发报警停机排查了好几天最后发现是阳光照射角度变化导致光电传感器反射板被强光干扰。从那以后我对光电传感器的安装位置特别敏感要求在选型时优先选用对射型而不是反射型反射型传感器要加装遮光罩安装位置尽量避开门窗直射光。这类环境因素在系统设计阶段很容易被忽略但实际故障率却很高。整理一个调试常见问题速查表都是我在实际项目里遇到过的现象可能原因排查方法PLC与变频器通信时好时坏波特率不一致、接线极性反、屏蔽层未接地用示波器/R485调试助手抓报文确认站号和寄存器地址触摸屏提示不信任PLC时间不同步、证书信任关系失效勾选HMI从PLC获取时间重新下载HMI组态推杆偶尔推空、位置偏移编码器脉冲当量不对、皮带打滑、气缸响应不稳重新标定推出位置参数检查编码器联轴器是否松动光电信号一会有一会没强光干扰、传感器灵敏度设置不当调整传感器灵敏度安装遮光罩改对射型货物堆积、堵料不停机末端堵料检测缺失或位置不对在分拣出口加装堵料光电堵料时停上一级皮带PLC通讯异常重启后恢复一分钟TCP连接被释放、缺少心跳保持检查TSEND_C/TRCV_C配置上位机增加心跳机制编码器计数跳动大高频干扰、HSC滤波参数不合适、电缆过长屏蔽层接地、降低HSC滤波频率、缩短编码器电缆调试过程中我养成一个习惯每遇到一个问题除了修复它还会顺手在程序里增加一条诊断信息。比如给报警字写代码触摸屏上显示具体到哪个气缸哪个磁性开关超时这比一个泛泛的设备报警能省太多排查时间。项目完结时把整个调试过程中修改的参数和原因整理成一份调试记录文档留给客户对后续维护特别有帮助。还有一个我反复强调的小经验最终交付前一定要做断电重启测试。现场很多程序平时没事断电重启就乱大概率是初始化逻辑不完善比如说上电时气缸磁性开关状态还没稳定程序就执行了错误分支。所以程序里要有上电延时初始化功能给系统一个稳定的建立时间再让状态机进入正常工作循环。最后再分享一个写分拣程序时很受益的习惯每段程序注释里不只写这一行在干嘛还会写当时为什么这么设计。比如某个延时为什么设200ms、某个位置为什么偏移了20mm这些背景信息在几个月后你回来看代码时价值巨大。多个项目下来我相当于给自己积累了一套可复用的分拣程序框架新项目来了复制框架、改I/O分配、改路由逻辑、重新标定参数三天能完成以前两周的编程工作量。这套方法论比任何具体指令都值钱。
返回列表