【VM服务管家】VM4.0平台SDK_2.2 模块API类

news2024/11/28 20:45:31

目录

  • 2.2.1 方案保存:方案高速保存的方法
  • 2.2.2 Group模块:Group输入输出图像数据的方法
  • 2.2.3 模块操作类:设置输入图像、参数和ROI的方法
  • 2.2.4 图像源:通过图像源模块接口设置图像输入的方法
  • 2.2.5 图像源:通过SDK传入相机图像的方法
  • 2.2.6 输出图像:获取渲染图像数据的方法
  • 2.2.7 N点标定:清空标定点、生成标定文件和渲染轨迹的方法
  • 2.2.8 耗时统计:流程与模块运行耗时的获取方法
  • 2.2.9 资源释放:方案资源释放的方法
  • 2.2.10 条件检测:条件检测模块设置范围的方法
  • 2.2.11 流程ID:通过流程名获取流程ID的方法
  • 2.2.12 几何创建:绘制形状的方法
  • 2.2.13 运行间隔:设置和获取流程运行间隔的方法
  • 2.2.14 分支字符:控制调试模式开关的方法
  • 2.2.15 模块禁用:模块禁用的方法
  • 2.2.16 Group循环:获取Group循环数据结果的方法

2.2.1 方案保存:方案高速保存的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:二次开发软件调用VmSolution.Export(string Path)接口保存方案,保存时间较长。
解答
保存方案将接口参数bDisplayProgress置为false,或放在线程里调用。示例代码如下:

C#
VmSolution.Export(tb_SolPath.Text, "", false);

问题根因
不熟悉方案的相关接口

2.2.2 Group模块:Group输入输出图像数据的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:Group 模块可以设置输入和输出,那如何进行图像数据的输入和输出?
解答
Group相当于一个模块,实例化Group,通过相关接口可以设置图像数据的输入和输出。
1)设置图像数据的输入,下面是以独立的Group为例,导入一个后缀为gro的独立Group。

C#
IMVSGroupTool group=null;
//加载group模块
group = IMVSGroupTool.LoadGroup(@"C:\Users\zhouyigen\Desktop\LackImage.gro", "");
//利用OpenCV的读图方法,读取图像
Mat matImage = Cv2.ImRead(@"C:\Users\zhouyigen\Desktop\Demo(2)\smile.png",ImreadModes.Grayscale);
//实例化VM接口可接收的图像类型
InputImageData StImg = new InputImageData();
//设置图像参数
StImg.Names.DataName = "Imagein";
StImg.Names.HeightName = "ImageHeightin";
StImg.Names.WidthName = "ImageWidthin";
StImg.Names.PixelFormatName = "ImagePixelFormatin";
StImg.Height = matImage.Rows;
StImg.Width = matImage.Cols;
StImg.Pixelformat = ImagePixelFormat.IMAGE_PIXEL_FORMAT_MONO8;
StImg.DataLen = (uint)(matImage.Width * matImage.Height);
StImg.Data = new byte[matImage.Width * matImage.Height];
 
//将读取到的图像拷贝给StImg
Marshal.Copy(matImage.Data, StImg.Data, 0, matImage.Width * matImage.Height);
// 设置图像数据
group.ModuParams.SetInputImage(StImg); 
//绑定渲染源
vmRenderControl1.ModuleSource = group;

也可以将流程中的Group实例化,再使用流程的SetInputImage接口。流程中的Group中没有图像源模块,Group的输入设置如下图,Group中的其他模块需要选择图像输入源,需要提前建立联系。
在这里插入图片描述

2)获取输出的图像数据
可以参考2.4.1,给Group中添加一个输出图像模块,通过输出图像模块来获取输出的图像数据byte。
也可以配置Group的显示设置,订阅输出图像模块,再依照2.4.1中获取流程中的图像数据方法,Imgaeout才是真正的图像名称。像素格式17301505为MONO8灰度图,像素格式 35127316为RGB24彩色图。
在这里插入图片描述

问题根因
不熟悉针对Group模块如何输入输出图像数据

2.2.3 模块操作类:设置输入图像、参数和ROI的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:每个模块类型命名不同,但拥有部分共同的相关操作。
解答
1 给模块设置输入图像,对应VM中模块的图像输入源功能,以圆查找模块为例 。注意:设置输入参数(基本参数),参数配置窗口界面不会显示所设置的参数,此时模块运行,参数永久有效,流程运行,参数一次有效;设置运行参数,参数配置窗口界面会显示所设置的参数,此时模块和流程运行,参数都永久有效。
在这里插入图片描述

