feat - 基本框架删减重构

delta-2
SoulStar 1 month ago
parent 56a1ad12a1
commit 42718c29f1

@ -20,7 +20,8 @@ namespace Sln.Iot.Business
private RFID06Business _rfid06;
private ErrorAnalyseBusiness _errorAnalyse;
private RecipeBusiness _recipeBusiness;
private MesReportBusiness _mesReportBusiness;
private TCPRFIDBinding _tcpRfidBinding;
//private MesReportBusiness _mesReportBusiness;
public BusinessStart()
{
_rfid01 = new RFID01Business();
@ -31,7 +32,8 @@ namespace Sln.Iot.Business
_rfid06 = new RFID06Business();
_errorAnalyse = new ErrorAnalyseBusiness();
_recipeBusiness = new RecipeBusiness();
_mesReportBusiness = new MesReportBusiness();
_tcpRfidBinding = TCPRFIDBinding.Instance;
//_mesReportBusiness = new MesReportBusiness();
}
}
}

@ -0,0 +1,28 @@
using System.Text.Json.Serialization;
namespace Sln.Iot.Business.Entity
{
public class TCPRFIDBindingEntity
{
[JsonPropertyName("rfid")]
public string? Rfid { get; set; }
[JsonPropertyName("sn1")]
public string? Sn1 { get; set; }
[JsonPropertyName("sn2")]
public string? Sn2 { get; set; }
[JsonPropertyName("sn3")]
public string? Sn3 { get; set; }
[JsonPropertyName("sn4")]
public string? Sn4 { get; set; }
[JsonPropertyName("sn5")]
public string? Sn5 { get; set; }
[JsonPropertyName("sn6")]
public string? Sn6 { get; set; }
}
}

