做模切机或者印刷后道设备的朋友,应该都经历过这种场面:机械凸轮换型号要停机拆装、打磨,印刷追印位置差了几毫米却怎么调都不对,主轴带从轴高速跑,现场能明显感觉到设备在高频冲击下抖得厉害。我前前后后改过几台模切机程序,最后把控制系统集中到欧姆龙NJ系列之后,才算从程序层面把这些问题一项一项捋干净。这篇就以我个人踩过的坑和一套相对成熟的程序框架为例,聊一聊NJ系列PLC在模切机上的高端应用,内容主要面向电气工程师、PLC程序开发者和做自动化集成的朋友。
NJ系列在欧姆龙体系里不是普通PLC,而是一类“机器自动化控制器”。它的价值不在于能多处理几个IO点,而在于把逻辑控制、运动控制、通信和数据处理放进同一个工程环境,也就是Sysmac Studio。模切机恰好是一个典型的“逻辑中等、运动复杂”的设备,用NJ来做,等同于把传统PLC配独立运动控制器的方案,压缩成一张电柜都能装下的控制器。这篇文章我不会只讲接线和使用手册,而是会从选型逻辑、程序架构、电子凸轮、调试避坑、配方报警到后期维护,按真实项目的推进顺序展开。
1. 从“机械凸轮”到“电子凸轮”:模切机为什么选了NJ
1.1 传统模切机的控制痛点
老式模切机的核心是机械主轴。牵引辊、模切辊、收放卷之间靠齿轮链条或者凸轮连杆保持同步。这种方案的优点是刚性确实好,主从关系一旦固定,短时间内不会漂移;缺点是每换一个产品规格,往往就要换一套凸轮或齿轮,仓库里堆满各种规格的备件不说,调机时间经常以小时为单位。
更麻烦的是,印刷包装材料在温度、张力、湿度变化下会有轻微伸缩,印刷图案的间距并不是绝对稳定的。机械凸轮的同步关系固定在图纸上,没有在线补偿的余地。只要套印基准稍有偏差,模切位置就会偏,轻则切偏,重则整卷产品报废。这个问题在车速不高的时候不明显,一提到每分钟一百米以上的高速模切,机械结构很难兼顾“同步精度”和“快速换型”。
也因此,现代模切机普遍转向电子凸轮。电子凸轮的思路很直接:用伺服电机驱动刀辊,用另一根轴作为虚拟主轴,刀辊的运动轨迹由程序里的凸轮表描述,而不是由物理凸轮决定。换型号就换凸轮表,调相位就改一个偏移量。但电子凸轮对控制器的同步性能要求极高,普通PLC加运动模块的组合往往因为任务周期不均、总线抖动而达不到精度,这就轮到NJ这类机器自动化控制器出场了。
1.2 NJ系列凭什么能扛住高速同步
模切机最需要的不是处理复杂算法,而是“每个控制周期都稳定”。NJ在这里有几个关键优势:
- 逻辑和运动控制共用同一个CPU,变量直接共享,不需要在PLC与运动控制器之间来回传递状态字、指令字,省掉了大量握手逻辑,也减少了延迟。
- 运动控制基于EtherCAT总线。EtherCAT本身具备分布式时钟同步功能,各伺服轴可以在微秒级误差内同步采样和输出。配合NJ的运动控制任务,主从轴的同步关系非常稳定。
- NJ支持IEC 61131-3标准语言,其中结构化文本ST对处理凸轮表、数组运算、数学公式非常友好。凸轮曲线完全可以用程序生成,而不是靠示教器手动描点。
- 程序包内可以直接做配方、报警、数据记录,不需要外挂上位机或触摸屏脚本处理太多东西。
打个不太严谨的比方:传统凸轮就像自行车链条,前后两个齿盘一旦定下来,速比就固定了,换齿比必须拆下链条;电子凸轮则像是自动变速箱,发动机和车轮之间不再靠硬齿轮锁定,而是由程序实时决定转速比关系。 模切机要的快换型、在线修正、高速低冲击,本质上都需要这种“软件定义同步”的能力。
1.3 我常用的系统拓扑与轴分配
在模切机上,我习惯把设备按工艺段拆开,分给不同轴或IO模块。以一台常见的平压平/圆压圆模切机为例,基本轴架构如下:
| 部件 | 控制方式 | 说明 |
|---|---|---|
| 牵引辊 | 伺服主轴 | 作为虚拟主轴,决定材料线速度 |
| 模切辊 | 伺服从轴 | 通过电子凸轮与主轴同步,带动刀模 |
| 收卷轴 | 伺服从轴 | 张力控制,速度跟随外圈变化 |
| 放卷轴 | 伺服从轴 | 张力匹配,防止材料松弛或拉断 |
| 色标传感器 | 高速输入/总线输入 | 检测印刷标记,用于套印修正 |
| 触摸屏 | EtherNet/IP 或现场总线 | 配方、参数、报警显示 |
这个结构里,主轴并不一定是物理电机,也可以把牵引辊电机当作主轴,模切辊做电子凸轮从轴。更灵活的做法是用一个“虚拟主轴”轴变量,不作为实际驱动输出,再分别用电子齿轮或电子凸轮把各物理轴都挂到这个虚拟主轴上。这样即使某个轴的机械传动比不同,也只需要修改电子齿轮比,不需要改机械结构。
2. 程序架构:任务分层、变量规划与功能块抽象
2.1 按优先级拆任务:运动控制别和普通逻辑挤在一起
NJ的程序执行方式和传统PLC循环扫描不同。它支持多任务,每个任务可以独立设置周期和优先级。这个特性如果用好,程序会非常干净;用不好,就会出现“伺服轴偶尔顿一下、程序明明在线却没反应”的怪问题。
我的习惯是至少拆三个任务:
- 运动控制任务:周期1ms,只放控制指令,比如MC_Power、MC_CamIn、MC_GearIn、读轴位置、写轴位置。这个任务的优先级最高,保证每个周期都处理轴状态。
- 逻辑任务:周期10ms,处理IO、报警、配方、凸轮表切换请求、状态机。不需要高速响应,但要有足够时间完成计算。
- 事件任务:只在启动、停止、急停、故障恢复时触发。把停机逻辑放在事件任务里,可以避免周期任务里某个分支没有执行完导致急停指令被延迟。
这里有一个很重要的点:MC_Power、MC_CamIn这类运动控制指令,在欧姆龙环境中必须由运动控制任务执行。如果你把它们放在普通周期任务里,虽然编译不会报错,但执行周期会受到普通任务负载影响,凸轮同步就可能出现肉眼能观察到的抖动。一开始没注意这个问题的时候,我在现场摸了一个下午,后来把指令分配到正确任务后,抖动立刻消失。
2.2 轴控功能块的封装思路
模切机上有很多重复逻辑:给每个轴使能、找原点、绝对定位、速度运行、读取位置、处理报警。如果每个地方都直接调用MC_MoveAbsolute,程序会变得很长且难维护。 我的做法是把轴封装成功能块,比如FB_AxisControl:
- 输入:bEnable、bStart、bStop、eMoveMode、rTargetPos、rSpeed、rAcc、rDec
- 输出:bReady、bRunning、bError、eErrorCode、rActualPos
在功能块内部,用一个状态机管理轴的当前状态:未使能、使能中、待机、运行、停止中、故障。每个轴创建一个FB实例,只要调用这个功能块就能统一处理。
用ST语言看大致是这个形态:
FUNCTION_BLOCK FB_AxisControl VAR_INPUT bEnable : BOOL; bStart : BOOL; bStop : BOOL; rTargetPos : LREAL; rSpeed : LREAL; rAcc : LREAL; rDec : LREAL; END_VAR VAR_OUTPUT bReady : BOOL; bRunning : BOOL; bError : BOOL; wErrorID : WORD; rActualPos : LREAL; END_VAR VAR fbPower : MC_Power; fbMoveAbs : MC_MoveAbsolute; fbStop : MC_Stop; eState : INT; END_VAR当然,实际工程里还需要加入回原点、抱闸控制、正负限位等分支。封装的好处是,在现场调机时,只要改功能块内部,所有轴都会同步生效,不至于出现“牵引轴改了、刀辊轴忘了改”的隐患。
2.3 变量命名与数据追溯基础
NJ程序支持全局变量、局部变量,也支持用户自定义结构体和枚举。 变量命名虽然有个人偏好,但在模切机上我强烈建议用带前缀的英文名,而不是随手指随便写。
我的命名规范大致如下:
- 全局布尔量:g_bStart、g_bStop、g_bAuto
- 全局浮点量:g_rLineSpeed、g_rCutLength
- 轴变量:stMasterAxis、stBladeAxis、stRewinderAxis
- 功能块实例:fbAxisBlade、fbAxisRewinder
- 凸轮表:camCutProfiles、camPressureProfiles
这样,触摸屏变量映射、现场客户二次维护、半年后再打开程序,都能快速找到对应位置。 另外,NJ支持掉电保持的变量类型,比如用RETAIN标志保存产量、运行次数、最后掉电位置。 对模切机来说,最值得做掉电保持的是“当前配方号”和“刀辊当前位置”,这样设备重启后操作员不用重新输入所有参数。
3. 电子凸轮与飞剪追印:核心逻辑是怎么写出来的
3.1 凸轮表曲线:不是简单描点,要算速度与加速度
电子凸轮的本质是建立“主轴位置”和“从轴位置”之间的函数关系。模切辊和材料之间的关系,远比“固定速比”复杂。刀辊在接触材料的瞬间,刀刃的线速度必须等于材料运动速度,否则刀刃会在材料表面拖出磨痕甚至拉断材料;而刀刃离开材料后,刀辊需要快速回到下一个起点。这就意味着,在一个模切周期内,刀辊并不是恒定速度转动的,而是要“跟着材料走一段,再快速追回来”。
所以凸轮表不能只给几个位置点然后直线插补,那样速度不连续,加速度在拐点处无穷大,设备必振。 比较稳妥的做法是使用多项式曲线或者摆线曲线。 以五次多项式为例,从动轴的角度作为主轴角度的函数,通过约束起点和终点的位移、速度、加速度,反推出多项式系数,保证运动平滑。
在实际编写凸轮表时,我不会手工一个个算系数,而是在Sysmac Studio里先生成原始位置序列,然后在程序启动时用数学指令重新生成曲线数据,或者离线用Excel把曲线点算好再导入。 这里的关键参数有三个:
- 主轴范围:比如0.0到360.0度
- 从轴范围:比如0.0到设定的刀辊转角
- 速度比约束:在接触区内,从轴速度/主轴速度应当等于模切半径与牵引半径之比
如果模切长度刚好是刀辊周长的整数倍,那凸轮表可能是直线段加回程段;如果模切长度不是整数倍,回程段必须设计成非对称的快速段,这很容易产生较大加速度,需要在程序里限制加速度上限。
3.2 色标追踪:相位补偿与切线速度的关系
模切机套印修正的核心是色标追踪。材料上会事先印刷一个个色标,在模切辊前方安装色标传感器,每当检测到一个色标边缘,程序记录下当前主轴位置。 理论上,色标间隔对应模切长度,如果模切长度准确,色标出现的主轴位置应当固定;如果出现偏差,说明材料在牵引过程中伸缩或滑动。
修正方式有两种常见思路:
- 修改电子凸轮的相位偏移。 检测到偏差后,在凸轮表基础上叠加一个相位补偿值,使刀辊提前或滞后切合材料。 这种方法最适合高速连续生产。
- 微调牵引主轴的速度。 通过暂时改变牵引辊速度让材料位移,但会干扰前段张力,响应也慢。
我一般优先晃动相位而不是晃速度。处理流程是这样的:
- 色标传感器上升沿触发时,用高速输入功能记录当前主轴的脉冲位置或角度。
- 把该值与标准位置比较,得到偏差
e。 - 设定一个死区,比如在±0.5mm以内不修正,防止系统来回震荡。
- 超过死区时,按比例将
e转换成凸轮相位偏移量,写入正在运行的凸轮修正参数。
需要特别注意的是,在材料静止或低速状态下,不要做大幅修正。 因为色标信号本身也有噪声,停机状态下的偏差可能来自传感器抖动,也可能是操作员手工移动了材料。 高速下跟踪、低速下冻结,这比盲目修正更稳。
3.3 一段可落地的凸轮切换示例
在NJ里,使用MC_CamIn指令让从轴落入凸轮关系,使用MC_CamOut退出。 切换凸轮表时,我不会在运行中直接换整张表,而是先让从轴退出凸轮,然后暂停在安全位置,加载新凸轮表,再重新切入。 这样虽然会有短暂停顿,但比高速切换时产生冲击安全得多。
ST语言逻辑大致是:
// 请求切换凸轮表 IF bChangeCam AND NOT bCamChanging THEN bCamChanging := TRUE; MC_CamOut(stCamIn := stBladeCam); // 将刀辊移动到安全位置 MC_MoveAbsolute( Axis := stBladeAxis, Position := rServicePos, Velocity := rSafeSpeed, Acceleration := rSafeAcc, Deceleration := rSafeDec, Execution := mcAborting ); END_IF // 到位后加载新表并重新切入 IF bCamChanging AND fbMoveAbsDone THEN stBladeCam.CamTable := camNewProfile; MC_CamIn( Master := stMasterAxis, Slave := stBladeAxis, CamTable := camNewProfile, ExecutionMode := mcBuffered, MasterScaling := rMasterFactor, SlaveScaling := rSlaveFactor, StartMode := mcImmediate ); bCamChanging := FALSE; END_IF实际上欧姆龙MC_CamIn的参数类型和枚举名称要以Sysmac Studio版本为准,但逻辑框架就是这个意思。 编写时要注意StartMode和MasterStartPosition,如果从轴当前相位和新凸轮表的起点不匹配,MC_CamIn执行时可能产生位置跳变,所以要么从固定安全位置开始,要么让程序对相位做偏移。
4. 调试阶段的高频坑:冲击、抖动、原点丢失
4.1 凸轮切入瞬间的冲击是怎么产生的
我在现场遇到过最诡异的问题:凸轮表逻辑看着没问题,参数也都对,但每次一执行MC_CamIn,设备就“哐”一声,像有什么东西撞在一起。 后来查了很久才发现,不是凸轮表曲线有问题,而是切入时从轴的当前位置和新凸轮表要求的起点位置不连续。
凸轮表在建表时会隐含一个初始相位,比如主轴0度对应从轴0度。 但当从轴实际停在20度位置时,直接切入新表,从轴会被强制重新对到0度,这个差值会在一个控制周期内执行,冲击自然就出来了。
解决办法是在切入前做“相位对齐”:
- 先用MC_MoveAbsolute把从轴移动到凸轮表起点对应的位置;
- 如果设备不允许停机对齐,就在凸轮表中加入一段过渡曲线,让从轴从当前位置平滑过渡到标准凸轮轨迹;
- 或者使用MC_GearIn先建立相对同步,再在同步态下切入精确凸轮。
这个问题的本质是“主从关系切换时的状态初值”,不只是模切机,很多电子凸轮项目都容易在这里翻车。
4.2 EtherCAT掉站和伺服抖动排查
EtherCAT总线是NJ的生命线。 有一次现场调试,设备运行一小时左右就会有一个轴报通信错误,单独点动伺服又正常,一跑整机又报错。 查电工接线、屏蔽、接地折腾很久,最后发现是伺服动力线和EtherCAT网线在同一个线槽内长期挨着,动力电缆的电磁干扰影响了通信。
这算是个低级问题,但在现场很容易被忽略。排查EtherCAT掉站的通用步骤:
- 看Sysmac Studio中的EtherCAT诊断页面,确认是哪个从站丢失,记录错误码。
- 检查该从站到上一站的网线质量,水晶头压接是否可靠,屏蔽层是否接到PE。
- 确认网线周围是否有变频器输出线、伺服电机动力线;如果有,必须拉开距离或增加隔离。
- 用替换法换网线和从站模块,缩小范围。
- 检查控制器是否设定了过短的看门狗时间,适当放宽通讯超时设置有助于暂时维持生产,但根因还是物理层。
伺服抖动的原因则不一定在通信。 如果凸轮表在高速段加速度过大,伺服驱动器会进入电流饱和,表现为刀辊震动或过载报警。 这时候先别急着调PID,用示波器抓一下指令速度和实际速度曲线,看是不是曲线本身不平滑。 有时候把凸轮表回程段角度稍微拉长一点,问题就解决了。
4.3 原点恢复:断电重启不重调的三种做法
模切机最怕换班或断电后,刀辊相位全乱了。 不同设备的处理方式不一样,我按可靠程度由低到高说三种:
- 增量编码器+原点开关:每次上电必须自动回一次原点,找原点开关和Z脉冲,找到后把该位置设为零点。这个过程比较耗时,但可靠。
- 绝对值编码器+存储位置:如果伺服电机是绝对值编码器,断电后位置不丢。上电后读取当前位置,和掉电前保存的位置比较,如果误差在允许范围内,直接恢复运行。 这是效率最高也最舒服的方案。
- 绝对值编码器+机械基准校验:在设备上设置一个固定的机械基准点,上电后程序驱动刀辊低速触碰基准传感器或接近开关,用这个传感器信号对绝对值位置进行校准。 这样即使机械在停机期间被人盘过车、或者联轴器打滑,也能自动找回正确基准。
我通常会在程序里把三种模式做成可选,让设备商根据客户现场习惯设置。 绝对值编码器方案虽好,但必须防“拆电机后没重新校准”这种人为错误,所以基准校验能加尽量加。
5. 面向生产的程序补全:配方、报警、数据统计
5.1 配方数据结构:让换产时间从1小时变3分钟
做程序不能只跑通动作就结束。 模切机操作工每天面对的是几十种不同产品,每种产品对应不同的模切长度、压力、速度、凸轮表。 如果每次换产都要在触摸屏上翻十几个参数,很容易错,也慢。
我在NJ里习惯把配方定义成结构体数组:
TYPE ST_Recipe STRUCT sProductName : STRING(32); rCutLength : LREAL; rBladeSpeed : LREAL; rPressure : LREAL; rPhaseOffset : LREAL; iCamTableID : INT; END_STRUCT END_TYPE VAR_GLOBAL g_recipes : ARRAY[1..100] OF ST_Recipe; g_iActiveRecipe : INT; END_VAR触摸屏上只需要做一个“产品选择”下拉框。 操作员选择产品编号后,程序自动把对应的长度、凸轮表ID、相位偏移加载到当前运行参数,再把刀辊移到安全位置,等待启动。 这样换产时间大大缩短,人为失误也减少。
具体实现时还要考虑一个细节:配方数据要支持从触摸屏“另存为”,防止误改。 我会把配方分成“只读出厂区”和“客户可修改区”,操作员能改的是后者,原厂参数不会因为误触而被破坏。
5.2 报警系统设计:要给维护工看得懂的信息
模切机的报警,最怕的就是触摸屏显示一个“伺服报警”却不知道是哪台伺服、什么原因。 NJ里可以把报警做成结构化数据,包括报警码、报警时间、复位条件、中文描述文本。 在程序中使用一个报警管理功能块,每个故障触发时写入报警记录。
我推荐的报警分级:
| 等级 | 处理方式 | 示例 |
|---|---|---|
| 提示 | 只显示,不影响运行 | 材料卷径过小 |
| 警告 | 自动降速,不停机 | 张力波动较大 |
| 故障 | 立即停机,需要手动复位 | 伺服过载、通信断开 |
报警复位逻辑也要严谨:故障条件消失后不允许直接复位,必须操作员按下“故障复位”按钮,同时程序检查所有故障源已恢复。 这里最忌“故障信号自带复位”,否则设备会莫名其妙地重新启动,非常危险。
5.3 产量与废品统计:别在收尾时才发现丢了数据
很多程序调试阶段只看设备跑得快不快,直到客户要求日报表才发现,产量累计值掉电就清零了,废品数量也从没统计过。 NJ程序里可以用掉电保持变量来存计数器。
我的做法是定义几个掉电保持的LREAL或DINT变量:
- g_diTotalCount:总产量
- g_diGoodCount:合格品数量
- g_diWasteCount:废品数量
- g_diCutCounter:当前班次模切次数
在模切完成信号触发时,执行一次计数逻辑。 同时记录废品原因代码,比如“色标偏差过大”“张力中断”“人为停机”等,方便后期分析。
如果客户有MES系统,可以通过EtherNet/IP或OPC UA接口把数据上传。 但要注意,PLC直连上层系统的网络必须做好隔离,不能让工厂办公网的广播包干扰设备网络,否则总线稳定性反而受影响。
6. 工具链与个人习惯:Sysmac Studio之外的功夫
6.1 用模拟器做离线调试,省现场时间
NJ配套的Sysmac Studio自带模拟器,没有硬件也能把大部分程序逻辑跑起来。 我在项目早期阶段,会用模拟器先把任务周期、功能块状态机、配方加载、报警逻辑全部验证一遍。 模拟器能模拟虚拟轴、虚拟IO,虽然不能替代真实伺服的动态特性,但对逻辑层的问题非常有效。
比如,程序里某个状态机分支在某种情况下会死锁,靠肉眼检查很难发现,但用模拟器挂上虚拟信号,跑到几十万次循环后,问题往往就浮出水面。 这个习惯帮我省下了大量现场调试时间——到客户现场时,程序逻辑基本已经稳定,只需要调伺服增益和凸轮曲线。
6.2 在线修改程序与版本管理
NJ支持在线修改程序,这个功能很强大,但也有代价。 设备正在生产时修改一个变量或一段程序,可能会导致任务重启或者轴控制中断,尤其在运动控制任务中修改核心指令更要谨慎。 我的规则是:能停机的修改,尽量停机修改;不停机的情况下,只修不会影响正在运行的逻辑的部分,比如报警文本、配方默认值。 任何涉及凸轮表、轴参数、任务周期的修改,必须停机后下载。
版本管理同样重要。 每完成一轮现场调试,我都会把整个工程上传到电脑,另存为带日期的版本,比如diecut_machine_20250618_v1.30.smc2。 同时在程序注释里记录本次改了什么、为什么改、谁在现场改的。 这对后续维护和故障追溯帮助极大。 很多时候客户说“上次没改程序,怎么突然不行了”,一比对版本,问题立刻清楚。
6.3 两条私人建议
最后分享两个个人非常坚持的小习惯。
第一个是在每个伺服轴上都开启位置偏差监控。 模切机的刀辊在磨损、材料异常或者机械松动时,从轴实际位置会逐渐跟不上指令位置。 通过监控位置偏差并设置合理阈值,可以在产品批量报废之前预警停机,而不是等质检发现大量废品后才知道设备出了问题。
第二个是保存凸轮表的“调试剪影”。 现场调速时,我会把每次修改过的凸轮表关键点数据导出一份存档,包括修改日期和当时的运行表现。 这样一来,即使调坏了还能快速回到上一个可用版本。 电子凸轮项目不同于单纯逻辑控制,凸轮表是核心技术资产,多留几个备份永远不吃亏。
模切机的控制逻辑听起来并不复杂,就是“主轴转一圈,刀辊切一下”,但真正把它做成高速、稳定、好操作、好维护的设备,需要把电子凸轮、任务调度、总线同步、配方管理这些细节全部融合在一起。 NJ系列的强大之处在于,它把这些能力都放在同一个平台上,让我可以把精力集中在工艺问题而不是通信协议和接线兼容性上。 如果这篇文章能给你的下一个模切机项目提供一点参考,那就值了。