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 是“网络位置”。批量命名策略的本质,就是让这四者形成稳定映射。
二、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 是否与映射表一致。若发现某台设备名称未变,优先检查该设备是否被其他程序占用,或名称是否超出长度限制。
五、常见问题与判断依据
批量命名中最常见的三类问题及判断方法如下:
- 名称重复:枚举后若发现两个设备返回相同 UserDefinedName,说明映射表有误或写入未生效。此时应以 MAC 为准重新分配。
- IP 冲突:
ping目标 IP 时出现时通时断,或 pylon Viewer 中同一 IP 下设备频繁切换,通常表示 IP 冲突。应断开部分相机,逐台确认。 - 名称写入失败:若
SetValue抛出异常,检查名称是否含非法字符、是否超过长度限制,或相机是否处于只读状态。
最后需要强调:MAC 和序列号是设备的“身份证”,任何时候都不应被覆盖或混淆;用户自定义名称和 IP 是“工作牌”,可以按产线调整,但必须保持映射关系稳定。只有把四类标识统一到一张可维护的映射表中,批量配置才具备可重复、可追溯的基础。