C#
//VisionMaster4.0.0\Development\V4.0.0\ComControls\bin\x64中包含OpenCvSharp.dll
Mat matImage = Cv2.ImRead(path, ImreadModes.Grayscale);//使用opencv读图,也可以使用BitMap读图
InputImageData StImg = new InputImageData();
StImg.Names.DataName = "InImage";//只能使用默认名称InImage
StImg.Names.HeightName = "InImageHeight";//默认InImageHeight
StImg.Names.WidthName = "InImageWidth";//默认InImageWidth
StImg.Names.PixelFormatName = "InImagePixelFormat";//默认InImagePixelFormat
StImg.Height = matImage.Rows;
StImg.Width = matImage.Cols;
StImg.Pixelformat = ImagePixelFormat.IMAGE_PIXEL_FORMAT_MONO8;
StImg.DataLen = (uint)(matImage.Width * matImage.Height);
StImg.DataLen = (uint)(matImage.Width * matImage.Height);
Marshal.Copy(matImage.Data,StImg.Data,0,matImage.Width*matImage.Height);
IMVSCircleFindModuTool Circle = (IMVSCircleFindModuTool)process["圆查找1"];
Circle.ModuParams.SetInputImage(StImg);

2 配置参数,实例化模块为tool,然后设置tool.ModuParams的属性。这里以圆查找模块为例。如果没有相应的属性,则需要联系销售进行定制。

C#
IMVSCircleFindModuTool tool = (IMVSCircleFindModuTool)VmSolution.Instance[“流程1.圆查找1”];
tool.ModuParams.RadNum=10;// 卡尺数量

3 设置ROI,这里以DL字符识别CPU模块为例,代码如下,其中0.5f是比例关系(将图像看作1)。

C#
public void OCRROISetFunc(ref VMControls.WPF.Release.VmRenderControl vmRenderControl1)
{
    /OCRROISET
    MVSOcrDlModuCTool iMVSOcrDlModuCTool = (IMVSOcrDlModuCTool)VmSolution.Instance["流程1.DL字符识别C1"];

    RoiBox roiBox = new RoiBox();
    roiBox.bRoiType = (byte)RoiType.ROI_TYPE_BOX;
    roiBox.fCenterX = 0.5f;
    roiBox.fCenterY = 0.68f;
    roiBox.fWidth = 0.5f;
    roiBox.fHeight = 0.1f;

    IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(roiBox));
    Marshal.StructureToPtr(roiBox, ptr, false);
    iMVSOcrDlModuCTool.ModuParams.SetBinaryData("RoiType", ptr, (uint)Marshal.SizeOf(roiBox));
    vmRenderControl1.ModuleSource = iMVSOcrDlModuCTool;
}

4 C++中获取ROI、设置ROI、设置多个ROI、设置屏蔽区、设置多个屏蔽区的方法

1)//拿到指向圆查找模块的指针
IMVSCircleFindModuTool *CircleFindModu=static_cast((*m_pVmSol)["流程1.圆查找1"]);
ROI_BOX roiBox = { 0 };
unsigned int nLen=0;
//获取ROI 
CircleFindModu->GetParamObj()->GetBinaryData("RoiType",&roiBox,sizeof(roiBox), nLen);

2)//圆卡尺类型ROI
ROI_CIRCLECALIPER RoiCircle = { 0 ,0,0 ,0 ,0 ,0,0,0,0,0};
unsigned int nLen ;
RoiCircle.bRoiType = ROI_TYPE_CIRCLECALIPER;
RoiCircle.bVersion = 0;
RoiCircle.fCenterX = 0.635;//圆心X/图像宽
RoiCircle.fCenterY = 0.59;//圆心Y/图像高
RoiCircle.fOutterRadius = 0.035;//半径/图像宽
RoiCircle.fStartAngle = 0;
RoiCircle.fEndAngle = 0;
RoiCircle.fWidth = 0.0408;//卡尺高/图像宽
RoiCircle.fHeight = 0.0132;//卡尺宽/图像高
RoiCircle.nNum = 60;//卡尺数
//设置ROI
CircleFindModu->GetParamObj()->SetBinaryData("RoiType",&RoiCircle,sizeof(RoiCircle));

