【VM服务管家】VM4.0平台SDK_2.4 结果获取类

news2025/1/17 21:53:30

目录

  • 2.4.1 数据结果:通过流程输出或模块输出获取数据结果的方法
  • 2.4.2 流程运行:所有流程运行结束的回调方法
  • 2.4.3 模块回调:所有模块运行结束的回调方法
  • 2.4.4 加密狗回调:获取加密狗状态的回调方法
  • 2.4.5 方案加载:方案加载结束的回调方法
  • 2.4.6 模块回调:指定模块运行结束的回调方法
  • 2.4.7 模块回调:禁用模块结果回调的方法
  • 2.4.8 通讯回调:通讯设备状态和接受数据的回调方法

2.4.1 数据结果:通过流程输出或模块输出获取数据结果的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:方案或流程运行执行之后,就可以获取结果(建议将结果获取写在回调函数里),可以通过获取渲染结果和数据结果,渲染结果通过绑定渲染控件进行显示,数据结果分为整型、浮点型、字符串型和图像型等等,VM二次开发如何获取数据结果?
解答
数据结果的获取可以通过流程的输出或者模块的输出,推荐使用通过流程的输出,符合高内聚低耦合的思想,详细介绍如下所示:
1 通过流程的输出获取数据结果
1.1 流程配置-输出设置
在这里插入图片描述

1.2 获取整型、浮点型、字符串型数据

C#
VmProcedure vmprocess = (VmProcedure)VmSolution.Instance["流程1"];
string str = vmprocess.GetIntOutputResult("out").pIntValue[0].ToString();                
string str1 = vmprocess.GetFloatOutputResult("out0").pFloatValue[0].ToString();
string str2 = vmprocess.GetStringOutputResult("out1").astStringValue[0].strValue;

C#
// 流程拿结果,c从界面层获取的方法,适用于高内存场景
string str2 = ((ImvsSdkDefine.IMVS_MODULE_STRING_VALUE_EX)(vmProcess["out1.Value"] as Array).GetValue(0)).strValue.ToString();//字符串型结果
string str1 = ((vmProcess["out0.Value"] as Array).GetValue(0)).ToString();//浮点型结果

1.3 获取图像数据
流程输出设置中输出IMAGE类型的图像数据,不能通过前面参数名称image拿取,需要通过Imageout0,ImageWidthout0,ImageHeightout0,ImagePixelFormatout0,这四个参数进行获取。示例代码和图像如下:
在这里插入图片描述

C#
VmProcedure VmProcess = (VmProcedure)VmSolution.Instance["流程1"];//实例化流程1
ImageResultInfo resultInfo0 =VmProcess.GetImageOutputResult("Imageout0");
IntResultInfo resultInfo1 =VmProcess.GetIntOutputResult("ImageWidthout0");
IntResultInfo resultInfo2 =VmProcess.GetIntOutputResult("ImageHeightout0");
IntResultInfo resultInfo3 =VmProcess.GetIntOutputResult("ImagePixelFormatout0");
byte[] imageData=resultInfo0.pstImageValue[0].pData;

2 通过模块的输出获取数据结果
2.1 获取模块的浮点型数据

