4. pylon Viewer单机配置回顾
在进入批量配置之前,先把单机配置的完整链路走通一遍。pylon Viewer 是 Basler 相机最基础也最可靠的配置入口,它把相机内部的功能寄存器抽象成一棵可读的参数树,并允许把整棵树的取值保存成用户集或导出为文件。理解这条链路,后面用 pylon API、pylon IP Configurator 或第三方工具做批量下发时,才知道每一步到底在改什么、能改到什么程度、哪些东西无法被复制。
参数树:相机功能的层级映射
pylon Viewer 左侧的 Feature Tree(特征树)不是随意排列的菜单,而是对 GenICam 特征描述文件(XML)的层级化呈现。相机上电后,Viewer 读取相机内的 XML,按命名空间和类别把特征组织成树。典型的一级节点包括:
- DeviceControl:设备信息、温度、用户集管理(UserSetControl)、设备重置等。
- ImageFormatControl:像素格式(PixelFormat)、宽高(Width/Height)、ROI 偏移(OffsetX/OffsetY)、Binning、Decimation、测试图(TestImageSelector)。
- AcquisitionControl:采集模式、触发模式(TriggerMode)、触发源(TriggerSource)、曝光时间(ExposureTime)、增益(Gain)、帧率(AcquisitionFrameRate)。
- AnalogControl:增益、黑电平(BlackLevel)、Gamma 等模拟前端参数。
- TransportLayer:GigE 或 USB 的传输层参数,如包大小(GevSCPSPacketSize)、包间隔(GevSCPD)、心跳超时等。
- DigitalIOControl:LineSelector、LineMode、LineSource,用于配置光耦输入输出。
每个节点都有明确的访问属性:RW(可读写)、RO(只读)、WO(只写)。只读节点如 DeviceTemperature、DeviceID、ResultingFrameRate 无法被写入,批量配置脚本里对它们赋值会直接报错。另一个关键属性是可见性(Visibility),部分节点在 Beginner 级别被隐藏,需要把 Viewer 的可见性切到 Expert 或 Guru 才能看到,例如 GevSCPD、GevSCPSPacketSize 这类传输层参数。批量配置时如果发现某个参数"找不到",先检查可见性级别,而不是怀疑相机不支持。
特征流:参数之间的依赖与联动
参数树里的节点并非彼此独立,它们之间存在依赖关系,pylon Viewer 用"特征流"的方式动态更新可用性和取值范围。举几个实际会遇到的例子:
- 当
PixelFormat从Mono8改为BayerRG8时,Width和Height的最大值可能变化,因为不同像素格式对行宽有对齐要求。 - 当
TriggerMode设为On时,AcquisitionFrameRate变为只读或失效,帧率由外部触发信号决定;切回Off后帧率参数重新可写。 - 当
BinningHorizontal设为 2 时,Width的可选范围会按比例缩小,OffsetX的步进也会改变。 - 当
GevSCPSPacketSize超过网络路径 MTU 时,采集会出现丢包,Statistic节点下的MissedPacketCount会增长。
这意味着批量配置不能简单地"按顺序写值"。如果先写 Width 再改 PixelFormat,后者可能把前者重置或使其越界。稳妥的做法是:先设置影响范围的参数(像素格式、Binning、触发模式),再设置依赖它们的参数(宽高、偏移、曝光、增益),最后设置传输层参数。pylon Viewer 的 Feature Tree 在写入时会自动做范围校验,越界值会被拒绝并给出提示,这也是单机调试阶段最有价值的反馈。
用户集:相机内部的持久化配置
参数调好后,如果直接断电,大部分设置会丢失(相机回到 Default 用户集)。pylon Viewer 通过 UserSetControl 节点管理相机内部的配置存储。Basler 相机通常提供 Default、UserSet1、UserSet2、UserSet3 等槽位,部分型号还支持 AutoLoad 功能,让相机上电时自动加载指定用户集。
保存用户集的标准操作是:先把 UserSetSelector 设为 UserSet1,然后执行 UserSetSave。此时当前参数树的所有可写值被写入相机 Flash 的 UserSet1 区域。之后把 UserSetDefaultSelector 设为 UserSet1,相机下次上电就会自动加载这套参数。需要恢复时,把 UserSetSelector 设为 UserSet1 并执行 UserSetLoad 即可。
用户集有几个必须注意的限制。第一,它只保存"可写且属于用户集范围"的参数,像 DeviceUserID、GevPersistentIP 这类设备级标识通常不在用户集内,需要单独设置。第二,用户集保存在相机内部,换一台相机就没有了,所以它适合"单机固化",不适合"批量分发"。第三,写入 Flash 有寿命限制,不要在循环里反复 UserSetSave,调试阶段用 UserSetLoad 切换即可,确认最终版本后再保存一次。
配置文件导出与导入:.pfs 文件
pylon Viewer 的 Features 菜单提供 Save Features 和 Load Features,导出的文件扩展名是 .pfs(pylon Feature Stream)。它本质上是一个文本文件,记录了参数树中每个节点的名称和当前值,格式类似:
# Pylon Feature Stream
Width = 1920
Height = 1080
PixelFormat = Mono8
ExposureTime = 5000.0
Gain = 2.0
TriggerMode = Off
AcquisitionFrameRate = 30.0
GevSCPSPacketSize = 1500
GevSCPD = 2000
导出时可以选择"仅保存与默认值不同的参数"或"保存全部参数"。前者文件小、可读性好,适合做版本对比;后者完整但冗长。实际做批量配置时,建议导出"与默认值不同"的版本,这样能一眼看出这台相机到底改了什么。
导入 .pfs 时,pylon Viewer 会逐条把文件中的值写入相机。如果某个参数在当前相机上不存在(型号不同或固件版本不同),Viewer 会跳过并给出警告,而不是整体失败。这个特性让 .pfs 成为跨相机批量配置的天然载体:用一台"金标准"相机调好参数,导出 .pfs,再逐台导入即可。但要注意,.pfs 里如果包含 DeviceUserID 或 IP 相关参数,导入到多台相机会造成标识冲突,批量前应把这些行删掉或改为脚本动态设置。
单机配置的交付物建议:每台相机调试完成后,至少保留三样东西——一份 .pfs 配置文件、一份用户集槽位记录(哪个槽位存了什么版本)、一份参数变更说明(相对默认值改了哪些、为什么改)。这三样东西在后续批量下发和故障回溯时,比口头记忆可靠得多。
常见误区:把 .pfs 当成"完整备份"。它只包含参数值,不包含固件版本、IP 配置、设备用户 ID 和用户集槽位状态。换相机或升级固件后直接导入,可能出现参数被跳过或行为不一致。批量配置前,先用 pylon Viewer 确认目标相机的固件版本与源相机一致,或至少确认关键参数节点都存在。
从单机到批量的衔接点
回顾这条链路,单机配置真正可被批量复用的部分,是参数树中那些"可写、跨相机一致、不涉及设备唯一标识"的节点集合。用户集解决的是单台相机的持久化,.pfs 解决的是配置的跨相机搬运,而批量配置脚本要做的,就是把 .pfs 的导入动作自动化,并在导入前后处理设备唯一标识(如 DeviceUserID、IP)和固件版本校验。理解了参数树的访问属性、特征流的依赖顺序、用户集与 .pfs 的边界,后面写批量脚本时就不会把"能读到的值"误当成"能写进去的值",也不会把"单机保存成功"误当成"批量下发成功"。