如何实现根据通讯信号切换快速匹配的模型文件并触发流程执行?
1.动态切换模板需在全局脚本中调用相关接口实现,可以在全局脚本的通讯数据接收回调中实现代码逻辑,代码如下。
C#
using System;
using VM.GlobalScript.Methods;
using System.Windows.Forms;
using iMVS_6000PlatformSDKCS;
using System.Runtime.InteropServices;
* 示例说明: 接收全局通信模块数据示例
* 前提: 全局通信模块中开启有通信设备
* 控制逻辑: 1.接收来自全局通信模块接收到的数据
* 2.如果接收到数据字符 T1/T2,则加载对应模型文件并执行流程
1 一次
* ***************************************/
public class UserGlobalScript : UserGlobalMethods, IScriptMethods
{
///
/// 初始化函数
///
/// 成功:返回 0
public int Init()
{
//二次开发 SDK 初始化
InitSDK();
//设置与全局通信模块的通信端口
StartGlobalCommunicate();
//注册通信数据接收事件
RegesiterReceiveCommunicateDataEvent();
return 0;
}
///
/// 运行函数
/// 单次执行:该函数执行一次
/// 连续执行:以一定时间间隔重复执行该函数
///
/// 成功:返回 0
public int Process()
{
//m_operateHandle 二次开发 SDK 操作句柄
if (m_operateHandle == IntPtr.Zero)
{ return ImvsSdkPFDefine.IMVS_EC_NULL_PTR; }
//默认执行全部流程,如果自定义流程执行逻辑,请移除 DefaultExe
cuteProcess 方法
int nRet = DefaultExecuteProcess();
return nRet;
}
///
/// 通信数据接收函数
///
public override void UserGlobalMethods_OnReceiveCommunicate
DataEvent(ReceiveDataInfo dataInfo)
{
if (dataInfo == null || dataInfo.DeviceData == null)
{ return; }
//接收到的数据转成字符串
string str = System.Text.Encoding.Default.GetString(dataInfo.D
eviceData);
//创建导入模型结构体
ImvsSdkPFDefine.IMVS_PF_IMPORT_MODULE_DATA_INPUT stI
mportData = new ImvsSdkPFDefine.IMVS_PF_IMPORT_MODULE_DATA
_INPUT();
stImportData.stImportModuData = new ImvsSdkPFDefine.IMV
S_PF_IMPORT_MODULE_DATA[ImvsSdkPFDefine.IMVS_PF_MAX_IMPOR
T_NUM];
//这里的 deviceIndex 和全局通信模块中的一致
if (dataInfo.DeviceID == 1)
{
//解析收到的数据
if (str == "T1")
{
//导入一个模板
string strImportFilePath = "E:\\Project\\VMProject\\模
板切换\\3.fmxml";
stImportData.stImportModuData = new ImvsSdkPFDe
fine.IMVS_PF_IMPORT_MODULE_DATA[ImvsSdkPFDefine.IMVS_PF_MAX
_IMPORT_NUM];
stImportData.nDataNum = 1;
stImportData.nDataType = 1;
//操作模块 ID
stImportData.nModuleID = 1;
stImportData.stImportModuData[0].pData = Marshal.S
tringToHGlobalAnsi(strImportFilePath);
int iDataLen = System.Text.Encoding.Default.GetBytes
(strImportFilePath).Length;
stImportData.stImportModuData[0].nDataLen = (uint)i
DataLen;
}
if (str == "T2")
{
//创建模型文件字符串数组,同时导入两个模板
string[] strImportFilePath = new System.String[] { "E:\
\Project\\VMProject\\模板切换\\1.fmxml", "E:\\Project\\VMProject\\模板
切换\\2.fmxml" };
stImportData.nDataNum = 2;
stImportData.nDataType = 1;
stImportData.nModuleID = 1;
int count = 0;
foreach (var iter in strImportFilePath)
{
stImportData.stImportModuData[count].pData =
Marshal.StringToHGlobalAnsi(iter);
int iDataLen = System.Text.Encoding.Default.GetB
ytes(iter).Length;
stImportData.stImportModuData[count].nDataLen
= (uint)iDataLen;
count++;
}
}
//导入模型
ImvsPlatformSDK_API.IMVS_PF_ImportModuleData_CS(m_o
perateHandle, stImportData);
//执行流程 1
ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_op
erateHandle, 10000, null);
}
}
///
/// SDK 回调函数
///
public override void ResultDataCallBack(IntPtr outputPlatformInfo,
IntPtr puser)
{
base.ResultDataCallBack(outputPlatformInfo, puser);
ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO struInfo
= (ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO)Marshal.PtrTo
Structure(outputPlatformInfo, typeof(ImvsSdkPFDefine.IMVS_PF_OUTP
UT_PLATFORM_INFO));
switch (struInfo.nInfoType)
{
//获取模块结果数据
case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFO
RM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_MODU
LE_RESULT:
{
ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO
_LIST_P resultInfo = (ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INF
O_LIST_P)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefi
ne.IMVS_PF_MODULE_RESULT_INFO_LIST_P));
break;
}
///获取流程运行状态
case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFO
RM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_WORK_
STATE:
{
ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAU
S stWorkStatus = (ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS)
Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_P
F_MODULE_WORK_STAUS));
break;
}
default:
break;
}
}
}