@ -35,9 +35,7 @@ namespace Sln.Iot.Business
private FaultOccurredEvent faultOccurredEvent = new FaultOccurredEvent();
private FaultClearedEvent faultClearedEvent = new FaultClearedEvent();
private CFXConnect1 connect1 = CFXConnect1.Instance;
private CFXConnect2 connect2 = CFXConnect2.Instance;
private CFXConnect3 connect3 = CFXConnect3.Instance;
private CFXConnectOven connect2 = CFXConnectOven.Instance;
public ErrorAnalyseBusiness()
{

@ -28,7 +28,7 @@ namespace Sln.Iot.Business
private readonly PLCConnect _plc = PLCConnect.Instance;
CFXConnect1 _cfxHelper = CFXConnect1.Instance;
CFXConnect2 _cfxHelper2 = CFXConnect2.Instance;
CFXConnectOven _cfxHelper2 = CFXConnectOven.Instance;
CFXConnect3 _cfxHelper3 = CFXConnect3.Instance;
CFXConnect4 _cfxHelper4 = CFXConnect4.Instance;
StationParametersModifiedEvent stationParametersModifiedEvent = new StationParametersModifiedEvent();

@ -15,6 +15,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
@ -22,6 +23,9 @@ using static System.Runtime.CompilerServices.RuntimeHelpers;
namespace Sln.Iot.Business
{
/// <summary>
/// RFID01真空箱内
/// </summary>
public class RFID01Business
{
private Timer _timer;
@ -37,9 +41,7 @@ namespace Sln.Iot.Business
private UnitsDepartedEvent unitsDepartedEvent = new UnitsDepartedEvent();
private TrayBindingService trayBindingService = TrayBindingService.Instance;
private CFXConnect1 connect1 = CFXConnect1.Instance;
private CFXConnect2 connect2 = CFXConnect2.Instance;
private CFXConnect3 connect3 = CFXConnect3.Instance;
private CFXConnectVacuum connectVacuum = CFXConnectVacuum.Instance;
public RFID01Business()
{
@ -47,7 +49,7 @@ namespace Sln.Iot.Business
}
/// <summary>
/// RFID01上料提升机数据处理流程业务刷新
/// RFID01真空箱内
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
@ -56,7 +58,7 @@ namespace Sln.Iot.Business
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance3, "D500");
OperateResult<short> signalRes = _plc.ReadInt16(_plc.PLC22, "D800");
//成功验证
if (signalRes.IsSuccess)
{
@ -65,11 +67,9 @@ namespace Sln.Iot.Business
if (signalValue == 1001)
{
//读取托盘码和产品码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance3, "D5000", 10);
OperateResult<byte[]> pordBytesResult1 = _plc.ReadBytes(_plc.DeltaInstance3, "D8000", 90);
OperateResult<byte[]> pordBytesResult2 = _plc.ReadBytes(_plc.DeltaInstance3, "D8090", 90);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.PLC22, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess && pordBytesResult1.IsSuccess && pordBytesResult2.IsSuccess)
if (trayBytesResult.IsSuccess)
{
//转换托盘码
@ -77,56 +77,28 @@ namespace Sln.Iot.Business
traycode = traycode.Replace("?", "");
traycode = traycode.Replace("\0", "");
_log.Info($"托盘到达-RFID01-托盘号-[{traycode}]");
byte[] prodBytes = pordBytesResult1.Content.Concat(pordBytesResult2.Content).ToArray();
string[] prodcode = new string[6];
//分割转换产品码
for (int i = 0; i < 6; i++)
{
prodcode[i] = Encoding.ASCII.GetString(prodBytes[(i * 60)..(i * 60 + 60)]);
prodcode[i] = prodcode[i].Replace("\0", "");
if (!string.IsNullOrEmpty(prodcode[i]))
{
// 将相邻偶数位和奇数位字符对调
char[] chars = prodcode[i].ToCharArray();
for (int j = 0; j < chars.Length - 1; j += 2)
{
// 交换相邻的两个字符
char temp = chars[j];
chars[j] = chars[j + 1];
chars[j + 1] = temp;
}
prodcode[i] = new string(chars);
GlobalVar.Connect2Entity.InputQuantity++;
GlobalVar.Connect2Entity.PassQuantity++;
GlobalVar.Connect3Entity.InputQuantity++;
GlobalVar.Connect1Entity.InputQuantity++;
GlobalVar.Connect1Entity.PassQuantity++;
GlobalVar.Connect3Entity.PassQuantity++;
GlobalVar.Connect4Entity.InputQuantity++;
GlobalVar.Connect4Entity.PassQuantity++;
_log.Info($"{prodcode[i]}进入产线");
}
}
//connect1.SendValidateUnitsRequest("", traycode, prodcode);
//生成work唯一guid(tid)
Guid tid = Guid.NewGuid();
//sql更新
bool res = trayBindingService.TrayBindingRefresh(tid, traycode, prodcode);
if (!res)
{
_log.Error("上料提升机数据库写入异常");
}
//记录预热炉到达时间
trayBindingService.UpDateTime(DateTime.Now.ToString(), traycode, "1");
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance3, "D500", 1002, DataTypeEnum.UInt16).IsSuccess;
bool res = _plc.PlcWrite(_plc.PLC22, "D800", 1002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("上料提升机PLC写入完成信号异常");
_log.Error("RFID01 读电子标签 PLC写入完成信号异常");
}
//取出work唯一guid(tid)
string stid = trayBindingService.TidGet(traycode);
if (!Guid.TryParse(stid, out Guid tid))
{
tid = Guid.Parse("11111111-1111-4111-9111-111111111111");
_log.Error("找不到对应的托盘信息赋值默认GUID");
}
//读取托盘对应的产品码
string[] prodcode = trayBindingService.ProdCodeGet(traycode);
GlobalVar.Connect2Entity.CycleTime = CommonUtil.AddRandom(AppConfigSetting._config.CycleTime2, 5);
//CFX
@ -134,29 +106,33 @@ namespace Sln.Iot.Business
{
//单元抵达事件
connect1.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle(traycode, prodcode)));
connect2.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle(traycode, prodcode)));
connect3.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle(traycode, prodcode)));
_log.Info($"{traycode} 抵达设备");
connectVacuum.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle(traycode, prodcode)));
//工作开始事件
connect1.PublishEvent(new CFXEnvelope(workStartedEvent.Handle(tid, traycode, prodcode)));
connect2.PublishEvent(new CFXEnvelope(workStartedEvent.Handle(tid, traycode, prodcode)));
connect3.PublishEvent(new CFXEnvelope(workStartedEvent.Handle(tid, traycode, prodcode)));
connectVacuum.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}");
//真空箱工段开启
connectVacuum.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle(tid, "Vacuum", 1)));
_log.Info($"真空箱工段开始 ID:{tid}");
});
}
else
{
_log.Error($"PLC读取失败原因1{trayBytesResult.Message} 2{pordBytesResult1.Message} 3{pordBytesResult2.Message}");
_log.Error($"PLC读取失败原因1{trayBytesResult.Message} ");
}
//流程完成
}
else if (signalValue == 1003)
{
//TODO :读取参数
//写入完成信号
bool res = _plc.PlcWrite(_plc.PLC22, "D800", 1004, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("RFID01 读胶机参数 PLC写入完成信号异常");
}
}
}
else
{

@ -30,9 +30,13 @@ namespace Sln.Iot.Business
private WorkStageStartedEvent workStageStartedEvent = new WorkStageStartedEvent();
private WorkStageCompletedEvent workStageCompletedEvent = new WorkStageCompletedEvent();
private CFXConnect1 connect1 = CFXConnect1.Instance;
private CFXConnect2 connect2 = CFXConnect2.Instance;
private CFXConnect3 connect3 = CFXConnect3.Instance;
private WorkCompletedEvent workCompletedEvent = new WorkCompletedEvent();
private UnitsDepartedEvent unitsDepartedEvent = new UnitsDepartedEvent();
private UnitsArrivedEvent unitsArrivedEvent = new UnitsArrivedEvent();
private WorkStartedEvent workStartedEvent = new WorkStartedEvent();
private CFXConnectOven ConnectOven = CFXConnectOven.Instance;
private CFXConnectVacuum ConnectVacuum = CFXConnectVacuum.Instance;
public RFID02Business()
@ -50,7 +54,7 @@ namespace Sln.Iot.Business
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance1, "D800");
OperateResult<short> signalRes = _plc.ReadInt16(_plc.PLC23, "D800");
//成功验证
if (signalRes.IsSuccess)
{
@ -59,7 +63,7 @@ namespace Sln.Iot.Business
if (signalValue == 2001)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5000", 10);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.PLC23, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{
@ -69,55 +73,46 @@ namespace Sln.Iot.Business
traycode = traycode.Replace("\0", "");
_log.Info($"托盘到达-RFID02-托盘号-[{traycode}]");
//sql更新
//取出work唯一guid(tid)
string stid = trayBindingService.TidGet(traycode);
if(!Guid.TryParse(stid, out Guid tid))
{
tid = Guid.Parse("11111111-1111-4111-9111-111111111111");
_log.Error("找不到对应的托盘信息赋值默认GUID");
}
//记录胶机1真空箱内到达时间
trayBindingService.UpDateTime(DateTime.Now.ToString(), traycode, "2");
bool res = false;
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance1, "D800", 2002, DataTypeEnum.UInt16).IsSuccess;
res = _plc.PlcWrite(_plc.PLC23, "D800", 2002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机1真空箱内写入完成信号异常");
}
//CFX
//取出work唯一guid(tid)
string stid = trayBindingService.TidGet(traycode);
if (!Guid.TryParse(stid, out Guid tid))
{
tid = Guid.Parse("11111111-1111-4111-9111-111111111111");
_log.Error("找不到对应的托盘信息赋值默认GUID");
}
string[] prodcode = trayBindingService.ProdCodeGet(traycode);
//CFX TODO
Task.Run(() =>
{
//预热炉工段完成事件
connect3.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle(tid, "PreHeatOven", 1)));
_log.Info($"预热炉工段完成 ID:{tid}");
//真空箱1工段开启
connect1.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle(tid, "VacuumInjection1", 1)));
_log.Info($"真空箱1工段开始 ID:{tid}");
//真空箱工段完成事件
ConnectVacuum.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle(tid, "Vacuum", 1)));
_log.Info($"真空箱工段完成 ID:{tid}");
ConnectVacuum.PublishEvent(new CFXEnvelope(workCompletedEvent.Handle(tid, traycode, prodcode)));
_log.Info($"工作完成事件发布 ID:{tid}");
ConnectVacuum.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode)));
_log.Info($"单元离站 ID:{tid}");
//预热炉数据采集
var data = unitsProcessPLCDataGetBusiness.PreHeatOvenPlcDataGet();
ovenPlcDataService.InsertData(stid, data);
_log.Info($"预热炉数据采集, 预热炉温度:{data}");
//真空箱1数据采集
var data2 = unitsProcessPLCDataGetBusiness.Vacuum1PlcDataGet();
vacuumInjectionPlcDataService.InsertData(stid, data2);
_log.Info($"真空箱1温度数据采集\n" +
$"胶量1:{data2.GlueAmountSetValue1}\t" +
$"推胶速度1:{data2.GluePushSpeedSetValue1}\n" +
$"A1温度1:{data2.BarrelA1TempActValue1}\t" +
$"A2温度1:{data2.BarrelA2TempActValue1}\t" +
$"B1温度1:{data2.BarrelB1TempActValue1}\t" +
$"B2温度1:{data2.BarrelB2TempActValue1}\n" +
$"A泵压力1:{data2.PumpAPressureActValue1}\t" +
$"B泵压力1:{data2.PumpBPressureActValue1}\t" +
$"真空度1:{data2.VacuumDegreeActValue1}\t" +
$"保压时间1:{data2.PressureHoldTimeSetValue1}");
//单元抵达事件
ConnectOven.PublishEvent(new CFXEnvelope(unitsArrivedEvent.Handle(traycode, prodcode)));
//工作开始事件
ConnectOven.PublishEvent(new CFXEnvelope(workStartedEvent.Handle(tid, traycode, prodcode)));
_log.Info($"工作开始ID:{tid}");
//真空箱工段开启
ConnectOven.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle(tid, "Oven", 1)));
_log.Info($"真空箱工段开始 ID:{tid}");
});
//CFX
@ -128,6 +123,50 @@ namespace Sln.Iot.Business
}
//流程完成
}
else if (signalValue == 2003)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.PLC23, "D5000", 10);
if (trayBytesResult.IsSuccess)
{
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
traycode = traycode.Replace("?", "");
traycode = traycode.Replace("\0", "");
//计算预热炉停留时长: time2 - time1
string time2 = trayBindingService.GetTimeByTrayCode(traycode, "2");
string time1 = trayBindingService.GetTimeByTrayCode(traycode, "1");
ushort spanSecond = 0;
if (!string.IsNullOrEmpty(time2) && !string.IsNullOrEmpty(time1))
{
TimeSpan span = Convert.ToDateTime(time2) - Convert.ToDateTime(time1);
spanSecond = (ushort)span.TotalSeconds;
_log.Info($"预热炉停留时长: [{spanSecond}]秒");
}
bool re = _plc.PlcWrite(_plc.PLC23, "D810", spanSecond, DataTypeEnum.UInt16).IsSuccess;
if (!re)
{
_log.Error("RFID02 发送预热炉停留时长 PLC写入异常");
}
}
else
{
_log.Error($"PLC读取失败原因{trayBytesResult.Message}");
}
//写入完成信号
bool res = _plc.PlcWrite(_plc.PLC23, "D800", 2004, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("RFID02 发送真空箱停留时长 PLC写入完成信号异常");
}
Task.Run(() =>
{
//TODO: UnitsProcessedEvent
});
}
}
else
{
@ -138,7 +177,7 @@ namespace Sln.Iot.Business
{
_log.Error("RFID02业务出现异常", ex);
}
}
}
}