3)//获取指向BLOB分析模块的指针
IMVSBlobFindModuTool *blobFindMou=static_cast
((*m_pVmSol)["流程1.BLOB分析1"]);
//设置ROI数据
ROI_BOX roiBox[2] = { 0 };
roiBox[0].bRoiType = ROI_TYPE_BOX;
roiBox[0].bVersion = 0;
roiBox[0].fAngle = 0;
roiBox[0].fCenterX = 0.2;
roiBox[0].fCenterY = 0.3;
roiBox[0].fHeight = 0.1;
roiBox[0].fWidth = 0.15;
roiBox[1].bRoiType = ROI_TYPE_BOX;
roiBox[1].bVersion = 0;
roiBox[1].fAngle = 0;
roiBox[1].fCenterX = 0.4;
roiBox[1].fCenterY = 0.6;
roiBox[1].fHeight = 0.2;
roiBox[1].fWidth = 0.3;
//拷贝整合
char *temp = new char[sizeof(ROI_BOX) * 2]{0};
memcpy(temp, &roiBox[0], sizeof(ROI_BOX));
memcpy(temp + sizeof(ROI_BOX), &roiBox[1], sizeof(ROI_BOX));
//设置多个ROI
blobFindMou->GetParamObj()->SetBinaryData("RoiType",temp,sizeof(ROI_BOX) * 2);

4)//
ROI_POLYGON polygon = { 0 };
polygon.bRoiType = ROI_TYPE_POLYGON;
polygon.bVersion = 0;
polygon.nVertexNum = 4;
//设置屏蔽区的4个点
polygon.stVertexPoints[0] = { 0.3,0.125 };
polygon.stVertexPoints[1] = { 0.575,0.087 };
polygon.stVertexPoints[2] = { 0.712,0.799 };
polygon.stVertexPoints[3] = { 0.31,0.8 };
//设置屏蔽区
blobFindMou->GetParamObj()->SetBinaryData("ExternRoiType",&polygon,38);

5)//
polygon[1].bRoiType = ROI_TYPE_POLYGON;
polygon[1].bVersion = 0;
polygon[1].nVertexNum = 4;
polygon[1].stVertexPoints[0] = { 0.6f,0.125f };
polygon[1].stVertexPoints[1] = { 0.8f,0.087f };
polygon[1].stVertexPoints[2] = { 0.4f,0.799f };
polygon[1].stVertexPoints[3] = { 0.3f,0.8f };
//拷贝整合
char* temp=new char[76];
memcpy(temp,&polygon[0],38);
memcpy(temp+38,&polygon[1],38);
//设置多个屏蔽区
blobFindMou->GetParamObj()->SetBinaryData("ExternRoiType",temp,76);

其中38根据结构体内容计算字节数1+1+4+(4+4)*2:
在这里插入图片描述
在这里插入图片描述

问题根因
不熟悉如何对模块进行一些操作

2.2.4 图像源:通过图像源模块接口设置图像输入的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:在VM中,可以通过如下图标给图像源模块输入本地图像,那如何通过代码的方式给图像源模块设置图像的输入呢?
解答
知识点:图像源模块的输入图像分8位图和24位图,但图像算子只能处理8位图。
1)当图像源模块输入图像为24位图,可以将像素格式选择MONO8,此时运行流程,图像源的输出图像为8位图,圆查找模块的图像输入源则选择图像源的图像数据。
在这里插入图片描述
在这里插入图片描述

2)当图像源模块输入图像为24位图,也可以将像素格式选择位RGB24,并且打开输出Mono8使能,此时运行流程,图像源的输出图像为24位图,并多了一个灰度图像数据,圆查找模块的图像输入源则选择图像源的灰度图像数据。
在这里插入图片描述
在这里插入图片描述

图像源接口的使用:
1 )图像源类型为本地时LocalImage,此功能是VM软件平台添加单个图像的实现,若要添加图像文件夹,则是使用SetParamValue接口来遍历文件夹中所有图像。
在这里插入图片描述

C#
ImageSourceModuleTool imageSourcTool = (ImageSourceModuleTool)VmSolution.Instance["流程1.图像源1"];
imageSourcTool.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.LocalImage;
//给本地图增加图像
imageSourcTool.ModuParams.SetParamValue("AddImage", "E:\\VSVM4.0\\1.bmp");
//给本地图删除图像
imageSource.ModuParams.SetParamValue("DeleteImage","C:\\Users\\zhouyigen\\Desktop\\2.jpg");
//给本地图清空图像
imageSource.ModuParams.SetParamValue("ClearImage", "");  

