
1. 项目缘起一条跑了十二年的老产线为什么要动它的大脑1.1 从一次深夜停机说起前年冬天一条跑了十二年的装配线在夜班突然趴窝。故障现象很典型主控柜里那套ControlLogix的CPU报了个背板通讯错误复位之后能撑几个小时然后又挂。备件库里翻了一圈同型号的CPU模块只剩一块还是当年项目验收时留下的压箱底存货。采购那边反馈这款型号已经进入长尾供货阶段交期从原来的四周拉长到了十六周价格也翻了一倍多。这件事之后厂里设备科开了个会核心议题就一个这条线的控制系统要不要换。换意味着产线要停、程序要重写、上位机要重新对接、现场几十台变频器和伺服要重新联调不换就得继续赌那块老CPU不出问题同时接受越来越长的备件周期和越来越贵的采购成本。最后的结论是换但有一个硬性约束不能大动干戈不能停线超过三天操作工和维修工的使用习惯不能变。说白了就是要在用户几乎无感的前提下把主控从ControlLogix换成国产PLC。这个约束条件直接决定了后面所有的技术路线选择。1.2 什么叫无感替换它到底难在哪无感替换这个词听起来很玄拆开看其实就三层意思。第一层是对操作工无感。HMI上的画面布局、按钮位置、报警文字、趋势曲线最好一模一样。操作工不需要重新培训交接班的时候不会因为找不到某个按钮而手忙脚乱。第二层是对维修工无感。电气图纸的I/O点位表、端子号、线号尽量保持对应关系。维修工拿着老图纸去查线还能查得到。程序里的符号名、注释最好也能延续这样在线监控的时候不至于看天书。第三层是对生产无感。产线的节拍、联锁逻辑、安全回路、与上位机MES的数据交互行为要一致。不能出现换完之后节拍变慢、某个联锁失效、或者MES收不到产量数据的情况。难就难在这三层是耦合的。你动了PLCI/O映射就变了I/O映射变了图纸就得改图纸改了维修工的习惯就被打破了。你想保住HMI画面就得让新PLC的变量地址和老PLC对得上你想让变量地址对得上就得在程序结构上做文章。这是一个牵一发动全身的活儿。1.3 为什么选国产PLC选型时我看了哪些维度选型这件事我没有一上来就比参数表而是先列了一张约束清单。I/O规模这条线数字量输入约180点数字量输出约120点模拟量输入16路模拟量输出8路另外还有几路高速计数和脉冲输出。通讯需求与三台变频器走总线通讯与两台伺服走脉冲加方向与上位机走以太网与MES走以太网。扫描周期原程序实测扫描周期在8到12毫秒之间新PLC不能明显慢于这个水平。编程习惯原程序是梯形图为主少量结构化文本新PLC的编程软件要能支持类似的编程方式减少移植工作量。供货与支持本地要有技术支持备件交期要短价格要透明。按这张清单去筛国产PLC里能同时满足I/O规模、总线通讯、以太网通讯和较快扫描周期的型号其实不少。我重点对比了几个主流系列最后选定的这款主要看中三点一是它的指令系统和原平台有较高的相似度很多逻辑块可以近乎逐行翻译二是它的以太网接口原生支持常见的工业协议和上位机对接不需要额外网关三是它的编程软件支持符号化编程和变量导入导出这对批量移植程序非常关键。选型时有个容易被忽略的点不要只看CPU本身的参数要看整个生态。包括扩展模块的种类、总线从站的兼容性、编程软件的成熟度、以及本地技术支持的响应速度。CPU再强扩展模块买不到也是白搭。2. 替换前的整体设计先想清楚保什么、改什么、弃什么2.1 三层替换策略硬件层、程序层、交互层动手之前我把整个替换工作拆成了三层每层的目标和策略都不一样。硬件层的目标是物理可替换。原机架上的模块按功能对应到新PLC的模块。数字量输入输出模块按点数匹配模拟量模块按通道数和信号类型匹配通讯模块按协议匹配。这一层的原则是能一对一就一对一不能一对一的用最少的模块组合实现同样的功能。程序层的目标是逻辑等价。原程序的每一条逻辑在新平台上都要有对应的实现。这里不是简单的复制粘贴因为两个平台的指令集、数据类型、寻址方式都有差异。我的做法是先做逻辑梳理把程序按功能块拆开然后逐块移植、逐块验证。交互层的目标是体验一致。HMI画面、报警文本、趋势变量、MES接口这些是用户直接感知的部分。这一层的策略是HMI画面尽量不改通过变量地址映射来适配MES接口如果协议不同就在PLC侧做数据转换让上位机感觉不到变化。这三层的顺序不能乱。硬件层是基础程序层是核心交互层是门面。硬件没接对程序跑不起来程序逻辑不对交互层再漂亮也没用。2.2 为什么不做推倒重来而是选择逐点映射有人可能会问既然都换了为什么不干脆重新设计一套程序用新平台的思路来做我的答案是风险不可控。这条线跑了十二年程序里沉淀了大量现场调试出来的补丁。有些逻辑看起来莫名其妙但可能是当年为了解决某个偶发问题加上去的。你如果推倒重来这些隐性知识就丢了等到生产时某个工况一出现问题就暴露了。逐点映射的好处是每一段逻辑都有出处每一个改动都有对照。移植过程中如果发现某段逻辑在新平台上行为不一致可以回溯到原程序去比对定位问题会快很多。而且逐点映射天然适合分阶段验证今天移植一段明天验证一段风险是分散的。当然逐点映射也有代价就是工作量比较大而且新程序的代码可能不够优雅。但在工业现场能跑、稳定、好维护永远比优雅重要。2.3 停机窗口的规划三天时间怎么切分停线三天这个窗口是生产部门咬着牙给的必须精打细算。我的规划是这样的第一天上午旧柜断电、拆线、标记。所有拆下来的线用标签纸做好标记拍照存档。旧模块拆下来之后按位置编号装箱万一新系统有问题还能快速回退。第一天下午到第二天上午新柜安装、模块就位、接线。接线是体力活但也是细活每一根线都要对号入座接完之后用万用表逐点核对。第二天下午上电、硬件组态、通讯测试。先不跑程序只确认CPU能启动、模块能识别、通讯能通。第二天晚上到第三天上午程序下载、单点调试、联锁测试。先手动模式逐点测试I/O再跑自动逻辑最后做联锁和安全回路测试。第三天下午带料试运行、节拍验证、MES数据核对。留出至少半天时间做缓冲应对突发问题。这个规划的关键是留缓冲。实际执行下来接线和调试往往会超时所以第三天下午的带料试运行其实是理想情况。如果前两天进度落后就要果断调整宁可少试一点也要保证安全回路和核心联锁测试完整。停机窗口规划的一个铁律永远假设你会遇到至少一个没预料到的问题。所以缓冲时间不能省而且缓冲要放在最后不能放在中间。3. 硬件层实操从机架到端子的逐点对应3.1 机架与模块的对应关系梳理原系统的机架结构是一个主机架加两个扩展机架主机架放CPU、通讯模块和部分I/O扩展机架放剩余的I/O。新PLC的机架结构类似但模块的排列顺序和槽位定义不同。我的做法是先做一张对照表把原系统的每个槽位、每个模块的型号和功能对应到新系统的槽位和模块。这张表是后面所有工作的基础。原系统槽位原模块功能点数/通道新系统槽位新模块功能点数/通道主架0CPU-主架0CPU-主架1以太网通讯-主架1以太网通讯-主架2数字量输入32点主架2数字量输入32点主架3数字量输出32点主架3数字量输出32点主架4模拟量输入8通道主架4模拟量输入8通道扩展架1数字量输入32点扩展架1数字量输入32点扩展架2数字量输出16点扩展架2数字量输出16点扩展架3高速计数4通道扩展架3高速计数4通道这张表看起来简单但实际梳理的时候花了大半天。因为原系统的模块型号比较老有些模块的功能是复合的比如某个模块既有数字量输入又有数字量输出新系统里没有完全对应的型号就要拆成两个模块。拆模块意味着槽位要重新排槽位重排意味着背板通讯的地址要重新算这是一环扣一环的。3.2 接线端子的标签继承法接线是这次替换里最耗体力、也最容易出错的环节。我的策略是标签继承拆旧线的时候每一根线都贴上标签标签上写清楚原端子号-功能-去向。接新线的时候按照对照表找到新端子号把标签贴到新线上同时更新图纸。具体操作是这样的拆线前拍照。每个模块的接线端子排正面拍一张侧面拍一张线号朝向要拍清楚。照片按机架号和槽位号命名存到平板电脑里接线的时候随时调阅。拆线时贴标签。用那种可以手写的号码管或者用标签打印机打出来。标签内容格式统一为机架-槽位-端子号-功能缩写。比如R0-S2-01-DI01表示主架第2槽第1个端子数字量输入第1点。接线时对号入座。新系统的端子号在硬件组态完成后就确定了接线工拿着对照表和标签一根一根接。接完一个模块用万用表蜂鸣档逐点核对确认没有接错、没有虚接。接完线更新图纸。图纸是维修工以后查线的依据必须和实物一致。我用CAD把原图纸的端子号批量替换成新号然后打印出来塑封挂在柜门内侧。这套方法听起来笨但实测下来接线错误率极低。而且因为标签和图纸是对应的后面调试的时候查线非常快。接线环节的一个血泪教训千万不要相信我记得这根线是接哪里的。人的记忆在连续工作几小时之后是不可靠的。标签和照片是唯一靠谱的凭证。3.3 电源与接地容易被忽视的细节电源和接地是硬件替换里最不起眼、但最容易埋雷的部分。原系统的电源模块是24V直流给CPU、模块和部分现场仪表供电。新PLC的电源需求可能略有不同比如启动电流、纹波要求、隔离方式。我在替换前专门查了新CPU和模块的电源规格确认原电源的容量和纹波能满足要求才决定沿用原电源。如果容量不够就要换电源那又是一笔额外的停机时间。接地方面原系统是单点接地接地电阻实测在2欧姆左右。新PLC的接地要求类似但我额外做了一件事把模拟量信号的屏蔽层接地方式检查了一遍。原系统里有些模拟量信号的屏蔽层是两端接地的这在老系统里可能没出问题但新系统的模拟量模块抗干扰特性可能不同两端接地容易形成地环路引入干扰。我把这些屏蔽层改成了单端接地接在PLC侧。这个改动很小但后面调试的时候模拟量信号的波动明显比原来小。这说明接地方式对信号质量的影响是实实在在的。4. 程序层实操从梯形图到梯形图的翻译艺术4.1 程序结构的拆解与映射原程序大概有三千多行梯形图加上一些结构化文本。我先把程序按功能拆成几个大块主控逻辑、手动逻辑、自动逻辑、报警逻辑、通讯逻辑、安全逻辑。每个大块再细分成若干个子程序。拆解的时候我用了一个笨办法把原程序打印出来用荧光笔把不同的功能块标出来然后在旁边写上对应的新程序子程序名。这样一张一张过确保没有遗漏。映射的时候有几个原则主控逻辑原样移植因为这是产线的核心逻辑不能变。手动逻辑原样移植但要注意按钮的上升沿/下降沿触发方式两个平台可能不同。自动逻辑原样移植但步序的编号和跳转条件要仔细核对。报警逻辑原样移植但报警字的位定义要重新映射。通讯逻辑重写因为两个平台的通讯指令和数据结构不同。安全逻辑原样移植但安全回路的硬件和软件都要单独验证。这里重点说通讯逻辑。原系统与变频器走的是某种现场总线新PLC支持同样的协议但数据帧的格式和地址映射不同。我的做法是先在PLC侧把通讯数据映射到一组中间变量然后在程序里用这些中间变量去替换原来的通讯数据地址。这样上层逻辑不需要改只需要改通讯层的映射关系。4.2 数据类型与寻址方式的坑两个平台的数据类型和寻址方式差异是移植过程中最容易踩坑的地方。数据类型方面原系统的整数可能是16位有符号新系统默认可能是32位。如果不注意一个原本表示-1的整数在新系统里可能变成65535。这种错误在调试时很难发现因为数值看起来差不多但逻辑判断会出错。我的应对方法是在移植每一段逻辑之前先确认涉及到的变量的数据类型必要时显式声明。对于模拟量原系统可能是0到32767对应0到满量程新系统可能是0到27648这个比例关系要重新计算。寻址方式方面原系统可能是基于槽位的物理寻址新系统可能是基于符号的寻址。物理寻址的好处是直观坏处是换模块就要改地址符号寻址的好处是灵活坏处是初次配置工作量大。我的做法是在硬件组态完成后先建立一套符号表把每个I/O点、每个中间变量、每个定时器计数器都命名。命名规则沿用原程序的习惯比如DI01_StartButton、DO01_ConveyorRun。这样程序里的逻辑看起来和原来很像维修工在线监控的时候也容易理解。符号命名的一个技巧尽量沿用原程序的符号名哪怕原程序的命名不规范。因为维修工已经熟悉了那些名字你改成规范的名字反而增加了他们的认知负担。4.3 定时器、计数器与脉冲指令的差异处理定时器和计数器是程序里用得最多的指令也是两个平台差异比较明显的地方。原系统的定时器可能是TON接通延时时间基准是1毫秒或10毫秒设定值是一个整数。新系统的定时器可能也是TON但时间基准是100毫秒或者设定值的单位不同。如果不注意一个原本设定为5秒的定时器可能变成0.5秒或50秒。我的处理方法是在移植每个定时器的时候都重新计算设定值。计算公式是新设定值 原设定值 × 原时间基准 / 新时间基准。算完之后在程序里加注释写明原设定5秒新设定50100ms基准。计数器方面主要注意计数方向和复位方式。原系统的计数器可能是加计数新系统可能是加/减计数如果只用了加计数问题不大如果用了减计数就要确认方向。脉冲指令方面原系统可能是通过特殊的脉冲输出模块实现新系统可能是通过CPU内置的脉冲输出功能。这个差异比较大需要重新配置脉冲参数包括频率、占空比、脉冲数。我的做法是先用示波器测原系统的脉冲波形记录频率和占空比然后在新系统里配置相同的参数再用示波器验证。4.4 程序移植的验证方法分段下载与在线监控程序移植不是一次性下载完就完事而是分段下载、分段验证。我的做法是先把程序按功能块分成若干段每段下载后用手动模式或模拟输入的方式触发逻辑观察输出是否符合预期。验证通过后再下载下一段。在线监控是验证的主要手段。新PLC的编程软件支持在线监控可以看到每个变量的实时值、每个梯级的状态。我通常会同时打开原程序和新程序的监控界面对照着看。如果某个梯级的输出不一致就逐级往前查直到找到差异点。这里有个小技巧在关键逻辑点插入调试标志位比如在某个步序激活时置位一个标志在HMI上显示出来。这样调试的时候可以直观地看到程序执行到哪一步比盯着梯形图看要快得多。5. 交互层实操HMI与MES的无感对接5.1 HMI画面的变量映射策略HMI是操作工每天面对的东西画面一变他们立刻就能感觉到。所以HMI的替换策略是画面不改只做变量映射。原HMI与PLC的通讯是基于变量地址的。新PLC的变量地址和原系统不同所以需要在HMI侧重新建立变量连接。我的做法是导出原HMI的变量表包括变量名、地址、数据类型、注释。在新PLC的程序里建立一组HMI映射变量变量名和原HMI变量名一致地址指向新PLC的实际变量。在HMI侧把变量连接从原PLC地址改为新PLC的映射变量地址。逐画面测试确认每个按钮、每个指示灯、每个数值显示都正常。这个过程中最麻烦的是报警变量。原HMI的报警可能是基于报警字的位新PLC的报警字位定义可能不同。我的做法是在新PLC程序里把报警位重新排列让报警字的位定义和原系统一致。这样HMI侧的报警配置就不需要改。HMI映射的一个注意事项变量的数据类型要匹配。原HMI可能把某个变量当作16位整数新PLC可能是32位浮点数如果不改显示出来的数值会完全不对。5.2 报警文本与趋势曲线的延续报警文本是操作工判断故障的重要依据。原系统的报警文本可能是1号工位气缸超时新系统如果改成工位1气缸动作未完成操作工就会懵。所以报警文本要原样保留。趋势曲线方面原系统可能记录了某些关键参数的历史曲线比如温度、压力、速度。新PLC的数据存储方式可能不同但趋势曲线的显示可以延续。我的做法是在新PLC里建立数据记录把关键参数按原系统的采样周期存下来然后在HMI侧用同样的趋势控件显示。这里有个细节原系统的趋势曲线可能是基于HMI本地的数据记录新系统可能是基于PLC的数据记录。如果采样周期不同曲线的形状会有差异。我通常会先对比原曲线和新曲线确认趋势一致后再交付。5.3 与MES的数据接口适配MES接口是交互层里最看不见的部分但一旦出问题影响的是生产报表和追溯。原系统与MES的通讯可能是通过以太网用某种协议传输产量、状态、报警等数据。新PLC支持同样的协议但数据帧的格式可能不同。我的做法是抓取原系统与MES的通讯数据包分析数据帧的结构。在新PLC里按照同样的结构组织数据。在MES侧如果协议兼容直接对接如果不兼容在PLC侧做数据转换。数据转换的逻辑我通常写成一段独立的结构化文本程序把新PLC的内部变量映射到MES需要的格式。这段程序要加详细的注释因为以后维护的人可能不熟悉原系统的数据格式。MES接口调试的一个技巧先在PLC侧模拟数据用抓包工具确认数据帧格式正确再接入MES。这样可以避免因为数据格式问题导致MES侧报警影响生产。6. 调试与排查那些文档里不会写的坑6.1 上电初期的典型问题速查上电初期是最容易出问题的阶段。我整理了一张速查表覆盖了常见的问题和排查思路。现象可能原因排查方法解决措施CPU无法启动电源容量不足测量电源输出电压和纹波更换更大容量电源模块无法识别背板连接不良检查模块是否插紧背板电缆是否松动重新插拔更换背板电缆通讯不通地址冲突或协议不匹配检查IP地址、波特率、协议设置修改地址或协议配置I/O点无响应接线错误或模块故障用万用表测量端子电压检查模块指示灯重新接线或更换模块模拟量波动大屏蔽层接地不当检查屏蔽层接地方式改为单端接地程序扫描周期过长程序结构不合理在线监控扫描周期分析耗时指令优化程序结构减少不必要的指令这张表是调试时的急救包遇到问题先查表能解决大部分常见问题。6.2 通讯超时的排查思路通讯超时是调试中最常见的问题之一。我的排查思路是从物理层往上查。先查物理层网线是否插好水晶头是否压紧交换机是否正常工作。用网线测试仪测一下通断用替换法换一根网线试试。再查网络层IP地址是否冲突子网掩码是否正确网关是否可达。用ping命令测试连通性。然后查协议层协议是否匹配波特率是否一致数据位、停止位、校验位是否正确。用抓包工具看数据帧确认发送和接收是否正常。最后查应用层数据格式是否正确地址映射是否对应超时时间是否合理。对照通讯协议文档逐项核对。这个思路看起来简单但实际排查时很多人会跳过物理层直接查应用层结果绕了一大圈才发现是网线没插好。6.3 模拟量信号的干扰处理模拟量信号受干扰是工业现场的老大难问题。这次替换中我也遇到了。现象是某个压力传感器的信号在PLC侧显示波动波动范围大概在满量程的2%左右。原系统没有这个问题说明干扰是新引入的。排查过程先确认传感器本身是否正常。用信号发生器替代传感器输出标准信号PLC侧显示稳定说明传感器没问题。检查信号线是否远离动力线。发现有一段信号线和变频器输出线走同一个线槽这是干扰源。检查屏蔽层接地。发现屏蔽层是两端接地的形成了地环路。检查PLC模拟量模块的滤波设置。新模块的滤波参数默认值可能和原模块不同。解决措施把信号线从动力线槽里移出来单独走线。屏蔽层改为单端接地接在PLC侧。调整模拟量模块的滤波参数增加滤波强度。在传感器侧加一个信号隔离器。处理后波动降到满量程的0.5%以内满足工艺要求。模拟量干扰的处理顺序很重要先查干扰源再查传播路径最后查接收端。不要一上来就加滤波器那样可能掩盖了真正的问题。6.4 安全回路的独立验证安全回路是这次替换里我最谨慎的部分。原系统的安全回路可能是通过安全继电器实现的新系统可能沿用安全继电器也可能用PLC的安全逻辑。我的做法是安全回路独立验证不依赖PLC的正常逻辑。具体来说安全回路的输入如急停按钮、安全门开关直接接到安全继电器安全继电器的输出直接控制接触器切断动力电源。PLC只负责监测安全回路的状态用于报警和显示不参与安全控制。验证的时候我逐个触发安全输入确认安全继电器动作、接触器断开、动力电源切断。同时确认PLC能正确监测到安全回路的状态变化并在HMI上显示报警。这个验证过程要反复做几次确保可靠性。安全回路不能有任何侥幸心理。7. 替换后的运行观察与经验沉淀7.1 前两周的运行数据对比替换完成后我持续观察了两周记录了一些关键数据。指标原系统新系统备注平均扫描周期10ms8ms新系统略快通讯响应时间50ms45ms基本持平模拟量波动1%0.5%新系统更稳定故障次数2次/周0次/周观察期内无故障操作工反馈-无感知画面和操作习惯未变从数据看新系统的表现略优于原系统尤其是在模拟量稳定性和故障率方面。操作工反馈和以前一样这正是我们想要的无感效果。7.2 维修工的反馈与图纸更新维修工是这次替换的直接使用者。他们的反馈主要集中在两点一是图纸要清晰二是程序要可读。图纸方面我把更新后的图纸打印出来塑封后挂在柜门内侧同时把电子版放到车间的共享文件夹里。图纸上标注了新旧端子号的对照关系方便维修工查线。程序方面我在新程序里保留了原程序的符号名和注释同时增加了一些新的注释说明哪些逻辑是移植的哪些是重写的。维修工在线监控的时候可以看到这些注释理解程序的意图。7.3 如果再来一次我会改进什么如果再来一次我会在两个方面改进。第一更早地介入HMI和MES的对接。这次HMI和MES的对接是在程序移植基本完成后才开始的导致后期时间比较紧张。如果能在硬件层完成之后就同步开始HMI和MES的准备工作整体进度会更从容。第二更充分地准备备件。这次替换过程中有一个模块的备件是临时调货的虽然没影响进度但风险比较大。下次我会提前把关键备件备齐包括CPU、通讯模块、电源模块。7.4 给同行的几条实操建议最后分享几条给同行的实操建议。先做对照表再动手。对照表是这次替换的总纲所有工作都围绕它展开。没有对照表接线和编程都会乱。标签和照片是生命线。拆线时的标签和照片是后面接线和查线的唯一依据。不要省这个时间。分段验证不要一次性下载。程序移植要分段下载、分段验证每段验证通过后再进行下一段。这样可以快速定位问题。安全回路独立验证。安全回路不能依赖PLC的正常逻辑要独立验证反复验证。留足缓冲时间。停机窗口的规划要留缓冲而且缓冲要放在最后。实际执行中超时是常态缓冲是唯一的应对手段。这次替换做完之后我最大的体会是无感替换的核心不是技术有多先进而是对细节的把控有多到位。每一个端子、每一行程序、每一个变量都要反复核对。技术方案可以复制但细节的把控需要经验和耐心。