@ -27,9 +27,11 @@ namespace Sln.Iot.Business
private TrayBindingService trayBindingService = TrayBindingService.Instance;
private WorkStageStartedEvent workStageStartedEvent = new WorkStageStartedEvent();
private WorkStageCompletedEvent workStageCompletedEvent = new WorkStageCompletedEvent();
private CFXConnect1 connect1 = CFXConnect1.Instance;
private CFXConnect2 connect2 = CFXConnect2.Instance;
private CFXConnect3 connect3 = CFXConnect3.Instance;
private WorkCompletedEvent workCompletedEvent = new WorkCompletedEvent();
private UnitsDepartedEvent unitsDepartedEvent = new UnitsDepartedEvent();
private CFXConnectOven ConnectOven = CFXConnectOven.Instance;
public RFID03Business()
{
@ -46,7 +48,7 @@ namespace Sln.Iot.Business
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance1, "D802");
OperateResult<short> signalRes = _plc.ReadInt16(_plc.PLC24, "D800");
//成功验证
if (signalRes.IsSuccess)
{
@ -55,7 +57,7 @@ namespace Sln.Iot.Business
if (signalValue == 3001)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance1, "D5020", 10);
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.PLC24, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{
@ -65,6 +67,19 @@ namespace Sln.Iot.Business
traycode = traycode.Replace("\0", "");
_log.Info($"托盘到达-RFID03-托盘号-[{traycode}]");
bool res = trayBindingService.UpDateTime(DateTime.Now.ToString(), traycode, "3");
if (!res)
{
_log.Error("胶机1真空箱外时间更新失败未扫托盘号");
}
//写入完成信号
res = _plc.PlcWrite(_plc.PLC24, "D802", 3002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机1真空箱外写入完成信号异常");
}
//sql更新
//取出work唯一guid(tid)
string stid = trayBindingService.TidGet(traycode);
@ -73,30 +88,19 @@ namespace Sln.Iot.Business
tid = Guid.Parse("11111111-1111-4111-9111-111111111111");
_log.Error("找不到对应的托盘信息赋值默认GUID");
}
bool res = trayBindingService.UpDateTime(DateTime.Now.ToString(), traycode, "1");
if (!res)
{
_log.Error("胶机1真空箱外时间更新失败未扫托盘号");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance1, "D802", 3002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机1真空箱外写入完成信号异常");
}
GlobalVar.Connect1Entity.CycleTime = CommonUtil.AddRandom(AppConfigSetting._config.CycleTime1, 300);
string[] prodcode = trayBindingService.ProdCodeGet(traycode);
//CFX
Task.Run(() =>
{
//真空箱1工段完成事件
connect1.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle(tid, "VacuumInjection1", 1)));
_log.Info($"真空箱1工段完成, {tid}");
//预固炉工段开启
connect3.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle(tid, "PreCureOven", 2)));
_log.Info($"预固炉工段开启, {tid}");
//真空箱工段完成事件
ConnectOven.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle(tid, "Oven", 1)));
_log.Info($"真空箱工段完成 ID:{tid}");
ConnectOven.PublishEvent(new CFXEnvelope(workCompletedEvent.Handle(tid, traycode, prodcode)));
_log.Info($"工作完成事件发布 ID:{tid}");
ConnectOven.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode)));
_log.Info($"单元离站 ID:{tid}");
});
}
else
@ -105,6 +109,48 @@ namespace Sln.Iot.Business
}
//流程完成
}
else if(signalValue == 3003)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.PLC24, "D5000", 10);
if (trayBytesResult.IsSuccess)
{
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
traycode = traycode.Replace("?", "");
traycode = traycode.Replace("\0", "");
//计算真空箱1停留时长: time3 - time2
string time3 = trayBindingService.GetTimeByTrayCode(traycode, "3");
string time2 = trayBindingService.GetTimeByTrayCode(traycode, "2");
ushort spanSecond = 0;
if (!string.IsNullOrEmpty(time3) && !string.IsNullOrEmpty(time2))
{
TimeSpan span = Convert.ToDateTime(time3) - Convert.ToDateTime(time2);
spanSecond = (ushort)span.TotalSeconds;
_log.Info($"真空箱1停留时长: [{spanSecond}]秒");
}
bool re = _plc.PlcWrite(_plc.PLC24, "D810", spanSecond, DataTypeEnum.UInt16).IsSuccess;
if (!re)
{
_log.Error("RFID03 发送真空箱停留时长 PLC写入异常");
}
}
else
{
_log.Error($"PLC读取失败原因{trayBytesResult.Message}");
}
//写入完成信号
bool res = _plc.PlcWrite(_plc.PLC24, "D800", 3004, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("RFID03 发送真空箱停留时长 PLC写入完成信号异常");
}
Task.Run(() =>
{
//TODO: UnitsProcessedEvent
}
}
else
{

@ -1,181 +0,0 @@
using CFX;
using HslCommunication;
using Sln.Iot.CFX.CFXConnect;
using Sln.Iot.CFX.Event;
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;
using TouchSocket.Core;
using static System.Runtime.CompilerServices.RuntimeHelpers;
namespace Sln.Iot.Business
{
public class RFID04Business
{
private Timer _timer;
private readonly PLCConnect _plc = PLCConnect.Instance;
private readonly SerilogHelper _log = SerilogHelper.Instance;
private OvenPlcDataService ovenPlcDataService = OvenPlcDataService.Instance;
private VacuumInjectionPlcDataService vacuumInjectionPlcDataService = VacuumInjectionPlcDataService.Instance;
private UnitsProcessPLCDataGetBusiness unitsProcessPLCDataGetBusiness = UnitsProcessPLCDataGetBusiness.Instance;
private TrayBindingService trayBindingService = TrayBindingService.Instance;
private WorkStageStartedEvent workStageStartedEvent = new WorkStageStartedEvent();
private WorkStageCompletedEvent workStageCompletedEvent = new WorkStageCompletedEvent();
private CFXConnect1 connect1 = CFXConnect1.Instance;
private CFXConnect2 connect2 = CFXConnect2.Instance;
private CFXConnect3 connect3 = CFXConnect3.Instance;
public RFID04Business()
{
_timer = new Timer(TimerCallback, null, 0, 2000);
}
/// <summary>
/// RFID04胶机2真空箱前数据处理流程
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
try
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance2, "D800");
//成功验证
if (signalRes.IsSuccess)
{
short signalValue = signalRes.Content;
// 如果有读取信号
// 读电子标签
if (signalValue == 4001)
{
//读取托盘码和产品码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘吗
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
traycode = traycode.Replace("?", "");
traycode = traycode.Replace("\0", "");
_log.Info($"托盘到达-RFID04-托盘号-[{traycode}]");
//sql更新
//取出work唯一guid(tid)
string stid = trayBindingService.TidGet(traycode);
if (!Guid.TryParse(stid, out Guid tid))
{
tid = Guid.Parse("11111111-1111-4111-9111-111111111111");
_log.Error("找不到对应的托盘信息赋值默认GUID");
}
bool res = trayBindingService.UpDateTime(DateTime.Now.ToString(), traycode, "2");
if (!res)
{
_log.Error("胶机2真空箱前时间数据库更新异常");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance2, "D800", 4002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机2真空箱前开始时间PLC写入完成信号异常");
}
//CFX
Task.Run(() =>
{
//预固炉工段完成事件
connect3.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle(tid, "PreCureOven", 2)));
_log.Info($"预固炉工段完成, {tid}");
//真空箱2工段开启
connect1.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle(tid, "VacuumInjection2", 2)));
_log.Info($"真空箱2工段开启, {tid}");
//预固炉数据采集
var data = unitsProcessPLCDataGetBusiness.PreCureOvenPlcDataGet();
ovenPlcDataService.UpdateDataPreCure(stid, data);
_log.Info($"预固炉温度数据采集\n" +
$"预固炉1温度:{data.PreCureOven1TempActValue}\t" +
$"预固炉2温度:{data.PreCureOven2TempActValue}\t" +
$"预固炉3温度:{data.PreCureOven3TempActValue}\t" +
$"预固炉4温度:{data.PreCureOven4TempActValue}\n");
});
}
else
{
_log.Error($"PLC读取失败原因{trayBytesResult.Message}");
}
//流程完成
}
// 计算时间差
if (signalValue == 4003)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘吗
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
traycode = traycode.Replace("?", "");
traycode = traycode.Replace("\0", "");
_log.Info($"托盘号-[{traycode}]-开始计算时间");
//sql更新
string nowTime = DateTime.Now.ToString();
bool res = TrayBindingService.Instance.UpDateTime(nowTime, traycode, "3");
if (!res)
{
_log.Error("胶机2真空箱前时间计算数据库更新异常");
}
//取之前存的时间
string time2 = TrayBindingService.Instance.GetTime2ByTrayCode(traycode);
ushort spanSecond = 0;
if (!time2.IsNullOrEmpty())
{
//计算时间差
TimeSpan span = Convert.ToDateTime(time2) - Convert.ToDateTime(nowTime);
spanSecond = (ushort)span.TotalSeconds;
_log.Info($"预固炉时间差: [" + spanSecond + "] 秒");
}
res = _plc.PlcWrite(_plc.DeltaInstance2, "D810", spanSecond, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机2真空箱前时间计算结果PLC写入异常");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance2, "D800", 4004, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机2真空箱前时间计算PLC写入完成信号异常");
}
}
else
{
_log.Error($"PLC读取失败原因{trayBytesResult.Message}");
}
//流程完成
}
}
else
{
_log.Error($"胶机2真空箱前开始时间读PLC取信号异常,原因:{signalRes.Message}");
}
}
catch (Exception ex)
{
_log.Error("RFID0业务出现异常", ex);
}
}
}
}

