一种通过网络协议给LabNirs打Trigger的解决方案

在被岛津(SHIMADZU LABNIRS)原来那个折磨人的并口 Trigger 方案折磨的死去活来实在受不了之后(比如你很难找到有并口卡的设备,再比如这玩意对静电极为敏感,内部静电积累起来之后 Trigger 就会打不上之类的),我决定写一个通过牺牲一定时间精度但是能够极大提高可用性的 Trigger 方案:ezNirsTrigger。

概览

在LabNirs的控制程序上有一个可以手动打Trigger的按钮,我们通过TCP协议监听远端服务器发来的信号,如果有信号传入则立刻模拟点击此按钮。这一工作借由一段AHK脚本完成。

ezNirsTrigger工具不仅可以被视作是应对故障的紧急措施,在你的实验机器没有并口卡或并口卡故障的时候、或你擅长的编程语言无法方便的通过并口发送信号的时候,都可以考虑使用这一方案解决问题。

与传统方案的比较

架构设计

LabNirs的解决方案由两台设备组成,其中一台是我们平时在操作的有显示器的设备(在这里我们称作 Panel PC,它由 Windows 7 操作系统驱动),另外一台是藏在机器里面负责调度硬件的(这台设备被称作 Control PC,它由 Windows XP 驱动),这两台设备之间通过Socket协议进行通信,如果你通过并口将Trigger数据发送至设备,实际上这一数据会先被发送到 Control PC 中,之后再传到 Panel PC 上,而 ezNirsLab 的方案直接将实验机器与 Panel PC连接在了一起。

这两种架构并没有孰优孰劣,如果设备品质没有太大问题,传输延迟的差异在 1ms 以下,对于 fNIRS 这种时间分辨率不敏感的设备来讲,这一差异是可以被忽略的。

架构设计的比较

硬件要求

LabNirs 的解决方案要求你的实验设备必须配备并口卡这一远古级设备,并且,很多软件包是不支持 USB 转 Parallel 这种操作的,所以如果想要保证在大多数情况下你的实验程序可用,则你所在的课题组必须配备一个带有 PCI-Parallel 的计算机。

ezNirsTrigger 对实验设备没有特殊要求,只要能接网线就行,但是你需要在 LabNirs 的 Panel PC 上外挂一个 USB 的网卡,为该网卡安装驱动程序并为此网卡正确配置IP地址,这对技术人员的知识水平有一定要求。另外由于 Panel PC 和 Control PC 之间本身就是通过网卡通信的,因此 Panel PC 上本身就有一个网卡,如果技术人员误操作修改了这一内置网卡的配置,则将会让整个 LabNirs 系统无法正常工作。

操作体验

作为一个外挂程序,ezNirsLab的操作过程和数据处理流程要比一站式的控制面板复杂的多。在调通信号整个设备处于 Stand By 状态后,你需要额外打开 ezNirsLab 将其与实验程序连接。在实验执行完毕后,如果你需要保存 Trigger 所携带的具体信息,那么还需要额外的对数据进行导出工作。

在数据处理时,由于 NirsLab 和 ezNirsTrigger 的数据是分开的两个文件,所以我们需要做一些额外的工作来讲两套数据合并在一起。

我们意识到了这些问题,并且在考虑解决方案以简化操作流程,但是就目前来只能以一种相对麻烦的方法来处理这些问题了。

稳定性

LabNirs 的并口容易连不上,ezNirsTrigger 则会在小概率情况下无法成功触发 Trigger。你可以通过导出数据所携带的时间数据估测 Trigger 触发的时间,但是这一估计准确性并不足够高。

操作

将 ezNirsLab 安装在 LabNirs 设备上,并依照如下说明进行配置。

连接配置

  • 点击主界面的「Server Config」打开服务器设置界面,「Server address」为实验设备地址,「Server port」为 Socket 服务器的端口。
  • 点击「Test Connection」测试服务器连接可用性,此时 ezNirsLab 会向 Socket 服务端发送一个字符串 TEST 并主动断开连接。

锁定窗口

ezNirsLab 需要首先知道要在哪一个窗口上进行操作,如果 LabNirs 的控制程序在 ezNirsTrigger 打开之前就已经启动,那么 ezNirsTrigger 会自动找到它,否则您需要手动点击 「Find Window」 按钮寻找该窗口。找到 LabNirs 控制程序窗口的标志是 Id 一项右侧会变成一串表示窗口编号的文本而不是一条短横线 -

