Stunner API 19 个命令:分类、流程、细节

系列指南 · 第 4 篇

Stunner API 19 个命令:分类、流程、细节

Stunner Client 一侧配置完成之后,仪器就准备好被外部脚本调用了。这里说的"脚本",是工作站或调度系统上的一段小程序(常用 C#、Python 或 LabVIEW 写)。它通过加载 Stunner.dll 这个文件,把 19 个 API 命令一条一条发给 Stunner。整套 API 按职责分成四组。写脚本时,先掌握一次完整测量的常规顺序,再留意几处容易写错的细节。

先认识几个名词

19 个命令分四类

写脚本时,会话控制的命令只在开头和结尾调用,Get_Status 贯穿全程,按板循环的是测量动作这组。

同步与异步:两种返回行为

19 个命令里,18 个是同步的,只有 Measure 一个是异步的。两者返回的时机不同,分清这一点是写 Stunner 脚本的第一件事。

18 条

同步命令

命令发出去后,函数会一直等,直到仪器真的把动作做完才返回。比如 Open_Tray() 返回的那一刻,托盘已经物理上打开了。脚本下一行可以放心继续往后走。

仅 1 条

异步命令:Measure

函数返回只表示"测量已经成功启动"。实际测量在仪器那边继续跑,可能持续几分钟到两小时多。只测浓度一板约 12 分钟,加 DLS 一板约 1 小时,加 RADLS 一板约 2 小时多。

为什么 Measure 要做成异步:测一板 RADLS 要两个多小时。如果 Measure 跟其他命令一样同步等待,脚本会被这一条命令卡住,中间什么都做不了。改成异步之后,脚本可以在仪器测量期间做别的事。比如让机械臂搬下一块板、清洗液体工作站、把上一板的结果传给 LIMS。轮询频率一般定在 1–2 秒一次:更快只是多占网络;更慢则机械臂要在仪器旁边空等,整批样品的处理时间会被拉长。

一次完整测量的命令顺序

把命令拼起来,一块板从开始到结束的最小可用脚本是下面这 13 步。左边是脚本侧发出的 API 命令,右边是同一时刻仪器或工作站在做的物理动作。

步 / 脚本侧(API 命令) / 仪器 / 工作台

这是单板的最小可用顺序。多板实验里,第 8 步测量完成后,用第 9–11 步开托盘、换板、关托盘,再回到第 7 步 Measure 下一块。Define_Experiment 只在第 3 步发一次。一次定义里可以包含多块板,返回的 plate_IDs 数组按顺序列出每块板的 ID,后续 Measure 挨个传入即可。Get_Results 留到所有板都测完再调一次,一次取走所有结果。

命令一览

19 个命令按分组列在下面,便于写脚本时对照。每个命令完整的入参定义、返回字段说明,在 Stunner API Manual §4.2 里都有;这里只列签名和一句话职责。

### 如何看签名

- string = 字符串、int = 整数、bool = 真/假、string[] = 一组字符串(数组)

- out 标记的参数是"输出参数"。命令执行完之后,Stunner 把这个值塞回脚本里。它是返回的状态码之外的额外数据

- 例:Read_Bar_Code(out string bar_code) 意思是"调用这条命令,Stunner 会把条码字符串塞进 bar_code 变量"

命令:职责

会话控制(3 条)

Stunner(string address, int port):建立 TCP 连接对象。地址用仪器 IP,端口固定 6300。

Request_Access():申请独占访问权。别的脚本已占用或 License 没激活时会被拒。

Release_Access():释放访问权,让出仪器。脚本结束或出错前都应该走一次。

仪器信息(3 条)

Get_Instrument_Serial_Number():读仪器序列号。开机自检时用,确认连的是预期那台。

Get_Software_Version():读仪器软件版本,确认和 PC 上的应用版本对得上。

Get_Status(out string measurement_info) 或 Get_Status():查当前状态,任何时候都可以发。测量进行中,有 measurement_info 输出参数的重载会带回额外信息。

测量动作(7 条)

Open_Tray():打开托盘。返回时托盘已物理打开。

Close_Tray():关闭托盘。返回时托盘已物理关闭。

Read_Bar_Code(out string bar_code) 或 Read_Bar_Code(out string bar_code, out bool valid, out string plate_type):读已经放进托盘的 Stunner Plate 上的条码。重载版本可同时返回是否有效和板型。

Define_Experiment(string experimentDefinition, string sampleDefinition, out string[] plate_IDs):把实验定义、样品定义两段字符串发给仪器;返回一份 plate_ID 数组,后面 Measure 要用。

Measure(string Plate_ID):异步:命令立刻返回,实际测量要靠 Get_Status 轮询确认。Plate_ID 传 "autodetect" 可让仪器先扫条码,再决定测哪块板。

Abort_Measurement():强行中断正在进行的测量。一般只在出错或上层调度取消时用。

Get_Results(string results_parameters, string plate_ID, out string results, out string experiment_path, out string AniML_types):取结果文本字符串,同时把 .bin 原始数据写到共享目录。要等所有板测完才能调用,提前调用会返回错误;plate_ID 留空返回所有板,填某块板的 ID 只返回该板。

辅助命令(6 条)

Pause():暂停当前所有动作,直到收到 Do_Continue。

Do_Continue():从暂停状态恢复测量。

Reset():把仪器从 error 状态拉回正常。一般作为出错处理的最后一招。

Store_Blanks() 或 Store_Blanks(string file_name):把刚跑完的或共享目录里某一板的空白存到仪器本地。整文件覆盖,旧空白会被删掉。

Get_Stored_Blanks():列出当前仪器上存了哪些空白:Plate type、sample group 名、剩余有效天数。

GetLastInternalError():取 DLL 内部最近一次错误的详细文字描述。仅在前一次返回 −200/−201/−202 这三个 DLL 内部错误码后才有内容。

几处容易写错的细节

写 Stunner 脚本时,下面 6 处最容易出错。

出错了怎么定位

API 报错的时候,Stunner 不会自己跳出错误提示,因为仪器没法在脚本 PC 上显示任何东西。所有出错信息都打包成一个整数(就是前面说的状态码),随命令的返回值传回脚本。脚本拿到这个数字之后,自己判断怎么处理。定位故障主要靠下面两种手段。

1

查每条命令的整数状态码

每个命令调用之后都返回一个状态码。约定如下:

完整状态码表在 Stunner API Manual Appendix 2。

2

−200 / −201 / −202 时,加一次 GetLastInternalError

当状态码是 −200、−201 或 −202 时,说明问题出在 Stunner.dll 那一层(通常是连接、超时或参数解析的问题)。这时可以立刻调一次 GetLastInternalError(),拿到一段更详细的文字描述。其它状态码下这个函数不会返回内容,所以只在这三个码后面加就行,不必每条命令都调。

### 推荐的统一封装

生产脚本里,建议统一封装一层"返回码 → 动作"的映射函数,把动作收敛成几种:

- · 返回 0 继续

- · 正数继续

- · 特定负数重试

- · 其它负数报警停产线

- · 严重错误走一次 Reset

这样返回码集中映射,日志也集中记录,比每条命令各自写 try/catch 更容易找到根因。