C00225155-02/C00225155/MegaRobo.C00225155/MegaRobo.C00225155App/StartupService.cs

352 lines
19 KiB
C#
Raw Permalink Normal View History

2026-04-13 09:12:49 +00:00
#define A //定义符号 //条件编译
using Common.Models;
using MegaRobo.Authentication;
using MegaRobo.C00225155.AppServer;
using MegaRobo.C00225155.ControlDevices;
using MegaRobo.C00225155.ControlDevices.Scanner;
using MegaRobo.C00225155.ControlDevices.USBScanner;
using MegaRobo.C00225155.ControlDevices.WeightDevice;
using MegaRobo.C00225155.DataAccess;
using MegaRobo.C00225155.Entities;
using MegaRobo.C00225155.Entities.Entity_DB;
using MegaRobo.C00225155.Entities.ToWeb;
using MegaRobo.Contract;
using MegaRobo.ControlDevices;
using MegaRobo.ControlDevices.Models;
using MegaRobo.Entities.ViewTT;
using MegaRobo.Logger;
using MegaRobo.WpfComponents.MegaWindows;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Pipette1ml = MegaRobo.PipetteTool.HamiltonConsole.PipetteDevices.HamiltonDevices;
using Pipette1mlCan = MegaRobo.PipetteTool.HamiltonConsole.PipetteDevices.HamiltonDevices.CanDevice;
using Pipette5ml = MegaRobo.PipetteTool.HamiltonConsole.PipetteDevices.Hamilton5mlDevices;
namespace MegaRobo.C00225155App
{
public sealed class StartupService : StartupServiceBase
{
private LoggerService _loggerService;
private AppConfigService appConfigService;
private readonly IDataAccessService dataAccessService;
public StartupService(ICoreService coreService) : base(coreService)
{
this._loggerService = this.CoreService.GetServiceInstance<LoggerService>();
this.dataAccessService = this.CoreService.GetServiceInstance<IDataAccessService>();
this.appConfigService = this.CoreService.GetServiceInstance<AppConfigService>();
}
protected override async Task LoadModulesAsync()
{
#region
//dataAccessService.CreateTable<SourcePowderBottleModel>(); //粉末加样需要写入数据库
//dataAccessService.CreateTable<TipBoxModel>(); //tip需要写入数据库
dataAccessService.CreateTable<WebApiUrl>();
dataAccessService.CreateTable<Liquid_lml_Dose>();
//dataAccessService.CreateTable<PlcPointDict>();
#endregion
#region
AuthService authService = AuthService.Instance;
await authService.Initialize(this.CoreService, "电解液配置与检测");
this.CoreService.ServiceContainer.RegisterInstance(authService);
#endregion
IList<Setting> settingList = await dataAccessService.LoadEntitiesAsync<Setting>();
this.appConfigService.SettingList = settingList;
string pattern = @"^(\d{1,3}\.){3}\d{1,3}:\d{1,5}$";
IPEndPoint hostpoint = new IPEndPoint(IPAddress.Any, 1000);
Setting settingItem = new Setting();
bool isMatch = false;
#region BS连接
{
this.ShowBusyContent($"准备HTTP客户端中..");
////在依赖注入容器中注册 HttpClient 相关服务,支持配置超时、重试、消息处理等策略。
ServiceProvider serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
//IHttpClientFactory是.NET 官方推荐的 HttpClient 管理方式解决了传统HttpClient实例化带来的连接池、资源泄漏等问题能高效创建可配置的 HttpClient 实例。
IHttpClientFactory httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
this.CoreService.RegisterInstance(httpClientFactory);
}
{
//开服务端口
//******************接口中不要含有中文 在都请求方 含中文的Content-Length计算不正常 会导致接收的正文不完整*******************
//HttpListenerProvider封装了HttpListener.NET 用于创建 HTTP 服务的类),用于监听指定 IP 和端口的 HTTP 请求,实现自定义的 HTTP 服务逻辑。
settingItem = settingList.FirstOrDefault(x => x.Key == "HttpWatchPort");
int port = 10001;
if (settingItem != null && int.TryParse(settingItem.Context,out int watchPort))
{
port = watchPort;
}
this.ShowBusyContent($"打开对BS服务端口 {port} 中..");
HttpListenerProvider httpListenerProvider = new HttpListenerProvider(this.Logger);
httpListenerProvider.GetOrAdd(this.appConfigService.ProjectInfo.Code, new IPEndPoint(IPAddress.Any, port));
this.CoreService.RegisterInstance(httpListenerProvider);
}
#endregion
#region Labx软件注册
LabxService labxService = new LabxService();
this.CoreService.RegisterInstance<LabxService>(labxService);
#endregion
#region
this.ShowBusyContent($"连接投料站粉末扫码枪中..");
settingItem = settingList.FirstOrDefault(x => x.Key == DeviceNames.Scanner_Powder.ToString());
isMatch = Regex.IsMatch(settingItem?.Context, pattern);
if (settingItem != null && isMatch)
{
hostpoint = IPEndPoint.Parse(settingItem.Context);
}
ScannerService powderscannerService = new() { Name = DeviceNames.Scanner_Powder.ToString() };
await powderscannerService.Initialize(this.CoreService, hostpoint);
this.CoreService.RegisterInstance(powderscannerService, DeviceNames.Scanner_Powder.ToString());
this.ShowBusyContent($"连接投料站扫码枪中..");
settingItem = settingList.FirstOrDefault(x => x.Key == DeviceNames.Scanner.ToString());
isMatch = Regex.IsMatch(settingItem?.Context, pattern);
if (settingItem != null && isMatch)
{
hostpoint = IPEndPoint.Parse(settingItem.Context);
}
ScannerService scannerService = new() { Name = DeviceNames.Scanner.ToString() };
await scannerService.Initialize(this.CoreService, hostpoint);
this.CoreService.RegisterInstance(scannerService, DeviceNames.Scanner.ToString());
//this.ShowBusyContent($"连接反应站扫码枪..");
//settingItem = settingList.FirstOrDefault(x => x.Key == DeviceNames.Scanner_React.ToString());
//isMatch = Regex.IsMatch(settingItem?.Context, pattern);
//if (settingItem != null && isMatch)
//{
// hostpoint = IPEndPoint.Parse(settingItem.Context);
//}
//ScannerService reactScanner = new() { Name = DeviceNames.Scanner_React.ToString() };
//await reactScanner.Initialize(this.CoreService, hostpoint);
//this.CoreService.RegisterInstance(reactScanner, DeviceNames.Scanner_React.ToString());
//this.ShowBusyContent($"连接反应站料仓架扫码枪..");
//settingItem = settingList.FirstOrDefault(x => x.Key == DeviceNames.Scanner_ReactRack.ToString());
//isMatch = Regex.IsMatch(settingItem?.Context, pattern);
//if (settingItem != null && isMatch)
//{
// hostpoint = IPEndPoint.Parse(settingItem.Context);
//}
//ScannerService reactScannerService = new() { Name = DeviceNames.Scanner_ReactRack.ToString() };
//await reactScannerService.Initialize(this.CoreService, hostpoint);
//this.CoreService.RegisterInstance(reactScannerService, DeviceNames.Scanner_ReactRack.ToString());
#endregion
#region TS02称重仪
this.ShowBusyContent($"连接投料站预称重仪中..");
settingItem = settingList.FirstOrDefault(x => x.Key == DeviceNames.PreWeight.ToString());
isMatch = Regex.IsMatch(settingItem?.Context, pattern);
if (settingItem != null && isMatch)
{
hostpoint = IPEndPoint.Parse(settingItem.Context.Trim());
}
WeightService_Ts02 weightService_ts = new WeightService_Ts02() { Name = DeviceNames.PreWeight.ToString() };
await weightService_ts.Initialize(this.CoreService, hostpoint);
this.CoreService.RegisterInstance(weightService_ts, DeviceNames.PreWeight.ToString());
#endregion
#if Aa
#region
//this.ShowBusyContent($"连接高温震荡模块中..");
//settingItem = settingList.FirstOrDefault(x => x.Key == DeviceNames.HightTemperatureShake.ToString());
//isMatch = Regex.IsMatch(settingItem?.Context, pattern);
//if (settingItem != null && isMatch)
//{
// hostpoint = IPEndPoint.Parse(settingItem.Context.Trim());
//}
//HighTemperatureShakeService highTempertureshake = new HighTemperatureShakeService() { Name = DeviceNames.HightTemperatureShake.ToString() };
//await highTempertureshake.Initialize(this.CoreService, hostpoint);
//this.CoreService.RegisterInstance(highTempertureshake, DeviceNames.HightTemperatureShake.ToString());
//this.ShowBusyContent($"连接高温震荡模块电机中..");
//settingItem = settingList.FirstOrDefault(x => x.Key == DeviceNames.HightTemperatureMotor.ToString());
//isMatch = Regex.IsMatch(settingItem?.Context, pattern);
//if (settingItem != null && isMatch)
//{
// hostpoint = IPEndPoint.Parse(settingItem.Context.Trim());
//}
//HighTemperatureMotorControlService highTemperturemotor = new HighTemperatureMotorControlService() { Name = DeviceNames.HightTemperatureMotor.ToString() };
//await highTemperturemotor.Initialize(this.CoreService, hostpoint);
//this.CoreService.RegisterInstance(highTemperturemotor, DeviceNames.HightTemperatureMotor.ToString());
#endregion
#region
//this.ShowBusyContent($"连接低温磁力搅拌模块中..");
//settingItem = settingList.FirstOrDefault(x => x.Key == DeviceNames.LowTemperatureMagneticStir.ToString());
//isMatch = Regex.IsMatch(settingItem?.Context, pattern);
//if (settingItem != null && isMatch)
//{
// hostpoint = IPEndPoint.Parse(settingItem.Context.Trim());
//}
//LowTemperatureMagneticStirService lowTempertureMagneticStir = new LowTemperatureMagneticStirService() { Name = DeviceNames.LowTemperatureMagneticStir.ToString() };
//await lowTempertureMagneticStir.Initialize(this.CoreService, hostpoint);
//this.CoreService.RegisterInstance(lowTempertureMagneticStir, DeviceNames.LowTemperatureMagneticStir.ToString());
#endregion
#endif
#region
try
{
//获取连接设备的 USBCAN的SN码集合 --盒背面 SN码CanService能连接多个枪头
var canService = new Pipette1mlCan.CanService();
var serialNumberList = canService.LoadSerialNumberList();
foreach (var strSN in serialNumberList)
{
var setting = settingList.FirstOrDefault(x => x.Context == strSN.Value);
if (setting is null)
continue;
if (setting.Key.Contains("Dose_1ml"))
{
Pipette1ml.PipetteService pipetteService = null;
pipetteService = new Pipette1ml.PipetteService() { Name = DeviceNames.Pipette_Dose_1ml.ToString() };
var pipetteConfig = new Pipette1ml.PipetteServiceConfig
{
DeviceIndex = strSN.Key,
SerialNumber = strSN.Value,
Timeout = new TimeSpan(0, 3, 0),
IdList = new uint[] { 1, 2, 3, 4 } //枪的拨号 入多枪 IdList = new uint[] {1,2,3,4}
};
await pipetteService.Initialize(this.CoreService, pipetteConfig);
this.CoreService.RegisterInstance(pipetteService, pipetteService.Name);
}
//else if (setting.Key.Contains("Dose_1ml_2"))
//{
// Pipette1ml.PipetteService pipetteService = null;
// pipetteService = new Pipette1ml.PipetteService() { Name = DeviceNames.Pipette_Dose_1ml_2.ToString() };
// var pipetteConfig = new Pipette1ml.PipetteServiceConfig
// {
// DeviceIndex = strSN.Key,
// SerialNumber = strSN.Value,
// Timeout = new TimeSpan(0, 3, 0),
// IdList = new uint[] { 2 }
// };
// await pipetteService.Initialize(this.CoreService, pipetteConfig);
// this.CoreService.RegisterInstance(pipetteService, pipetteService.Name);
//}
//else if (setting.Key.Contains("Dose_1ml_3"))
//{
// Pipette1ml.PipetteService pipetteService = null;
// pipetteService = new Pipette1ml.PipetteService() { Name = DeviceNames.Pipette_Dose_1ml_3.ToString() };
// var pipetteConfig = new Pipette1ml.PipetteServiceConfig
// {
// DeviceIndex = strSN.Key,
// SerialNumber = strSN.Value,
// Timeout = new TimeSpan(0, 3, 0),
// IdList = new uint[] { 3 }
// };
// await pipetteService.Initialize(this.CoreService, pipetteConfig);
// this.CoreService.RegisterInstance(pipetteService, pipetteService.Name);
//}
//else if (setting.Key.Contains("Dose_1ml_4"))
//{
// Pipette1ml.PipetteService pipetteService = null;
// pipetteService = new Pipette1ml.PipetteService() { Name = DeviceNames.Pipette_Dose_1ml_4.ToString() };
// var pipetteConfig = new Pipette1ml.PipetteServiceConfig
// {
// DeviceIndex = strSN.Key,
// SerialNumber = strSN.Value,
// Timeout = new TimeSpan(0, 3, 0),
// IdList = new uint[] { 4 }
// };
// await pipetteService.Initialize(this.CoreService, pipetteConfig);
// this.CoreService.RegisterInstance(pipetteService, pipetteService.Name);
//}
//else if (setting.Key.Contains("React_1ml"))
//{
// Pipette1ml.PipetteService pipetteService = null;
// pipetteService = new Pipette1ml.PipetteService() { Name = DeviceNames.Pipette_React_1ml.ToString() };
// var pipetteConfig = new Pipette1ml.PipetteServiceConfig
// {
// DeviceIndex = strSN.Key,
// SerialNumber = strSN.Value,
// Timeout = new TimeSpan(0, 3, 0),
// IdList = new uint[] { 1 }
// };
// await pipetteService.Initialize(this.CoreService, pipetteConfig);
// this.CoreService.RegisterInstance(pipetteService, pipetteService.Name);
//}
}
}
catch (Exception)
{
throw;
}
#endregion
#region PLC连接
Dictionary<int, string> dictModbusHead = new Dictionary<int, string>();
dictModbusHead.Add(1, "投料站PLC");
//dictModbusHead.Add(2, "反应站PLC");
Dictionary<int, DeviceNames> dictmodbusName = new Dictionary<int, DeviceNames>();
dictmodbusName.Add(1, DeviceNames.Plc1);
//dictmodbusName.Add(2, DeviceNames.Plc2);
foreach (var deviceName in dictmodbusName.OrderBy(x => x.Key))
await CreateModBusService(dictModbusHead[deviceName.Key], deviceName.Value, deviceName.Key);
async Task CreateModBusService(string _header, DeviceNames _devicesName, int devierOrder)
{
string pattern = @"^(\d{1,3}\.){3}\d{1,3}:\d{1,5}$";
var header = _header;
this.ShowBusyContent($"连接{header}中..");
var settingItem = settingList.FirstOrDefault(x => x.Key == _devicesName.ToString());
bool isMatch = Regex.IsMatch(settingItem?.Context, pattern);
IModbusClientExtend client = null;
if (isMatch)
{
var host = IPEndPoint.Parse("192.168.1.40:502");
if (settingItem != null)
host = IPEndPoint.Parse(settingItem.Context);
ModbusSocketConfig socketConfig = new ModbusTcpConfig()
{
RemoteHost = host,
ScannerInterval = TimeSpan.FromMilliseconds(200),
};
client = new HuichuanAc801Service() { Header = header, Name = _devicesName.ToString() };
var warnMessage = await client.Initialize(this.CoreService, socketConfig);
this.WarnMessageList.Add(warnMessage);
}
else if ((bool)settingItem?.Context.StartsWith("F"))
{
client = null;
return;
}
else
{
client = this.CoreService.GetServiceInstance<IModbusClientExtend>(settingItem.Context);
if (client is null)
return;
}
//var pointList = this.dataAccessService.LoadEntitiesAsync<PlcPoint>(x => x.Name == _devicesName.ToString()).Result;
//foreach (var point in pointList)
// client.Register<Point>(point.Address, point.Descr, point.FunType);
this.CoreService.RegisterInstance<IModbusClientExtend>(client, _devicesName.ToString());
}
#endregion
#region WorkService
WorkService workService = new WorkService();
workService.Initialize(this.CoreService);
this.CoreService.RegisterInstance(workService);
#endregion
}
}
}