From cea8cc9585e7f89ca7097d238cc13331d4d9fdd6 Mon Sep 17 00:00:00 2001 From: SoulStar Date: Mon, 2 Mar 2026 15:05:36 +0800 Subject: [PATCH] =?UTF-8?q?feat=20-=20=E6=B7=BB=E5=8A=A0=E6=96=B0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=EF=BC=8C=E7=94=A8=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E9=85=8D=E7=BD=AECFX=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sln.Iot.Business/RFID01Business.cs | 6 + Sln.Iot.Business/RFID06Business.cs | 13 +- Sln.Iot.CFX/CFXConnect/CFXConnect1.cs | 2 +- Sln.Iot.CFX/CFXConnect/CFXConnect2.cs | 6 +- Sln.Iot.CFX/CFXConnect/CFXConnect3.cs | 4 +- Sln.Iot.CFX/CFXConnect/CFXConnect4.cs | 132 ++++++++++++++++++ .../AreYouThereRequestReceived1.cs | 2 +- .../AreYouThereRequestReceived2.cs | 2 +- .../AreYouThereRequestReceived3.cs | 2 +- .../AreYouThereRequestReceived4.cs | 63 +++++++++ .../GetActiveFaultsRequestReceived1.cs | 18 +-- .../GetActiveFaultsRequestReceived2.cs | 17 +-- .../GetActiveFaultsRequestReceived3.cs | 17 +-- .../GetActiveFaultsRequestReceived4.cs | 85 +++++++++++ .../GetActiveRecipeRequestReceived4.cs | 62 ++++++++ .../GetEndpointInformationRequestReceived1.cs | 6 +- .../GetEndpointInformationRequestReceived2.cs | 24 ++-- .../GetEndpointInformationRequestReceived3.cs | 4 +- .../GetEndpointInformationRequestReceived4.cs | 93 ++++++++++++ .../HandleFaultRequestReceived4.cs | 65 +++++++++ ...ModifyStationParametersRequestReceived4.cs | 63 +++++++++ .../WhoIsThereRequestReceived1.cs | 2 +- .../WhoIsThereRequestReceived2.cs | 2 +- .../WhoIsThereRequestReceived3.cs | 2 +- .../WhoIsThereRequestReceived4.cs | 70 ++++++++++ Sln.Iot.Config/AppConfig.cs | 22 ++- Sln.Iot.Config/CFXConfig.cs | 7 +- Sln.Iot/Program.cs | 26 ++-- Sln.Iot/appsettings.json | 25 +++- 29 files changed, 770 insertions(+), 72 deletions(-) create mode 100644 Sln.Iot.CFX/CFXConnect/CFXConnect4.cs create mode 100644 Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived4.cs create mode 100644 Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived4.cs create mode 100644 Sln.Iot.CFX/CFXRequestes/GetActiveRecipeRequestReceived4.cs create mode 100644 Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived4.cs create mode 100644 Sln.Iot.CFX/CFXRequestes/HandleFaultRequestReceived4.cs create mode 100644 Sln.Iot.CFX/CFXRequestes/ModifyStationParametersRequestReceived4.cs create mode 100644 Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived4.cs diff --git a/Sln.Iot.Business/RFID01Business.cs b/Sln.Iot.Business/RFID01Business.cs index 5c7d797..8292695 100644 --- a/Sln.Iot.Business/RFID01Business.cs +++ b/Sln.Iot.Business/RFID01Business.cs @@ -30,6 +30,8 @@ namespace Sln.Iot.Business private UnitsArrivedEvent unitsArrivedEvent = new UnitsArrivedEvent(); private WorkStartedEvent workStartedEvent = new WorkStartedEvent(); private WorkStageStartedEvent workStageStartedEvent = new WorkStageStartedEvent(); + private WorkCompletedEvent workCompletedEvent = new WorkCompletedEvent(); + private UnitsDepartedEvent unitsDepartedEvent = new UnitsDepartedEvent(); private TrayBindingService trayBindingService = TrayBindingService.Instance; private CFXConnect1 connect1 = CFXConnect1.Instance; @@ -99,6 +101,7 @@ namespace Sln.Iot.Business //CFX Task.Run(() => { + //单元抵达事件 connect1.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle(traycode, prodcode))); connect2.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle(traycode, prodcode))); @@ -109,6 +112,9 @@ namespace Sln.Iot.Business connect2.PublishEvent(new CFXEnvelope(workStartedEvent.Handle(tid, traycode, prodcode))); connect3.PublishEvent(new CFXEnvelope(workStartedEvent.Handle(tid, traycode, prodcode))); _log.Info($"工作开始,ID:{tid}"); + connect2.PublishEvent(new CFXEnvelope(workCompletedEvent.Handle(tid, traycode, prodcode))); + connect2.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode))); + //预热炉工段开启 connect3.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle(tid, "PreHeatOven", 1))); _log.Info($"预热炉工段开始 ID:{tid}"); diff --git a/Sln.Iot.Business/RFID06Business.cs b/Sln.Iot.Business/RFID06Business.cs index 5d89cbd..bf53a1c 100644 --- a/Sln.Iot.Business/RFID06Business.cs +++ b/Sln.Iot.Business/RFID06Business.cs @@ -1,5 +1,6 @@ using CFX; using CFX.Structures; +using CFX.Structures.PressInsertion; using HslCommunication; using Sln.Iot.CFX.CFXBusiness; using Sln.Iot.CFX.CFXConnect; @@ -38,11 +39,13 @@ namespace Sln.Iot.Business private WorkStageCompletedEvent workStageCompletedEvent = new WorkStageCompletedEvent(); private UnitsProcessedEvent unitsProcessedEvent = new UnitsProcessedEvent(); private WorkCompletedEvent workCompletedEvent = new WorkCompletedEvent(); + private UnitsArrivedEvent unitsArrivedEvent = new UnitsArrivedEvent(); + private WorkStartedEvent workStartedEvent = new WorkStartedEvent(); // CFX连接 private CFXConnect1 connect1 = CFXConnect1.Instance; - private CFXConnect2 connect2 = CFXConnect2.Instance; private CFXConnect3 connect3 = CFXConnect3.Instance; + private CFXConnect4 connect4 = CFXConnect4.Instance; public RFID06Business() { @@ -109,14 +112,18 @@ namespace Sln.Iot.Business connect3.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle(tid, "CureOven", 3))); _log.Info($"固化炉工段完成, {tid}"); + connect4.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle(traycode, prodcode))); + connect4.PublishEvent(new CFXEnvelope(workStartedEvent.Handle(tid, traycode, prodcode))); + + //工单完成事件 connect1.PublishEvent(new CFXEnvelope(workCompletedEvent.Handle(tid, traycode, prodcode))); - connect2.PublishEvent(new CFXEnvelope(workCompletedEvent.Handle(tid, traycode, prodcode))); + connect4.PublishEvent(new CFXEnvelope(workCompletedEvent.Handle(tid, traycode, prodcode))); connect3.PublishEvent(new CFXEnvelope(workCompletedEvent.Handle(tid, traycode, prodcode))); _log.Info($"工单完成 ID:{tid}"); //单元离站事件 connect1.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode))); - connect2.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode))); + connect4.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode))); connect3.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode))); _log.Info($"{traycode} 单元离站 "); diff --git a/Sln.Iot.CFX/CFXConnect/CFXConnect1.cs b/Sln.Iot.CFX/CFXConnect/CFXConnect1.cs index 34e4230..6f3bbb5 100644 --- a/Sln.Iot.CFX/CFXConnect/CFXConnect1.cs +++ b/Sln.Iot.CFX/CFXConnect/CFXConnect1.cs @@ -40,7 +40,7 @@ namespace Sln.Iot.CFX.CFXConnect CFXEventTools cFXEventTools = CFXEventTools.Instance; - public string CFXHandle { get; set; } = "CFX.A00.SDSH000001"; + public string CFXHandle { get; set; } = "CFX.A00.OT00470018"; protected override CFXMessage HandleRequest(CFXEnvelope request) { diff --git a/Sln.Iot.CFX/CFXConnect/CFXConnect2.cs b/Sln.Iot.CFX/CFXConnect/CFXConnect2.cs index a82e9d9..a507928 100644 --- a/Sln.Iot.CFX/CFXConnect/CFXConnect2.cs +++ b/Sln.Iot.CFX/CFXConnect/CFXConnect2.cs @@ -16,7 +16,7 @@ using Sln.Iot.CFX.Event; namespace Sln.Iot.CFX.CFXConnect { /// - /// 提升机连接 + /// 提升机1连接 /// public class CFXConnect2 : CFXHelper { @@ -42,7 +42,7 @@ namespace Sln.Iot.CFX.CFXConnect CFXEventTools cFXEventTools = CFXEventTools.Instance; - public string CFXHandle { get; set; } = "SDSH000002"; + public string CFXHandle { get; set; } = "CFX.A00.OT00470019"; protected override CFXMessage HandleRequest(CFXEnvelope request) { @@ -112,7 +112,7 @@ namespace Sln.Iot.CFX.CFXConnect var validateresult = Endpoint.ExecuteRequest(uri, new CFXEnvelope(msg) { Source = Endpoint.CFXHandle, - Target = "CFX.A00.SDSH000002" + Target = "inline-control" }); if (validateresult == null) diff --git a/Sln.Iot.CFX/CFXConnect/CFXConnect3.cs b/Sln.Iot.CFX/CFXConnect/CFXConnect3.cs index 8f3beca..1f45799 100644 --- a/Sln.Iot.CFX/CFXConnect/CFXConnect3.cs +++ b/Sln.Iot.CFX/CFXConnect/CFXConnect3.cs @@ -42,7 +42,7 @@ namespace Sln.Iot.CFX.CFXConnect CFXEventTools cFXEventTools = CFXEventTools.Instance; - public string CFXHandle { get; set; } = "SDSH000003"; + public string CFXHandle { get; set; } = "CFX.A00.OT00470017"; protected override CFXMessage HandleRequest(CFXEnvelope request) { @@ -112,7 +112,7 @@ namespace Sln.Iot.CFX.CFXConnect var validateresult = Endpoint.ExecuteRequest(uri, new CFXEnvelope(msg) { Source = Endpoint.CFXHandle, - Target = "CFX.A00.SDSH000003" + Target = "inline-control" }); if (validateresult == null) diff --git a/Sln.Iot.CFX/CFXConnect/CFXConnect4.cs b/Sln.Iot.CFX/CFXConnect/CFXConnect4.cs new file mode 100644 index 0000000..eac3d15 --- /dev/null +++ b/Sln.Iot.CFX/CFXConnect/CFXConnect4.cs @@ -0,0 +1,132 @@ +using CFX.InformationSystem.UnitValidation; +using CFX.ResourcePerformance; +using CFX.Structures; +using CFX; +using Sln.Iot.CFX.RequestReceived; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using CFX.Production; +using Sln.Iot.CFX.CFXRequestes; +using Sln.Iot.CFX.CFXBusiness; +using Sln.Iot.CFX.Event; + +namespace Sln.Iot.CFX.CFXConnect +{ + /// + /// 提升机2连接 + /// + public class CFXConnect4 : CFXHelper + { + private static readonly Lazy lazy = new Lazy(() => new CFXConnect4()); + + public static CFXConnect4 Instance + { + get + { + return lazy.Value; + } + } + + AreYouThereRequestReceived4 areYouThereRequestReceived4 = new AreYouThereRequestReceived4(); + GetEndpointInformationRequestReceived4 getEndpointInformationRequestReceived4 = new GetEndpointInformationRequestReceived4(); + WhoIsThereRequestReceived4 whoIsThereRequestReceived4 = new WhoIsThereRequestReceived4(); + GetActiveRecipeRequestReceived4 getActiveRecipeRequestReceived4 = new GetActiveRecipeRequestReceived4(); + GetActiveFaultsRequestReceived4 getActiveFaultsRequestReceived4 = new GetActiveFaultsRequestReceived4(); + HandleFaultRequestReceived4 handleFaultRequestReceived4 = new HandleFaultRequestReceived4(); + ModifyStationParametersRequestReceived4 modifyStationParametersRequestReceived4 = new ModifyStationParametersRequestReceived4(); + + //HeartbeatEvent heartbeatEvent = new HeartbeatEvent(); + + CFXEventTools cFXEventTools = CFXEventTools.Instance; + + public string CFXHandle { get; set; } = "CFX.A00.OT00470020"; + + protected override CFXMessage HandleRequest(CFXEnvelope request) + { + CFXMessage response = null; + + if (request.MessageBody is AreYouThereRequest) //存在性检测请求 + { + areYouThereRequestReceived4.Handle(request.MessageBody as AreYouThereRequest, out response); + } + else if (request.MessageBody is GetEndpointInformationRequest) //获取终端节点信息请求 + { + getEndpointInformationRequestReceived4.Handle(request.MessageBody as GetEndpointInformationRequest, out response); + } + else if (request.MessageBody is WhoIsThereRequest) //设备存在性查询请求 + { + whoIsThereRequestReceived4.Handle(request.MessageBody as WhoIsThereRequest, out response); + } + else if (request.MessageBody is GetActiveRecipeRequest) //获取当前激活配方请求 + { + getActiveRecipeRequestReceived4.Handle(request.MessageBody as GetActiveRecipeRequest, out response); + } + else if (request.MessageBody is GetActiveFaultsRequest) //获取当前错误状态请求 + { + getActiveFaultsRequestReceived4.Handle(request.MessageBody as GetActiveFaultsRequest, out response); + } + else if (request.MessageBody is HandleFaultRequest) //处理错误请求 + { + handleFaultRequestReceived4.Handle(request.MessageBody as HandleFaultRequest, out response); + } + else if (request.MessageBody is ModifyStationParametersRequest) //设备修改参数请求 + { + modifyStationParametersRequestReceived4.Handle(request.MessageBody as ModifyStationParametersRequest, out response); + } + else //不支持的请求类型 + { + response = new NotSupportedResponse() + { + RequestResult = new RequestResult() + { + Result = StatusResult.Failed, + ResultCode = 0, + Message = $"不支持的请求类型:{request.MessageBody.GetType().Name}" + } + }; + } + + return response; + } + + /// + /// 发送生产单元验证请求接收通知 + /// + public void SendValidateUnitsRequest(string uri, string primaryIdentifier, string[] unitsIdentifier) + { + try + { + ValidateUnitsRequest msg = new ValidateUnitsRequest() + { + Validations = new List() + { + ValidationType.UnitTraceValidation, + }, + PrimaryIdentifier = primaryIdentifier, + Units = cFXEventTools.UnitPositionTrans(unitsIdentifier) + }; + + var validateresult = Endpoint.ExecuteRequest(uri, new CFXEnvelope(msg) + { + Source = Endpoint.CFXHandle, + Target = "inline-control" + }); + + if (validateresult == null) + { + return; + } + + var response = validateresult.MessageBody as ValidateUnitsResponse; + //响应逻辑 + } + catch (Exception ex) + { + + } + } + } +} diff --git a/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived1.cs b/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived1.cs index 1877e0d..fb9b775 100644 --- a/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived1.cs +++ b/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived1.cs @@ -52,7 +52,7 @@ public class AreYouThereRequestReceived1 : BaseAreYouThereRequestReceived Message = "", }, - CFXHandle = "CFX.A00.SDSH000001", + CFXHandle = "CFX.A00.OT00470018", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/" }; diff --git a/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived2.cs b/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived2.cs index bddc5d6..6a90ace 100644 --- a/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived2.cs +++ b/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived2.cs @@ -52,7 +52,7 @@ public class AreYouThereRequestReceived2 : BaseAreYouThereRequestReceived Message = "", }, - CFXHandle = "CFX.A00.SDSH000002", + CFXHandle = "CFX.A00.OT00470019", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/" }; diff --git a/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived3.cs b/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived3.cs index cd4760a..b75c2ef 100644 --- a/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived3.cs +++ b/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived3.cs @@ -52,7 +52,7 @@ public class AreYouThereRequestReceived3 : BaseAreYouThereRequestReceived Message = "", }, - CFXHandle = "CFX.A00.SDSH000003", + CFXHandle = "CFX.A00.OT00470017", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/" }; diff --git a/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived4.cs b/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived4.cs new file mode 100644 index 0000000..8ea5c98 --- /dev/null +++ b/Sln.Iot.CFX/CFXRequestes/AreYouThereRequestReceived4.cs @@ -0,0 +1,63 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Iot.CFX.CoreCommunications +* 唯一标识:8D142D51-E08D-42FC-8C59-4551A1B36306 +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-10-24 14:58:25 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using CFX; +using CFX.Structures; +using Sln.Iot.CFX.RequestReceived; +using Sln.Iot.Serilog; + +namespace Sln.Iot.CFX.CFXRequestes; + +/// +/// 5.4.1.1-端点在位查询请求 +/// AreYouThereRequest/Response +/// +public class AreYouThereRequestReceived4 : BaseAreYouThereRequestReceived +{ + /// + /// 子类重写处理 + /// + /// + /// + public override CFXMessage SubHandle(AreYouThereRequest request) + { + CFXMessage response = new AreYouThereResponse() + { + Result = new RequestResult() + { + Result = StatusResult.Success, + ResultCode = 0, + Message = "", + }, + + CFXHandle = "CFX.A00.OT00470020", + RequestNetworkUri = "amqp://127.0.0.1:1235/", + RequestTargetAddress = "amqp://127.0.0.1:8888/" + }; + + return response; + } + +} \ No newline at end of file diff --git a/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived1.cs b/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived1.cs index 9474e2b..140021b 100644 --- a/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived1.cs +++ b/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived1.cs @@ -78,15 +78,15 @@ public class GetActiveFaultsRequestReceived1 : BaseGetActiveFaultsRequestReceive ResultCode = 0, Message = "", }, - //ActiveFaults = faults - ActiveFaults = new List() - { - new Fault() - { - Description = "测试错误1", - FaultCode = "5003", - } - } + ActiveFaults = faults + //ActiveFaults = new List() + //{ + // new Fault() + // { + // Description = "测试错误1", + // FaultCode = "5003", + // } + //} }; return response; diff --git a/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived2.cs b/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived2.cs index 9d5f9eb..0b29d79 100644 --- a/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived2.cs +++ b/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived2.cs @@ -69,14 +69,15 @@ public class GetActiveFaultsRequestReceived2 : BaseGetActiveFaultsRequestReceive ResultCode = 0, Message = "", }, - ActiveFaults = new List() - { - new Fault() - { - Description = "测试错误1", - FaultCode = "5003", - } - } + ActiveFaults = faults + //ActiveFaults = new List() + //{ + // new Fault() + // { + // Description = "测试错误1", + // FaultCode = "5003", + // } + //} }; return response; diff --git a/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived3.cs b/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived3.cs index 410c2d7..be67b72 100644 --- a/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived3.cs +++ b/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived3.cs @@ -69,14 +69,15 @@ public class GetActiveFaultsRequestReceived3 : BaseGetActiveFaultsRequestReceive ResultCode = 0, Message = "", }, - ActiveFaults = new List() - { - new Fault() - { - Description = "测试错误1", - FaultCode = "5003", - } - } + ActiveFaults = faults + //ActiveFaults = new List() + //{ + // new Fault() + // { + // Description = "测试错误1", + // FaultCode = "5003", + // } + //} }; return response; diff --git a/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived4.cs b/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived4.cs new file mode 100644 index 0000000..07ce319 --- /dev/null +++ b/Sln.Iot.CFX/CFXRequestes/GetActiveFaultsRequestReceived4.cs @@ -0,0 +1,85 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Iot.CFX +* 唯一标识:CB14024A-08C4-4FF4-BD6C-8E8667D00263 +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-10-24 15:23:00 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using CFX; +using CFX.ResourcePerformance; +using CFX.Structures; +using Sln.Iot.CFX.RequestReceived; +using Sln.Iot.Repository.service; +using Sln.Iot.Serilog; + +namespace Sln.Iot.CFX.CFXRequestes; + +/// +/// 5.4.4.1.5 - 查询当前有无错误 +/// GetActiveFaultsRequest/Response +/// +public class GetActiveFaultsRequestReceived4 : BaseGetActiveFaultsRequestReceived +{ + private readonly ErrorService errorService = ErrorService.Instance; + + /// + /// 子类重写处理 + /// + /// + /// + public override CFXMessage SubHandle(GetActiveFaultsRequest request) + { + // 获取现在所有的错误 + var errorList = errorService.GetOvenList().ToList(); + + List faults = new List(); + + foreach (var fault in errorList) + { + faults.Add(new Fault() + { + Description = fault.ErrorName, + FaultCode = fault.ErrorCode, + }); + } + + CFXMessage response = new GetActiveFaultsResponse() + { + Result = new RequestResult() + { + Result = StatusResult.Success, + ResultCode = 0, + Message = "", + }, + ActiveFaults = faults + //ActiveFaults = new List() + //{ + // new Fault() + // { + // Description = "测试错误1", + // FaultCode = "5003", + // } + //} + }; + + return response; + } +} \ No newline at end of file diff --git a/Sln.Iot.CFX/CFXRequestes/GetActiveRecipeRequestReceived4.cs b/Sln.Iot.CFX/CFXRequestes/GetActiveRecipeRequestReceived4.cs new file mode 100644 index 0000000..ea5191c --- /dev/null +++ b/Sln.Iot.CFX/CFXRequestes/GetActiveRecipeRequestReceived4.cs @@ -0,0 +1,62 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Iot.CFX +* 唯一标识:686D7EAB-9E42-43B2-B990-AF162E76F781 +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-10-24 15:18:38 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using CFX; +using CFX.Production; +using CFX.Structures; +using Sln.Iot.CFX.RequestReceived; +using Sln.Iot.Serilog; + +namespace Sln.Iot.CFX.CFXRequestes; + +/// +/// 5.4.3.1.3 - 获取激活配方请求 +/// GetActiveRecipeRequest/Response +/// +public class GetActiveRecipeRequestReceived4 : BaseGetActiveRecipeRequestReceived +{ + /// + /// 子类重写处理 + /// + /// + /// + public override CFXMessage SubHandle(GetActiveRecipeRequest request) + { + CFXMessage response = new GetActiveRecipeResponse() + { + ActiveRecipeName = "No Recipe Device", + ActiveRecipeRevision = "1.0", + Result = new RequestResult() + { + Result = StatusResult.Success, + ResultCode = 0, + Message = "" + } + //配方数据 + }; + + return response; + } +} \ No newline at end of file diff --git a/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived1.cs b/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived1.cs index b9fe7d1..60119e3 100644 --- a/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived1.cs +++ b/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived1.cs @@ -55,14 +55,14 @@ public class GetEndpointInformationRequestReceived1 : BaseGetEndpointInformation }, EndpointInformation = new Endpoint() { - CFXHandle = "CFX.A00.SDSH000001", + CFXHandle = "CFX.A00.OT00470018", CFXVersion = "2.0", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/", - ModelNumber = "XYZ真空注胶机", + ModelNumber = "真空注胶机", NumberOfLanes = 1, Vendor = "木子贸易中山有限公司", - SerialNumber = "SDSH000001", + SerialNumber = "OT00470018", Stages = new List { new StageInformation() diff --git a/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived2.cs b/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived2.cs index 06c3d5b..e8a2ef2 100644 --- a/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived2.cs +++ b/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived2.cs @@ -55,14 +55,14 @@ public class GetEndpointInformationRequestReceived2 : BaseGetEndpointInformation }, EndpointInformation = new Endpoint() { - CFXHandle = "CFX.A00.SDSH000002", + CFXHandle = "CFX.A00.OT00470019", CFXVersion = "2.0", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/", - ModelNumber = "升降回流", + ModelNumber = "升降回流机-1", NumberOfLanes = 1, Vendor = "木子贸易中山有限公司", - SerialNumber = "SDSH000002", + SerialNumber = "OT00470019", Stages = new List { new StageInformation() @@ -74,15 +74,15 @@ public class GetEndpointInformationRequestReceived2 : BaseGetEndpointInformation StageSequence = 1, } }, - new StageInformation() - { - Stage = new Stage() - { - StageName = "ConveyorOut", - StageType = StageType.Work, - StageSequence = 2, - } - } + //new StageInformation() + //{ + // Stage = new Stage() + // { + // StageName = "ConveyorOut", + // StageType = StageType.Work, + // StageSequence = 2, + // } + //} }, SupportedTopics = CFXSupportedTopicList.SupportedTopics } diff --git a/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived3.cs b/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived3.cs index f1a700e..c88d8c8 100644 --- a/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived3.cs +++ b/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived3.cs @@ -55,14 +55,14 @@ public class GetEndpointInformationRequestReceived3 : BaseGetEndpointInformation }, EndpointInformation = new Endpoint() { - CFXHandle = "CFX.A00.SDSH000003", + CFXHandle = "CFX.A00.OT00470017", CFXVersion = "2.0", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/", ModelNumber = "隧道烤箱", NumberOfLanes = 1, Vendor = "木子贸易中山有限公司", - SerialNumber = "SDSH000003", + SerialNumber = "OT00470017", Stages = new List { new StageInformation() diff --git a/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived4.cs b/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived4.cs new file mode 100644 index 0000000..5172111 --- /dev/null +++ b/Sln.Iot.CFX/CFXRequestes/GetEndpointInformationRequestReceived4.cs @@ -0,0 +1,93 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Iot.CFX.CoreCommunications +* 唯一标识:4063233D-BE40-415F-B28C-EBA14C47EA52 +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-10-24 15:00:21 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using CFX; +using CFX.Structures; +using Sln.Iot.CFX.CFXBusiness; +using Sln.Iot.CFX.RequestReceived; +using Sln.Iot.Serilog; + +namespace Sln.Iot.CFX.CFXRequestes; + +/// +/// 5.4.1.4 - 获取端点信息请求 +/// GetEndpointInformationRequest/Response +/// +public class GetEndpointInformationRequestReceived4 : BaseGetEndpointInformationRequestReceived +{ + + /// + /// 子类重写处理 + /// + /// + /// + public override CFXMessage SubHandle(GetEndpointInformationRequest request) + { + CFXMessage response = new GetEndpointInformationResponse() + { + Result = new RequestResult() + { + Result = StatusResult.Success, + ResultCode = 0, + Message = "", + }, + EndpointInformation = new Endpoint() + { + CFXHandle = "CFX.A00.OT00470020", + CFXVersion = "2.0", + RequestNetworkUri = "amqp://127.0.0.1:1235/", + RequestTargetAddress = "amqp://127.0.0.1:8888/", + ModelNumber = "升降回流机-2", + NumberOfLanes = 1, + Vendor = "木子贸易中山有限公司", + SerialNumber = "OT00470020", + Stages = new List + { + //new StageInformation() + //{ + // Stage = new Stage() + // { + // StageName = "ConveyorIn", + // StageType = StageType.Work, + // StageSequence = 1, + // } + //}, + new StageInformation() + { + Stage = new Stage() + { + StageName = "ConveyorOut", + StageType = StageType.Work, + StageSequence = 1, + } + } + }, + SupportedTopics = CFXSupportedTopicList.SupportedTopics + } + }; + + return response; + } +} \ No newline at end of file diff --git a/Sln.Iot.CFX/CFXRequestes/HandleFaultRequestReceived4.cs b/Sln.Iot.CFX/CFXRequestes/HandleFaultRequestReceived4.cs new file mode 100644 index 0000000..0fa225c --- /dev/null +++ b/Sln.Iot.CFX/CFXRequestes/HandleFaultRequestReceived4.cs @@ -0,0 +1,65 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Iot.CFX +* 唯一标识:F3C2C0B6-F8E7-4869-B396-291233785B23 +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-10-24 15:20:11 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using CFX; +using CFX.ResourcePerformance; +using CFX.Structures; +using Sln.Iot.CFX.RequestReceived; +using Sln.Iot.Serilog; + +namespace Sln.Iot.CFX.CFXRequestes; + +/// +/// 5.4.4.1.4 - 处理故障请求 +/// HandleFaultRequest/Response +/// +public class HandleFaultRequestReceived4 : BaseHandleFaultRequestReceived +{ + + /// + /// 子类重写处理 + /// + /// + /// + public override CFXMessage SubHandle(HandleFaultRequest request) + { + if (request.HandleRemote == true) + { + //熄灭报警灯 + } + + CFXMessage response = new HandleFaultResponse() + { + Result = new RequestResult() + { + Result = StatusResult.Success, + ResultCode = 0, + Message = "", + }, + }; + + return response; + } +} \ No newline at end of file diff --git a/Sln.Iot.CFX/CFXRequestes/ModifyStationParametersRequestReceived4.cs b/Sln.Iot.CFX/CFXRequestes/ModifyStationParametersRequestReceived4.cs new file mode 100644 index 0000000..fb1bf6a --- /dev/null +++ b/Sln.Iot.CFX/CFXRequestes/ModifyStationParametersRequestReceived4.cs @@ -0,0 +1,63 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Iot.CFX.CoreCommunications +* 唯一标识:8E7C0E19-8462-42CA-AC22-F89BF2927C6A +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-10-24 15:00:54 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using CFX; +using CFX.ResourcePerformance; +using CFX.Structures; +using Sln.Iot.CFX.RequestReceived; +using Sln.Iot.Serilog; + +namespace Sln.Iot.CFX.CFXRequestes; + +/// +/// 5.4.1.5 - 广播查询请求 +/// WhoIsThereRequest/Response +/// +public class ModifyStationParametersRequestReceived4 : BaseModifyStationParametersRequestReceived +{ + /// + /// 子类重写处理 + /// + /// + /// + public override CFXMessage SubHandle(ModifyStationParametersRequest request) + { + //配方修改 + + //同时主动上报StationParameterModified + + CFXMessage response = new ModifyStationParametersResponse() + { + Result = new RequestResult() + { + Result = StatusResult.Success, + ResultCode = 0, + Message = "", + }, + }; + + return response; + } +} \ No newline at end of file diff --git a/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived1.cs b/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived1.cs index f80e9c6..6d67723 100644 --- a/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived1.cs +++ b/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived1.cs @@ -55,7 +55,7 @@ public class WhoIsThereRequestReceived1 : BaseWhoIsThereRequestReceived Message = "", }, - CFXHandle = "CFX.A00.SDSH000001", + CFXHandle = "CFX.A00.OT00470018", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/" }; diff --git a/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived2.cs b/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived2.cs index fac725b..3fd5475 100644 --- a/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived2.cs +++ b/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived2.cs @@ -55,7 +55,7 @@ public class WhoIsThereRequestReceived2 : BaseWhoIsThereRequestReceived Message = "", }, - CFXHandle = "CFX.A00.SDSH000002", + CFXHandle = "CFX.A00.OT00470019", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/" }; diff --git a/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived3.cs b/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived3.cs index a370a6c..f71363b 100644 --- a/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived3.cs +++ b/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived3.cs @@ -55,7 +55,7 @@ public class WhoIsThereRequestReceived3 : BaseWhoIsThereRequestReceived Message = "", }, - CFXHandle = "CFX.A00.SDSH000003", + CFXHandle = "CFX.A00.OT00470017", RequestNetworkUri = "amqp://127.0.0.1:1235/", RequestTargetAddress = "amqp://127.0.0.1:8888/" }; diff --git a/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived4.cs b/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived4.cs new file mode 100644 index 0000000..245ee3e --- /dev/null +++ b/Sln.Iot.CFX/CFXRequestes/WhoIsThereRequestReceived4.cs @@ -0,0 +1,70 @@ +#region << 版 本 注 释 >> + +/*-------------------------------------------------------------------- +* 版权所有 (c) 2025 WenJY 保留所有权利。 +* CLR版本:4.0.30319.42000 +* 机器名称:Mr.Wen's MacBook Pro +* 命名空间:Sln.Iot.CFX.CoreCommunications +* 唯一标识:8E7C0E19-8462-42CA-AC22-F89BF2927C6A +* +* 创建者:WenJY +* 电子邮箱: +* 创建时间:2025-10-24 15:00:54 +* 版本:V1.0.0 +* 描述: +* +*-------------------------------------------------------------------- +* 修改人: +* 时间: +* 修改说明: +* +* 版本:V1.0.0 +*--------------------------------------------------------------------*/ + +#endregion << 版 本 注 释 >> + +using CFX; +using CFX.Structures; +using Sln.Iot.CFX.CFXBusiness; +using Sln.Iot.CFX.RequestReceived; +using Sln.Iot.Serilog; + +namespace Sln.Iot.CFX.CFXRequestes; + +/// +/// 5.4.1.5 - 广播查询请求 +/// WhoIsThereRequest/Response +/// +public class WhoIsThereRequestReceived4 : BaseWhoIsThereRequestReceived +{ + /// + /// 子类重写处理 + /// + /// + /// + public override CFXMessage SubHandle(WhoIsThereRequest request) + { + if (CFXSupportedTopicList.IsSupportJudge(request.SupportedTopics)) + { + CFXMessage response = new WhoIsThereResponse() + { + Result = new RequestResult() + { + Result = StatusResult.Success, + ResultCode = 0, + Message = "", + }, + + CFXHandle = "CFX.A00.OT00470020", + RequestNetworkUri = "amqp://127.0.0.1:1235/", + RequestTargetAddress = "amqp://127.0.0.1:8888/" + }; + + return response; + } + else + { + return null; + } + } +} \ No newline at end of file diff --git a/Sln.Iot.Config/AppConfig.cs b/Sln.Iot.Config/AppConfig.cs index 5f866c3..1ed77d3 100644 --- a/Sln.Iot.Config/AppConfig.cs +++ b/Sln.Iot.Config/AppConfig.cs @@ -40,10 +40,28 @@ namespace Sln.Iot.Config public List PLCConfig { get; set; } /// - /// CFX配置 + /// CFX配置-真空箱 /// - public List CFXConfig { get; set; } + public CFXConfig VacuumConfig { get; set; } + /// + /// CFX配置-提升机1 + /// + public CFXConfig Lift1Config { get; set; } + + /// + /// CFX配置-烤炉 + /// + public CFXConfig OvenConfig { get; set; } + + /// + /// CFX配置-提升机2 + /// + public CFXConfig Lift2Config { get; set; } + + /// + /// Gets the current application configuration instance. + /// public AppConfig Value => this; } } \ No newline at end of file diff --git a/Sln.Iot.Config/CFXConfig.cs b/Sln.Iot.Config/CFXConfig.cs index daadf98..9d8229f 100644 --- a/Sln.Iot.Config/CFXConfig.cs +++ b/Sln.Iot.Config/CFXConfig.cs @@ -11,6 +11,11 @@ namespace Sln.Iot.Config /// public class CFXConfig { + /// + /// 设备名称 + /// + public string DeviceName { get; set; } + /// /// CFXHandle /// @@ -24,6 +29,6 @@ namespace Sln.Iot.Config /// /// 上位系统URI /// - public int UpperURI { get; set; } + public string UpperURI { get; set; } } } diff --git a/Sln.Iot/Program.cs b/Sln.Iot/Program.cs index 6d5ed69..f024ed9 100644 --- a/Sln.Iot/Program.cs +++ b/Sln.Iot/Program.cs @@ -65,18 +65,21 @@ namespace Sln.Iot //CFX接口启动 //真空注胶机 - CFXConnect1.Instance.Init("CFX.A00.SDSH000001", - new Uri("amqp://127.0.0.1:1235"), - new Uri("amqp://127.0.0.1:30031")); - //升降回流 - CFXConnect2.Instance.Init("CFX.A00.SDSH000002", - new Uri("amqp://127.0.0.1:1236"), - new Uri("amqp://127.0.0.1:30031")); + CFXConnect1.Instance.Init(appConfig.VacuumConfig.CFXHandle, + new Uri(appConfig.VacuumConfig.LocalURI), + new Uri(appConfig.VacuumConfig.UpperURI)); + //提升机1 + CFXConnect2.Instance.Init(appConfig.Lift1Config.CFXHandle, + new Uri(appConfig.Lift1Config.LocalURI), + new Uri(appConfig.Lift1Config.UpperURI)); //隧道烤箱 - CFXConnect3.Instance.Init("CFX.A00.SDSH000003", - new Uri("amqp://127.0.0.1:1237"), - new Uri("amqp://127.0.0.1:30031")); - + CFXConnect3.Instance.Init(appConfig.OvenConfig.CFXHandle, + new Uri(appConfig.OvenConfig.LocalURI), + new Uri(appConfig.OvenConfig.UpperURI)); + //提升机2 + CFXConnect4.Instance.Init(appConfig.Lift2Config.CFXHandle, + new Uri(appConfig.Lift2Config.LocalURI), + new Uri(appConfig.Lift2Config.UpperURI)); ////CFX接口启动 ////真空注胶机 @@ -114,6 +117,7 @@ namespace Sln.Iot CFXConnect1.Instance.PublishEvent(new CFXEnvelope(new EndpointShuttingDownEvent().Handle(CFXConnect1.Instance.CFXHandle))); CFXConnect2.Instance.PublishEvent(new CFXEnvelope(new EndpointShuttingDownEvent().Handle(CFXConnect2.Instance.CFXHandle))); CFXConnect3.Instance.PublishEvent(new CFXEnvelope(new EndpointShuttingDownEvent().Handle(CFXConnect3.Instance.CFXHandle))); + CFXConnect4.Instance.PublishEvent(new CFXEnvelope(new EndpointShuttingDownEvent().Handle(CFXConnect4.Instance.CFXHandle))); } } } \ No newline at end of file diff --git a/Sln.Iot/appsettings.json b/Sln.Iot/appsettings.json index ccf8f57..ec7f85d 100644 --- a/Sln.Iot/appsettings.json +++ b/Sln.Iot/appsettings.json @@ -1,6 +1,29 @@ { "AppConfig": { "logPath": "D:\\log", - + "VacuumConfig": { + "DeviceName": "Vacuum", + "CFXHandle": "CFX.A00.OT00470018", + "LocalURI": "amqp://127.0.0.1:1235", + "UpperURI": "amqp://127.0.0.1:30031" + }, + "Lift1Config": { + "DeviceName": "Lift1", + "CFXHandle": "CFX.A00.OT00470019", + "LocalURI": "amqp://127.0.0.1:1236", + "UpperURI": "amqp://127.0.0.1:30031" + }, + "OvenConfig": { + "DeviceName": "Oven", + "CFXHandle": "CFX.A00.OT00470017", + "LocalURI": "amqp://127.0.0.1:1237", + "UpperURI": "amqp://127.0.0.1:30031" + }, + "Lift2Config": { + "DeviceName": "Lift2", + "CFXHandle": "CFX.A00.OT00470020", + "LocalURI": "amqp://127.0.0.1:1238", + "UpperURI": "amqp://127.0.0.1:30031" + } } }