
简介这份资源是泰克TSP Toolkit的官方快速入门指南面向从事电子测试与测量领域的工程师、技术人员及开发者尤其适合已熟悉VS Code环境、希望借助TSP脚本实现仪器自动化控制的用户。内容围绕在Visual Studio Code中安装并配置TSP Toolkit扩展展开涵盖工作区搭建、仪器连接、项目配置、.tsp脚本的运行与调试、终端使用、自动化脚本生成beta以及示例脚本下载等环节并支持语法检测、代码补全、代码导航与悬停帮助等语言特性可帮助读者在TSP兼容仪器上高效编写和执行测试脚本借助调试功能排查问题并通过自动生成功能快速构建IV测试等常用流程。资源包为1个PDF文件大小约1.55MB即官方Quick Start Guide文档结构清晰、步骤完整。目前已有260人学习适合作为TSP脚本开发与仪器编程调试的入门参考结合GitHub示例脚本可加速实际项目开发。1. 从手动旋钮到 TSP 脚本为什么我劝你先装好 VS Code如果你还在用示波器前面板一个个按旋钮、拿 U 盘拷波形截图那这套基于 Visual Studio Code 的 TSP 脚本开发工具包值得你花一个下午搭起来。TSP 全称 Tektronix Scripting Processor是泰克仪器内部的一套脚本引擎跑在示波器、源表、SMU 这些设备的固件里。它把仪器操作从「人肉点按钮」变成「代码调函数」而 VS Code 就是写这些代码最顺手的编辑器。热搜里「visual studio code 怎么合并代码」「visual studio code 安装教程」说明很多人卡在第一步——编辑器都没配好更别提连仪器了。这篇笔记按「装环境 → 连设备 → 写脚本 → 调参数 → 避坑」的顺序走一遍适合刚接触 Tektronix 仪器编程的测试工程师也适合想把产线手动测试改成自动化脚本的老手。读完你能在本地跑通第一个 TSP 脚本知道哪些参数必须改、哪些坑一定会踩。2. 环境搭建VS Code 装完先别急着写代码2.1 为什么选 VS Code 而不是仪器自带 IDETektronix 仪器通常自带一个叫 KickStart 的上位机软件能看波形、做简单测量但它不是写脚本的地方。真正写 TSP 脚本常见做法是用 VS Code 配合官方插件。原因有三第一VS Code 的语法高亮和括号匹配对 Lua 风格的 TSP 语法支持好TSP 本质上是 Lua 的变体用普通文本编辑器写很容易漏end第二VS Code 的终端可以直接跑 socket 通信脚本不用来回切窗口第三插件市场里有 Tektronix 官方维护的 TSP 扩展能补全smu.measure、dmm.measure这类常用 API。安装 VS Code 本身没什么好说的官网下载对应系统版本一路下一步。但装完之后有两件事必须做一是把 VS Code 加到系统 PATH这样在终端里敲code .能直接打开当前目录二是关掉自动更新产线机器上版本跳变会导致插件不兼容。我一般会在设置里把update.mode改成manual血泪经验——有一次自动更新后 TSP 插件直接报错查了半天才发现是 VS Code 主版本号变了。2.2 TSP 插件安装与 Lua 环境配置打开 VS Code按CtrlShiftX进扩展面板搜Tektronix TSP。如果搜不到可能是网络问题可以离线下载 vsix 包再手动安装。装完之后VS Code 右下角会显示当前识别的 TSP 版本。这里有个细节插件本身不带 Lua 解释器它只做语法分析和代码片段补全。真正执行脚本还是在仪器端或者用 Tektronix 提供的TSP Toolkit命令行工具在 PC 端模拟执行。如果你要在 PC 上做语法检查需要单独装 Lua 5.3。Windows 下推荐用 LuaBinaries 的预编译包解压后把lua.exe所在目录加到 PATH。验证方法很简单lua -v # 输出类似 Lua 5.3.6 Copyright (C) 1994-2020 Lua.org, PUC-Rio逻辑说明这一步是为了让 VS Code 的终端能调用lua命令做静态检查。参数说明-v是 version 的缩写只输出版本号。注意 Lua 5.3 和 5.4 在整数除法上有差异TSP 固件大多基于 5.3所以别装 5.4。2.3 连接仪器的三种方式与选型TSP 脚本要跑在仪器上PC 和仪器之间必须有物理链路。常见三种USB-TMC、LANVXI-11 或 raw socket、GPIB-USB 转接。产线环境我优先推 LAN因为可以多台仪器组网脚本里直接写 IP 就行。USB 适合单台调试即插即用但线缆容易松。GPIB 是老设备才用新仪器基本都带 LAN 口。以 LAN 为例仪器端需要先设好静态 IP比如192.168.1.100子网掩码255.255.255.0。PC 端设同网段比如192.168.1.10。然后在 VS Code 里新建一个.tsp文件写第一段连接代码-- 创建 TCP 连接端口 5025 是 Tektronix 仪器的 raw socket 默认端口 local sock socket.connect(192.168.1.100, 5025) -- 设置超时 5 秒避免仪器没响应时脚本卡死 sock:settimeout(5) -- 发送身份查询命令*IDN? 是 SCPI 标准命令 sock:send(*IDN?\n) -- 读取返回仪器会回传型号、序列号、固件版本 local idn sock:receive() print(idn) -- 用完关闭连接释放资源 sock:close()逻辑说明这段代码做了四件事——连仪器、设超时、发查询、读返回。参数说明5025是 Tektronix 常用端口如果连不上先确认仪器端 socket 服务是否开启settimeout(5)的单位是秒产线环境建议设 3 到 5 秒太短会误判太长会拖慢测试节拍。*IDN?后面的\n是命令结束符TSP 和 SCPI 都要求换行结尾漏了仪器不会回。3. 第一个 TSP 脚本从点亮屏幕到读回数据3.1 TSP 脚本的基本结构TSP 脚本不是从头到尾顺序执行的批处理它更像一个常驻在仪器里的服务。你写好的脚本通过loadscript加载到仪器然后调用run()启动。脚本内部可以定义函数、创建变量、注册回调。一个最小可用的 TSP 脚本长这样-- 定义一个测量函数读取通道 1 的电压 function measure_voltage() -- 设置测量功能为直流电压 smu.measure.func smu.FUNC_DC_VOLTAGE -- 设置量程为自动 smu.measure.range 0 -- 触发一次测量并返回结果 local reading smu.measure.read() return reading end -- 主入口仪器加载脚本后自动执行 function main() local v measure_voltage() -- 把结果打印到仪器前面板 display.settext(V .. v) end -- 注册主函数 main()逻辑说明smu是源测量单元的对象不同仪器型号对象名可能不同示波器用scope万用表用dmm。参数说明smu.measure.range 0表示自动量程如果设成具体数值比如10就是 10V 固定量程固定量程测小信号精度更高但可能超量程。display.settext是往仪器屏幕写字符串调试时很有用但产线脚本里别频繁调用会拖慢执行。3.2 用 VS Code 调试 TSP 的两种模式调试分在线和离线。在线模式是脚本直接跑在仪器上VS Code 通过 socket 发命令、收返回。离线模式是在 PC 上用 Lua 模拟器跑只验证语法和逻辑不连仪器。我一般先离线跑通再上线联调。在线调试时VS Code 的终端里可以用nc或telnet手动发命令确认仪器响应正常# 用 netcat 连仪器手动发身份查询 echo *IDN? | nc 192.168.1.100 5025 # 正常会返回类似 TEKTRONIX,MSO54,1234567,1.0.0逻辑说明这一步是排除网络问题。如果nc都连不上VS Code 里写再多代码也没用。参数说明nc后面跟 IP 和端口echo的内容会原样发给仪器。注意有些系统自带的是ncat而不是nc命令名不同但用法一样。离线调试则是在 PC 上装lua后直接跑lua -e dofile(test.tsp)逻辑说明dofile会执行指定文件如果脚本里有语法错误会直接报行号。参数说明-e表示执行后面的字符串适合快速验证一小段代码。注意离线模式下smu、display这些对象不存在需要自己写桩函数模拟否则会报 nil 错误。3.3 脚本加载与执行的完整流程从写完脚本到仪器真正跑起来中间有四步保存文件、建立连接、加载脚本、触发执行。很多人卡在第三步因为 TSP 的loadscript命令需要把整个脚本内容作为字符串传过去而不是传文件路径。-- 读取本地脚本文件内容 local f io.open(my_test.tsp, r) local script_content f:read(*a) f:close() -- 建立连接 local sock socket.connect(192.168.1.100, 5025) sock:settimeout(10) -- 发送 loadscript 命令脚本内容放在双引号里 -- 注意转义脚本里的双引号要写成 \ sock:send(loadscript my_test_script [[ .. script_content .. ]]\n) local resp sock:receive() print(load response: .. resp) -- 执行脚本 sock:send(my_test_script()\n) local result sock:receive() print(exec result: .. result) sock:close()逻辑说明loadscript后面跟脚本名等号后面用双方括号[[ ]]包裹脚本内容这是 Lua 的长字符串语法能避免转义问题。参数说明sock:settimeout(10)加载大脚本时超时要设长一点10 秒比较稳妥。my_test_script()是调用脚本里定义的主函数函数名要和 loadscript 时起的名字一致。4. 参数怎么设TSP 脚本里最容易翻车的五个配置4.1 测量速度与精度的权衡TSP 脚本里有个smu.measure.nplc参数全称 Number of Power Line Cycles意思是每次测量积分多少个工频周期。设 1 表示积分 20ms50Hz 电网设 0.01 表示积分 0.2ms。NPLC 越大读数越稳但速度越慢。产线测 1000 个点NPLC 设 1 要 20 秒设 0.01 只要 0.2 秒但噪声可能大 10 倍。我一般这样选测直流电压、电流这种慢变量NPLC 设 1测脉冲或快速扫描设 0.01 到 0.1。如果读数跳动超过允差先别怀疑仪器坏把 NPLC 调大一档再看。-- 高精度模式适合校准 smu.measure.nplc 1 -- 高速模式适合产线快速筛查 -- smu.measure.nplc 0.01逻辑说明NPLC 直接决定 ADC 的积分时间是精度和速度的总开关。参数说明0.01 到 10 之间连续可调但实际常用就 0.01、0.1、1、10 四档。注意有些老型号固件不支持小于 0.1 的值设了会报错。4.2 触发源与触发边沿TSP 脚本可以等外部触发再测量比如等产线夹具给一个上升沿。触发源常见有smu.TRIG_BUS总线触发、smu.TRIG_EXT外部触发、smu.TRIG_TIMER定时触发。触发边沿分上升沿和下降沿。-- 设置触发源为外部触发 smu.trigger.source smu.TRIG_EXT -- 设置上升沿触发 smu.trigger.edge smu.EDGE_RISING -- 设置触发延时 0 秒 smu.trigger.delay 0 -- 使能触发 smu.trigger.enable 1逻辑说明这四行配好之后仪器不会立刻测量而是等外部信号。参数说明delay是触发到测量的等待时间设 0 表示立即测如果夹具动作有抖动可以设 0.001 到 0.01 秒避开。enable 1是总开关忘了设这个是最常见的「脚本跑了但没数据」原因。4.3 数据缓冲与读取方式连续测量时数据存在仪器内部缓冲里脚本要定期读走否则缓冲满了会覆盖旧数据。缓冲大小用smu.measure.userbuffer设置读取用smu.measure.readbuffered()。-- 设置缓冲 1000 个点 smu.measure.userbuffer 1000 -- 启动连续测量 smu.measure.start() -- 等 10 秒让数据攒够 delay(10) -- 读走缓冲里所有数据 local data smu.measure.readbuffered() for i 1, #data do print(data[i]) end逻辑说明userbuffer是环形缓冲写满后新数据覆盖最旧的。参数说明delay(10)是 TSP 内置延时函数单位秒。readbuffered()返回一个数组#data取长度。注意读完之后缓冲不会自动清空下次读会重复需要手动smu.measure.clear()。4.4 超时与重试机制仪器通信偶尔会丢包脚本里必须设超时和重试。TSP 的 socket 超时前面提过但仪器内部操作也有超时比如等待触发。-- 设置测量超时 5 秒 smu.measure.timeout 5 -- 重试 3 次 local retry 3 local reading nil while retry 0 do reading smu.measure.read() if reading then break end retry retry - 1 delay(0.1) end if not reading then print(measure failed after retries) end逻辑说明timeout是单次测量最长等待时间超了返回 nil。参数说明重试间隔delay(0.1)别设太小给仪器一点恢复时间。注意smu.measure.read()返回 nil 不一定是超时也可能是量程不对导致溢出先查量程再查超时。4.5 脚本版本与固件兼容性TSP 语法在不同固件版本间有差异。比如smu.measure.readbuffered()在旧固件里叫smu.measure.readbuffer()少个 ed。脚本在 A 仪器跑通换 B 仪器就报错多半是固件版本不同。-- 先查固件版本 local ver smu.version print(firmware: .. ver) -- 根据版本走不同分支 if string.find(ver, 1.0) then -- 旧版 API data smu.measure.readbuffer() else -- 新版 API data smu.measure.readbuffered() end逻辑说明smu.version返回固件版本字符串用string.find做模糊匹配。参数说明版本号格式各型号不同有的带日期有的带 build 号匹配时用主版本号就行。注意别硬编码版本判断最好用pcall包一层哪个 API 能调用就用哪个。5. 避坑与排查TSP 脚本开发中五个高频翻车现场5.1 现象脚本加载成功但执行无反应原因loadscript只是把脚本存到仪器内存不会自动执行。很多人以为加载完就跑了其实还要显式调用函数名。另外如果脚本里没有定义全局函数或者函数名拼错调用时会静默失败。解决加载后先发print(_G)看全局表里有没有你的函数名。没有就检查function定义是不是写成了local function局部函数外部调不到。调用时函数名后面要加()漏了括号只是引用不执行。5.2 现象读数一直是 0 或满量程原因量程设错。自动量程在信号很小时可能切到最小档但如果有偏置电压读数会溢出。或者测量功能没设对比如要测电流却设了电压功能。解决先手动设一个中间量程比如测 5V 设 10V 档看读数是否正常。正常了再切自动量程。功能设置用smu.measure.func smu.FUNC_DC_CURRENT明确指定别依赖默认值。5.3 现象脚本跑一半卡死终端无返回原因socket 超时设太长或者仪器端在处理长命令时阻塞。TSP 是单线程的一个长循环会占住仪器外部命令进不去。解决把长循环拆成多次短循环中间加delay(0)让出时间片。socket 超时设 3 到 5 秒超时后主动sock:close()再重连。别在脚本里写while true do end这种死循环。5.4 现象多台仪器组网时互相干扰原因所有仪器用同一个端口 5025PC 端脚本如果没区分 IP命令会发错设备。或者仪器 IP 冲突两台设了同一个地址。解决每台仪器分配唯一 IP脚本里把 IP 和仪器型号绑定成配置表。发命令前先*IDN?确认身份不对就报错退出。产线环境建议用交换机划分 VLAN避免广播风暴。5.5 现象VS Code 插件提示语法错误但脚本能跑原因插件用的 Lua 版本和仪器固件不一致。插件可能按 Lua 5.4 检查仪器跑的是 5.3整数除法//在 5.3 里不支持。解决在 VS Code 设置里把tektronix.tsp.luaVersion改成5.3。如果插件没这个选项就在项目根目录放一个.luarc.json写{runtime.version: Lua 5.3}。别为了消错误改代码改了反而在仪器上跑不了。6. 进阶技巧用 VS Code 任务系统一键部署 TSP 脚本写到这儿环境、脚本、参数、坑都过了一遍。最后分享一个我每天都在用的技巧把 VS Code 的 tasks.json 配好按CtrlShiftB就能一键把当前脚本部署到仪器并执行省去手动敲 socket 命令的麻烦。在项目根目录建.vscode/tasks.json{ version: 2.0.0, tasks: [ { label: Deploy TSP to Instrument, type: shell, command: python, args: [ ${workspaceFolder}/deploy.py, --file, ${file}, --ip, 192.168.1.100 ], group: { kind: build, isDefault: true }, problemMatcher: [] } ] }逻辑说明这个任务调用一个 Python 脚本deploy.py把当前打开的.tsp文件路径和仪器 IP 传过去。参数说明${file}是 VS Code 内置变量表示当前编辑的文件${workspaceFolder}是项目根目录。group里设isDefault: true之后CtrlShiftB直接触发这个任务。deploy.py的核心逻辑import socket import argparse parser argparse.ArgumentParser() parser.add_argument(--file, requiredTrue) parser.add_argument(--ip, requiredTrue) args parser.parse_args() with open(args.file, r, encodingutf-8) as f: script f.read() s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5) s.connect((args.ip, 5025)) # 加载脚本 cmd floadscript autotest [[{script}]]\n s.sendall(cmd.encode()) print(s.recv(4096).decode()) # 执行脚本 s.sendall(bautotest()\n) print(s.recv(4096).decode()) s.close()逻辑说明Python 的 socket 比 Lua 的更稳异常处理也方便。参数说明settimeout(5)和 Lua 版一致recv(4096)一次读 4KB够放大多数返回。注意脚本内容里如果有]]会提前结束长字符串部署前先检查一下有的话换成[[ ]]。这个流程我用了两年最大的好处是改一行代码按一下快捷键就能看结果不用来回切终端。唯一要注意的是仪器 IP 别写死在 tasks.json 里我一般用环境变量TEK_IP换产线时改环境变量就行不用动配置文件。希望帮到你。本文还有配套的精品资源点击获取