using DataEntity.Device; using DataEntity.Share; using HxEnum; using HxSocket; using HxSocketImplement.Sockets; using HxSocketImplement.Sockets.HxService; //using MySqlX.XDevAPI.Common; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Xml; using XCommon; using XCommon.Log; using XCore; using XHandler.Controls.Run.Com; using XHandler.View; using XImagingXhandler.XDAL; using static HxEnum.OperationTypeEnum; using static HxEnum.StateEnum; namespace XHandler.Controls { /// /// 第三方设备控制逻辑类 /// public class ThirdPartControl { #region 变量 // 系统语言 private string m_currentCulture = string.Empty; #region BLL private ThirdPartBll m_thirdPartBll = new ThirdPartBll(); #endregion // 运行界面 public static RunWnd LaunchView = null; #endregion /// /// 构造函数 /// public ThirdPartControl() { m_currentCulture = Shared.SoftwareInformation.currentculture; } #region 执行第三方设备方法 /// /// 执行第三方设备方法 /// /// /// /// /// public bool ExecuteCoatingTransfer(XmlNode xmlEnv, XmlNode methodNode, bool isSimulator) { bool bResult = false; string strMethodName = methodNode.SelectSingleNode("name").InnerText; string log = string.Empty; #region 任务被取消 if (LaunchView._cancelSource.IsCancellationRequested) { bResult = false; return bResult; } #endregion try { #region 数据准备 MethodThirdPart thirdPartData = m_thirdPartBll.GenerateMethodThirdPartDataByXmlNode(methodNode); #endregion #region 数据检查 if (thirdPartData.device == null) { LaunchView.AddLogs(string.Format("【{0}】> Xhandler: 【{1}】{2}", DateTime.Now.ToString("HH:mm:ss:fff"), strMethodName, Properties.ThirdPartResource.strSendMethodError.ToString())); LoggerHelper.ErrorLog(string.Format("设备不存在! deviceId = {0}", thirdPartData.deviceValue)); return bResult; } if (thirdPartData.deviceMethod == null) { LaunchView.AddLogs(string.Format("【{0}】> Xhandler: 【{1}】{2}", DateTime.Now.ToString("HH:mm:ss:fff"), strMethodName, Properties.ThirdPartResource.strSendMethodError.ToString())); LoggerHelper.ErrorLog(string.Format("设备方法不存在! deviceMethodId = {0}", thirdPartData.deviceMethodValue)); return bResult; } #endregion #region 运行日志 if (m_currentCulture.Equals("zh-CN")) { log = string.Format("【{0}】> Xhandler: 【{1}({2})】{3}", DateTime.Now.ToString("HH:mm:ss:fff"), strMethodName, thirdPartData.deviceMethod.ParameterName, Properties.MachineRunResource.strStart.ToString()); LaunchView.AddLogs(log); } else { log = string.Format("【{0}】> Xhandler: 【{1}({2})】{3}", DateTime.Now.ToString("HH:mm:ss:fff"), strMethodName, thirdPartData.deviceMethod.ParameterName, "start"); LaunchView.AddLogs(log); } #endregion #region 化学工作站 判断离心机开关门前是否机械臂在安全位置 if (thirdPartData.deviceMethod != null) { if ((thirdPartData.deviceMethod.ParameterName.Equals("OpenDoor") || thirdPartData.deviceMethod.ParameterName.Equals("CloseDoor"))&&Shared.SoftwareInformation.software_device_number.Equals("HXFX")) { //强制控制机械臂到安全位 Dictionary dicParamsRobot = new Dictionary(); string xmlText = "enable机械臂\r\n14-17Trued40b4dfc-6ae9-402f-8946-2fe5ef908b2d\r\n机械臂083c2225e-9942-46a5-8b80-b661b55d131a\r\nPickb7ab14c7-89a4-436a-a999-550432ec5ce3target\r\nSAFE_01"; XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(xmlText); XmlNode methodNodeRobot = xmldoc.SelectSingleNode("root/method"); MethodThirdPart thirdPartDataRobot = m_thirdPartBll.GenerateMethodThirdPartDataByXmlNode(methodNodeRobot); GetDeviceInParams(thirdPartDataRobot, ref dicParamsRobot); InstructCommonMethodSendModel sendModelRobot = new InstructCommonMethodSendModel(); sendModelRobot.DeviceId = thirdPartDataRobot.device.Id; sendModelRobot.DeviceName = thirdPartDataRobot.device.Name; sendModelRobot.EquipmentType = thirdPartDataRobot.device.Type; sendModelRobot.Ip = thirdPartDataRobot.device.Ip; sendModelRobot.Port = Convert.ToInt32(thirdPartDataRobot.device.Port); sendModelRobot.EquipmentId = thirdPartDataRobot.device.EquipmentId; sendModelRobot.VirtualConnectionState = thirdPartDataRobot.device.VirtualConnectionState; sendModelRobot.CommunicateType = thirdPartDataRobot.device.CommunicateType; sendModelRobot.SendData = new HxSendBase { experiment_id = Shared.Exp.ExperimentId, parameters = dicParamsRobot, method = thirdPartDataRobot.deviceMethod.ParameterName }; InstructCommonMethodSendModel instructCommonMethodSendModelRobot = HxSocketParameterService.GetInstructCommonMethodSendModel(sendModelRobot); // 给设备节点发送指令 LockDeviceAndSendMsg(instructCommonMethodSendModelRobot, isSimulator); } } #endregion // 指令发送之前 BeforeSend(thirdPartData); #region Send LoggerHelper.DebugLog(string.Format("deviceId = {0}, methodId = {1} 执行开始.", thirdPartData.device.Id, thirdPartData.deviceMethod.Id)); // 获取指令发送参数 Dictionary dicParams = new Dictionary(); if (!GetDeviceInParams(thirdPartData, ref dicParams)) { LaunchView.AddLogs(string.Format("【{0}】> Xhandler: 【{1}】{2}", DateTime.Now.ToString("HH:mm:ss:fff"), strMethodName, Properties.ThirdPartResource.strSendMethodError.ToString())); return false; } #region 作成发送参数 InstructCommonMethodSendModel sendModel = new InstructCommonMethodSendModel(); sendModel.DeviceId = thirdPartData.device.Id; sendModel.DeviceName = thirdPartData.device.Name; sendModel.EquipmentType = thirdPartData.device.Type; sendModel.Ip = thirdPartData.device.Ip; sendModel.Port = Convert.ToInt32(thirdPartData.device.Port); sendModel.EquipmentId = thirdPartData.device.EquipmentId; sendModel.VirtualConnectionState = thirdPartData.device.VirtualConnectionState; sendModel.CommunicateType = thirdPartData.device.CommunicateType; sendModel.SendData = new HxSendBase { experiment_id = Shared.Exp.ExperimentId, parameters = dicParams, method = thirdPartData.deviceMethod.ParameterName }; InstructCommonMethodSendModel instructCommonMethodSendModel = HxSocketParameterService.GetInstructCommonMethodSendModel(sendModel); #endregion // 给设备节点发送指令 Result deviceResult = LockDeviceAndSendMsg(instructCommonMethodSendModel, isSimulator); #endregion // 指令发送之后 AfterSend(thirdPartData); if (deviceResult.status != StateEnum_Equipment.Completed) { bResult = deviceResult.OperMark == NodeOperationTypeEnum.Continue ? true : false; } else { bResult = true; } } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); #region Exception LaunchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + strMethodName + "】error:source:" + ex.Source + ";error:" + ex.Message + ";"); bResult = false; #endregion } return bResult; } #endregion #region 指令发送之前 /// /// 指令发送之前 /// /// private void BeforeSend(MethodThirdPart thirdPartData) { LoggerHelper.DebugLog($"[BeforeSend]: start. methodId = {thirdPartData.deviceMethod.Id}"); try { } finally { LoggerHelper.DebugLog($"[BeforeSend]: end. methodId = {thirdPartData.deviceMethod.Id}"); } } #endregion #region 指令发送之后 /// /// 指令发送之后 /// /// private void AfterSend(MethodThirdPart thirdPartData) { LoggerHelper.DebugLog($"[AfterSend]: start. methodId = {thirdPartData.deviceMethod.Id}"); try { } finally { LoggerHelper.DebugLog($"[AfterSend]: end. methodId = {thirdPartData.deviceMethod.Id}"); } } #endregion #region 获取发送参数 /// /// 获取发送参数 /// /// /// /// public bool GetDeviceInParams(MethodThirdPart thirdPartData, ref Dictionary dicParams) { #region Socket-TCP标准协议 if (thirdPartData.device.CommunicateType == EnumManagement.GetEnumValue(CommunicateTypeEnum.Socket)) { var selSendParameters = thirdPartData.methodParametersData.Where(it=>it.Type == EnumManagement.GetEnumValue(ParameterTypeEnum.Send)); if (selSendParameters.Any()) { List parametersData = selSendParameters.ToList(); foreach (var inParamItem in parametersData) { // 获取变量值 string varValue = inParamItem.Value; //如果值是变量,取出变量的值 string globalVariableValue = ""; globalVariableValue = ControlCom.SearchValueOfGlobalVariable(LaunchView, varValue); if (!string.IsNullOrEmpty(globalVariableValue)) { varValue = globalVariableValue; } #region 字符串类型 if (inParamItem.DataType == EnumManagement.GetEnumValue(ParameterDataTypeEnum.Varchar)) { dicParams.Add(inParamItem.ParameterName, varValue); } #endregion #region 数字类型 else if (inParamItem.DataType == EnumManagement.GetEnumValue(ParameterDataTypeEnum.Int)) { int nVarValue = 0; // 转成数字类型 if (!ComUtility.ParseToInt(varValue, out nVarValue)) { return false; } dicParams.Add(inParamItem.ParameterName, nVarValue); } #endregion #region Json类型 else if (inParamItem.DataType == EnumManagement.GetEnumValue(ParameterDataTypeEnum.JSON)) { if (!string.IsNullOrEmpty(varValue)) { dicParams = JsonConvert.DeserializeObject>(varValue); } break; } #endregion #region bool类型 else if (inParamItem.DataType == EnumManagement.GetEnumValue(ParameterDataTypeEnum.Bool)) { bool bVarValue = false; // 转成数字类型 if (!ComUtility.ParseToBool(varValue, ref bVarValue)) { LoggerHelper.ErrorLog(string.Format("ParseToInt,value = {0}, 参数不是bool!!!", varValue)); return false; } dicParams.Add(inParamItem.ParameterName, bVarValue); } #endregion } } } #endregion return true; } #endregion #region 给设备节点发送指令 /// /// 给设备节点发送指令 /// /// /// /// private Result LockDeviceAndSendMsg(InstructCommonMethodSendModel commonMethodSendModel, bool isSimulator) { return new ResultHandle().StepResult(commonMethodSendModel, isSimulator); } #endregion } }