C#
IMVSCircleFindModuCs.IMVSCircleFindModuTool circleTool=(IMVSCircleFindModuCs.IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
//只调用一次circleTool.ModuResult表示只从底层拿一次结果,适用于高内存场景
var circleToolResult = circleTool.ModuResult;
string circleX = circleToolResult.OutputCircle.CenterPoint.X.ToString();
string circleY = circleToolResult.OutputCircle.CenterPoint.Y.ToString();
string circleR = circleToolResult.OutputCircle.Radius.ToString();

2.2 获取图像数据,针对有图像输出的模块

C#
//图像源模块
Using ImageSourceModuleCs;
ImageSourceModuleTool sourceImage=(ImageSourceModuleTool)VmSolution.Instance[“流程1.图像源1”];//实例化输出图形模块
Var sourceImageResult=sourceIamge.ModuResult.Imagedata;//只需要调用一次ModuResult,适用于高内存场景
byte[] imageData= sourceImageResult.ImageData;
int imagePixelformat= sourceImageResult.Pixelformat;

C#
//输出图像模块
Using SaveImageCs;
SaveImageTool saveImage=(SaveImageTool)VmSolution.Instance[“流程1.输出图像1”];//实例化输出图像模块
Var saveImageResult=saveIamge.ModuResult.OutputImage;//只需要调用一次ModuResult,适用于高内存场景
byte[] imageData= saveImageResult.ImageData;
int imagePixelformat= saveImageResult.Pixelformat;

像素格式17301505为MONO8灰度图,像素格式 35127316为RGB24彩色图,需要注意的是输出图像模块的像素格式默认是RGB24,所以此时的输出图像模块的imagePixelformat为35127316。
在这里插入图片描述

问题根因
不熟悉如何获取数据结果

2.4.2 流程运行:所有流程运行结束的回调方法

描述
环境:VM4.0.0 + VS2015及以上
现象: 流程运行的触发方式有多种,无论哪种方式都可以进入回调函数,因此建议在回调函数中获取结果。
解答
1)流程运行的触发方式
在这里插入图片描述

2)所有流程运行结束的都会进入的回调函数,建议在回调函数里获取数据结果(参考2.4.1)和渲染结果(2.3.1),其中在回调函数里获取渲染结果时,需要使用委托(this.BeginInvoke)对控件进行绑定操作。

C#
 
public Form1()
{
	InitializeComponent();
	//注册回调函数,流程运行状态回调
    VmSolution.OnWorkStatusEvent += VmSolution_OnWorkStatusEvent;
}
private void VmSolution_OnWorkStatusEvent(ImvsSdkDefine.IMVS_MODULE_WORK_STAUS workStatusInfo)
{
	if (workStatusInfo.nWorkStatus == 0 && workStatusInfo.nProcessID == 10000)//为0表示执行完毕,为1表示正在执行;10000表示流程1
	{
      //获取结果
	}
}

C++
//类中声明变量和函数
IVmSolution* m_pVmSol;
IVmProcedure* m_pVmPrc;
static int __stdcall SolutionCallback(IN OutputPlatformInfo * const pstInputPlatformInfo, IN void * const pUser);
int SolutionCallbackFunc(IN OutputPlatformInfo * const pstInputPlatformInfo);

//在初始化时用方案注册回调函数,这是所有流程运行结束都会自动进的回调函数
m_pVmSol->RegisterCallBack(SolutionCallback, this);

//回调函数的实现方法,Demo为项目类名
int __stdcall Demo::SolutionCallback(IN OutputPlatformInfo * const pstInputPlatformInfo, IN void * const pUser)
{
	auto *pCtrlDemoThis = static_cast<Demo*>(pUser);
	int nRet = IMVS_EC_UNKNOWN;
	if (pCtrlDemoThis)
	{
		nRet = pCtrlDemoThis->SolutionCallbackFunc(pstInputPlatformInfo);
		if (IMVS_EC_OK != nRet)
		{
			return nRet;
		}
	}
	return IMVS_EC_OK;
}
int Demo::SolutionCallbackFunc(IN OutputPlatformInfo * const pstInputPlatformInfo)
{
	if (pstInputPlatformInfo->nInfoType == IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_WORK_STATE)
	{
		try {
			auto workstateInfo = static_cast<IMVS_PF_MODULE_WORK_STAUS*>(pstInputPlatformInfo->pData);
			if (workstateInfo->nWorkStatus == 0 && workstateInfo->nProcessID == 10000)//判断流程执行状态和流程ID
			{
				auto m_pVmPro = (IVmProcedure*)(*m_pVmSol)["流程1"];
				float info = m_pVmPro->GetResult()->GetOutputFloat("out").pFloatVal[0];
			}
		}
		catch (exception *e)
		{
			TRACE(e->what());
		}
	}
	return 0;
}

问题根因
不熟悉流程运行结束的回调函数

2.4.3 模块回调:所有模块运行结束的回调方法