DirectoryInfo dir = new DirectoryInfo("E:\\VSVM4.2\\图像\\新建文件夹");
FileInfo[] dirinfo = dir.GetFiles();
for (int i = 0; i < dirinfo.Length; i++)
{
    string str= dirinfo[i].FullName;
    imageSourcTool.ModuParams.SetParamValue("AddImage", str);
}

2) 图像源类型为SDK时,通过SetImagePath接口或者SetImageData接口,其中ImageBaseData类型,注意其像素格式Pixelformat,ImagePixelFormat.IMAGE_PIXEL_FORMAT_MONO8 为灰度图,ImagePixelFormat.IMAGE_PIXEL_FORMAT_RGB24 为彩色图。

C#
imageSourcTool.ModuParams.ImageSourceType = ImageSourceParam.ImageSourceTypeEnum.SDK;
imageSourcTool.SetImagePath("E:\\VSVM4.0\\1.bmp");
imageSourcTool.SetImageData(imageBaseData);//参数类型为ImageBaseData

问题根因
不熟悉如何通过图像源模块接口设置输入图像

2.2.5 图像源:通过SDK传入相机图像的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:在2.2.4中介绍,当图像源类型为SDK时, 可以使用SetImagePath接口或者SetImageData接口给图像源模块输入图像,那么如何使用SetImageData传入相机图像呢?
解答
1)可以手动将图像源类型设为SDK,也可以通过代码设置ImageSourceType属性为SDK
在这里插入图片描述

2)使用海康相机SDK取流,输入图像源模块示例代码如下:

C#
private void SetImageTest()
{
	MyCamera m_MyCamera = new MyCamera();
	try
	{
		// ch:开始采集 | en:Start Grabbing 
		int nRet=m_MyCamera.MV_CC_StartGrabbing_NET();
		if (MyCamera.MV_OK != nRet){return;}
		//1.海康相机SDK截取帧
		MyCamera.MV_FRAME_OUT stFrameOut = new MyCamera.MV_FRAME_OUT();
		nRet = m_MyCamera.MV_CC_GetImageBuffer_NET(ref stFrameOut, 1000);        
		if (nRet == MyCamera.MV_OK)
		{
			//2.申请byte[]            
			byte[] m_BufForDriver1 = new byte[stFrameOut.stFrameInfo.nFrameLen];
			//3.海康相机取流 指针转byte[]
			Marshal.Copy(stFrameOut.pBufAddr, m_BufForDriver1, 0, ((int)stFrameOut.stFrameInfo.nFrameLen));
			//4.byte[]转ImageBaseData,其中1也可以写成ImagePixelFormat.IMAGE_PIXEL_FORMAT_MONO8
			ImageBaseData stInputImageInfo = new ImageBaseData(m_BufForDriver1, stFrameOut.stFrameInfo.nFrameLen, stFrameOut.stFrameInfo.nWidth, stFrameOut.stFrameInfo.nHeight, 1);
			//5.图像源设置ImageBaseData图像数据
			ImageSourceModuleTool imageSourceModuleTool = (ImageSourceModuleTool)VmSolution.Instance["流程1.图像源1"];
			imageSourceModuleTool.SetImageData(stInputImageInfo);
			//流程执行
			process.Run();
		}
		// ch:停止采集 | en:Stop Grabbing
		nRet = m_MyCamera.MV_CC_StopGrabbing_NET();
		if (nRet != MyCamera.MV_OK)
	}
	catch (VmException ex)
	{
		return;
	}
}
C++
MV_FRAME_OUT_INFO_EX stImageInfo = { 0 };
//相机获取一帧图像
nRet = m_pcMyCamera->GetOneFrameTimeout(m_pGrabBuf, m_nGrabBufSize, &stImageInfo, 1000);
ImageSourceModuleTool * pObject = (ImageSourceModuleTool *)(*m_pVmSol)["流程1.图像源1"];
if (NULL == pObject) return;
ImageBaseData pstImgData = { 0 };
pstImgData.ImageData = m_pGrabBuf;
pstImgData.DataLen = stImageInfo.nWidth * stImageInfo.nHeight;
pstImgData.Width = stImageInfo.nWidth;
pstImgData.Height = stImageInfo.nHeight;
pstImgData.Pixelformat = PIXEL_FORMAT_MONO8;
pObject->SetImageData(&pstImgData);
m_pVmSol->Run();

