搞检测设备这几年,我越来越觉得,一台自动检测机能不能稳定运行,控制架构的选择比机械结构还关键。最近手头这套小型电子元器件的自动检测机,就是用欧姆龙NX1P2系列总线PLC做主控做的,从伺服运动到传感器IO,再到视觉数据交互,全部走总线,EtherCAT管运动、EtherNet/IP管数据。这套系统从选型到调试跑通,踩了不少坑,也总结了不少经验。这篇文章把整套方案掰开讲清楚,包括为什么选NX1P2、总线架构怎么搭、程序怎么写、现场调试会遇到什么问题。准备用NX1P2做设备的同行,或者正在纠结“普通PLC加脉冲”和“总线PLC”怎么选的朋友,看完应该能少走一些弯路。这是一台什么设备?检测对象是小型电子元器件,具体是一种板卡上用的连接器外壳。检测项分两大类:一是外观缺陷,包括划伤、脏污、变形;二是关键尺寸,比如两个配合面的间距和端子孔的位置度。工艺节拍要求5秒以内完成一个工件的检测。设备结构上分成上料工位、检测工位、分选工位三个区,上料由振动盘加直振送料,检测工位有一组XY轴带动工件运动,视觉系统固定在横梁上,分选工位用气缸加滑台把OK和NG的产品分开。整套设备伺服轴一共4个,气缸和电磁阀十几个,检测传感器包括光电、光纤、接近开关,加起来几十个点,再加上两套视觉系统需要数据通信。这个架构如果用传统脉冲PLC做起来会非常吃力,这也正是我选择NX1P2的直接原因。1. 检测机选型必看:NX1P2为什么能扛住多轴协同1.1 自动检测机对控制系统的硬性要求先把需求捋一遍。这类检测机虽然结构看着简单,但对控制系统的要求其实很苛刻。第一是多轴协同,XY平台要在视觉拍照的时候快速走位,同时旋转轴要配合相机的取景方向,这几个轴必须协同动作,节拍才有保证。如果用普通PLC发脉冲控制,CPU会耗费大量时间在脉冲输出上,一旦同时处理通信和逻辑,很容易出现丢步或者响应变慢。第二是IO响应速度,检测机上光电和光纤传感器非常多,气缸换向阀也多,整个动作就是十几个点同时频繁切换,IO扫描周期太长会导致执行机构动作不连贯。第三是数据交互,视觉检测的结果需要实时回传给PLC,由PLC做判定和分选,同时检测数据要能统计、查询,通信接口必须稳定。第四是程序的可维护性,这台设备后续要改检测项、加视觉工位,控制程序如果写成一坨嵌套梯形图,后面维护的人会想骂人。NX1P2正好能满足这几条。1.2 NX1P2在欧姆龙产品线里的定位欧姆龙的PLC产品线拉得很开。传统的CP系列属于小型机,主要靠脉冲输出控制步进和伺服,胜在便宜,但多轴联动和通信能力都有限;NJ系列是真正意义上的机器控制器,擅长多轴运动控制和数据处理,价格也高。NX1P2正好卡在中间,它是一体化的机器控制器,外形和CP系列差不多,但内置了EtherCAT主站,支持最多4轴的运动控制,程序语言支持IEC 61131-3标准的ST、梯形图等,编程环境用Sysmac Studio,和NJ系列完全同一个平台。这意味着小设备也能用上总线运动和结构化编程,不用一上来就上NJ那种大家伙。对于我这台4轴设备来说,NX1P2的轴数上限正好覆盖,再往上加轴就必须升级到NJ系列了。1.3 和传统脉冲方案比,总线方案赢在哪很多同行做这种检测机会选择CP系列加伺服驱动器接脉冲方式,成本低,接线也简单。但实际用下来有几个明显痛点。第一个是接线量和调试时间。脉冲方案每一根伺服线都要专门走线,我这台上料、检测、分选一共4个轴,加上编码器反馈、抱闸控制,线多到电柜里面塞不下;总线方案每台伺服只要一根EtherCAT网线串起来,一根线就把位置指令、状态反馈、报警信息全带过去了。第二个是同步性。脉冲输出受PLC扫描周期影响,多轴联动的时候,各轴之间的协调性不如EtherCAT这种硬实时总线。第三个是故障诊断。总线伺服能把报警代码、电流、位置偏差这些数据全部读上来,出问题可以直接看到是哪根轴因为什么原因报警,脉冲方案只能靠万用表量。综合算下来,总线方案初期看起来贵,实际在调试和维护上省回来的时间远不止这个差价。2. 系统架构与硬件配置:先把底子打好2.1 完整硬件清单与选型要点先给一个我当时配下来的完整清单,给正准备下手的朋友参考。CPU选的是NX1P2-1040DT,带EtherCAT主站,支持4轴运动控制,内置EtherNet/IP口,可以连接触摸屏和视觉系统。伺服配置了4套欧姆龙1S系列驱动器加电机,1S系列是标准的EtherCAT从站,动力线和编码器线都是快插头,安装速度快。远程IO用了欧姆龙EtherCAT从站IO模块,输入输出按上面的统计来配,输入40点,输出32点,各留了20%余量。视觉系统是两套,一套用来定位引导,一套用来检测缺陷,通过以太网口和PLC做TCP通信。触摸屏选的是欧姆龙同品牌HMI,通过EtherNet/IP直接和PLC通信,画面组态简单,变量直接映射。这里有个选型要点必须提醒一句:NX1P2的不同型号功能差别很大,有的型号只带一个以太网口、不支持EtherCAT,有的型号支持运动控制但轴数不同。选型的时候不要只看“NX1P2”这个系列名称就下单,一定要看清楚规格表上有没有EtherCAT主站功能,运动轴数上限是多少,程序容量多大,IO点数上限是多少。我手头有一台设备差点用错型号,就是因为采购按系列名下单,结果到货的版本不支持总线运动控制,最后只能退货换货,白白耽误工期。2.2 EtherCAT做主运动总线,EtherNet/IP做信息总线这套系统的总线规划分了两层。底层运动控制走EtherCAT,拓扑是菊花链,从NX1P2的EtherCAT口出来,第一根网线接到第一个伺服驱动器,然后第二个伺服从第一个伺服上串接出来,依次串完全部4个伺服,再去接远程IO模块。EtherCAT的优势在于循环同步,多轴联动时位置的一致性明显比脉冲方式好。顶层信息交互走EtherNet/IP,这个网络用来连接触摸屏、视觉系统、上位机,传输的是检测结果、配方参数、报警信息这类不要求硬实时的数据。把运动和信息分开,就避免了大数据流量把运动控制的实时性拖垮。EtherCAT组网有几个细节需要注意。网线长度和设备之间的距离有限制,电柜里面如果走线太绕,信号质量会下降。我当时用的都是标准的工业屏蔽网线,屏蔽层在两端都做了接地。EtherCAT不需要终端电阻,但最后一个从站如果没被识别,整个网络是进不了运行状态的。另外,从站的供电要和主站分开考虑。EtherCAT从站IO模块的工作电源如果和伺服电源共用一路,伺服刹车和启动瞬间可能会把从站电压拉低,轻则通信闪断,重则掉站。我在这台设备上专门给各从站加了一路独立的直流电源,后面调试基本没出现掉站的情况。2.3 远程IO布局与传感器信号处理IO布局的原则是就近采集。这台设备虽然点数不算多,但分布很散,上料区、检测区、分选区各有一批传感器和气缸。如果全部拉线回到主控柜,走线会非常乱,而且长度太长容易引入干扰。所以我在三个区域各放了一个远程IO从站,通过EtherCAT串在伺服后面,传感器信号在本地接入IO模块,输出信号由本地IO模块直接驱动继电器板和电磁阀。这样每个区域的线束都短,排查故障也方便。传感器信号处理上有一个很关键的细节。很多检测机用的传感器是NPN型,输出低电平有效,而NX1P2的IO模块输入形式要注意是漏型还是源型,买模块之前一定要和传感器类型对齐。我有一批传感器到了现场才发现输出类型和IO模块不匹配,最后只能在中间加转换继电器板,虽然能用,但电柜里多了一堆继电器,既占空间又增加了故障点。所以建议在出BOM之前就把传感器型号和IO模块规格核对清楚,这一步做错了后面全是事。另外,光纤放大器这类传感器如果检测机对测量精度有要求,建议走模拟量模块读取,普通开关量IO只能读到“有或无”,读取不了信号强度,定位和测距的场景必须用模拟量。2.4 安全回路与抗干扰设计安全回路不能省,这是所有设备的基础。急停按钮、安全门锁、光幕这些信号要进安全回路,急停触发后要同时切断伺服使能和气缸气源。NX1P2本身支持安全功能,但需要在配置里做相应设定,而且要经过风险评估。我这台设备的安全逻辑比较简单,一个急停回路串了三个急停按钮和一个安全门开关,急停输出通过安全继电器切断伺服电机使能信号,同时断开总气源。注意,急停信号如果直接硬接线切伺服使能,程序里也要有一个对应的状态位告诉各轴“现在处于急停状态”,否则伺服恢复使能后容易产生位置跳变。抗干扰方面,电柜内强电和弱电分开走线,交流接触器和开关电源的线不要和EtherCAT网线绑在一起。伺服电机的动力线高频开关噪声大,必须和编码器线、通信线分开走。还有接地,电柜要有可靠的大地接地,伺服驱动器的接地端子必须单独接地,不要和PLC的接地串在一起。我调试到后期遇到一次偶发的IO闪烁,排查了很久,最后是把一个光纤放大器的电源从开关电源的同一路挪到了另一路隔离出来的电源上,问题才消失。抗干扰这个事,前期布线多做一分,后期调试少熬一个通宵。3. 程序怎么写:任务划分、状态机与视觉通信实现3.1 任务划分:不同周期的任务怎么安排Sysmac Studio的项目里,任务这个概念一定要用好。NX1P2支持多个周期任务和事件任务,我把程序分成了三个主要任务。第一个是运动控制任务,周期1毫秒,里面只放运动控制相关的功能块,比如轴使能、回原点、定位指令。第二个是主逻辑任务,周期4毫秒,放检测流程、气缸控制、状态判定。第三个是通信任务,周期10毫秒,放视觉数据的收发、触摸屏数据交互。为什么要分这么细?因为不同任务对实时性的要求不一样,如果全部塞在同一个任务里,运动控制被IO扫描和通信处理拖慢,整个设备的节拍就上不去。而且分任务还有一个好处,某个任务出现问题的时候,可以在Sysmac Studio的监视界面里直接看到哪个任务周期超时,排查范围一下子缩小了。任务划分好之后,全局变量要按功能模块来命名。我的习惯是前缀区分设备区域和数据类型,比如上料区的气缸输出叫OUT_Feed_Cylinder,检测区的到位传感器叫IN_Insp_InPos,伺服轴位置变量用AX0_Pos。命名规范看着是小事,但程序写大了之后,查找变量、交接给别的工程师,能省非常多时间。Sysmac Studio里变量有详细的注释字段,我要求自己每个关键变量都写上注释,包括单位、用途、有效范围,这对后期维护太重要了。这个程序到现在已经不是我一个人在维护,新接手的同事看注释就能懂大半逻辑。3.2 运动控制:从使能到回原点到定位NX1P2的运动控制编程和NJ系列是同一种风格,使用带实例的运动功能块。以我用的4个轴为例,程序里先对各轴做配置,轴类型是EtherCAT伺服,然后调用MC_Power功能块给轴使能。MC_Power的输入有Enable和StopEmg,输出有Status、Error、ErrorID。调试的时候ErrorID非常重要,轴起不来的时候可以从系统定义的错误码表里查到具体原因。轴使能之后是回原点操作,我用的是MC_Home功能块,回原点方式选择带原点输入信号加限位信号的模式,回原点的搜索速度和接近速度都要单独设定。速度设太高容易冲过头,设太低又浪费时间,一般我会让接近速度比搜索速度慢一个数量级,让原点信号可靠停下来。定位指令我主要用MC_MoveAbsolute和MC_MoveRelative,绝对定位用在有固定原点的工位,相对定位用在需要连续叠加位移的场合。有一个细节,欧姆龙运动功能块默认是沿使能执行,也就是说只要前面的条件保持成立,指令就会一直有效,所以在写梯形图或ST程序时,要自己加入沿触发逻辑。我习惯的做法是把启动信号沿触发后置位一个内部标志位,然后把这个标志位接到功能块的Execute输入,指令完成或报错后再复位标志位。这样不会因为条件信号一直是TRUE导致功能块重复触发。下面是一段示意性的ST代码,实际项目中轴和各参数都是通过系统定义的MC_Axis变量来管理:CASE byStep OF 10: // 等待启动信号 IF bStartTrigger THEN bStartTrigger := FALSE; bStartHome := TRUE; byStep := 20; END_IF; 20: // X轴回原点 MC_Home_Inst0( Execute := bStartHome, Axis := MC_Axis[0], Reference := TRUE, ... ); IF MC_Home_Inst0.Done THEN bStartHome := FALSE; byStep := 30; END_IF; 30: // 运动到检测位 MC_MoveAbsolute_Inst0( Execute := TRUE, Axis := MC_Axis[0], Position := rDetectPosX, Velocity := rFeedSpeed, ... ); IF MC_MoveAbsolute_Inst0.InPosition THEN byStep := 40; END_IF; END_CASE;注意上面这段代码省略了很多参数,实际用的时候每个功能块的实例都要在Sysmac Studio里建立并绑定对应的轴,参数也要逐个核对。运行位置的单位我统一用毫米,速度单位用毫米每秒,加速度用毫米每二次方秒。做程序之前先和机械工程师确认好机械的丝杆导程和减速比,在轴配置里把电子齿轮比设对,不然位置指令和实际走的位置对不上。这是所有没有总线伺服经验的人都会犯的错。3.3 检测流程状态机:用CASE把逻辑理清楚检测流程是整个程序的核心。我用的写法是状态机加CASE分支,每个工步一个编号,从等待启动、上料、到位确认、视觉拍照、数据判定、分选执行到等待下一件,全部按固定的状态顺序切换。状态机的优点是好排查、好维护,出现问题时可以直接定位当前停在哪个工步,再结合IO监视判断是哪个条件没满足。当时如果写成一大段嵌套的梯形图,后面改程序的时候逻辑会越理越乱。状态机的切换条件要特别注意沿触发和超时保护。比如上料到位传感器没有信号,如果程序永远等在那里,设备就会卡死,操作人员看着也不知道怎么回事。所以每个工步都要加一个超时定时器,正常时间是工艺时间加一点余量,超时之后报错,在触摸屏上显示对应的“XX超时”,同时设备进入暂停状态。这个超时机制在调试初期帮了我大忙,很多问题都是先通过超时报警暴露出来的。另外,气缸动作的到位信号不能用延时来代替。很多人图省事,气缸输出之后就延时几百毫秒当到位,这在空载试验可能没问题,但工件尺寸变化、气压波动的时候,延时和实际到位时间不一定对得上,最好都用磁性开关或接近传感器的到位信号来确认。3.4 与视觉系统的通信交互视觉系统和PLC通信是检测机最核心的交互。我这两套视觉系统分别负责定位和外观检测,定位相机在PLC触发后拍照,计算出工件当前的坐标偏差,回传给PLC之后,由PLC做位置补偿;外观检测相机输出检测结果和缺陷类型。通信协议用的是TCP Socket方式,视觉控制器作为服务器端,PLC作为客户端主动连接。程序里每个视觉相机对应一个Socket通道,通过SocketOpenClient建立连接,然后通过SocketSend和SocketReceive收发数据。通信报文要约定一个清晰的帧格式。我用的是简短的ASCII字符串,比如定位视觉的报文格式是“@POS,0.123,-0.456,”,指引符是@,指令代号是POS,后面跟两个坐标偏差值,末尾是号。外观检测的格式是“@RESULT,OK,12.345,6.789,*”,结果分OK和NG,后面跟两个测量值。做这种字符串协议的时候,一定要约定好小数点的位数,两端程序都是按固定位数解析数据的,如果视觉端输出的小数位数和PLC端解析不一致,数据就会整体错位。我当时就因为视觉端某个测量值在有些情况下会输出“---”表示无效,导致PLC端字符串转浮点时报错,后来统一规定无效值输出“999.999”,PLC端再单独判断这个特殊值,问题才解决。还有一个容易出现的问题,视觉处理的时间是不固定的,PLC不能简单地延时等待视觉结果。正确做法是PLC发送触发指令之后,进入等待状态位,视觉完成后主动给PLC发送结果字符串,PLC在SocketReceive里收到完整的一帧后,置位一个“视觉完成”标志,主逻辑检测到这个标志再往下走。同时整个等待过程要有超时保护,超时按视觉故障处理,避免设备一直卡死。这个机制在节拍调试中也起了很重要的作用,因为视觉处理时间波动大,事件触发方式比固定延时方式要灵活得多。3.5 检测数据记录与配方管理自动检测机如果只是把OK和NG分选掉,那价值就少了一半,数据记录才是产线真正看重的。我这套程序里把每个工件的检测结果、测量值、时间戳、当前配方号都记录下来。NX1P2支持文件操作功能,通过TextIO相关的功能块把数据写入SD卡或板载内存里的CSV文件。CSV文件每个工件一行,列与列之间用逗号分隔,方便后期用Excel或者上位机软件直接分析。注意频繁写SD卡会加快存储卡老化,所以我用缓存的方式,攒够一定数量再统一写一次,既减少写卡次数,又避免影响节拍。配方管理也是少不了的。这台设备虽然现在只检测一种连接器外壳,但客户明确提出以后可能换型。我在触摸屏上做了配方画面,每个配方保存一组参数,包括各轴的检测位置坐标、视觉检测项目、判定阈值、气缸动作时序。配方存储在PLC的内存区,触摸屏上选择配方号后,通过EtherNet/IP通信把配方号下发到PLC,PLC从配方表读取对应参数并覆盖运行变量。这样做换型的时候操作人员只要选个配方号,程序自动把坐标和参数切过去,不用一个点一个点地改。配方的数量我预留了10组,足够了。4. 现场调试实录:踩过的坑和排查技巧4.1 EtherCAT组网掉站,先从物理层查起第一次带电调试的时候,我在Sysmac Studio的EtherCAT配置里看到明明是4个伺服加3个IO从站,结果实际连接只识别出5个。我首先怀疑是配置和实际不一致,检查了一遍节点地址和从站ID,都对得上。然后又怀疑是从站供电,用万用表量了最后一个从站的电源端子,电压正常。最后换了连接最后一个从站的那根网线,问题解决。原因是那根网线在折弯处内部芯线断裂,通信时好时坏。EtherCAT的物理层看起来简单,但网线质量真的不能省,建议采购专门的工业级拖链网线,接线头要压接好。排查这种问题时,我的顺序是:先看软件里识别到的从站列表,确认掉的是哪一个;再到现场检查该从站的电源和网线;最后才去动配置。千万别一上来就改软件配置,那样只会把问题搞得更乱。4.2 回原点位置不稳定,问题出在原点信号抖动设备调试到第三天,出现了一个让人头疼的问题:X轴回原点之后,每次停的位置都不一样,差个几丝到十几丝,视觉定位补偿虽然能修正一部分,但误差大的时候分选就会误判。一开始我以为是伺服本身精度问题,重新做了伺服增益整定,情况没有改善。后来用示波器看原点传感器的信号,发现原始的无源信号根本没有抖动,但是进到伺服驱动器的原点输入口之后,信号边沿有明显的毛刺。排查下去,发现是原点信号的线缆和伺服动力线在电柜里有一段并行走线,动力线的高频噪声耦合进来了。把传感器线单独分开走,并且在伺服驱动器的原点输入上接入RC滤波之后,回原点位置就稳定了。这个事给我的教训是,回原点的精度问题,伺服参数只是其中一方面,信号质量和接线方式的影响往往更大。4.3 视觉通信偶发超时,缺少完整的帧协议处理视觉通信在调试初期有个现象,10次里面大概有1到2次,PLC收不到视觉结果,导致流程卡住超时报警。我一开始怀疑是视觉端处理偶尔变慢,在视觉程序里加了日志,结果发现视觉端每次都在标准时间内发出去了。问题就出在PLC端的SocketReceive。原来TCP是流式协议,两帧数据可能粘在一起,也可能一帧被拆成两次收到,PLC端如果单纯按“收到数据就解析”,就会碰到不完整的帧,解析失败后就丢弃了,视觉那边自然就收不到应答。后来我改了接收逻辑,用一个缓冲区把收到的字节先暂存起来,每次收到数据都检查缓冲区里有没有完整的起始符和结束符,有就提取一帧完整报文,没有就继续等。同时SocketReceive还加了超时重试。改完之后,通信再没有出现过超时。4.4 节拍不够快,找到真正的瓶颈第一版程序跑下来,单件节拍在7秒左右,离5秒的目标差距很大。我开始逐个工步计时,发现X轴从取料位走到检测位,走位动作本身不到1秒,但“视觉定位”和“外观检测”这两步是顺序执行的,加起来占了将近4秒。这两套视觉的检测区域虽然不完全重叠,但也没有绝对串行的必要。我把程序改成定位视觉拍照完成后,X轴先带工件走一段,同时触发外观相机拍照,外观相机在后续过程中自动完成处理,等X轴走到下一个位置时结果刚好出来。这样一个动作周期里同时完成两件事,单件节拍直接压到了4.2秒。这个例子说明,节拍优化不是单纯把伺服加速度调大,很多时间浪费在等待上,把等待变成并行,效果比把轴速度拉满要好得多。节拍优化的第二个方向是伺服的运动参数。很多工程师怕设备报警,加速度不敢往高调,但实际上伺服选型时已经留了余量,把加速度、减速度慢慢往上提,配合观察跟随误差和是否报警,可以在安全范围内提高不少效率。我一般以每次提高10%到20%的幅度去试,每次改完跑一整天采集数据,确认稳定后再继续往上加,这样既效率又稳妥。4.5 现场常见问题速查表调试期间积累的问题,整理成了一张速查表,直接贴出来给大家参考。现象可能原因排查方向EtherCAT从站识别数量不对网线断芯、从站供电不足、节点地址冲突先查物理层,再看配置上电后轴无法使能急停未复位、伺服报警、MC_Power的Enable未置位查看ErrorID,结合伺服面板报警码回原点位置漂移原点信号受干扰、原点搜索速度过快查信号线、加滤波、降低接近速度视觉结果收不到帧解析逻辑不完整、通信超时设置太短检查缓冲区帧处理,加超时重连某输入点偶发闪烁电源干扰、传感器与IO模块类型不匹配排查走线、隔离电源触摸屏和PLC连不上IP网段不一致、端口被占、EtherNet/IP连接数超限检查IP配置和通信设置程序下载后运动位置不对电子齿轮比设置错误、单位换算不对核对丝杆导程、减速比、编码器分辨率这张表里的问题,几乎每一个都是我在不同项目里真实遇到过的。把这些经验沉淀下来之后,后面做同类设备的时候,调试时间明显缩短了。5. 实测效果与扩展规划:稳定运行之后还能做什么5.1 实际运行效果这台检测机交付到现在已经连续跑了几个月,单件节拍稳定在4秒到4.5秒之间,完全满足5秒节拍要求。OK/NG分选准确率在8小时连续运行下稳定在99%以上,误判主要出现在极端光照变化的时候,后期在视觉端加了光源亮度反馈之后进一步得到改善。EtherCAT总线运行非常稳定,几个月下来没有出现过一次掉站,远比我之前用脉冲方案省心。数据记录功能每天生成一个CSV文件,客户直接拿到质量部门做统计分析。维护方面,因为程序用了结构化的状态机写法,现场电气人员通过触摸屏就能看到当前工步和报警信息,基本不需要厂家到场就能处理简单的停机问题。5.2 后续还能怎么扩展这套架构的扩展性其实比我一开始预想的要好。NX1P2的运动轴数上限是4轴,现在刚好用完,如果以后要增加轴,只能升级到NJ系列或者加独立的从站控制器,程序迁移的成本不会太高,因为Sysmac Studio平台完全一致,变量和程序代码可以大部分复用。IO点位如果后期要增加,直接在EtherCAT总线上多串一个从站IO模块就行,不用改主程序。数据接口方面,现在采集的数据存在SD卡里,后续如果客户要对接产线MES系统,NX1P2的EtherNet/IP口可以直接和上位机做数据交互,把这套设备的生产数据实时上传,这个扩展方案已经和客户初步沟通过,可行性很高。最后分享一个我个人的体会。用总线PLC做检测机,看起来成本比传统方案高一些,但这笔钱换来的是调试效率、故障诊断能力和设备可维护性的大幅提升。如果是做标准机、批量复制,这些优势会随着项目数量被放大。我自己的习惯是,无论设备多简单,控制程序里都会留好注释、做好状态机和变量命名规范,因为设备不是做完就完了,后面还有调试、优化、维护、换型,每一步都要靠程序的可读性撑着。希望这篇东西能帮到正在入坑或已经在坑里的同行。
搞检测设备这几年,我越来越觉得,一台自动检测机能不能稳定运行,控制架构的选择比机械结构还关键。最近手头这套小型电子元器件的自动检测机,就是用欧姆龙NX1P2系列总线PLC做主控做的,从伺服运动到传感器IO,再到视觉数据交互,全部走总线,EtherCAT管运动、EtherNet/IP管数据。这套系统从选型到调试跑通,踩了不少坑,也总结了不少经验。这篇文章把整套方案掰开讲清楚,包括为什么选NX1P2、总线架构怎么搭、程序怎么写、现场调试会遇到什么问题。准备用NX1P2做设备的同行,或者正在纠结“普通PLC加脉冲”和“总线PLC”怎么选的朋友,看完应该能少走一些弯路。这是一台什么设备?检测对象是小型电子元器件,具体是一种板卡上用的连接器外壳。检测项分两大类:一是外观缺陷,包括划伤、脏污、变形;二是关键尺寸,比如两个配合面的间距和端子孔的位置度。工艺节拍要求5秒以内完成一个工件的检测。设备结构上分成上料工位、检测工位、分选工位三个区,上料由振动盘加直振送料,检测工位有一组XY轴带动工件运动,视觉系统固定在横梁上,分选工位用气缸加滑台把OK和NG的产品分开。整套设备伺服轴一共4个,气缸和电磁阀十几个,检测传感器包括光电、光纤、接近开关,加起来几十个点,再加上两套视觉系统需要数据通信。这个架构如果用传统脉冲PLC做起来会非常吃力,这也正是我选择NX1P2的直接原因。1. 检测机选型必看:NX1P2为什么能扛住多轴协同1.1 自动检测机对控制系统的硬性要求先把需求捋一遍。这类检测机虽然结构看着简单,但对控制系统的要求其实很苛刻。第一是多轴协同,XY平台要在视觉拍照的时候快速走位,同时旋转轴要配合相机的取景方向,这几个轴必须协同动作,节拍才有保证。如果用普通PLC发脉冲控制,CPU会耗费大量时间在脉冲输出上,一旦同时处理通信和逻辑,很容易出现丢步或者响应变慢。第二是IO响应速度,检测机上光电和光纤传感器非常多,气缸换向阀也多,整个动作就是十几个点同时频繁切换,IO扫描周期太长会导致执行机构动作不连贯。第三是数据交互,视觉检测的结果需要实时回传给PLC,由PLC做判定和分选,同时检测数据要能统计、查询,通信接口必须稳定。第四是程序的可维护性,这台设备后续要改检测项、加视觉工位,控制程序如果写成一坨嵌套梯形图,后面维护的人会想骂人。NX1P2正好能满足这几条。1.2 NX1P2在欧姆龙产品线里的定位欧姆龙的PLC产品线拉得很开。传统的CP系列属于小型机,主要靠脉冲输出控制步进和伺服,胜在便宜,但多轴联动和通信能力都有限;NJ系列是真正意义上的机器控制器,擅长多轴运动控制和数据处理,价格也高。NX1P2正好卡在中间,它是一体化的机器控制器,外形和CP系列差不多,但内置了EtherCAT主站,支持最多4轴的运动控制,程序语言支持IEC 61131-3标准的ST、梯形图等,编程环境用Sysmac Studio,和NJ系列完全同一个平台。这意味着小设备也能用上总线运动和结构化编程,不用一上来就上NJ那种大家伙。对于我这台4轴设备来说,NX1P2的轴数上限正好覆盖,再往上加轴就必须升级到NJ系列了。1.3 和传统脉冲方案比,总线方案赢在哪很多同行做这种检测机会选择CP系列加伺服驱动器接脉冲方式,成本低,接线也简单。但实际用下来有几个明显痛点。第一个是接线量和调试时间。脉冲方案每一根伺服线都要专门走线,我这台上料、检测、分选一共4个轴,加上编码器反馈、抱闸控制,线多到电柜里面塞不下;总线方案每台伺服只要一根EtherCAT网线串起来,一根线就把位置指令、状态反馈、报警信息全带过去了。第二个是同步性。脉冲输出受PLC扫描周期影响,多轴联动的时候,各轴之间的协调性不如EtherCAT这种硬实时总线。第三个是故障诊断。总线伺服能把报警代码、电流、位置偏差这些数据全部读上来,出问题可以直接看到是哪根轴因为什么原因报警,脉冲方案只能靠万用表量。综合算下来,总线方案初期看起来贵,实际在调试和维护上省回来的时间远不止这个差价。2. 系统架构与硬件配置:先把底子打好2.1 完整硬件清单与选型要点先给一个我当时配下来的完整清单,给正准备下手的朋友参考。CPU选的是NX1P2-1040DT,带EtherCAT主站,支持4轴运动控制,内置EtherNet/IP口,可以连接触摸屏和视觉系统。伺服配置了4套欧姆龙1S系列驱动器加电机,1S系列是标准的EtherCAT从站,动力线和编码器线都是快插头,安装速度快。远程IO用了欧姆龙EtherCAT从站IO模块,输入输出按上面的统计来配,输入40点,输出32点,各留了20%余量。视觉系统是两套,一套用来定位引导,一套用来检测缺陷,通过以太网口和PLC做TCP通信。触摸屏选的是欧姆龙同品牌HMI,通过EtherNet/IP直接和PLC通信,画面组态简单,变量直接映射。这里有个选型要点必须提醒一句:NX1P2的不同型号功能差别很大,有的型号只带一个以太网口、不支持EtherCAT,有的型号支持运动控制但轴数不同。选型的时候不要只看“NX1P2”这个系列名称就下单,一定要看清楚规格表上有没有EtherCAT主站功能,运动轴数上限是多少,程序容量多大,IO点数上限是多少。我手头有一台设备差点用错型号,就是因为采购按系列名下单,结果到货的版本不支持总线运动控制,最后只能退货换货,白白耽误工期。2.2 EtherCAT做主运动总线,EtherNet/IP做信息总线这套系统的总线规划分了两层。底层运动控制走EtherCAT,拓扑是菊花链,从NX1P2的EtherCAT口出来,第一根网线接到第一个伺服驱动器,然后第二个伺服从第一个伺服上串接出来,依次串完全部4个伺服,再去接远程IO模块。EtherCAT的优势在于循环同步,多轴联动时位置的一致性明显比脉冲方式好。顶层信息交互走EtherNet/IP,这个网络用来连接触摸屏、视觉系统、上位机,传输的是检测结果、配方参数、报警信息这类不要求硬实时的数据。把运动和信息分开,就避免了大数据流量把运动控制的实时性拖垮。EtherCAT组网有几个细节需要注意。网线长度和设备之间的距离有限制,电柜里面如果走线太绕,信号质量会下降。我当时用的都是标准的工业屏蔽网线,屏蔽层在两端都做了接地。EtherCAT不需要终端电阻,但最后一个从站如果没被识别,整个网络是进不了运行状态的。另外,从站的供电要和主站分开考虑。EtherCAT从站IO模块的工作电源如果和伺服电源共用一路,伺服刹车和启动瞬间可能会把从站电压拉低,轻则通信闪断,重则掉站。我在这台设备上专门给各从站加了一路独立的直流电源,后面调试基本没出现掉站的情况。2.3 远程IO布局与传感器信号处理IO布局的原则是就近采集。这台设备虽然点数不算多,但分布很散,上料区、检测区、分选区各有一批传感器和气缸。如果全部拉线回到主控柜,走线会非常乱,而且长度太长容易引入干扰。所以我在三个区域各放了一个远程IO从站,通过EtherCAT串在伺服后面,传感器信号在本地接入IO模块,输出信号由本地IO模块直接驱动继电器板和电磁阀。这样每个区域的线束都短,排查故障也方便。传感器信号处理上有一个很关键的细节。很多检测机用的传感器是NPN型,输出低电平有效,而NX1P2的IO模块输入形式要注意是漏型还是源型,买模块之前一定要和传感器类型对齐。我有一批传感器到了现场才发现输出类型和IO模块不匹配,最后只能在中间加转换继电器板,虽然能用,但电柜里多了一堆继电器,既占空间又增加了故障点。所以建议在出BOM之前就把传感器型号和IO模块规格核对清楚,这一步做错了后面全是事。另外,光纤放大器这类传感器如果检测机对测量精度有要求,建议走模拟量模块读取,普通开关量IO只能读到“有或无”,读取不了信号强度,定位和测距的场景必须用模拟量。2.4 安全回路与抗干扰设计安全回路不能省,这是所有设备的基础。急停按钮、安全门锁、光幕这些信号要进安全回路,急停触发后要同时切断伺服使能和气缸气源。NX1P2本身支持安全功能,但需要在配置里做相应设定,而且要经过风险评估。我这台设备的安全逻辑比较简单,一个急停回路串了三个急停按钮和一个安全门开关,急停输出通过安全继电器切断伺服电机使能信号,同时断开总气源。注意,急停信号如果直接硬接线切伺服使能,程序里也要有一个对应的状态位告诉各轴“现在处于急停状态”,否则伺服恢复使能后容易产生位置跳变。抗干扰方面,电柜内强电和弱电分开走线,交流接触器和开关电源的线不要和EtherCAT网线绑在一起。伺服电机的动力线高频开关噪声大,必须和编码器线、通信线分开走。还有接地,电柜要有可靠的大地接地,伺服驱动器的接地端子必须单独接地,不要和PLC的接地串在一起。我调试到后期遇到一次偶发的IO闪烁,排查了很久,最后是把一个光纤放大器的电源从开关电源的同一路挪到了另一路隔离出来的电源上,问题才消失。抗干扰这个事,前期布线多做一分,后期调试少熬一个通宵。3. 程序怎么写:任务划分、状态机与视觉通信实现3.1 任务划分:不同周期的任务怎么安排Sysmac Studio的项目里,任务这个概念一定要用好。NX1P2支持多个周期任务和事件任务,我把程序分成了三个主要任务。第一个是运动控制任务,周期1毫秒,里面只放运动控制相关的功能块,比如轴使能、回原点、定位指令。第二个是主逻辑任务,周期4毫秒,放检测流程、气缸控制、状态判定。第三个是通信任务,周期10毫秒,放视觉数据的收发、触摸屏数据交互。为什么要分这么细?因为不同任务对实时性的要求不一样,如果全部塞在同一个任务里,运动控制被IO扫描和通信处理拖慢,整个设备的节拍就上不去。而且分任务还有一个好处,某个任务出现问题的时候,可以在Sysmac Studio的监视界面里直接看到哪个任务周期超时,排查范围一下子缩小了。任务划分好之后,全局变量要按功能模块来命名。我的习惯是前缀区分设备区域和数据类型,比如上料区的气缸输出叫OUT_Feed_Cylinder,检测区的到位传感器叫IN_Insp_InPos,伺服轴位置变量用AX0_Pos。命名规范看着是小事,但程序写大了之后,查找变量、交接给别的工程师,能省非常多时间。Sysmac Studio里变量有详细的注释字段,我要求自己每个关键变量都写上注释,包括单位、用途、有效范围,这对后期维护太重要了。这个程序到现在已经不是我一个人在维护,新接手的同事看注释就能懂大半逻辑。3.2 运动控制:从使能到回原点到定位NX1P2的运动控制编程和NJ系列是同一种风格,使用带实例的运动功能块。以我用的4个轴为例,程序里先对各轴做配置,轴类型是EtherCAT伺服,然后调用MC_Power功能块给轴使能。MC_Power的输入有Enable和StopEmg,输出有Status、Error、ErrorID。调试的时候ErrorID非常重要,轴起不来的时候可以从系统定义的错误码表里查到具体原因。轴使能之后是回原点操作,我用的是MC_Home功能块,回原点方式选择带原点输入信号加限位信号的模式,回原点的搜索速度和接近速度都要单独设定。速度设太高容易冲过头,设太低又浪费时间,一般我会让接近速度比搜索速度慢一个数量级,让原点信号可靠停下来。定位指令我主要用MC_MoveAbsolute和MC_MoveRelative,绝对定位用在有固定原点的工位,相对定位用在需要连续叠加位移的场合。有一个细节,欧姆龙运动功能块默认是沿使能执行,也就是说只要前面的条件保持成立,指令就会一直有效,所以在写梯形图或ST程序时,要自己加入沿触发逻辑。我习惯的做法是把启动信号沿触发后置位一个内部标志位,然后把这个标志位接到功能块的Execute输入,指令完成或报错后再复位标志位。这样不会因为条件信号一直是TRUE导致功能块重复触发。下面是一段示意性的ST代码,实际项目中轴和各参数都是通过系统定义的MC_Axis变量来管理:CASE byStep OF 10: // 等待启动信号 IF bStartTrigger THEN bStartTrigger := FALSE; bStartHome := TRUE; byStep := 20; END_IF; 20: // X轴回原点 MC_Home_Inst0( Execute := bStartHome, Axis := MC_Axis[0], Reference := TRUE, ... ); IF MC_Home_Inst0.Done THEN bStartHome := FALSE; byStep := 30; END_IF; 30: // 运动到检测位 MC_MoveAbsolute_Inst0( Execute := TRUE, Axis := MC_Axis[0], Position := rDetectPosX, Velocity := rFeedSpeed, ... ); IF MC_MoveAbsolute_Inst0.InPosition THEN byStep := 40; END_IF; END_CASE;注意上面这段代码省略了很多参数,实际用的时候每个功能块的实例都要在Sysmac Studio里建立并绑定对应的轴,参数也要逐个核对。运行位置的单位我统一用毫米,速度单位用毫米每秒,加速度用毫米每二次方秒。做程序之前先和机械工程师确认好机械的丝杆导程和减速比,在轴配置里把电子齿轮比设对,不然位置指令和实际走的位置对不上。这是所有没有总线伺服经验的人都会犯的错。3.3 检测流程状态机:用CASE把逻辑理清楚检测流程是整个程序的核心。我用的写法是状态机加CASE分支,每个工步一个编号,从等待启动、上料、到位确认、视觉拍照、数据判定、分选执行到等待下一件,全部按固定的状态顺序切换。状态机的优点是好排查、好维护,出现问题时可以直接定位当前停在哪个工步,再结合IO监视判断是哪个条件没满足。当时如果写成一大段嵌套的梯形图,后面改程序的时候逻辑会越理越乱。状态机的切换条件要特别注意沿触发和超时保护。比如上料到位传感器没有信号,如果程序永远等在那里,设备就会卡死,操作人员看着也不知道怎么回事。所以每个工步都要加一个超时定时器,正常时间是工艺时间加一点余量,超时之后报错,在触摸屏上显示对应的“XX超时”,同时设备进入暂停状态。这个超时机制在调试初期帮了我大忙,很多问题都是先通过超时报警暴露出来的。另外,气缸动作的到位信号不能用延时来代替。很多人图省事,气缸输出之后就延时几百毫秒当到位,这在空载试验可能没问题,但工件尺寸变化、气压波动的时候,延时和实际到位时间不一定对得上,最好都用磁性开关或接近传感器的到位信号来确认。3.4 与视觉系统的通信交互视觉系统和PLC通信是检测机最核心的交互。我这两套视觉系统分别负责定位和外观检测,定位相机在PLC触发后拍照,计算出工件当前的坐标偏差,回传给PLC之后,由PLC做位置补偿;外观检测相机输出检测结果和缺陷类型。通信协议用的是TCP Socket方式,视觉控制器作为服务器端,PLC作为客户端主动连接。程序里每个视觉相机对应一个Socket通道,通过SocketOpenClient建立连接,然后通过SocketSend和SocketReceive收发数据。通信报文要约定一个清晰的帧格式。我用的是简短的ASCII字符串,比如定位视觉的报文格式是“@POS,0.123,-0.456,”,指引符是@,指令代号是POS,后面跟两个坐标偏差值,末尾是号。外观检测的格式是“@RESULT,OK,12.345,6.789,*”,结果分OK和NG,后面跟两个测量值。做这种字符串协议的时候,一定要约定好小数点的位数,两端程序都是按固定位数解析数据的,如果视觉端输出的小数位数和PLC端解析不一致,数据就会整体错位。我当时就因为视觉端某个测量值在有些情况下会输出“---”表示无效,导致PLC端字符串转浮点时报错,后来统一规定无效值输出“999.999”,PLC端再单独判断这个特殊值,问题才解决。还有一个容易出现的问题,视觉处理的时间是不固定的,PLC不能简单地延时等待视觉结果。正确做法是PLC发送触发指令之后,进入等待状态位,视觉完成后主动给PLC发送结果字符串,PLC在SocketReceive里收到完整的一帧后,置位一个“视觉完成”标志,主逻辑检测到这个标志再往下走。同时整个等待过程要有超时保护,超时按视觉故障处理,避免设备一直卡死。这个机制在节拍调试中也起了很重要的作用,因为视觉处理时间波动大,事件触发方式比固定延时方式要灵活得多。3.5 检测数据记录与配方管理自动检测机如果只是把OK和NG分选掉,那价值就少了一半,数据记录才是产线真正看重的。我这套程序里把每个工件的检测结果、测量值、时间戳、当前配方号都记录下来。NX1P2支持文件操作功能,通过TextIO相关的功能块把数据写入SD卡或板载内存里的CSV文件。CSV文件每个工件一行,列与列之间用逗号分隔,方便后期用Excel或者上位机软件直接分析。注意频繁写SD卡会加快存储卡老化,所以我用缓存的方式,攒够一定数量再统一写一次,既减少写卡次数,又避免影响节拍。配方管理也是少不了的。这台设备虽然现在只检测一种连接器外壳,但客户明确提出以后可能换型。我在触摸屏上做了配方画面,每个配方保存一组参数,包括各轴的检测位置坐标、视觉检测项目、判定阈值、气缸动作时序。配方存储在PLC的内存区,触摸屏上选择配方号后,通过EtherNet/IP通信把配方号下发到PLC,PLC从配方表读取对应参数并覆盖运行变量。这样做换型的时候操作人员只要选个配方号,程序自动把坐标和参数切过去,不用一个点一个点地改。配方的数量我预留了10组,足够了。4. 现场调试实录:踩过的坑和排查技巧4.1 EtherCAT组网掉站,先从物理层查起第一次带电调试的时候,我在Sysmac Studio的EtherCAT配置里看到明明是4个伺服加3个IO从站,结果实际连接只识别出5个。我首先怀疑是配置和实际不一致,检查了一遍节点地址和从站ID,都对得上。然后又怀疑是从站供电,用万用表量了最后一个从站的电源端子,电压正常。最后换了连接最后一个从站的那根网线,问题解决。原因是那根网线在折弯处内部芯线断裂,通信时好时坏。EtherCAT的物理层看起来简单,但网线质量真的不能省,建议采购专门的工业级拖链网线,接线头要压接好。排查这种问题时,我的顺序是:先看软件里识别到的从站列表,确认掉的是哪一个;再到现场检查该从站的电源和网线;最后才去动配置。千万别一上来就改软件配置,那样只会把问题搞得更乱。4.2 回原点位置不稳定,问题出在原点信号抖动设备调试到第三天,出现了一个让人头疼的问题:X轴回原点之后,每次停的位置都不一样,差个几丝到十几丝,视觉定位补偿虽然能修正一部分,但误差大的时候分选就会误判。一开始我以为是伺服本身精度问题,重新做了伺服增益整定,情况没有改善。后来用示波器看原点传感器的信号,发现原始的无源信号根本没有抖动,但是进到伺服驱动器的原点输入口之后,信号边沿有明显的毛刺。排查下去,发现是原点信号的线缆和伺服动力线在电柜里有一段并行走线,动力线的高频噪声耦合进来了。把传感器线单独分开走,并且在伺服驱动器的原点输入上接入RC滤波之后,回原点位置就稳定了。这个事给我的教训是,回原点的精度问题,伺服参数只是其中一方面,信号质量和接线方式的影响往往更大。4.3 视觉通信偶发超时,缺少完整的帧协议处理视觉通信在调试初期有个现象,10次里面大概有1到2次,PLC收不到视觉结果,导致流程卡住超时报警。我一开始怀疑是视觉端处理偶尔变慢,在视觉程序里加了日志,结果发现视觉端每次都在标准时间内发出去了。问题就出在PLC端的SocketReceive。原来TCP是流式协议,两帧数据可能粘在一起,也可能一帧被拆成两次收到,PLC端如果单纯按“收到数据就解析”,就会碰到不完整的帧,解析失败后就丢弃了,视觉那边自然就收不到应答。后来我改了接收逻辑,用一个缓冲区把收到的字节先暂存起来,每次收到数据都检查缓冲区里有没有完整的起始符和结束符,有就提取一帧完整报文,没有就继续等。同时SocketReceive还加了超时重试。改完之后,通信再没有出现过超时。4.4 节拍不够快,找到真正的瓶颈第一版程序跑下来,单件节拍在7秒左右,离5秒的目标差距很大。我开始逐个工步计时,发现X轴从取料位走到检测位,走位动作本身不到1秒,但“视觉定位”和“外观检测”这两步是顺序执行的,加起来占了将近4秒。这两套视觉的检测区域虽然不完全重叠,但也没有绝对串行的必要。我把程序改成定位视觉拍照完成后,X轴先带工件走一段,同时触发外观相机拍照,外观相机在后续过程中自动完成处理,等X轴走到下一个位置时结果刚好出来。这样一个动作周期里同时完成两件事,单件节拍直接压到了4.2秒。这个例子说明,节拍优化不是单纯把伺服加速度调大,很多时间浪费在等待上,把等待变成并行,效果比把轴速度拉满要好得多。节拍优化的第二个方向是伺服的运动参数。很多工程师怕设备报警,加速度不敢往高调,但实际上伺服选型时已经留了余量,把加速度、减速度慢慢往上提,配合观察跟随误差和是否报警,可以在安全范围内提高不少效率。我一般以每次提高10%到20%的幅度去试,每次改完跑一整天采集数据,确认稳定后再继续往上加,这样既效率又稳妥。4.5 现场常见问题速查表调试期间积累的问题,整理成了一张速查表,直接贴出来给大家参考。现象可能原因排查方向EtherCAT从站识别数量不对网线断芯、从站供电不足、节点地址冲突先查物理层,再看配置上电后轴无法使能急停未复位、伺服报警、MC_Power的Enable未置位查看ErrorID,结合伺服面板报警码回原点位置漂移原点信号受干扰、原点搜索速度过快查信号线、加滤波、降低接近速度视觉结果收不到帧解析逻辑不完整、通信超时设置太短检查缓冲区帧处理,加超时重连某输入点偶发闪烁电源干扰、传感器与IO模块类型不匹配排查走线、隔离电源触摸屏和PLC连不上IP网段不一致、端口被占、EtherNet/IP连接数超限检查IP配置和通信设置程序下载后运动位置不对电子齿轮比设置错误、单位换算不对核对丝杆导程、减速比、编码器分辨率这张表里的问题,几乎每一个都是我在不同项目里真实遇到过的。把这些经验沉淀下来之后,后面做同类设备的时候,调试时间明显缩短了。5. 实测效果与扩展规划:稳定运行之后还能做什么5.1 实际运行效果这台检测机交付到现在已经连续跑了几个月,单件节拍稳定在4秒到4.5秒之间,完全满足5秒节拍要求。OK/NG分选准确率在8小时连续运行下稳定在99%以上,误判主要出现在极端光照变化的时候,后期在视觉端加了光源亮度反馈之后进一步得到改善。EtherCAT总线运行非常稳定,几个月下来没有出现过一次掉站,远比我之前用脉冲方案省心。数据记录功能每天生成一个CSV文件,客户直接拿到质量部门做统计分析。维护方面,因为程序用了结构化的状态机写法,现场电气人员通过触摸屏就能看到当前工步和报警信息,基本不需要厂家到场就能处理简单的停机问题。5.2 后续还能怎么扩展这套架构的扩展性其实比我一开始预想的要好。NX1P2的运动轴数上限是4轴,现在刚好用完,如果以后要增加轴,只能升级到NJ系列或者加独立的从站控制器,程序迁移的成本不会太高,因为Sysmac Studio平台完全一致,变量和程序代码可以大部分复用。IO点位如果后期要增加,直接在EtherCAT总线上多串一个从站IO模块就行,不用改主程序。数据接口方面,现在采集的数据存在SD卡里,后续如果客户要对接产线MES系统,NX1P2的EtherNet/IP口可以直接和上位机做数据交互,把这套设备的生产数据实时上传,这个扩展方案已经和客户初步沟通过,可行性很高。最后分享一个我个人的体会。用总线PLC做检测机,看起来成本比传统方案高一些,但这笔钱换来的是调试效率、故障诊断能力和设备可维护性的大幅提升。如果是做标准机、批量复制,这些优势会随着项目数量被放大。我自己的习惯是,无论设备多简单,控制程序里都会留好注释、做好状态机和变量命名规范,因为设备不是做完就完了,后面还有调试、优化、维护、换型,每一步都要靠程序的可读性撑着。希望这篇东西能帮到正在入坑或已经在坑里的同行。