feat - add CFXevent

master
SoulStar 1 month ago
parent b6125ec679
commit 6b1d0ffa45

@ -25,6 +25,7 @@
using System.Diagnostics;
using CFX;
using CFX.InformationSystem.UnitValidation;
using CFX.Production;
using CFX.ResourcePerformance;
using CFX.Structures;
@ -34,18 +35,25 @@ using Sln.Iot.CFX.RequestReceived;
namespace Sln.Iot.CFX;
/// <summary>
///
/// CFX 帮助类
/// </summary>
public class CFXHelper
{
private readonly AmqpCFXEndpoint? _endpoint;
private static readonly Lazy<CFXHelper> lazy = new Lazy<CFXHelper>(() => new CFXHelper());
public CFXHelper(AmqpCFXEndpoint endpoint)
public static CFXHelper Instance
{
_endpoint = endpoint;
get
{
return lazy.Value;
}
}
/// <summary>
/// CFX通讯端点
/// </summary>
private readonly AmqpCFXEndpoint? _endpoint = new AmqpCFXEndpoint();
public void Init(string cfxHandle, Uri uri, string address)
{
try
@ -77,30 +85,50 @@ public class CFXHelper
{
CFXMessage response = null;
if (request.MessageBody is AreYouThereRequest)
if (request.MessageBody is AreYouThereRequest) //存在性检测请求
{
AreYouThereRequestReceived.Handle(request.MessageBody as AreYouThereRequest, out response);
}
else if (request.MessageBody is GetEndpointInformationRequest)
else if (request.MessageBody is GetEndpointInformationRequest) //获取终端节点信息请求
{
GetEndpointInformationRequestReceived.Handle(request.MessageBody as GetEndpointInformationRequest, out response);
}
else if (request.MessageBody is WhoIsThereRequest)
else if (request.MessageBody is WhoIsThereRequest) //设备存在性查询请求
{
WhoIsThereRequestReceived.Handle(request.MessageBody as WhoIsThereRequest, out response);
}
else if (request.MessageBody is GetActiveRecipeRequest)
else if (request.MessageBody is GetActiveRecipeRequest) //获取当前激活配方请求
{
GetActiveRecipeRequestReceived.Handle(request.MessageBody as GetActiveRecipeRequest, out response);
}
else if (request.MessageBody is GetActiveFaultsRequest)
else if (request.MessageBody is GetActiveFaultsRequest) //获取当前错误状态请求
{
GetActiveFaultsRequestReceived.Handle(request.MessageBody as GetActiveFaultsRequest, out response);
}
else if (request.MessageBody is HandleFaultRequest)
else if (request.MessageBody is HandleFaultRequest) //处理错误请求
{
HandleFaultRequestReceived.Handle(request.MessageBody as HandleFaultRequest, out response);
}
else if (request.MessageBody is ModifyStationParametersRequest) //设备修改参数请求
{
ModifyStationParametersRequestReceived.Handle(request.MessageBody as ModifyStationParametersRequest, out response);
}
else if (request.MessageBody is ValidateUnitsRequest) //生产单元验证请求
{
ValidateUnitsRequestReceived.Handle(request.MessageBody as ValidateUnitsRequest, out response);
}
else //不支持的请求类型
{
response = new NotSupportedResponse()
{
RequestResult = new RequestResult()
{
Result = StatusResult.Failed,
ResultCode = 0,
Message = $"不支持的请求类型:{request.MessageBody.GetType().Name}"
}
};
}
CFXEnvelope env = new CFXEnvelope(response);
return env;

@ -0,0 +1,31 @@
using CFX;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 终端节点连接事件
/// </summary>
public class EndpointConnectedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new EndpointConnected()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,31 @@
using CFX;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 终端节点断连事件
/// </summary>
public class EndpointShuttingDownEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new EndpointShuttingDown()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.ResourcePerformance;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 错误收到事件
/// </summary>
public class FaultAcknowledgedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new FaultAcknowledged()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.ResourcePerformance;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 错误清除事件
/// </summary>
public class FaultClearedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new FaultCleared()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.ResourcePerformance;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 错误发生事件
/// </summary>
public class FaultOccurredEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new FaultOccurred()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,31 @@
using CFX;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 心跳事件
/// </summary>
public class HeartbeatEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new Heartbeat()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.ResourcePerformance;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 日志记录事件
/// </summary>
public class LogEntryRecordedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new LogEntryRecorded()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 配方激活事件
/// </summary>
public class RecipeActivatedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new RecipeActivated()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 配方修改事件
/// </summary>
public class RecipeModifiedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new RecipeModified()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.ResourcePerformance;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 设备离线事件
/// </summary>
public class StationOfflineEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new StationOffline()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.ResourcePerformance;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 设备上线事件
/// </summary>
public class StationOnlineEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new StationOnline()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.ResourcePerformance;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 设备参数修改事件
/// </summary>
public class StationParametersModifiedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new StationParametersModified()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.ResourcePerformance;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 设备状态改变事件
/// </summary>
public class StationStateChangedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new StationStateChanged()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 单元抵达事件
/// </summary>
public class UnitsArrivedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new UnitsArrived()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 单元离站事件
/// </summary>
public class UnitsDepartedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new UnitsDeparted()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production.Processing;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 单元加工完成事件
/// </summary>
public class UnitsProcessedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new UnitsProcessed()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,33 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 工单完成事件
/// 带扫码枪的设备Units栏位中的UnitIdentifier必须填写
/// </summary>
public class WorkCompletedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new WorkCompleted()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 工段完成事件
/// </summary>
public class WorkStageCompletedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new WorkStageCompleted()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 工段暂停事件
/// </summary>
public class WorkStagePausedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new WorkStagePaused()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 工段恢复事件
/// </summary>
public class WorkStageResumedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new WorkStageResumed()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,32 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 工段启动事件
/// </summary>
public class WorkStageStartedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new WorkStageStarted()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,33 @@
using CFX;
using CFX.Production;
namespace Sln.Iot.CFX.Event
{
/// <summary>
/// 工单启动事件
/// 带扫码枪的设备Units栏位中的UnitIdentifier必须填写
/// </summary>
public class WorkStartedEvent
{
/// <summary>
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
{
CFXMessage eve = null;
try
{
eve = new WorkStarted()
{
};
}
catch (Exception e)
{
}
return eve;
}
}
}

@ -0,0 +1,66 @@
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2025 WenJY
* CLR4.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;
namespace Sln.Iot.CFX.RequestReceived;
/// <summary>
/// 5.4.1.5 - 广播查询请求
/// WhoIsThereRequest/Response
/// </summary>
public class ModifyStationParametersRequestReceived
{
/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="response"></param>
public static void Handle(ModifyStationParametersRequest request, out CFXMessage response)
{
try
{
response = new ModifyStationParametersResponse()
{
};
}
catch (Exception e)
{
//无法响应时上传NotSupportedResponse
response = new NotSupportedResponse()
{
RequestResult = new RequestResult()
{
Result = StatusResult.Failed,
ResultCode = 0,
Message = e.Message
}
};
}
}
}

@ -0,0 +1,66 @@
#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2025 WenJY
* CLR4.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.InformationSystem.UnitValidation;
using CFX.Structures;
namespace Sln.Iot.CFX.RequestReceived;
/// <summary>
/// 5.4.1.5 - 广播查询请求
/// WhoIsThereRequest/Response
/// </summary>
public class ValidateUnitsRequestReceived
{
/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="response"></param>
public static void Handle(ValidateUnitsRequest request, out CFXMessage response)
{
try
{
response = new ValidateUnitsResponse()
{
};
}
catch (Exception e)
{
//无法响应时上传NotSupportedResponse
response = new NotSupportedResponse()
{
RequestResult = new RequestResult()
{
Result = StatusResult.Failed,
ResultCode = 0,
Message = e.Message
}
};
}
}
}

@ -20,6 +20,11 @@ namespace Sln.Iot.PLC
private readonly SerilogHelper _log = SerilogHelper.Instance;
/// <summary>
/// PLC1 192.168.1.20
/// </summary>
public DeltaSerialOverTcp DeltaInstance0;
/// <summary>
/// PLC1 192.168.1.21
/// </summary>
@ -49,6 +54,7 @@ namespace Sln.Iot.PLC
{
List<Task<DeltaSerialOverTcp>> tasks = new List<Task<DeltaSerialOverTcp>>
{
CreateDeltaConnect("192.168.1.20", 502, 1),
CreateDeltaConnect("192.168.1.21", 502, 1),
CreateDeltaConnect("192.168.1.22", 502, 1),
CreateDeltaConnect("192.168.1.23", 502, 1),
@ -57,10 +63,11 @@ namespace Sln.Iot.PLC
await Task.WhenAll(tasks);
DeltaInstance1 = tasks[0].GetAwaiter().GetResult();
DeltaInstance2 = tasks[1].GetAwaiter().GetResult();
DeltaInstance3 = tasks[2].GetAwaiter().GetResult();
DeltaInstance4 = tasks[3].GetAwaiter().GetResult();
DeltaInstance0 = tasks[0].GetAwaiter().GetResult();
DeltaInstance1 = tasks[1].GetAwaiter().GetResult();
DeltaInstance2 = tasks[2].GetAwaiter().GetResult();
DeltaInstance3 = tasks[3].GetAwaiter().GetResult();
DeltaInstance4 = tasks[4].GetAwaiter().GetResult();
}
/// <summary>

@ -2,6 +2,7 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Sln.Iot.Business;
using Sln.Iot.CFX;
using Sln.Iot.Config;
using Sln.Iot.PLC;
using Sln.Iot.Repository;
@ -25,9 +26,10 @@ namespace Sln.Iot
var appConfig = AppConfigSetting.Load();
//PLC连接初始化
PLCConnect.Instance.InitConnect();
//业务类启动
BusinessStart business = new BusinessStart();
//CFX接口启动
//CFXHelper.Instance.Init();
log.Info($"系统启动成功,日志存放位置:{appConfig.logPath}");
await Task.Delay(-1);

@ -10,6 +10,7 @@
<ItemGroup>
<ProjectReference Include="..\Sln.Iot.Business\Sln.Iot.Business.csproj" />
<ProjectReference Include="..\Sln.Iot.CFX\Sln.Iot.CFX.csproj" />
<ProjectReference Include="..\Sln.Iot.Common\Sln.Iot.Common.csproj" />
<ProjectReference Include="..\Sln.Iot.Config\Sln.Iot.Config.csproj" />
<ProjectReference Include="..\Sln.Iot.PLC\Sln.Iot.PLC.csproj" />

Loading…
Cancel
Save