描述
环境:VM4.0.0 + VS2015及以上
现象:模块运行结束就会进入的回调函数
解答
所有模块运行结束就会进入的回调函数,代码如下:

C#
 
//注册回调函数
VmSolution.OnModuleResultCallbackEvent += VmSolution_OnModuleResultCallbackEvent;
private void VmSolution_OnModuleResultCallbackEvent (ImvsSdkDefine.IMVS_MODULE_RESULT_INFO_LIST_EX_Data moduleResultExInfo)
{
	if (moduleResultExInfo.nModuleID == moduleID )//判断模块Id
	{
		if (moduleResultExInfo.nStatus == 1)//判断模块状态,1表示模块运行成功
		{
			//获取结果
		}
	}
}

问题根因
不熟悉所有模块运行结束的回调

2.4.4 加密狗回调:获取加密狗状态的回调方法

描述
环境:VM4.0.0 + VS2015及以上
现象:如何获取加密狗编号?
解答
建立ServerSDKManager.serverSDKManager.mSolutionManager.OnDongleCallBack事件,对事件中的moduleInfo进行处理。moduleInfo.nDongleStatus = 0代表加密狗状态正常,moduleInfo.strDongleType为加密狗编号。

C#

ServerSDKManager.serverSDKManager.mSolutionManager.OnDongleCallBack += MSolutionManager_OnDongleCallBack;
private void MSolutionManager_OnDongleCallBack(ImvsSdkDefine.IMVS_DONGLE_INFO moduleInfo)
{
    if(moduleInfo.nDongleStatus == 0)//获取加密狗状态
    {
       string dogNum = System.Text.Encoding.Default.GetString(moduleInfo.strDongleType);//获取加密狗型号
    }
	else
	{
    	MessageBox.Show("未检测到加密狗!");
	}
}

问题根因
不熟悉如何获取加密狗编号,从而判断是否插了加密狗

2.4.5 方案加载:方案加载结束的回调方法

描述
环境:VM4.0.0 + VS2015及以上
现象:方案加载结束进入的回调函数。
解答
首先,建立VmSolution.OnSolutionLoadEndEvent(方案加载结束)事件,对事件中的solutionLoadEndInfo进行判断,对方案的nStatus进行判定,其中0表示方案为空闲状态,可在其中获得方案加载结果,1表示方案处于忙碌状态。

C#
 
VmSolution.OnSolutionLoadEndEvent += VmSolution_OnSolutionLoadEndEvent;
//方案加载成功
 
private void VmSolution_OnSolutionLoadEndEvent
(ImvsSdkDefine.IMVS_SOLUTION_LOAD_END_INFO solutionLoadEndInfo)
{
    if (solutionLoadEndInfo.nStatus == 0)//0为方案加载成功
    {
       //这里可以插入相关函数
    }  
}

提示:当方案中包含脚本模块或者深度学习模块,方案第一次执行耗时就会比较长,因此可以在方案加载成功后,静默执行一次,即在会回调函数里写静默执行语句:VmSolution.Instance.SilentExecute(true)。
问题根因
不熟悉方案加载结束的回调

2.4.6 模块回调:指定模块运行结束的回调方法

描述
环境:VM4.0.0 + VS2015及以上
现象:指定模块,在运行结束后进入回调函数。
解答
1)注册回调函数,模块被执行一次就会进该函数一次。

C#
 
IVmModule module = (IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
module.ModuleResultCallBackArrived += ModuleResultCallBackArrived;

2)回调函数,目前模块回调函数不是事件,因此无法快捷键自动补全代码,函数如下:

C#
private void ModuleResultCallBackArrived(object sender ,EventArgs e)
{
   IMVSCircleFindModuTool circleFind = (IMVSCircleFindModuTool)sender;
   float x = circleFind.ModuResult.OutputCircle.Radius;
}

问题根因
不熟悉指定模块运行结束的回调

2.4.7 模块回调:禁用模块结果回调的方法

