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

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循环数据结果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值