321 lines
15 KiB
C#
321 lines
15 KiB
C#
using DataLinkMesWork;
|
||
using DC_A95;
|
||
using SYNC_SAP_MES;
|
||
using System;
|
||
using System.Linq;
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
namespace MesWork
|
||
{
|
||
/// <summary>
|
||
/// 处理MIS逻辑
|
||
/// </summary>
|
||
public partial class MesWorkForm
|
||
{
|
||
/// <summary>
|
||
/// 处理MIS逻辑
|
||
/// </summary>
|
||
/// <param name="e"></param>
|
||
private void MIS_Funtion(object e)
|
||
{
|
||
try
|
||
{
|
||
if (NotHandlerSignal == "1")
|
||
{
|
||
return;
|
||
}
|
||
|
||
var msgEvent = (OpcData.CustomeEvetnArgs)e;
|
||
if (msgEvent.TagValue == null) return;
|
||
|
||
var tagID = msgEvent.TagID.ToString();
|
||
var opCode = msgEvent.OpName.ToString();//工位号
|
||
var tagTypeCodeID = (int)msgEvent.TagTypeCodeID;
|
||
var tagTypeID = (EnumTagTypeID)msgEvent.TagTypeID;
|
||
var isFirstValue = msgEvent.IsFirstValue.ToString().ToLower();
|
||
string tagValue;
|
||
switch (tagTypeID)
|
||
{
|
||
case EnumTagTypeID.BOOL:
|
||
tagValue = (Convert.ToInt32(msgEvent.TagValue)).ToString();
|
||
break;
|
||
default:
|
||
tagValue = msgEvent.TagValue.ToString();
|
||
break;
|
||
}
|
||
|
||
if (ValueT(isFirstValue))
|
||
{
|
||
//不处理第一次变化的值
|
||
return;
|
||
}
|
||
|
||
/*
|
||
15 系统健康
|
||
5 传递机型(AMS)
|
||
66 允许PLC工作(AMS)
|
||
34 发动机上线报警标志
|
||
20 AMS保存完数据(AMS)
|
||
112 发动机上线报警代码
|
||
73 机型标志(AMS)
|
||
74 变速箱总成编号(AMS)
|
||
75 产品型号(AMS)
|
||
116 缸体打印码
|
||
117 订单号
|
||
|
||
14 系统健康(PLC)
|
||
2 工件到位(PLC)
|
||
43 申请零件编号(PLC)
|
||
44 传递机型(PLC)
|
||
63 禁用MES(PLC)
|
||
9 机型标志(PLC)
|
||
10 变速箱总成编号(PLC)
|
||
11 产品型号(PLC)
|
||
80 托盘编号(PLC)
|
||
22 0空托盘,1合格件,2不合格件(PLC)
|
||
19 质量数据可以读数据(PLC)
|
||
21 质量数据工位合格标志(PLC)
|
||
23 0正常件,1返修件(PLC)
|
||
39 缸体打印码(PLC)
|
||
40 订单号(PLC)
|
||
120 上线缸体码(PLC)
|
||
*/
|
||
|
||
switch (tagTypeCodeID)
|
||
{
|
||
case 2://工件到位
|
||
if (tagValue == "1")
|
||
{
|
||
WritePLC_IF(73, opCode, 0);//机型ID
|
||
WritePLC_IF(74, opCode, "");//发动机流水号(总成编号)
|
||
WritePLC_IF(75, opCode, "");//产品型号,机型号
|
||
WritePLC_IF(116, opCode, "");//缸体码
|
||
WritePLC_IF(117, opCode, "");//订单号
|
||
WritePLC_IF(118, opCode, 0); // 打印位置
|
||
MesWorkForm.WritePLC_IF(112, opCode, 0); // 清空报警点位
|
||
MesWorkForm.WritePLC_IF(34, opCode, false);
|
||
}
|
||
else
|
||
{
|
||
MesWorkForm.WritePLC_IF(112, opCode, 0); // 清空报警点位
|
||
MesWorkForm.WritePLC_IF(34, opCode, false);
|
||
WritePLC_IF(20, opCode, false); // 保存完成
|
||
}
|
||
break;
|
||
case 14://心跳
|
||
WritePLC_IF(15, opCode, tagValue);
|
||
break;
|
||
case 19://允许保存
|
||
if (tagValue == "1")
|
||
{
|
||
var sortNo_PLC = ReadPLC(9, opCode).ToString();
|
||
var engineNo_PLC = ReadPLC(10, opCode).ToString();
|
||
var sortName_PLC = ReadPLC(11, opCode).ToString();
|
||
var partCode_PLC = ReadPLC(39, opCode).ToString();
|
||
var orderNo_PLC = ReadPLC(40, opCode).ToString();
|
||
|
||
var palletNo_PLC = Convert.ToInt32(ReadPLC(80, opCode).ToString());
|
||
|
||
MesWork_QC.ProcessData_PartOff(opCode, engineNo_PLC, palletNo_PLC, sortNo_PLC);
|
||
MesWork_QC.MesRead(opCode, tagValue, tagID);
|
||
|
||
|
||
WritePLC_IF(20, opCode, true);
|
||
}
|
||
else
|
||
{
|
||
WritePLC_IF(5, opCode, false);
|
||
WritePLC_IF(66, opCode, false);
|
||
WritePLC_IF(20, opCode, false);
|
||
}
|
||
break;
|
||
case 43://申请上线
|
||
if (tagValue == "1")
|
||
{
|
||
//1、是否有下发的订单
|
||
//2、是否申请上线
|
||
//3、是否满足上线条件
|
||
//4、缸体码是否符合生产机型
|
||
|
||
if (!OPCodes_LineSet.Split(',').Contains(opCode))//非线首
|
||
{
|
||
return;
|
||
}
|
||
//SyncFunc_From_SAP.SyncDataOperationTask("手动同步");
|
||
PLC_R.Read_LineSet(opCode, out string partCode, out int palletNo);
|
||
ExecuteDB.Select_OnLine_Plan_Engine(opCode, partCode, palletNo
|
||
, out string engineNo, out int sortNo, out string sortName, out string printCode, out string orderNo
|
||
, out int errCode, out string errMessage, out int printPosition);
|
||
|
||
//*******************在此处验证***************************
|
||
//按规则拆解partCode(缸体二维码),再获取BOM,验证该工位物料中是否存在该型号的缸体
|
||
//var res_SortType_FromBOM = CALL_Interfalce_WebAPI.Get_BOMs_ByWebAPI(MesWorkForm.LineID_Product, engineNo);
|
||
|
||
//**********************************************
|
||
|
||
//上线报警代码:errCode
|
||
//0 - 无错误
|
||
//1 - PLC逻辑错误,未申请上线
|
||
//2 - 没有可用订单
|
||
//3 - 扫描缸体码为空或格式错误
|
||
//4 - 缸体机型与生产机型不匹配
|
||
//5 - AMS写入信息与RFID信息验证不一致
|
||
//255 - 未知错误
|
||
if (errCode != 0)//获取计划失败
|
||
{
|
||
PLC_W.Write_LineSetAlarm(opCode, errCode);
|
||
LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"发动机上线申请错误:({errCode}){errMessage}");
|
||
}
|
||
else
|
||
{
|
||
// 复位报警变量
|
||
//112 发动机上线报警代码
|
||
//34 发动机上线报警标志
|
||
MesWorkForm.WritePLC_IF(112, opCode, 0);
|
||
MesWorkForm.WritePLC_IF(34, opCode, false);
|
||
|
||
WritePLC_IF(73, opCode, sortNo);//机型ID
|
||
WritePLC_IF(74, opCode, engineNo);//发动机流水号(总成编号)
|
||
WritePLC_IF(75, opCode, sortName);//产品型号,机型号
|
||
WritePLC_IF(116, opCode, printCode);//缸体码
|
||
WritePLC_IF(117, opCode, orderNo);//订单号
|
||
WritePLC_IF(118, opCode, printPosition); // 打印位置
|
||
WritePLC_IF(5, opCode, true);
|
||
|
||
//【PLC读取数据到RFID中,测试用】
|
||
//WritePLC_IF(9, opCode, sortNo);//机型ID
|
||
//WritePLC_IF(10, opCode, engineNo);//发动机流水号(总成编号)
|
||
//WritePLC_IF(11, opCode, sortName);//产品型号,机型号
|
||
//WritePLC_IF(39, opCode, partCode);//缸体码
|
||
//WritePLC_IF(40, opCode, orderNo);//订单号
|
||
|
||
LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"上线数据写入成功:engineNo={engineNo};sortNo={sortNo};sortName={sortName};printCode={printCode};orderNo={orderNo}");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
WritePLC_IF(5, opCode, false);
|
||
}
|
||
break;
|
||
case 44://传递机型
|
||
if (tagValue == "1")
|
||
{
|
||
var sortNo_PLC = ReadPLC(9, opCode).ToString();
|
||
var engineNo_PLC = ReadPLC(10, opCode).ToString();
|
||
var sortName_PLC = ReadPLC(11, opCode).ToString();
|
||
var partCode_PLC = ReadPLC(39, opCode).ToString();
|
||
var orderNo_PLC = ReadPLC(40, opCode).ToString();
|
||
|
||
var palletNo_PLC = Convert.ToInt32(ReadPLC(80, opCode).ToString());
|
||
|
||
if (OPCodes_LineSet.Split(',').Contains(opCode))//线首
|
||
{
|
||
var sortNo = ReadPLC(73, opCode).ToString();
|
||
var engineNo = ReadPLC(74, opCode).ToString();
|
||
var sortName = ReadPLC(75, opCode).ToString();
|
||
var partCode = ReadPLC(116, opCode).ToString();
|
||
var orderNo = ReadPLC(117, opCode).ToString();
|
||
|
||
var str = $"{sortNo}|{engineNo}|{sortName}|{partCode}|{orderNo}";
|
||
var str_PLC = $"{sortNo_PLC}|{engineNo_PLC}|{sortName_PLC}|{partCode_PLC}|{orderNo_PLC}";
|
||
|
||
if (str != str_PLC)
|
||
{
|
||
var errCode = (int)Type_AlarmOnline.Err_RW_Diff;
|
||
PLC_W.Write_LineSetAlarm(opCode, errCode);
|
||
LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, opCode, $"发动机上线信息读写校验不一致:({errCode})W:{str},R:{str_PLC}");
|
||
return;
|
||
}
|
||
//上线验证完成,消耗计划
|
||
ExecuteDB.Update_ExcutePlan_LineSetOK(opCode, engineNo);
|
||
WritePLC_IF(66, opCode, true);
|
||
LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"【{tagTypeCodeID}】上线下载数据验证成功,流水号消耗成功!opCode={opCode};engineNo={engineNo}");
|
||
|
||
}
|
||
//保存进站数据
|
||
MesWork_QC.ProcessData_PartOn(opCode, engineNo_PLC, palletNo_PLC, sortNo_PLC);
|
||
WritePLC_IF(66, opCode, true);
|
||
}
|
||
else
|
||
{
|
||
WritePLC_IF(66, opCode, false);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
}
|
||
catch (Exception err)
|
||
{
|
||
LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, "", $"MIS_Funtion报错!,,{err.Message}+{err.StackTrace}");
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 数据库记录信号变化
|
||
/// </summary>
|
||
/// <param name="msg"></param>
|
||
private void TagTypeCodeID_TagDataOnChange(object msgEvent)
|
||
{
|
||
try
|
||
{
|
||
OpcData.CustomeEvetnArgs e = (OpcData.CustomeEvetnArgs)msgEvent;
|
||
|
||
string tagValue;
|
||
if (e.TagValue == null) return;
|
||
|
||
switch (e.TagValue.ToString().ToLower())
|
||
{
|
||
case "1":
|
||
case "true":
|
||
tagValue = "1";
|
||
break;
|
||
default:
|
||
tagValue = "0";
|
||
break;
|
||
}
|
||
|
||
string TagTypeCodeID;
|
||
string opName;
|
||
string TagID;
|
||
string TagValue;
|
||
DateTime arrivedTime;
|
||
DateTime leavedTime;
|
||
int TimeDiff;
|
||
opName = e.OpName.ToString();
|
||
TagValue = tagValue;
|
||
TagTypeCodeID = e.TagTypeCodeID.ToString();
|
||
TagID = e.TagID.ToString();
|
||
leavedTime = Convert.ToDateTime(e.TimeStamp);
|
||
arrivedTime = Convert.ToDateTime(e.TimeStampBefore);
|
||
TimeDiff = Convert.ToInt32(e.TagKeepTime);
|
||
|
||
if (TagTypeCodeID != "14" && TagTypeCodeID != "15")
|
||
{
|
||
string procedureName;
|
||
procedureName = "测量数据设备状态日志_增加数据";
|
||
System.Data.SqlClient.SqlParameter[] thisParms = new System.Data.SqlClient.SqlParameter[7];
|
||
thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName);
|
||
thisParms[1] = new System.Data.SqlClient.SqlParameter("@信号类型代码", TagTypeCodeID);
|
||
thisParms[2] = new System.Data.SqlClient.SqlParameter("@TagID", TagID);
|
||
thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", TagValue);
|
||
thisParms[4] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime);
|
||
thisParms[5] = new System.Data.SqlClient.SqlParameter("@离开时间", leavedTime);
|
||
thisParms[6] = new System.Data.SqlClient.SqlParameter("@在线时间", TimeDiff);
|
||
DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms);
|
||
}
|
||
}
|
||
catch (Exception err)
|
||
{
|
||
}
|
||
|
||
}
|
||
|
||
|
||
}
|
||
}
|