跳到主要内容

AI 驱动文档

您想了解什么?

元数据设置

OV10i 注意

OV10i 仅支持 分类 模型。本页面提到的分割功能在 OV20iOV80i 相机上可用。

本指南向您展示如何为 OV10i 相机图像配置元数据。元数据是与每个捕获图像一起存储的自定义信息,帮助您跟踪重要细节,如零件编号、序列号或生产数据。

何时使用元数据: 生产跟踪、零件识别、质量控制记录、批次信息、操作员识别或您需要与检查图像关联的任何自定义数据。

先决条件

  • OV10i 相机系统已设置并连接
  • 配置了带有成像和检查设置的活动配方
  • 至少配置了一个 AI 块(分类或分割)
  • 理解您希望从检查结果中跟踪的数据

什么是元数据?

元数据是附加到每个捕获图像的信息。这些信息:

  • 与图像一起存储在相机的库中
  • 在 HMI 中显示供操作员查看
  • 帮助识别和跟踪特定零件或生产批次
  • 可在库中搜索以进行分析

有用的元数据示例:

  • 零件编号(例如,“P12345”)
  • 序列号(例如,“SN987654”)
  • 操作员姓名(例如,“John_Smith”)
  • 班次信息(例如,“A_Shift”)
  • 批次编号(例如,“Batch_2025_001”)
备注

元数据只能在检查完成后保存。元数据必须是从相机捕获并处理图像后,从“所有块输出”开始的流程的一部分。

步骤 1:访问 Node-RED 编辑器

1.1 导航到 IO 块

  1. 在配方编辑器中打开您的活动配方
  2. 点击 配置 IO 或在面包屑菜单中选择 IO 块 以进入 Node-RED 编辑器

1.2 验证 Node-RED 界面

检查点: 您应该看到 Node-RED 流编辑器,左侧有现有的 IO 块流和节点面板。

步骤 2:找到“所有块输出”节点

2.1 找到起始点

在您的 Node-RED 流中,寻找 “所有块输出” 节点。这是接收来自相机的数据的起始点,检查被触发并处理后。

“所有块输出”节点:

  • 包含所有 AI 块的检查结果
  • 包括图像捕获信息
  • 提供创建元数据所需的数据
  • 是提供元数据和合格/不合格决策的源

2.2 理解流结构

您的流应遵循以下模式:

Camera Trigger → AI Processing → All Block Outputs → [Your Custom Logic]

从“所有块输出”您需要 两个独立路径

  1. 元数据路径:所有块输出 → 函数(创建元数据) → 捕获元数据
  2. 决策路径:所有块输出 → 函数(逻辑) → 最终合格/不合格
备注

元数据和合格/不合格决策必须从“所有块输出”节点分支。

步骤 3:添加捕获元数据节点

3.1 找到元数据节点

  1. 在左侧面板中找到“捕获元数据”节点(概述部分)
  2. 将“捕获元数据”节点拖到流画布上
  3. 将其放置在触发 之后,但在图像捕获 之前

3.2 流程中的节点放置

正确的流程结构:

All Block Outputs → Function (Create Metadata) → Capture Metadata

Function (Pass/Fail Logic) → Final Pass/Fail

注意

“最终通过/失败”节点是必需的,以确保流程正常工作。每个流程必须以此节点结束。

第 4 步:配置元数据字段

4.1 设置基本元数据

  1. 双击捕获元数据节点
  2. 配置您希望跟踪的元数据字段
  3. 为每个字段设置数据源

4.2 元数据格式要求

重要

元数据必须格式化为一个对象,包含:

  • 字符串键 - 字段名称必须为文本
  • 字符串或数字值 - 数据可以是文本或数字

正确格式示例:

{
"part_number": "P12345",
"serial_number": "SN987654",
"operator": "John_Smith",
"shift": "A",
"quantity": 100,
"temperature": 23.5
}

第 5 步:创建元数据功能节点

5.1 添加用于元数据创建的功能节点

  1. 在“所有块输出”和“捕获元数据”节点之间添加一个“功能”节点
  2. 双击功能节点进行配置
  3. 此功能将从检测结果中提取数据并创建元数据

5.2 从所有块输出提取数据

“所有块输出”节点提供丰富的检测数据。以下是提取数据的方法:

// Extract data from inspection results
const captureId = msg.payload.capture_id;
const serialNumber = msg.payload.serial_number || "No_Serial";
const inspectionTime = msg.payload.inspection_time || new Date().toISOString();

// Create metadata from inspection data
msg.payload = {
"capture_id": captureId,
"serial_number": serialNumber,
"inspection_time": inspectionTime,
"operator": global.get("current_operator") || "Unknown"
};
return msg;

5.3 静态元数据(固定值)

对于在生产过程中不会改变的信息:

// Set static metadata values
msg.payload = {
"recipe_name": "Bolt_Inspection_v2",
"line_number": "Line_3",
"shift": "A_Shift",
"station": "QC_Station_1"
};
return msg;

5.4 动态元数据(使用检测数据)

对于来自检测结果的信息:

// Extract inspection data
const captureId = msg.payload.capture_id;
const imageUrl = msg.payload.image_url;
const predictions = msg.payload.classification?.predictions || [];

// Create dynamic metadata
msg.payload = {
"capture_id": captureId,
"part_number": "P" + Date.now(),
"total_rois": predictions.length,
"timestamp": new Date().toISOString(),
"batch": global.get("current_batch") || "Default_Batch"
};
return msg;

第 6 步:连接元数据和通过/失败流程

6.1 必需的流程结构

