开场:为什么录波这件事值得单独写一篇实战
倍福 Twincat 用户在调试伺服轴或者排查现场偶发故障时,迟早会撞上 ScopeView 这个东西。它是 Twincat 3 自带的可视化录波工具,不需要额外买软件授权,在 Visual Studio 的 Twincat 环境里直接就能调出来用。但很多刚接触倍福生态的工程师,包括一部分用了一两年 Twincat 的人,对 ScopeView 的使用还停留在“能看个大概曲线”的程度,真正遇到变量刷不出来、波形毛刺分不清是干扰还是真实信号、不知道怎么看反馈跟随误差这类问题时,就容易卡壳。
这篇内容不打算讲 ScopeView 的每一个菜单按钮,而是从现场调试的实际需求出发,把一套完整的录波流程拆开讲清楚:变量怎么选、配置怎么设、触发怎么用、超采样怎么开、波形怎么保存和导出,以及我踩过的那些坑。无论你是刚开始接触倍福,还是已经在用 Twincat 2 想切换到 Twincat 3,这篇都能给你省下不少自己试错的时间。
1. 录波之前的认知:ScopeView 到底和其他工具差在哪
1.1 ScopeView 是软件示波器,不是数据记录仪
很多第一次接触 ScopeView 的人会把它当成一个“无限时长”的记录工具,这是一个容易踩的误区。ScopeView 本质上是软件示波器,它在 Twincat 实时任务的每个周期里采集变量值,然后在 PC 侧以图形方式显示出来。它解决的场景是“看波形、看趋势、看偶发问题”,不是“帮你连续记录一个月的数据然后做归档”。
我经常用一句话概括 ScopeView 的价值:它是你 PLC 程序内部信号的示波器。外部示波器只能测物理引脚上的电压、电流、编码器差分信号,而 ScopeView 能直接看到 Axis 对象的 Position Feedback、Following Error、Controller Output、Status Word 这些控制器内部变量。这意味着你可以把“程序里看到的报警时序”和“实际轴运动的物理表现”对应起来分析,这在排查偶发报警、顿挫、异响问题时几乎是不可替代的。
另外,ScopeView 和外部示波器还有个区别是采样时机。外部示波器是硬件采样,不依赖你的程序运行;ScopeView 的采样是挂在任务周期上的,所以它天然只能看到 PLC 任务运行时刻的值。如果某一个周期任务卡死了或者优先级被抢占,ScopeView 的曲线就可能出现缺失。这一点在分析实时性问题时反而是个线索,但在日常使用中要注意区分。
1.2 用 ScopeView 解决哪些实际问题
从项目运维的角度看,ScopeView 最常见的用途大概有这几类:
第一类是伺服调试。在线看速度指令和实际速度的跟随情况、位置指令和 Position Feedback 的偏差、转矩电流的波形是否平顺。轴在低速运动时有没有爬行、高速停止时会不会过冲,这些用 ScopeView 拉几条曲线比看一大堆数值直观得多。
第二类是故障复盘。现场偶发报警,比如 AX5000 报跟随时钟错误、NC Axis 报 Following Error 超限,如果只在报警之后看 PLC 的报警文本,信息往往不够。配好触发条件,让 ScopeView 在报警发生前后各采一段数据,就能看到报警瞬间各变量的实际状态:是给定跳变导致的问题,还是编码器反馈的毛刺,一眼就能分辨。
第三类是程序逻辑验证。比如你在程序里写了一个状态机的切换逻辑,希望 A 条件满足后 50 毫秒内完成 B 动作。在 ScopeView 里把状态字、条件变量、动作变量一起拉出来看时间轴,比你在程序里加一堆中间变量再手动监控要直观得多。
2. 实操第一步:从 PLC 变量到 ScopeView 通道
2.1 变量选择时的几个常见问题
在 ScopeView 里加通道,很多人直接右键选择 Target Browser、输入变量名,然后发现拉出来的曲线要么是平的,要么干脆是 0。这通常不是 ScopeView 坏了,而是变量选得不对。
首先是程序内声明的变量,比如你在 MAIN 里写了一个nCounter : INT,ScopeView 不一定能直接搜到。原因在于 Twincat 3 的变量存在于不同的命名空间和上下文里。通过 Task 的上下文访问变量,你需要找到对应任务下的 Program 路径,比如MAIN.nCounter或者TASK_1.MAIN.nCounter。如果你的变量是在 FB 内部声明的,还需要路径里带上 FB 实例名,比如MainMachine.AxisX.ActualPos。
其次是结构体变量。ScopeView 支持直接选中一个结构体,然后在属性面板里勾选它的各个子成员作为单独通道,这在 Twincat 3 里已经做得比较方便了。但有一个问题需要注意:如果你选中的是结构体本身而不是子成员,ScopeView 可能只会显示一个聚合的值或者根本显示不了具体波形。正确做法是展开结构体,把关心的字段逐个拖到通道列表里。
第三个坑是变量显示值一直是 0,但程序监控里明明有值。这种情况很容易出现在物理 IO 映射的变量上。比如Term 2 (EtherCAT).Ch1.Input这类变量,它们在 ScopeView 里可以选,但如果 PLC 没有激活或 IO 通讯没有建立,这个变量就不会更新。另外一些带有重定向或者别名(Alias)的变量也会出现这种情况,检查办法是先在 Twincat 的 Online 监控里确认变量有值,再回到 ScopeView 里看。
2.2 变量路径格式与分组技巧
ScopeView 的通道列表支持拖拽多个变量,但如果你在右击之后发现 Search 出来的路径不对,可以手动输入完整路径。常用的格式是:
<任务名>.<程序名>.<变量名>如果你的变量在全局变量列表里,路径就是:
GVL.<变量名>比如我习惯在 GVL 里放一个全局启动标志,ScopeView 里直接填GVL.bStart就能访问到。对于 NC 轴相关的变量,ScopeView 里通常有专门的通道树,你直接展开 Motion 相关节点就能看到各个 NC Axis 对象的内部信号,不需要自己去记路径。
分组管理是个容易被忽略的功能。如果一次录波要同时看 5 个通道以上,建议在通道列表中按功能给通道分组,比如“位置相关”“速度相关”“IO 状态”。ScopeView 的分组功能在通道属性里可以设置颜色和线型,同组通道用同一色系,曲线多的时候不会看花眼。现场排查时,不同轴的报警信号如果颜色都一样,很容易出现误判。
2.3 实际选择流程演示
我以实际调试一台 EtherCAT 伺服轴为例,演示一下完整的变量接入过程:
- 先确认 PLC 已处于 Run 模式,EtherCAT 通讯正常。
- 打开 ScopeView,新建一个 Scope 视图。
- 在通道列表区域右键,选择 Add Channel,在弹出的窗口里选择 Target Browser。
- 展开当前激活的 Twincat 目标,找到
Motion节点,展开NC-Task 1 SAF下的轴实例。 - 选择想要观测的信号,例如
Position Feedback和Following Error,双击添加。 - 再从
Plc Task节点下找到 MAIN 里的用户变量,比如GVL.nCmdPos,双击添加。 - 调整显示范围,变量没有输出时可以先点击 Stop 停止实时采集,手动拖动时间轴预览。
这个过程中最常出问题的就是搜出来的路径带方括号。比如GVL.arrData[0],如果你在加通道时只写GVL.arrData,ScopeView 会忽略数组下标,导致所有数组元素共享一个路径,显示值也只有一个。解决办法是把完整的数组元素路径写上,或者干脆用循环把数组映射到一组标量变量里再录波。
3. 配置一个真正合用的录波方案
3.1 采样时间与时间基准的选择
ScopeView 最基础的两个参数是采样时间和时间窗宽度。采样时间默认跟着 PLC 任务周期走,比如你的 EtherCAT 任务周期是 250 微秒,ScopeView 默认就按 250 微秒采一个点。但这里有个细节:如果你要看的变量所在的程序运行在 1 毫秒任务里,而 ScopeView 挂的是 250 微秒任务,那么每个采样点之间的数值其实是重复的,因为程序本身每 4 个采样点才更新一次。
这种情况下合理的方式是显式设置采样周期,让 ScopeView 的采样周期与变量更新周期一致,或者干脆用超采样抓个十倍频率的信号。我在现场习惯把采样时间直接设为 EtherCAT 任务周期,这样能看到的任务内部特性的细节最多,代价是时间轴很短,只能录一小段时间的波形。如果只是验证工况是否正常,我会把采样时间放宽到 5 毫秒或者 10 毫秒,拉长观察窗口,先看整体趋势,再针对局部问题放大。
关于时间窗宽度,ScopeView 的默认宽度显示的是当前正在采集的数据窗口,所有历史数据在内存里会保留一段时间,但展示窗口有限。想要一次看足够长的曲线,需要设置合适的 Total Time 或者采样点数量。总体来说,时间窗宽度 = 采样周期 × 采样点数量,这个公式要时刻记住,才能灵活配置出适合不同场景的窗口。
3.2 触发条件让偶发故障现身
录偶发报警,没有触发条件基本等于大海捞针。ScopeView 的触发逻辑和示波器一样,可以设置通道满足某个条件后开始录波或者停止录波。我常用的做法是设置一个“预触发窗口”,让 ScopeView 在触发条件成立前就开始录制一段数据,这样报警发生前一两秒的变量波形也会被保存下来。
举例来说,轴在运行中偶发Following Error报警。我可以把Following Error作为触发通道,条件设为“上升沿超过 5000”或者“大于设定值”,预触发时间设为 2 秒,这样报警发生时 ScopeView 会把报警前 2 秒到报警后 0.5 秒的波形全部保留。回放这段波形,就能看到在报警前是不是有给定跳变、反馈丢脉冲、或者负载突然增大等前兆特征。
ScopeView 的 Trigger 条件支持等于、大于、小于、不等于、变化沿等多种形式。要注意的是,触发通道即使不在显示通道列表里,也能作为触发源使用。这意味着你可以偷偷拿一个看不见的内部系统变量作为触发条件,而界面上只显示你想看的曲线。
3.3 超采样:看见任务周期内信号的真实形状
倍福 Twincat 3 的 ScopeView 有一个很实用的功能是超采样(Oversampling),允许在一个任务周期内采集多个点。默认情况下,250 微秒的任务周期意味着每 250 微秒采一次信号,但如果某个信号的变化速度很快,比如编码器计数出现毛刺、电流环的输出振荡,250 微秒的采样间隔根本看不出问题细节。
启用超采样后,ScopeView 可以在一个 EtherCAT 周期内采样多次。比如你的任务周期是 250 微秒,你配置 10 倍超采样,实际上 ScopeView 的采样周期就变成了 25 微秒。当然这会给实时系统带来额外的负载和数据传输压力,所以并不建议无脑调高倍数。
我记得第一次调轴的时候碰到一个奇怪现象:Axis 的 Target Velocity 看起来是一条平滑的曲线,但 actual velocity 上叠加着非常明显的高频振荡。当时 ScopeView 默认采样周期是 1 毫秒,完全看不出振荡的来源。后来把超采样调到 4 倍,在 250 微秒任务上按 62.5 微秒周期采样,才发现振荡频率大概是 400 赫兹,和编码器分辨率以及速度环增益直接相关。这个信息如果没有超采样,几乎不可能从 ScopeView 里正常发现。
3.4 通道图表的显示与测量辅助
曲线显示出来之后,先用鼠标滚轮缩放时间轴、拖拽移动窗口,这些基本操作就不多说了。更有用的其实是 ScopeView 自带的测量功能,可以快速读取波形上某个点的值、两个光标之间的时间差和数值差。我把光标放在报警跳变的上升沿附近,能直接量出动作延迟了多少毫秒,这对分析程序中状态机切换耗时非常有用。
ScopeView 还支持在图表里叠加数字符号,但默认显示方式比较朴素。如果你想在博文截图或项目报告里使用这些波形,建议在显示设置里把背景改成白色,线宽调粗一点,坐标轴加上单位。现场调试的时候用深色主题看久了眼睛不累,但导出图片做报告时会发现深色背景打印出来一团黑,这个细节虽然小,但很影响效率。
4. 波形数据的保存、导出与二次分析
4.1 从 ScopeView 保存波形数据到文件
很多人在 ScopeView 里看完波形,点一下停止,然后截个图就完事了,这个习惯在面对复杂项目时不够用。截图只能保存视觉信息,不能保存原始采样数据,后续想重新缩放、滤波、对比数据都做不到。ScopeView 本身提供了保存采集数据的功能,数据会以二进制格式保存为 Scope 文件,下次打开时还能恢复成完整的波形视图。
保存操作的入口在菜单栏的 Scope 区域或者右键快捷菜单里,选择 Save Data As 或者 Export 导出到指定路径。这里要注意:ScopeView 的保存功能只保存当前已经采集到的内存数据,不是实时流式写入文件。也就是说如果你连续录了 30 分钟但内存窗口只保留最近 10 秒的数据,保存出来的文件可能也只有最后这 10 秒。要录长时间数据,更适合用 Twincat 的 Data Persistence 或者专用的数据记录方案,而不是 ScopeView。
4.2 CSV 导出与 Python/Excel 再处理
ScopeView 支持将波形数据导出为 CSV 文件,这个功能在需要对接其他分析工具时尤为关键。导出的 CSV 里每一列是一个通道,行是按时间排列的采样点。字段格式在导出时可以选择包含 Time 列,这一列的时间单位通常是秒,倍福的波形数据里一般不会用毫秒作为基准,拿到 CSV 后第一件事就是确认 Time 列的格式和采样周期是否匹配。
我在现场常用 Python 的pandas和matplotlib对 CSV 做二次分析,比如计算跟随误差的 RMS 值、FFT 分析速度波动频率、把多次测试的数据放在同一个图里对比。你不需要把所有分析都塞进 ScopeView,它的强项是采集和可视化,真正的数据处理交给 Python 或 Excel 反而更灵活。
另外要注意 CSV 导出的大小。采样时间短、通道多的情况下,CSV 文件会比较大,几十万行数据在 Excel 里直接打开会卡很久。建议导出时先在 ScopeView 里把时间窗口裁剪到需要的范围,或者用 Python 的read_csv(nrows=).读取前 N 行做快速观察。再加上一个多通道导出的注意事项:不同通道的采样点数不一致时,CSV 导出可能会以最大点数对齐,缺失值留空,这会影响后续处理,处理前要注意对齐。
4.3 把波形图和报警信息对应起来
一条有用的录波数据,不能只有波形本身,还要有对应的报警信息和上下文。我在实际项目里的做法是,在开始录波前先在 PLC 程序里加入一个“测试代号”变量,比如nTestID,每次测试前手动设置不同的编号。ScopeView 里把nTestID也作为通道加进去,这样导出的 CSV 自动记录了每次测试对应的工况。故障复盘时,按nTestID筛选数据,就能快速定位哪些波形对应哪些测试条件。
如果现场不方便在程序里加变量,也可以在报警发生后第一时间手动把 ScopeView 里的当前时间记录下来,再配合 TwinCAT System Manager 或 Event Logger 里的报警时间戳对齐分析。倍福的报警时间戳精度是微秒级的,ScopeView 的时间轴也是微秒级,两者基本可以对齐到同一时刻,这就够了。
5. 常见问题与排查技巧实录
5.1 变量列表里刷不出 PLC 变量
这个问题我见过不止一次,而且在 Twincat 3 的新版本里仍然会出现。现象是打开 ScopeView 的 Target Browser,能看到 NC 轴、Tasks 这些节点,但 PLC 程序里的变量节点是空的,或者搜索不到任何变量。
排查顺序从简单到复杂是:先确认 PLC 处于激活的 Run 模式;再确认你当前登录的用户有权限访问 PLC 的 Symbols;然后检查项目属性里是否启用了“Generate Symbols”选项,一般默认是开启,但如果你手动关闭了,ScopeView 就无法读取变量符号表。TwinCAT 3 里这个选项在 PLC 项目的属性 -> Symbols 选项卡里,勾选 Generate Symbols 后重新激活配置。
如果你的 PLC 变量很多,ScopeView 的 Search 框刷新很慢,这也是正常的。建议使用通配符搜索,比如输入*Actual*来过滤所有包含 Actual 的变量,效率高很多。
5.2 波形是平的或者数据不刷新
波形平直,最常见的两个原因:一是变量本身没有更新,二是 ScopeView 采样配置和变量更新频率不匹配。先用 Twincat 的 Online 监控确认变量有实时变化,如果变量确实在动但 ScopeView 里是平的,检查一下是不是采样周期设置得太长,比如信号变化周期是 1 毫秒,你配置 1 秒采一次点,那看起来当然是平的。
还有一个比较容易忽略的地方是 ScopeView 的 Start 按钮没有真正激活采集。注意 ScopeView 有 Single 和 Continuous 两种模式,如果你停留在 Single 模式,它只采一次就停了,除非手动再点一下 Start,否则即使波形窗口里看着有数据,那也是上一次采集的静态结果,不会继续刷新。日常使用建议保持 Continuous 模式,只在想要冻结波形时点击 Stop。
5.3 AX5000 报警排查时的 ScopeView 配合用法
AX5000 伺服驱动器报警时,许多人会直接去查报警代码手册。但报警代码只能告诉你故障类型,不能告诉你为什么触发。比如Following Error报警,原因可能是参数增益问题、机械负载突变、编码器干扰,或者 EtherCAT 通讯延迟波动。这时候 ScopeView 配合其他窗口一起看,能快速锁定方向。
我通常会在现场配置一组固定通道用于所有 AX5000 类报警排查:NC 轴的速度反馈、位置反馈、控制字、状态字,以及 EtherCAT 诊断状态字。把这些通道放到 ScopeView 里,即使当前没有报警,也让它持续后台采集。报警一发生,按停止,立刻看波形里有没有异常突变。多数时候能直接看到是给定端问题还是反馈端问题。
5.4 Hyper-V 或虚拟化环境下的 ScopeView 问题
倍福 Twincat 3 对实时性要求苛刻,在虚拟机里跑 Twincat 3 本身就有很多限制。很多人在 Win11 上遇到 Twincat 无法进入 Run 模式,错误码 0x1024 指向 Hyper-V 冲突,这在虚拟机里特别常见。ScopeView 在这种环境下也会出现数据刷新卡顿、时间轴不精确等现象。
如果你一定要在虚拟机上临时调试 ScopeView,请注意:实时任务的抖动会直接反映在采样时间戳上,波形的时间轴可能不均匀,曲线会看起来失真。这不一定是你程序的问题,而是宿主机的虚拟化调度造成的。排查确认的方法是在物理机上复现同样的测试,如果波形恢复了正常,问题基本就锁定在虚拟化环境上。生产调试最好在物理机或专用于实时控制的工控机上进行,这是倍福长期使用的基本原则。
5.5 录波时间不够长和波形锯齿问题
有人想录一个工序的完整运行过程,但 ScopeView 展示了很短的时间窗,不够用。这里需要区分两个概念:显示窗口的数据量限制和内存缓存的数据量限制。默认配置下,ScopeView 会保存最近的一段时间,超过缓存范围的数据会被淘汰。想录更长时间,要么增大缓存区、降低采样率,要么在启动录波后及时把导出或保存从内存中落盘。如果你需要录很长的数据且对精度有要求,建议从一开始就选用专业的数据采集方案,ScopeView 并不是处理这种任务的最终工具。
波形锯齿又是另一个场景:你可能在 ScopeView 上看到一条实际是平滑正弦波的指令信号,但因为采样率不够,看起来是一节一节的台阶。这时如果你一味增加采样率,锯齿可能会减轻,但对任务负载的影响也随之增加。我更推荐先调整显示的时间轴缩放和插值方式,确认锯齿到底是采样率不够,还是本身就是离散输出。如果是 NC 轴的速度给定,本身就是一个周期更新一次的信号,显示成台阶是完全正常的,用连续任务或者更高频率的轴控制模式才能让物理输出更平滑,而不是靠录波工具去模拟平滑。
5.6 一个典型的完整调试流程复盘
最后我复盘一个我处理过的实际案例,帮大家把整个流程串起来。某台设备使用的是倍福 AX5000 驱动一个旋转台,现场反馈旋转过程中偶尔会有一下“咔哒”声,不规律,一天可能发生两三次。
排查思路是:先确认“咔哒”声是不是位置命令突变导致的机械冲击。我在 ScopeView 里加了速度反馈、目标速度、Following Error、当前报警代码四个通道,首次尝试捕捉。考虑到偶发性,我把触发条件设为 Following Error 上升沿超过 8000,预触发时间设为 3 秒。因为默认 250 微秒采样周期对于捕捉这种事件足够,我没有开超采样,保证系统负载最低。
等了几个小时,ScopeView 成功捕捉到触发事件。回放波形后发现,在报警发生前约 1.8 秒,目标速度没有变化,但速度反馈上出现了一个约 10 毫秒的窄脉冲,幅度是正常工作速度的 1.5 倍左右,紧接着 Following Error 才开始升高。这个顺序说明问题可能出在编码器反馈端,而不是给定端。
接着我用 CSV 导出了这一段数据,在 Python 里做了简单的 FFT,发现窄脉冲里有个 2.5 kHz 左右的频率成分,这正好和电机极对数谐波接近,怀疑是反馈信号受到了干扰。对现场布线检查后,确认编码器电缆和动力电缆有一段并排走线,分离之后“咔哒”声消失,问题解决。
这个案例里,如果只靠报警文本,我只能看到 Following Error 超限的结果,看不到脉冲先于报警出现这个关键细节。ScopeView 加触发配置,加上正确的变量选择,才是能定位到这个根因的真正原因。
6. 录波完的经验总结
ScopeView 作为一个随 Twincat 3 附带的内置工具,能做出这么多应用场景,很大程度得益于倍福开放了足够深层的变量访问能力和实时数据接口。但工具再好用,也得有足够的耐心去理解它背后的数据链路才能发挥价值。变量从 PLC 的实时上下文到 ScopeView 的波形显示,中间经过的环节不少,任何一个环节出错,波形都有可能失真或者缺失。工程调试这件事,最怕的就是拿着假数据做了一堆分析,最后得出一个错误结论。
如果非要说一个最想让读者记住的点,那就是:录波之前先想清楚你要解决什么问题,再根据问题选择采样周期、触发条件、变量通道,不要一上来就把所有变量拉进来。ScopeView 的优势是快速、灵活、与 Twincat 生态无缝集成,但它在长时间记录、多通道高并发采样等场景下有天然的瓶颈,懂得在什么场景下用它,什么时候换用其他工具,这才是一个自动化工程师真正成熟的表现。