最近做了一套把PLC、机器人和运动控制三条线拧在一起的小工作站。说起来一句话的事,实际联调那段时间确实挺折腾:PLC像工厂里的调度主任,管逻辑、管传感器、管安全;机器人负责搬搬抬抬、干精细活;运动控制里的伺服轴又要在节拍里精准走位。三个系统各说各话,协议不同、编程环境不同,可偏偏要在一个节拍里配合得严丝合缝。写这篇东西,就是想把这套系统的集成思路、通信规划、参数计算和调试踩坑记录下来。对做非标自动化、机器人集成,或者想转自动化集成的朋友,应该有点参考价值。我不只讲概念,会把能直接落地的通信方案、信号表、调试流程都摊开来说。
1. 集成思路与系统架构
1.1 为什么要做“三合一”集成
有人问过,为什么不能一台控制器把活全干了?这问题我也想过,但实际干过之后会发现,三个系统的专长是互补的,强行合并等于自废武功。
PLC的核心能力是逻辑控制和顺序控制。设备上的传感器信号、气缸动作、门禁互锁、急停回路,这些最适合交给PLC,因为它的可靠性高、响应快、梯形图调试直观。机器人控制系统的核心能力是轨迹规划和位姿运算。六轴机械臂要在空间里走直线、画圆弧、避障,这些计算量很大,不是PLC的强项。运动控制里的伺服驱动器,核心能力是高速高精度的位置、速度和力矩控制,一个扫描周期内就能完成位置闭环。
把这三种设备组合起来,一台设备才能同时做到“脑子清楚、手脚灵活、动作精准”。我做的那个工作站就是典型:PLC负责整个流程调度,机器人负责抓取和装配,伺服轴负责把工件送到精确位置。只用PLC做不了机器人轨迹,只用机器人又管不了整台设备的逻辑,必须各司其职再连成一体。
这种集成在非标自动化领域尤其常见。很多产线上的上下料工位、检测工位、装配工位,都是PLC加工业机器人和伺服轴的组合。能把这三者稳定地打通,基本上就能独立承担一个中型集成项目。
1.2 控制层级:谁指挥谁
集成之前,先要画清楚控制层级,不然程序写一半就开始乱。
通常我会把系统分成三层。最下面是执行层,包括伺服驱动器、变频器、气缸阀岛、传感器。中间是控制层,包括PLC和机器人控制器。最上面是信息层,也就是MES或者SCADA系统,负责数据采集和生产管理。在大部分工作站里,PLC处于控制层的核心位置,机器人控制器虽然也是“大脑”,但在整个设备里更多扮演执行设备的角色。
这样一来,信号流向就清楚了:PLC通过现场总线或IO模块给机器人发启动、停止、复位指令,机器人把运行中、完成、故障等状态回传给PLC。伺服轴的使能、速度给定、回原点指令,也是由PLC或机器人控制器下发。
安全回路必须独立于通信网络。急停、安全门、光栅这类安全信号,我从来不走总线,全部用硬接线串联到安全继电器,再分给PLC、机器人和伺服驱动器。通信网络断了最多是设备停一下,安全回路失效可能直接出大事故。这条原则不管是小工作站还是大型产线,都不能妥协。
1.3 通信方案怎么选
通信方案是整个集成项目里最重要的技术决策,选错了后面全是坑。我常用的方案有四种,分别讲一下适用场景。
第一种是PROFINET,西门子生态下的首选,S7-1200、S7-1500配合西门子伺服和机器人基本都能无缝对接,实时性高,组态方便。第二种是EtherCAT,在运动控制领域用得非常多,汇川、倍福、高创这些伺服基本都支持,适合轴数多、同步性要求高的场景。第三种是Modbus TCP,通用性最强,几乎所有PLC和机器人控制器都支持,虽然实时性不如前两种,但做站内联动、数据交换完全够用。第四种是IO点对点,老设备、现场环境恶劣或者通信协议实在对不上的情况,用硬连线最稳。
我自己做中小型项目,优先选Modbus TCP或EtherCAT。原因是调试方便,一根网线就能解决,PLC端和机器人端都有现成指令库。再加一个备用原则:所有关键信号除了走总线,再预留一部分IO点作为应急通道。万一总线通信出了奇怪问题,还能用手动模式把设备转起来。
| 方案 | 实时性 | 布线成本 | 适用场景 | 典型品牌/生态 |
|---|---|---|---|---|
| PROFINET | 高 | 中 | 西门子设备集成 | 西门子S7系列、西门子伺服 |
| EtherCAT | 很高 | 低 | 多轴运动控制 | 倍福、汇川、高创 |
| Modbus TCP | 中 | 低 | 跨品牌数据交换 | 几乎所有PLC和机器人 |
| IO点对点 | 中 | 高 | 老旧设备、应急兜底 | 所有品牌 |
2. PLC与机器人通信:搞定点位才算拿到钥匙
2.1 机器人侧怎么接入
机器人和PLC通信,首先要确定谁做主站、谁做从站。我一般让PLC做主站,机器人做Modbus TCP Server,在机器人控制器里开放一块保持寄存器区。PLC按约定的地址循环读写这块区域。
不同品牌机器人的Modbus配置方式不太一样。AUBO有外部轴和Modbus配置界面,UR可以直接在脚本里定义寄存器映射,发那科和安川则需要搭配IO板或总线选项卡。但通用思路是一致的:在机器人侧建一张映射表,把机器人内部变量映射到Modbus寄存器地址上,PLC侧按这张表读写。
这里有个容易忽略的点:地址编号。很多机器人的寄存器编号从0开始,但Modbus标准协议里保持寄存器地址是40001开始的。实际操作时,你在机器人手册里看到的"寄存器10",可能对应PLC侧Modbus地址40010或者40011,差一位就会读到完全错误的数据。建议两边工程师先把地址映射表确认好,写进设计文档里,再开始编程。
2.2 控制字与状态字:一个字节就能避免乱套
很多新手集成时喜欢一个信号一个信号地传,启动给一个位,停止给一个位,复位再给一个位。功能上没问题,但信号一多就容易乱,排查起来也麻烦。我更推荐用控制字和状态字的方式。
控制字用一个16位寄存器,每一位定义一种控制命令。比如Bit0是启动请求、Bit1是暂停请求、Bit2是复位请求、Bit3是急停确认。PLC把这16个位的状态组合成一个整数,一次写进机器人寄存器。机器人那边读到这个控制字,按位解析执行对应动作。状态字同理,机器人把运行中、完成、故障、正在复位等状态打包放进一个寄存器,PLC一次读取,逐个位判断。
这种方式最直接的好处是通信次数少、程序简洁、排查方便。遇到问题,直接把控制字和状态字以十六进制数看一遍,就能判断谁的状态不对。
还有一个核心概念叫握手信号。比如PLC发启动请求,机器人收到后开始初始化,完成后把“准备好”标志置位。PLC要等到“准备好”标志有效后再发下一阶段指令。没有握手,PLC可能刚发完启动就立马发下一条指令,机器人还在回零,程序直接乱套。握手本质上就是生产管理里的“确认机制”,宁可多等一个扫描周期,也不要让设备在不确定状态下冲出去。
2.3 实操:PLC作为Modbus TCP主站读取机器人状态
以西门子S7-1200和一款标准六轴机器人为例。机器人侧设置好保持寄存器区,基址192.168.0.10,端口502,寄存器映射表如下:
| 寄存器地址(PLC侧) | 方向 | 内容 |
|---|---|---|
| 40001-40002 | 读 | 机器人状态字 + 当前程序号 |
| 40003-40004 | 读 | 当前TCP坐标X/Y |
| 40005-40006 | 读 | 当前TCP坐标Z/RX |
| 40011-40012 | 写 | PLC控制字 + 目标程序号 |
| 40013-40014 | 写 | 附加参数1 + 附加参数2 |
PLC侧调用MB_CLIENT指令。TIA Portal里配置连接描述符,指向机器人IP地址和端口502,然后周期发送读取请求。核心参数大概是这样:
// 伪命令,具体以TIA Portal实际界面为准 MB_CLIENT( REQ := 触发位, // 上升沿触发一次读写 CONNECT := "机器人连接描述符", MODE := 2, // 2=读取保持寄存器 DATA_ADDR := 40001, // 起始地址 DATA_LEN := 16, // 读取长度 DATA_PTR := "状态数据区" // 数据存入DB块 );读取请求用定时器或扫描周期触发,建议500毫秒一次,不要过快。很多机器人内部变量的刷新周期是100毫秒,PLC读太快也拿不到新值,浪费网络资源还容易造成数据时标混乱。
写操作单独做。控制字变化只在上升沿触发一次写入,用边沿检测指令包装好,避免每个扫描周期都往机器人写值。这样机器人侧不会因为重复收到相同指令而出现异常。
3. 运动控制与PLC联动:从单脉冲到一台真正的设备
3.1 PLC怎么控制伺服:脉冲与总线的两条路
伺服控制接入PLC有两种常见路径。一种是脉冲控制,PLC的高速脉冲输出口输出脉冲串和方向信号,接到伺服驱动器的脉冲接口。这种方式的优点是接线直观、参数简单,适合轴数少、精度要求不极端的场景。缺点是脉冲频率有上限,而且一个轴至少要占用两个高速输出点,轴数一多PLC的点位压力非常大。
另一种是总线控制,通过EtherCAT或PROFINET报文,PLC直接读写伺服的内部对象字典,位置、速度、转矩、状态字都能通过报文交换。这种方式的优点是接线量小、扩展性好、实时性高,适合多轴联动。缺点是调试门槛高,伺服驱动器的从站配置、PDO映射、同步模式都要花时间搞清楚。
我常用的判断标准是:轴数超过2个,或者各轴之间有联动关系,直接上总线。只有一两个独立轴做简单定位,用脉冲方案性价比更高。混搭也可以,比如工作站的X轴Y轴用总线,夹爪气缸和旋转台用IO控制,这样既保证精度又降低成本。
3.2 电子齿轮比的计算:别被驱动器参数吓到
第一次设置伺服电子齿轮比的人很容易懵,其实核心就是算一笔账。
我举个实际例子。一条直线轴,丝杠导程5毫米,减速比1:1,伺服电机编码器分辨率是10000脉冲/转。设计要求是每个指令脉冲对应0.001毫米。电机转一圈,工作台移动5毫米,那么电机转一圈需要5000个指令脉冲。驱动器内部实际分辨率是10000脉冲/转,所以电子齿轮比就是10000除以5000,等于2。
设定驱动器电子齿轮比相关参数时,分子设2、分母设1,或者按照厂家参数定义反着填,反正数值上就是2。不同品牌参数名称不一样,有的叫“指令脉冲倍率”,有的叫“电子齿轮比分子分母”,但计算逻辑不变:
- 先查清电机每转一圈的反馈脉冲数(编码器分辨率,注意是否已经4倍频);
- 再算一轴每转一圈对应多少移动量(导程乘以减速比);
- 结合想要的脉冲当量(每脉冲移动距离)算出每圈需要多少指令脉冲;
- 两个脉冲数一除,就是电子齿轮比。
这个参数设错了,设备上电一跑,位置全错。设好之后用百分表或激光干涉仪验证一下实际移动距离,比在程序里找半天问题高效得多。
3.3 多轴协同:编码器反馈、追速与追距
自动化产线里比“单个轴动一下”更常见的是“多个轴配合着动”。比如输送线不停顿,机器人在运行中抓取工件,这时候就牵涉到编码器反馈和追速。
我在一个项目中是这样做的。输送线上装一个增量式编码器,PLC的高速计数器实时读取编码器脉冲,推算出工件当前位置。机器人的抓取位置不是固定的物理坐标,而是由PLC动态计算出来的目标寄存器值。当工件进入抓取窗口,PLC给机器人发一个同步指令,把当前位置和目标位置一起下发,机器人在移动中完成抓取。
这里有个经验:不要试图让机器人绝对达到和输送线完全同步,成本太高。更实用的做法是设定一个允许抓取的窗口区间,PLC算好工件到达窗口的时间和位置范围,机器人提前到等待点,等到窗口打开再动作。这样对编码器精度、PLC运算周期、机器人响应速度的要求都宽松很多。
3.4 温度PID波动大怎么调
有些集成项目除了运动轴,还带加热工位,这时候PID调节就来了。很多人一遇到“设定100℃,实际温度在95℃到105℃之间来回晃”就开始乱调参数,结果越调越糟。
温差大的常见原因,不是P太大就是积分作用不匹配。我调整的思路是:
先看采样周期和输出周期。温度系统的惯性很大,PID采样周期设置为1秒比较合适,输出周期通常用固态继电器或模拟量连续控制。如果输出周期比系统惯性还长,会产生很明显波动。
再检查比例增益。温度波动大,第一反应是把P往小了调。用一个单独的温度PID回路,先设置纯P控制,把P从大到小试,找到系统开始等幅振荡的临界增益,再按经验公式折算P和I值。这种做法看起来粗糙,但比凭感觉改参数可靠得多。
关于积分,温度PID很容易出现积分饱和。解决办法是在PLC里做积分限幅,把积分输出限制在最大输出的10%到20%以内。很多PLC的温度PID指令都有抗积分饱和选项,一定要打开。微分一般不常用,用不好会把噪音放大,温度控制里尽量少用或者设一个较小的微分时间。
最后一点:做一次空载自整定,再做一次带负载自整定。有些工程师为了省时间,直接在额定工况下自整定,结果炉子还没热起来就开始振荡。带负载自整定一定要等工艺温度稳定之后再触发,不然参考的就是动态过程,整出来的参数没法用。
4. 联调实录:一台抓取工作站从零到投运
4.1 第一步:先单机调试,别急着连通信
我见过不少新手上来就把PLC、机器人、伺服全部连好,然后一上电乱成一片。联调的正确顺序一定是先单机后互联。
单机调试阶段,PLC单独下载程序,把所有IO点逐个强制一遍,确认传感器和气缸对应关系没有接错。机器人单独手动跑一遍测试程序,确认各轴运动方向、限位开关、TCP坐标是否正确。伺服轴单独回原点,确认正反方向、软限位、硬限位都和设计一致。
这个阶段如果发现方向反了、限位接错、原点不对,改起来非常简单。等三套系统都连好再发现这些问题,排查时又要断通信又要断电,效率低一倍不止。
单机调试的同时把点表核对完。点表是所有联调工作的基础,每个信号从哪来、到哪去、什么协议、什么数据类型,全部写清楚。项目规模越大,点表的价值越明显。
4.2 第二步:打通通信,验证“写进去、读回来”
通信联调的核心就一句话:在PLC侧强制写一个值,去机器人监控界面看是否变化;再在机器人侧手动改状态字,看PLC能否读回来。
我先用最基础的方式验证通信链路通不通。PLC强制写一个0x0001到控制字寄存器,机器人程序里写一句把读到控制字打印出来。如果机器人侧能显示0x0001,说明下行的通信链路是通的。接着在机器人手动把状态字改成某个测试值,PLC添加一个监控表,看读到的值是否一致。两边都能对上,基本链路就没问题了。
这里有个很容易忽略的坑:字节序。如果机器人侧寄存器是高位在前,而PLC侧按低位在前解释同一个双字,数值看起来就会完全不对。特别是PLC和机器人不是同一个厂商的,字节序问题概率更高。调试时先在机器人侧写一个已知十六进制数,比如0x12345678,再看PLC读出来是不是这个数,不对就调整字节交换设置。
4.3 第三步:整机节拍联调与连续运行
通信通了,单机功能都正常了,接下来是节拍联调。
我把每个工位动作时间用秒表或者PLC在线监控逐一记录,列成一张时间清单。比如上料气缸1.2秒,机器人抓取2.5秒,伺服定位0.8秒,机器人放料1.8秒。把这些时间加一加,找到整个流程里最长的那一段。总节拍不取决于所有动作之和,而是等于关键路径上的累计时间,其他动作都应该尽量与它并行。
如果节拍不够快,我不会一上来就加伺服速度,而是先找“等待浪费”。比如机器人已经到了抓取位,但PLC还在等一个延迟定时器走完,这种固定的等待时间删掉就能省出一大截。之后才是优化机器人的轨迹,把直线运动改成部分圆弧过度,减少加减速造成的等待。
连续运行测试一定要做够24小时。很多偶发问题,比如通信偶尔超时、机器人偶尔报一个低级报警、伺服偶发振动,只有长时间跑才会暴露。连续运行期间记录报警日志,即使自动恢复了也要分析原因,不能只靠“清除报警继续跑”的坏习惯。
5. 常见问题与排查技巧实录
5.1 通信掉线、数据不刷新怎么查
通信掉线是集成项目里最让人头疼的问题,但绝大部分原因比较固定,用表格排查起来很快。
| 现象 | 可能原因 | 排查方法 | 解决建议 |
|---|---|---|---|
| 通信偶尔断开,恢复后又能工作 | IP地址冲突 / 网线接触不良 | 检查设备IP,换一根网线试 | 固定IP规划,压接水晶头 |
| PLC读写请求一直报错 | 从站未就绪 / 端口不对 | 机器人侧确认服务开启 | 确认端口号和防火墙设置 |
| 数据读到了但是值不对 | 字节序、寄存器编号偏移 | 写入已知值对比 | 统一字节序配置和地址映射 |
| 每隔一段时间就不同步 | 主站轮询太快或从站处理不过来 | 看PLC扫描时间和从站负荷 | 加长轮询周期或改由从站主动上报 |
我自己的习惯是在机器人程序和PLC程序里都加心跳。PLC周期性地给机器人写一个递增计数值,机器人判断超过一定时间计数值没变化,就认为通信异常,进入安全暂停状态。反过来机器人也有一个心跳寄存器持续递增,PLC监控这个值,超时则触发报警并停止后续动作。
5.2 机器人报警和伺服报警的通用排查思路
不同品牌报错代码各不相同,比如有些国产机器人报7990这类代码,很多人第一反应是搜“这个代码是什么意思”,其实更好用的问题是“这个动作之前发生了什么”。报警代码只是结果,要找的是原因。
我的排查路线是固定的:先看报警时刻的设备状态,包括急停是否被按下、安全门有没有打开、抱闸有没有正常释放、伺服驱动器有没有报故障。这些排查完,再看是不是通信链路类的报警,比如总线超时、同步失败。最后才怀疑机械问题,比如卡滞导致过载、限位被撞。
伺服报警也是一样。过载报警先看机械是否卡死、抱闸是否完全打开、加减速时间是否太短。跟踪误差过大报警,先调增益或者放大允许误差范围,不要盲目加大位置环增益,很容易引起机械共振。
5.3 博途与触摸屏不兼容、PLC下载失败这类软件坑
用博途的时候,偶尔会遇到写着“找不到设备”或者“无法建立在线连接”,特别是配合第三方模拟屏的时候。这种问题多数不是PLC坏了,而是PG/PC接口设置不对,或者PLC固件版本和博途版本不一致导致的。
遇到这种情况,先检查博途里Online access的设置,确认当前使用的是网卡而不是别的虚拟接口。再检查PLC的IP地址是否和电脑在同一网段,模块是否处于可访问状态。如果连接正常但总保错,直接查看PLC固件版本,然后用TIA Portal Update更新固件,或者安装对应的GSD文件。
另外一个常见下载问题是“程序写入时校验错误”。这种情况说明上位机里正在运行的其他程序占用通信,或者网线质量差导致数据在传输过程中丢包。把杀毒软件实时防护暂时关掉、换一根短线网线,通常能解决。
5.4 PLC 程序丢失与下载的保命习惯
不止一个工程师遇到过设备调试到一半,PLC程序怎么都下载不进去的情况。程序倒是小事,重新写也就费时间,最怕的是原程序都没备份,设备上跑的还是别人祖传的老程序,一不小心就全丢了。
我现在有个铁规矩:任何PLC设备,下载新程序之前,必须先上传并保存现有程序。即使现场文档写得清清楚楚“当前程序就是版本V1.2”,也还是先把现场程序读到电脑里备份一份。因为现场设备可能在过去半年里被人用U盘更新过、被人手动改过,文档早就跟不上实际状态了。
下载时还要留意“初始化数据”这类选项。有些PLC下载时会附带清空保持型数据或者恢复出厂状态,一旦勾选,设备里所有配方、记录值、当前位置参数全部归零。下载前逐项检查这些选项,该取消的取消,该保留的保留,能省掉很多不必要的恢复工作。
6. 最后分享几个集成项目里的实际心得
这几个项目跑下来,我最大的体会是:大部分集成的技术难点都不在于某个单独系统,而在于接口处的细节。接口处最容易出的问题,几乎都是信息不对等造成的。机器人工程师不知道PLC侧扫描周期要多快,PLC工程师不知道机器人寄存器刷新频率是多少,最后两边代码都写了,联起来才发现互相等不到对方的信号。
现在我启动任何集成项目,都会先做一张接口总表。这张表列出每一个需要交互的信号名称、方向、协议、数据类型、地址编号、刷新周期、初始值。表写完之后还要让双方各写一版,坐下来逐条对。这个步骤看起来占掉半天时间,其实能把后边的联调时间缩短一半以上。
调试人员配置也很有讲究。联调的时候建议明确一个人做主控,所有指令由他统一发,其他人各自盯着自己的子系统。一个指令同时被三个人操作,出问题根本不知道是谁触发的。日志记录从第一次通电就开始做,哪怕后面不看了也要留着,很多偶发报警只有回头翻日志才能找到规律。
安全这一点,无论如何强调都不过分。所有的联调工作开始前,先确认急停回路有效、安全门联锁生效、机器人安全速度模式开启、测试程序限位合理。不要图方便拿胶带贴着安全门干一天,一旦出事就不是省时间的问题了。其实做集成项目到最后,大家拼的不是谁的设计更花哨,而是谁的设备更稳、更抗造。能把PLC、机器人和运动控制拧成一股绳,并且让这套系统连续几个月不闹脾气,这个项目才算真正落地。