using bizFacade; using DoWhatPlc; using MesServerWork; using System; using System.Collections.Generic; using System.Linq; using System.Text; //using SystemFramework; namespace MisDataFunction { public partial class Function: MIS_BASE { /// /// 处理MIS逻辑 TagName 变量类型代码 变量类型名称 /// WorkStart 2 工件到位。托盘到达工位,并且托盘上有工件。 ///RepairPartStatusPLC 3 备用 ///RepairPathString 4 工位返修字符串(121211112222111),前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 ///EngineTypeGetOverMES 5 MES传递总成信息给PLC(上线工位) ///PartPalletGoOver 6 上线工位。0:正常工作;1:空托盘放行,PLC读取到此标志不走申请上线逻辑。 ///MaterialVerifyOver 7 MES保存完质量数据,物料数据等与PLC信号交互完成后通知PLC,所以工步都完成,才可以放行工件,正常工作时工件放行的必要条件。 ///FalseGo 8 按MES界面[不合格放行] 按钮,MES发送此信号。操作者判断工件不合格,通知设备,按不合格方式放行工件,工件流转到返修下线工位后,返修下线。MES工作完成MES0.3=1,MES合格放行MES0.5=0,MES0.4=1 ///EngineTypeID 9 MES发动机机型标志(必须PLC) ///EngineID 10 MES发动机编号(必须PLC) ///EngineType 11 MES发动机机型(必须PLC) ///PartPalletStatus 13 MES激发变量托盘到位离开(必须PLC) ///HeartBeatPLC 14 心跳处理:PLC收到MES心跳信号后,PLC延时5秒后,数值取反再写回PLC,写回PLC开始计时,如果5秒钟MES无反馈报通讯故障。 ///HeartBeatMIS 15 间隔时间5S,心跳处理。收到PLC心跳信号后,MES按原值回写。PLC收到MES信号后延时5秒,取反写入,以此循环。 ///TargetTimeRead 16 MES允许可读工位运行时间 ///MachineTargetTime 17 目标运行时间 ///MachineActualTime 18 实际运行时间 ///MesRead 19 质量数据可以读数据 ///MesReadOver 20 MES保存完数据(必须MIS) ///QualityMask 21 质量数据工位合格标志0:没有工作;1:合格 ;2 :不合格(必须PLC) ///PalletInfo 22 0空托盘,1合格件,2不合格件 ///RepairStatusPLC 23 0正常件,1返修件 ///Reserved_3 24 备用 ///Reserved_4 25 备用 ///Reserved_5 26 备用 ///Reserved_6 27 备用 ///Reserved_7 28 备用 ///Reserved_8 29 备用 ///Reserved_9 30 备用 ///Reserved_10 31 备用 ///Reserved_11 32 备用 ///Reserved_12 33 备用 ///Reserved_13 34 备用 ///Reserved_14 35 备用 ///PLCSPareint1 36 备用 ///PLCSPareint2 37 备用 ///PLCSPareint3 38 备用 ///PLCSarestring1 39 备用 ///PLCSarestring2 40 备用 ///MarkID 42 机体打标号(MES)前2位是西门子字符串格式,第一位是总长度,第二位是实际长度 ///PartLoad 43 上线工位,PLC向MES申请总成编号。收到该信号后,MES将机型标志(DBB22 ~23)、总成号(DBB24 ~63)、总成机型DBB64 ~103写入PLC。之后MES通过信号“传递机型(DBX0.1)”通知PLC。 ///EngineTypeGetOverPLC 44 PLC将机型标志(DBB50…51)、工件编号(DBB52…101)、产品型号(DBB102…187)、托盘编号(DBB188…189)准备完毕后,通知MES。 ///PartLoadOK 48 备用 ///Reserved_18 49 备用 ///PalletDown 50 暂时保留,项目未使用 ///ConfirmOkGo 51 按MES界面[合格放行] 按钮,MES发送此信号。操作者判断工件合格,通知设备,工件按合格方式放行工件。MES工作完成MES0.3=1,MES合格放行MES0.5=1,MES0.4=0 ///ResetDevice 52 针对手动工位,无HMI,需要复位设备在MES页面操作。 ///UnloadCompleted 53 暂时保留,项目未使用 ///MachineTime_ReadOver 54 备用 ///Reserved_19 58 备用 ///FixOK 59 手动拧紧工位,单工步螺栓拧紧完成,通知PC读取数据。 ///Reserved_21 61 备用 ///Reserved_22 62 备用 ///Reserved_23 63 备用 ///Reserved_24 64 备用 ///Reserved_25 65 备用 ///FixAllow 66 设备工作的必须信号,对于有物料验证的工位,MES验证完成给出此信号,对于无物料验证工位,MES直接给出此信号。 ///FixOver 67 用于手动拧紧且有质量数据工位。通知设备当前工步拧紧螺钉工作结束。 ///MatchingCompleted 68 分线上总线,匹配成功是1;不成功是0。 ///Match 69 分线上总线,匹配成功是1;不成功是0。 ///Reserved_2 70 备用 ///IsAutoGetEngineID 71 自动手动申请工件编号。0是自动方式;1:手动方式。暂时保留,生成流水号方式是在数据库中实现的 ///RepairUplineMES 72 上线清空MOBY(针对上线工位):通知PLC从新开始申请上线流程 ///EngineTypeID_MES 73 MES发动机机型标志(必须MES) ///EngineID_MES 74 MES发动机编号(必须MES) ///EngineType_MES 75 MES发动机机型(必须MES) ///Reserved_20 76 备用 ///ProcessCode 77 手动拧紧工位:由MES通知PLC拧紧序号 ///OnLineState 79 通过线体工位PC实现下达工位工作状态:工位有三种状态:在线、离线、屏蔽。在线:0正常状态,实现正常功能。1离线:设备脱离MES工作,进入不交互模式。 ///PartPalletCode 80 托盘编号(B5A) ///BoltCode 88 手动拧紧工位:指导PLC所用套筒 ///RepairStatus 93 0正常件,1返修件。对于上线工位MES给出是正常上线还是返修上线,返修路径 ///Reserved_15 110 备用 ///Reserved_16 111 备用 ///Reserved_17 112 备用 ///SPareint1 113 备用int1 ///SPareint2 114 备用int2 ///SPareint3 115 备用int3 ///Sparestring1 116 备用字符串1 ///Sparestring2 117 备用字符串2 ///MachineStatusPutOn 1000 机床上电(必须PLC) ///MachineStatusWorkOn 1001 循环开始(必须PLC) ///MachineStatusAlarm 1002 机床故障(必须PLC) ///MachineStatusNoPart 1003 上料无件(必须PLC) ///MachineStatusBlock 1004 下料堵塞(必须PLC) ///Alarm 103 设备报警 /// /// public static void MIS_Funtion(object e) { try { string recData = e.ToString(); string[] dataArray = recData.Split('|'); if (dataArray.Length != 4) return; //消息来源 string m_Source = dataArray[0].ToString(); //消息类型 string m_Command = dataArray[1].ToString(); //工位号 string m_OpName = dataArray[2].ToString(); //消息参数 string m_Value = dataArray[3].ToString(); DoWhatPlc.ReturnValueString rv = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); //Console.WriteLine($"【【{rv.TagID}【【【【{ rv.TagKeepTime}"); int tagType; string opName; string tagValue; int tagid; DoWhatPlc.ReturnValueString msgEvent = rv; if (msgEvent.TagValue == null) return; tagType = Convert.ToInt32(msgEvent.TagTypeID); opName = msgEvent.OpName.ToString(); tagid = Convert.ToInt32(msgEvent.TagID); //int tagType; //string opName; //string tagValue; //int tagid; //DoWhatPlc.CustomeEvetnArgs msgEvent = (DoWhatPlc.CustomeEvetnArgs)e; //if (msgEvent.TagValue == null) return; //tagType = Convert.ToInt32(msgEvent.TagType); //opName = msgEvent.OpName.ToString(); //tagid = Convert.ToInt32(msgEvent.TagKey); switch (Convert.ToInt32(msgEvent.TagTypeCodeID)) { case 11: switch (msgEvent.TagValue.ToLower()) { case "1": case "true": tagValue = "1"; break; default: tagValue = "0"; break; } break; default: tagValue = msgEvent.TagValue.ToString(); break; } ///根据信号处理逻辑 switch (tagType) { case 19: //允许保存 MesRead(opName, tagValue, tagid); break; case 14: //心跳 Heartbeat(opName, tagValue); break; case 44://PLC传递机型过后 才允许保存过站信息,否则不允许保存 //if (tagValue == "1") //{ // IsEngTypeGetOver_Write(opName, true); // EngineData Enginedata = new EngineData(DtWebApi.ReadWritePLC.ReadPLC("10", opName).ToString(), Convert.ToInt32(DtWebApi.ReadWritePLC.ReadPLC("80", opName))); // //EngineData Enginedata = new EngineData(MesDataFunction.OpcOperation.ReadPLC(10, opName).ToString(), Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(80, opName))); // //保存产品编号、托盘号 保存过站信息用 // EngineData_Hash_Write(opName, Enginedata); //} break; case 2://工件到位 WorkStart( rv); //WorkStart(opName, tagValue); break; case 51: if (hashtableOpName_IsHaveComputer[opName].ToString() == "1") { SaveProductLeaveData(opName, 1); } break; case 8: if (hashtableOpName_IsHaveComputer[opName].ToString() == "1") { SaveProductLeaveData(opName, 2); } break; case 103: Alarm_Insert(rv); break; } } catch (Exception err) { ////ApplicationLog.WriteLog(err, err.Message); } } private static void Alarm_Insert(ReturnValueString rv) { string TagID; string opName; string tagTypeID; int TagValue; DateTime alarmStartTime; DateTime alarmEndTime; int TimeDiff; string TagOrderBy; string Text1; string Text2; TagID = rv.TagID; tagTypeID = rv.TagTypeID; opName = rv.OpName; TagValue = Convert.ToInt32( rv.TagValue); alarmStartTime = Convert.ToDateTime( rv.TimeStampBefore); alarmEndTime = Convert.ToDateTime( rv.TimeStamp); TimeDiff = Convert.ToInt32(rv.TagKeepTime); TagOrderBy = rv.TagOrderBy; Text1 = rv.ItemName; Text2 = rv.ShaftID; BaseDataSystemMES.Alarm_Insert(TagID, tagTypeID, opName, TagValue, alarmStartTime, alarmEndTime, TimeDiff, Text1, Text2, TagOrderBy); } private static void WorkStart(ReturnValueString rv) { var ro = rv.ReturnValueToObject(); string opName = ro.OpName; DateTime arrivedTime = ro.TimeStampBefore; DateTime leavedTime = ro.TimeStamp; int TimeDiff = ro.TagKeepTime; int targetTime = 0; string isPass = ""; int QualityMark=0; string tagValue="0"; switch (ro.TagValue.ToString().ToLower()) { case "1": case "true": tagValue = "1"; break; default: tagValue = "0"; break; } //if (ro.TagValue.ToString() == "0") //{ // //Write_TagTypeID(5, opName, false);//MES传递机型 // //Write_TagTypeID(66, opName, false);//允许工作 // //Write_TagTypeID(51, opName, false);//合格放行 // //Write_TagTypeID(8, opName, false);//不合格放行 // //Write_TagTypeID(7, opName, false);//工作完成 // //Write_TagTypeID(20, opName, false);//保存完成 // //string isHaveComputer = hashtableOpName_IsHaveComputer[opName].ToString(); // //if (Convert.ToInt32(isHaveComputer) == 0)//自动工位 读合格标志 // //{ // // if (IsEngTypeGetOver_Read(opName)) // // { // // //PLC未传递机型 不保存过站信息 // // SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(DtWebApi.ReadWritePLC.ReadPLC("21", opName))); // // //SaveProductLeaveData_AutoWorkStation(opName, Convert.ToInt32(MesDataFunction.OpcOperation.ReadPLC(21, opName))); // // } // //} // ////清空信号 // ////m_WorkStart_OpName[opName] = 0;//清空工件到位标志 // ////通知WEB更新产量 // //SendActuallyCount(opName, 0); //} QualityMark = Convert.ToInt32(ReadPLC(21, opName)); if (QualityMark == 1) { isPass = "1"; } else { isPass = "0"; } int EngineTypeID;//机型代码 int PartPallet_Code;//托盘编号 string EngineType;//机型 string EngineID;//工件编号 string OrderForm; MIS_BASE.GetEngineTypeFromPLC(opName, out EngineTypeID, out EngineType, out EngineID, out PartPallet_Code,out OrderForm); //EngineData Enginedata = (EngineData)EngineData_Hash_Read(opName); BaseDataSystemMES.WorkStartInsert_AutoWorkStation(opName, EngineID, PartPallet_Code, arrivedTime, leavedTime, TimeDiff, targetTime, null, isPass, 0); } } }