From 4db0c877350e6c3ad98fa60af4ac2a043e17870b Mon Sep 17 00:00:00 2001 From: SHM Date: Mon, 9 Mar 2026 14:21:39 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=84=B1=ED=98=84=EB=AA=A8]=20DeviceManager,?= =?UTF-8?q?=20Factory=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81,=20DIO,=20Sca?= =?UTF-8?q?nner=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eCIAv2.Library/Config/eCIAConfig.cs | 40 ++++++++++++++ eCIAv2.Library/Config/eCIAv2Config.json | 28 ++++++++++ eCIAv2.Library/Devices/DIIO/IDIO.cs | 15 ++++++ eCIAv2.Library/Devices/DIIO/NMF.cs | 23 ++++++++ eCIAv2.Library/Devices/DeviceFactory.cs | 24 +++++++++ eCIAv2.Library/Devices/DeviceManager.cs | 46 ++++++++++++++++ eCIAv2.Library/Devices/IDevice.cs | 13 +++++ eCIAv2.Library/Devices/Scanner/Cognex.cs | 23 ++++++++ eCIAv2.Library/Devices/Scanner/IScanner.cs | 14 +++++ eCIAv2.Library/Devices/Scanner/Zebra.cs | 23 ++++++++ eCIAv2.Library/Services/ConfigService.cs | 52 +++++++++++++++++++ eCIAv2.Library/eCIAv2.Library.csproj | 8 +++ eCIAv2.WindowsApp/Forms/MainForm.cs | 6 ++- eCIAv2.WindowsApp/Program.cs | 35 ++++++++++--- eCIAv2.WindowsApp/Services/ConfigService.cs | 16 ------ .../ViewModels/MainFromViewModel.cs | 17 ++++-- eCIAv2.WindowsApp/eCIAv2.WindowsApp.csproj | 4 -- 17 files changed, 352 insertions(+), 35 deletions(-) create mode 100644 eCIAv2.Library/Config/eCIAConfig.cs create mode 100644 eCIAv2.Library/Config/eCIAv2Config.json create mode 100644 eCIAv2.Library/Devices/DIIO/IDIO.cs create mode 100644 eCIAv2.Library/Devices/DIIO/NMF.cs create mode 100644 eCIAv2.Library/Devices/DeviceFactory.cs create mode 100644 eCIAv2.Library/Devices/DeviceManager.cs create mode 100644 eCIAv2.Library/Devices/IDevice.cs create mode 100644 eCIAv2.Library/Devices/Scanner/Cognex.cs create mode 100644 eCIAv2.Library/Devices/Scanner/IScanner.cs create mode 100644 eCIAv2.Library/Devices/Scanner/Zebra.cs create mode 100644 eCIAv2.Library/Services/ConfigService.cs delete mode 100644 eCIAv2.WindowsApp/Services/ConfigService.cs diff --git a/eCIAv2.Library/Config/eCIAConfig.cs b/eCIAv2.Library/Config/eCIAConfig.cs new file mode 100644 index 0000000..330b302 --- /dev/null +++ b/eCIAv2.Library/Config/eCIAConfig.cs @@ -0,0 +1,40 @@ +using eCIAv2.Library.Devices.Scanner; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Config +{ + public class eCIAConfig + { + public Dictionary Configs { get; set; } = new Dictionary(); + } + + public class eCIAChConfig + { + public short CH { get; set; } + + public Device Device { get; set; } = new Device(); + } + + public class Device + { + public List DIOs { get; set; } = new List(); + public List Scanners { get; set; } = new List(); + } + + + //device + public class DIO + { + public string Name { get; set; } = string.Empty; + } + + public class Scanner + { + public string Name { get; set; } = string.Empty; + public string Port { get; set; } = string.Empty; + } +} diff --git a/eCIAv2.Library/Config/eCIAv2Config.json b/eCIAv2.Library/Config/eCIAv2Config.json new file mode 100644 index 0000000..38d18db --- /dev/null +++ b/eCIAv2.Library/Config/eCIAv2Config.json @@ -0,0 +1,28 @@ +{ + "Configs": { + "1": { + "CH": 1, + "Device": { + "DIOs": [ + { + "Name": "NMF1" + } + ], + "Scanners": [ + { + "Name": "Cognex1", + "Port": "COM1" + }, + { + "Name": "Cognex2", + "Port": "COM2" + }, + { + "Name": "Zebra1", + "Port": "COM3" + } + ] + } + } + } +} \ No newline at end of file diff --git a/eCIAv2.Library/Devices/DIIO/IDIO.cs b/eCIAv2.Library/Devices/DIIO/IDIO.cs new file mode 100644 index 0000000..ca71dae --- /dev/null +++ b/eCIAv2.Library/Devices/DIIO/IDIO.cs @@ -0,0 +1,15 @@ +using eCIAv2.Library.Config; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Devices.DIIO +{ + public interface IDIO : IDevice + { + public string GetDI(); + public string SetDO(); + } +} diff --git a/eCIAv2.Library/Devices/DIIO/NMF.cs b/eCIAv2.Library/Devices/DIIO/NMF.cs new file mode 100644 index 0000000..c849c11 --- /dev/null +++ b/eCIAv2.Library/Devices/DIIO/NMF.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Devices.DIIO +{ + public class NMF : IDIO + { + public string DeviceName { get; set; } + + public string GetDI() + { + return "NMF DI"; + } + + public string SetDO() + { + return "NMF DO"; + } + } +} diff --git a/eCIAv2.Library/Devices/DeviceFactory.cs b/eCIAv2.Library/Devices/DeviceFactory.cs new file mode 100644 index 0000000..67e9475 --- /dev/null +++ b/eCIAv2.Library/Devices/DeviceFactory.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Devices +{ + public class DeviceFactory + { + private readonly IServiceProvider _provider; + + public DeviceFactory(IServiceProvider provider) + { + _provider = provider; + } + + public T Create() + { + return _provider.GetRequiredService(); + } + } +} diff --git a/eCIAv2.Library/Devices/DeviceManager.cs b/eCIAv2.Library/Devices/DeviceManager.cs new file mode 100644 index 0000000..643258b --- /dev/null +++ b/eCIAv2.Library/Devices/DeviceManager.cs @@ -0,0 +1,46 @@ +using eCIAv2.Library.Config; +using eCIAv2.Library.Devices.DIIO; +using eCIAv2.Library.Devices.Scanner; +using eCIAv2.Library.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Devices +{ + public class DeviceManager + { + private readonly Dictionary _devices = new(); + + public DeviceManager(DeviceFactory factory, ConfigService config) + { + foreach (var dicConfig in config.GetConfig().Configs) + { + //scanner + foreach(var device in dicConfig.Value.Device.Scanners) + { + var scanner = factory.Create(); + scanner.DeviceName = device.Name; + + _devices.Add(device.Name, scanner); + } + + //dio + foreach (var device in dicConfig.Value.Device.DIOs) + { + var dio = factory.Create(); + dio.DeviceName = device.Name; + + _devices.Add(device.Name, dio); + } + } + } + + public T GetDevice(string name) where T : IDevice + { + return (T)_devices[name]; + } + } +} diff --git a/eCIAv2.Library/Devices/IDevice.cs b/eCIAv2.Library/Devices/IDevice.cs new file mode 100644 index 0000000..e5b2f1c --- /dev/null +++ b/eCIAv2.Library/Devices/IDevice.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Devices +{ + public interface IDevice + { + public string DeviceName { get; set; } + } +} diff --git a/eCIAv2.Library/Devices/Scanner/Cognex.cs b/eCIAv2.Library/Devices/Scanner/Cognex.cs new file mode 100644 index 0000000..8adb945 --- /dev/null +++ b/eCIAv2.Library/Devices/Scanner/Cognex.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Devices.Scanner +{ + public class Cognex : IScanner + { + public string DeviceName { get; set; } = string.Empty; + + public Action OnRecvData() + { + throw new NotImplementedException(); + } + + public string Trigger() + { + return DeviceName; + } + } +} diff --git a/eCIAv2.Library/Devices/Scanner/IScanner.cs b/eCIAv2.Library/Devices/Scanner/IScanner.cs new file mode 100644 index 0000000..ce3890a --- /dev/null +++ b/eCIAv2.Library/Devices/Scanner/IScanner.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Devices.Scanner +{ + public interface IScanner : IDevice + { + public string Trigger(); + public Action OnRecvData(); + } +} diff --git a/eCIAv2.Library/Devices/Scanner/Zebra.cs b/eCIAv2.Library/Devices/Scanner/Zebra.cs new file mode 100644 index 0000000..9a8f63e --- /dev/null +++ b/eCIAv2.Library/Devices/Scanner/Zebra.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Devices.Scanner +{ + public class Zebra : IScanner + { + public string DeviceName { get; set; } = string.Empty; + + public Action OnRecvData() + { + throw new NotImplementedException(); + } + + public string Trigger() + { + return DeviceName; + } + } +} diff --git a/eCIAv2.Library/Services/ConfigService.cs b/eCIAv2.Library/Services/ConfigService.cs new file mode 100644 index 0000000..da309e2 --- /dev/null +++ b/eCIAv2.Library/Services/ConfigService.cs @@ -0,0 +1,52 @@ +using eCIAv2.Library.Config; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace eCIAv2.Library.Services +{ + public class ConfigService + { + public string ConfigPath { get; private set; } = string.Empty; + + public eCIAConfig Config = new eCIAConfig(); + + public eCIAConfig LoadConfig(string configPath) + { + ConfigPath = configPath; + if(File.Exists(configPath) == true) + { + var configJson = File.ReadAllText(ConfigPath); + Config = JsonConvert.DeserializeObject(configJson); + + LogXnet.WriteLine($"Config read Success.", LogXLabel.INFO); + + return Config; + } + + LogXnet.WriteLine($"Config not exist.", LogXLabel.Error); + LogXnet.WriteLine($"ConfigPath:{ConfigPath}", LogXLabel.Error); + + return null; + } + + public eCIAConfig GetConfig() + { + return Config; + } + + public eCIAChConfig GetConfigByCh(int ch) + { + if(Config?.Configs?.TryGetValue(ch, out var config) == true) + { + return config; + } + + LogXnet.WriteLine($"Config CH {ch} not exist.", LogXLabel.Error); + return null; + } + } +} diff --git a/eCIAv2.Library/eCIAv2.Library.csproj b/eCIAv2.Library/eCIAv2.Library.csproj index 333bcd2..b4bc565 100644 --- a/eCIAv2.Library/eCIAv2.Library.csproj +++ b/eCIAv2.Library/eCIAv2.Library.csproj @@ -6,6 +6,11 @@ enable + + + + + ..\DLL\SystemX.Core.dll @@ -13,6 +18,9 @@ + + Always + Always diff --git a/eCIAv2.WindowsApp/Forms/MainForm.cs b/eCIAv2.WindowsApp/Forms/MainForm.cs index cc7ea23..529fdfd 100644 --- a/eCIAv2.WindowsApp/Forms/MainForm.cs +++ b/eCIAv2.WindowsApp/Forms/MainForm.cs @@ -1,4 +1,8 @@ +using eCIAv2.Library.Devices; +using eCIAv2.Library.Devices.DIIO; +using eCIAv2.Library.Devices.Scanner; using eCIAv2.WindowsApp.ViewModels; +using Microsoft.Extensions.DependencyInjection; namespace eCIAv2.WindowsApp { @@ -10,8 +14,6 @@ namespace eCIAv2.WindowsApp { InitializeComponent(); _vm = vm; - - var ss= _vm.LoadConfig(); } } } diff --git a/eCIAv2.WindowsApp/Program.cs b/eCIAv2.WindowsApp/Program.cs index 0b6e365..fc6b34f 100644 --- a/eCIAv2.WindowsApp/Program.cs +++ b/eCIAv2.WindowsApp/Program.cs @@ -1,7 +1,12 @@ -using eCIAv2.WindowsApp.Services; +using eCIAv2.Library.Config; +using eCIAv2.Library.Devices; +using eCIAv2.Library.Devices.DIIO; +using eCIAv2.Library.Devices.Scanner; +using eCIAv2.Library.Services; using eCIAv2.WindowsApp.ViewModels; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Newtonsoft.Json; namespace eCIAv2.WindowsApp { @@ -15,9 +20,9 @@ namespace eCIAv2.WindowsApp [STAThread] static void Main() { - //LogXnet string configDir = @$"{Application.StartupPath}Config"; - //raed log4net configs + + //LogXnet if (LogXnet.ReadConfig(@$"{configDir}/LogXnetConfig.json") == true) { LogXnet.WriteLine("LogXnet Init Success"); @@ -27,22 +32,36 @@ namespace eCIAv2.WindowsApp Console.WriteLine("LogXnet Init Failed"); return; } - + AppHost = Host.CreateDefaultBuilder() .ConfigureServices((context, services) => { + //device + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + + //device factory + services.AddSingleton(); + //device manager + services.AddSingleton(); + // services services.AddSingleton(); - //viewmodels services.AddTransient(); - // forms services.AddTransient(); }).Build(); - - ApplicationConfiguration.Initialize(); + var configService = AppHost.Services.GetRequiredService(); + var config = configService.LoadConfig(@$"{configDir}/eCIAv2Config.json"); + + //config ¿À·ù üũ + if (config == null) + return; + + ApplicationConfiguration.Initialize(); var form = AppHost.Services.GetRequiredService(); Application.Run(form); } diff --git a/eCIAv2.WindowsApp/Services/ConfigService.cs b/eCIAv2.WindowsApp/Services/ConfigService.cs deleted file mode 100644 index e9c2131..0000000 --- a/eCIAv2.WindowsApp/Services/ConfigService.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace eCIAv2.WindowsApp.Services -{ - public class ConfigService - { - public string LoadConfig() - { - return "loadConfig"; - } - } -} diff --git a/eCIAv2.WindowsApp/ViewModels/MainFromViewModel.cs b/eCIAv2.WindowsApp/ViewModels/MainFromViewModel.cs index 284dec1..cdd04ad 100644 --- a/eCIAv2.WindowsApp/ViewModels/MainFromViewModel.cs +++ b/eCIAv2.WindowsApp/ViewModels/MainFromViewModel.cs @@ -1,4 +1,8 @@ -using eCIAv2.WindowsApp.Services; +using eCIAv2.Library.Config; +using eCIAv2.Library.Devices; +using eCIAv2.Library.Devices.DIIO; +using eCIAv2.Library.Devices.Scanner; +using eCIAv2.Library.Services; using System; using System.Collections.Generic; using System.Linq; @@ -10,15 +14,18 @@ namespace eCIAv2.WindowsApp.ViewModels public class MainFromViewModel { private readonly ConfigService _configService; + private readonly DeviceManager _deviceManager; - public MainFromViewModel(ConfigService configService) + public MainFromViewModel(ConfigService configService, DeviceManager deviceManager) { _configService = configService; + _deviceManager = deviceManager; } - - public string LoadConfig() + + public void TriggerCognex() { - return _configService.LoadConfig(); + IScanner cognex = _deviceManager.GetDevice("Cognex1"); + var sss = cognex.Trigger(); } } } diff --git a/eCIAv2.WindowsApp/eCIAv2.WindowsApp.csproj b/eCIAv2.WindowsApp/eCIAv2.WindowsApp.csproj index 630b67c..f75930d 100644 --- a/eCIAv2.WindowsApp/eCIAv2.WindowsApp.csproj +++ b/eCIAv2.WindowsApp/eCIAv2.WindowsApp.csproj @@ -30,8 +30,4 @@ - - - - \ No newline at end of file