描述
环境:VM4.0.0 + VS2015及以上
现象:为了提高内存利用率,禁用不必要的模块结果回调。
解答
禁用和启用模块结果回调,禁用之后将无法获取模块的结果,代码如下:

C#
 
//禁用所有模块的回调
VmSolution.Instance.DisableModulesCallback();
//控制方案中回调,ID指模块ID,0是禁用,1是启用
ServerSDKManager.serverSDKManager.mModuleManager.CtrlCallBackModuResult(ID,0);
//启用所有回调
VmSolution.Instance.EnableModulesCallback();

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

2.4.8 通讯回调:通讯设备状态和接受数据的回调方法

描述
环境:VM4.0.0 + VS2015及以上
现象:如何获取通讯设备的状态是开启还是关闭?如何获取通讯数据?
解答

  1. 获取通讯设备的状态
C#
//注册回调
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);
    int len = btarr.Length;
    string ID = btarr[1].ToString();//通讯设备ID
    string Open = btarr[0].ToString();//开关状态,1表示开,0表示关
}
  1. 获取通讯数据
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;
        Logger.WriteLog(LogLevel.INFO, strMsg);
    }
    catch (VmException ex)
    {
        strMsg = "读取通信数据失败. Error Code: " + Convert.ToString(ex.errorCode, 16);
        Logger.WriteLog(LogLevel.ERROR, strMsg);
        return;
    }
}

问题根因
不熟悉通讯相关的回调方法

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

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

相关文章

STM32物联网实战开发(4)——基本定时器

我使用的是正点原子的阿波罗F429开发板&#xff0c;他有14个定时器&#xff0c;本次实验使用STM32F429的基本定时器6作定时&#xff0c;在中断中每隔1秒翻转LED电平状态。 1.CubeMX初始化定时器 先开启定时器6 再对定时器6的参数进行配置&#xff0c;将定时器6定时时间配置为…

记一次SSRF漏洞的学习和利用

导语&#xff1a;本文主要记录一次我们在复盘嘶吼网站渗透报告时遇到的一个SSRF漏洞。 1.前言 本文主要记录一次我们在复盘嘶吼网站渗透报告时遇到的一个SSRF漏洞。此漏洞并结合腾讯云的API接口&#xff0c;可以获取大量嘶吼服务器的敏感信息。利用这些敏感信息&#xff0c;又…

阿里测试8年,肝到P8只剩他了····

在阿里工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…

玩转ChatGPT提示词 持续更新·······

导语&#xff1a; 众所周知&#xff0c;在AI的世界里&#xff0c;提示词就是和AI沟通语言的桥梁&#xff0c;提示关键词常用于AI对话及AI绘画等相关场景&#xff0c;通过准确的使用关键词&#xff0c;你就能更好的让AI辅助自己的工作&#xff0c;其中的成分重要性不言而喻&…

黑客教程,从零基础入门到精通

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以后再来解决. …

c++标准模板(STL)(std::array)(三)

定义于头文件 <array> template< class T, std::size_t N > struct array;(C11 起 std::array 是封装固定大小数组的容器。 此容器是一个聚合类型&#xff0c;其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。不同于 C 风格数组…

C#非常实用的技巧

1、解压和压缩 .NET Framework 4.5以上版本&#xff1a; string zipFilePath "C:\path\to\file.zip";string destFolder "C:\path\to\destination\folder";using (var archive ZipFile.OpenRead(zipFilePath)){foreach (var entry in archive.Entries…

【Python】【进阶篇】14、Django创建第一个项目

目录 Django创建第一个项目1. 第一个项目BookStore1) BookStore项目创建 2. Django项目配置文件1) manage.py文件2) __init__.py文件3) settings.py文件4) urls.py文件5) wsgi.py文件 Django创建第一个项目 在上一章中&#xff0c;我们完成了开发环境的搭建工作。 本章我们将学…

网络安全基础入门学习路线

在大多数的思维里总觉得学习网络安全得先收集资料、学习编程、学习计算机基础&#xff0c;这样不是不可以&#xff0c;但是这样学效率太低了&#xff01; 你要知道网络安全是一门技术&#xff0c;任何技术的学习一定是以实践为主的。也就是说很多的理论知识其实是可以在实践中…

