标准工业相机寄存器读写
海康提供给用户可以读写的寄存器分为两种,可以实现直接对寄存器读写,来满足用户一些特殊需求。

目前海康提供给用户可以读写的寄存器分为两种:

· GenICam协议定义的相机属性节点寄存器,用于相机参数设置与获取;
· 开放用户自定义寄存器,客户可以用于加密检验等;

此两种寄存器配合海康SDK提供的MV_CC_ReadMemory()和MV_CC_WriteMemory()可以实现直接对寄存器读写,来满足用户一些特殊需求。
注意:GenICam协议版本1.2、2.0协议之间,数据存储大小端存在差异性。GenICam1.2未规定大小端,相机默认小端,GenICam2.0规定为大端,因此用户需要去区分大小端)

一. 接口介绍

1.1 读寄存器接口介绍

MV_CAMCTRL_API int __stdcall MV_CC_ReadMemory ( IN void * handle,
void * pBuffer,
int64_t nAddress,
int64_t nLength )
参数:
handle [IN] 设备句柄
pBuffer [IN][OUT] 作为返回值使用,保存读到的内存值(GEV设备内存值是按照大端模式存储的,其它协议设备安装小端存储)
nAddress [IN] 待读取的内存地址,该地址可以从设备的Camera.xml文件中获取,形如xxx_RegAddr的xml节点值
nLength [IN] 待读取的内存长度


1.2 写寄存器接口介绍

MV_CAMCTRL_API int __stdcall MV_CC_WriteMemory ( IN void * handle,
const void * pBuffer,
int64_t nAddress,
int64_t nLength )
参数:
handle [IN] 设备句柄
pBuffer [IN] 待写入的内存值(注意GEV设备内存值要按照大端模式存储,其它协议设备安装小端存储)
nAddress [IN] 待写入的内存地址,该地址可以从设备的Camera.xml文件中获取,形如xxx_RegAddr的xml节点值
nLength [IN] 待写入的内存长度


二. 开放寄存器使用方法

海康标准工业相机,开放给用户存储的数据的起始地址为 0x00400000,总共提供的保存范围为 1k,也就是地址空间的范围为 0x00400000 ------0x00400000 + (1024 – 4) / 4,此时如果不操作保存节点,那么写入数据在掉电以后会丢失;如果操作保存节点,那么数据将存进 flash,上电初始化是会从 falsh 中读到内存中。

0x00400000寄存器默认存储int型数据,用户也可以在此寄存器中写char型数据,但是需要四个字节为一组大小端转换。


2.1 读写int型示例(C语言伪代码)

#pragma comment(lib, "wsock32.lib") //添加依赖库
//…..打开相机后,开始取流前…..//
unsigned int nWidth = htonl(640); // 小端模式转大端
int buff = 0 ;
nRet = MV_CC_WriteMemory(handle, (void *)nWidth, 0x00400000, 4L);
if (MV_OK != nRet)
{
printf("error: WriteMemory [%x]\n", nRet);
}
nRet = MV_CC_ReadMemory(handle, (void *)buff, 0x00400000, 4L);
if (MV_OK != nRet)
{
printf("error: ReadMemory [%x]\n", nRet);
}
else
{
Printf(“Width is[%d]\n”,ntohl(buff)); // 大端模式转小端,本地获取
}


2.2 读写char型示例

char chBuf[100] = { 0 };
char inBuf[100] = {"I love China 20201001"};
nRet = MV_CC_WriteMemory(handle, (void*)inBuf,0x00400000,100);
if (MV_OK != nRet)
{
printf("WriteMemory fail nRet = [%x]\n", nRet);
}
nRet = MV_CC_ReadMemory(handle, (void*)chBuf,0x00400000,100);
if (MV_OK != nRet)
{
printf("ReadMemory Fail nRet = [%x]\n", nRet);
}
else
{
int* p = (int*)chBuf;
for (unsigned int i = 0; i < 100; i = i + 4)
{
*p = ntohl(*p); //4个char型转换为int型进行大小端转换
p++;
}
printf("WriteMemory value :%s\n",inBuf);
printf("ReadMemory value :%s\n",chBuf);
}

2.3 断电保存,写进flash里面

nRet = MV_CC_SetCommandValue(handle, "UserDataSave"); //对写入flash的数据进行保存,不保存断电重启后擦除
if (MV_OK != nRet)
{
printf("UserDataSave Fail nRet = [%x]\n", nRet);
}


三. GenICam相机属性节点寄存器使用方法

GenICam的目标是为所有类型的相机提供一个统一的编程接口。无论相机使用的是哪种传输协议或者实现了哪些功能,编程接口都是一样的。海康标准工业相机遵循GenICam标准,因此可以通过直接读写相机寄存器的方法去对相机进行参数设置和获取。


3.1 相机节点寄存器查询

用户使用MVS保存GenICam XML获取相机xml文件,查询相机xml中的节点名,即可找到对应的寄存器类型以及地址

例如:相机的“Width”节点,在XML中找到对应的寄存器地址

3.2 GenICam节点名对于用户用途

1. 部分相机节点,使用海康通用接口访问,因为相关联寄存器较多,耗时比较长。可以通过直接读写对应寄存器地址来缩短耗时;
2. 问题排查时,获取XML文件后,通过抓包文件,查看用户对于寄存器的访问,更好的排查定位问题;


3.3 示例代码,参考“开放寄存器使用方法”


四. 注意事项

1、目前UserDataIndex网口定义是0-255,U口UserDataIndex定义是1-256(xml里面做了index偏移4个字节,实际地址偏移还是0-255),后续U口V1.6基线版本会修改 UserDataIndex定义是0-255;因为网口,U口寄存器起始地址相同,对于直接写地址0x00400000不影响。
2、网口相机2.X版本固件,GigE1.2版本,相机传入传出小端数据;3.X版本固件,GigE2.0版本,相机传入传出大端数据;
3、U口相机,默认存储小端数据,不需要大小端转换。
4、对于GenICam协议定义的相机属性寄存器,不同的类型寄存器相机内部处理机制不一致,比如int,float型需要大小端转换,String型不需要大小端转换。
5、对于节点定义是大端还是小端可以通过相机固件,XML文件定义,抓包DISCOVERY_ACK的Device Mode中Endianness来判断。


五. 大小端知识扩展

5.1 大端模式和小端模式

大端模式(Big-endian):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端,即正 序排列,高尾端;
小端模式(Little-endian):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端, 即逆序排列,低尾端;

  

5.2 大端模式和小端模式转换

uint32_t reversebytes_uint32t(uint32_t value){
return (value & 0x000000F4FU) << 24 | (value & 0x0000FF00U) << 8 | (value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24; }
将低8位(0~8位)左移24位,变成了高8位(24~32位),8~16位左移8位变成了(16~24位)。将原高8位和高16位右移,变成了新的低8位和低16位。
函数接口ntohl()和htonl()实现了上述代码相同的功能,因此代码中可以直接使用此接口。

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

机器视觉工程安装电磁兼容指导书

下一篇

工业相机参数设置获取通用接口调用说明

评论请先登录 登录
全部评论 0
Lv.0
1
关注
375
粉丝
75
创作
862
获赞
相关阅读
  • [共享学习]VM之角度纠正问题
    2024-03-07 浏览 0
  • 机器视觉菜鸟指南
    2024-02-29 浏览 0
  • 基于C++OpenCV实现VisionMaster中的“直线边缘缺陷检测”
    2024-03-04 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器