VisionPro二次开发:如何将视觉结果稳定串流至外部系统

发布时间:2026/9/5 5:02:49
VisionPro二次开发:如何将视觉结果稳定串流至外部系统 在实际工业视觉项目中VisionPro 作为一款强大的机器视觉开发工具其核心价值在于能够快速、稳定地处理图像并输出精确的测量结果。然而许多开发者在进行二次开发或系统集成时常常会遇到一个关键问题如何将 VisionPro 内部处理得到的复杂数据例如一个包含多个圆心坐标的数组稳定、高效地传输给外部的 PLC、MES 系统或自定义的上位机软件这个过程我们通常称之为“数据串流”或“结果输出”。它远不止是简单地弹出一个对话框显示结果而是涉及到底层通信协议、数据格式封装、异常处理以及生产环境稳定性的系统工程。本文将深入探讨 VisionPro 在二次开发场景下的数据输出机制。我们将从一个常见的需求出发使用 VisionPro 的脚本工具CogToolBlock执行一个模板匹配CogPMAlignTool并获取多个匹配结果然后将这些结果一个包含位置、角度、分数的对象数组通过某种方式“流式”传输到外部程序。你会看到VisionPro 本身并不直接提供一个叫“串流”的按钮但其强大的 COM 接口和 .NET 集成能力使得构建稳定可靠的数据输出链路成为可能。本文将涵盖从环境准备、脚本编写、数据序列化到通过 TCP Socket 实现跨进程通信的完整流程并重点分析其中容易踩坑的环节例如数据类型转换、网络异常处理以及如何在生产环境中确保数据的完整性和时序性。1. 理解 VisionPro 的数据流转与“串流”的本质在开始写代码之前必须厘清 VisionPro 内部的数据处理流程和我们所说的“串流”到底指什么。这有助于我们选择正确的技术方案避免用错误的方法解决错误的问题。1.1 VisionPro 工具链的数据流VisionPro 的核心是“工具”Tool如 CogPMAlignTool模板匹配、CogCaliperTool卡尺工具、CogBlobTool斑点分析等。每个工具都有输入图像InputImage和输出结果Results。这些工具可以被拖拽到“作业”Job或“工具块”ToolBlock中形成一个视觉处理流程。数据在工具间流动一个工具的输出可以作为另一个工具的输入。例如CogPMAlignTool 输出的匹配位置可以直接连线给 CogCaliperTool 作为搜索区域的原点。这种流动是在 VisionPro 运行时CogJob内部完成的对于用户是透明的。数据的最终出口处理流程的最终结果需要被“消费”。在 QuickBuild 界面中你可以通过“结果显示”控件来查看。但在二次开发中我们需要以编程方式访问这些结果。1.2 “串流”在 VisionPro 上下文中的定义这里的“串流”并非指视频流媒体而是指将 VisionPro 工具运行后产生的结构化数据持续、稳定地发送到另一个独立的进程或设备。它通常意味着跨进程通信VisionPro 应用可能是独立的 EXE 或嵌入在宿主程序中的控件与外部客户端如 C# WinForms 程序、Python 服务、PLC之间的通信。结构化数据传输的不是原始图像虽然也可以而是经过处理的信息如坐标(X, Y)、角度Theta、测量值、OK/NG 标志等。这些数据往往以数组或集合的形式存在例如一次匹配找到的多个实例。协议与格式需要约定双方都能理解的通信协议如 TCP/IP、UDP、命名管道和数据格式如 JSON、XML、自定义二进制格式。1.3 为什么“输出端子不支持数组传输”是个伪命题搜索热词中出现了“visionpro的输出端子不支持数组传输吗”这反映了一个常见的误解。在 VisionPro 的 ToolBlock 脚本编辑器中你确实不能直接将一个CogCompositeShape的集合或CogPMAlignResult数组拖拽到“输出端子”Output Terminal上。因为输出端子设计用于传输简单的、标量的数据类型如Double,Int32,String,Boolean或单一的复杂对象如CogRectangle。真正的解决方案是序列化Serialization。你需要将数组或集合在脚本中转换为一种可以传输的格式。最通用的方法就是将其转换为字符串如 JSON 字符串然后将这个字符串赋值给一个String类型的输出端子。外部程序收到这个字符串后再反序列化回原来的数据结构。‘ 假设在 VisionPro ToolBlock 脚本中 (VB.NET语法) ‘ 1. 获取模板匹配工具的结果集合 Dim pmTool As CogPMAlignTool CType(Tools(“CogPMAlignTool1”), CogPMAlignTool) Dim results As CogPMAlignResultCollection pmTool.Results ‘ 2. 将结果集合转换为可传输的字符串这里用简单拼接示例生产环境建议用JSON Dim outputString As String “” If results IsNot Nothing AndAlso results.Count 0 Then For i As Integer 0 To results.Count - 1 Dim r As CogPMAlignResult results(i) outputString String.Format(“Instance{0}: X{1:F3}, Y{2:F3}, Angle{3:F3}, Score{4:F3};”, _ i, r.TranslationX, r.TranslationY, r.Rotation, r.Score) Next Else outputString “NoMatch” End If ‘ 3. 将字符串赋值给一个String类型的输出端子 Outputs.ResultString outputString注意上述示例使用了简单的字符串拼接仅用于说明原理。在实际项目中尤其是结果字段多、结构复杂时强烈建议使用 JSON如通过Newtonsoft.Json库进行序列化以保证数据的结构化、可扩展性和易解析性。2. 环境准备与项目结构要实现可靠的串流需要一个清晰的二次开发环境。我们将构建一个典型的解决方案一个包含 VisionPro 工具块的“视觉处理服务端”和一个用于接收、显示数据的“客户端”。2.1 软件与环境要求组件推荐版本说明操作系统Windows 10/11 64-bitVisionPro 主要支持 Windows 平台。开发环境Visual Studio 2019/2022社区版即可。确保安装 .NET Framework 4.7.2 或以上开发包。VisionProVisionPro 9.0 或 9.5必须安装并确保 License 支持开发。安装时会自动集成 VS 的设计时组件。NuGet 包Newtonsoft.Json用于数据序列化。可通过 Visual Studio 的 NuGet 包管理器安装。网络库System.Net.Sockets.NET 框架自带用于 TCP 通信。2.2 解决方案与项目结构在 Visual Studio 中建议创建两个项目VisionProServer 项目类库或 Windows 窗体应用引用Cognex.VisionPro.dll,Cognex.VisionPro.Core.dll,Cognex.VisionPro.PMAlign.dll等根据使用的工具添加。功能承载 VisionPro 的CogJob或CogToolBlock负责图像采集、视觉处理并将结果通过 TCP Server 发送出去。关键文件VisionProcessor.cs封装 VisionPro 工具的加载、运行逻辑。TcpResultServer.cs封装 TCP 服务端监听客户端连接并发送结果数据。Program.cs如为控制台应用主入口启动视觉处理和 TCP 服务。ResultClient 项目控制台或 Windows 窗体应用引用Newtonsoft.Json.dll。功能作为 TCP 客户端连接服务器接收并解析 JSON 格式的结果数据进行显示、存储或转发。关键文件TcpResultClient.cs封装 TCP 客户端连接和数据接收逻辑。Program.cs主入口连接服务器并持续监听。项目间关系解决方案 (VisionProStreamingDemo) ├── VisionProServer (负责视觉处理与发送) │ ├── VisionProcessor.cs │ ├── TcpResultServer.cs │ └── Program.cs └── ResultClient (负责接收与显示) ├── TcpResultClient.cs └── Program.cs3. 核心实现从视觉处理到网络串流我们将分步实现一个最小可行系统。首先在 VisionPro 中设计一个简单的工具块并编写脚本然后在 C# 中加载运行它最后将结果通过 TCP 发送。3.1 步骤一在 VisionPro QuickBuild 中设计工具块与脚本创建工具块打开 VisionPro QuickBuild新建一个 Job。在 Job 编辑器中拖入一个CogToolBlock。添加工具双击打开CogToolBlock拖入一个CogPMAlignTool模板匹配工具和一个CogDataAnalysisTool数据分析工具用于运行脚本。配置输入输出端子在CogToolBlock的输入端子中添加一个CogImage8Grey类型的输入如InputImage用于接收图像。在输出端子中添加一个String类型的输出如ResultJson用于输出序列化后的结果。编写数据分析脚本在CogDataAnalysisTool的脚本编辑器中编写 VB.NET 脚本将CogPMAlignTool的结果转换为 JSON 字符串。这里需要引用 Newtonsoft.Json 库。由于 VisionPro 脚本环境可能无法直接添加 NuGet 包一个更稳妥的方法是在 C# 端进行序列化。但为了演示完整性我们展示在脚本中拼接关键数据的概念。‘ VisionPro ToolBlock 脚本示例 (简化版未使用JSON库) ‘ 获取工具 Dim pmTool As CogPMAlignTool CType(Tools(“CogPMAlignTool1”), CogPMAlignTool) Dim results As CogPMAlignResultCollection pmTool.Results ‘ 构建结果字符串 Dim sb As New System.Text.StringBuilder() sb.AppendLine(“[“) ‘ 开始一个JSON数组 If results IsNot Nothing AndAlso results.Count 0 Then For i As Integer 0 To results.Count - 1 Dim r As CogPMAlignResult results(i) If i 0 Then sb.AppendLine(“,”) sb.Append(“{“) sb.AppendFormat(“”“id””:{0},”, i) sb.AppendFormat(“”“x””:{0:F3},”, r.TranslationX) sb.AppendFormat(“”“y””:{0:F3},”, r.TranslationY) sb.AppendFormat(“”“angle””:{0:F3},”, r.Rotation) sb.AppendFormat(“”“score””:{0:F3}”, r.Score) sb.Append(“}”) Next Else sb.Append(“{}”) End If sb.AppendLine(“]”) ‘ 将结果字符串赋值给输出端子 Outputs.ResultJson sb.ToString() ‘ 同时可以输出一个简单的通过/失败标志 Outputs.IsPass (results IsNot Nothing AndAlso results.Count 0)保存工具块将CogToolBlock保存为一个.vpp文件如MyInspectionToolBlock.vpp。这个文件包含了所有的工具配置和脚本逻辑。3.2 步骤二在 C# 中加载并运行 VisionPro 工具块在VisionProServer项目中创建VisionProcessor类。using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using System; namespace VisionProServer { public class VisionProcessor { private CogToolBlock _toolBlock; public VisionProcessor(string toolBlockPath) { LoadToolBlock(toolBlockPath); } private void LoadToolBlock(string path) { try { // 使用CogSerializer加载保存的工具块文件 _toolBlock CogSerializer.LoadObjectFromFile(path) as CogToolBlock; if (_toolBlock null) { throw new InvalidOperationException(“加载的文件不是有效的CogToolBlock。”); } Console.WriteLine($“工具块加载成功: {path}”); } catch (Exception ex) { Console.WriteLine($“加载工具块失败: {ex.Message}”); throw; } } public (string resultJson, bool isPass) Run(CogImage8Grey image) { if (_toolBlock null) throw new InvalidOperationException(“工具块未加载。”); // 1. 设置输入图像 _toolBlock.Inputs[“InputImage”].Value image; // 2. 运行工具块 _toolBlock.Run(); // 3. 获取输出结果 // 注意Outputs集合中的项是object类型需要强制转换 string jsonOutput _toolBlock.Outputs[“ResultJson”].Value as string; bool passStatus (bool)_toolBlock.Outputs[“IsPass”].Value; // 4. 可选清理本次运行的输入避免内存累积对于静态图像处理 _toolBlock.Inputs[“InputImage”].Value null; return (jsonOutput, passStatus); } public void Dispose() { _toolBlock?.Dispose(); } } }3.3 步骤三实现 TCP 服务端进行数据串流创建TcpResultServer类它在一个后台线程中监听客户端连接并在每次视觉处理完成后将结果发送给所有已连接的客户端。using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; namespace VisionProServer { public class TcpResultServer : IDisposable { private TcpListener _listener; private ListTcpClient _connectedClients new ListTcpClient(); private readonly object _clientsLock new object(); private Thread _listenerThread; private bool _isRunning false; private int _port; public TcpResultServer(int port 5000) { _port port; } public void Start() { _isRunning true; _listener new TcpListener(IPAddress.Any, _port); _listener.Start(); Console.WriteLine($“TCP 服务器启动监听端口 {_port}”); _listenerThread new Thread(ListenerLoop); _listenerThread.IsBackground true; _listenerThread.Start(); } private void ListenerLoop() { while (_isRunning) { try { // 异步等待客户端连接 var client _listener.AcceptTcpClient(); Console.WriteLine($“客户端已连接: {client.Client.RemoteEndPoint}”); lock (_clientsLock) { _connectedClients.Add(client); } } catch (SocketException ex) when (ex.SocketErrorCode SocketError.Interrupted) { // 服务器停止时正常退出 break; } catch (Exception ex) { Console.WriteLine($“接受客户端连接时发生错误: {ex.Message}”); } } } // 关键方法将视觉处理结果广播给所有客户端 public void BroadcastResult(string resultJson) { if (string.IsNullOrEmpty(resultJson)) return; byte[] data Encoding.UTF8.GetBytes(resultJson Environment.NewLine); // 添加换行符作为消息分隔符 ListTcpClient clientsToRemove new ListTcpClient(); lock (_clientsLock) { foreach (var client in _connectedClients) { try { if (client.Connected) { NetworkStream stream client.GetStream(); stream.Write(data, 0, data.Length); stream.Flush(); } else { clientsToRemove.Add(client); } } catch (Exception ex) { Console.WriteLine($“向客户端 {client.Client.RemoteEndPoint} 发送数据失败: {ex.Message}”); clientsToRemove.Add(client); } } // 清理断开连接的客户端 foreach (var deadClient in clientsToRemove) { _connectedClients.Remove(deadClient); deadClient.Close(); Console.WriteLine(“已清理断开连接的客户端。”); } } } public void Stop() { _isRunning false; _listener?.Stop(); lock (_clientsLock) { foreach (var client in _connectedClients) { client.Close(); } _connectedClients.Clear(); } Console.WriteLine(“TCP 服务器已停止。”); } public void Dispose() { Stop(); } } }3.4 步骤四服务端主程序集成在Program.cs中我们将图像采集循环模拟或真实、视觉处理和网络发送串联起来。using Cognex.VisionPro; using Cognex.VisionPro.Display; using System; using System.Threading; namespace VisionProServer { class Program { static void Main(string[] args) { string toolBlockPath “C:\VisionProProjects\MyInspectionToolBlock.vpp”; int tcpPort 5000; using (var visionProcessor new VisionProcessor(toolBlockPath)) using (var tcpServer new TcpResultServer(tcpPort)) { tcpServer.Start(); // 模拟一个图像处理循环 CogImage8Grey testImage CreateTestImage(); // 假设的方法用于创建测试图像 int frameCount 0; while (frameCount 100) // 处理100帧后停止实际应为无限循环 { try { // 1. 运行视觉处理 var (resultJson, isPass) visionProcessor.Run(testImage); // 2. 在控制台显示 Console.WriteLine($“帧 {frameCount}: 通过{isPass}, 结果{resultJson}”); // 3. 通过网络广播结果 tcpServer.BroadcastResult(resultJson); } catch (Exception ex) { Console.WriteLine($“处理帧 {frameCount} 时发生错误: {ex.Message}”); } Thread.Sleep(100); // 模拟100ms的处理周期 } Console.WriteLine(“处理完成按任意键退出。”); Console.ReadKey(); tcpServer.Stop(); } } private static CogImage8Grey CreateTestImage() { // 这里应替换为真实的图像采集代码例如从相机、文件或模拟器获取 // 为示例我们创建一个空图像 return new CogImage8Grey(640, 480); } } }3.5 步骤五实现客户端接收程序在ResultClient项目中实现一个简单的 TCP 客户端来接收并解析数据。using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Net.Sockets; using System.Text; namespace ResultClient { class Program { static void Main(string[] args) { string serverIp “127.0.0.1”; int serverPort 5000; using (TcpClient client new TcpClient()) { try { client.Connect(serverIp, serverPort); Console.WriteLine($“已连接到服务器 {serverIp}:{serverPort}”); NetworkStream stream client.GetStream(); byte[] buffer new byte[1024]; StringBuilder messageBuilder new StringBuilder(); while (true) { int bytesRead stream.Read(buffer, 0, buffer.Length); if (bytesRead 0) { Console.WriteLine(“连接已断开。”); break; } string data Encoding.UTF8.GetString(buffer, 0, bytesRead); messageBuilder.Append(data); // 按换行符分割消息服务端发送时添加了Environment.NewLine string receivedText messageBuilder.ToString(); int newlineIndex; while ((newlineIndex receivedText.IndexOf(Environment.NewLine)) 0) { string oneMessage receivedText.Substring(0, newlineIndex); receivedText receivedText.Substring(newlineIndex Environment.NewLine.Length); ProcessMessage(oneMessage); } messageBuilder.Clear(); messageBuilder.Append(receivedText); } } catch (Exception ex) { Console.WriteLine($“通信发生错误: {ex.Message}”); } } Console.WriteLine(“客户端已退出按任意键关闭。”); Console.ReadKey(); } private static void ProcessMessage(string jsonMessage) { try { if (jsonMessage “{}” || jsonMessage “[]”) { Console.WriteLine(“收到空结果或无匹配结果。”); return; } // 使用 Newtonsoft.Json 解析 JArray results JArray.Parse(jsonMessage); Console.WriteLine($“收到 {results.Count} 个匹配结果:”); foreach (var item in results) { Console.WriteLine($“ ID: {item[“id”]}, X: {item[“x”]:F3}, Y: {item[“y”]:F3}, Angle: {item[“angle”]:F3}, Score: {item[“score”]:F3}”); } } catch (JsonReaderException) { Console.WriteLine($“无法解析的消息: {jsonMessage}”); } catch (Exception ex) { Console.WriteLine($“处理消息时发生错误: {ex.Message}”); } } } }4. 运行验证与结果分析启动服务端首先运行VisionProServer程序。控制台会显示“TCP 服务器启动监听端口 5000”并开始模拟处理图像每秒打印一次结果。启动客户端然后运行ResultClient程序。控制台会显示“已连接到服务器 127.0.0.1:5000”。观察数据流在服务端控制台你会看到持续的帧处理日志。在客户端控制台你会看到实时接收并解析出的 JSON 数据格式化的匹配结果信息被打印出来。模拟多客户端你可以启动多个ResultClient实例它们都能同时接收到服务端广播的相同结果数据这模拟了将检测结果同时发送给多个子系统如 HMI、MES、数据库的场景。预期输出示例客户端已连接到服务器 127.0.0.1:5000 收到 2 个匹配结果: ID: 0, X: 100.123, Y: 200.456, Angle: 0.785, Score: 0.987 ID: 1, X: 300.789, Y: 150.321, Angle: 1.571, Score: 0.912 收到 1 个匹配结果: ID: 0, X: 99.850, Y: 201.100, Angle: 0.790, Score: 0.980 收到空结果或无匹配结果。至此一个完整的 VisionPro 视觉处理结果“串流”系统就搭建完成了。数据从 VisionPro 工具块中产生经过 C# 程序封装通过 TCP 网络协议实时地传输到了外部客户端。5. 关键配置、参数与生产环境考量上述示例是一个最小化的演示。在实际工业项目中需要考虑更多细节以确保稳定性和可靠性。5.1 网络通信参数与优化参数/配置说明与建议端口号避免使用知名端口1024。生产环境建议使用配置项便于修改。心跳机制客户端和服务端应定期发送心跳包以检测连接是否存活及时清理死连接。消息分隔符使用固定的分隔符如换行符\n、特定字符序列。避免粘包/拆包问题。更复杂的协议可使用长度前缀。发送缓冲区调整TcpClient.SendBufferSize根据数据包大小优化。Nagle算法对于实时性要求高的场景考虑设置TcpClient.NoDelay true来禁用 Nagle 算法减少小数据包的发送延迟。重连机制客户端应实现自动重连逻辑在网络波动或服务端重启后能恢复连接。5.2 VisionPro 资源管理与性能工具块与图像释放在循环中确保每次处理完成后将不再需要的CogImage和中间结果显式置为null或调用Dispose()。长期运行的应用内存管理不当会导致泄漏。异常处理VisionPro 工具运行可能因图像质量、参数设置等原因抛出异常CogException。必须用try-catch包裹toolBlock.Run()并记录详细的错误信息如错误代码、来源工具避免整个服务崩溃。多线程如果处理速度跟不上采集速度考虑使用生产者-消费者模式。一个线程专用于采集图像并放入队列另一个线程从队列取出图像进行 VisionPro 处理和数据发送。注意VisionPro 的许多对象不是线程安全的通常建议每个处理线程拥有自己独立的CogToolBlock实例。5.3 数据格式与协议设计对于生产环境简单的 JSON 字符串加换行符可能不够。定义应用层协议[消息长度(4字节)][消息类型(1字节)][时间戳(8字节)][序列号(4字节)][JSON负载数据]这样客户端可以先读取固定长度的头部解析出消息长度再准确读取完整负载。使用二进制序列化对于超高频如 1000Hz或数据量大的场景JSON 序列化/反序列化可能成为瓶颈。可以考虑使用Protocol Buffers或MessagePack等二进制序列化方案显著减少数据体积和 CPU 开销。加入校验和在消息尾部加入 CRC 校验确保数据传输的完整性。6. 常见问题排查在开发和部署过程中你可能会遇到以下问题问题现象可能原因检查与解决思路客户端连接被拒绝1. 服务端未启动。2. 防火墙阻止了端口。3. IP 地址或端口号错误。1. 确认服务端程序已运行并打印出监听日志。2. 在服务端机器上用 netstat -ano连接成功但收不到数据1. 服务端BroadcastResult未被调用。2. 数据格式错误客户端解析失败。3. 网络流读写未正确处理消息边界粘包。1. 在服务端BroadcastResult方法入口打日志确认是否被触发及发送的数据内容。2. 使用网络调试工具如telnet或NetAssist直接连接服务端端口看是否能收到原始数据。3. 确保客户端按约定的分隔符或长度前缀正确分割消息。VisionPro 工具运行报错1..vpp文件路径错误或损坏。2. 输入图像为null或格式不符。3. VisionPro 工具参数未正确训练或配置。1. 检查文件路径尝试在 QuickBuild 中重新打开该文件确认其有效性。2. 检查CreateTestImage方法或真实采集代码确保生成的CogImage8Grey有效。3. 回到 QuickBuild 中用同一张测试图像运行工具块确保其能正常工作。检查 PMAlign 工具是否已训练模板。内存使用持续增长1. VisionPro 图像或结果对象未释放。2. TCP 客户端连接未正确关闭。1. 确保在每次循环结束后将CogImage和工具块输入值置null。考虑定期重启处理进程。2. 在服务端BroadcastResult中及时关闭并移除断开连接的TcpClient。数据传输延迟高1. 视觉处理本身耗时过长。2. 网络拥塞或配置不当。3. JSON 序列化/反序列化开销大。1. 使用CogStopwatch测量工具块运行时间优化视觉算法参数。2. 检查网络状况禁用 Nagle 算法 (NoDelaytrue)。3. 对于高频场景考虑改用二进制协议。7. 最佳实践与扩展方向7.1 架构升级建议采用消息队列在视觉服务端和多个消费客户端之间引入消息队列如 RabbitMQ、ZeroMQ 或 Redis Pub/Sub。视觉服务端作为生产者发布结果各个客户端作为消费者订阅。这解耦了服务端和客户端提供了更好的伸缩性和可靠性。定义标准接口将视觉处理模块VisionProcessor和数据发送模块TcpResultServer抽象为接口IVisionProcessor,IResultPublisher。这样未来可以轻松切换不同的视觉库或通信方式如改用 UDP、WebSocket、gRPC。加入配置中心将相机参数、工具块路径、通信端口、IP 地址等全部外置到配置文件如appsettings.json或数据库中便于现场调试和修改。7.2 数据与日志结构化日志使用Serilog或NLog等日志框架记录每一帧的处理状态、耗时、结果以及任何异常。日志应输出到文件并包含足够的上下文时间戳、帧号便于线上问题追踪。结果持久化重要的检测结果特别是 NG 结果应同时保存到数据库如 SQL Server, MySQL或时序数据库如 InfluxDB中并关联存储当时的原始图像或特征图像用于后续追溯和分析。图像缓存与转发如果客户端需要查看图像不应通过 TCP 传输大尺寸原始图像。可以改为发送图像在服务器上的存储路径如共享目录或使用专门的图像流服务如 RTSP进行分发。7.3 扩展功能远程控制可以让客户端通过另一个 TCP 通道或命令向服务端发送指令如“重新加载工具块”、“切换配方”、“触发单次采集”等实现双向交互。状态监控服务端应提供一个简单的 HTTP 服务或命名管道用于报告当前状态运行中、停止、错误、处理帧率、CPU 内存使用情况等方便集成到更大的监控系统中。与 PLC 通信许多工业场景需要与 PLC 交互。可以通过 OPC UA 库如OPCFoundation.NetStandard.Opc.Ua将 VisionPro 的处理结果如 OK/NG 信号、测量值直接写入 PLC 的标签实现更紧密的工控集成。通过以上步骤和考虑你可以将 VisionPro 从一个独立的视觉工具转变为一个能够稳定、高效输出结构化数据流的工业视觉服务核心从而更好地融入现代自动化生产系统。