Files
2026-05-29 09:34:04 +08:00

327 lines
15 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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=1MES合格放行MES0.5=0MES0.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=1MES合格放行MES0.5=1MES0.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(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);
}
}
}