去年交付了一条自动化装配线,核心配置是西门子S7-1200 PLC加库卡机器人,整整排了12个工位。从方案评审到现场48小时老化跑完,整套系统算是彻底定下来了。这类配置在中小型自动化产线里非常常见,无非是上料、清洗、压装、拧紧、检测、下料这些工艺串起来,PLC管逻辑和节拍,机器人管搬运和上下料。文章里我会把方案选型、PLC和库卡之间的数据通信、编程联调的完整过程拆开讲,再把现场遇到的高频问题整理出来。准备做集成项目、搞设备维护的工程师,或者正在纠结PLC和机器人怎么搭配的朋友,可以当一份避坑参考资料看。
1. 12工位系统方案设计:先把骨架搭对再谈细节
1.1 工位布局怎么定:转盘、直线线体还是环形线
12工位听起来简单,但排布方式直接决定后面的工作量。常见做法三种:环形回转工作台、直线倍速链、环形流水线。
环形回转台的特点是结构紧凑,适合工件小、工位等分、工序比较对称的场合。但有个致命限制,转盘做大后精度受温度影响明显,而且各路气路、电路走线一多,工位越难排。12个工位如果全塞在一个转盘上,现场检修空间会很压抑。
直线倍速链是我这次用的方案。客户产品工艺里有视觉检测、压装、气密测试,这些设备体积都不小,转盘根本摆不下。直线线体可以让压装机和气密仪独立落地,方便后期维护和换型。它还能加缓存位,前道设备短停时后道不至于马上断料。
还有一种环形流水线加托盘循环,适合多品种混线生产,托盘可以回传,但成本比直线线体高不少,对小批量项目来说有点浪费。我建议如果不是产线规划里有明确的柔性化需求,先用直线倍速链把节拍和稳定性跑出来再说。
12个工位最终按工艺顺序表排下来,大致是这样的:
| 工位号 | 工序 | 主要设备或动作 | 执行者 |
|---|---|---|---|
| 1 | 人工上料 | 拆包装放至托盘 | 操作员 |
| 2 | 清洗吹屑 | 气动吹扫加真空除尘 | 气缸机构 |
| 3 | 机器人搬运 | 从托盘抓取至装配定位台 | 库卡机器人 |
| 4 | 视觉定位 | 相机检测来料角度和中心 | 视觉系统 |
| 5 | 压装衬套 | 液压压装机压装 | 压装单元 |
| 6 | 涂胶 | 定量涂胶 | 涂胶机构 |
| 7 | 拧紧螺丝 | 机器人携带拧紧枪拧4颗螺丝 | 库卡机器人 |
| 8 | 气密检测 | 设定压力保压检测泄漏 | 气密检测仪 |
| 9 | 激光打标 | 打二维码和序列号 | 激光打标机 |
| 10 | 缓存位 | 成品等待下料,做缓冲 | 倍速链缓存 |
| 11 | 机器人下料 | 从线体抓取到成品托盘 | 库卡机器人 |
| 12 | 人工抽检录入 | 抽检尺寸和外观,系统记录 | 操作员 |
这个排法不是随便定的,有两个核心逻辑。第一,把机器人能覆盖的动作放在工位3、7、11,让一台机器人通过滑轨移动覆盖三个工位,减少设备数量。第二,把工频、阀岛、气路接口多的工位尽量集中在电柜侧,方便维护。
1.2 为什么主控选S7-1200而不是S7-1500
接触过不少同行,上来就想用S7-1500,说性能强、扩展好。但这类12工位的中型系统,很多时候S7-1200已经绰绰有余,没必要把钱花在冗余算力上。
先看I/O规模。整套设备开关量输入大概64点、输出48点,模拟量输入8点,主要是液压压力和气密仪的压力信号。S7-1215C自带14路数字量输入和10路数字量输出,再接一到两个SM1221和SM1222扩展模块,加上SM1231模拟量模块,配置刚好够用还有余量。
再对比通信能力。S7-1200固件版本到V4.4以上,自带PROFINET接口,可以作为IO控制器连接库卡机器人控制柜、远程I/O站、变频器和HMI。组态灵活,响应也足够快。对于需要高精度运动控制或者批量很大的数据采集项目,S7-1500会更合适,但本项目里1200完全扛得住。
我列个对比表方便大家按场景选型:
| 对比项 | S7-1200 | S7-1500 |
|---|---|---|
| 价格 | 低,对中小项目友好 | 高 |
| 编程软件 | TIA Portal | TIA Portal |
| PROFINET IO控制器 | 支持 | 支持,性能更强 |
| 运动控制能力 | 单轴及简单轴控制 | 高速高精度运动控制 |
| 适用规模 | 中小型产线、单机设备 | 大型产线、复杂工艺 |
| 本系统定位 | 逻辑控制加机器人调度 | 非必须 |
最后还有交期因素。当时项目交期只有两个月,S7-1200现货充足,S7-1500部分型号需要等货。做自动化项目,交期和成本往往是比性能更现实的问题,这也是我这次坚定选1200的原因。
1.3 机器人选型:负载、臂展、末端设计都得算清楚
库卡机器人的选型不是越大越好,关键是覆盖范围和姿态。这台机器人需要兼顾工位3的抓取、工位7的拧紧、工位11的下料,三个位置呈三角形分布,跨度不小,而且拧紧时需要末端姿态比较灵活。
我用的是库卡KR 8 R2100,负载8公斤,臂展2100毫米,重复定位精度±0.04毫米。负载上,工件加夹爪总重量约5公斤,留了足够的余量。臂展上,2100毫米可以覆盖工位3和工位7的直线距离,配合一根直线滑轨,工位11也能轻松到达。
末端设计是个容易忽略的坑。一开始只设计了一套气动夹爪,后来发现两种不同产品托盘,需要兼容两种料型,临时改用组合方案:气动夹爪加持真空吸盘。真空吸盘负责抓取表面平整的工件,气动夹爪负责半成品装配件,整个末端通过机器人控制柜里的IO模块切换。
有朋友会问为什么不用SCARA或者直角坐标机器人。主要原因是拧紧工序需要末端沿螺丝轴向施加压力,且姿态要随时微调,六轴机器人的灵活性明显更强。而在负载和精度都满足的前提下,六轴也是性价比较高的选择。
2. 通信与信号设计:PLC和机器人之间到底怎么说话
2.1 用PROFINET做主从通信,别用硬接线堆点数
PLC和库卡机器人控制柜KRC4之间,最传统的方式是硬接线I/O,一个启动信号一根线,一个故障信号一根线。但12工位系统里,PLC要给机器人的信号远不止启动和停止,还包括工件到位、复位允许、速度选择、抓手状态,机器人也要回传自动模式、程序运行、报警代码、动作完成。全用硬接线的话,电柜里光一根根标识管就能让调试人员崩溃。
这次我用PROFINET IO做通信。S7-1200作IO控制器,库卡KRC4在WorkVisual里配置成IO Device,TIA Portal中导入对应的GSDML设备描述文件,然后完成组态。两者之间的数据交换不是走以太网TCP/IP握手,而是现场总线级周期刷新,数据实时性有保障。
具体网络规划也很关键。PLC地址192.168.10.1,库卡机器人192.168.10.10,HMI 192.168.10.20,视觉系统192.168.10.30,全部在同一网段。设备之间用一个工业交换机互联,坚决不用普通家用交换机,普通交换机的芯片在强电磁环境容易丢包,这个坑后面还会提到。
2.2 控制字和状态字:一张表把PLC和机器人之间的规矩定死
PLC和机器人不是发一个启停信号就完事的,它们之间更像两个人通过暗号沟通:一方发指令,另一方回状态,每一拍都对得上。我把这种暗号设计成控制字和状态字,各占一个16位字长,地址上连续配置,方便PLC读写。
控制字是PLC发给库卡机器人的指令区。我用的地址是QW64和QW66,其中QW64是控制字,QW66里放着节拍速度设定值。状态字用IW64和IW66,IW64是机器人回传的状态字,IW66里预留故障代码。
控制字位定义大致如下:
| 位 | 信号名称 | 含义 |
|---|---|---|
| Bit0 | ST_START | 链动启动,上升沿有效 |
| Bit1 | ST_RESET | 复位机器人当前报警 |
| Bit2 | ST_PART_OK | 工件到位,允许抓取 |
| Bit3 | ST_PLACE_OK | 放料位空,允许放置 |
| Bit4 | ST_GRIP | 允许闭合抓手 |
| Bit5 | ST_READY_REQ | 机器人回Home位准备 |
| Bit15 | HEARTBEAT | 心跳信号,周期翻转 |
状态字是机器人回传给PLC的:
| 位 | 信号名称 | 含义 |
|---|---|---|
| Bit0 | ST_RDY | 机器人自动模式且准备好 |
| Bit1 | ST_RUN | 程序运行中 |
| Bit2 | ST_DONE | 当前动作完成 |
| Bit3 | ST_ERR | 机器人故障报警 |
| Bit4 | ST_ESTOP | 机器人急停状态 |
| Bit5 | ST_HOME | 机器人已回到Home点 |
| Bit15 | HEARTBEAT_ACK | 心跳应答 |
所有控制字位在程序里都要有注释,最好在PLC里建一个共享DB结构体,字段名直接叫这些英文符号,触摸屏报警时也能直接引用。
2.3 心跳信号必须加,这是花钱都买不来的教训
控制字和状态字设计完,还有一件事必须做:加一对心跳信号。控制字的Bit15是PLC发出的心跳位,状态字的Bit15是机器人应答位。
为什么这么干?有一次调试,PLC程序下载瞬间,某机器人控制器没有刷新到PLC最新的输出,旧信号还停留在"允许运动"状态,结果机器人在不该动的时刻启动了一步。虽然现场没有人受伤,但设备夹具被撞了一下,大家吓出一身冷汗。
加入心跳机制后,PLC每500毫秒翻转一次Bit15,机器人程序每个循环检查心跳是否在1秒内有变化。超过1秒没变化,机器人立即进入等待状态并给出通信异常报警,不动作、不等待、不误触发。反过来,机器人回传的心跳应答,PLC也在OB1里周期检查,超过2秒不翻转就判定通信异常,切断允许启动条件。
这个机制在大型设备集成里非常实用,但很容易被新人忽略。如果你也正在做PLC和机器人通信,建议无论如何都要把心跳加上,哪怕只是两个位,关键时刻能避免重大事故。
3. 分步落地:PLC程序架构、机器人示教与联合调试
3.1 电气设计与安全回路:先把命脉打通
电气部分我没有用太花哨的架构,但有一条原则:控制电源、动力电源、传感器电源必须分区。24V驱动电源负责机器人抓手电磁阀和总线IO,24V逻辑电源负责PLC、HMI和模块供电,传感器独立一组。分开供电能有效避免电机启停时电压跌落引起PLC闪断。
安全回路这关不能省。现场配置了安全继电器,急停按钮、安全门开关、机器人安全触点全部串入同一回路。任何一个条件断开,整个系统主继电器掉电,机器人和倍速链同时停止。这里要特别提醒,不能只停机器人不停线体,因为机器人动作通常和线体托盘位置强相关,线体还在动而机器人停了,等于把工件往机器人身上送。
所有安全回路必须独立于PLC程序运行。也就是说,哪怕PLC程序逻辑有bug,物理上的安全回路依然能切断动力。这一点在交底给客户时,我会反复和甲方电气负责人强调,设备调试阶段宁可多花半天捋这条回路,也不能省。
3.2 TIA Portal里的PLC程序架构与人机逻辑
S7-1200程序我按功能拆了几个块,避免所有逻辑堆在OB1里后期没法维护:
- OB1:主程序循环,调用各个功能块
- FC10_ConvCtrl:倍速链启停和工位到位判断
- FC20_RobotCtrl:机器人控制字、心跳、状态字解析
- FC30_DataProc:打码数据、MES对接数据记录
- FC40_Alarm:报警采集和HMI显示
其中FC20_RobotCtrl是最核心的一块,负责机器人握手。用SCL写的话,逻辑会长这样:
FUNCTION FC20_RobotCtrl : Void VAR bStartPulse : Bool; bPartInPos : Bool; END_VAR // 自动启动按钮上升沿,置位控制字Bit0 IF "HMI_DB".AutoStart AND NOT "HMI_DB".AutoStartOld THEN "Robot_DB".CtrlWord.%X0 := TRUE; END_IF; "HMI_DB".AutoStartOld := "HMI_DB".AutoStart; // 托盘到位后,置位允许抓取位 IF "DB_Conveyor".PalletInWork AND "Robot_DB".StatusWord.%X0 THEN "Robot_DB".CtrlWord.%X2 := TRUE; ELSE "Robot_DB".CtrlWord.%X2 := FALSE; END_IF; // 心跳位翻转 "Robot_DB".CtrlWord.%X15 := "DB_Time".Heartbeat;这个写法没什么高级技巧,但直观、好查错。位号每一行都对应数据手册里的定义,现场调试出了问题,看状态表就知道是哪一位没通。
3.3 库卡机器人端KRL程序框架与握手流程
库卡机器人的程序在WorkVisual里开发,通过KRL语言编写。机器人侧的逻辑不复杂,核心思路是每个动作之前都要等PLC的允许信号,动作完成后把状态位置位告诉PLC。
主程序框架我写成死循环,PLC没发指令时机器人就一直停在Home点等待:
DEF RobotMain() BASICPROG ; 初始化 PTP HOME VEL := 20% SYS := #VEL OUT[31] = FALSE ; 状态字 完成信号清除 REPEAT ; 等待PLC置位Bit0,启动整个循环 REPEAT WAIT SEC 0.1 UNTIL $IN[31] = TRUE ; 执行取料动作 PTP PICK_POS VL := 30% GRIPPER(TRUE) ; 闭合抓手 ; 放置到装配台 PTP PLACE_POS VL := 30% GRIPPER(FALSE) ; 打开抓手 ; 通知PLC动作完成 OUT[33] = TRUE WAIT SEC 0.2 OUT[33] = FALSE ; 回到Home等待下一个循环 PTP HOME VEL := 30% SYS := #VEL UNTIL FALSE END代码里的$IN[31]和$OUT[33]是WorkVisual中做好的PROFINET映射,对应控制字Bit0和状态字Bit2。映射关系要跟PLC端地址对应好,否则两边各自正常但始终无法握手。
拧紧工位的逻辑也类似,区别是机器人要在运动过程中根据视觉系统传来的偏移值做坐标增量调整,KRL里用几何运算指令完成。这里不展开代码细节,但设计上有一个关键点:所有坐标偏置必须在机器人坐标系下换算,别直接叠加到位姿变量上。
3.4 联合调试流程:先把机器人速度降到10%再说
联调阶段我的习惯是分五步走,每一步都有明确验收标准。
第一步,机器人单独示教。手动模式下把所有点位走顺,确认每个坐标都在安全范围内,尤其注意拧紧枪接近螺丝时有没有干涉风险。
第二步,PLC侧IO仿真。不启机器人,通过HMI模拟信号源,检查PLC程序里每个功能块的输出是否符合预期。这一步能抓出大部分逻辑漏洞,比如互锁条件写反、到位信号没有边沿触发。
第三步,半自动联调。PLC把机器人放在自动模式但速度因子设为10%,每次只有一个动作循环。重点观察通信信号波形,看控制字的状态变化和机器人回传状态位是否严格按顺序走。
第四步,全自动低速跑。倍速链正常流转,机器人速度提到30%,跑满20个循环。这时候主要看托盘定位和机器人抓取位置的一致性。
第五步,全速连续空跑。机器人速度100%,倍速链全速,连续跑48小时。期间记录报警次数、停顿次数,稳定后第49小时开始小批量带料试产。48小时连续空跑的意义在于,很多间歇性故障只有在长时间运行后才会暴露,比如某个传感器温度升高后误动作,或者网络报文偶发丢包。
4. 调试现场遇到的高频问题和排查技巧
4.1 PROFINET设备闪断,报警一天出现两三次
调试中系统每隔几小时报一次PROFINET设备故障,机器人暂停,过几秒又自动恢复。查TIA诊断缓冲区,发现是机器人IO设备连接中断再恢复,时间戳集中在早上气泵启动和下午空调开启的时间段。
定位后发现两个原因:一是PLC和机器人之间用的普通交换机,电磁兼容能力差;二是动力线缆和网线在同一个线槽里走了将近6米。
处理方案很简单但很有效:换掉普通交换机,改用工业级交换机,网线全部换成带屏蔽层的工业以太网线,并且把动力线缆和网线分开走线。改造后,一周内再没有出现过通信中断。
很多年轻工程师一遇到通信闪断就怀疑PLC程序逻辑,其实物理层的问题占了绝大多数。记住一个原则:先查线、再查交换机、最后查组态,不要一上来就改程序。
4.2 机器人不响应PLC启动信号,原因却是操作模式没切对
有一次现场反馈机器人按了启动按钮没反应。控制字状态都正常,PLC侧状态字显示机器人没有进入自动模式。检查机器人控制柜上的钥匙开关,发现还停在手动模式。
这里有个细节容易踩坑:库卡KRC4有个虚拟模式,手动模式下也能通过程序进行位操作,但ROBOT模式下程序循环和PLC的自动握手是断开的。PLC侧状态字Bit0实际上是"自动模式且准备好",所以必须保证机器人操作面板上的模式选择真正旋到AUT,才可能完成握手。
后来我在HMI报警页面上专门加了一条"请检查机器人是否处于自动模式"的提示,并在PLC逻辑里把自动模式信号单独引出来显示在总览画面上,现场操作工一眼就能看到状态,基本不会再误判。
4.3 信号干扰导致抓手误触发,机器人半路停下来
还有一次出现更隐蔽的问题:机器人抓取动作完成后,PLC收到抓手原位传感器信号后应该立即放行,但现场机器人偶尔停在半路不走。检查状态字发现是取料完成信号没有正常上升。
用万用表量传感器线路没问题,最后用示波器看信号发现传感器电压在机器人电机加速瞬间有几十毫伏的抖动。原因是伺服电机的屏蔽层没有接地,动力电缆和传感器电缆在同一个拖链里平行走了几米。
解决步骤是:给屏蔽层做单端接地,传感器电缆换成双绞屏蔽线,拖链内把动力电缆和信号电缆用隔板强制分开。同时在PLC里将传感器输入延时设置为2毫秒,滤掉高频毛刺。这三招组合下来,误触发彻底消失。
这里提醒做设备集成的朋友,拖链里的布线规范不是纸上谈兵,动力与信号不分离,早晚通过设备停机的方式让你长记性。
4.4 节拍从75秒压到58秒,靠的是动作重叠而不是蛮干
设备初步联调完成后,实测单件节拍75秒,距离客户要求的60秒差了15秒。一测数据,瓶颈集中在视觉检测8秒、气密检测20秒和拧紧9秒。单纯压缩机器人速度没用,得让动作重叠起来。
第一刀切在机器人动作路径上。原来机器人从抓料位到拧紧位走的是"L"型路径,中间有两个不必要的抬高。在确保不撞夹具的前提下,改成圆弧过渡,缩短了约1.8秒。
第二刀切在等待逻辑上。原来视觉检测结束后线体才启动,其实视觉检测完成前3秒,线体就可以预启动到下一工位。把PLC程序里"检测完成"触发改成了"检测完成前提前3秒预启动",捡回了约1.5秒。
第三刀切在缓存上。工位10本来是成品缓存,实际长期空闲,我把下料机器人提前到缓存位等待,减少机械臂从Home点远距离启动的时间。三刀下来,节拍稳定在58秒左右,已经跑进客户KPI。
节拍优化最大的心得是:先拿秒表记录每个设备实际动作时间,别靠感觉,找出真正的瓶颈工序,再动程序。
4.5 高频问题排查速查表
现场调试期我习惯把这些高频问题整理成一张速查表,贴在电柜门上,也发一份给客户维护团队:
| 故障现象 | 可能原因 | 优先排查步骤 |
|---|---|---|
| 机器人不动作 | 模式没切到自动、心跳异常、急停回路断开 | 查模式开关、状态字Bit0、安全回路 |
| PROFINET设备闪断 | 网络干扰、交换机问题、IP冲突 | 查网线屏蔽、工业交换机、TIA诊断缓冲区 |
| 机器人运动中突然停机 | 信号干扰、传感器误触发、安全门震动 | 查传感器波形、安全回路、输入滤波 |
| 抓取位置偏 | 托盘定位误差、坐标零点漂移 | 重新示教零点、检查工装定位销 |
| 节拍超时 | 瓶颈工序过长、等待逻辑不合理 | 秒表实测各工位时间,找瓶颈优化 |
5. 项目收尾后的一点心得
这套12工位系统做下来,我最大的体会是,自动化项目真正难的不是单机功能,而是设备之间的“对话协议”。PLC和机器人各自都是成熟的设备,把它们组织成一个节奏一致的系统,全靠那16位控制字、16位状态字和心跳信号。协议设计得规范,后面写代码、联调、售后都会很顺;协议含糊,调试阶段一定会反复折腾。
如果你也正在做类似项目,我的建议是:动手写第一行程序之前,先把控制字、状态字、心跳周期、地址映射表全部定下来,做成文档发给所有相关工程师。这不是流程繁琐,而是让每个人拿着同一张地图干活。
还有一点是联调阶段一定要留够时间。机械问题、电气问题、软件问题往往不会单独来,经常是你刚把通信调通,机械干涉又冒出来,然后发现是气路压力不足。预留10天以上的现场联调和老化时间,对整个项目是值得的。
这套系统后续还可以继续扩展:接视觉引导机器人抓取、接MES做生产数据远程上报、机器人末端做自动换爪,这些都在现有架构上留有接口。自动化产线就是这样,骨架稳定了,往上加功能只是时间问题。