using System;
using VM.GlobalScript.Methods;
using System.Windows.Forms;
using iMVS_6000PlatformSDKCS;
using System.Runtime.InteropServices;
/******************************
* 示例说明: 接收全局通信模块数据示例
* 前提: 全局通信模块中开启有通信设备
* 控制逻辑: 1.接收来自全局通信模块接收到的数据
* 2.如果接收到数据字符0,则执行流程1一次
* ***************************************/
public class UserGlobalScript : UserGlobalMethods,IScriptMethods
{
/// <summary>
/// 初始化函数
/// </summary>
/// <returns>成功:返回0</returns>
public int Init()
{
//二次开发SDK初始化
InitSDK();
//设置与全局通信模块的通信端口
StartGlobalCommunicate();
//注册通信数据接收事件
RegesiterReceiveCommunicateDataEvent();
return 0;
}
/// <summary>
/// 运行函数
/// 单次执行:该函数执行一次
/// 连续执行:以一定时间间隔重复执行该函数
/// </summary>
/// <returns>成功:返回0</returns>
public int Process()
{
//m_operateHandle 二次开发SDK操作句柄
if (m_operateHandle == IntPtr.Zero)
{return ImvsSdkPFDefine.IMVS_EC_NULL_PTR;}
//默认执行全部流程,如果自定义流程执行逻辑,请移除DefaultExecuteProcess方法
int nRet = DefaultExecuteProcess();
return nRet;
}
/// <summary>
/// 通信数据接收函数
/// </summary>
public override void UserGlobalMethods_OnReceiveCommunicateDataEvent(ReceiveDataInfo dataInfo)
{
//MessageBox.Show("ffff");
if(dataInfo == null || dataInfo.DeviceData==null)
{return;}
//接收到的数据转成字符串
string str = System.Text.Encoding.Default.GetString(dataInfo.DeviceData);
//这里的deviceIndex和全局通信模块中的一致
if(dataInfo.DeviceID==1)
{
//解析收到的数据
if(str=="1")
{
SetGlobalVariableStringValue("var0","1");
ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle,10000,null);
}
if(str=="2")
{
SetGlobalVariableStringValue("var0","2");
ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle,10000,null);
}
}
}
/// <summary>
/// SDK回调函数
/// </summary>
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.PtrToStructure(outputPlatformInfo, typeof(ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO));
switch (struInfo.nInfoType)
{
//获取模块结果数据
case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFORM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_MODULE_RESULT:
{
ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P resultInfo = (ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P));
break;
}
///获取流程运行状态
case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFORM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_WORK_STATE:
{
ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS stWorkStatus = (ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS));
break;
}
default:
break;
}
}
}
下面重点讲:
/// <summary>
/// 通信数据接收函数
/// </summary>
public override void UserGlobalMethods_OnReceiveCommunicateDataEvent(ReceiveDataInfo dataInfo)
{
//MessageBox.Show("ffff");
if(dataInfo == null || dataInfo.DeviceData==null)
{return;}
//接收到的数据转成字符串
string str = System.Text.Encoding.Default.GetString(dataInfo.DeviceData);
//这里的deviceIndex和全局通信模块中的一致
if(dataInfo.DeviceID==1)
{
//解析收到的数据
if(str=="1")
{
SetGlobalVariableStringValue("var0","1");
ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle,10000,null);
}
if(str=="2")
{
SetGlobalVariableStringValue("var0","2");
ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle,10000,null);
}
}
}
关键点:
一、函数
public override void UserGlobalMethods_OnReceiveCommunicateDataEvent(ReceiveDataInfo dataInfo)
这是通讯收到信号的响应函数,无论串口、tcp,只要收到信号,都会触发他。
二、设备号
if(dataInfo.DeviceID==1)
这个说的是设备号,跟全局通讯模块中的设置一致。
三、设置全局变量
SetGlobalVariableStringValue("var0","1");
也可以设置浮点型等等,函数需要变化
四、执行流程
ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle,10000,null);
10000代表第一个流程,10001代表第二个流程
五、分支字符