@ -1,161 +0,0 @@
using CFX;
using HslCommunication;
using Sln.Iot.CFX.CFXBusiness;
using Sln.Iot.CFX.CFXConnect;
using Sln.Iot.CFX.Event;
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 RFID05Business
{
private Timer _timer;
private readonly PLCConnect _plc = PLCConnect.Instance;
private readonly SerilogHelper _log = SerilogHelper.Instance;
private TrayBindingService trayBindingService = TrayBindingService.Instance;
private OvenPlcDataService ovenPlcDataService = OvenPlcDataService.Instance;
private VacuumInjectionPlcDataService vacuumInjectionPlcDataService = VacuumInjectionPlcDataService.Instance;
private UnitsProcessPLCDataGetBusiness unitsProcessPLCDataGetBusiness = UnitsProcessPLCDataGetBusiness.Instance;
private CFXUnitProcessedDataGet cFXUnitProcessedDataGet = CFXUnitProcessedDataGet.Instance;
private WorkStageStartedEvent workStageStartedEvent = new WorkStageStartedEvent();
private WorkStageCompletedEvent workStageCompletedEvent = new WorkStageCompletedEvent();
private UnitsProcessedEvent unitsProcessedEvent = new UnitsProcessedEvent();
private CFXConnect1 connect1 = CFXConnect1.Instance;
private CFXConnect2 connect2 = CFXConnect2.Instance;
private CFXConnect3 connect3 = CFXConnect3.Instance;
public RFID05Business()
{
_timer = new Timer(TimerCallback, null, 0, 2000);
}
/// <summary>
/// RFID05胶机2真空箱后数据处理流程
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
try
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance2, "D802");
//成功验证
if (signalRes.IsSuccess)
{
short signalValue = signalRes.Content;
//如果有读取信号
if (signalValue == 5001)
{
//读取托盘码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance2, "D5020", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘吗
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
traycode = traycode.Replace("?", "");
traycode = traycode.Replace("\0", "");
_log.Info($"托盘到达-RFID05-托盘号-[{traycode}]");
//sql更新
//取出work唯一guid(tid)
string stid = trayBindingService.TidGet(traycode);
if (!Guid.TryParse(stid, out Guid tid))
{
tid = Guid.Parse("11111111-1111-4111-9111-111111111111");
_log.Error("找不到对应的托盘信息赋值默认GUID");
}
bool res = trayBindingService.UpDateTime(DateTime.Now.ToString(), traycode, "4");
if (!res)
{
_log.Error("胶机2真空箱后数据库写入异常");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance2, "D802", 5002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("胶机2真空箱后PLC写入完成信号异常");
}
//CFX
Task.Run(() =>
{
//真空箱2工段完成事件
connect1.PublishEvent(new CFXEnvelope(workStageCompletedEvent.Handle(tid, "VacuumInjection2", 2)));
_log.Info($"真空箱2工段完成, {tid}");
//固化炉工段开启
connect3.PublishEvent(new CFXEnvelope(workStageStartedEvent.Handle(tid, "CureOven", 3)));
_log.Info($"固化炉工段开启, {tid}");
//真空箱获取并上传数据
var unitsData1 = vacuumInjectionPlcDataService.GetData(stid);
var unitsData2 = unitsProcessPLCDataGetBusiness.Vacuum2PlcDataGet();
unitsData1.GlueAmountSetValue2 = unitsData2.GlueAmountSetValue2;
unitsData1.GluePushSpeedSetValue2 = unitsData2.GluePushSpeedSetValue2;
unitsData1.BarrelA1TempActValue2 = unitsData2.BarrelA1TempActValue2;
unitsData1.BarrelA2TempActValue2 = unitsData2.BarrelA2TempActValue2;
unitsData1.BarrelB1TempActValue2 = unitsData2.BarrelB1TempActValue2;
unitsData1.BarrelB2TempActValue2 = unitsData2.BarrelB2TempActValue2;
unitsData1.PumpAPressureActValue2 = unitsData2.PumpAPressureActValue2;
unitsData1.PumpBPressureActValue2 = unitsData2.PumpBPressureActValue2;
unitsData1.VacuumDegreeActValue2 = unitsData2.VacuumDegreeActValue2;
unitsData1.PressureHoldTimeSetValue2 = unitsData2.PressureHoldTimeSetValue2;
connect1.PublishEvent(new CFXEnvelope(unitsProcessedEvent.Handle(tid, cFXUnitProcessedDataGet.ProcessDataGet1(unitsData1))));
_log.Info($"真空箱温度数据上传\n" +
$"胶量1:{unitsData1.GlueAmountSetValue1}\t" +
$"推胶速度1:{unitsData1.GluePushSpeedSetValue1}\n" +
$"A1温度1:{unitsData1.BarrelA1TempActValue1}\t" +
$"A2温度1:{unitsData1.BarrelA2TempActValue1}\t" +
$"B1温度1:{unitsData1.BarrelB1TempActValue1}\t" +
$"B2温度1:{unitsData1.BarrelB2TempActValue1}\n" +
$"A泵压力1:{unitsData1.PumpAPressureActValue1}\t" +
$"B泵压力1:{unitsData1.PumpBPressureActValue1}\t" +
$"真空度1:{unitsData1.VacuumDegreeActValue1}\t" +
$"保压时间1:{unitsData1.PressureHoldTimeSetValue1}\n" +
$"胶量2:{unitsData1.GlueAmountSetValue2}\t" +
$"推胶速度2:{unitsData1.GluePushSpeedSetValue2}\n" +
$"A1温度2:{unitsData1.BarrelA1TempActValue2}\t" +
$"A2温度2:{unitsData1.BarrelA2TempActValue2}\t" +
$"B1温度2:{unitsData1.BarrelB1TempActValue2}\t" +
$"B2温度2:{unitsData1.BarrelB2TempActValue2}\n" +
$"A泵压力2:{unitsData1.PumpAPressureActValue2}\t" +
$"B泵压力2:{unitsData1.PumpBPressureActValue2}\t" +
$"真空度2:{unitsData1.VacuumDegreeActValue2}\t" +
$"保压时间2:{unitsData1.PressureHoldTimeSetValue2}");
});
}
else
{
_log.Error($"PLC读取失败原因{trayBytesResult.Message}");
}
//流程完成
}
}
else
{
_log.Error($"胶机2真空箱后PLC读取信号异常,原因:{signalRes.Message}");
}
}
catch (Exception ex)
{
_log.Error("RFID0业务出现异常", ex);
}
}
}
}

