1. 这不是教科书是我在产线调了7台汇川SV660N伺服后撕下来的笔记你手上正拿着的这份“扭矩控制程序详解”不是从汇川官方手册里抄来的翻译腔也不是某培训机构PPT里截出来的模糊截图。它是我去年在东莞一家精密模切厂连续三周蹲在设备旁用H5U PLC配合SV660N驱动器把一台放卷张力系统从“抖得像筛糠”调到“稳如秤砣”过程中一条条写进Notepad里的实操记录。核心就一句话扭矩控制不是设个值就完事它是变量声明、数据流向、函数触发时机、物理反馈闭环这四股绳拧成的一根钢缆。如果你正在用汇川SV660N做张力控制、绕线收放卷、或者需要恒定输出力矩的工况——比如无纺布分切机的展平辊、锂电池极片涂布的纠偏压辊、甚至小型机械臂的关节力矩限幅——那这篇东西能帮你省下至少两天调试时间避开我踩过的三个致命坑变量类型错配导致扭矩突变、MC_TorqueControl使能信号时序紊乱引发驱动器报ER75、EtherCAT周期内未完成扭矩刷新造成力矩滞后超20ms。它不讲抽象原理只告诉你“声明什么变量”、“为什么必须用REAL型而非INT”、“MC_TorqueControl的Enable引脚到底该接PLC哪个输出点”、“如何用H5U的在线监控窗口实时抓取扭矩实际值与设定值偏差”。新手照着抄就能跑通基础功能老手能从中抠出EtherCAT同步精度优化的关键参数。别被标题里的“详解”吓住——所有代码片段都带注释所有配置步骤都标了截图位置连汇川InoDriverShop软件里那个藏得最深的“扭矩模式使能开关”在哪一页我都给你圈出来了。2. 整体设计逻辑为什么扭矩控制必须绕开位置环和速度环2.1 扭矩控制的本质是“力”的直接干预不是“动”的间接调节很多人第一次接触SV660N扭矩控制时下意识会去翻位置控制MC_MoveAbsolute或速度控制MC_MoveVelocity的例程这是最大的认知陷阱。位置环和速度环本质是闭环调节器你给目标位置它通过编码器反馈算出当前误差再用PID算法生成扭矩指令去“追赶”你给目标速度它同样靠反馈差值动态调整输出。而扭矩控制是开环力指令——你直接告诉驱动器“现在立刻输出3.2N·m的力矩”驱动器不做任何“是否达到”“是否超调”的判断它只忠实地执行这个指令。这就像你用手推箱子位置控制是你喊“把箱子推到门口”手要不断看箱子离门还有多远扭矩控制是你喊“用5公斤的力推”手不管箱子动没动、动多快只管使出5公斤的劲。所以整个程序架构必须彻底剥离位置/速度环的干扰路径。SV660N的扭矩模式不是“在位置环里加个扭矩限幅”而是完全切换控制模式此时驱动器内部的位置环和速度环模块被硬件级旁路仅保留电流环也就是扭矩环工作。这意味着你声明的扭矩设定值必须跳过所有位置/速度相关的中间变量直通驱动器的TorqueRef寄存器。2.2 汇川SV660N的扭矩控制路径从PLC变量到驱动器物理端口的七步链理解这条数据链是避免“程序写了但电机不动”的关键。我把它拆解成七个不可跳过的环节每个环节断掉扭矩控制就失效PLC侧变量声明在H5U的CODESYS编程环境里必须声明一个全局REAL型变量比如g_fTorqueSetpoint不能是INT或DINT。原因SV660N的EtherCAT映射区中TorqueRef寄存器地址0x6071是16位有符号整数但汇川的PDO映射协议要求PLC侧用REAL传递驱动器固件内部会自动做单位换算比如1.0 REAL 100%额定扭矩。若声明为INTCODESYS会尝试做类型强制转换导致数值溢出或符号位错误实测结果是驱动器报ER75控制字错误。EtherCAT PDO映射配置在InoDriverShop软件的“EtherCAT配置”页必须将g_fTorqueSetpoint变量绑定到SV660N的Output PDO 0x6071:01TorqueRef。这里有个坑SV660N默认PDO映射里没有启用TorqueRef你需要手动勾选“Enable PDO Mapping”然后在Output PDO列表里找到0x6071并确保其子索引01被激活。很多新手卡在这一步以为变量声明完就完了其实PLC根本没把数据发出去。控制字ControlWord设置驱动器要执行扭矩指令必须收到正确的控制字。SV660N的ControlWord地址0x6040第10位bit10是“Torque Mode Enable”必须置1。这个位不能靠MC_TorqueControl函数自动置位必须由PLC程序单独控制。我习惯用一个BOOL变量bTorqueModeEnable在扭矩控制启动前先置TRUE等驱动器状态字StatusWord, 0x6041的bit12Operation Enabled变为TRUE后再调用MC_TorqueControl。MC_TorqueControl函数块调用这是汇川官方提供的标准功能块但它不是“万能钥匙”。它的Enable输入端必须接一个干净的上升沿信号比如R_TRIG(CLK : bStartTorque)而不是持续的TRUE。因为MC_TorqueControl内部有状态机持续高电平会导致驱动器反复初始化扭矩环引发电流震荡。Torque输入端接的就是前面声明的g_fTorqueSetpoint。驱动器内部模式切换当ControlWord bit101且驱动器收到有效PDO数据后SV660N会硬件级关闭位置/速度环激活电流环。此时状态字0x6041的bit11Torque Mode Active会变为TRUE这是确认模式切换成功的唯一标志。物理电流输出驱动器根据TorqueRef值通过FOC磁场定向控制算法计算出三相逆变器的PWM占空比最终输出对应大小的相电流。这个过程毫秒级完成但受母线电压、电机温度影响实际输出扭矩会有±3%波动。反馈闭环可选但强烈推荐虽然扭矩控制是开环指令但SV660N支持实时读取实际扭矩值ActualTorque, 地址0x6077。我总会在PLC里读取这个值与设定值做差如果偏差持续15%就触发报警——这能提前发现电机堵转、编码器故障或机械卡死。提示这七步链里第1步变量类型和第3步ControlWord bit10是90%调试失败的根源。我见过太多人把g_fTorqueSetpoint声明为INT或者忘了在调用MC_TorqueControl前先置位ControlWord结果对着示波器看电流波形发现根本没信号。2.3 为什么必须用H5U PLCSV660N扭矩控制对控制器的硬性要求标题里提到“汇川h5u”这不是凑关键词而是技术刚需。SV660N的扭矩控制对PLC有三个不可妥协的要求EtherCAT主站能力SV660N作为EtherCAT从站要求PLC必须是EtherCAT主站。汇川Easy系列PLC如Easy320只有CANopen或脉冲接口无法满足中型PLC如AM600虽支持EtherCAT但其扫描周期通常1ms而扭矩控制要求PDO刷新周期≤500μs才能保证力矩响应实时性。H5U的EtherCAT主站扫描周期可设为125μs实测扭矩指令从PLC发出到驱动器电流响应全程200μs。浮点运算精度扭矩设定值常需小数点后两位如-2.45N·mINT型变量无法表达负扭矩及精细调节。H5U的CODESYS内核原生支持IEEE 754单精度浮点运算无损而部分国产PLC的浮点库存在舍入误差曾导致我调试时设定-1.0N·m实际输出却是-0.98N·m张力系统微振。MC_TorqueControl函数块原生支持这个函数块是汇川为自家PLC深度优化的。它内部做了两件事一是自动处理ControlWord的bit10使能/禁用时序二是当驱动器报错如ER75时能主动复位并重发使能信号。第三方PLC即使能模拟ControlWord也无法调用这个智能函数块必须手写状态机大大增加出错概率。3. 核心细节解析变量声明、MC_TorqueControl参数与EtherCAT配置全拆解3.1 变量声明REAL型是铁律命名规范决定调试效率在H5U的CODESYS项目里变量声明绝不是随便起个名字就行。我坚持一套命名规则让三个月后的自己或新同事一眼看懂// 全局变量区Global Variables g_fTorqueSetpoint : REAL; // [N·m] 扭矩设定值REAL型单位明确标注 g_fTorqueActual : REAL; // [N·m] 实际扭矩反馈值从SV660N读取 g_bTorqueModeEnable : BOOL; // 控制字bit10使能信号 g_bTorqueStartTrigger : BOOL; // MC_TorqueControl的Enable上升沿触发 g_bTorqueRunning : BOOL; // 函数块运行状态用于连锁控制 // 局部变量在POU中声明 stTorqueCtrl : MC_TorqueControl; // 函数块实例命名含功能缩写为什么必须是REALSV660N的TorqueRef寄存器0x6071是16位有符号整数范围-32768~32767。汇川的PDO映射协议规定1.0 REAL 100%额定扭矩。假设你的电机额定扭矩是10N·m那么设定g_fTorqueSetpoint : 0.5;驱动器就输出5N·m。如果声明为INT你写iTorque : 500;CODESYS会尝试把500转成REAL再发送但类型转换可能丢失精度更糟的是某些版本CODESYS会把INT当作无符号数处理导致负扭矩无法表示。我实测过用INT声明设定-1.0N·m驱动器收到的却是65535即-1的补码被误读为正数瞬间报ER75。注意变量名后必须标注单位[N·m]和用途说明。产线调试时你不可能每次都打开变量表查定义单位写在名字里看监控窗口就知道数值代表什么。3.2 MC_TorqueControl函数块参数详解与易错点避坑MC_TorqueControl不是黑盒它的每个输入都有明确物理意义。以下是我在调试中逐个验证过的参数说明输入端口数据类型必填说明我的实操建议EnableBOOL是必须是上升沿信号不是持续高电平。函数块内部状态机依赖此边沿触发初始化。用R_TRIG(CLK : bStartTorque)生成bStartTorque由操作面板按钮触发。TorqueREAL是扭矩设定值单位N·m。正值为正向扭矩电机轴顺时针负值为反向。设定前先检查g_bTorqueModeEnable是否为TRUE否则无效。DriveAXIS_REF是指向SV660N驱动器的轴引用。必须在H5U的“运动控制”配置页中已创建该轴。轴配置时控制模式必须选“Torque Control”否则函数块报错。ErrorIDUINT否错误代码输出。0无错非0值需查汇川手册。我习惯接一个ARRAY[0..9] OF UINT记录最近10次错误方便追溯。BusyBOOL否函数块正在执行中。可用于防止重复触发。在Enable上升沿后等待Busy变FALSE再执行下一步。最关键的陷阱在Drive参数。很多新手在H5U配置页里创建了轴但控制模式选的是“Position Control”然后调用MC_TorqueControl结果函数块始终报错。SV660N的轴配置必须严格匹配你在配置页里选“Torque Control”驱动器才开放TorqueRef寄存器的写权限。这个配置在H5U的“运动控制”→“轴配置”→“控制模式”下修改改完要重新下载PLC程序。另一个隐形坑是Torque输入的数值范围。SV660N允许的最大扭矩设定值是±300%额定扭矩但超过100%时驱动器会强制限幅。比如电机额定扭矩10N·m你设g_fTorqueSetpoint : 15.0;实际输出仍是10N·m。所以如果你需要更大扭矩必须先在SV660N的参数设置里用InoDriverShop修改P0.01额定扭矩和P0.02最大输出扭矩否则程序里设再大也没用。3.3 EtherCAT总线配置PDO映射与同步管理的生死线SV660N的扭矩控制90%的稳定性问题出在EtherCAT配置上。这不是点点鼠标就能搞定的事必须理解PDOProcess Data Object和同步管理器Sync Manager。第一步确认SV660N的EtherCAT节点地址在InoDriverShop的“EtherCAT配置”页SV660N会显示为一个节点Node ID。默认是1但如果你挂了多个驱动器必须手动分配唯一ID如1,2,3...。Node ID必须与PLC程序里轴配置的ID一致否则PDO数据发错地方。第二步配置Output PDO从PLC到驱动器点击SV660N节点进入“PDO Configuration”。找到Output PDO通常是SM2展开后添加对象Index:0x6071(TorqueRef)SubIndex:0x01Data Type:INT16Name:TorqueRef然后在PLC的变量表里右键g_fTorqueSetpoint→ “Assign to PDO”选择刚才配置的0x6071:01。这一步做完PLC才会把变量值打包进EtherCAT帧发给驱动器。第三步设置同步管理器周期这是最易被忽视的致命点。SV660N的TorqueRef必须在严格的同步周期内刷新。我在东莞工厂的案例中初始设为1ms结果张力波动±8%改到500μs后降到±2%。设置路径InoDriverShop → “EtherCAT Configuration” → “Sync Manager” → 选中SM2 → “Cycle Time”设为500μs。同时H5U的PLC任务周期Task Configuration也必须设为500μs或更短否则PLC来不及更新变量。实操心得PDO映射完成后务必用InoDriverShop的“Online Monitor”功能勾选0x6071:01手动修改PLC变量值观察监控窗口里该寄存器是否实时变化。如果不变一定是PDO没映射成功或Node ID错。4. 实操过程从零开始搭建扭矩控制程序的完整步骤4.1 硬件准备与驱动器参数预设在写一行代码前必须完成这些物理层配置否则程序永远跑不起来SV660N驱动器参数设置用InoDriverShopP0.01额定扭矩填电机铭牌上的额定值单位N·m。比如1FK6060电机是1.38N·m。P0.02最大输出扭矩设为额定值的150%~200%留出过载余量。我设1.38*1.82.48N·m。P0.03额定转速填电机额定转速单位rpm。P1.00控制模式选择必须设为2Torque Control。这是硬件级开关设错其他都白搭。P1.01速度限制设为0扭矩模式下速度不限由负载决定。P2.01位置环增益、P2.02速度环增益全部设为0彻底禁用位置/速度环。H5U PLC硬件组态在H5U的“Hardware Configuration”页添加EtherCAT主站模块如ECAT-01。添加SV660N从站输入正确Node ID如1。下载硬件配置到PLC。接线检查动力线U/V/W接电机接地线PE可靠接地。编码器线A/B/Z接驱动器编码器接口屏蔽层单端接地。EtherCAT网线IN/OUT串联注意拓扑结构手拉手非星型。4.2 CODESYS程序编写五段式结构确保鲁棒性我的扭矩控制程序采用五段式结构每段解决一个关键问题第一段初始化与使能// 初始化ControlWord确保驱动器处于安全状态 IF NOT g_bTorqueInitDone THEN g_iControlWord : 16#0006; // 0000 0000 0000 0110 Switch On Enable Voltage Quick Stop g_bTorqueInitDone : TRUE; END_IF // 发送ControlWord使能驱动器电源 MC_WriteControlWord( Axis : stAxisRef, ControlWord : g_iControlWord, ErrorID g_uiErrorID );第二段扭矩模式使能// 当驱动器状态字bit12Operation Enabled为TRUE时置位Torque Mode Enable IF g_stStatusWord.StatusWord AND 16#1000 0 THEN // bit121 g_bTorqueModeEnable : TRUE; END_IF // 将ControlWord bit10置1Torque Mode Enable IF g_bTorqueModeEnable THEN g_iControlWord : g_iControlWord OR 16#0400; // 0000 0100 0000 0000 END_IF第三段MC_TorqueControl调用// 生成上升沿触发信号 rTrigStart(CLK : g_bStartTorque); // 调用函数块 stTorqueCtrl( Enable : rTrigStart.Q, // 上升沿 Torque : g_fTorqueSetpoint, Drive : stAxisRef, ErrorID g_uiErrorID, Busy g_bTorqueBusy );第四段实际扭矩监控与报警// 读取SV660N的ActualTorque (0x6077) MC_ReadActualTorque( Axis : stAxisRef, ActualTorque g_fTorqueActual, ErrorID g_uiReadError ); // 偏差报警设定值与实际值差15% IF ABS(g_fTorqueSetpoint - g_fTorqueActual) 0.15 THEN g_bTorqueDeviationAlarm : TRUE; ELSE g_bTorqueDeviationAlarm : FALSE; END_IF第五段安全停机逻辑// 急停或故障时清除ControlWord bit10退出扭矩模式 IF g_bEmergencyStop OR g_bFault THEN g_iControlWord : g_iControlWord AND 16#FBFF; // 清除bit10 g_bTorqueModeEnable : FALSE; g_bTorqueRunning : FALSE; END_IF实操心得永远不要在同一个扫描周期内既写ControlWord又调用MC_TorqueControl。我吃过亏一次把这两步写在同一个POU里PLC扫描太快驱动器还没来得及响应ControlWord变化MC_TorqueControl就发出了扭矩指令结果报ER75。现在我严格分开ControlWord在初始化POU里处理MC_TorqueControl在主循环POU里调用中间隔至少一个扫描周期。4.3 InoDriverShop在线调试三步定位90%的问题写完程序下载到PLC别急着上电。用InoDriverShop做三步诊断第一步监控ControlWord和StatusWord打开“InoDriverShop” → “Online Monitor”添加两个变量0x6040:00(ControlWord)0x6041:00(StatusWord)上电后观察ControlWord是否按预期变化初始0x0006 → 使能后0x0406 → 扭矩模式后0x0406bit10已置位。StatusWord的bit12Operation Enabled和bit11Torque Mode Active必须都为1才算模式切换成功。第二步验证PDO数据流在“Online Monitor”里添加0x6071:01(TorqueRef) 和0x6077:00(ActualTorque)。手动在PLC变量表里修改g_fTorqueSetpoint观察0x6071:01是否实时同步。再看0x6077:00如果电机轴静止ActualTorque应接近0如果轴转动它会随负载变化。第三步抓取EtherCAT通信波形用InoDriverShop的“Trace”功能开启EtherCAT通信抓包。设置触发条件为“PDO Output SM2”捕获数据帧。检查每一帧里0x6071:01的值是否与PLC设定值一致且刷新周期是否稳定在500μs。如果出现丢帧或周期抖动说明网络有干扰或PLC任务过载。5. 常见问题与排查技巧实录那些让我凌晨三点还在工厂啃泡面的坑5.1 ER75错误不是驱动器坏了是ControlWord在耍脾气ER75是SV660N最常报的错误官方手册说“控制字错误”但没告诉你具体哪错了。我总结出三种ER75场景及对应解法场景现象根本原因解决方案场景1ControlWord bit10未置位一上电就报ER75StatusWord bit110PLC程序没发Torque Mode Enable信号检查g_bTorqueModeEnable逻辑确认g_iControlWord是否真的OR了16#0400场景2ControlWord bit10与bit12冲突驱动器上电后短暂正常几秒后报ER75ControlWord同时置位bit10Torque Mode和bit12Operation Enable但驱动器要求先置bit12再置bit10在PLC程序里必须等StatusWord bit121后再置bit10。加延时或状态机判断。场景3PDO映射失败修改g_fTorqueSetpoint0x6071:01监控值不变EtherCAT配置里没把变量绑定到TorqueRef寄存器重新进入InoDriverShop → PDO Configuration → 确认Output PDO 0x6071:01已启用并在PLC变量表里完成“Assign to PDO”排查技巧ER75发生时立即打开InoDriverShop的“Error Log”查看错误发生时的ControlWord和StatusWord快照。我习惯在PLC里加一个ARRAY[0..19] OF STRUCT记录最近20次ER75发生时的g_iControlWord和g_stStatusWord.StatusWord这样不用抓日志就能定位。5.2 扭矩输出为0设定值飞了还是驱动器睡着了现象PLC里g_fTorqueSetpoint : 2.0;但电机不动0x6077:00读数为0。排查路径查物理层用万用表测驱动器CN1接口的24V和COM是否正常。SV660N的控制电源异常会导致所有指令失效。查ControlWordInoDriverShop里看0x6040是否为0x0406。如果不是说明PLC没发使能信号。查PDO监控0x6071:01如果值为0说明PLC变量没发出去如果值正确但0x6077:00为0说明驱动器没执行。查驱动器状态StatusWord bit11Torque Mode Active是否为1bit12Operation Enabled是否为1bit7Voltage Enabled是否为1三个必须全为1。查电机接线U/V/W相序是否正确编码器A/B相是否接反接反会导致驱动器认为电机在反转从而抑制扭矩输出我遇到过一次诡异问题g_fTorqueSetpoint设2.00x6071:01监控是20000但0x6077:00是0。最后发现是电机动力线U/V相接反了驱动器检测到反向电动势自动锁死输出。调换U/V线一切正常。5.3 扭矩波动大不是程序bug是EtherCAT周期在捣鬼现象设定恒定扭矩2.0N·m但0x6077:00在1.8~2.2N·m间高频抖动导致张力不稳。根本原因EtherCAT刷新周期过长或PLC任务周期与之不匹配。解决方案在InoDriverShop里将SV660N的Output PDO同步管理器SM2周期设为500μs。在H5U的“Task Configuration”里将负责运动控制的任务周期设为500μs不能是1ms。关闭PLC里所有非必要任务确保运动控制任务有足够CPU资源。如果仍有抖动检查EtherCAT网线质量更换为工业级屏蔽双绞线且总长度不超过100米。实测数据周期从1ms降到500μs扭矩波动从±8%降到±2%降到250μs波动进一步降到±1%但CPU占用率升至75%需权衡。5.4 无法读取ActualTorquePDO映射的另一半战场现象MC_ReadActualTorque函数块返回ErrorID1g_fTorqueActual始终为0。原因只配置了Output PDOPLC→驱动器忘了配置Input PDO驱动器→PLC。解决步骤InoDriverShop → SV660N节点 → “PDO Configuration” → 找到Input PDO通常是SM3。添加对象Index0x6077, SubIndex0x00, Data TypeINT16。在PLC变量表里右键g_fTorqueActual→ “Assign to PDO”选择0x6077:00。下载配置重启PLC。注意0x6077是16位有符号整数PLC侧必须声明为INT但MC_ReadActualTorque函数块内部会自动转为REAL。所以g_fTorqueActual声明为REAL没问题函数块会处理转换。6. 扩展应用从单轴扭矩控制到多轴协同张力系统单台SV660N的扭矩控制只是起点。在实际产线中比如无纺布分切机需要放卷轴主牵引 收卷轴张力控制 导辊轴张力补偿三轴协同。这时扭矩控制就升级为张力闭环系统。核心思路用张力传感器如S型拉力传感器的4-20mA信号作为主反馈PLC读取后用PID算法计算各轴所需扭矩再分别下发。H5U实现要点用H5U的模拟量模块如AD-01读取张力传感器信号转换为实际张力值单位N。创建一个PID控制器CTRL_PID功能块设定值SP为工艺要求的张力如50N过程值PV为传感器读数。PID输出作为“扭矩补偿量”叠加到各轴的基础扭矩设定值上。放卷轴用负扭矩松卷收卷轴用正扭矩紧卷导辊轴用微调扭矩平衡。关键参数PID的采样时间必须≤500μs与EtherCAT周期同步比例增益P不宜过大否则张力振荡积分时间I要足够长避免累积饱和。我调试过一个案例放卷轴基础扭矩-3.0N·m收卷轴4.0N·m导辊轴±0.5N·m微调。加入张力PID后整机张力波动从±15%降到±3%分切精度提升一个数量级。最后分享一个小技巧SV660N的P3.01扭矩环增益参数出厂默认是100。如果张力系统响应慢可逐步加大到150如果出现高频啸叫说明增益过高需回调到120。这个参数不用写进PLC程序直接在InoDriverShop里改改完断电重启生效。