目录
- 2.5.1 全局相机:全局相机设置参数的方法
- 2.5.2 全局相机:获取全局相机列表的方法
- 2.5.3 全局通信:通信管理中设备开启状态管理
- 2.5.4 全局通信:接收和发送数据的方法
- 2.5.5 全局变量获取和设置全局变量的方法
2.5.1 全局相机:全局相机设置参数的方法
描述
环境:VM4.0.0 + VS2015及以上
现象:全局相机一些参数如何设置或获取?
解答
1)全局相机连接状态的获取方法只有在图像源绑定相机里面全局相机才可获取绑定该相机的状态,获取全局相机中相机的连接状态是Open还是Close,监测相机是否掉线。获取绑定该相机图像源的"CameraName"参数的Value,会获取类似"0
0
0
0$$
C
l
o
s
e
"
的数据,对此数据按
Close"的数据,对此数据按
Close"的数据,对此数据按分割获取第一个数据,第一个值大于0表示连接,等于0表示未连接,如上数据表示该相机未连接。
C#
ImageSourceModuleTool imageSourceModule = (ImageSourceModuleTool)VmSolution.Instance["流程1.图像源1"];
tring i = null;
imageSourceModule.ModuParams.GetParamValue("CameraName", ref i);
2)全局相机触发源的获取和设置方法,触发源枚举值为枚举值就是 0 是LINE0, 1是LINE1,2是LINE2,3是LINE3, 7 是SOFTWARE。
C#
GlobalCameraModuleTool globalTool = VmSolution.Instance["全局相机1"] as GlobalCameraModuleTool;
//获取
string strVal11 = "";
globalTool.ModuParams.GetParamValue("TriggerSource", ref strVal11);
//设置
globalTool.ModuParams.SetParamValue("TriggerSource", "7");
3)全局相机设置曝光的方法
C#
GlobalCameraModuleTool tool = (GlobalCameraModuleTool)VmSolution.Instance["全局相机1"];
//获取
string strValue = "";
tool.ModuParams.GetParamValue("ExposureTime", ref strValue);
//设置
tool.ModuParams.SetParamValue("ExposureTime", "5000");
问题根因
不熟悉全局相机的一些参数配置
2.5.2 全局相机:获取全局相机列表的方法
描述
环境:VM4.0.0 + VS2015及以上
现象:如何获取全局相机列表并给图像源设置指定相机?
解答
1.获取全局相机列表,示例代码如下。
C#
// 全局相机下拉列表
private void vmGalobalCameraCombBox_DropDownOpened(object sender, EventArgs e)
{
try
{
var moduleList = ServerSDKManager.serverSDKManager.mSolutionManager.GetAllModuleList();
vmGalobalCameraCombBox.Items.Clear();
if (moduleList.HasValue)
{
foreach (var item in moduleList.Value.astModuleInfo)
{
if (item.nModuleType == 6)
{
string str = Encoding.UTF8.GetString(item.strDisplayName);
vmGalobalCameraCombBox.Items.Add(item.nNodeID.ToString() + " " + str);
}
}
}
}
catch (VmException ex)
{
System.Windows.MessageBox.Show("获取相机列表失败!" + ex.ToString());
}
}
2.图像源模块设置相机,代码如下。
C#
// 图像源绑定相机
private void BindingCamera_Click_1(object sender, RoutedEventArgs e)
{
try
{
var imageSourceModuleTool = (ImageSourceModuleTool)VmSolution.Instance["流程1.图像源1"];
imageSourceModuleTool.ModuParams.SetParamValue("CameraID",”1”);
System.Windows.MessageBox.Show("绑定成功!");
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("绑定失败!");
}
}
问题根因
相关接口没有对外开放,后续版本(VM4.2)会开放出来。
2.5.3 全局通信:通信管理中设备开启状态管理
描述
环境:VM4.0.0 + VS2015及以上
现象:通信管理中设备开启状态和如何通过代码设置,如何通过回调获取开启状态。
解答
- 调用通讯管理模块中SetParamValue()函数,其中nDeviceID表示设备列表中处于第几位,"ConnectState"参数设置true表示打开,false表示关闭。获取调用bIsDeviceConnect()函数,返还Bool类型的值。
C#
CommManagerModuleTool commManagerModule = (CommManagerModuleTool)VmSolution.Instance["通信管理1"];
//设置通讯设备的开启
commManagerModule.SetParamValue(1, "ConnectState", "true");
//获取通讯的开启状态
bool m= commManagerModule.bIsDeviceConnect(1);
- 通过回调获取设备是否开启
//注册回调函数
VmSolution.OnCommunicationStatusCallBackEvent += VmSolution_OnCommunicationStatusCallBackEvent;
private void VmSolution_OnCommunicationStatusCallBackEvent(ImvsSdkDefine.IMVS_COMMU_REPORT_DATA_INFO reportDataInfo)
{
int nType = reportDataInfo.nType;
byte[] btarr = ExternalCallHelper.IntPtr2Bytes(reportDataInfo.pData, reportDataInfo.nLen);//IntPtr转Byte,可使用Marshal.Copy
int len = btarr.Length;
string ID = btarr[1].ToString();
string Open = btarr[0].ToString();//开关状态,1表示开,0表示关
}
问题根因
不熟悉VM二次开发接口。
2.5.4 全局通信:接收和发送数据的方法
描述
环境:VM4.0 + VS2015及以上
现象:二次开发中,全局模块控件中的通信管理如何接收和发送数据 ?
解答
- 通过接口GetReadData来接收数据以及SetInt或者SetString来发送整型或字符串数据。其中,需要注意的有两点,一是“通信管理1”指的是当前运行的通信设备;二是接口函数SetString中的设备号2,则为通信管理中自动生成的设备序号。
//C#
CommManagerModuleTool commTool = (CommManagerModuleTool)VmSolution.Instance["通信管理1"];
if (null != commTool)
{
commTool.SetString(2, "abcd"); // 发送字符串型数据
int[] aIntVal = new int[3];
aIntVal[0] = 10;
aIntVal[1] = 11;
aIntVal[2] = 12;
commTool.SetInt(1, aIntVal, 0); // 发送整型数据
byte[] btData = null;
commTool.GetReadData(2, ref btData);//接收数据
}
- 通过回调来接收数据
C#
//注册回调函数,通讯接受事件回调
VmSolution.OnCommunicationRecvCallBackEvent += VmSolution_OnCommunicationRecvCallBackEvent;
private void VmSolution_OnCommunicationRecvCallBackEvent(ImvsSdkDefine.IMVS_COMMU_REPORT_DATA_INFO reportDataInfo)
{
string strMsg;
try
{
int nType = reportDataInfo.nType;
byte[] btarr = ExternalCallHelper.IntPtr2Bytes(reportDataInfo.pData, reportDataInfo.nLen);
int len = btarr.Length;
string ID = btarr[0].ToString();
byte[] vs = new byte[len - 2];
Array.Copy(btarr, 2, vs, 0, len - 2);
string ReceiveData = System.Text.Encoding.Default.GetString(vs);//数据
strMsg = ID + "号设备接受到:" + ReceiveData;
}
catch (VmException ex)
{
strMsg = "读取通信数据失败. Error Code: " + Convert.ToString(ex.errorCode, 16);
}
}
//发送字符串数据同样是使用commManagerModule.SetString ()接口
public void SendCommDeviceData(int Num, string SendMessage)
{
CommManagerModuleTool commManagerModule = (CommManagerModuleTool)VmSolution.Instance["通信管理1"];
string strMsg;
try
{
//获取通讯的连接状态
if (commManagerModule.bIsDeviceConnect(Num))
{
commManagerModule.SetString(Num, SendMessage);//给连接VM通讯的设备发送
strMsg = "发送信号:" + SendMessage + "给" + Num + "号通讯设备";
}
else
{
strMsg = Num + "号通讯设备未打开";
}
}
catch (Exception)
{
strMsg = "发送信号失败";
return;
}
}
问题根因
不熟悉全局模块中通信管理的相关接口和回调函数。
2.5.5 全局变量获取和设置全局变量的方法
描述
环境:VM4.0 + VS2015及以上
现象:如何获取和设置全局变量的值?
解答
获取方案中的全局变量:
C#
GlobalVariableModuleTool globalVar = VmSolution.Instance["全局变量1"] as GlobalVariableModuleTool;
if (globalVar != null)
string strX = globalVar.GetGlobalVar(“PhotoX”);//获取
globalVar.SetGlobalVar("PhotoX", "150.229");//设置
globalVar.SetGlobalVar("PhotoY", "225.651");
globalVar.SetGlobalVar("PhotoR", "23.12");
问题根因
不熟悉全局变量工具及其接口。