@ -1,177 +0,0 @@
using CFX;
using CFX.Structures;
using CFX.Structures.PressInsertion;
using HslCommunication;
using Sln.Iot.CFX.CFXBusiness;
using Sln.Iot.CFX.CFXConnect;
using Sln.Iot.CFX.Event;
using Sln.Iot.Common;
using Sln.Iot.Config;
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 RFID06Business
{
private Timer _timer;
private readonly PLCConnect _plc = PLCConnect.Instance;
private readonly SerilogHelper _log = SerilogHelper.Instance;
//CFX数据采集业务
private UnitsProcessPLCDataGetBusiness unitsProcessPLCDataGetBusiness = UnitsProcessPLCDataGetBusiness.Instance;
private CFXUnitProcessedDataGet cFXUnitProcessedDataGet = CFXUnitProcessedDataGet.Instance;
//SQL服务
private OvenPlcDataService ovenPlcDataService = OvenPlcDataService.Instance;
private VacuumInjectionPlcDataService vacuumInjectionPlcDataService = VacuumInjectionPlcDataService.Instance;
private TrayBindingService trayBindingService = TrayBindingService.Instance;
//CFX事件
private UnitsDepartedEvent unitsDepartedEvent = new UnitsDepartedEvent();
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 CFXConnect3 connect3 = CFXConnect3.Instance;
private CFXConnect4 connect4 = CFXConnect4.Instance;
public RFID06Business()
{
_timer = new Timer(TimerCallback, null, 0, 2000);
}
/// <summary>
/// RFID06下料提升机数据处理流程
/// </summary>
/// <param name="state"></param>
public void TimerCallback(object? state)
{
try
{
// 定时任务逻辑
//读取信号
OperateResult<short> signalRes = _plc.ReadInt16(_plc.DeltaInstance4, "D500");
//成功验证
if (signalRes.IsSuccess)
{
short signalValue = signalRes.Content;
//如果有读取信号
if (signalValue == 6001)
{
//读取托盘码和产品码
OperateResult<byte[]> trayBytesResult = _plc.ReadBytes(_plc.DeltaInstance4, "D5000", 10);
//成功验证
if (trayBytesResult.IsSuccess)
{
//转换托盘吗
string traycode = Encoding.ASCII.GetString(trayBytesResult.Content);
traycode = traycode.Replace("?", "");
traycode = traycode.Replace("\0", "");
_log.Info($"托盘到达-RFID06-托盘号-[{traycode}]");
//sql更新
//取出work唯一guid(tid)
string stid = trayBindingService.TidGet(traycode);
if (!Guid.TryParse(stid, out Guid tid))
{
tid = Guid.Parse("11111111-1111-4111-9111-111111111111");
_log.Error("找不到对应的托盘信息赋值默认GUID");
}
string[] prodcode = trayBindingService.ProdCodeGet(traycode);
bool res = trayBindingService.TrayCodeDelete(traycode);
if (!res)
{
_log.Error("下料提升机绑定数据删除异常或删除条数为0");
}
//写入完成信号
res = _plc.PlcWrite(_plc.DeltaInstance4, "D500", 6002, DataTypeEnum.UInt16).IsSuccess;
if (!res)
{
_log.Error("下料提升机PLC写入完成信号异常");
}
GlobalVar.Connect3Entity.CycleTime = CommonUtil.AddRandom(AppConfigSetting._config.CycleTime3, 1000);
GlobalVar.Connect4Entity.CycleTime = CommonUtil.AddRandom(AppConfigSetting._config.CycleTime4, 5);
//CFX
Task.Run(() =>
{
//固化炉工段完成事件
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)));
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)));
connect4.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode)));
connect3.PublishEvent(new CFXEnvelope(unitsDepartedEvent.Handle(traycode, prodcode)));
_log.Info($"{traycode} 单元离站 ");
//固化炉数据采集
var unitsdata = unitsProcessPLCDataGetBusiness.CureOvenPlcDataGet();
//存数据库里整合
ovenPlcDataService.UpdateDataCure(stid, unitsdata);
//取出整合数据
unitsdata = ovenPlcDataService.GetData(stid);
connect3.PublishEvent(new CFXEnvelope(unitsProcessedEvent.Handle(tid, cFXUnitProcessedDataGet.ProcessDataGet3(unitsdata))));
_log.Info($"隧道烤箱温度数据上传\n" +
$"预热炉温度:{unitsdata.PreheatOvenTempActValue}\n" +
$"预固炉1温度:{unitsdata.PreCureOven1TempActValue}\t" +
$"预固炉2温度:{unitsdata.PreCureOven2TempActValue}\t" +
$"预固炉3温度:{unitsdata.PreCureOven3TempActValue}\t" +
$"预固炉4温度:{unitsdata.PreCureOven4TempActValue}\n" +
$"固化炉1温度:{unitsdata.CureOven1TempActValue}\t" +
$"固化炉2温度:{unitsdata.CureOven2TempActValue}\t" +
$"固化炉3温度:{unitsdata.CureOven3TempActValue}\t" +
$"固化炉4温度:{unitsdata.CureOven4TempActValue}");
});
}
else
{
_log.Error($"PLC读取失败原因{trayBytesResult.Message}");
}
//流程完成
}
}
else
{
_log.Error($"下料提升机PLC读取信号异常,原因:{signalRes.Message}");
}
}
catch (Exception ex)
{
_log.Error("RFID0业务出现异常", ex);
}
}
}
}

