工业相机“心跳”监测脚本(C# 版) 支持海康 / Basler / 堡盟工业相机

张开发
2026/4/20 5:15:21 15 分钟阅读

分享文章

工业相机“心跳”监测脚本(C# 版) 支持海康 / Basler / 堡盟工业相机
工业相机“心跳”监测脚本C# 版 支持海康 / Basler / 堡盟一套代码搞定多品牌在线状态监控“产线半夜停机发现相机离线了”“PLC 发了触发信号但相机没反应”“现场网络一抖相机就‘假死’”在工业视觉系统中相机的在线状态是整个检测流程的基石。然而不同品牌的相机 SDK 各有千秋如何用统一、高效、低开销的方式监控它们的“心跳”本文将为你揭晓答案并提供一份可直接复用的 C# 跨平台心跳监测脚本完美支持海康Hikvision、Basler、堡盟Baumer三大主流品牌。 一、什么是“心跳”为什么需要它心跳Heartbeat指定期向相机发送一个轻量级指令如读取设备信息并等待其响应。目的实时感知相机是否在线。提前预警网络中断或相机异常。避免因相机“假死”导致的产线长时间停机。关键点心跳操作必须极其轻量不能干扰正常的图像采集流程。 二、各品牌 .NET SDK 的心跳实现方式品牌SDK心跳方法注意事项海康 (Hikvision)MVS .NET SDKMyCamera.GetDeviceInfo()需要先打开设备调用后无需关闭。Baslerpylon .NETCamera.CameraInfo[CameraInfoKey.ModelName]可以在不开启流的情况下获取信息。堡盟 (Baumer)Baumer GAPI .NETcamera.GetModel()设备对象保持打开即可调用非常快。 三、核心代码跨品牌心跳监测器C#我们使用C# 8.0和接口 工厂模式将不同品牌的实现细节封装起来。1. 定义通用接口 (ICameraHeartbeat.cs)// ICameraHeartbeat.csusingSystem;publicinterfaceICameraHeartbeat:IDisposable{// 初始化连接boolConnect(stringdeviceID);// 执行一次心跳检查boolPing();// 获取品牌名称stringGetBrandName();}2. 海康相机实现 (HikHeartbeat.cs)// HikHeartbeat.csusingSystem;usingMvCamCtrl.NET;// 引用海康MVS SDKpublicclassHikHeartbeat:ICameraHeartbeat{privateMyCameracameranewMyCamera();privateboolisConnectedfalse;publicboolConnect(stringdeviceID){vardeviceListnewMyCamera.MV_CC_DEVICE_INFO_LIST();MyCamera.MV_CC_EnumDevices(MyCamera.MV_GIGE_DEVICE,refdeviceList);for(inti0;ideviceList.nDeviceNum;i){vardevInfo(MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(deviceList.pDeviceInfo[i],typeof(MyCamera.MV_CC_DEVICE_INFO));// 这里可以根据deviceID进行匹配例如通过IP或序列号if(/* 匹配逻辑 */){intnRetcamera.MV_CC_CreateDevice(refdevInfo);if(nRetMyCamera.MV_OK){nRetcamera.MV_CC_OpenDevice();isConnected(nRetMyCamera.MV_OK);returnisConnected;}}}returnfalse;}publicboolPing(){if(!isConnected)returnfalse;vardevInfonewMyCamera.MV_CC_DEVICE_INFO();intnRetcamera.MV_CC_GetDeviceInfo(refdevInfo);return(nRetMyCamera.MV_OK);}publicstringGetBrandName()Hikvision;publicvoidDispose(){if(isConnected){camera.MV_CC_CloseDevice();camera.MV_CC_DestroyDevice();isConnectedfalse;}}}3. Basler 相机实现 (BaslerHeartbeat.cs)// BaslerHeartbeat.csusingSystem;usingBasler.Pylon;// 引用pylon .NET SDKpublicclassBaslerHeartbeat:ICameraHeartbeat{privateCameracamera;privateboolisConnectedfalse;publicboolConnect(stringdeviceID){try{// 可根据deviceID如序列号精确查找cameranewCamera();camera.Open();isConnectedtrue;returntrue;}catch{returnfalse;}}publicboolPing(){if(!isConnected)returnfalse;try{// 访问任意CameraInfo属性即可触发通信_camera.CameraInfo[CameraInfoKey.ModelName];returntrue;}catch{returnfalse;}}publicstringGetBrandName()Basler;publicvoidDispose(){camera?.Close();camera?.Dispose();isConnectedfalse;}}4. 主监控服务 (HeartbeatService.cs)// HeartbeatService.csusingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;publicclassHeartbeatService{privatereadonlyICameraHeartbeatcamera;privatereadonlyintintervalMs;privateCancellationTokenSourcects;publicHeartbeatService(ICameraHeartbeatcamera,intintervalMs1000){this.cameracamera;this.intervalMsintervalMs;}publicasyncTaskStartAsync(){ctsnewCancellationTokenSource();_Task.Run(async(){while(!cts.Token.IsCancellationRequested){boolisAlivecamera.Ping();Console.WriteLine($[{camera.GetBrandName()}] 心跳:{(isAlive?正常:失败)});if(!isAlive){// TODO: 集成企业微信/邮件告警}awaitTask.Delay(intervalMs,cts.Token);}},cts.Token);}publicvoidStop()cts?.Cancel();}5. 使用示例// Program.csclassProgram{staticasyncTaskMain(string[]args){// 示例监控一台Basler相机varbaslerCameranewBaslerHeartbeat();if(baslerCamera.Connect(Your_Basler_Serial_Number)){varservicenewHeartbeatService(baslerCamera,1000);awaitservice.StartAsync();// 主程序继续运行...Console.ReadLine();service.Stop();}}}⚠️ 四、重要注意事项资源释放务必实现IDisposable并正确释放 SDK 对象防止句柄泄漏。线程安全心跳线程与主图像采集线程不要共享同一个相机实例。建议为心跳单独创建一个轻量级连接。频率选择心跳间隔建议500ms - 2000ms。过快会增加网络负担过慢则失去预警意义。堡盟特殊功能堡盟相机支持HeartbeatTimeout功能可配置相机在收不到心跳时自动断开连接这是最可靠的方式应优先使用。 结语一个健壮的心跳监测机制是工业视觉系统稳定运行的“定海神针”。通过本文提供的跨品牌 C# 模板你可以快速为你的项目加上这道保险。让每一台相机都“活”在你的掌控之中。

更多文章