资讯动态

CoDeSys运动控制:Gantry3pi坐标变换与插补器参数调试

发布时间:2026/10/15 7:02:46 来源:尧图企业网站定制
简介CoDeSys运动控制资料包面向工业自动化领域的PLC编程、运动控制与机器人调试人员系统讲解CoDeSys软PLC中的运动控制实现方案。文档以SMC_TRAFO_Gantry3pi模块和SMC_Interpolator功能块为核心逐一说明目标位置向量、x/y偏移量、移动范围、驱动器映射等参数并覆盖bExecute、poqDataIn、bSlow_Stop、bEmergency_Stop、bWaitAtNextStop等输入变量的作用以及bDone、dwIpoTime、piSetPosition、iStatus、dVel等输出状态量的含义帮助读者理清从SMC_GEOINFO轨迹对象到离散位置点的插补流程。内容还对比了梯形与S形速度轮廓的特点以及急停、慢停、等待停止等运动控制逻辑适用于gantry机器人、数控设备、运动平台等场景。压缩包内共1个doc文档约130KB资料精炼且无冗余文件适合现场调试时快速查阅或作为SMC功能块的学习笔记。目前已有973人学习下载是一份高性价比的CoDeSys运动控制中文参考资料。1. 一份写满插补器参数的 CoDeSys 运动控制文档到底能帮你省多少事做双轴龙门和数控插补的人迟早会在 CoDeSys 运动控制库里碰到 SMC_TRAFO_Gantry3pi 和 SMC_Interpolator 这两个名字。前者负责把 GEO 坐标系里的目标位置换算到两个驱动轴后者是整条轨迹从连续路径变离散位置点的核心。大多数时候你会从某个渠道拿到这份文档的 PDF但里面全是模块引脚说明和参数注释没有系统讲解也没有调试顺序真正上手时还是会被 bExecute 和 bDone 的时序搞懵。这篇笔记的价值不是替你把文档读一遍而是把这些参数串成一条可复现的调试链路告诉你每个管脚在实际设备上到底改什么、怎么改、改完看哪里。2. 坐标变换层SMC_TRAFO_Gantry3pi 的参数划分与选型理由2.1 为什么龙门结构需要单独做一次坐标变换双轴龙门和我们平时用的 XY 平台有一个关键差异它有两个电机同时托着一根横梁负载的位置是由 x 轴和 y 轴电机共同决定的。如果直接把 G 代码解析出来的 VI虚拟轴位置送给两个驱动轴设备在运行中会因为两轴跟随误差不一致产生“扭梁”轻则轨迹变形重则憋坏机械结构。所以 CoDeSys 运动控制里专门有 TRAFO 模块做运动学变换把虚拟轴的笛卡尔坐标映射成物理轴的参考位置。SMC_TRAFO_Gantry3pi 做的是正向变换也就是从 G 代码的目标点计算两个轴各自应该到的位置。它的名字里的“3”通常对应龙门结构的第三维约束或者三轴联动场景当你的项目是双轴龙门加一根横梁时这个模块就是最直接的选择。另一个常见模块 SMC_TRAFO_Gantry3 处理的是不带附加偏移的基础款龙门结构而带 pi 后缀的版本增加了目标位置向量 SMC_PosInfo 的直接支持方便你把插补器输出的位置信息完整接进来不丢附加轴数据。2.2 输入输出参数表哪些是运动参数哪些只是可视化参数打开文档里关于 Gantry3pi 的章节你会发现有很多 LREAL 类型的参数很多人第一次看会以为它们都要参与控制实际上它们分成了两类。第一类是真正影响运动计算的参数。dOffsetX 和 dOffsetY 是 x/y 轴的偏移量这个偏移通常来自机械安装时的原点偏差需要你在设备调试时实际测量填入。dx 和 dy 是 GEO 坐标系里 x/y 轴的目标值这两个值通常直接连接 SMC_Interpolator 输出的 piSetPosition 里的笛卡尔坐标分量。DriveX 和 DriveY 是 AXIS_REF 类型的轴引用分别指向两个物理驱动轴。第二类是给可视化用的它们不参与运动学计算只在 HMI 或者仿真界面上显示当前的位置范围。minX、maxX、minY、maxY 定义了运动范围边界ratio 是 x 轴间距和 y 轴间距的比率便于可视化画面保持真实比例。dnx、dny、dnOffsetX、dnOffsetY 是标准化位置范围 0 到 1通常用于虚拟场景贴图把实际位置映射到画面坐标。这里最容易翻车的点是把 dx、dy 直接接到别的模块再算一遍结果位置被二次变换。我一般会把 Gantry3pi 的输出到插补器这条链路上做断点监控确认 SMC_PosInfo 里的 x、y 值和物理轴的设定位置一致再往下游送。2.3 按文档参数做一次最小配置假设你手头有一台双轴龙门设备机械原点在左下角x 轴行程 800mmy 轴行程 500mm你在 CoDeSys 环境里按下面的顺序配置。第一步在轴配置里添加两个物理轴命名建议直接叫 DriveX 和 DriveY类型选 AXIS_REF并完成驱动器通讯与使能设置。第二步调用 SMC_TRAFO_Gantry3pi 功能块。在 I/O 映射里把模块的 DriveX 引脚连接到轴变量 X_REFDriveY 连接到 Y_REFdx 和 dy 引脚接到上一级插补器输出的 SMC_PosInfo 笛卡尔坐标分量dOffsetX 和 dOffsetY 先填 0 预留。第三步设置可视化范围。minX0、maxX800、minY0、maxY500、ratio800/5001.6这几个值只影响画面显示不影响实际运动。第四步用一段单轴往复程序验证映射关系是否正确。手动给 dx 一个固定值比如 dx100、dy0观察 DriveX 是否走到 100mm 处DriveY 是否停在原点。如果轴走的方向反了说明轴的方向配置有问题需要到轴配置里反转计数方向。注意这一步不要急着接插补器先确认坐标变换模块的缩放和方向正确。很多项目在联调阶段出现问题最后查来查去都是某个轴的编码器方向或者传动比设错了而 Gantry3pi 只是如实把坐标传给了轴。3. SMC_Interpolator 插补器核心输入输出信号规律与速度轮廓设定3.1 插补器在运动控制链路中的位置如果你按照 G 代码解析到驱动器这条链路来理解整条数据流大致是SMC_NCDecoder 或者 SMC_SmoothPath 负责把文本格式的 G 代码解析成 SMC_GEOINFO 对象放进 SMC_OUTQUEUE 缓冲区然后 SMC_Interpolator 从这个缓冲区不断取出 GEOINFO 对象按照设定的速度轮廓和时间片计算出每一个插补周期内的目标位置点 piSetPosition最后上位逻辑把 piSetPosition 里的坐标送入坐标变换模块变换后再送给驱动轴。SMC_Interpolator 之所以是核心是因为它决定了设备实际跑出来的轨迹轮廓。如果你在文档里只看到“将连续轨迹转换成离散轨迹位置点”这句话可能会误以为它只是个采样器但实际上它内部包含了加减速规划、急停处理、等待停止、速度倍率、附加轴多项式插补等一整套逻辑。这也解释了为什么它输出变量里有 dVel当前速度和 iStatus状态枚举这些都是供上位逻辑监控设备实时状态的信号。3.2 输入引脚时序与行为规律文档里对输入变量的描述比较零散我把它整理成一张时序控制表方便你对照调试。bExecute 是启动开关。功能块内部逻辑会在 bExecute 出现上升沿时复位自身状态机同时开始从 poqDataIn 指向的 SMC_OUTQUEUE 取数据。如果你保持 bExecute 为 TRUE 不变化插补完一段轨迹后 bDone 会变为 TRUE功能块停在 FINISHED 状态直到你再次给一个上升沿才会启动下一轮。poqDataIn 是指针类型的输入连接前一级模块的输出队列。典型接法是 SMC_NCDecoder 的 DataOut 直接连到这个引脚。这里要注意必须保证前级模块已经填充了完整的 SMC_OUTQUEUE 结构体如果队列为空插补器会等待或者直接报错具体取决于你的调用周期。bSlow_Stop 和 bEmergency_Stop 的区别是很多新手容易混淆的地方。bSlow_Stop 是减速停止它按照当前 GEOINFO 对象里定义的减速度把速度降到 0但不会立即刹停适合正常工艺里的暂停需求。bEmergency_Stop 是立即停止速度瞬间置 0适合安全场景。两条引脚默认都是 FALSE接到急停回路时要仔细确认外部信号的常开常闭逻辑避免急停回路断开时反而触发急停。bWaitAtNextStop 的作用是让设备在下一次要求停止的位置典型是轨迹转角处保持暂停直到你把这个引脚重新置 FALSE。这个功能在做点胶或者焊缝工艺时很实用可以在转角处停顿让胶水充分填充。需要注意的是它不是每段都停而是等到下一个速度为零的位置才生效。dOverride 是速度倍率默认 1.0范围要求大于 0.01。它可以在线修改但只能在当前没有加速或减速的过程中生效否则要等当前阶段结束才会应用新值。这意味着你程序里随时改 dOverride 是允许的但别期待它瞬时改变加速度段的斜率。iVelMode 选择速度轮廓TRAPEZOID 是梯形速度图SIGMOID 是 S 形速度图。梯形图在加减速阶段加速度是恒定的所以设备在启动和停止瞬间加速度跳变对轻载设备足够S 形图加速度连续适合重型设备或者有精密定位需求的场景。我一般在程序里用 CASE 语句根据工艺选择速度模式切换前先确认没有正在执行的轨迹段否则插补器可能会按新模式重新规划导致中途变速。3.3 用一张速度轮廓对比表理解本质区别梯形速度图和 S 形速度图的本质区别在于加速度是否连续。文档里提到一个容易忽略的细节把 S 形改成梯形不会让整条轨迹运行时间变长因为起始和结束端受限的加速度增量会在中间段被更高的加速度补偿。也就是说两种轮廓下轨迹总时间接近但设备承受的加减速冲击完全不同。下面这张表可以直观对比速度轮廓加速度连续性起始/结束冲击适用负载计算开销梯形不连续明显轻载、高节拍小S 形连续极小重载、高精度略大另一个容易漏掉的参数是 GEOINFO 对象里最大加速度对 S 形轮廓的影响。文档明确提示使用 S 形轮廓时编程指定的最大加速度或减速度最多会被超过约 1.57 倍π/2。这个数值意味着你在工艺里设定最大加速度为 2m/s²实际执行时加速度峰值可能到 3.14m/s² 左右选型时电机的扭矩余量要留够。我见过一个项目因为忽略了这个系数导致加速阶段电机过载报警后来把加速度降为原来的一半才稳定运行。3.4 附加轴插补S 形还是线性取决于 wSProfile文档花了一段描述附加轴的插补方式。默认情况下附加轴的位置是依据 X、Y、Z 空间中的轨迹长度做线性插补的。这在大多数场合够用但如果你需要附加轴比如旋转轴或 Z 轴在轨迹段两端速度为零、内部平滑过渡就得对当前对象的 piStartPos 里的 wSProfile 变量相应位置位。置位后附加轴不再按笛卡尔空间长度线性插补而是按轨迹完成比例做多项式插补得到一个 S 形的轴位置轮廓并且段首段尾速度和加速度都为零。这种模式适合在轨迹段切换时避免附加轴冲击的场景比如激光切割时的焦点高度轴。常见做法是在轨迹预处理阶段根据工艺标记 GEOINFO 对象的 wSProfile而不是在插补器运行过程中改。因为插补器只在取到对象时读取一次该变量运行中修改不会生效。4. 避坑排查Gantry3pi 与 SMC_Interpolator 联调时最容易翻车的六个点4.1 bDone 与 bExecute 的复位时序不匹配程序跑完一次就卡住现象第一次启动轨迹运行正常跑完后 bDone 一直为 TRUE再次给 bExecute 上升沿没有反应设备停在原点不动。原因SMC_Interpolator 的 bDone 只在 bExecute 为 FALSE 时才被复位。很多人的 PLC 程序把 bExecute 写成一直为 TRUE导致 bDone 永远不复位功能块状态停留在 FINISHED不再处理新进入队列的数据。解决手动控制 bExecute 引脚启动时拉高检测到 bDone 为 TRUE 后主动把 bExecute 拉低一个扫描周期再拉高触发下一轮。我习惯写一个两行的状态机来处理这个时序比直接置 TRUE 靠谱得多。4.2 dOverride 改倍率后速度纹丝不动现象在线把 dOverride 从 1.0 改成 2.0轴速度没有任何变化要过几秒钟才突然变快。原因文档里写得很清楚dOverride 只有在当前没有加速或减速的情况下才会被应用。如果你在设备匀速段修改它可能刚好处于匀速区所以不会立刻生效如果正处于加速段它要等加速完成才应用。解决设计 HMI 倍率旋钮时把改动时机放在设备等待启动阶段。如果必须支持运行中改倍率就要接受这个延迟特性或者把 dOverride 的变化同时反馈给上位控制逻辑避免操作者以为按钮坏了。4.3 SMC_PosInfo 里的附加轴位置没更新导致 Gantry3pi 输出轴位置不对现象插补器输出的 piSetPosition 中笛卡尔坐标 x、y 始终正确但附加轴值一直保持初始值导致使用附加轴联动时轨迹错位。原因SMC_PosInfo 结构体里除了笛卡尔坐标还有附加轴位置字段。如果你在 G 代码解析或者轨迹预处理阶段没有正确填充附加轴的目标值插补器虽然会输出该结构体但附加轴字段只是透传或者保持默认值不会自动做插补计算。解决检查 G 代码到 GEOINFO 对象的转换链路确认附加轴指令被正确解析到 SMC_GEOINFO 对象的附加轴字段里。同时确认 SMC_Interpolator 相关参数中附加轴使能位是开启状态否则它确实不计算附加轴。4.4 iLastSwitch 开关信号丢事件设备越过多个开关只报最后一个现象设备运行中经过两个行程开关上位逻辑采集 iLastSwitch 只收到第二个开关的编号第一个开关的信号被漏掉。原因iLastSwitch 输出的是“上一个通过的开关序号”如果在一个插补周期内通过了多个开关它只会显示最后一个这是设计如此不是 bug。解决如果你的工艺需要捕获每个开关的触发用 dwSwitches 输出。这个双字变量的每一位代表一个开关的当前状态第 0 位对应开关 1第 31 位对应开关 32辅助标记在第 32 位。你可以在程序里对它做上升沿检测逐位捕获所有开关事件。4.5 轨迹末端 OUTQUEUE 为空无法再次执行同一轨迹现象一段轨迹执行完后再次触发 bExecute插补器没有动作监控 poqDataIn 指向的队列发现为空。原因SMC_Interpolator 每处理完一个 GEOINFO 对象就会把它从 SMC_OUTQUEUE 中清除。轨迹跑完队列自然为空。这是正常行为不是故障。解决如果需要循环运行同一轨迹有两种做法。第一种是把 CNC 程序重新送入解码器重建 SMC_OUTQUEUE第二种是使用 SMC_RESTOREQUEUE 功能块前提是 OUTQUEUE 缓冲区足够大在第一次执行时就把完整轨迹缓存下来了。我一般建议用第二种因为省去了解码时间循环衔接更紧凑。4.6 急停后重新启动插补器静止不动且 iStatus 停在 IPO_WAIT现象设备急停后人工复位急停按钮再次触发启动指令轴没有任何反应查看 iStatus 状态枚举发现停在 IPO_WAIT。原因IPO_WAIT 表示急停或者慢停信号有效且速度为零时插补器进入了等待状态。如果你没有把 bEmergency_Stop 重新拉低到 FALSE或者程序中急停状态锁存逻辑没释放插补器会一直保持在等待状态不接收新的运动请求。解决急停复位流程里除了清理急停信号还要检查 bSlow_Stop 和 bWaitAtNextStop 是否也被意外置位。我在项目里统一用一个“复位插补器”函数块把所有停止相关的引脚全部复位再重新给 bExecute 上升沿一次搞定。5. 参数调优速度轮廓、倍率与附加轴插补的实际调整手法5.1 从梯形切到 S 形时加速度余量先降一半文档里那个 π/2 的超出系数是你调机前必须算的一笔账。我一般会按这个步骤来第一步先按梯形速度轮廓调通整条轨迹记录当前最大加速度下设备运行是否平稳。第二步切换到 S 形轮廓把 GEOINFO 里设定的最大加速度数值先乘 0.6留出约 1.67 倍的执行余量此时实际峰值加速度约为设定值的 0.6 × 1.57 0.94 倍略低于机械承受极限。第三步运行一条完整轨迹观察电机电流和机械振动逐步增大设定加速度每次增量不超过 10%直到出现轻微抖动或过载趋势再回退一档。这样调出来的加速度参数既发挥了 S 形轮廓的优势又不会让电机扭矩选型显得捉襟见肘。千万不要直接按梯形轮廓的加速度数值套到 S 形上峰值超出原设定值 57% 的概率很高大多数过载报警就是这么来的。5.2 在线倍率利用 dOverride 实现不重启程序的工艺切换有一个实用技巧dOverride 可以同时用于节流而不是只在调试时用。比如你的设备有两种工艺速度正常工艺 100% 速度运行而换料或者空跑挪位置时希望 50% 速度运行。你不需要切换 G 代码加工程序只需要在 PLC 逻辑里把 dOverride 从 1.0 改成 0.5设备会在下一个匀速阶段自动降速省去了重新解析程序的等待。注意文档里强调“只有在当前没有加速或减速的情况下才会应用修改值”。所以如果你的工艺程序是短段频繁加减速的路径dOverride 的生效时间可能会让你觉得“没反应”。这时候我一般会在 HMI 上做一个倍率显示把插补器当前状态里的加速/匀速/减速状态显示出来操作者看到设备处于匀速段再调整倍率体验会好很多。5.3 附加轴 S 形插补用 wSProfile 实现柔性旋转轴动作如果你的设备带旋转轴或者定位轴并且它在轨迹段首尾需要停顿或者换向默认的线性插补会让附加轴在段边界处产生速度跳变。一个典型场景是涂胶轨迹Z 轴在段首需要下降段尾需要抬起。我把附加轴启停逻辑写成这样// 假设 geoObj 是当前待处理的 SMC_GEOINFO 对象 // 当附加轴需要在段首和段尾平滑启停时置位 wSProfile 的附加轴插补位 IF bEnableSProfileForAux THEN geoObj.piStartPos.wSProfile : geoObj.piStartPos.wSProfile OR 16#0008; // 16#0008 是示例位掩码具体位数以实际库定义为基准 ELSE geoObj.piStartPos.wSProfile : geoObj.piStartPos.wSProfile AND 16#FFF7; END_IF这段代码的逻辑是通过位或运算把 wSProfile 的某一位拉高使能附加轴多项式插补通过位与运算清除该位恢复默认的线性插补。我把这个逻辑放在轨迹预处理模块里在 GEOINFO 对象进入 SMC_Interpolator 之前完成标记。如果你在插补器运行期间修改插补器已经读过的对象不会响应新对象才会生效。参数说明16#0008 这个掩码值是示例性质不同 CoDeSys 版本的运动控制库对 wSProfile 的位定义可能不同。你在实际项目里需要打开库的常量定义视图找到附加轴 S 形插补对应的位改写成你的库版本对应的数值。用显式的方式做位操作比直接给整个变量赋值要安全因为 wSProfile 里可能还有其他位控制着插补器的其他行为。这段逻辑带来的实际收益比较直观设备在轨迹转角处附加轴运行更平稳不会出现轴杆顿挫的声音。如果你做的是高加速度短节拍工艺这个优化对机械寿命有直接好处。6. 验证方法把整条插补链路跑通再上真机验证顺序不能反过来。我的习惯是先建一个虚拟轴项目完全不接驱动器和电机把解码器、轨迹预处理、SMC_Interpolator、Gantry3pi 全部搭好用一段典型 G 代码跑离线仿真确认每个输出节点的数值变化符合预期。第一步检查 SMC_Interpolator 的 iStatus 变化顺序。正常轨迹运行时应该依次看到 IPO_ACCEL、IPO_CONSTANT、IPO_DECEL、IPO_FINISHED。如果你看到 IPO_WAIT 出现在急停信号复位后说明停止信号没有完全释放。监控这个枚举值判断插补器是否在正常“呼吸”。第二步检查 dVel 是否按梯形或 S 形规律变化。在梯形模式下dVel 在加速段线性上升匀速段保持不变减速段线性下降在 S 形模式下加速段起始和结束阶段斜率较缓中段斜率较陡。如果你发现 dVel 在段间出现跳变说明 GEOINFO 对象里速度或加速度设定有问题。第三步对比 piSetPosition 里的坐标轨迹和输入轨迹。在 HMI 或者在线监控里画一个 XY 散点图观察插补器输出的点是严格按照路径轮廓分布还是在转角处出现明显偏差。这一步能提前暴露坐标变换模块的偏移量设置错误。第四步验证末段减速和停止行为。把程序末尾加上 M30 或者停止指令确认 bDone 变为 TRUE 前 dVel 已经降到零iStatus 进入 IPO_FINISHED。如果减速过程中 bDone 提前置位说明你前级模块的结束标记与插补器不匹配。第五步验证循环执行。使用 SMC_RESTOREQUEUE 缓存完整轨迹连续触发两次启动确认第二次执行前不需要重新解码且轨迹起点、终点位置一致。从那以后我每次接手新的运动控制项目都会强制走一遍这套离线验证流程再上真机。因为这套方法帮我躲过好几次坐标方向配置错误的坑也节省了大量现场调试时间。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