@ -0,0 +1,63 @@
using Sln.Iot.Business.Entity;
using Sln.Iot.Repository.service;
using System.Reflection;
using System.Text.Json;
namespace Sln.Iot.Business
{
/// <summary>
/// TCPRFID信息绑定
/// </summary>
public class TCPRFIDBinding
{
private static readonly Lazy<TCPRFIDBinding> lazy = new Lazy<TCPRFIDBinding>(() => new TCPRFIDBinding());
public static TCPRFIDBinding Instance
{
get
{
return lazy.Value;
}
}
public static Action<string>? GetNewMessage = new Action<string>((message) => { });
private readonly TrayBindingService _trayBinding = TrayBindingService.Instance;
public TCPRFIDBinding()
{
GetNewMessage += StoreBindingMessage;
}
private static readonly PropertyInfo[] _snProperties =
typeof(TCPRFIDBindingEntity).GetProperties()
.Where(p => p.Name.StartsWith("Sn", StringComparison.OrdinalIgnoreCase))
.ToArray();
/// <summary>
/// 数据绑定到数据库
/// </summary>
public void StoreBindingMessage(string message)
{
var entity = ParseMessage(message);
if (entity == null || string.IsNullOrWhiteSpace(entity.Rfid)) return;
var prodCodes = _snProperties
.Select(p => p.GetValue(entity) as string)
.Where(v => !string.IsNullOrWhiteSpace(v))
.ToArray();
if (prodCodes.Length == 0) return;
_trayBinding.TrayBindingRefresh(Guid.NewGuid(), entity.Rfid, prodCodes!);
}
private static TCPRFIDBindingEntity? ParseMessage(string message)
{
if (string.IsNullOrWhiteSpace(message)) return null;
return JsonSerializer.Deserialize<TCPRFIDBindingEntity>(message);
}
}
}

@ -0,0 +1,65 @@
using Sln.Iot.Business;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Sockets;
namespace Sln.Iot.Business
{
/// <summary>
/// TCP服务端
/// </summary>
public class TouchTcpServer
{
private static readonly Lazy<TouchTcpServer> lazy = new Lazy<TouchTcpServer>(() => new TouchTcpServer());
public static TouchTcpServer Instance
{
get
{
return lazy.Value;
}
}
/// <summary>
/// 服务端启动
/// </summary>
public async void TcpServerStarted(string ipHost)
{
var service = new TcpService();
service.Connecting = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在连接
service.Connected = (client, e) => { return EasyTask.CompletedTask; };//有客户端成功连接
service.Closing = (client, e) => { return EasyTask.CompletedTask; };//有客户端正在断开连接,只有当主动断开时才有效。
service.Closed = (client, e) => { return EasyTask.CompletedTask; };//有客户端断开连接
#region Tcp服务器使用Received异步委托接收数据
service.Received = async (client, e) =>
{
//从客户端收到信息
var mes = e.Memory.Span.ToString(Encoding.UTF8);
client.Logger.Info($"已从{client.Id}接收到信息:{mes}");
TCPRFIDBinding.GetNewMessage?.Invoke(mes);
//简单消除Task当使用插件接收时需要使用 await e.InvokeNext();来继续执行后续插件。
await EasyTask.CompletedTask;
};
#endregion
await service.SetupAsync(new TouchSocketConfig()//载入配置
.SetListenIPHosts($"tcp://{ipHost}")//可以同时监听多个地址
.ConfigureContainer(a =>//容器的配置
{
a.AddConsoleLogger();//添加一个控制台日志注入注意在maui中控制台日志不可用
})
.ConfigurePlugins(a =>
{
//a.Add();//此处可以添加插件
}));
await service.StartAsync();//启动
}
}
}

