← 全部文章 机器视觉

VisionPro 脚本:调试与调用自己的 DLL

2022 年 9 月 21 日 · 2 分钟读完

目录
  1. 一、在脚本里打断点调试
  2. 1. 打开脚本的调试模式
  3. 2. 用 VS 附加到 VisionPro 进程
  4. 二、在脚本里调用自己封装的 DLL
  5. 1. 配置
  6. 2. 脚本代码
  7. 延伸

VisionPro 的 ToolBlock 可以写 C# 脚本,但脚本出了问题很难排查。两篇笔记:怎么调试脚本,以及怎么在脚本里用自己的 DLL。

一、在脚本里打断点调试

帮同事调项目时需要看脚本内部的运行情况。

1. 打开脚本的调试模式

脚本编辑页面把编译模式选为调试(Debug),并取消下面这三行的注释:

#if DEBUG
if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();
#endif

意思是:Debug 模式下,如果有调试器附加着,就在这里停下来。

2. 用 VS 附加到 VisionPro 进程

打开 VS,调试 → 附加到进程:

找到 VisionPro 的进程(QuickBuild 或者你自己的上位机程序),附加:

然后运行 VisionPro,脚本执行到 Debugger.Break() 时会跳进 VS,可以单步、看变量:

设置好了却没有停下来? 多半是脚本根本没执行:ToolBlock 里前面的工具出错了,或者输入没给对,整个 ToolBlock 没有正常运行,脚本自然也不会跑。先看 ToolBlock 的运行状态。

有一次没有附加进程,运行后正在调试别的程序的 VS 自己弹出了断点界面,原因没查清,记录一下现象。

二、在脚本里调用自己封装的 DLL

做硬件测试时想把数据导出成 CSV,偷懒直接用以前封装好的函数库,遇到了几个问题。

1. 配置

VisionPro 里加了一个 ToolBlock:

把 DLL 放到 VisionPro 的 bin 目录下:

然后在脚本的引用里添加这个 DLL:

两个要点:

  • DLL 要放在宿主程序的目录下:在 QuickBuild 里运行时,放在 VisionPro 的 bin 目录;在自己的上位机里加载 .vpp 运行时,放在上位机的 exe 目录。.NET 是在宿主进程的目录里找程序集的。
  • 依赖也要一起放:你的 DLL 引用了别的 DLL(比如 Newtonsoft.Json),那些也要拷过去,否则报找不到文件或程序集。

2. 脚本代码

using System;
using System.Data;
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;

public class CogToolBlockAdvancedScript1 : CogToolBlockAdvancedScript
{
    private readonly DataTable dt = new DataTable();
    private readonly string path = @"D:\Data\result.csv";
    private int count;

    public override bool GroupRun(ref string message, ref CogToolResultConstants result)
    {
        #if DEBUG
        if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();
        #endif

        // 先运行 ToolBlock 里的工具
        foreach (ICogTool tool in mToolBlock.Tools)
            mToolBlock.RunTool(tool, ref message, ref result);

        DataRow dr = dt.NewRow();
        dr["次数"] = ++count;
        dr["X"] = 12;
        dr["Y"] = 15;
        dt.Rows.Add(dr);
        CSVHelper_DP.CSVHelper.DataTable2CSV(dt, path); // 我封装的类库

        return false; // 已经自己运行过工具了
    }

    public override void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host)
    {
        base.Initialize(host); // 不能删
        dt.Columns.Add("次数");
        dt.Columns.Add("X");
        dt.Columns.Add("Y");
    }
}

结果:

GroupRun 的返回值:返回 true 表示脚本执行完后,ToolBlock 照常运行里面的工具;返回 false 表示「工具由我自己运行」,ToolBlock 不会再跑它们。原文的代码返回了 false 却没有运行工具,ToolBlock 里的工具就都不会执行。要么返回 true,要么像上面这样在脚本里自己 RunTool。

延伸

  • 数据写文件放到外面做:脚本在检测流程里执行,每次都把整张表重写一遍 CSV,数据多了会越来越慢,还可能因为文件被 Excel 打开而抛异常导致检测失败。更好的做法是脚本只把结果放到 ToolBlock 的输出端,由上位机程序统一记录。
  • 脚本出异常:异常会让 ToolBlock 的运行结果变成 Error,message 里有异常信息。脚本里写 try-catch,把异常信息写进 message,方便现场排查。
  • 用 Debug 模式发布会慢:调完记得改回 Release,并注释掉 Debugger.Break。
  • CSV 的坑:中文用 Excel 打开乱码时,写文件用带 BOM 的 UTF-8,原因见 字符编码。

# VisionPro # C#

原文首发于 blog.csdn.net