using BasicData; using bizFacade; using MesWork; using OpcBasic; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data; using System.Linq; using SystemFramework; namespace MisDataFunction { partial class Function { /// /// 获取质量数据Hashtable /// /// /// static public Hashtable ReadPLC_Sync_DataList_MesRead(string opName) { return (Hashtable)MesDataFunction.OpcOperation.ReadPLC_Sync_DataList_MesRead(opName); } public static void MesRead_ByOnlyDataGroup(string opName) { string tagValue; string tagid = "77777777"; //if (tagValue == "0") //{ // Write_TagTypeID(20, opName, false); //} //else { SaveQualityData_ByOnlyDataGroup(opName, tagid); } } /// /// 允许保存(针对半自动和手动压装工位) /// /// /// public static void MesRead(string opName, string tagValue, string tagid) { if (tagValue == "0") { Write_TagTypeID(20, opName, false); } else { SaveQualityData(opName, Convert.ToInt32(tagValue), tagid); } } /// /// 按组读质量数据,返回带合格标志的质量数据列表 /// 保存数据到数据库 /// /// /// /// public static bool SaveQualityData_ByOnlyDataGroup(string opName, string tagID) { try { // out qualityMask,//工位合格标志 //out engineTypeID,//发动机类型代码 //out engineID,//发动机编号 //out engineType, //发动机型号 //out partPallet,//托盘编号 //out engineTraceCode, //发动机条码 //out engineCap,//缸盖号, //hashtable_EngineTypeID,//发动机类型转换表 int id_tagCF; int qualityMask = 0; int engineTypeID = 0; string engineID = ""; string engineType = ""; string engineTraceCode = ""; string engineCap = ""; string partPallet = ""; DataTable dt_WWW; dt_WWW = BaseDataSystemMES.BuildDataTables_WWW(); Hashtable valueList; valueList = MesDataFunction.OpcOperation.ReadPLC_Sync_DataList_MesRead_ByOnlyDataGroup(opName); //valueList = GetQualityData_GoodBad_Values(valueList); int mes_MustTest = 0; int onLineState = 0; int partMoveDirection = 0; int pressIsOK = 0; int pressIsNoOK = 0; GetEngineMainData_ByOnlyDataGroup(opName, out qualityMask, out engineTypeID, out engineID, out engineType, out partPallet, out engineTraceCode, out engineCap, out mes_MustTest, out onLineState, out partMoveDirection, out pressIsOK, out pressIsNoOK); BaseDataSystemMES.GetQualityDataTable_ByOnlyDataGroup(valueList, opName, BasicDataTagValue, BasicDataTagValueUpDown, out dt_WWW); ////数据列表 // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 if (Convert.ToInt32(hashtable_tagTable_OpName_SaveData[opName]) != 0) { DateTime lastupdatetime = DateTime.Now; BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF); BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW); } Write_TagTypeID(20, opName, true); return true; #region //string orderForm = ""; //string operatorCode = ""; //int shiftCode = 1; //DateTime arrivedTime; //DateTime leavedTime; //int TimeDiff; //int targetTime = 0; //string lineType = ""; //string isPass; //int machineWorkOn = 0; //int arrivedOrLeaved = 2; //int cartColorOpName = 0; //int cartColorConfirm = 0; //// int partMoveDirection; //int partGoOver = 0; //if (qualityMask == 1) //{ // isPass = "PASS"; //} //else //{ // isPass = "FAIL"; //} ////工位上下线类型 ////(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) //int OpNameUpDownType; //OpNameUpDownType = Convert.ToInt32(hashtableOpName_OpType[opName]); //arrivedTime = (DateTime)m_WorkStart_OpName_Time[opName]; //leavedTime = DateTime.Now; //TimeDiff = Convert.ToInt32(leavedTime.Subtract(arrivedTime).TotalSeconds); //lineType = hashtableOpName_LineType[opName].ToString(); //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); ////isHaveComputer = MIS_BASE.hashtable_tagTable_OpName_SaveData[opName].ToString(); ////有计算机的工位,通过工位计算机保存[测量数据发动机在线状态]。 //if (Convert.ToInt32(isHaveComputer) == 0) //{ // //1->0 工件离开 工件刚刚离开 // if (Convert.ToInt32(m_WorkStart_OpName[opName]) == 1) // { // //[测量数据发动机在线状态] // QualityDataSystem.WorkStartInsert // (opName, orderForm, engineTypeID, engineType, engineID, partPallet.ToString(), operatorCode, shiftCode, // arrivedTime, leavedTime, TimeDiff, targetTime, lineType, isPass, machineWorkOn, // arrivedOrLeaved, cartColorOpName, cartColorConfirm, partMoveDirection, partGoOver, mes_MustTest, onLineState, OpNameUpDownType); // } //} #endregion } catch (Exception err) { Write_TagTypeID(20, opName, true); ApplicationLog.WriteLog(err, err.Message); return false; } } public static void GetEngineMainData_ByOnlyDataGroup(string opName, out int qualityMask, out int engineTypeID, out string engineID, out string engineType, out string partPallet, out string engineTraceCode, out string engineCap, out int mes_MustTest, out int onLineState, out int partMoveDirection, out int pressIsOK, out int pressIsNoOK) { engineCap = ""; int tagTypeID; string tagValue; //总合格标志 tagTypeID = 21; MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); qualityMask = Convert.ToInt32(tagValue); //8 只要返修,必须由mes发送此信号,plc接收此信号后才能放行 //(暂时没用)用于有扳手拧紧工位。通知设备螺钉拧紧完成。PC已经将数据保存到数据库中。(B5A) tagTypeID = 8; MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); pressIsNoOK = Convert.ToInt32(tagValue); //质量数据发动机机型标志 22(玉柴) 发动机机型标志 9 (有MOBY)需要换算成2的n次幂的形式,以便生成报表 //engineTypeID = Convert.ToInt32(qualityData.tagValue); //if (engineTypeID == 0) //{ // engineTypeID = 1; //} //if (hashtable_EngineTypeID.ContainsKey(engineTypeID)) //{ // string engineTypeIDString = hashtable_EngineTypeID[engineTypeID].ToString(); // engineTypeID = Convert.ToInt32(engineTypeIDString); // if (engineTypeID == 0) // { // engineTypeID = 1; // } //} tagTypeID = 9; MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); engineTypeID = Convert.ToInt32(tagValue); //发动机编号 23 10 //case 23: tagTypeID = 10; MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); engineID = tagValue; engineTraceCode = engineID; //质量数据发动机机型 24(玉柴) 11(有MOBY) tagTypeID = 11; //质量数据发动机机型 24(玉柴) 11(有MOBY) MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); engineType = tagValue; tagTypeID = 41; //41 机体流向标志(1 BYTE):0普通工位:1:上线(发动机上线); //2:下线(发动机下线);(必须PLC) MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); partMoveDirection = Convert.ToInt32(tagValue); tagTypeID = 51; //51 返修工位,修改后的数据MES将数据写入PLC ,MES通知PLC数据修改完成。(YN) MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); pressIsOK = Convert.ToInt32(tagValue); tagTypeID = 78; //78 0:屏蔽MES;1:启用MES(必须MIS) MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); mes_MustTest = Convert.ToInt32(tagValue); tagTypeID = 79; //79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线: //0正常状态,实现正常功能。1离线:2屏蔽。(必须MIS) MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); onLineState = Convert.ToInt32(tagValue); tagTypeID = 80; //79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线: //0正常状态,实现正常功能。1离线:2屏蔽。(必须MIS) MesDataFunction.OpcOperation.ReadTagValue(tagTypeID, opName, out tagValue); partPallet = tagValue; } public static ConcurrentDictionary GetDbAndMaxLengthByOpNameByBytes(string opName) { string tagStartAdr = ""; ushort tagAdrListMaxLength = 0; PlcLinkForm.GetDbAndMaxLengthByOpName(opName, out tagStartAdr, out tagAdrListMaxLength); var tagAdrListTagFormat = PlcLinkForm.ReadQualityDataList(opName, tagStartAdr, tagAdrListMaxLength); return tagAdrListTagFormat; } //public static Hashtable GetQualityDataTypeList(string opName) //{ // var tagValues = PlcLinkForm.ReadPLC_GroupData_Qd(opName); // var keyValues = tagValues.OrderBy(x => x.Key).ToDictionary(k => k.Key, v => v.Value); // TagFormat tagFormatTemp; // int tagIndex = 1; // int isOK = 0; // Hashtable ht = new Hashtable(); // foreach (KeyValuePair _cd in keyValues) // { // tagFormatTemp = (TagFormat)_cd.Value; // if (tagIndex % 3 == 1) // { // isOK = Convert.ToInt32(tagFormatTemp.TagValue); // } // else if (tagIndex % 3 == 2) // { // var TF = (TagFormat)_cd.Value; // QualityDataType qualityDataType; // qualityDataType = GetQualityDataType(TF); // qualityDataType.isGoodBad = isOK; // ht.Add(qualityDataType.tagID, qualityDataType); // } // else if (tagIndex % 3 == 0) // { // var TF = (TagFormat)_cd.Value; // QualityDataType qualityDataType; // qualityDataType = GetQualityDataType(TF); // qualityDataType.isGoodBad = isOK; // ht.Add(qualityDataType.tagID, qualityDataType); // } // tagIndex++; // //Console.WriteLine($"key:{kv.Key} value:{kv.Value}"); // } // return ht; //} private static void SaveQualityData(string opName, int tagValue, string tagID) { try { int id_tagCF; int qualityMask = 0; int engineTypeID = 0; string engineID = ""; string engineType = ""; string engineTraceCode = ""; string engineCap = ""; string partPallet = ""; DataTable dt_WWW; dt_WWW = BaseDataSystemMES.BuildDataTables_WWW(); Hashtable valueList; valueList = ReadPLC_Sync_DataList_MesRead(opName); valueList = GetQualityData_GoodBad_Values(valueList); int mes_MustTest = 0; int onLineState = 0; int partMoveDirection = 0; int pressIsOK = 0; int pressIsNoOK = 0; BaseDataSystemMES.GetQualityDataTable_B5A(valueList, opName, BasicDataTagValue, BasicDataTagValueUpDown, out dt_WWW,//数据列表 out qualityMask,//工位合格标志 out engineTypeID,//发动机类型代码 out engineID,//发动机编号 out engineType, //发动机型号 out partPallet,//托盘编号 out engineTraceCode, //发动机条码 out engineCap,//缸盖号, hashtable_EngineTypeID,//发动机类型转换表 out mes_MustTest, out onLineState, out partMoveDirection, out pressIsOK, out pressIsNoOK); // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 if (Convert.ToInt32(hashtable_tagTable_OpName_SaveData[opName]) != 0) { DateTime lastupdatetime = DateTime.Now; BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF); BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW); } Write_TagTypeID(20, opName, true); #region //string orderForm = ""; //string operatorCode = ""; //int shiftCode = 1; //DateTime arrivedTime; //DateTime leavedTime; //int TimeDiff; //int targetTime = 0; //string lineType = ""; //string isPass; //int machineWorkOn = 0; //int arrivedOrLeaved = 2; //int cartColorOpName = 0; //int cartColorConfirm = 0; //// int partMoveDirection; //int partGoOver = 0; //if (qualityMask == 1) //{ // isPass = "PASS"; //} //else //{ // isPass = "FAIL"; //} ////工位上下线类型 ////(0普通工位)(1正常上线)(2正常下线)(3返修上线)(4返修下线) //int OpNameUpDownType; //OpNameUpDownType = Convert.ToInt32(hashtableOpName_OpType[opName]); //arrivedTime = (DateTime)m_WorkStart_OpName_Time[opName]; //leavedTime = DateTime.Now; //TimeDiff = Convert.ToInt32(leavedTime.Subtract(arrivedTime).TotalSeconds); //lineType = hashtableOpName_LineType[opName].ToString(); //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); ////isHaveComputer = MIS_BASE.hashtable_tagTable_OpName_SaveData[opName].ToString(); ////有计算机的工位,通过工位计算机保存[测量数据发动机在线状态]。 //if (Convert.ToInt32(isHaveComputer) == 0) //{ // //1->0 工件离开 工件刚刚离开 // if (Convert.ToInt32(m_WorkStart_OpName[opName]) == 1) // { // //[测量数据发动机在线状态] // QualityDataSystem.WorkStartInsert // (opName, orderForm, engineTypeID, engineType, engineID, partPallet.ToString(), operatorCode, shiftCode, // arrivedTime, leavedTime, TimeDiff, targetTime, lineType, isPass, machineWorkOn, // arrivedOrLeaved, cartColorOpName, cartColorConfirm, partMoveDirection, partGoOver, mes_MustTest, onLineState, OpNameUpDownType); // } //} #endregion } catch (Exception err) { Write_TagTypeID(20, opName, true); ApplicationLog.WriteLog(err, err.Message); } } //public static void SaveQualityData_Mes(string opName, int tagID) //{ // try // { // int id_tagCF; // int qualityMask = 0; // int engineTypeID = 0; // string engineID = ""; // string engineType = ""; // string engineTraceCode = ""; // string engineCap = ""; // string partPallet = ""; // DataTable dt_WWW; // dt_WWW = BaseDataSystemMES.BuildDataTables_WWW(); // Hashtable valueList; // valueList = ReadPLC_Sync_DataList_MesRead(opName); // valueList = GetQualityData_GoodBad_Values(valueList); // int mes_MustTest = 0; // int onLineState = 0; // int partMoveDirection = 0; // int pressIsOK = 0; // int pressIsNoOK = 0; // BaseDataSystemMES.GetQualityDataTable_B5A(valueList, opName, BasicDataTagValue, // BasicDataTagValueUpDown, // out dt_WWW,//数据列表 // out qualityMask,//工位合格标志 // out engineTypeID,//发动机类型代码 // out engineID,//发动机编号 // out engineType, //发动机型号 // out partPallet,//托盘编号 // out engineTraceCode, //发动机条码 // out engineCap,//缸盖号, // hashtable_EngineTypeID,//发动机类型转换表 // out mes_MustTest, out onLineState, out partMoveDirection, out pressIsOK, out pressIsNoOK); // // 1:通过监控系统保存采集的质量数据;0:不通过监控系统保存采集的质量数据 // if (Convert.ToInt32(hashtable_tagTable_OpName_SaveData[opName]) != 0) // { // DateTime lastupdatetime = DateTime.Now; // BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_IndexInsert(engineID, tagID, engineType, engineTypeID, opName, qualityMask, partPallet, out id_tagCF); // //BaseDataSystemMES.BaseData_tagTable_QualityData_B5A_Insert(id_tagCF, engineTypeID, engineID, opName, dt_WWW); // } // } // catch (Exception err) // { // Write_TagTypeID(20, opName, true); // ApplicationLog.WriteLog(err, err.Message); // } //} /// /// 确定合格标志 /// /// /// static public Hashtable GetQualityData_GoodBad_Values(Hashtable valuList) { try { Hashtable valuList_Temp; valuList_Temp = (Hashtable)valuList.Clone(); int[] value_GoodBad_New = new int[128]; int tagID; QualityDataType value; //1:获得合格标志 foreach (DictionaryEntry de in valuList) //ht为一个Hashtable实例 { tagID = Convert.ToInt32(de.Key); value = (QualityDataType)de.Value; //拧紧数据合格标志 if (value.tagProperty == 1) { if (value.tagTypeID == 8203) { value_GoodBad_New = (int[])value.tagValue; break; } else { value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); } } //拧紧数据合格标志 if (value.tagProperty == 8) { if (value.tagTypeID == 8203) { value_GoodBad_New = (int[])value.tagValue; break; } else { value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); } } //压装数据合格标志 if (value.tagProperty == 7) { value_GoodBad_New[value.tagOrderBy - 1] = Convert.ToInt32(value.tagValue); } } //将合格标志赋予每个变量 foreach (DictionaryEntry de in valuList) //ht为一个Hashtable实例 { tagID = Convert.ToInt32(de.Key); value = (QualityDataType)de.Value; //201706061720新加 if (value .tagTypeID ==11) { if (value.tagValue.ToString ()=="False") { value.tagValue ="0"; } else { value.tagValue = "1"; } valuList_Temp[tagID] = value; //value.tagValue = Convert.ToInt32(value.tagValue); } //测量变量 if (value.tagProperty == 2 || value.tagProperty == 6) { try { if (value_GoodBad_New != null) { value.isGoodBad = Convert.ToInt32(value_GoodBad_New[value.tagOrderBy - 1]); valuList_Temp[tagID] = value; } else { value.isGoodBad = 0; valuList_Temp[tagID] = value; } } catch (Exception err) { ApplicationLog.WriteLog(err, err.Message); } } } return valuList_Temp; } catch//转换出了故障时 { return valuList; } } /// /// 制定工位PLC是否传递过机型 (默认不传递机型不保存过站信息) /// static Hashtable EngTypeGetOver = new Hashtable(); static Hashtable EngineData_Hash = new Hashtable(); //保存 public static void IsEngTypeGetOver_Write(string OpName, bool value) { if (EngTypeGetOver.ContainsKey(OpName)) { EngTypeGetOver[OpName] = value; } else { EngTypeGetOver.Add(OpName, value); } } public static bool IsEngTypeGetOver_Read(string OpName) { if (EngTypeGetOver.ContainsKey(OpName)) { return Convert.ToBoolean(EngTypeGetOver[OpName]); } else { return true; } } public static void EngineData_Hash_Write(string OpName, object value) { if (EngineData_Hash.ContainsKey(OpName)) { EngineData_Hash[OpName] = value; } else { EngineData_Hash.Add(OpName, value); } } public static object EngineData_Hash_Read(string OpName) { if (EngineData_Hash.ContainsKey(OpName)) { return EngineData_Hash[OpName]; } else { return null; } } private DataTable ChangeQualificationMark(DataTable dt) { var dtNew = dt.Copy(); for (int i = 0; i < dt.Rows.Count; i++) { var 变量排序 = dt.Rows[i]["变量排序"].ToString(); if (变量排序 == "0") { } } return dtNew; } } struct EngineData { public EngineData(string engineID, int pallet) { EngineID = engineID; Pallet = pallet; } public string EngineID;//工件编号 //public string EngineType; //public int EngineTypeID; public int Pallet;//托盘号 } }