项目场景:
相机的使用需要与对应的相机参数相配合,常用的相机参数如:曝光,增益,IO 等的设置等;
有的项目需要使用自定义的信息保存到Baumer工业相机中去,方便后期使用;
Baumer工业相机的UserSet功能就是相机的配置参数信息,有default,userset1,2,3可以保存载入
上一篇文章已经介绍了如何对使用Baumer相机的UserSet功能:
Baumer工业相机堡盟相机参数保存与 UserSet参数设置_格林威的博客-CSDN博客
有兴趣的小伙伴可以去了解下。
问题描述
项目中需要存储一些自定义的信息到相机中去,如标定信息、镜头信息等等:
此时Baumer相机自带的UserSet功能只能相机自有属性的参数,是不能保存自定义参数的。
例如:如下为自定义数据信息:
struct SendDataStructV1
{
// 版本号,从1开始
int version{1};
// 3组镜头及对应的标定数据(不需要全写)
// 规定镜头焦距是255时,没有相应的标定数据
unsigned char lensFocalLength1{ 255 };
unsigned char lensFocalLength2{ 255 };
unsigned char lensFocalLength3{ 255 };
double data1[30]{};
double data2[30]{};
double data3[30]{};
// 相机类型:1 = 2D;2 = 3D左相机;3 = 3D右相机
char cameraType{};
// 3D标定序列号
char calibrationSN[16]{};
// 红外序列号
char laserSN[16]{};
// 设备序列号
char deviceSN[16]{};
};
原因分析:
项目的核心需求是需要将相机增加额外一个功能作为Flash去保存载入自定义的数据,传统的相机的UserSet功能只能保存固定的相机自有参数,如曝光、增益、IO等的数据。
因此需要获取一个可以将相机作为寄存器进行读写的功能。
解决方案:
按照如下Baumer相机设置相关参数,Baumer工业相机固件版本3.0以上具有CustomData的功能,可以保存自定义的数据进行读写。
目前最大支持数据存储量为128Byte.
对应功能使用方式和其它参数获取方式相同;
存在开关模式,128个节点分别可保存两位16进制数据,如下图所示:
控制代码如下所示:
C++代码
m_pDevice->GetRemoteNode("CustomDataConfigurationMode")->SetString("On");//开启CustomData功能(数据为16进制)地址为0-127
m_pDevice->GetRemoteNode("CustomDataSelector")->SetInt(0);//选择CustomData地址0
m_pDevice->GetRemoteNode("CustomData")->SetInt(0x10);//对CustomData地址0写入0x10
bo_int64 CustomData_from_0 = m_pDevice->GetRemoteNode("CustomData")->GetInt();//对CustomData地址0读出0x10
m_pDevice->GetRemoteNode("CustomDataSelector")->SetInt(1);//选择CustomData地址1
m_pDevice->GetRemoteNode("CustomData")->SetInt(0x12);//对CustomData地址1写入0x12
bo_int64 CustomData_from_1 = m_pDevice->GetRemoteNode("CustomData")->GetInt();//对CustomData地址1读出0x12
m_pDevice->GetRemoteNode("CustomDataSelector")->SetInt(2);//选择CustomData地址2
m_pDevice->GetRemoteNode("CustomData")->SetInt(0x1E);//对CustomData地址2写入0x1E
bo_int64 CustomData_from_2 = m_pDevice->GetRemoteNode("CustomData")->GetInt();//对CustomData地址2读出0x1E
C#代码
m_pDevice.GetRemoteNode("CustomDataConfigurationMode ").Value ="On";//开启功能
m_pDevice.GetRemoteNode("CustomDataSelector").Value = 0; //选择CustomData地址0
m_pDevice.GetRemoteNode("CustomData").Value = 0x10; //对CustomData地址0写入0x10
int CustomData_from_0 = Device.GetRemoteNode("CustomData").Value;//对CustomData地址0读取数据
m_pDevice.GetRemoteNode("CustomDataSelector").Value = 1; //选择CustomData地址1
m_pDevice.GetRemoteNode("CustomData").Value = 0x12; //对CustomData地址1写入0x12
int CustomData_from_1 = Device.GetRemoteNode("CustomData").Value;//对CustomData地址1读取数据
m_pDevice.GetRemoteNode("CustomDataSelector").Value = 2; //选择CustomData地址0
m_pDevice.GetRemoteNode("CustomData").Value = 0x1E; //对CustomData地址2写入0x1E
int CustomData_from_2 = Device.GetRemoteNode("CustomData").Value;//对CustomData地址2读取数据