每个流程必须具有来自“所有块输出”的两个路径:

All Block Outputs → Function (Create Metadata) → Capture Metadata

Function (Pass/Fail Logic) → Final Pass/Fail

6.2 连接元数据路径

  1. 将“所有块输出”输出连接到您的元数据功能输入
  2. 将元数据功能输出连接到“捕获元数据”输入
  3. 捕获元数据节点可以是终端节点(不需要输出连接)

6.3 连接合格/不合格路径

  1. 将 "All Block Outputs" 输出连接到合格/不合格逻辑函数
  2. 将逻辑函数输出连接到 "Final Pass/Fail" 输入
  3. "Final Pass/Fail" 节点是必需的 - 每个流程必须在此结束

6.4 示例合格/不合格逻辑函数

// Extract inspection result for pass/fail decision
const predictions = msg.payload.classification?.predictions || [];

// Determine if inspection passed (all ROIs passed)
let passed = true;
for (let prediction of predictions) {
if (!prediction.predicted_class.includes("pass")) {
passed = false;
break;
}
}

// Set the pass/fail result
msg.payload = passed;
return msg;

第 7 步:测试元数据配置

7.1 部署和测试

  1. 点击 "Deploy" 按钮(右上角)
  2. 使用您配置的触发方法(手动、数字输入或 PLC)触发检查
  3. 验证:
    • 已捕获图像
    • 元数据与图像一起出现
    • 已做出合格/不合格决定
    • 流程成功完成

7.2 验证完整流程

检查两个路径是否正常工作:

元数据路径:

  • 在主界面中导航到库
  • 找到您的测试图像
  • 验证图像详细信息中出现元数据

合格/不合格路径:

  • 检查检查结果显示合格/不合格状态
  • 验证 "Final Pass/Fail" 节点正确处理
  • 确认任何连接的输出(PLC、指示灯)响应适当

7.3 测试不同的触发源

验证元数据与您的特定触发器一起工作:

对于手动触发:

  • 使用软件触发按钮
  • 验证每次手动捕获时元数据出现

对于数字输入触发:

  • 激活外部传感器/开关
  • 确认触发图像时捕获元数据

对于 PLC 触发:

  • 从 PLC 发送触发信号
  • 验证元数据包含 PLC 数据(如适用)

第 8 步:高级元数据配置

8.1 来自多个全局变量的元数据

结合来自不同全局存储源的数据:

// Combine data from various global storage
const operatorData = global.get("operator_info") || {};
const productData = global.get("product_info") || {};
const shiftData = global.get("shift_info") || {};

msg.payload = {
"operator": operatorData.name || "Unknown",
"operator_id": operatorData.id || "000",
"product_code": productData.code || "Default",
"product_version": productData.version || "1.0",
"shift": shiftData.current || "Day",
"line_status": "Running",
"timestamp": new Date().toISOString()
};
return msg;

第 9 步:故障排除元数据问题

9.1 常见问题

问题症状解决方案
元数据未出现库中没有数据验证元数据节点是否在主 IO 块流程中
错误图像的元数据数据与错误捕获一起出现检查时序 - 元数据必须在图像捕获之前
触发不起作用没有捕获图像验证 IO 块触发配置
缺少元数据字段一些数据缺失检查函数节点有效负载格式
错误的数据类型节点显示错误状态确保值仅为字符串或数字

9.2 调试元数据流

添加调试节点以进行故障排除:

  1. 在触发器后添加调试节点以验证触发器是否正常工作
  2. 在元数据函数后添加调试节点以检查有效负载
  3. 在捕获元数据后添加调试节点以确认处理
  4. 检查调试面板以获取错误消息

第10步:最佳实践

10.1 流设计

设计高效的元数据流:

  • 将元数据尽早放入流中 - 在触发器后立即设置元数据
  • 使用单个元数据节点 - 不要重复使用捕获元数据节点
  • 保持流的连续性 - 元数据必须是主要检查流的一部分
  • 处理缺失数据 - 始终提供默认值

10.2 元数据字段命名

使用一致且清晰的字段名称:

  • 使用下划线而不是空格("part_number" 而不是 "part number")
  • 描述性但简洁("operator" 而不是 "op")
  • 使用小写以保持一致性
  • 避免可能导致问题的特殊字符

10.3 性能考虑

对于高产量生产:

  • 最小化元数据大小 - 仅包含必要的信息
  • 使用高效的数据类型 - 尽可能使用数字,短字符串
  • 避免复杂处理 - 保持元数据创建简单快速
  • 缓存全局数据 - 将频繁使用的数据存储在全局变量中

成功!您的元数据系统已准备就绪

您的元数据配置现在可以:

✅ 将自定义信息附加到每个触发的图像捕获

✅ 跟踪与检查流同步的生产数据

✅ 在相机库中存储可搜索的信息

✅ 在操作员的 HMI 中显示相关数据

✅ 支持制造要求的可追溯性

持续维护

定期系统检查

  • 验证元数据是否与触发的捕获一起出现
  • 检查生产运行中是否有缺失数据
  • 监控高触发率下的流性能
  • 根据需求变化更新元数据字段

流管理

  • 审查生产中的元数据时序
  • 优化功能节点性能
  • 更新全局变量管理
  • 培训操作员进行基于触发的操作

下一步

在设置基于触发的元数据后:

  1. 测试所有配置的触发类型(手动、数字、PLC)
  2. 培训操作员正确使用触发器进行元数据捕获
  3. 设置全局变量管理以处理动态数据
  4. 为不同产品线创建元数据模板
  5. 使用元数据分析实施生产监控

🔗 另请参阅