change - CFX初步验证

CFXTest
SoulStar 3 months ago
parent 32d25d5732
commit a45ef81d1e

@ -42,14 +42,14 @@ namespace Sln.Iot.Business
if (signalValue == 1001)
{
//读取托盘码和产品码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D5000", 20);
OperateResult<byte[]> pordBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D8000", 120);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D5000", 10);
OperateResult<byte[]> pordBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D8000", 60);
//成功验证
if (trayBytesResult.IsSuccess && pordBytesResult.IsSuccess)
{
//转换托盘码
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
_log.Info(traycode);
byte[] prodBytes = trayBytesResult.Content;
string[] prodcode = new string[6];
//分割转换产品码
@ -57,6 +57,7 @@ namespace Sln.Iot.Business
{
prodcode[i] = Encoding.ASCII.GetString(prodBytes[(i * 20)..(i * 20 + 20)]);
}
//sql更新
bool res = TrayBindingService.Instance.TrayBindingRefresh(traycode, prodcode);
if (!res)

@ -40,7 +40,7 @@ namespace Sln.Iot.Business
if (signalValue == 2001)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5000", 20);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{

@ -40,7 +40,7 @@ namespace Sln.Iot.Business
if (signalValue == 3001)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5020", 20);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5020", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{

@ -68,7 +68,7 @@ namespace Sln.Iot.Business
if(signalValue == 4003)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5000", 20);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{

@ -40,7 +40,7 @@ namespace Sln.Iot.Business
if (signalValue == 5001)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5020", 20);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5020", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{

@ -31,7 +31,7 @@ namespace Sln.Iot.Business
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance3, "D500");
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance4, "D500");
//成功验证
if (signalRes.IsSuccess)
{
@ -40,7 +40,7 @@ namespace Sln.Iot.Business
if (signalValue == 6001)
{
//读取托盘码和产品码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D5000", 20);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance4, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{
@ -59,7 +59,7 @@ namespace Sln.Iot.Business
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance3, "D500", 6002, DataTypeEnum.UInt16).IsSuccess;
res = _plc.PlcWrite(_plc.DeltaInstance4, "D500", 6002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("下料提升机PLC写入完成信号异常");

@ -0,0 +1,99 @@
using HslCommunication;
using HslCommunication.Core;
using Serilog;
using Sln.Iot.PLC;
using Sln.Iot.Repository.service;
using Sln.Iot.Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sln.Iot.Business
{
public class TestBusiness
{
private Timer _timer;
private readonly PLCConnect _plc = PLCConnect.Instance;
private readonly SerilogHelper _log = SerilogHelper.Instance;
public TestBusiness()
{
_timer = new Timer(TimerCallback, null, 0, 1000);
}
/// <summary>
/// RFID01上料提升机数据处理流程业务刷新
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
try
{
//var res = _plc.ReadBytes(_plc.DeltaInstance0, "D200", 9);
//var bytes = res.Content.Reverse().ToArray();
//ushort[] shorts = new ushort[9];
//if (bytes != null && bytes.Length != 0)
//{
// shorts[0] = BitConverter.ToUInt16(bytes, 0);
// shorts[1] = BitConverter.ToUInt16(bytes, 2);
// shorts[2] = BitConverter.ToUInt16(bytes, 4);
// shorts[3] = BitConverter.ToUInt16(bytes, 6);
// shorts[4] = BitConverter.ToUInt16(bytes, 8);
// shorts[5] = BitConverter.ToUInt16(bytes, 10);
// shorts[6] = BitConverter.ToUInt16(bytes, 12);
// shorts[7] = BitConverter.ToUInt16(bytes, 14);
// shorts[8] = BitConverter.ToUInt16(bytes, 16);
//}
//for (int i = 0; i < 9; i++)
//{
// _log.Info($"D20{i * 2}数值[{shorts[i].ToString()}]");
//}
//读取托盘码和产品码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D5000", 10);
OperateResult<byte[]> pordBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D8000", 60);
//转换托盘码
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
_log.Info("RFID读数" + traycode);
byte[] prodBytes = pordBytesResult.Content;
string[] prodcode = new string[6];
//分割转换产品码
for (int i = 0; i < 6; i++)
{
prodcode[i] = Encoding.ASCII.GetString(AscIIReverseTostring(prodBytes[(i * 20)..(i * 20 + 20)]));
_log.Info($"扫码枪读数{i + 1}是{prodcode[i]}");
}
}
catch (Exception ex)
{
_log.Error("隧道炉温度读取失败", ex);
}
}
public byte[] AscIIReverseTostring(byte[] bytes)
{
if (bytes.Length % 2 != 0)
{
return new byte[0];
}
for (int i = 0; i < bytes.Length / 2; i++)
{
byte temp = bytes[i * 2];
bytes[i * 2] = bytes[i * 2 + 1];
bytes[i * 2 + 1] = temp;
}
return bytes;
}
}
}

@ -50,30 +50,38 @@ public class CFXHelper
}
/// <summary>
/// CFX通讯端点
/// CFX通讯端点真空注胶机SDSH000001
/// </summary>
private readonly AmqpCFXEndpoint? _endpoint = new AmqpCFXEndpoint();
public AmqpCFXEndpoint? Endpoint1 = new AmqpCFXEndpoint();
public void Init(string cfxHandle, Uri uri, string address)
/// <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
{
if (_endpoint == null)
{
throw new ArgumentNullException($"AmqpCFXEndpoint is null");
}
endpoint.Open(cfxHandle, selfURI);
_endpoint.Open(cfxHandle, uri);
endpoint.AddPublishChannel(upperURI, address);
_endpoint.AddPublishChannel(uri, address);
endpoint.OnRequestReceived -= Endpoint_OnRequestReceived;
endpoint.OnRequestReceived += Endpoint_OnRequestReceived;
_endpoint.OnRequestReceived -= Endpoint_OnRequestReceived;
_endpoint.OnRequestReceived += Endpoint_OnRequestReceived;
}
catch (Exception e)
{
throw new InvalidOperationException($"CFX 接口初始化异常:{e.Message}");
}
return endpoint;
}
/// <summary>
@ -113,10 +121,6 @@ public class CFXHelper
{
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()
@ -142,16 +146,59 @@ public class CFXHelper
{
try
{
if (_endpoint == null)
if (Endpoint1 == null)
{
throw new ArgumentNullException($"AmqpCFXEndpoint is null");
}
_endpoint.Publish(env);
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;
//响应逻辑
}
}

@ -0,0 +1,213 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CFX;
using CFX.Structures;
using Sln.Iot.CFX.Event;
namespace Sln.Iot.CFX
{
/// <summary>
/// 入场前CFX测试
/// </summary>
public class CFXTest
{
CFXHelper _cfxHelper = CFXHelper.Instance;
HeartbeatEvent heartbeatEvent = new HeartbeatEvent();
EndpointConnectedEvent endpointConnectedEvent = new EndpointConnectedEvent();
EndpointShuttingDownEvent endpointShuttingDownEvent = new EndpointShuttingDownEvent();
FaultAcknowledgedEvent faultAcknowledgedEvent = new FaultAcknowledgedEvent();
FaultClearedEvent faultClearedEvent = new FaultClearedEvent();
FaultOccurredEvent faultOccurredEvent = new FaultOccurredEvent();
LogEntryRecordedEvent logEntryRecordedEvent = new LogEntryRecordedEvent();
RecipeActivatedEvent recipeActivatedEvent = new RecipeActivatedEvent();
RecipeModifiedEvent recipeModifiedEvent = new RecipeModifiedEvent();
StationOfflineEvent stationOfflineEvent = new StationOfflineEvent();
StationOnlineEvent stationOnlineEvent = new StationOnlineEvent();
StationParametersModifiedEvent stationParametersModifiedEvent = new StationParametersModifiedEvent();
StationStateChangedEvent stationStateChangedEvent = new StationStateChangedEvent();
UnitsArrivedEvent unitsArrivedEvent = new UnitsArrivedEvent();
UnitsDepartedEvent unitsDepartedEvent = new UnitsDepartedEvent();
UnitsProcessedEvent unitsProcessedEvent = new UnitsProcessedEvent();
WorkCompletedEvent workCompletedEvent = new WorkCompletedEvent();
WorkStageCompletedEvent workStageCompletedEvent = new WorkStageCompletedEvent();
WorkStagePausedEvent workStagePausedEvent = new WorkStagePausedEvent();
WorkStageResumedEvent workStageResumedEvent = new WorkStageResumedEvent();
WorkStageStartedEvent workStageStartedEvent = new WorkStageStartedEvent();
WorkStartedEvent workStartedEvent = new WorkStartedEvent();
public void Test1()
{
// 实例化所有事件对象
// 发布所有事件
//_cfxHelper.PublishEvent(new CFXEnvelope(heartbeatEvent.Handle("CFX.A00.SDSH000003")));
_cfxHelper.PublishEvent(new CFXEnvelope(endpointConnectedEvent.Handle("CFX.A00.SDSH000003")));
_cfxHelper.PublishEvent(new CFXEnvelope(faultOccurredEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(faultAcknowledgedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(stationStateChangedEvent.Handle(ResourceState.USD_Repair)));
_cfxHelper.PublishEvent(new CFXEnvelope(faultClearedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(stationStateChangedEvent.Handle(ResourceState.PRD)));
_cfxHelper.PublishEvent(new CFXEnvelope(logEntryRecordedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(recipeActivatedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(recipeModifiedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(stationOfflineEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(stationOnlineEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "-1", "0", "-1", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "0", "1", "0", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "1", "4", "1", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "2", "2", "2", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "3", "2", "3", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "4", "2", "4", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "5", "2", "5", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "6", "1", "6", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "7", "2", "7", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "8", "2", "8", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "9", "2", "9", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "10", "3", "10", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "11", "3", "11", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet("SDSH000003", "制程设备", "12", "2", "12", "1000", "0", "60", "3600", "4", "1", "5", "0", "0"))));
_cfxHelper.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(workStartedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle("PreHeatOven", 1)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStagePausedEvent.Handle("PreHeatOven", 1)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageResumedEvent.Handle("PreHeatOven", 1)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle("PreHeatOven", 1)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle("PreCureOven", 2)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStagePausedEvent.Handle("PreCureOven", 2)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageResumedEvent.Handle("PreCureOven", 2)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle("PreCureOven", 2)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle("CureOven", 3)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStagePausedEvent.Handle("CureOven", 3)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageResumedEvent.Handle("CureOven", 3)));
_cfxHelper.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle("CureOven", 3)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle("PreHeatOven", 1)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStagePausedEvent.Handle("PreHeatOven", 1)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageResumedEvent.Handle("PreHeatOven", 1)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle("PreHeatOven", 1)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle("PreCureOven", 2)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStagePausedEvent.Handle("PreCureOven", 2)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageResumedEvent.Handle("PreCureOven", 2)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle("PreCureOven", 2)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle("PreHeatOven", 1)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStagePausedEvent.Handle("PreHeatOven", 1)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageResumedEvent.Handle("PreHeatOven", 1)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle("PreHeatOven", 1)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle("PreCureOven", 2)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStagePausedEvent.Handle("PreCureOven", 2)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageResumedEvent.Handle("PreCureOven", 2)));
//_cfxHelper.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle("PreCureOven", 2)));
_cfxHelper.PublishEvent(new CFXEnvelope(workCompletedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(unitsProcessedEvent.Handle()));
_cfxHelper.PublishEvent(new CFXEnvelope(endpointShuttingDownEvent.Handle("CFX.A00.SDSH000003")));
_cfxHelper.SendValidateUnitsRequest("amqp://127.0.0.1:8888", "inline-control");
}
/// <summary>
/// stationParameters参数设置
/// </summary>
public List<Parameter> ParameterSet(
string interfaceID,
string equipType,
string status,
string light,
string statusCode,
string passQty,
string failQty,
string cycleTime,
string runningTime,
string waitingTime,
string selfCheck,
string inputQty,
string errorCnt,
string errorTimes
)
{
return new List<Parameter>()
{
new GenericParameter()
{
Name = "InterfaceID",
Value = interfaceID
},
new GenericParameter()
{
Name = "EquipType",
Value = equipType
},
new GenericParameter()
{
Name = "Status",
Value = status
},
new GenericParameter()
{
Name = "Light",
Value = light
},
new GenericParameter()
{
Name = "StatusCode",
Value = statusCode
},
new GenericParameter()
{
Name = "PassQty",
Value = passQty
},
new GenericParameter()
{
Name = "FailQty",
Value = failQty
},
new GenericParameter()
{
Name = "CycleTime",
Value = cycleTime
},
new GenericParameter()
{
Name = "RunningTime",
Value = runningTime
},
new GenericParameter()
{
Name = "WaitingTime",
Value = waitingTime
},
new GenericParameter()
{
Name = "SelfCheck",
Value = selfCheck
},
new GenericParameter()
{
Name = "InputQty",
Value = inputQty
},
new GenericParameter()
{
Name = "ErrorCnt",
Value = errorCnt
},
new GenericParameter()
{
Name = "ErrorTimes",
Value = errorTimes
},
};
}
}
}

@ -12,16 +12,16 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(string cfxHandle)
{
CFXMessage eve = null;
try
{
eve = new EndpointConnected()
{
CFXHandle = "CFX.S07.E022012702",
RequestNetworkUri = "amqp://host33/",
RequestTargetAddress = "/queue/SN23123"
CFXHandle = cfxHandle,
RequestNetworkUri = "amqp://127.0.0.1:1235",
RequestTargetAddress = "amqp://127.0.0.1:8888"
};
}
catch (Exception e)

@ -12,14 +12,14 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(string cfxHandle)
{
CFXMessage eve = null;
try
{
eve = new EndpointShuttingDown()
{
CFXHandle = "CFX.S07.E022012702",
CFXHandle = cfxHandle,
};
}
catch (Exception e)

@ -29,7 +29,7 @@ namespace Sln.Iot.CFX.Event
LoginName = "admin",
OperatorIdentifier = "OP-1000"
},
FaultOccurrenceId = Guid.NewGuid()
FaultOccurrenceId = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399")
};
}
catch (Exception e)

@ -29,7 +29,7 @@ namespace Sln.Iot.CFX.Event
LoginName = "admin",
OperatorIdentifier = "OP-1000"
},
FaultOccurrenceId = Guid.NewGuid()
FaultOccurrenceId = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399")
};
}
catch (Exception e)

@ -26,12 +26,12 @@ namespace Sln.Iot.CFX.Event
Cause = FaultCause.MechanicalFailure,
Severity = FaultSeverity.Error,
FaultCode = "ERROR 3943480",
FaultOccurrenceId = Guid.NewGuid(),
FaultOccurrenceId = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
Lane = 1,
AccessType = AccessType.Local,
Description = "Error",
OccurredAt = DateTime.Now,
TransactionID = Guid.NewGuid(),
TransactionID = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
}
};
}