问题根因
不熟悉如何通过图像源模块接口SetImageData传入相机图像

2.2.6 输出图像:获取渲染图像数据的方法

描述
环境:VM4.0.0 + VS2015及以上
现象: 如何获取渲染图像的数据?
解答
1)存图到本地:在输出图像模块中,像素格式可选择为RGB24或者MONO8,渲染设置页面中可以订阅相应模块,获取渲染结果。保存渲染图到本地时,输出图像模块可以打开存图使能,选择存图路径和文件命名,从而将渲染图保存到指定路径中。提示:渲染控件也有存图接口,可以保存渲染图和原图到指定路径中,注意VM4.0中渲染控件存图为24位图。
在这里插入图片描述
在这里插入图片描述

2)获取渲染图像数据:通过实例化输出图像模块,从而获取图像数据byte。或者通过流程输出设置订阅输出图像模块,从而获取流程输出图像数据byte。以通过模块输出为例的代码如下。详情可以参考2.4.1,像素格式17301505为MONO8灰度图,像素格式 35127316为RGB24彩色图。

C#
SaveImageTool saveImage=(SaveImageTool)VmSolution.Instance[“流程1.输出图像1”];//实例化输出图像模块
Var saveImageResult=saveIamge.ModuResult.OutputImage; 
byte[] imageData= saveImageResult.ImageData;
int imagePixelformat= saveImageResult.Pixelformat;// 35127316为彩色图

问题根因
不熟悉如何获取渲染图像数据

2.2.7 N点标定:清空标定点、生成标定文件和渲染轨迹的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:通过代码清空N点标定模块中标定点的数据,通过代码生成标定文件。
解答
1)清空标定点、生成标定文件
定义需要清空标定点的N点标定模块,设置模块的ModuParams.SetParamValue()中"Clear"参数为空;生成标定文件,设置模块的ModuParams.SetParamValue()中SaveCaibPath为指定路径。

C#
IMVSNPointCalibModuTool iMVSNPoint = (IMVSNPointCalibModuTool)VmSolution.Instance["流程1.N点标定1"];
//清空标定点
iMVSNPoint.ModuParams.SetParamValue("Clear" , "");
//生成标定文件
iMVSNPoint.ModuParams.SetParamValue("SaveCalibPath" , path);

需要注意的是,用代码保存标定文件时需要先判断当前标定的状态,是否标定完,不然在未标定完就保存标定文件就会报错保存失败。

C#
//获取标定状态
IMVSNPointCalibModuTool iMVSNPoint = (IMVSNPointCalibModuTool)VmSolution.Instance["流程1.N点标定1"];
int i = too.ModuResult.ModuStatus;
if(i ==1){ }

2)渲染控件渲染N点标定轨迹
N点标定渲染显示和常规的模块有所不同,除了将N点标定模块赋值给渲染控件外还需要设置背景图像。示例代码如下

C#
vmRenderControl1.ModuleSource = N点标定模块;
VmIO CalibIO = VmSolution.Instance["流程名.图像源名.ImageData"] as VmIO;
vmRenderControl1.SetBackgroundImage(CalibIO);

问题根因
不熟悉VM二次开发接口。

2.2.8 耗时统计:流程与模块运行耗时的获取方法

描述
环境:VM4.0.0 + VS2015及以上
现象:为计算总耗时间,需要了解如何获取流程或某个模块的运行时间。
解答
首先对流程、模块或算法进行实例化,然后调用接口ProcessTime(流程耗时)、ModuleTime(模块耗时)、AlgorithmTime(算法耗时)查看耗时,以查看流程1及圆查找运行时间为例,代码如下:

C#
VmProcedure vmProcedure = (VmProcedure)VmSolution.Instance["流程1"];
IMVSCircleFindModuTool circleFind = (IMVSCircleFindModuTool)VmSolution.Instance ["流程1.圆查找1"]; 
float processtime = vmProcedure .ProcessTime;//流程运行时间
float moduletime = circleFind.ModuleTime;//模块运行时间

注意在回调函数里获取流程耗时,两种方法如下:

Task.Run(() =>
{
    float processtime = vmProcedure .ProcessTime;//流程运行时间
});

或者

float time = workStatusInfo.fProcessTime;

问题根因
不熟悉相关接口的使用。