@ -1,132 +0,0 @@
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
{
/// <summary>
/// 烤箱连接
/// </summary>
public class CFXConnect3 : CFXHelper
{
private static readonly Lazy<CFXConnect3> lazy = new Lazy<CFXConnect3>(() => new CFXConnect3());
public static CFXConnect3 Instance
{
get
{
return lazy.Value;
}
}
AreYouThereRequestReceived3 areYouThereRequestReceived3 = new AreYouThereRequestReceived3();
GetEndpointInformationRequestReceived3 getEndpointInformationRequestReceived3 = new GetEndpointInformationRequestReceived3();
WhoIsThereRequestReceived3 whoIsThereRequestReceived3 = new WhoIsThereRequestReceived3();
GetActiveRecipeRequestReceived3 getActiveRecipeRequestReceived3 = new GetActiveRecipeRequestReceived3();
GetActiveFaultsRequestReceived3 getActiveFaultsRequestReceived3 = new GetActiveFaultsRequestReceived3();
HandleFaultRequestReceived3 handleFaultRequestReceived3 = new HandleFaultRequestReceived3();
ModifyStationParametersRequestReceived3 modifyStationParametersRequestReceived3 = new ModifyStationParametersRequestReceived3();
//HeartbeatEvent heartbeatEvent = new HeartbeatEvent();
CFXEventTools cFXEventTools = CFXEventTools.Instance;
public string CFXHandle { get; set; } = "CFX.A00.OT00470017";
protected override CFXMessage HandleRequest(CFXEnvelope request)
{
CFXMessage response = null;
if (request.MessageBody is AreYouThereRequest) //存在性检测请求
{
areYouThereRequestReceived3.Handle(request.MessageBody as AreYouThereRequest, out response);
}
else if (request.MessageBody is GetEndpointInformationRequest) //获取终端节点信息请求
{
getEndpointInformationRequestReceived3.Handle(request.MessageBody as GetEndpointInformationRequest, out response);
}
else if (request.MessageBody is WhoIsThereRequest) //设备存在性查询请求
{
whoIsThereRequestReceived3.Handle(request.MessageBody as WhoIsThereRequest, out response);
}
else if (request.MessageBody is GetActiveRecipeRequest) //获取当前激活配方请求
{
getActiveRecipeRequestReceived3.Handle(request.MessageBody as GetActiveRecipeRequest, out response);
}
else if (request.MessageBody is GetActiveFaultsRequest) //获取当前错误状态请求
{
getActiveFaultsRequestReceived3.Handle(request.MessageBody as GetActiveFaultsRequest, out response);
}
else if (request.MessageBody is HandleFaultRequest) //处理错误请求
{
handleFaultRequestReceived3.Handle(request.MessageBody as HandleFaultRequest, out response);
}
else if (request.MessageBody is ModifyStationParametersRequest) //设备修改参数请求
{
modifyStationParametersRequestReceived3.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;
}
/// <summary>
/// 发送生产单元验证请求接收通知
/// </summary>
public void SendValidateUnitsRequest(string uri, string primaryIdentifier, string[] unitsIdentifier)
{
try
{
ValidateUnitsRequest msg = new ValidateUnitsRequest()
{
Validations = new List<ValidationType>()
{
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)
{
}
}
}
}

@ -1,132 +0,0 @@
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
{
/// <summary>
/// 提升机2连接
/// </summary>
public class CFXConnect4 : CFXHelper
{
private static readonly Lazy<CFXConnect4> lazy = new Lazy<CFXConnect4>(() => 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;
}
/// <summary>
/// 发送生产单元验证请求接收通知
/// </summary>
public void SendValidateUnitsRequest(string uri, string primaryIdentifier, string[] unitsIdentifier)
{
try
{
ValidateUnitsRequest msg = new ValidateUnitsRequest()
{
Validations = new List<ValidationType>()
{
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)
{
}
}
}
}

@ -18,11 +18,11 @@ namespace Sln.Iot.CFX.CFXConnect
/// <summary>
/// 提升机1连接
/// </summary>
public class CFXConnect2 : CFXHelper
public class CFXConnectOven : CFXHelper
{
private static readonly Lazy<CFXConnect2> lazy = new Lazy<CFXConnect2>(() => new CFXConnect2());
private static readonly Lazy<CFXConnectOven> lazy = new Lazy<CFXConnectOven>(() => new CFXConnectOven());
public static CFXConnect2 Instance
public static CFXConnectOven Instance
{
get
{

@ -18,11 +18,11 @@ namespace Sln.Iot.CFX.CFXConnect
/// <summary>
/// 真空箱连接
/// </summary>
public class CFXConnect1 : CFXHelper
public class CFXConnectVacuum : CFXHelper
{
private static readonly Lazy<CFXConnect1> lazy = new Lazy<CFXConnect1>(() => new CFXConnect1());
private static readonly Lazy<CFXConnectVacuum> lazy = new Lazy<CFXConnectVacuum>(() => new CFXConnectVacuum());
public static CFXConnect1 Instance
public static CFXConnectVacuum Instance
{
get
{

@ -17,9 +17,7 @@ namespace Sln.Iot.CFX
/// </summary>
public class CFXTest
{
CFXConnect1 _cfxHelper = CFXConnect1.Instance;
CFXConnect2 _cfxHelper2 = CFXConnect2.Instance;
CFXConnect3 _cfxHelper3 = CFXConnect3.Instance;
CFXConnectOven _cfxHelper2 = CFXConnectOven.Instance;
CFXUnitProcessedDataGet cFXUnitProcessedDataGet = CFXUnitProcessedDataGet.Instance;
//HeartbeatEvent heartbeatEvent = new HeartbeatEvent();

@ -64,21 +64,11 @@ namespace Sln.Iot.Config
/// </summary>
public CFXConfig VacuumConfig { get; set; }
/// <summary>
/// CFX配置-提升机1
/// </summary>
public CFXConfig Lift1Config { get; set; }
/// <summary>
/// CFX配置-烤炉
/// </summary>
public CFXConfig OvenConfig { get; set; }
/// <summary>
/// CFX配置-提升机2
/// </summary>
public CFXConfig Lift2Config { get; set; }
/// <summary>
/// MES的URL
/// </summary>

@ -20,30 +20,30 @@ namespace Sln.Iot.PLC
private readonly SerilogHelper _log = SerilogHelper.Instance;
/// <summary>
/// PLC1 192.168.1.20 烤箱
/// </summary>
public DeltaTcpNet DeltaInstance0;
///// <summary>
///// PLC1 192.168.1.20 烤箱
///// </summary>
//public DeltaTcpNet VacuumPlc;
/// <summary>
/// PLC1 192.168.1.21 真空箱1
/// PLC1 192.168.1.21 胶机
/// </summary>
public DeltaTcpNet DeltaInstance1;
public DeltaTcpNet PLC21;
/// <summary>
/// PLC2 192.168.1.22 真空箱2
/// PLC2 192.168.1.22 真空箱
/// </summary>
public DeltaTcpNet DeltaInstance2;
public DeltaTcpNet PLC22;
/// <summary>
/// PLC3 192.168.1.23 提升机1
/// PLC3 192.168.1.23 接驳台1
/// </summary>
public DeltaTcpNet DeltaInstance3;
public DeltaTcpNet PLC23;
/// <summary>
/// PLC4 192.168.1.24 提升机2
/// PLC4 192.168.1.24 接驳台2
/// </summary>
public DeltaTcpNet DeltaInstance4;
public DeltaTcpNet PLC24;
/// <summary>
/// 锁对象1
@ -54,7 +54,7 @@ namespace Sln.Iot.PLC
{
List<Task<DeltaTcpNet>> tasks = new List<Task<DeltaTcpNet>>
{
CreateDeltaConnect("192.168.1.20", 502, 1),
//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),
@ -63,16 +63,16 @@ namespace Sln.Iot.PLC
await Task.WhenAll(tasks);
DeltaInstance0 = tasks[0].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {DeltaInstance0.IpAddress}");
DeltaInstance1 = tasks[1].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {DeltaInstance1.IpAddress}");
DeltaInstance2 = tasks[2].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {DeltaInstance2.IpAddress}");
DeltaInstance3 = tasks[3].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {DeltaInstance3.IpAddress}");
DeltaInstance4 = tasks[4].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {DeltaInstance4.IpAddress}");
//DeltaInstance0 = tasks[0].GetAwaiter().GetResult();
//_log.Info($"PLC连接成功: {DeltaInstance0.IpAddress}");
PLC21 = tasks[0].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {PLC21.IpAddress}");
PLC22 = tasks[1].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {PLC22.IpAddress}");
PLC23 = tasks[2].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {PLC23.IpAddress}");
PLC24 = tasks[3].GetAwaiter().GetResult();
_log.Info($"PLC连接成功: {PLC24.IpAddress}");
_log.Info("PLC连接全部成功");
}

@ -202,5 +202,31 @@ namespace Sln.Iot.Repository.service
return time2;
}
}
/// <summary>
/// 根据时间字段索引获取时间值
/// </summary>
public string GetTimeByTrayCode(string trayCode, string timeField)
{
try
{
var res = _helper.Query(t => t.TrayCode == trayCode).FirstOrDefault();
if (res == null) return string.Empty;
return timeField switch
{
"1" => res.Time1 ?? string.Empty,
"2" => res.Time2 ?? string.Empty,
"3" => res.Time3 ?? string.Empty,
"4" => res.Time4 ?? string.Empty,
_ => string.Empty
};
}
catch (Exception ex)
{
_log.Error($"根据托盘码获取time{timeField}错误", ex);
return string.Empty;
}
}
}
}

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

@ -0,0 +1,7 @@
namespace Sln.Iot.Touchsocket
{
public class TouchSocketSetup
{
}
}

@ -74,36 +74,13 @@ namespace Sln.Iot
//CFX接口启动
//真空注胶机
CFXConnect1.Instance.Init(appConfig.VacuumConfig.CFXHandle,
CFXConnectOven.Instance.Init(appConfig.VacuumConfig.CFXHandle,
new Uri(appConfig.VacuumConfig.LocalURI),
new Uri(appConfig.VacuumConfig.UpperURI));
//提升机1
CFXConnect2.Instance.Init(appConfig.Lift1Config.CFXHandle,
CFXConnectVacuum.Instance.Init(appConfig.Lift1Config.CFXHandle,
new Uri(appConfig.Lift1Config.LocalURI),
new Uri(appConfig.Lift1Config.UpperURI));
//隧道烤箱
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接口启动
////真空注胶机
//CFXConnect1.Instance.Init("CFX.A00.SDSH000001",
// new Uri("amqp://127.0.0.1:1235"),
// new Uri("amqp://127.0.0.1:8888"));
////升降回流
//CFXConnect2.Instance.Init("CFX.A00.SDSH000002",
// new Uri("amqp://127.0.0.1:1235"),
// new Uri("amqp://127.0.0.1:8888"));
////隧道烤箱
//CFXConnect3.Instance.Init("CFX.A00.SDSH000003",
// new Uri("amqp://127.0.0.1:1235"),
// new Uri("amqp://127.0.0.1:8888"));
//业务类启动
BusinessStart business = new BusinessStart();
@ -123,10 +100,8 @@ namespace Sln.Iot
/// </summary>
public static void ProgramClose()
{
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)));
CFXConnectOven.Instance.PublishEvent(new CFXEnvelope(new EndpointShuttingDownEvent().Handle(CFXConnectOven.Instance.CFXHandle)));
CFXConnectVacuum.Instance.PublishEvent(new CFXEnvelope(new EndpointShuttingDownEvent().Handle(CFXConnectVacuum.Instance.CFXHandle)));
}
}
}

@ -16,24 +16,12 @@
//URI
"UpperURI": "http://10.148.192.32:8090/sensordata?sensorId=UploadMachineData"
},
"Lift1Config": {
"DeviceName": "Lift1",
"CFXHandle": "CFX.A00.OT00470019",
"LocalURI": "amqp://127.0.0.1:1236",
"UpperURI": "http://10.148.192.32:8090/sensordata?sensorId=UploadMachineData"
},
"OvenConfig": {
"DeviceName": "Oven",
"CFXHandle": "CFX.A00.OT00470017",
"LocalURI": "amqp://127.0.0.1:1237",
"UpperURI": "http://10.148.192.32:8090/sensordata?sensorId=UploadMachineData"
},
"Lift2Config": {
"DeviceName": "Lift2",
"CFXHandle": "CFX.A00.OT00470020",
"LocalURI": "amqp://127.0.0.1:1238",
"UpperURI": "http://10.148.192.32:8090/sensordata?sensorId=UploadMachineData"
},
}
//MES
"MESURL": "http://10.148.192.32:8090",
//MES

Loading…
Cancel
Save