【一起撸个DL框架】4 反向传播求梯度

CSDN个人主页&#xff1a;清风莫追 欢迎关注本专栏&#xff1a;《一起撸个DL框架》 文章目录 4 反向传播求梯度&#x1f965;4.1 简介4.2 导数与梯度4.3 链式法则4.4 示例&#xff1a;y2x1的梯度 4 反向传播求梯度&#x1f965; 4.1 简介 上一篇&#xff1a;【一起撸个DL框架】…

Python标准数据类型-String(字符串)

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1 &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;零基础入门篇 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一座的高山…

MATLAB符号运算(七)

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 1、实验目的&#xff1a; 1&#xff09;掌握定义符号对象和创建符号表达式的方法&#xff1b; 2&#xff09;掌握符号运算基本命令和规则&#xff1b; 3&#xff09;掌握符号表达式的运算法则以及符号矩阵运算&#xf…

大型Saas系统的权限体系设计(二)

X0 上期回顾 上文《大型Saas系统的权限体系设计(一)》提到2B的Saas系统的多层次权限体系设计的难题&#xff0c;即平台、平台的客户、客户的客户&#xff0c;乃至客户的客户的客户如何授权&#xff0c;这个可以通过“权限-角色-岗位”三级结构来实现。 但这个只是功能权限&am…

mac免费杀毒软件哪个好用?如何清理mac系统需要垃圾

CleanMyMac x是一款功能强大的Mac系统优化清理工具&#xff0c;使用旨在帮助用户更加方便的清理您系统中的所有垃圾&#xff0c;从而加快电脑运行速度&#xff0c;保持最佳性能&#xff0c;更加稳定、流畅、快速&#xff01;&#xff01;&#xff01; CleanMyMac X无疑是目前m…

C++内存管理基础

文章目录 前言1. C/C内存分布2. C语言中动态内存管理方式3. C中动态内存管理3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new与operator delete函数4.1 operator new与operator delete函数&#xff08;重点&#xff09; 5. new和delete的实现原理5.1…

hana odata batch

sap 博客有写 odata batch 处理前&#xff0c;先看一张图 In this blog post,we are going to see how to send a Odata Batch Request to the SAP Cloud for Customer system using POSTMAN Tool. Answers to expect from this post? How to use batch request in the POS…

『python爬虫』04. 爬虫需要知道的HTTP协议知识(保姆级图文)

目录 1. HTTP协议是什么&#xff1f;2. HTTP协议结构3. 爬⾍需要的请求头和响应头内容总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 1. HTTP协议是什么&#xff1f; HTTP协议, Hyper Text Transfer Protocol…

2023独立站能不能做FP?看完这篇你就懂了

现在已经快2023年中了&#xff0c;2023年已经过去了1/3&#xff0c;但还是有人在问特货产品能不能做独立站&#xff0c;还是有不少人在观望。心动不如行动啊朋友们&#xff01;要是想在跨境独立站做出一番事业来&#xff0c;建议现在立马行动起来&#xff0c;趁早在FP独立站领域…

工厂能耗管理系统linux嵌入式边缘网关

随着工业智能化进程的不断推进&#xff0c;能源能耗管理已成为企业经营中一个重要的环节。而在能源能耗管理场景下&#xff0c;边缘计算机发挥了越来越重要的角色。本文将介绍边缘计算机的功能特点、能源能耗使用对接的设备以及应用前景市场容量&#xff0c;并探讨ARM边缘计算机…

Java使用 Scanner连续输入int, String 异常错误输出原因分析

目录 一、Scanner常用语法 1、sc.nextInt()介绍 2、sc.next()介绍 3、sc.nextLine()介绍 4、sc.hasNext()介绍 二、报错案例 1、使用next()来接收带有空格的字符串会输出异常 2、先输入数字再输入字符串的输出异常 一、Scanner常用语法 Scanner sc new Scanner(System.…