327 lines
15 KiB
C#
327 lines
15 KiB
C#
|
||
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
|
||
{
|
||
|
||
|
||
|
||
///<summary>
|
||
/// 处理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 设备报警
|
||
/// </summary>
|
||
/// <param name = "e" ></ param >
|
||
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<DoWhatPlc.ReturnValueString>(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(DtWebApi.ReadWritePLC.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);
|
||
|
||
}
|
||
|
||
|
||
|
||
}
|
||
}
|