You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
6.2 KiB
C#

#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* (c) 2025 WenJY
* CLR4.0.30319.42000
* Mr.Wen's MacBook Pro
* Sln.Iot.CFX
* B906AE83-E238-4BF5-A269-1A48D38158CC
*
* WenJY
*
* 2025-10-24 15:26:56
* V1.0.0
*
*
*--------------------------------------------------------------------
*
*
*
*
* V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using System.Diagnostics;
using CFX;
using CFX.InformationSystem.UnitValidation;
using CFX.Production;
using CFX.ResourcePerformance;
using CFX.Structures;
using CFX.Transport;
using Sln.Iot.CFX.RequestReceived;
namespace Sln.Iot.CFX;
/// <summary>
/// CFX 帮助类
/// </summary>
public class CFXHelper
{
private static readonly Lazy<CFXHelper> lazy = new Lazy<CFXHelper>(() => new CFXHelper());
public static CFXHelper Instance
{
get
{
return lazy.Value;
}
}
/// <summary>
/// CFX通讯端点真空注胶机SDSH000001
/// </summary>
public AmqpCFXEndpoint? Endpoint1 = new AmqpCFXEndpoint();
/// <summary>
/// CFX通讯端点2上料提升机SDSH000002
/// </summary>
public AmqpCFXEndpoint? Endpoint2 = new AmqpCFXEndpoint();
/// <summary>
/// CFX通讯端点3隧道烤箱SDSH000003
/// </summary>
public AmqpCFXEndpoint? Endpoint3 = new AmqpCFXEndpoint();
public AmqpCFXEndpoint Init(string cfxHandle, Uri selfURI, Uri upperURI, string address)
{
AmqpCFXEndpoint endpoint = new AmqpCFXEndpoint();
try
{
endpoint.Open(cfxHandle, selfURI);
endpoint.AddPublishChannel(upperURI, address);
endpoint.OnRequestReceived -= Endpoint_OnRequestReceived;
endpoint.OnRequestReceived += Endpoint_OnRequestReceived;
}
catch (Exception e)
{
throw new InvalidOperationException($"CFX 接口初始化异常:{e.Message}");
}
return endpoint;
}
/// <summary>
/// 请求接收处理
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
private CFXEnvelope Endpoint_OnRequestReceived(CFXEnvelope request)
{
CFXMessage response = null;
if (request.MessageBody is AreYouThereRequest) //存在性检测请求
{
AreYouThereRequestReceived.Handle(request.MessageBody as AreYouThereRequest, out response);
}
else if (request.MessageBody is GetEndpointInformationRequest) //获取终端节点信息请求
{
GetEndpointInformationRequestReceived.Handle(request.MessageBody as GetEndpointInformationRequest, out response);
}
else if (request.MessageBody is WhoIsThereRequest) //设备存在性查询请求
{
WhoIsThereRequestReceived.Handle(request.MessageBody as WhoIsThereRequest, out response);
}
else if (request.MessageBody is GetActiveRecipeRequest) //获取当前激活配方请求
{
GetActiveRecipeRequestReceived.Handle(request.MessageBody as GetActiveRecipeRequest, out response);
}
else if (request.MessageBody is GetActiveFaultsRequest) //获取当前错误状态请求
{
GetActiveFaultsRequestReceived.Handle(request.MessageBody as GetActiveFaultsRequest, out response);
}
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 //不支持的请求类型
{
response = new NotSupportedResponse()
{
RequestResult = new RequestResult()
{
Result = StatusResult.Failed,
ResultCode = 0,
Message = $"不支持的请求类型:{request.MessageBody.GetType().Name}"
}
};
}
CFXEnvelope env = new CFXEnvelope(response);
return env;
}
/// <summary>
/// 主动推送事件
/// </summary>
/// <param name="env"></param>
public void PublishEvent(CFXEnvelope env)
{
try
{
if (Endpoint1 == null)
{
throw new ArgumentNullException($"AmqpCFXEndpoint is null");
}
Endpoint1.Publish(env);
}
catch (Exception e)
{
throw new InvalidOperationException($"推送事件异常:{e.Message}");
}
}
/// <summary>
/// 发送生产单元验证请求接收通知
/// </summary>
public void SendValidateUnitsRequest(string uri, string targetDevice)
{
ValidateUnitsRequest msg = new ValidateUnitsRequest()
{
Validations = new List<ValidationType>()
{
ValidationType.UnitRouteValidation,
ValidationType.UnitStatusValidation
},
PrimaryIdentifier = "Code",
Units = new List<UnitPosition>()
{
new UnitPosition()
{
UnitIdentifier = "ConveyorIn",
PositionNumber = 1,
},
new UnitPosition()
{
UnitIdentifier = "ConveyorOut",
PositionNumber = 2,
},
},
};
var validateresult = Endpoint1.ExecuteRequest(uri, new CFXEnvelope(msg)
{
Source = Endpoint1.CFXHandle,
Target = targetDevice
});
if (validateresult == null)
{
return;
}
var response = validateresult.MessageBody as ValidateUnitsResponse;
//响应逻辑
}
}