update:更新B位静置库

This commit is contained in:
XingCheng3
2026-06-05 13:52:52 +08:00
parent d1403d22b8
commit 4aab62831a
21 changed files with 336 additions and 67 deletions

View File

@@ -7,6 +7,7 @@ namespace MesServerFunctions
{
partial class FunctionMES
{
// 防止 PLC 传递机型信号重复触发时并发进站。
object lockBarcodeEngineTypeGetOver = new object();
/// <summary>
@@ -32,6 +33,7 @@ namespace MesServerFunctions
MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC传递机型");
MIS_BASE.Write_TagValueByTagTypeID(34, opName, false);
// 同时读取 PLC 回传信息和 PAD 确认时写入的 MES 产品区信息。
MIS_BASE.GetEngineTypeFromPLC(opName, out int engineTypeID, out string engineType, out string engineID, out int palletCode, out string orderForm);
MIS_BASE.GetEngineTypeFromPLC_MES(opName, out int engineTypeIDMes, out string engineTypeMes, out string engineIDMes, out string orderFormMes);
@@ -47,6 +49,7 @@ namespace MesServerFunctions
return;
}
// PLC 回传产品必须与 PAD 确认上线产品一致,避免错件进站。
if (!string.Equals(engineID.Trim(), engineIDMes.Trim(), StringComparison.OrdinalIgnoreCase))
{
WriteManualStaticEngineError(opName, "PLC产品码与PAD确认产品码不一致PLC" + engineID + "PAD" + engineIDMes);
@@ -59,12 +62,14 @@ namespace MesServerFunctions
return;
}
// 进站前再次取产品执行信息,后续写 MOBY 使用数据库中的订单和型号。
if (!TryGetManualStaticOutProduct(engineID, out ManualStaticOutProduct product, out string productMessage))
{
WriteManualStaticEngineError(opName, productMessage);
return;
}
// 调用工厂 MES 进站,成功后才允许 PLC 工作。
CallWebService.Call_miFindCustomAndSfcData(opName, engineID, out string code, out string message);
if (code != "0")
{
@@ -73,6 +78,8 @@ namespace MesServerFunctions
}
MisDataFun.LogRecording_OP(opName, "INFO", "MOM", "进站成功:" + engineID);
// 写普通 MOBY 当前工位状态,供后续正常过站过程取数。
MisDataFun.OpName_MIS_MOBY_Insert(opName, product.EngineTypeID, product.EngineType, product.EngineID, palletCode, product.OrderForm, 0, 0, "");
MIS_BASE.Write_FixAllow(opName, true);
@@ -86,6 +93,9 @@ namespace MesServerFunctions
}
}
/// <summary>
/// OP431 进站失败时禁止 PLC 工作、置 MES 报警并通知页面。
/// </summary>
private void WriteManualStaticEngineError(string opName, string message)
{
MIS_BASE.Write_FixAllow(opName, false);

View File

@@ -1,4 +1,5 @@
using MesServerWork;
using MesDataFunction;
using MisDataFunDll;
using MisDataSaveDate;
using System;
@@ -21,8 +22,7 @@ namespace MesServerFunctions
if (tagValue != 1)
{
MIS_BASE.Write_MesReadOver(opName, false);
MIS_BASE.Write_MesWorkFinish(opName, false);
MisDataBaseFun.WriteMesReadOver(opName, false);
MIS_BASE.Write_OpNameIsOk(opName, -99);
MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC允许保存数据取消");
return;
@@ -30,6 +30,7 @@ namespace MesServerFunctions
MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC允许保存OP431静置数据");
// 读取 PLC 当前产品信息,后续质量数据和出站都以该产品码为准。
MIS_BASE.GetEngineTypeFromPLC(opName, out int engineTypeID, out string engineType, out string engineID, out int palletCode, out string orderForm);
if (string.IsNullOrWhiteSpace(engineID))
{
@@ -37,6 +38,7 @@ namespace MesServerFunctions
return;
}
// 重新查询 MES 执行信息,避免直接使用 PLC 中不完整的订单/机型数据。
MisDataFun.Moby_Select_PDC(engineID, out orderForm, out engineType, out engineTypeID);
if (engineTypeID <= 0)
{
@@ -44,21 +46,32 @@ namespace MesServerFunctions
return;
}
// PLC 合格标识只保留合格/不合格两种结果。
MIS_BASE.Read_QualityMask(opName, out int qualityMask);
qualityMask = NormalizeManualStaticQualityMask(qualityMask);
// 组装 OP431 静置质量数据:开始时间、完成时间、时间差、库位号。
if (!TryBuildManualStaticOutData(engineID, qualityMask, out ManualStaticOutData staticOutData, out string message))
{
WriteManualStaticMesReadError(opName, message);
return;
}
// 保存信号到达时,回写线下静置结束时间和静置时长。
if (!FinishManualStaticRecord(engineID, staticOutData.FinishTime, staticOutData.Minutes, out message))
{
WriteManualStaticMesReadError(opName, message);
return;
}
// 将四项静置质量数据写入测量数据合格索引和明细表。
if (!WriteManualStaticOutQualityData(opName, engineID, staticOutData, out message))
{
WriteManualStaticMesReadError(opName, message);
return;
}
// 写正常过站记录后查询 MOM 上传质量数据组。
MisDataFun.WorkStartInsert(opName, qualityMask);
MisDataFun.GetPartQualityGroupParams(opName, engineID, out DataTable dtQuality);
if (dtQuality == null || dtQuality.Rows.Count == 0)
@@ -67,6 +80,7 @@ namespace MesServerFunctions
return;
}
// 带质量数据调用工厂 MES 出站,返回 13921 时按不合格完成。
CallWebService.Call_dataCollectForSfcEx(opName, engineID, dtQuality, qualityMask, out string code, out string momMessage);
if (code == "0")
{
@@ -84,8 +98,7 @@ namespace MesServerFunctions
return;
}
MIS_BASE.Write_MesWorkFinish(opName, true);
MIS_BASE.Write_MesReadOver(opName, true);
MisDataBaseFun.WriteMesReadOver(opName, true);
MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "MES保存OP431静置数据完成");
MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "MES工作完成");
@@ -97,10 +110,12 @@ namespace MesServerFunctions
}
}
/// <summary>
/// OP431 保存失败时统一复位保存完成、置 MES 报警并通知页面。
/// </summary>
private void WriteManualStaticMesReadError(string opName, string message)
{
MIS_BASE.Write_MesReadOver(opName, false);
MIS_BASE.Write_MesWorkFinish(opName, false);
MisDataBaseFun.WriteMesReadOver(opName, false);
MIS_BASE.Write_TagValueByTagTypeID(34, opName, true);
SendMessage.AsyncSendMessage_Notice(opName, "【" + opName + "】" + message);
MisDataFun.LogRecording_OP(opName, "ERROR", "MesRead", message);

View File

@@ -19,6 +19,7 @@ namespace MesServerFunctions
if (tagValue == 1)
{
// OP431 不申请新 SFC只通知 PAD 可以扫描已有产品。
MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC申请上线等待PAD扫描已有产品");
MIS_BASE.Write_TagValueByTagTypeID(34, opName, false);
SendMessage.AsyncSendMessage_Notice(opName, "【" + opName + "】PLC已申请上线请PAD扫描产品码");
@@ -28,6 +29,7 @@ namespace MesServerFunctions
}
MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC申请上线取消");
// 取消申请时清掉本轮未完成的 MES 输出信号。
MIS_BASE.Write_EngineTypeGetOver_MES(opName, false);
MIS_BASE.Write_FixAllow(opName, false);
MIS_BASE.Write_TagValueByTagTypeID(34, opName, false);

View File

@@ -45,7 +45,6 @@ namespace MesServerFunctions
bool success = QueryManualStaticOutProduct(opName, engineID, minStaticMinutes, out string message);
SendManualStaticOutResult(opName, "PadScanQuery", success, message);
MisDataFun.LogRecording_OP(opName, success ? "INFO" : "WARNING", "PadScanQuery", message);
break;
}
// PAD 确认上线重新校验托盘到位、PLC申请上线和前端配置的最小静置时间通过后写 PLC 产品区。
@@ -77,6 +76,9 @@ namespace MesServerFunctions
}
}
/// <summary>
/// 解析 PAD 命令参数,取得产品码和最小静置分钟数。
/// </summary>
private bool TryGetManualStaticPadRequest(string opName, string command, string value, out string engineID, out decimal minStaticMinutes)
{
engineID = "";
@@ -100,6 +102,7 @@ namespace MesServerFunctions
return false;
}
// 参数最多允许“产品码^最小静置分钟数”两段。
string[] requestItems = requestValue.Split('^');
if (requestItems.Length > 2)
{
@@ -120,6 +123,7 @@ namespace MesServerFunctions
if (requestItems.Length == 2)
{
// 最小静置分钟数由 PAD 配置传入,未传时使用默认 30 分钟。
string minStaticMinutesText = requestItems[1].Trim();
if (!decimal.TryParse(minStaticMinutesText, out minStaticMinutes) || minStaticMinutes < 0)
{
@@ -171,6 +175,9 @@ namespace MesServerFunctions
InitAlarm(opName);
}
/// <summary>
/// 重新发送当前工位报警状态。
/// </summary>
private void InitAlarm(string opName)
{
FuntionMesRead.Alarm_InitAlarm_Send(opName, out Hashtable ht);