2.2.9 资源释放:方案资源释放的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:如何释放资源?
解答
当关闭VM二次开发程序时,推荐使用Dispose接口来释放资源。

C#
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    VmSolution.Instance.Dispose();
}

问题根因
不熟悉相关接口的使用。

2.2.10 条件检测:条件检测模块设置范围的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:如何用编程实现对条件检测模块所订阅的相关模块结果进行范围的设置。
解答
条件检测的相关接口类为IfModuleTool,int0为所订阅的变量名,具体实现过程如下所示:

C#
IfModuleTool ifModuleTool = (IfModuleTool)VmSolution.Instance["流程1.条件检测1"];
ifModuleTool.ModuParams.GetDynamicParam("int0_Max").SetIntValue(1000);
ifModuleTool.ModuParams.GetDynamicParam("int0_Min").SetIntValue(1);

问题根因
不熟悉条件检测的相关接口。

2.2.11 流程ID:通过流程名获取流程ID的方法

环境:VM4.0.0+vs2015及以上
现象:怎么获取流程ID?
解答
通过流程名可以获取流程ID。

c#
public static bool GetProcessID(string ProcessName, ref int ProcessID, ref string ErrorMessage)
{
	bool findIDResult = false;
	try
	{
		ProcessInfoList stProcList = VmSolution.Instance.GetAllProcedureList(); // 获取所有流程列表
		for (int i = 0; i < stProcList.nNum; i++)
		{
        	string _ProcessName = stProcList.astProcessInfo[i].strProcessName;
        	if (ProcessName == _ProcessName)
            {
            	ProcessID = (int)stProcList.astProcessInfo[i].nProcessID;
                findIDResult = true;
                break;
            }
		}
	}
    catch (Exception ex)
	{
    	findIDResult = false;
        ErrorMessage = "获取流程ID异常:" + ex.Message;
    }
    return findIDResult;
}

问题根因
不熟悉流程接口功能编写

2.2.12 几何创建:绘制形状的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:在几何创建模块中,VM二次开发如何通过代码绘制形状?
解答
因为几何创建中的绘制形状与设置ROI相关,所以需要用ROI的方式进行设置,需要拼装二进制的数据。

private void button6_Click(object sender, EventArgs e)
{
    GeometryCreateTool tool = (GeometryCreateTool)VmSolution.Instance["流程1.几何创建1"];
    Geo1line linetool = new Geo1line();
    linetool.nType = (byte)8;
    linetool.fStartX = 123.0f / 5472; //由于归一化,所以要除以图像的高和宽
    linetool.fStartY = 100.0f / 3648;
    linetool.fEndX = 2000.0f / 5472;
    linetool.fEndY = 2000.0f / 3648;
    int size = Marshal.SizeOf(linetool);
    IntPtr intpt = Marshal.AllocHGlobal(Marshal.SizeOf(linetool));
    Marshal.StructureToPtr(linetool, intpt, true);
    //SetBinaryData接口的参数分别为GeometryType,地址指针,内存大小
    tool.ModuParams.SetBinaryData("GeometryType", intpt, (uint)size);//接口函数
}
 
//结构体序列化
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Geo1line
{
    public byte nType;      //7是点,8是线,9是圆
    public byte nVersion;   //填0
    public float fStartX;   //
    public float fStartY;   //
    public float fEndX;     //
    public float fEndY;    //
}

问题根因
不熟悉几何创建模块的接口。

2.2.13 运行间隔:设置和获取流程运行间隔的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:VM 二次开发如何设置和获取流程运行间隔?
解答

C# 
//设置方案运行间隔
VmSolution.Instance.SetRunInterval(500);
 
//设置流程运行间隔
VmProcess = (VmProcedure)VmSolution.Instance["流程1"];//流程实例化
VmProcess.SetContinousRunInterval(500);
 
//获取流程运行间隔                       
uint time = 0;
ServerSDKManager.serverSDKManager.mProcessManager.GetContinousRunInterval(10000, ref time); //第一个参数为流程ID,第二个参数为间隔时间

问题根因
不熟悉二次开发设置与获取流程运行间隔的接口。

2.2.14 分支字符:控制调试模式开关的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:如何控制分支字符调试模式的开关?
解答
在图的右边分支字符模块有两个分支,通过C#代码GetParamValue函数可以看到调试模式的相关参数ModuleInfoList的值为:4#1#0KaTeX parse error: Expected 'EOF', got '#' at position 3: 10#̲0#0。其中分支4#1#0$的4表示模块id,1表示这个分支的条件输入值,0代表是否打开调试模式。
在这里插入图片描述

