using DataLinkMesWork; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using Robot.Common; using NPOI.SS.UserModel; namespace MesWork { public partial class publicCore { public static int partCount = 0; public static string FSSRequestMsgId = ""; public static string Hello_You_All_Never_Know(string[] args) { return Guid.NewGuid().ToString(); } /// /// PLC事件变化委托 /// public static Action MIS_Funtion_PLC_OP = null; /// /// 读取PLC正在装配第几个件 /// /// /// public static int Get_PartPosition(string opName) { // 当前装配第几个件 54 int PartPosition = -1; PartPosition = Convert.ToInt32(MesWorkForm.ReadPLC(54, opName)) ; return PartPosition; } /// /// 设备状态发生变化,处理完成之后,发给管控系统 /// 1工作中 2空闲(请求上料) 3完成(请求下料) 4 报警 /// public static void SolveDeviceStatus(string opName) { // 空闲(请求上料) 51 string isFree = "0"; // 完成(请求下料) 52 string isWorkFinish = "0"; // 故障 53 string isAlarm = "0"; string finalStatus = "0"; isFree = MesWorkForm.ReadPLC(51, opName).ToString(); if (isFree.ToLower() == "true" || isFree.ToLower() == "1") { isFree = "1"; } isWorkFinish = MesWorkForm.ReadPLC(52, opName).ToString(); if (isWorkFinish.ToLower() == "true" || isWorkFinish.ToLower() == "1") { isWorkFinish = "1"; } isAlarm = MesWorkForm.ReadPLC(53, opName).ToString(); if (isAlarm.ToLower() == "true" || isAlarm.ToLower() == "1") { isAlarm = "1"; } if (isAlarm == "1") { finalStatus = "4"; } else if (isWorkFinish == "1") { finalStatus = "3"; } else if (isFree == "1") { finalStatus = "2"; } else { finalStatus = "1"; } if (finalStatus == "3") { QualityData_Insert_Final(opName, out string errMag); publicCore.LogInsert("Quality", "Info", "保存质量数据:" + errMag); } AnalysisMsg.DeviceStatus(opName, Convert.ToInt32(finalStatus)); } /// /// 设备状态发生变化,处理完成之后,发给管控系统 /// 1工作中 2空闲(请求上料) 3完成(请求下料) 4 报警 /// 接口用 不重复保存质量数据 /// public static void SolveDeviceStatus_WebApi_Use(string opName) { // 空闲(请求上料) 51 string isFree = "0"; // 完成(请求下料) 52 string isWorkFinish = "0"; // 故障 53 string isAlarm = "0"; string finalStatus = "0"; isFree = MesWorkForm.ReadPLC(51, opName).ToString(); if (isFree.ToLower() == "true" || isFree.ToLower() == "1") { isFree = "1"; } isWorkFinish = MesWorkForm.ReadPLC(52, opName).ToString(); if (isWorkFinish.ToLower() == "true" || isWorkFinish.ToLower() == "1") { isWorkFinish = "1"; } isAlarm = MesWorkForm.ReadPLC(53, opName).ToString(); if (isAlarm.ToLower() == "true" || isAlarm.ToLower() == "1") { isAlarm = "1"; } if (isAlarm == "1") { finalStatus = "4"; } else if (isWorkFinish == "1") { finalStatus = "3"; } else if (isFree == "1") { finalStatus = "2"; } else { finalStatus = "1"; } AnalysisMsg.DeviceStatus(opName, Convert.ToInt32(finalStatus)); } /// /// 设备状态发生变化,处理完成之后,发给管控系统 /// 1工作中 2空闲(请求上料) 3完成(请求下料) 4 报警 /// public static string SolveDeviceStatus_Read(string opName) { // 空闲(请求上料) 51 string isFree = "0"; // 完成(请求下料) 52 string isWorkFinish = "0"; // 故障 53 string isAlarm = "0"; string finalStatus = "0"; isFree = MesWorkForm.ReadPLC(51, opName).ToString(); if(isFree.ToLower() == "true" || isFree.ToLower() == "1") { isFree = "1"; } isWorkFinish = MesWorkForm.ReadPLC(52, opName).ToString(); if (isWorkFinish.ToLower() == "true" || isWorkFinish.ToLower() == "1") { isWorkFinish = "1"; } isAlarm = MesWorkForm.ReadPLC(53, opName).ToString(); if (isAlarm.ToLower() == "true" || isAlarm.ToLower() == "1") { isAlarm = "1"; } if (isAlarm == "1") { finalStatus = "4"; } else if (isWorkFinish == "1") { finalStatus = "3"; } else if (isFree == "1") { finalStatus = "2"; } else { finalStatus = "1"; } return finalStatus; } /// /// AGV任务号 /// public static void SolveAgvTaskNum(string OpName, string PLC_AgvTaskNum) { // 77 反馈AGV任务 switch (PLC_AgvTaskNum) { // AGV已呼叫成功正在去往上料区 case "10": MesWorkForm.WritePLC(77, OpName, "10"); break; // AGV已到达上料区_带货,申请进入上料位置 case "11": string previousTaskValue = MesWorkForm.ReadPLC(77, OpName).ToString(); string AgvCanEnter = MesWorkForm.ReadPLC(50, OpName).ToString(); if (previousTaskValue == "10") { // 写任务--满AGV是达上料区 MesWorkForm.WritePLC(77, OpName, "1"); if (AgvCanEnter == "2") { // 1.调用FSS-接收允许进入或离开 (类型:允许进入)的接口 AnalysisMsg.ResponseEnterOrLeave(OpName, 1); MesWorkForm.WritePLC(77, OpName, "20"); } } if (previousTaskValue == "30") { // 写任务--空AGV是达上料区 MesWorkForm.WritePLC(77, OpName, "3"); if (AgvCanEnter == "4") { // 1.调用FSS-接收允许进入或离开 (类型:允许进入)的接口 AnalysisMsg.ResponseEnterOrLeave(OpName, 1); MesWorkForm.WritePLC(77, OpName, "40"); } } break; // 允许AGV进行上料 --允许进入 case "2": string FullAgvIsRequestEnter = MesWorkForm.ReadPLC(77, OpName).ToString(); // 需要判断前序任务是否完成-- 满AGV是否到达上料区 if (FullAgvIsRequestEnter == "1") { // 1.调用FSS-接收允许进入或离开 (类型:允许进入)的接口 AnalysisMsg.ResponseEnterOrLeave(OpName, 1); MesWorkForm.WritePLC(77, OpName, "20"); } break; case "21": // AGV 上料完成 string previousTaskValue1 = MesWorkForm.ReadPLC(77, OpName).ToString(); if(previousTaskValue1 == "20") { MesWorkForm.WritePLC(77, OpName, "2"); } if (previousTaskValue1 == "40") { MesWorkForm.WritePLC(77, OpName, "4"); } break; // PLC呼叫AGV进行下料 case "3": // 1.调用FSS-接收IPC下料请求的接口 AnalysisMsg.FinishCall(OpName); // 2.反馈任务号:30 AGV已呼叫成功正在去往下料区 MesWorkForm.WritePLC(77, OpName, "30"); break; // 允许AGV进行下料 --允许进入 case "4": string EmptyAgvIsRequestEnter = MesWorkForm.ReadPLC(77, OpName).ToString(); // 需要判断前序任务是否完成-- 空AGV是否到达上料区 if (EmptyAgvIsRequestEnter == "3") { // 1.调用FSS-接收允许进入或离开 (类型:允许进入)的接口 AnalysisMsg.ResponseEnterOrLeave(OpName, 1); MesWorkForm.WritePLC(77, OpName, "40"); } break; // 允许AGV离开 case "5": string FullOrEmptyAgvIsRequestLeave = MesWorkForm.ReadPLC(77, OpName).ToString(); // 需要判断前序任务是否完成-- AGV上料完成或者下料完成 if(FullOrEmptyAgvIsRequestLeave == "2" || FullOrEmptyAgvIsRequestLeave == "4") { // 1.调用FSS-接收允许进入或离开 (类型:允许离开)的接口 AnalysisMsg.ResponseEnterOrLeave(OpName, 2); MesWorkForm.WritePLC(77, OpName, "50"); } break; case "51": // AGV 已离开 反馈任务号:5 MesWorkForm.WritePLC(77, OpName, "5"); break; } switch (OpName) { case "OP10": if (DAS_OP10.AGV_Task_change != null) { DAS_OP10.AGV_Task_change(PLC_AgvTaskNum); } break; case "OP20": if (DAS_OP20.AGV_Task_change != null) { DAS_OP20.AGV_Task_change(PLC_AgvTaskNum); } break; case "OP30": if (DAS_OP30.AGV_Task_change != null) { DAS_OP30.AGV_Task_change(PLC_AgvTaskNum); } break; case "OP40": if (DAS_OP40.AGV_Task_change != null) { DAS_OP40.AGV_Task_change(PLC_AgvTaskNum); } break; case "OP50": if (DAS_OP50.AGV_Task_change != null) { DAS_OP50.AGV_Task_change(PLC_AgvTaskNum); } break; } } /// /// 读取泄漏量的数据 /// public static void ReadQualityData_LeakageRate(string opName) { string Pressure = MesWorkForm.ReadPLC(57, opName).ToString(); int partPosition = Convert.ToInt32(MesWorkForm.ReadPLC(54, opName)); int MeasurePosition = 9; string IsOK = "1"; string NgStr = ""; //保存质量数 QualityData_MobyInsert(partPosition, MeasurePosition, opName, Pressure, IsOK, NgStr, out string errMsg); } /// /// 拧紧数据的变化 /// public static void MeasurePositionChange(string opName, int MeasureStatus) { int MeasurePosition = Convert.ToInt32(MesWorkForm.ReadPLC(55, opName)); int partPosition = Convert.ToInt32(MesWorkForm.ReadPLC(54, opName)); QualityData_MobyUpdate(partPosition, MeasurePosition, opName, MeasureStatus, out string errMsg); } /// /// 读压力的数据 /// public static void ReadQualityData_Pressure(string opName) { string LeakageRate1 = MesWorkForm.ReadPLC(57, opName).ToString(); string LeakageRate2 = MesWorkForm.ReadPLC(58, opName).ToString(); int partPosition = Convert.ToInt32(MesWorkForm.ReadPLC(54, opName)); int MeasurePosition = 1; string IsOK1 = "1"; string NgStr1 = ""; //保存质量数 QualityData_MobyInsert(partPosition, MeasurePosition, opName, LeakageRate1, IsOK1, NgStr1, out string errMsg); MeasurePosition = 2; string IsOK2 = "1"; string NgStr2 = ""; QualityData_MobyInsert(partPosition, MeasurePosition, opName, LeakageRate2, IsOK1, NgStr2, out string errMsg1); } /// /// 质量数据的保存 /// /// /// /// /// /// /// public static bool QualityData_MobyUpdate(int PartPosition, int MeasurePosition, string opName, int MeasureStatus, out string errorMsg) { string procedureName; procedureName = "测量数据合格_Moby_更新"; SqlParameter[] thisParms = new SqlParameter[4]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@测量状态", MeasureStatus); thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", opName); thisParms[2] = new System.Data.SqlClient.SqlParameter("@测量位置", MeasurePosition); thisParms[3] = new System.Data.SqlClient.SqlParameter("@装配位置", PartPosition); return ExecuteStoredProcedure(procedureName, MesWorkForm.ConnectionString, ref thisParms, out errorMsg); } /// /// 质量数据的保存 /// /// /// /// /// /// /// public static bool QualityData_MobyInsert(int PartPosition, int MeasurePosition, string opName, string TagValue, string IsOK, string NgStr, out string errorMsg) { string procedureName; procedureName = "测量数据合格_Moby_增加"; SqlParameter[] thisParms = new SqlParameter[6]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@TagValue", TagValue); thisParms[1] = new System.Data.SqlClient.SqlParameter("@IsOK", IsOK); thisParms[2] = new System.Data.SqlClient.SqlParameter("@工位号", opName); thisParms[3] = new System.Data.SqlClient.SqlParameter("@测量位置", MeasurePosition); thisParms[4] = new System.Data.SqlClient.SqlParameter("@装配位置", PartPosition); thisParms[5] = new System.Data.SqlClient.SqlParameter("@不合格原因", NgStr); return ExecuteStoredProcedure(procedureName, MesWorkForm.ConnectionString, ref thisParms, out errorMsg); } /// /// 质量数据的保存 /// /// /// /// /// /// /// public static bool QualityData_Insert_Final(string opName, out string errorMsg) { string procedureName; procedureName = "测量数据合格_增加"; SqlParameter[] thisParms = new SqlParameter[1]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); return ExecuteStoredProcedure(procedureName, MesWorkForm.ConnectionString, ref thisParms, out errorMsg); } /// /// 判断来料是否满托盘 /// public static void JudgeMaterialFull(string opName, List product_AssemblyInformation) { int partCount = product_AssemblyInformation.Count; if (publicCore.partCount == partCount) { MesWorkForm.WritePLC(78, opName, true); } else { MesWorkForm.WritePLC(78, opName, false); } MesWorkForm.WritePLC(79, opName, false); MesWorkForm.WritePLC(80, opName, false); MesWorkForm.WritePLC(81, opName, false); MesWorkForm.WritePLC(82, opName, false); foreach (var item in product_AssemblyInformation) { if(item.productPosition == 1) { MesWorkForm.WritePLC(79, opName, true); } if (item.productPosition == 2) { MesWorkForm.WritePLC(80, opName, true); } if (item.productPosition == 3) { MesWorkForm.WritePLC(81, opName, true); } if (item.productPosition == 4) { MesWorkForm.WritePLC(82, opName, true); } MesWorkForm.WritePLC(60, opName, false); } } /// /// 是否允许工作 /// /// /// public static void FixedAllow(string opName, object isAllowWork) { MesWorkForm.WritePLC(85, opName, isAllowWork); } /// /// 测量数据_测量信息_初始化查询 /// /// /// /// /// /// /// public static bool GetQualityInfo_Init(string opName, int PartPosition, out DataTable dt, out string errorMsg) { string procedureName; procedureName = "测量数据_测量信息_初始化查询"; SqlParameter[] thisParms = new SqlParameter[2]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); thisParms[1] = new System.Data.SqlClient.SqlParameter("@装配位置", PartPosition); return ExecuteStoredProcedure(procedureName, MesWorkForm.ConnectionString, ref thisParms, out dt, out errorMsg); } public static bool GetProductInfo_Init(string opName, int PartPosition, out DataTable dt, out string errorMsg) { string procedureName; procedureName = "装配信息_初始化查询"; SqlParameter[] thisParms = new SqlParameter[2]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); thisParms[1] = new System.Data.SqlClient.SqlParameter("@装配位置", PartPosition); return ExecuteStoredProcedure(procedureName, MesWorkForm.ConnectionString, ref thisParms, out dt, out errorMsg); } public static void LogInsert(string opName, string logType, string log) { string procedureName; procedureName = "系统_操作日志_新增"; SqlParameter[] thisParms = new SqlParameter[5]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); thisParms[1] = new System.Data.SqlClient.SqlParameter("@日志类型", logType); thisParms[2] = new System.Data.SqlClient.SqlParameter("@日志内容", log); thisParms[3] = new System.Data.SqlClient.SqlParameter("@操作日期", DateTime.Now.ToString("yyyy-MM-dd")); thisParms[4] = new System.Data.SqlClient.SqlParameter("@操作时间", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); ExecuteStoredProcedure(procedureName, MesWorkForm.ConnectionString, ref thisParms, out string errorMsg); } #region 数据库操作 /// /// 提供通用的调用存储过程的方法(需要返回查询的记录集的调用) /// /// 存储过程名称 /// 连库字符串 /// 存储过程参数数组 /// 存储过程里面返回的记录集 /// 错误信息 /// 布尔值,true表示该执行成功,false表示执行失败 public static bool ExecuteStoredProcedure(string procedureName, string connectionString, ref SqlParameter[] sqlParameters, out DataSet ds, out string errorMessage) { bool result = false; errorMessage = ""; ds = new DataSet(); if (connectionString.Length < 1) return false; using (SqlConnection conn = new SqlConnection(connectionString)) { try { //if (!SqlServerConnectionStatus) return false; conn.Open(); using (SqlDataAdapter dsCommand = new SqlDataAdapter()) { dsCommand.SelectCommand = new SqlCommand(procedureName, conn); dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; for (int i = 0; i < sqlParameters.Length; i++) { dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); } dsCommand.Fill(ds); } // SqlServerConnectionStatus = true; result = true; } catch (Exception e) { errorMessage = e.ToString(); // TestConnection(); //ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n存储过程:\r\n" + procedureName + "\r\n连接字符串:\r\n" + connectionString); } finally { if (conn.State == ConnectionState.Open) conn.Close(); } } return result; } /// /// 提供通用的调用存储过程的方法(需要返回查询的记录集的调用) /// /// 存储过程名称 /// 连库字符串 /// 存储过程参数数组 /// 存储过程里面返回的记录表 /// 错误信息 /// 布尔值,true表示该执行成功,false表示执行失败 public static bool ExecuteStoredProcedure(string procedureName, string connectionString, ref SqlParameter[] sqlParameters, out DataTable dt, out string errorMessage) { bool result = false; errorMessage = ""; dt = new DataTable(); DataSet ds = new DataSet(); if (connectionString.Length < 1) return false; using (SqlConnection conn = new SqlConnection(connectionString)) { try { //if (!SqlServerConnectionStatus) return false; conn.Open(); using (SqlDataAdapter dsCommand = new SqlDataAdapter()) { dsCommand.SelectCommand = new SqlCommand(procedureName, conn); dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; for (int i = 0; i < sqlParameters.Length; i++) { dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); } dsCommand.Fill(ds); } if (ds.Tables.Count > 0) { dt = ds.Tables[0]; } result = true; } catch (Exception e) { errorMessage = e.ToString(); // TestConnection(); //ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n存储过程:\r\n" + procedureName + "\r\n连接字符串:\r\n" + connectionString); } finally { if (conn.State == ConnectionState.Open) conn.Close(); } } return result; } /// /// 提供通用的调用存储过程的方法(需要返回查询的记录集的调用) /// /// 存储过程名称 /// 连库字符串 /// 存储过程参数数组 /// 存储过程里面返回的记录表 /// 错误信息 /// 布尔值,true表示该执行成功,false表示执行失败 public static bool ExecuteStoredProcedure(string procedureName, string connectionString, ref SqlParameter[] sqlParameters, out string errorMessage) { bool result = false; errorMessage = ""; DataSet ds = new DataSet(); if (connectionString.Length < 1) return false; using (SqlConnection conn = new SqlConnection(connectionString)) { try { //if (!SqlServerConnectionStatus) return false; conn.Open(); using (SqlDataAdapter dsCommand = new SqlDataAdapter()) { dsCommand.SelectCommand = new SqlCommand(procedureName, conn); dsCommand.SelectCommand.CommandType = CommandType.StoredProcedure; for (int i = 0; i < sqlParameters.Length; i++) { dsCommand.SelectCommand.Parameters.Add(sqlParameters[i]); } dsCommand.Fill(ds); } result = true; } catch (Exception e) { errorMessage = e.ToString(); // TestConnection(); //ApplicationLog.WriteLog(e, "\r\nExecuteStoredProcedure\r\n存储过程:\r\n" + procedureName + "\r\n连接字符串:\r\n" + connectionString); } finally { if (conn.State == ConnectionState.Open) conn.Close(); } } return result; } #endregion } }