@ -12,15 +12,15 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(string cfxHandle)
{
CFXMessage eve = null;
try
{
eve = new Heartbeat()
{
CFXHandle = "CFX.S07.E012012701",
HeartbeatFrequency = TimeSpan.FromSeconds(60)
CFXHandle = cfxHandle,
HeartbeatFrequency = TimeSpan.FromSeconds(10)
};
}
catch (Exception e)

@ -1,7 +1,6 @@
using CFX;
using CFX.ResourcePerformance;
using CFX.Structures;
using Sln.Iot.CFX.Parameters;
using Sln.Iot.Serilog;
namespace Sln.Iot.CFX.Event
@ -15,21 +14,14 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(List<Parameter> parameters)
{
CFXMessage eve = null;
try
{
eve = new StationParametersModified()
{
ModifiedParameters = new List<Parameter>()
{
new TestParameter()
{
Test1 = "1",
Test2 = "2"
}
}
ModifiedParameters = parameters
};
}
catch (Exception e)

@ -14,14 +14,26 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(ResourceState resourceState)
{
CFXMessage eve = null;
try
{
eve = new StationStateChanged()
{
NewState = ResourceState.PRD,
NewState = resourceState,
RelatedFault = new Fault()
{
Cause = FaultCause.MechanicalFailure,
Severity = FaultSeverity.Error,
FaultCode = "ERROR 3943480",
FaultOccurrenceId = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
Lane = 1,
AccessType = AccessType.Local,
Description = "Error",
OccurredAt = DateTime.Now,
TransactionID = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
}
};
}
catch (Exception e)

@ -25,7 +25,7 @@ namespace Sln.Iot.CFX.Event
{
new UnitPosition()
{
UnitIdentifier = "UNIT123456789",
UnitIdentifier = "VacuumInjection1",
PositionNumber = 1,
PositionName = "位置1",
X = 50.0,

@ -25,7 +25,7 @@ namespace Sln.Iot.CFX.Event
{
new UnitPosition()
{
UnitIdentifier = "UNIT123456789",
UnitIdentifier = "VacuumInjection1",
PositionNumber = 1,
PositionName = "位置1",
X = 50.0,

@ -23,18 +23,8 @@ namespace Sln.Iot.CFX.Event
{
TransactionId = Guid.NewGuid(),
OverallResult = ProcessingResult.Succeeded,
CommonProcessData = new ProcessData()
{
},
UnitProcessData = new List<ProcessedUnit>()
{
new ProcessedUnit()
{
UnitIdentifier = "ID12345",
}
}
CommonProcessData = null,
UnitProcessData = null
};
}
catch (Exception e)

@ -22,13 +22,14 @@ namespace Sln.Iot.CFX.Event
{
eve = new WorkCompleted()
{
TransactionID = Guid.NewGuid(),
TransactionID = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
PrimaryIdentifier = "WORKORDER-0001",
Result = WorkResult.Completed,
Units = new List<UnitPosition>()
{
new UnitPosition()
{
UnitIdentifier = "UNIT123456789",
UnitIdentifier = "PreHeatOven",
PositionNumber = 1,
PositionName = "位置1",
X = 50.0,
@ -37,6 +38,29 @@ namespace Sln.Iot.CFX.Event
FlipX = false,
FlipY = false
},
new UnitPosition()
{
UnitIdentifier = "PreCureOven",
PositionNumber = 2,
PositionName = "位置2",
X = 50.0,
Y = 80.0,
Rotation = 0.0,
FlipX = false,
FlipY = false
},
new UnitPosition()
{
UnitIdentifier = "CureOven",
PositionNumber = 3,
PositionName = "位置3",
X = 50.0,
Y = 80.0,
Rotation = 0.0,
FlipX = false,
FlipY = false
},
}
};
}

@ -14,18 +14,18 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(string stageName, int stageSequence)
{
CFXMessage eve = null;
try
{
eve = new WorkStageCompleted()
{
TransactionID = Guid.NewGuid(),
TransactionID = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
Stage = new Stage()
{
StageSequence = 1,
StageName = "工段1",
StageSequence = stageSequence,
StageName = stageName,
StageType = StageType.Work
},
Result = WorkResult.Completed,

@ -14,18 +14,18 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(string stageName, int stageSequence)
{
CFXMessage eve = null;
try
{
eve = new WorkStagePaused()
{
TransactionID = Guid.NewGuid(),
TransactionID = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
Stage = new Stage()
{
StageSequence = 1,
StageName = "工段1",
StageSequence = stageSequence,
StageName = stageName,
StageType = StageType.Work
}
};

@ -14,18 +14,18 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(string stageName, int stageSequence)
{
CFXMessage eve = null;
try
{
eve = new WorkStageResumed()
{
TransactionID = Guid.NewGuid(),
TransactionID = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
Stage = new Stage()
{
StageSequence = 1,
StageName = "工段1",
StageSequence = stageSequence,
StageName = stageName,
StageType = StageType.Work
}
};

@ -14,18 +14,18 @@ namespace Sln.Iot.CFX.Event
/// 数据封装处理
/// </summary>
/// <returns></returns>
public CFXMessage Handle()
public CFXMessage Handle(string stageName, int stageSequence)
{
CFXMessage eve = null;
try
{
eve = new WorkStageStarted()
{
TransactionID = Guid.NewGuid(),
TransactionID = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
Stage = new Stage()
{
StageSequence = 1,
StageName = "工段1",
StageSequence = stageSequence,
StageName = stageName,
StageType = StageType.Work
}
};

@ -22,13 +22,14 @@ namespace Sln.Iot.CFX.Event
{
eve = new WorkStarted()
{
TransactionID = Guid.NewGuid(),
TransactionID = Guid.Parse("281fa09f-cbf6-498d-9f27-7ca77cb60399"),
PrimaryIdentifier = "WORKORDER-0001",
Lane = 1,
Units = new List<UnitPosition>()
{
new UnitPosition()
{
UnitIdentifier = "UNIT123456789",
UnitIdentifier = "PreHeatOven",
PositionNumber = 1,
PositionName = "位置1",
X = 50.0,
@ -37,6 +38,28 @@ namespace Sln.Iot.CFX.Event
FlipX = false,
FlipY = false
},
new UnitPosition()
{
UnitIdentifier = "PreCureOven",
PositionNumber = 2,
PositionName = "位置2",
X = 50.0,
Y = 80.0,
Rotation = 0.0,
FlipX = false,
FlipY = false
},
new UnitPosition()
{
UnitIdentifier = "CureOven",
PositionNumber = 3,
PositionName = "位置3",
X = 50.0,
Y = 80.0,
Rotation = 0.0,
FlipX = false,
FlipY = false
},
}
};
}

@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CFX.Structures;
using CFX;
namespace Sln.Iot.CFX.Parameters
{
public class TestParameter : Parameter
{
public string Test1 { get; set; } = string.Empty;
public string Test2 { get; set; } = string.Empty;
}
}

@ -36,13 +36,13 @@ namespace Sln.Iot.CFX.RequestReceived;
public class AreYouThereRequestReceived
{
/// <summary>
///
/// 数据处理
/// </summary>
/// <param name="request"></param>
/// <param name="response"></param>
public static void Handle(AreYouThereRequest request, out CFXMessage response)
{
//
//业务逻辑
try
{
response = new AreYouThereResponse()
@ -54,9 +54,9 @@ public class AreYouThereRequestReceived
Message = "",
},
CFXHandle = "CFX.S07.E022012702",
RequestNetworkUri = "amqp://host33/",
RequestTargetAddress = "/queue/SN23123",
CFXHandle = "CFX.A00.SDSH000003",
RequestNetworkUri = "amqp://127.0.0.1:1235",
RequestTargetAddress = "amqp://127.0.0.1:8888"
};
}
catch (Exception e)

@ -47,7 +47,20 @@ public class GetActiveFaultsRequestReceived
{
response = new GetActiveFaultsResponse()
{
Result = new RequestResult()
{
Result = StatusResult.Success,
ResultCode = 0,
Message = "",
},
ActiveFaults = new List<Fault>()
{
new Fault()
{
Description = "测试错误1",
FaultCode = "5003",
}
}
};
}
catch (Exception e)

@ -45,9 +45,18 @@ public class GetActiveRecipeRequestReceived
{
try
{
//解析是哪个工位
response = new GetActiveRecipeResponse()
{
ActiveRecipeName = "配方A",
ActiveRecipeRevision = "1.0",
Result = new RequestResult()
{
Result = StatusResult.Success,
ResultCode = 0,
Message = ""
}
//配方数据
};
}
catch (Exception e)

@ -46,7 +46,109 @@ public class GetEndpointInformationRequestReceived
{
response = new GetEndpointInformationResponse()
{
Result = new RequestResult()
{
Result = StatusResult.Success,
ResultCode = 0,
Message = "",
},
EndpointInformation = new Endpoint()
{
CFXHandle = "CFX.A00.SDSH000003",
CFXVersion = "1.0",
RequestNetworkUri = "amqp://127.0.0.1:1235",
RequestTargetAddress = "amqp://127.0.0.1:8888",
ModelNumber = "设备型号",
NumberOfLanes = 1,
Vendor = "木子贸易",
SerialNumber = "设备序列号",
Stages = new List<StageInformation>
{
new StageInformation()
{
Stage = new Stage()
{
StageName = "工位名称",
StageType = StageType.Work,
StageSequence = 1,
}
}
},
SupportedTopics = new List<SupportedTopic>()
{
new SupportedTopic()
{
TopicName = "CFX",
TopicSupportType = TopicSupportType.Publisher,
SupportedMessages = new List<string>
{
"EndpointConnected",
"EndpointShuttingDown",
"GetEndpointInformationRequest/Response",
"AreYouThereRequest/Response",
"WhoIsThereRequest/Response",
"NotSupportedResponse",
"Heartbeat"
}
},
new SupportedTopic()
{
TopicName = "CFX.Production",
TopicSupportType = TopicSupportType.Publisher,
SupportedMessages = new List<string>
{
"UnitsArrived",
"WorkStarted",
"WorkStageStarted",
"WorkStageCompleted",
"WorkStagePaused",
"WorkStageResumed",
"WorkCompleted",
"UnitsDeparted",
"RecipeActivated",
"RecipeModified",
"GetActiveRecipeRequest/Response",
}
},
new SupportedTopic()
{
TopicName = "CFX.Production.Processing",
TopicSupportType = TopicSupportType.Publisher,
SupportedMessages = new List<string>
{
"UnitsProcessed",
}
},
new SupportedTopic()
{
TopicName = "CFX.InformationSystem.UnitValidation",
TopicSupportType = TopicSupportType.Publisher,
SupportedMessages = new List<string>
{
"ValidateUnitsRequest/Response",
}
},
new SupportedTopic()
{
TopicName = "CFX.ResourcePerformance",
TopicSupportType = TopicSupportType.Publisher,
SupportedMessages = new List<string>
{
"FaultOccurred",
"FaultAcknowledged",
"FaultCleared",
"HandleFaultRequest/Response",
"GetActiveFaultRequest/Response",
"LogEntryRecorded",
"StationOffline",
"StationOnline",
"StationStateChanged",
"StationParametersModified",
"ModifyStationParametersRequest/Response",
}
},
}
}
};
}
catch (Exception e)

@ -45,9 +45,18 @@ public class HandleFaultRequestReceived
{
try
{
if(request.HandleRemote == true)
{
//熄灭报警灯
}
response = new HandleFaultResponse()
{
Result = new RequestResult()
{
Result = StatusResult.Success,
ResultCode = 0,
Message = "",
},
};
}
catch (Exception e)

@ -45,9 +45,18 @@ public class ModifyStationParametersRequestReceived
{
try
{
//修改参数
response = new ModifyStationParametersResponse()
{
Result = new RequestResult()
{
Result = StatusResult.Success,
ResultCode = 0,
Message = "",
},
};
}
catch (Exception e)

@ -1,68 +0,0 @@
#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;
using Sln.Iot.Serilog;
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
}
};
SerilogHelper.Instance.Error("请求数据解析异常", e);
}
}
}

@ -44,9 +44,24 @@ public class WhoIsThereRequestReceived
{
try
{
//筛选支持的需求
response = new WhoIsThereResponse()
{
Result = new RequestResult()
{
Result = StatusResult.Success,
ResultCode = 0,
Message = "",
},
CFXHandle = "CFX.A00.SDSH000003",
RequestNetworkUri = "amqp://127.0.0.1:1235",
RequestTargetAddress = "amqp://127.0.0.1:8888"
};
}
catch (Exception e)

@ -23,27 +23,27 @@ namespace Sln.Iot.PLC
/// <summary>
/// PLC1 192.168.1.20
/// </summary>
public DeltaSerialOverTcp DeltaInstance0;
public DeltaTcpNet DeltaInstance0;
/// <summary>
/// PLC1 192.168.1.21
/// </summary>
public DeltaSerialOverTcp DeltaInstance1;
public DeltaTcpNet DeltaInstance1;
/// <summary>
/// PLC2 192.168.1.22
/// </summary>
public DeltaSerialOverTcp DeltaInstance2;
public DeltaTcpNet DeltaInstance2;
/// <summary>
/// PLC3 192.168.1.23
/// </summary>
public DeltaSerialOverTcp DeltaInstance3;
public DeltaTcpNet DeltaInstance3;
/// <summary>
/// PLC4 192.168.1.24
/// </summary>
public DeltaSerialOverTcp DeltaInstance4;
public DeltaTcpNet DeltaInstance4;
/// <summary>
/// 锁对象1
@ -52,7 +52,7 @@ namespace Sln.Iot.PLC
public async void InitConnect()
{
List<Task<DeltaSerialOverTcp>> tasks = new List<Task<DeltaSerialOverTcp>>
List<Task<DeltaTcpNet>> tasks = new List<Task<DeltaTcpNet>>
{
CreateDeltaConnect("192.168.1.20", 502, 1),
CreateDeltaConnect("192.168.1.21", 502, 1),
@ -68,6 +68,8 @@ namespace Sln.Iot.PLC
DeltaInstance2 = tasks[2].GetAwaiter().GetResult();
DeltaInstance3 = tasks[3].GetAwaiter().GetResult();
DeltaInstance4 = tasks[4].GetAwaiter().GetResult();
_log.Info("PLC连接全部成功");
}
/// <summary>
@ -77,11 +79,12 @@ namespace Sln.Iot.PLC
/// <param name="port"></param>
/// <param name="stationNo"></param>
/// <returns></returns>
public async Task<DeltaSerialOverTcp> CreateDeltaConnect(string ip, int port, byte stationNo)
public async Task<DeltaTcpNet> CreateDeltaConnect(string ip, int port, byte stationNo)
{
DeltaSerialOverTcp plc = new DeltaSerialOverTcp(ip, port, stationNo);
DeltaTcpNet plc = new DeltaTcpNet(ip, port, stationNo);
try
{
plc.Series = DeltaSeries.AS;
OperateResult res = new OperateResult();
res.IsSuccess = true;
int count = 0;
@ -112,7 +115,7 @@ namespace Sln.Iot.PLC
/// <param name="value">值</param>
/// <param name="type">数据类型</param>
/// <returns></returns>
public OperateResult PlcWrite(DeltaSerialOverTcp connect, string address, object value, DataTypeEnum type)
public OperateResult PlcWrite(DeltaTcpNet connect, string address, object value, DataTypeEnum type)
{
if (connect == null) return new OperateResult() { IsSuccess = false };
var result = new OperateResult() { IsSuccess = false };
@ -167,7 +170,7 @@ namespace Sln.Iot.PLC
/// <param name="address"></param>
/// <param name="data"></param>
/// <returns></returns>
public OperateResult PlcWriteBytes(DeltaSerialOverTcp connect, string address, byte[] data)
public OperateResult PlcWriteBytes(DeltaTcpNet connect, string address, byte[] data)
{
if (connect == null) return new OperateResult() { IsSuccess = false };
lock (locker1)
@ -181,7 +184,7 @@ namespace Sln.Iot.PLC
/// 读取int32
/// </summary>
/// <returns></returns>
public OperateResult<int> ReadInt32(DeltaSerialOverTcp connect, string address)
public OperateResult<int> ReadInt32(DeltaTcpNet connect, string address)
{
if (connect == null) return new OperateResult<int>() { IsSuccess = false };
lock (locker1)
@ -195,7 +198,7 @@ namespace Sln.Iot.PLC
/// 读取int16
/// </summary>
/// <returns></returns>
public OperateResult<short> ReadInt16(DeltaSerialOverTcp connect, string address)
public OperateResult<short> ReadInt16(DeltaTcpNet connect, string address)
{
if (connect == null) return new OperateResult<short>() { IsSuccess = false };
lock (locker1)
@ -210,7 +213,7 @@ namespace Sln.Iot.PLC
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public OperateResult<float> ReadFloat(DeltaSerialOverTcp connect, string address)
public OperateResult<float> ReadFloat(DeltaTcpNet connect, string address)
{
if (connect == null) return new OperateResult<float>() { IsSuccess = false };
lock (locker1)
@ -225,7 +228,7 @@ namespace Sln.Iot.PLC
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public OperateResult<bool> ReadBool(DeltaSerialOverTcp connect, string address)
public OperateResult<bool> ReadBool(DeltaTcpNet connect, string address)
{
if (connect == null) return new OperateResult<bool>() { IsSuccess = false };
lock (locker1)
@ -241,7 +244,7 @@ namespace Sln.Iot.PLC
/// <param name="address"></param>
/// <param name="length"></param>
/// <returns></returns>
public OperateResult<byte[]> ReadBytes(DeltaSerialOverTcp connect, string address, ushort length)
public OperateResult<byte[]> ReadBytes(DeltaTcpNet connect, string address, ushort length)
{
if (connect == null) return new OperateResult<byte[]>() { IsSuccess = false };
lock (locker1)

@ -25,14 +25,36 @@ namespace Sln.Iot
//配置文件加载
var appConfig = AppConfigSetting.Load();
//PLC连接初始化
PLCConnect.Instance.InitConnect();
//PLCConnect.Instance.InitConnect();
//业务类启动
BusinessStart business = new BusinessStart();
//BusinessStart business = new BusinessStart();
//CFX接口启动
//CFXHelper.Instance.Init();
CFXHelper.Instance.Endpoint1 = CFXHelper.Instance.Init("CFX.A00.SDSH000001",
new Uri("amqp://127.0.0.1:1235"),
new Uri("amqp://127.0.0.1:8888"),
"event");
CFXHelper.Instance.Endpoint1 = CFXHelper.Instance.Init("CFX.A00.SDSH000002",
new Uri("amqp://127.0.0.1:1235"),
new Uri("amqp://127.0.0.1:8888"),
"event");
CFXHelper.Instance.Endpoint1 = CFXHelper.Instance.Init("CFX.A00.SDSH000003",
new Uri("amqp://127.0.0.1:1235"),
new Uri("amqp://127.0.0.1:8888"),
"event");
log.Info($"系统启动成功,日志存放位置:{appConfig.logPath}");
CFXTest cFXTest = new CFXTest();
cFXTest.Test1();
//test();
await Task.Delay(-1);
}
private static void test()
{
TestBusiness test = new TestBusiness();
}
}
}
Loading…
Cancel
Save