干了几年机器视觉项目的人,基本都有过这样的经历:相机画面能出、算法流程也调得差不多了,结果卡在通讯配置上,要么相机死活枚举不上,要么PLC那边收不到结果,要么软触发OK一切换硬触发就各种奇怪问题。海康这套东西,单看每个模块都不复杂,但串在一起的时候,坑是一个接一个。
这篇东西写的是海康视觉系统的通讯配置,覆盖了工业相机与VisionMaster之间的连接、VisionMaster与PLC的数据交换、IO硬触发接线、以及脱离VisionMaster直接用SDK取流的方案。适合正在做视觉项目集成、或者在设备现场调试的人看,尤其是那种第一次把海康相机和第三方设备互通的新手,看完应该能少走不少弯路。
1. 先弄明白海康视觉系统的通讯链路到底有几段
1.1 一条产线级视觉项目的通讯全貌
一个完整的视觉检测或引导项目,通讯不是单一的一条线,而是多条链路拼接起来的。我习惯把它拆成三段来看:
- 第一段是相机到软件。相机把图像数据通过GigE、USB3.0或CameraLink接口传给VisionMaster或SDK。这段通讯解决的是“图像怎么进来”的问题。
- 第二段是软件到执行机构。VisionMaster把检测结果通过TCP/IP、Modbus、Profinet或IO信号发给PLC、机器人。这段解决的是“结果怎么送出去”的问题。
- 第三段是工程师到设备。也就是你做二次开发时,怎么从自己的程序里拉流、拿结果、控制相机。这段解决的是“我怎么集成它”的问题。
这三段跨度很大,每一段的技术栈都不一样。相机与软件之间主要看驱动和网络配置,软件与PLC之间涉及协议设计和地址映射,二次开发则要看SDK的接口规范和回调机制。大部分人翻车,都是因为没有先把这个三层架构在脑子里建立起来,遇到问题就往相机或软件上猜,结果排查半天,发现是IP地址不在同一网段。
1.2 三个高频通讯需求:采集、交互、集成
结合我做过的项目,海康视觉通讯的需求基本集中在三个场景上。
第一个场景:VisionMaster独立运行,采集+检测+输出一气呵成。这种最常见,用VM的流程编辑功能搭好方案,相机拍照,VM跑算法,然后把OK/NG信号通过IO或者通讯发给PLC。这种场景下的通讯配置重点在相机连接和VM的通讯模块设置。
第二个场景:VisionMaster脱机运行,由PLC或机器人主动触发。很多产线不是一直拍照的,而是传感器感应到产品到位后,PLC发一个信号触发相机拍照。这种场景下通讯的难点在触发链路:PLC信号怎么进相机,或者怎么通过软件触发VM执行,结果怎么返回给PLC。
第三个场景:自己写上位机程序,把海康相机当成一个数据源集成进来。比如用C#写Winform界面,实时显示相机画面,再做简单的图像处理。这种场景下你要面对的是海康的设备SDK,而不是VisionMaster。通讯的难点在取流方式的选择和回调绑定。
这三种场景没有谁优谁劣,完全看项目需求。但如果你的项目既用了VM又想做深度定制,那还会遇到VM二次开发接口的问题,就是后面会提到的GUID相关的东西。
2. 相机与VisionMaster之间的通讯,IP地址这关就刷掉一半人
2.1 GigE工业相机固定IP的正确打开方式
海康的工业相机里,GigE接口的出货量最大。GigE的好处是线缆长、带宽够、兼容性好,但代价就是它对IP配置极其敏感。很多人在VM里点“查找设备”找不到相机,或者找到了相机但采集报错,十有八九是IP地址的问题。
正确的操作是这样的。
先用网线把相机和电脑直连。注意,是直连,不是通过交换机。虽然通过交换机理论上也可以,但直连最省事,能排除掉很多干扰因素。然后打开网络适配器设置,把电脑的网卡IP改成固定IP。
海康GigE相机出厂默认IP段是192.168.1.64,子网掩码255.255.255.0。所以你电脑的IP要改成192.168.1.x,比如192.168.1.100,子网掩码255.255.255.0,网关可以不填。如果你不固定IP,让电脑自动获取,那大概率拿不到和相机同一网段的地址,视觉软件自然找不到设备。
提示:改完IP后,在CMD里ping一下相机的IP,比如 ping 192.168.1.64。如果能ping通,说明物理链路和网络层都没有问题,再往下查就是软件层面的设置;如果ping不通,先把网线、网卡驱动、IP地址这些底层问题解决再说。这个习惯能帮你省下大量排查时间。
2.2 相机枚举不出来的完整排查链路
如果相机在VisionMaster或者MVS(海康的相机管理软件)里枚举不到,按这个顺序排查,基本都能定位:
- 先看网卡状态。如果网卡显示未识别网络或者正在识别,先等几秒。有时候Windows切IP需要时间。
- 看相机指示灯。GigE相机的网口附近一般有Link指示灯,通电后闪烁说明物理连接正常。
- 用MVS单独试一下。VisionMaster找不到相机的时候,先打开MVS看能不能搜到。MVS是海康的相机驱动软件,它的设备列表里如果能看到相机,说明相机和驱动没问题,问题在VM那边的连接设置。
- 检查是否被防火墙拦截。这个很隐蔽,Windows防火墙会拦截GigE Vision协议使用的UDP广播,导致软件搜不到设备。临时关闭防火墙再试一次,如果好了,就把相关程序加入白名单。
- 检查网络类型。Windows会把网络分为公用网络和专用网络,公用网络默认开启更多安全限制。把网卡所在的网络类型改成专用网络,也能减少一些莫名奇妙的问题。
如果以上都试了还不行,换根网线试一下。工业现场网线断裂是常有的事,尤其是拖链里的线缆。
2.3 USB3.0接口和供电的坑
除了GigE,海康的小型相机和面阵相机里也有不少USB3.0接口的。USB3.0相机的好处是配置简单,即插即用,没有IP的概念,适合实验台调试或小批量测试场景。
但USB3.0相机有两个坑。
一个是供电。USB3.0口的标准供电是5V/900mA左右,如果相机功耗高,或者用了延长线、转接头导致压降,相机就会偶尔掉线、画面闪烁。遇到这种情况,不要先怀疑相机质量,看看是不是供电不足。海康原厂配的USB线一般比较扎实,自己在淘宝买的线要注意屏蔽和线径,别贪便宜。
另一个是带宽占用。USB3.0是共享式的总线结构,多台相机同时跑的时候,带宽会被瓜分。如果插在同一个USB控制器上,两台相机各跑到一半帧率就上不去了,不是相机不行,而是总线带宽就那么多。解决方法是把相机插到不同的USB控制器上,或者降低帧率、缩小ROI。
3. 和PLC通讯前先想清楚:谁做主、谁做从、数据怎么对齐
3.1 TCP/IP通讯里Server和Client的角色划分
VisionMaster和PLC通讯,最常用的是TCP/IP。TCP/IP的优势在于通用性强、不需要额外硬件网关、代码量也不大。但在配置之前,你得先想明白一件事:谁是Server,谁是Client。
这个不能拍脑袋,要看PLC那边支持什么。有些PLC的TCP通讯功能块默认是做Server的,它在某个端口上监听,等待外部连接;有些PLC的指令是做Client的,主动去连接外部设备。你得先看PLC程序的写法,然后让VM去适配它。
在VisionMaster里配置TCP通讯时,有两个角色要设置:模块本身是Server还是Client,以及通讯的数据区映射。VM 3.x版本里,在“通讯管理”里添加TCP Server或者TCP Client,配置好本地端口或远程IP端口,然后在变量绑定里把通讯接收的数据映射到全局变量。
这里有个常见的认知偏差:很多人以为VM一定要做Server,等PLC来连。其实反过来也可以。如果你的PLC那边做Server更方便,VM就做Client主动连过去。只要地址和端口对得上,通讯就能建立。反而是那种两边都默认自己是Server或者Client的情况,最容易折腾半天连不上。
3.2 触发信号与结果数据的协议设计
通讯建立起来只是第一步,真正体现水平的是通讯协议的设计。协议设计得不好,现场调试就是无穷无尽的相互扯皮。
以最常见的“PLC触发拍照,VM返回OK/NG”为例,我一般会定义这样一份数据表:
| 方向 | 数据字段 | 数据类型 | 字节长度 | 说明 |
|---|---|---|---|---|
| PLC→VM | 触发信号 | 字(Word) | 2 | 写1触发一次拍照,完成响应后PLC写0复位 |
| PLC→VM | 产品型号 | 字(Word) | 2 | 用于切换不同检测配方 |
| VM→PLC | 完成标志 | 字(Word) | 2 | 拍照检测完成后置1 |
| VM→PLC | 检测结果 | 字(Word) | 2 | 0=OK,1=NG |
| VM→PLC | 错误代码 | 字(Word) | 2 | 0无错误,其他为对应错误码 |
| VM→PLC | 测量值1 | 浮点数(Float) | 4 | 示例如宽度测量结果 |
这套数据表看着简单,但有几个关键点。
第一,触发信号一定要用边沿而不是电平。PLC写1触发后,等VM回完成标志,然后再写0复位。如果只是电平触发,PLC一直保持1,VM就会一直重复触发或者卡在判断条件里。第二,VM的脚本模块里要处理标志位的置位和复位时序。曾见过有人把触发信号和完成标志用同一个位,结果程序逻辑永远跑不对。第三,数据类型要严格约定,尤其是浮点数的高低字节顺序,不同PLC品牌之间可能会有差异,一定要在现场联调时用固定的测试值互相验证一下。
3.3 走Profinet/Modbus时要注意的适配性问题
TCP/IP虽然通用,但在某些行业里,PLC工程师更习惯Profinet或者Modbus。海康VM对这两种协议也有支持,不过适配难度比TCP/IP要高一截。
Profinet这种,本质上需要你把自己模拟成一个Profinet从站设备。VM里要装对应的Profinet通讯插件,然后配置设备名称和IP,再到PLC那边组态时添加这个从站。这里面有一个适配性的坑:PLC的Profinet主站对从站的GSD文件有版本要求,VM的插件版本要和PLC的软件版本兼容。之前遇到过西门子S7-1200和VM通讯时,PLC组态报设备故障,查了半天,发现是GSDML文件版本太旧,换了新版本才正常。
Modbus的话,相对容易一些,但要注意Modbus TCP和Modbus RTU的区别。VM可以通过网口走Modbus TCP,也可以通过串口走Modbus RTU。如果你选了RTU,那还要确认串口参数:波特率、数据位、停止位、校验位,这些必须和PLC完全一致。现场常见的故障就是波特率不一致,导致通讯时断时续。
在做协议选型时,我的建议是:如果你能主导方案,优先选TCP/IP,因为它最容易调试,Wireshark一抓包什么都清楚。如果客户现场明确指定了Profinet或者Modbus,那就提前做好适配性测试,别等到了现场才发现版本不兼容。
4. IO硬触发拍照,接线和软件参数必须两头对得上
4.1 海康相机IO接口的三种常用接法
除了用PLC通过通讯协议触发,另一种非常普遍的方案是IO硬触发。传感器检测到物体到位,输出一个电平信号给相机IO口,相机立刻曝光拍照。这种方式实时性最好,也不依赖通讯链路的稳定性,是高速产线上最常用的触发方式。
海康工业相机的IO口一般是6芯或者12芯的航空插头,不同型号定义略有不同,但通常包含Line0、Line1、Line2等IO线以及对应的GND。常见的接法有三种:
- PLC的NPN输出接相机IO。PLC输出低电平有效,传感器触发时信号线被拉到低电平,相机接收到下降沿后触发。这种接法需要注意PLC输出端和相机IO口的参考地必须共地。
- PLC的PNP输出接相机IO。输出高电平有效,触发时信号线被拉到高电平,相机接收到上升沿后触发。
- 传感器直接接相机IO。很多光电传感器也是NPN或PNP输出,可以直接接相机的IO输入,但要注意传感器的供电电压和相机IO的耐压范围,必要时加光耦隔离。
海康相机大多采用光电耦合隔离的IO输入设计,有一定的抗干扰能力,但这不代表你可以忽略接线规范。特别是共地问题,如果PLC和相机不共地,电平参考不一致,触发信号会极其不稳定。
4.2 触发源、极性、滤波这些参数怎么配
硬件接线只是第一步,软件里的参数配不对,线接好了也白搭。
在MVS的相机属性里,需要设置的主要参数有这几个:
- 触发源(Trigger Source):选择Line0、Line1等外部IO口,或者软触发(Software)、定时器触发。
- 触发极性(Trigger Polarity):上升沿还是下降沿。你接线时决定的高有效/低有效,要在这里对应上。
- 触发延时(Trigger Delay):从收到触发信号到开始曝光之间的延时。如果传感器安装位置和拍照位置有距离,可以在软件里微调这个延时。
- 滤波(Debounce/Filter):用来滤除信号上的毛刺干扰。工业现场的电磁干扰容易在IO线上感应出短脉冲,设置一个合适的滤波时间可以有效避免误触发。
举个例子。现场用NPN传感器,物体到位时输出低电平,Sensor感应到物体后信号线从高拉低。那你的触发极性就要选下降沿触发。如果你发现怎么调都不触发,先拿万用表量一下IO口的电压变化,确认信号确实到了相机端,再检查极性设置。这种问题很多时候不是相机配置问题,是传感器没对上或者线序接反了。
4.3 现场干扰导致的误触发与重影问题
IO硬触发最让人头疼的不是不触发,而是误触发。产线设备一启动,相机就开始莫名拍照,或者拍出来的图有重影。这种问题背后的原因基本是电磁干扰。
干扰从哪里来?最典型的源头是变频器、伺服驱动器和电机的动力线。这些大功率设备在启停时会产生强烈的电磁脉冲,通过空间辐射或共地回路耦合到相机的IO线上。如果IO线没有使用屏蔽双绞线,或者屏蔽层没有单端接地,那干扰信号就会直接叠加到触发信号上。
处理措施按优先级排序:
- IO线使用屏蔽双绞线,屏蔽层在控制器端单端接地。
- IO线和动力线分开走线槽,间距越远越好。实在无法避免交叉时,尽量垂直交叉。
- 在相机IO输入侧增加RC滤波,或者直接在相机参数里开启输入滤波。一般设置几微秒到几十微秒的滤波时间就能滤掉大部分毛刺。
- 检查现场接地系统,PLC、相机、传感器的参考地要接到同一等电位点,避免地环流。
之前调试过一条产线,相机每隔几秒钟就自己拍一张,查了整整一天。最后发现是旁边的伺服刹车电阻在作怪,IO线跟伺服动力线扎在一起走了30公分,然后伺服一刹车就触发一次。把线分开之后,问题立刻消失。这种问题,你说它是硬件问题还是软件问题?都不算,是布线规范问题。但视觉工程师不把关,就没人把关。
5. RTSP取流与SDK二次开发,脱离VisionMaster的通讯方案
5.1 海康网络摄像头的RTSP取流地址格式
不是所有海康视觉项目都是走工业相机+VisionMaster的路线。有些场景用的是海康的工业网络摄像机或者安防摄像头,尤其是做远程监控、图像采集这种应用时,RTSP取流是最直接的方式。
海康摄像头的RTSP地址格式是固定的:
rtsp://用户名:密码@IP地址:554/Streaming/Channels/101其中,用户名:密码是摄像头的登录凭证,554是默认RTSP端口,101表示主码流的第一个通道。如果你要拿子码流,地址改成102。如果摄像头有多个通道,前面的1表示通道号,后面的01表示码流类型。
比如:
rtsp://admin:admin123@192.168.1.64:554/Streaming/Channels/101需要注意的是,从2020年之后出厂的很多海康摄像机,默认开启了RTSP鉴权,直接用VLC或者浏览器访问RTSP地址时,会要求输入用户名密码。如果你在代码里用FFmpeg拉流,需要把用户名密码拼在URL里。如果修改过摄像头密码或者端口,记得在IPC的配置页面里确认一下实际参数。
RTSP这种方案适合什么场景呢?最容易想到的是监控、远程巡检,以及一些帧率要求不高的质量抽检。它不需要工业相机SDK,也不需要在电脑上装MVS,只要IPC和电脑在同一网络里,就能通过FFmpeg、OpenCV或者VLC拉流做后续处理,集成成本非常低。
5.2 C# Winform集成海康SDK的完整操作
如果你做的是上位机软件,想在Winform界面上显示海康相机的实时画面并且做控制,那就要用到海康的设备网络SDK了,也就是大家常说的HCNetSDK。这个SDK支持C、C++、C#等语言,C#版本在Winform里集成很顺畅。
基本步骤是这样的:
- 在海康官网下载设备网络SDK,解压后找到
hcnetsdk.dll和C#的封装类CHCNetSDK.cs。 - 把你项目平台改成x64(SDK目前以64位为主),把dll放到运行目录。
- 引入CHCNetSDK命名空间,调用
NET_DVR_Init()来初始化SDK。 - 设置连接参数
NET_DVR_DEVICEINFO_V30,调用NET_DVR_Login_V30()登录设备,IP地址、端口(默认8000)、用户名、密码填进去。 - 使用
NET_DVR_RealPlay_V40()开始实时预览,这个函数需要传入一个预览参数结构体,其中包含了你要把画面渲染到哪个窗口的句柄。 - 回调函数里可以拿到每一帧的YUV数据,用于录像或者图像处理。
- 最后用
NET_DVR_Logout()退出登录,NET_DVR_Cleanup()释放SDK。
这套操作里面,最容易出问题的点有三个。第一是回调解绑,如果在回调和主线程之间直接操作UI控件,Winform会崩,需要用委托切换到UI线程。第二是SDK版本和摄像头固件版本不兼容,有些新固件的摄像头用老SDK登录会返回错误码。第三是错误码查不到对应含义,遇到这种情况先调用NET_DVR_GetLastError()拿错误码,然后对着SDK文档里的错误码表逐一对照。
5.3 VisionMaster里的GUID到底怎么用
VisionMaster做二次开发时,会频繁碰到GUID这个概念。VM的流程、模块、变量,每样东西基本上都有一个对应的GUID来区分。
GUID在VM里的作用有两个层面。一是你写代码时要靠它来定位流程或模块,比如你要在外部程序里启动一个VM流程,就得先拿到这个流程的GUID;二是VM的全局变量、配方、通讯模块也需要用GUID来绑定。
那GUID在哪里获取?
最简单的办法是在VM软件里选中流程或者变量,在属性栏或者右键菜单里能看到唯一标识。如果你是用VM的二次开发接口,也可以通过遍历方法从流程列表里按名称找到对应的节点,再读取它的GUID。在实际项目中,我的做法一般是在调试阶段先用VM界面把流程搭好,然后把每个关键模块的GUID记录到一个配置表里,方便后续C#程序里调用时引用。
C#程序里操作VM的核心逻辑是:
- 通过
VisionMasterProxy或类似的接口类,创建VM的宿主对象。 - 加载你已经保存好的流程文件。
- 用GUID定位到流程中的相机、算法块、输出模块。
- 通过接口控制流程的执行或参数修改。
这一套搞下来,VM就成了一个可以被C#程序调用的视觉服务,执行结果可以拿回上位机里再做业务逻辑判断,集成灵活度比纯VM内部方案要高不少。
6. 通讯故障排查,与其瞎猜不如按链路逐段隔离
6.1 通用排查方法:从现象反推故障段位
通讯故障的排查,最忌讳的是东一榔头西一棒子。我自己的习惯是,不管什么现象,先判断是链路里哪一段的问题。
一个判断原则:如果相机画面出得来、检测能跑,那问题大概率不在前端;如果画面出不来,则优先看IP、驱动和线缆。
举个例子。VM里流程能跑,但PLC收不到结果。这种时候就不要去折腾相机了,直接抓TCP包看VM有没有发数据出来。如果VM根本没发,那就是VM里的通讯模块配置有问题,或者变量绑定不对。如果VM已经发了,PLC收不到,那去看PLC那边监听的IP端口对不对、数据格式对不对。
再比如。PLC触发信号给了,但VM流程没有启动。这种要分清触发方式。如果是IO硬触发,先看相机有没有被触发拍照——相机有没有出图就知道;如果相机出图了而VM没跑,那是VM里触发信号的映射问题;如果相机没出图,那去查IO信号有没有到相机端。
6.2 常用诊断工具与日志位置
工欲善其事,必先利其器。下面这些工具和日志位置,是排查海康视觉通讯问题时的必备工具:
| 工具/日志 | 用途 | 备注 |
|---|---|---|
| MVS设备列表 | 查看相机是否被系统识别 | 在MVS主界面直接看 |
| Wireshark | 抓取网络包分析通讯报文 | 过滤器可用tcp.port==xxx |
| CMD ping | 测试网络连通性 | ping不通就是物理层/网络层问题 |
| VM运行日志 | 查看流程执行过程和错误信息 | 在VM安装目录下的Log文件夹 |
| MVS日志 | 查看相机驱动和SDK的运行日志 | 在MVS安装目录下的Log文件夹 |
| 事件查看器 | 查看Windows层面的驱动和网络错误 | 设备管理器里网卡的属性也有详情 |
VM的日志是排查VM侧问题的一把钥匙。如果你流程明明是个“报错”状态,但界面上看不到详细信息,去日志目录把当天日志翻出来,能看到具体的错误代码和异常堆栈,定位问题快得多。
6.3 高频问题原因速查表
最后一节,列一个我实战中遇到的高频问题速查表,照着查比你翻手册快。
| 现象 | 最可能原因 | 处理方式 |
|---|---|---|
| VM找不到相机 | IP不在同一网段 | 固定电脑网卡IP为192.168.1.x |
| 相机掉线频繁 | 线路接触不良或供电不足 | 更换高质量网线/USB线,检查供电 |
| VM能与相机连接但不出图 | 触发模式设置了硬触发但无信号 | 切换为连续采集模式测试确认 |
| PLC触发后VM不执行 | 通讯变量映射错误或触发位没有变化 | 抓包确认数据到达,检查映射地址 |
| PLC收不到结果 | VM侧未发送或发送地址不对 | 检查发送变量的使能状态,确认远端IP端口 |
| 硬触发偶尔多拍 | IO信号被干扰 | 加滤波,检查屏蔽接地 |
| 画面卡顿 | 带宽不足或丢包 | 降低分辨率/帧率,检查网线质量 |
| SDK登录设备失败 | 端口不对或SDK版本过旧 | 确认设备端口,更新到最新SDK |
| RTSP拉流黑屏 | 码流类型不对或鉴权失败 | 确认用户名密码,试着用VLC验证地址 |
这不是一个完整的故障字典,但覆盖了80%的现场问题。遇到不在表里的故障,回到6.1的排查思路,从现象一层层往下剥,总能找到根因。
7. 一点个人经验:通讯配置是视觉项目里最能体现功底的环节
做视觉项目做了这些年,我越来越觉得,算法模型是视觉项目的上限,但通讯配置决定了下限。算法不行,至少你知道问题在哪里,可以慢慢调;通讯不通,整个设备就是瘫的,现场所有人都在等你一个信号,那种压力搞过的人都懂。
所以我的习惯是:项目一开始就在方案设计阶段把通讯链路规划好,而不是等设备装好了再临时配。具体包括:相机的IP规划(固定在哪个网段)、VisionMaster和PLC的角色分配、通讯协议字段表、IO接线的定义和线缆走向,全部在设计文档里定下来。到了现场,照图施工就可以,出问题也容易定位。
其次,一定要养成看日志的习惯。不管是MVS的日志还是VM的日志,它们里面记录的信息远比界面上看到的错误提示更详细。很多人出问题就重启,重启解决不了就重装,折腾一圈下来还不知道为什么。其实很多时候日志里已经写得很清楚了。
最后想说的是,海康的文档做得不算好,但生态大,网上能找到的资料和案例很多。遇到问题先检索再说,别急着开工具瞎试。把上面这套通讯配置的逻辑理解了,再去看官方文档,你会发现它其实也没那么绕。