简介:这份PDF面向使用三菱FX3U PLC开发分切机控制程序的电气工程师、PLC编程学习者及锂电设备调试人员,聚焦收料环节的锥度控制与恒张力实现,可作为通用程序模板参考。包内仅含1个PDF文件,压缩包约55KB,篇幅精简,便于在电脑或移动端快速查阅与对照。内容围绕伺服速度模式与力矩模式、锥度张力计算、恒张力PID调节、模拟量输入输出及张力检测等模块展开,并给出指令片段与寄存器分配思路,能帮助读者理解从速度给定、张力采样到PID输出的控制链路。已有39人学习下载,适合需要梳理分切机张力控制框架、排查参数设置或搭建类似项目程序结构的中级读者参考。
1. 分切机收料的悖论:张力曲线越平,卷反而越废
很多人第一次翻分切机收卷程序,都会盯住张力那条曲线,觉得越平越好。真跑起来会发现,一条从头到尾笔直的张力曲线,常常对应一卷外松内紧、端面像花卷一样的废料。收卷真正被控的从来不是张力本身,而是张力与卷径的关系:卷径从一百多毫米长到七八百毫米,同样是那个力矩,张力会掉到原来的几分之一。FX3U 这类 PLC 在分切机程序里做的所有功课——锥度系数、卷径累积、力矩前馈、PID 修正——本质上都是在给这一个比值兜底。把这条主线捋直,再看那几百个 D 寄存器,它就不再是黑匣子,而是一条能自己推演的计算链。
2. 伺服双模式:速度环与力矩环在收卷轴上为什么不能互换
分切机的机械结构不复杂:放卷轴、若干根牵引辊、圆刀或挤压刀组、两根收卷轴。真正麻烦的是,同一条线上三个轴的伺服跑在两种完全不同的模式下,而且一旦装错,故障现象会以张力飘、料跑偏、卷面起皱的形式出现,很难反推到模式本身。
2.1 速度模式的脉冲链路:PLSY 和 DRVI 的操作数到底谁是谁
速度模式的本质是让电机按给定转速转,位置或速度闭环在驱动器内部完成,PLC 只负责发脉冲频率和方向电平。FX3U 上做这件事有两条路子,一条是定位指令,一条是脉冲输出指令,两者操作数的含义完全不同:
// 路径一:连续运转,用 PLSY,S1 是频率,S2 是脉冲数,K0 表示不限 LD M8000 PLSY D102 K0 Y0 // D102 内是 Hz,Y0 出脉冲;方向由 Y4 单独控制 // 路径二:定量走料,用 DRVI,S1 是脉冲数,S2 才是频率 LD X10 DRVI D100 D102 Y0 Y4 // D100=本次要走的脉冲数,D102=频率,Y4=方向这里有个流传很广的写法错误:把速度值直接塞进 DRVI 的第一个操作数,还注释成"以 D0 为速度基准"。DRVI 的 S1 是相对脉冲数,填 1000 意味着电机走 1000 个脉冲就停,跟快慢没关系;真正决定快慢的是 S2 那个频率值。这个错在纸面上不明显,上机之后的表现是"电机转一下就停",然后有人去怀疑伺服参数、怀疑接线,白白耗掉半天。踩过这个坑的人一般会记一辈子。
参数换算链路也得说清楚。PLC 给的是脉冲频率 f(Hz),驱动器侧有电子齿轮比 G,编码器分辨率 P,机械减速比 i,辊径 D,那么线速度 v 是v = f × 60 / (P/G) / i × πD。反过来,要让线速度恒定,PLC 输出的 f 必须跟着卷径反比变化。这条反比关系,就是速度模式在收卷轴上最难受的地方。
2.2 力矩模式:收卷轴为什么必须允许被"拖慢"
把卷径变大这件事摊开看:线速度 v 恒定的前提下,卷筒角速度 ω = v / R。卷径翻四倍,转速就得掉到四分之一。速度模式的意思是驱动器死守 ω,那么随着 R 增大,实际的线速度 v = ωR 会被强行拉高,材料被拉长或被拉断;如果 PLC 试图通过降低 ω 来补偿,它就变成了一个响应迟钝的外环,中间任何一次滞后都会直接变成张力尖峰。
力矩模式反过来:驱动器只负责输出一个转矩,转速由负载(也就是材料张力)决定,材料走多快,卷轴就被拖多快。这时候 PLC 要做的唯一一件事,是给对那个转矩值。而转矩和张力之间的关系是最朴素的一条力学公式:
M = T × RM 是卷轴上的转矩(N·m),T 是材料张力(N),R 是当前卷径(m)。要让 T 恒定,M 必须与 R 成正比。卷径从 0.15 m 长到 0.60 m,输出转矩要涨四倍,张力才守得住。这条式子是一切控制策略的原点,锥度控制也好,PID 也好,最终都要落回到给驱动器一个多大的转矩指令上。
常见的实现思路是:PLC 算出目标转矩百分比,经 D/A 模块输出 0~10 V 或 -10~+10 V 给驱动器的转矩指令端子,驱动器内部再按电机额定转矩换算成电流。所以整条链路上有两个可调的比例系数——PLC 侧的数字量到电压,驱动器侧的电压到转矩——任何一处标定偏了,最终张力都会整体偏移一个固定百分比,而不会表现出"控制不稳"。
2.3 三个轴的分工:谁跑速度,谁跑力矩
| 轴 | 常用模式 | 控制目标 | PLC 侧关键量 |
|---|---|---|---|
| 放卷轴 | 力矩(或速度+张力闭环) | 保持放卷张力,随卷径减小而增大转矩 | 放卷卷径、放卷锥度 |
| 牵引辊 | 速度 | 建立整线基准线速度 | 主速度给定、加减速斜率 |
| 收卷轴 | 力矩(主流)或速度+PID | 随卷径增大线性增大转矩 | 收卷卷径、锥度系数、PID 输出 |
牵引辊是整条线的"时钟",它决定线速度,其余两轴都在追它。这个主从关系决定了程序结构:主速度是一个全局寄存器,放卷和收卷的给定都是从它派生出来的。也正因为如此,牵引辊一旦打滑,收卷侧算出来的卷径会立刻失真——这个连锁反应在第 5 章还会遇到。
3. 锥度控制:卷径一变,张力为什么要跟着变
3.1 锥度的物理来源:它不是工艺习惯,是层间应力
如果整卷都用同一个张力收,内层被外层压着,越往外压得越狠。薄膜、箔材这类材料在压力下会产生蠕变和层间滑移,卸卷之后外层回弹、内层松弛,严重的直接塌卷,端面出现"望远镜"式的错层。锥度控制的目的就是让张力从内到外逐步递减,人为制造一个内紧外松的应力分布,抵消外层累积的压应力。
线性锥度是最常见的形式,用初始张力 T0、终止张力 T1、起始卷径 R0、终止卷径 R1 四个量就能描述:
T(R) = T0 - (T0 - T1) × (R - R0) / (R1 - R0)换个更贴近现场的写法,用锥度百分比 k 表示"到满卷时张力掉多少":
T(R) = T0 × [1 - k × (R - R0) / (R1 - R0)] k ∈ [0, 0.5]k 取 0 就是恒张力,取 0.3 表示满卷时张力只剩七成。工程上 k 很少超过 0.5,超过之后外层太松,收卷的硬度不够,运输途中容易变形。这个参数没有通用值,跟材料厚度、表面摩擦系数、卷径比都有关,属于必须靠试跑定下来的经验量。
3.2 卷径不是测出来的,是算出来的
锥度公式里的 R 从哪来,是这套程序里最容易被低估的一环。现场有三条路线,精度和成本差得很远。
第一条是直接测距,超声波或激光传感器对着卷筒表面,输出模拟量。优点是实时、跟材料厚度无关;缺点是卷筒不圆时的跳动会全部进到信号里,必须做长时滤波,而且传感器本身占空间、易脏。
第二条是线速度比角速度。牵引辊的线速度 v 已知,收卷轴由编码器测出角速度 ω,则 R = v / ω。这条路线在高速时很准,低速时 ω 很小,除法的相对误差被放大,收卷刚启动那几秒往往是跳的。
第三条是累积法,也是模板程序里最常用的:不打滑的前提下,收进去的材料截面积等于卷筒增加的面积。设材料厚度 δ、已收长度 L,则
π(R² - R0²) = δ × L R = sqrt(R0² + δ × L / π)注意这里是平方关系,不是线性关系。早期不少程序图省事,直接用R = R0 + N × δ / (2π)(N 为转数)做线性累加,材料薄、卷径比小的时候误差还能忍,一旦卷径从 150 mm 收到 600 mm,线性累加会把外层卷径算小好几个百分点,锥度曲线整条偏移。
import math def radius_by_area(r0, thickness, length): """面积法:r0 初始卷径(m),thickness 材料厚度(m),length 已收长度(m)""" return math.sqrt(r0 ** 2 + thickness * length / math.pi) def radius_by_linear(r0, thickness, turns): """线性累加,仅在小卷径比时近似成立""" return r0 + turns * thickness / (2 * math.pi) # 一卷 150mm 芯、材料厚 12um、收 8000m 的对照 r0, d, L = 0.075, 12e-6, 8000 r_area = radius_by_area(r0, d, L) r_lin = radius_by_linear(r0, d, L / (2 * math.pi * r0)) # 用初始周长粗估转数 print(round(r_area, 4), round(r_lin, 4)) # 两者差距在满卷时最明显这段代码的意义不在于跑出具体数值,而在于说明两件事:第一,卷径的算法决定了锥度曲线的形状,选错公式,后面所有参数调整都是在补偿一个系统性偏差;第二,累积法必须依赖"已收长度 L"这个量,而 L 要么由牵引辊速度积分得到,要么由收卷编码器累加得到,前者在打滑时失真,后者在张力波动导致包角变化时失真。实际程序里常见的做法是两个来源做交叉校验,偏差超过阈值就报警。
3.3 定点运算:锥度公式在 PLC 里必须换一种写法
公式写在纸上很干净,落到 FX3U 的 D 寄存器里就有麻烦。FX3U 的基本运算以 16 位整数为主,D 寄存器单字范围是 -32768~32767,锥度计算中间量(T0 - T1) × (R - R0)很容易溢出。更隐蔽的问题是整数除法的截断:DIV之后余数被丢掉,如果分母远大于分子,结果直接归零。
// 反面写法:16 位整数先乘后除,中间量溢出 + 结果截断 MUL D300 D302 D310 // (T0-T1) × (R-R0),很容易超过 32767 DIV D310 D304 D312 // ÷ (R1-R0),商被截断成整数 // 推荐写法:转 32 位或浮点 DMUL D300 D302 D320 // 32 位乘法,结果占 D320、D321 DDIV D320 D304 D322 // 32 位除法,商在 D322/D323,余数在 D324/D325 // 若需更高精度,用 FLT 转浮点后走 ESUB/EDIV/EMUL,最后 INT 转回32 位还不够的时候(比如张力值本身带两位小数),就把所有量放大一百倍做整数运算,最后输出前再除回去。这套"定点标定"的做法在老 PLC 上很常见,代价是每个物理量都要记住自己的标度因子,程序里到处是× 100、÷ 100,改一个参数要连带改一串。
FX3U 支持浮点指令(EADD、ESUB、EMUL、EDIV、ESQR),锥度公式用浮点写几乎是所见即所得,代价是每条浮点指令占用的扫描时间明显高于整数指令,而且浮点寄存器占用双字,地址规划要提前留空。我的经验是:卷径、张力这类参与乘除的量走浮点,启停逻辑、限位、报警这类布尔量走整数和位元件,两边在边界处用 FLT 和 INT 转换,别混着用。
回到M = T × R这条主线:锥度控制算出的 T 乘上当前 R,才是送给驱动器的转矩指令。所以第 3 章所有的公式推导,最终只为了产出两个数——一个张力给定值,一个卷径值,两者相乘进 D/A。
4. 恒张力闭环:PID 在张力回路里究竟调的是什么
4.1 张力信号链路:从传感器到 BFM 里的一个整数
张力检测有三条路线,选哪条直接决定了 PID 能不能用。
张力传感器(应变式)装在导辊轴承座上,输出毫伏级信号,经张力放大器放大成 0~10 V 或 4~20 mA。这条路精度最高,能测到几牛顿,但放大器零点漂移是常态,需要定期标定。
跳舞辊(dancer)靠气缸或弹簧压住一段料带,辊的位移经电位器或编码器转成电信号。它本质上是位置闭环,料带长度变化被机械放大了,响应快、抗脏,但张力值只能间接反映,惯性大,不适合薄材料高速场合。
第三种是力矩估算,即用驱动器输出的转矩指令反推张力,T = M / R。它不需要任何额外硬件,成本最低,但把电机损耗、减速机效率、轴承摩擦全算进了误差,只能做趋势参考。
模拟量进 PLC 要经过特殊模块。FX3U 的 FROM 指令读的是模块内部的缓冲存储器(BFM),不是直接读 A/D 结果:
// 从 0 号特殊模块的 BFM#0 起读 1 个点,存入 D100 FROM K0 K0 D100 K1 // 把 D200 写到 1 号模块的 BFM#0,占 1 个点 TO K1 K0 D200 K1四个操作数的含义要记牢:第一个 K 是模块号(从紧邻 PLC 的第一个特殊模块算起,为 K0),第二个是 BFM 地址(通道数据、量程设定、平均次数都在这片地址里),第三个是 PLC 侧软元件,第四个是点数。模块号搞错是最常见的故障,表现为读回来的数一直是 0 或者一直不变——因为它读的是另一个模块的通道。
读回来的整数还要过一层工程量换算:
def raw_to_tension(raw, raw_zero=400, raw_span=1600, eng_zero=0.0, eng_span=500.0): """raw: 0~2000 的 A/D 码值;raw_zero/raw_span 由两点标定得到;eng 单位 N""" ratio = (raw - raw_zero) / (raw_span - raw_zero) return eng_zero + ratio * eng_span # 例:空载码值 400,挂 500N 标准砝码码值 2000 print(raw_to_tension(1200)) # ≈ 250 N两点标定比一点零点校准可靠得多,因为它同时吃掉了增益误差。只做零点校准的程序,在中大张力段会有一个固定的比例偏差,表现出来就是"小张力准、大张力偏",然后有人去调 PID 参数,越调越乱。
4.2 PID 参数区的七个软元件
FX3U 的 PID 指令不是三个操作数,是四个:设定值、测定值、参数区首地址、输出目标。参数区是从首地址开始的连续 7 个软元件,依次承载采样时间、动作方向、输入滤波常数、比例增益、积分时间、微分时间、输出上限。很多人照着片段抄PID D100 D101 D102,少写一个操作数,编译能过、运行不对,查半天查不出原因。
// 参数区从 D500 开始,占 D500~D506 LD M8000 MOV K100 D500 // 采样时间 100ms,必须与实际调用间隔一致 MOV K0 D501 // 动作方向:0 为正动作 MOV K60 D502 // 输入滤波常数,抑制传感器高频噪声 MOV K300 D503 // 比例增益 MOV K50 D504 // 积分时间 MOV K10 D505 // 微分时间 MOV K2000 D506 // 输出上限 LD M0 // PID 使能 PID D100 D101 D500 D110 // 设定值、测量值、参数区、输出三个参数里,P 决定"偏差出现时立刻给多少",I 决定"偏差持续时累积多久",D 决定"偏差变化快时提前给多少"。张力回路的特殊性在于:它天生带一个随卷径变化的增益。同一套 PID 参数,在卷径 150 mm 时整定好了,到 600 mm 时会明显过冲——因为被控对象的增益变了。这是纯 PID 在收卷场景里最本质的缺陷,跟参数调得好不好没关系。
工程上的解法是增益调度:把 PID 输出乘一个R0/R的补偿系数,或者干脆把 PID 的输出叠加在卷径前馈之上,让它只负责修残差。
4.3 前馈加反馈:为什么纯反馈永远慢半拍
前馈的思路很直接:既然M = T × R这条关系是确定的,那就先按它算出一个基础转矩,直接送给驱动器,PID 只在这个基础上做小幅修正。这样做的效果是,卷径变化的动态过程由前馈承担,PID 的负担从"跟着卷径跑"降到"修掉模型误差",参数可以放得很软,不容易振荡。
常见的实现是前馈系数加上限幅:
M_out = (T_set × R × Kf) + PID_out PID_out 限幅在 ±15% 额定转矩限幅这一条特别重要。前馈给对了,PID 的输出本该在零附近小幅摆动;一旦 PID 输出长期贴着限幅跑,说明前馈系数或者卷径算错了,这时候无论怎么调 PID 参数都是徒劳。
提示:调试时先把 PID 增益置零,只留前馈,看恒张力段的实际张力偏差有多大。偏差基本恒定,说明是标定问题;偏差随卷径线性增大,说明是锥度或卷径系数问题。这一步能省掉大量盲目调参。
5. 避坑与排查:张力系统最常见的五类翻车
5.1 卷径越算越小,最后变成负数
现象:收卷跑到三分之二,卷径显示开始往下掉,锥度张力突然反向,料面出现明显松垮。
原因:累积法里L用的是牵引辊速度积分。牵引辊在加减速时打滑,积分值偏大,平方根内部算出一个比实际大的 R;一旦 PLC 侧对卷径做了上限钳位,超限后又被下一个扫描周期的减法修正拉回来,来回震荡。另一种情况是编码器 A/B 相接反,长度被当成负值累加,卷径直接开根号出负数。
解决:卷径做单调性校验,只允许在一个小窗口内变化,超出窗口就冻结并报警;长度积分加打滑系数补偿,用收卷编码器累加值与牵引辊积分值做交叉比对,两者偏差超过 3% 就切到编码器来源。
5.2 一开机 PID 就饱和,头几十米张力明显偏大
现象:换卷启动后,前二三十米张力比设定值高出很多,PID 输出长时间顶在上限,等卷径大一点才慢慢回来。
原因:积分项在启动瞬间就开始累积。启动时实际张力为零(料还没绷紧),偏差等于整个设定值,积分器在几百毫秒内就冲到上限。等料真的绷紧了,积分项要花很长时间才能退出来。
解决:启动阶段用位逻辑强制清零积分累加区,或者把 PID 切到手动、输出直接给前馈值,等张力检测超过设定值的 60% 再切自动。这个"无扰切换"的处理是所有张力程序的标配,缺了它,再好的参数也救不回开机那一段。
5.3 张力零点缓慢漂移,班中越跑越偏
现象:早上开机标定好的零点,到下午同一卷料张力读数偏高十几牛顿,操作工反复调设定值。
原因:张力放大器温漂,加上传感器安装座的机械蠕变。还有一种容易被忽略的情况——模拟量模块的 COM 端与传感器电源没有共地,屏蔽层单端接地做错,引入的工频干扰被 A/D 平均之后表现为一个缓慢的直流偏置。
解决:每卷结束的换卷间隙做一次自动零点采集(此时料带已卸空,机械上确实为零张力),把当前码值写入零点寄存器。共地问题只能从布线解决,信号地与屏蔽层分开走,模拟量线远离伺服动力线。
5.4 锥度参数改了没反应
现象:把锥度百分比从 0 改到 30%,收出来的卷硬度没变化,端面依旧。
原因:锥度计算的中间量走了 16 位整数乘除,(T0 - T1) × (R - R0)的结果被截断,或者分母R1 - R0用了未放大的原始值,商直接归零。也可能是锥度系数存在一个从未被扫描的 D 寄存器里——程序里读的是 D300,人机界面上写的是 D310。
解决:把锥度计算整段改成 32 位或浮点,中间量全部放大一百倍;在程序里加一个在线监视点,把当时的 T0、T1、R、算出的 T 都放到连续的寄存器里,用人机界面直接看这条曲线是否随卷径下降。看不见的中间量,等于不存在。
5.5 换规格后第一卷必然报废
现象:换材料厚度或换卷径规格后,第一卷总是松紧不均,第二卷开始正常。
原因:卷径累积依赖材料厚度 δ 这个参数,换规格时没同步改;PID 参数是按上一规格整定的,对象增益变了但参数没变;锥度的 R0、R1 边界还停在旧值上。
解决:把材料厚度、初始卷径、满卷卷径、锥度系数、PID 三参数做成一组"配方",按料号整组加载,而不是让人逐个改。配方切换时强制复位卷径、清零 PID 积分、重新读一次零点。这套东西没有技术含量,但它是把"依赖老师傅手感"变成"可复制"的唯一办法。
6. 取舍:开环前馈够用,还是非要上闭环
6.1 两条路线各自的适用边界
开环方案(卷径前馈 + 锥度 + 力矩模式)不需要张力传感器,成本低、响应快、不会振荡,缺点是所有误差都是系统性的:材料厚度批次差异、减速机效率变化、轴承摩擦随温度变化,全都会体现为张力偏差,而且没有任何自纠能力。
闭环方案(张力传感器 + PID)能把稳态误差压到很小,但引入了传感器漂移、信号延迟、参数随卷径变化这三个新问题,调试成本高一个量级,而且一旦参数整定不当,振荡比开环偏差更难收拾。
实际项目里我倾向的组合是:以开环前馈为主干,闭环只做慢速修正(积分时间放长到几秒),并且把 PID 输出限幅在 ±15% 以内。这样既保留了前馈的确定性,又让闭环去吃掉那些慢变的模型误差,两者互不打架。
6.2 验证一套张力程序该看哪三个量
调试时不要只盯张力曲线。我一般同时记录三个量:卷径计算值、前馈转矩指令、PID 输出占比。卷径曲线应该单调平滑,出现台阶说明厚度参数或长度积分有问题;前馈指令应该随卷径近似线性上升,斜率突变说明锥度系数写错;PID 输出占比应该长期在零附近小幅波动,长期贴限幅就说明前馈没算对。三个量放在一张趋势图上,故障基本能一眼定位,比反复试参数高效得多。
6.3 模板的价值在于结构,不在于参数
这套分切机程序模板真正值得看的地方,不是某个具体的锥度百分比或者 PID 数值——那些换个材料就得重来。值得看的是它把"速度基准—卷径估算—锥度给定—力矩换算—模拟量输出"这条链拆成了几个互相独立的段,每段之间有明确的寄存器边界,改一段不影响另一段。有了这个结构,换材料只是换配方,换机械只是换标定系数。
从那以后我每次接手张力类项目,都强制自己先在纸上把M = T × R这条主线和卷径的来源画一遍,确认每个中间量存在哪个寄存器、标度是多少、由谁写入,然后再动键盘。跳过这一步省下的两小时,通常会在现场用两个晚上还回来。希望帮到你。
本文还有配套的精品资源,点击获取