发送信号

在您成功将 ezNirsTrigger 与实验程序连接后,可以通过发送字符串的方式来执行对应的操作。每一条字符串被称作一个命令,每个命令结尾必须包含一个 \r\n, ezNirsTrigger以此作为分割不同命令的依据。下面是命令表:

命令 说明
ST 开始采集数据
EN 停止采集数据
CL 清空LabNirs面板上的波形
ZR 将当前时间点的含氧、脱氧与加和数据视作0点
DR Drift Reset
LK 将 ezNirsTrigger 置于屏幕顶端并激活 LabNirs 控制面板
UL 解除 ezNirsTrigger 的置顶状态
EX 导出数据
RC 保留
ER 保留
LT 保留
PING 保留
—- 其他任何信号都会被视作一般的标记信号,可用作标记事件

  • CL命令不会删除任何数据;
  • 我们建议您在开始实验前发送 LK 信号以提高时间准确性,在实验完成后再发送 UL 信号解锁窗口;
  • 对于EX命令,如果在后面接上文件名,如果 EX hello 则会在 data 文件夹下创建 hello.csv,否则文件名为导出时的时间,如 17-11-21 20-03-20
  • Log选项卡当中 Delay 一列代表 ezNirsTrigger 执行该操作所花的时间,单位为毫秒,该时间不包含网络延迟,在锁定窗口的情况下(LK 命令)一般该时间为 0
  • 在执行实验时您不应操作鼠标或键盘,否则程序将无法正常运作。

ezNirsLab的界面一览

链接

Windows的内网配置方法

你需要首先为目标设备准备一枚USB网卡,将该网卡与实验设备连接(可以直接连接,这种连接方式被称作 Cross Cable,或者如果你的局域网中存在多个设备,则可以考虑使用交换机),之后依照如下操作清单配置fNIRS设备与实验机器:

  • 按组合键 Win+R 打开「运行」窗口,输入 ncpa.cpl 并敲回车进入网络连接设置界面;
  • 找到你的网卡对应的网络连接,通常是第二个;
  • 右键单击该图标,选择「属性」,打开网络属性菜单;
  • 找到 TCP/IPv4,选中它,并点击下面的属性按钮;
  • 输入你的局域网配置信息,并点击确认;
  • 如果任何一方计算机弹出选择网络类型的菜单,请选择工作网络以保证防火墙不会阻止此连接;
  • 按组合键 Win+R 打开「运行」窗口,输入 powershell 并敲回车进入命令行,输入 ping [your IP](如 ping 192.168.1.2 )检测是否组网成功。

配置IP地址的方法

注意事项

将实验用的局域网与机器用的局域网网段分开

  • 该局域网内全部设备的IP地址应保证前三段相同,最后一位不同;
  • 请将实验机器的网络IP的第三段设置为非 0 数字(如192.168.2.***),否则可能因为网段冲突无法成功的让 ezNirsLab 与你的实验程序互相通信。

不要修改机器自带网卡的设置

如前文所述,在插上外界USB网卡之后你的设备上将有两个网卡设备,一个是原先的一个是后加上去的,最简单的辨别方法是:机器自带网卡的品牌是 Intel,并且已经设置过IP。在我们实验室的这两台设备IP都是192.168.0.101

无法将网络设置为工作网络

  • 解决该问题最为粗暴的方法是把实验设备的操作系统重灌一下,并且杜绝安装任何带有系统优化功能的软件,比如「腾讯电脑管家」、「驱动精灵」、「360不安全卫士」等;
  • 如果你在使用的操作系统为 Windows 10,则可以打开「设置」→「网络和Internet」→「以太网」→ 找到您的网卡图标并单击 → 「查找设备和内容」切换为开;
  • 如果你在使用的操作系统为 Windows 7,则可以打开「网络和共享中心」,点击连接到近红外仪器网卡下方的网络类型连接修改网络类型;
  • 如果在网卡设置/网络和共享中心界面没有对应的选项,你也可以通过修改「组策略」将网络连接强制改为工作网络:
    • 按组合键 Win+R打开「运行」窗口,输入 gpedit.msc 并敲回车进入组策略;
    • 找到「本机策略」 → 「安全性策略」 → 「网络清单管理政策」;
    • 在右侧找到你的网络连接,如果你的网络现在处于「未识别网络」的状态则选择未识别网络;
    • 双击该网络,打开第三个选项卡「网络位置」,选择「公共」网络。