3. 设备标识与命名规范

在批量配置 Basler 相机时,最先遇到的困难往往不是参数本身,而是“我到底在配置哪一台”。当现场有 8 台、16 台甚至 64 台相机同时接入交换机时,如果只靠 IP 或临时贴纸区分,很容易出现把 A 相机的曝光参数写到 B 相机上的情况。因此,本节要解决的核心问题是:如何利用设备固有的唯一标识,结合可自定义的名称与 IP 规划,建立一套稳定、可批量执行、可追溯的命名体系。

一、四类标识的分工

Basler 相机在 pylon 与 GigE Vision 体系中会暴露多个标识字段,它们的作用并不相同:

  • MAC 地址:出厂烧录的物理地址,全球唯一,不可修改。它是设备最底层的身份,即使 IP 冲突、名称重复,MAC 也不会重复。批量工具通常以 MAC 作为最终寻址依据。
  • 序列号(Serial Number):Basler 为每台相机分配的唯一编号,通常印在机身标签上,也可通过 pylon Viewer 或 DeviceInfo 读取。它比 MAC 更易读,适合作为资产台账的主键。
  • 用户自定义名称(User Defined Name / Friendly Name):可写入相机的可读名称,例如 Line1_Cam03。它不保证唯一,但便于人眼识别,是批量配置脚本中“按名寻址”的关键字段。
  • IP 地址:网络层标识,可静态分配或由 DHCP 分配。批量场景下通常采用静态 IP,并按工位、线体、相机序号进行结构化规划。

四者的关系可以概括为:MAC 与序列号是“不可变身份”,用户自定义名称是“可读别名”,IP 是“网络位置”。批量命名策略的本质,就是让这四者形成稳定映射。

设备标识映射关系与批量命名策略 不可变身份(出厂) MAC:00:30:53:1A:2B:3C 序列号:SN-2417-0083 唯一、不可改、寻址依据 可读别名(可写) UserDefinedName Line1_Cam03 便于人眼识别,不保证唯一 网络位置(规划) IP:192.168.10.13 子网:/24 按线体/工位结构化分配 批量命名映射示例(Line1 线体,8 台相机) 序列号 MAC 后 4 位 UserDefinedName IP 地址 工位 SN-2417-0081 2B:3C Line1_Cam01 192.168.10.11 上料 SN-2417-0082 2B:3D Line1_Cam02 192.168.10.12 定位 SN-2417-0083 2B:3E Line1_Cam03 192.168.10.13 检测

二、IP 地址规划:结构化而非随意分配

批量场景下,IP 规划应遵循“可读、可扩展、可隔离”的原则。推荐按线体或工位划分网段,例如:

  • 线体 1:192.168.10.0/24,相机地址从 .11 开始,网关 .1,主机 PC 使用 .100。
  • 线体 2:192.168.20.0/24,规则相同。
  • 相机地址末位与工位序号对应,例如 .11 对应上料工位,.12 对应定位工位。

这样做的直接好处是:当现场出现故障时,看到 IP 192.168.10.13 就能立刻判断它属于线体 1 的检测工位,而不需要查表。同时,不同线体使用不同网段,可以避免跨线体广播干扰,也便于用 VLAN 做隔离。

需要注意的是,Basler GigE 相机默认可能启用 DHCP 或 AutoIP。批量部署时应统一改为静态 IP,并关闭 DHCP,否则相机重启后地址可能变化,导致脚本寻址失败。修改 IP 时,建议先通过 MAC 定位设备,再写入目标 IP,最后用 ping 与 pylon Viewer 双重确认。

三、批量命名策略:从“能识别”到“可脚本化”

用户自定义名称的命名规则应满足三个条件:唯一、可解析、可排序。推荐采用“线体_工位_序号”三段式,例如 Line1_Cam03。其中:

  • 线体段:Line1、Line2,与 IP 网段对应。
  • 工位段:Cam 表示相机,也可用 Load、Inspect 等语义化词。
  • 序号段:两位数字,从 01 开始,保证排序稳定。

命名时避免使用空格、中文、特殊符号,因为部分工具对名称长度和字符集有限制。Basler 的 UserDefinedName 通常支持字母、数字、下划线和短横线,长度建议控制在 16 字符以内。

四、批量写入的实操思路

以 pylon 的 pylon.InstantCamera 与 DeviceInfo 为例,批量命名可以按以下逻辑执行:先枚举所有设备,读取 MAC 与序列号;再根据预设映射表,将目标名称与 IP 写入对应设备;最后回读校验。

from pypylon import pylon

# 预设映射:MAC 后4位 -> (UserDefinedName, IP)
mapping = {
    "2B:3C": ("Line1_Cam01", "192.168.10.11"),
    "2B:3D": ("Line1_Cam02", "192.168.10.12"),
    "2B:3E": ("Line1_Cam03", "192.168.10.13"),
}

tl = pylon.TlFactory.GetInstance()
devices = tl.EnumerateDevices()

for dev in devices:
    mac = dev.GetMacAddress()
    key = mac[-5:]  # 取后4位加冒号
    if key in mapping:
        name, ip = mapping[key]
        cam = pylon.InstantCamera(tl.CreateDevice(dev))
        cam.Open()
        # 写入用户自定义名称
        cam.GetNodeMap().GetNode("DeviceUserID").SetValue(name)
        # 写入静态 IP(需相机支持)
        cam.GetNodeMap().GetNode("GevPersistentIP").SetValue(ip)
        cam.Close()
        print(f"{mac} -> {name} / {ip}")

上述代码为示例逻辑,实际执行前需确认相机固件支持 GevPersistentIP 节点,并确保写入后重启相机使 IP 生效。写入完成后,应再次枚举设备,检查 UserDefinedName 与 IP 是否与映射表一致。若发现某台设备名称未变,优先检查该设备是否被其他程序占用,或名称是否超出长度限制。

建议把“MAC—序列号—名称—IP—工位”五列做成一份 CSV 台账,每次批量配置前先核对,配置后再回读比对。这份台账既是配置输入,也是后续排障的索引。

五、常见问题与判断依据

批量命名中最常见的三类问题及判断方法如下:

  • 名称重复:枚举后若发现两个设备返回相同 UserDefinedName,说明映射表有误或写入未生效。此时应以 MAC 为准重新分配。
  • IP 冲突:ping 目标 IP 时出现时通时断,或 pylon Viewer 中同一 IP 下设备频繁切换,通常表示 IP 冲突。应断开部分相机,逐台确认。
  • 名称写入失败:若 SetValue 抛出异常,检查名称是否含非法字符、是否超过长度限制,或相机是否处于只读状态。

最后需要强调:MAC 和序列号是设备的“身份证”,任何时候都不应被覆盖或混淆;用户自定义名称和 IP 是“工作牌”,可以按产线调整,但必须保持映射关系稳定。只有把四类标识统一到一张可维护的映射表中,批量配置才具备可重复、可追溯的基础。