Mil学习之Msys

一、什么是Msys

以Msys为前缀的函数构成系统模块。系统模块支持系统的分配和查询。系统控件表示一个物理板,最常见的是一个成像帧捕获器。系统控件还允许您访问图形控制器和主机CPU。可以使用系统控件指定要访问的物理设备,并设置一些系统范围的设置。配置系统控件后,可以向应用程序中添加其他组件(如数字化仪控件),以控制设备的特定方面。

二、Msys常用功能

Mil学习之Msys_第1张图片

1. 初始化Msys环境

MsysAlloc(M_DEFAULT, M_SYSTEM_HOST, M_DEFAULT, M_DEFAULT, &MilSystem);
//...
MsysFree(MilSystem);

这里补充说明一下,MilSystem是指一个系统容器,通常来说初始化为 M_SYSTEM_HOST 就可以,但是当有采集的时候就有区别了。

这时需要针对不同的采集环境填入对应的类别ID。

如果你电脑上同时有GigE和USB3两种采集环境,在初始化MSys时需要使用两种类型的ID,GigE的ID为 M_SYSTEM_GIGE_VISION,USB3的ID为 M_SYSTEM_USB3_VISION。

不管是否为同一个采集环境,每一张采集卡一个System。

这里需要注意的是,有人误认为我有三张千兆网卡是不是分配一个Sys就可以?其实不是的,这里需要分配3个SysID,每一个采集卡一个ID。

2. 回调

示例的这个回调会在采集出现问题时用到,比如采集时相机断电了,马上重新上电Mil可以恢复采集。具体使用方法参照 MultiCamera.cpp,例子是C++,这里只是把改写 C# 的大概讨论写了出来。

class Example
{
	public static MIL_SYS_HOOK_FUNCTION_PTR CamPresentFunctionDelegate = new MIL_SYS_HOOK_FUNCTION_PTR(CamPresentFunction); 
	static MIL_INT CamPresentFunction(MIL_INT HookType, MIL_ID HookId, IntPtr h_hookDataPtr)
	{
		if (h_hookDataPtr != IntPtr.Zero)
		{
			MIL_INT IsCamPresent = 0, Number = 0;
			
			MIL.MsysGetHookInfo(MilSystem, HookId, MIL.M_CAMERA_PRESENT, ref IsCamPresent);
			MIL.MsysGetHookInfo(MilSystem, HookId, MIL.M_NUMBER, ref Number);
		}
		return 0;
	}
		
	public Example()
	{
		UserDataStruct userData = new UserDataStruct();
		GCHandle hData = GCHandle.Alloc(userData);
		IntPtr ptrData = GCHandle.ToIntPtr(hData);			
	
		
		MIL.MsysHookFunction(MilSystem, MIL.M_CAMERA_PRESENT, CamPresentFunctionDelegate, ptrData);
		//...
		MIL.MsysHookFunction(MilSystem, MIL.M_CAMERA_PRESENT + MIL.M_UNHOOK, CamPresentFunctionDelegate, ptrData);
	} 
 }

3. 查询Inquire

查询属性设置,使用很简单,查看Mil帮助文档吧,就不啰嗦了。

 

 

你可能感兴趣的:(Mil,学习)