在工业视觉检测领域,康耐视VisionPro的PMAlign工具因其出色的模板匹配能力被广泛应用。但很多工程师在使用ToolBlock工具块时,常遇到一个关键问题:如何将模板匹配的结果数据高效提取并传递到下游流程?本文将深入解析两种典型的脚本实现方案,并分享我在汽车零部件检测项目中积累的实战经验。
VisionPro的CogPMAlignTool运行后会生成CogPMAlignResults集合,每个匹配结果包含以下核心数据:
特别注意:Results[0]表示得分最高的匹配结果,当允许多匹配时需遍历Results集合
ToolBlock中的高级脚本(GroupRun)具有以下特性:
csharp复制// 获取PMAlign工具实例
CogPMAlignTool pm = mToolBlock.Tools["CogPMAlignTool1"] as CogPMAlignTool;
// 输出位置和角度到ToolBlock变量
mToolBlock.Outputs["X"].Value = pm.Results[0].GetPose().TranslationX;
mToolBlock.Outputs["Y"].Value = pm.Results[0].GetPose().TranslationY;
mToolBlock.Outputs["A"].Value = pm.Results[0].GetPose().Rotation;
关键点说明:
csharp复制CogPMAlignTool pm = mToolBlock.Tools["模板匹配"] as CogPMAlignTool;
// 提取多个结果参数
double x = pm.Results[0].GetPose().TranslationX;
double y = pm.Results[0].GetPose().TranslationY;
double a = pm.Results[0].GetPose().Rotation;
// 合并输出为CSV格式字符串
mToolBlock.Outputs["res"].Value = $"{x:F3},{y:F3},{a:F4}";
优化技巧:
csharp复制try {
CogPMAlignTool pm = mToolBlock.Tools["CogPMAlignTool1"] as CogPMAlignTool;
if(pm.Results == null || pm.Results.Count == 0) {
message = "未找到匹配结果";
result = CogToolResultConstants.Accept;
return true;
}
// 正常处理逻辑...
} catch(Exception ex) {
message = $"脚本错误:{ex.Message}";
result = CogToolResultConstants.Error;
return true;
}
经验之谈:
csharp复制StringBuilder sb = new StringBuilder();
for(int i=0; i<pm.Results.Count; i++) {
var result = pm.Results[i];
sb.AppendLine($"结果{i+1}: X={result.GetPose().TranslationX:F2}, " +
$"Y={result.GetPose().TranslationY:F2}, " +
$"角度={result.Rotation:F4}rad");
}
mToolBlock.Outputs["MatchDetails"].Value = sb.ToString();
性能提示:
现象:抛出"工具不存在"异常
案例:输出坐标值明显偏离预期
场景:在Job中运行时出现数据错乱
csharp复制lock(syncObject) {
// 访问共享资源的代码
}
csharp复制// 避免每次运行都new对象
private static readonly StringBuilder _sb = new StringBuilder(256);
_sb.Clear();
_sb.Append(pm.Results[0].GetPose().TranslationX);
// ...其余操作
csharp复制private static readonly Regex _coordRegex = new Regex(@"(\d+),(\d+)", RegexOptions.Compiled);
// 在频繁调用的方法中使用
var match = _coordRegex.Match(inputString);
csharp复制// 在类级别声明缓存变量
private CogPMAlignResult _lastValidResult;
// 在GroupRun中
if(pm.Results.Count > 0 && pm.Results[0].Score > 0.8) {
_lastValidResult = pm.Results[0];
} else {
// 使用上次有效结果
}
推荐采用匈牙利命名法:
csharp复制// 添加时间戳的日志记录
mToolBlock.Outputs["DebugLog"].Value =
$"{DateTime.Now:HH:mm:ss.fff} - X={x:F2}, Y={y:F2}";
创建测试脚本验证边界条件:
在汽车车灯定位项目中,我们通过上述脚本方案实现了0.02mm的重复定位精度。一个关键发现是:当采用CSV格式输出时,下游PLC解析效率比单个变量提升40%。但要注意字符串长度限制——我们曾因未截断长字符串导致通讯超时,最终通过添加如下处理解决:
csharp复制string output = sb.ToString();
mToolBlock.Outputs["Result"].Value = output.Length > 200 ?
output.Substring(0,200) : output;