问题根因
不熟悉分支字符模块的调试模式参数名及协议格式。

2.2.15 模块禁用:模块禁用的方法

描述
环境:VM4.0 + VS2015及以上
现象:如何将模块通过代码控制是否禁用与启用?效果类似VM中的操作,如下所示:
在这里插入图片描述

解答
用户可以使用模块的IsForbidden属性来禁用模块,但对于Group模块的禁用之后无法开启,改接口还未推荐对外使用,所以用的时候需要注意。

C#
using IMVSCircleFindModuCs;
IMVSCircleFindModuTool circleTool=( IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
moduleTool.IsForbidden = true;

问题根因
不熟悉模块接口使用。

2.2.16 Group循环:获取Group循环数据结果的方法

描述
环境:VM4.0.0+2015及以上
现象:如何获取Group循环的所有数据结果?
解答
在Group中使用数据集合模块,然后在Group的输出设置订阅数据集合模块相关结果,最后在二次开发中获取Group的数据结果。如下图所示,参数out1为Group订阅的数据集合,在代码中可以获取数据数组,但是在界面的显示上out1中有重复值,后续会进行改进。
在这里插入图片描述

问题根因
不熟悉如何获取Group循环数据结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/474284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go 语言环境安装(Windows 系统下安装)

go 语言官网:The Go Programming Language 下载 go 安装包的网址&#xff1a;All releases - The Go Programming Language go 支持很多种操作系统 Windows 系统下 - 安装和配置SDK 一、SDK 介绍 SDK 的全称是 Software Development Kit &#xff0c;即 软件开发工具包 二…

STM32物联网实战开发(1)——全新的程序框架

现在STM32公司主推的是HAL库的开发&#xff0c;标准库已经不再更新。通过STM32cubeMX的图形界面生成代码非常的方便。 一、程序框架的构想 1、STM32cubeMX 生成的代码与添加的应用代码分离&#xff1b; 2、利用 STM32cubeMX 重新生成代码&#xff0c;不影响应用代码&#xf…

zabbix配置钉钉告警(附含钉钉告警脚本 · 实战亲测无任何问题)

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 钉钉上操作&#xff08;钉钉告警以关…

密码学新进展:基于同态加密的数据保护是否会成为未来的趋势?

第一章&#xff1a;引言 在今天这个数字时代&#xff0c;数据的重要性不断增加&#xff0c;已经成为了现代社会最宝贵的财富之一。各种机构和企业在日常运营中都会处理大量的数据&#xff0c;包括用户信息、财务数据、产品销售数据等。这些数据的安全性非常重要&#xff0c;因…

2.5 定点运算器的组成

学习目标&#xff1a; 具体包括以下几点&#xff1a; 了解定点运算器的基本概念和分类&#xff0c;包括定点运算器的分类、常见的定点运算器类型等&#xff1b;学习定点运算器的基本组成部分&#xff0c;包括输入/输出接口、寄存器、算术逻辑单元(ALU)、控制单元等&#xff0…

VS Code C++ 输出窗口中文乱码问题解决

VS Code C 输出窗口中文乱码问题解决 系统cmd终端乱码 的情况&#xff1a;原因解决方法&#xff1a;&#xff08;仅针对cmd终端输出的情况&#xff09;方法一&#xff1a;更改代码文件的编码方法二 &#xff1a;更改cmd默认终端的编码方式 系统cmd终端乱码 的情况&#xff1a; …

2023年的深度学习入门指南(10) = 前端同学如何进行chatgpt开发

2023年的深度学习入门指南(10) 前端同学如何进行chatgpt开发 在第二篇&#xff0c;我们使用openai的python库封装&#xff0c;搞得它有点像之前学习的PyTorch一样的库。这一节我们专门给它正下名&#xff0c;前端就是字面意义上的前端。 给gpt4写前端 下面我们写一个最土的…

“BIM+智慧工地”精准“数字化”变身智慧工程“管家”

用手机对着满载钢筋的卡车拍照&#xff0c;手指选定一下钢筋范围&#xff0c;几秒后&#xff0c;屏幕就能迅速识别车上有多少根钢筋——这是建筑产业数字化管理智慧工程的应用领域之一。 投资1.78亿元建设的贵州民航产教融合实训基地是集实践教学、社会培训、企业生产保障和科研…

学历与就业:我对“孔乙已长衫”现象的思考

一、你认为社会对于学历和职业之间的关系认知是怎样的&#xff1f; 在当前的社会中&#xff0c;学历往往被看作是一个人能否获得好工作的重要标准。许多用人单位更愿意录取拥有更高学历的求职者&#xff0c;因为他们通常具备更广阔的知识视野和更强的理论基础。然而&#xff0…

Presto之Left Join和Right Join的实现

一. 前言 我们知道&#xff0c;在Presto中&#xff0c;与inner join相比&#xff0c;left join会保留probe表&#xff08;左表&#xff09;的所有值&#xff0c;right join会保留build表&#xff08;右表&#xff09;的所有值。inner join的是实现在文章Presto之Hash Join 数据…

攻击者可以使用HTML和CSS隐藏“外部发件人”电子邮件警告

导语&#xff1a;研究人员近日证实&#xff0c;Microsoft Outlook等客户端向电子邮件收件人显示的“外部发件人”警告可能被发件人隐藏。 研究人员近日证实&#xff0c;Microsoft Outlook等客户端向电子邮件收件人显示的“外部发件人”警告可能被发件人隐藏。 事实证明&#x…

【数据结构】一篇带你彻底玩转 链表

文章目录 链表的概念及结构链表的分类链表接口的实现链表打印链表申请节点链表尾插链表头插链表尾删链表头删链表查找链表在指定位置之后插入数据链表删除指定位置之后的数据链表在指定位置之前插入数据链表删除指定位置之前的数据链表删除指定位置的数据链表的销毁 链表的概念…

总结835

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;熟练背诵《大独裁者》&#xff0c;最后默写。抄写今后要背诵的两篇文章。 高等数学&#xff1a;做…

机器视觉各开发语言对比以及选择

机器视觉主流开发语言主要有, 一.C#,占有率极高 市面主要以Halcon,visionpro,visionmaster,opencvsharp为主。 开发人员利用 C# 能够生成在 .NET 中运行的多种安全可靠的应用程序。 二.C++,Qt 市面主要以Halcon,visionpro,visionmaster,opencv为z主。 C++ 即已成为世界上…

Arduino学习笔记5

一.直流电机控制实验 1.源代码 int dianJiPin9;//定义数字9接口接电机驱动IN1的控制口void setup() {pinMode(dianJiPin,OUTPUT);//定义电机驱动IN1的控制口为输出接口 } void loop() {digitalWrite(dianJiPin,LOW);//关闭电机delay(1000);//延时digitalWrite(dianJiPin,HIGH…

基于protobuf构建grpc服务

一、protobuf介绍 protobuf是谷歌开源的一种数据格式&#xff0c;适合高性能&#xff0c;对响应速度有要求的数据传输场景。因为profobuf是二进制数据格式&#xff0c;需要编码和解码。数据本身不具有可读性。因此只能反序列化之后得到真正可读的数据。 优势&#xff1a; 序列…

【Unity-UGUI控件全面解析】| Text文本组件详解

🎬【Unity-UGUI控件全面解析】| Text文本组件详解一、组件介绍二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 改变Text文本颜色4.2 文本换行问题4.3 空格自动换行问题4.4 逐字显示效果五、组件相关扩展使用5.1 文本描边组件(Outline)5.2 阴影组件(Shadow)5.3…

操作系统——操作系统逻辑结构

0.关注博主有更多知识 操作系统入门知识合集 目录 2.1操作系统的逻辑结构 思考题&#xff1a; 2.2CPU的态 思考题&#xff1a; 2.3中断机制 2.1操作系统的逻辑结构 操作系统的结构指的是操作系统的设计和实现思路&#xff0c;按照什么样的结构设计、实现。 操作系统的…

[java]云HIS:检验字典维护

术语解释&#xff1a; 1、最小剂量&#xff1a;并非指医生开处方时的最小剂量值&#xff0c;而是为了对应计量单位和剂量单位之间数量关系而设置的。 2、包装规格&#xff1a;是计价单位和计量单位之间换算的关系值&#xff0c;1个计价单位计价规格个计量单位。 药品单位之间的…

【三十天精通Vue 3】第二十一天 Vue 3的安全性详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 中的安全问题1.1 前端安全问题概述1.2 Vue 3 中的安…