2026-06-05 13:44:39 +09:00

363 lines
18 KiB
C#

using Aurora;
using Aurora.Api;
using Aurora.Api.Manager;
using Aurora.Api.Services;
using Aurora.View;
using Aurora.View.Alarm;
using Aurora.View.AutoBackup;
using AuroraCellTracker;
using AuroraCellTracker.Views;
using AuroraIO;
using AuroraIO.View;
using AuroraLaser;
using AuroraLaser.Trupulse;
using AuroraLaser.Trupulse.Views;
using AuroraLBAD;
using AuroraLBAD.Services;
using AuroraOCT;
using AuroraOCT.Views;
using AuroraPLC;
using AuroraPLC.Views;
using CoreUnit.Scanner.UserControl.ScannerCanvas;
using DB;
using DB.Recipe;
using GUI;
using ILSOS_PrismaticScanner.Alarm;
using ILSOS_PrismaticScanner.Device;
using ILSOS_PrismaticScanner.Device.IO;
using ILSOS_PrismaticScanner.Models;
using ILSOS_PrismaticScanner.Recipes;
using ILSOS_PrismaticScanner.Sequences;
using ILSOS_PrismaticScanner.Settings;
using ILSOS_PrismaticScanner.Views;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using System.Security.Cryptography;
using System.Threading;
using System.Windows.Controls;
using System.Windows.Interop;
using WeldingCommon;
using WeldingCommon.Alarm;
using WeldingCommon.Recipes;
using WeldingCommon.Sequences;
using WeldingCommon.Settings;
using WeldingCommon.Utils;
using WeldingCommon.Views;
using WeldingCommon.Views.Manual;
using WeldingCommon.Views.Recipes.History;
using WeldingCommon.Vision.Factory;
using static WeldingCommon.Vision.Factory.VisionFactory;
namespace ILSOS_PrismaticScanner
{
internal class EquipmentSetup : CommonEquipmentSetup, IEquipmentSetup
{
private SequenceBuilder _SeqAutoRunPrismaticScanner_Builder;
private SequenceBuilder _SeqAutoRunComponentWeld_Builder;
private SequenceBuilder _SeqAlarmMonitor_Builder;
public override void BuildMainStatusView(MainStatusBuilder builder)
{
base.BuildMainStatusView(builder);
builder.AddDeviceActiveStatus(CommonDeviceIds.CellTracker)
.AddDeviceActiveStatus(CommonDeviceIds.OCT);
}
public override string GetEquipmentName()
{
return "ILSOS PrismaticScanner";
}
public override void OnResetAlarm(List<int> codeList)
{
base.OnResetAlarm(codeList);
// Laser Reset 추가
var laser = AuroraEnv.DeviceManager[DeviceIds.Laser] as Laser;
var core = laser.getCore() as TruPulse;
if(core?.AlarmReasons.Count > 0) {
core?.AlarmReset();
}
}
public override void OnSetAlarm(int code, bool isHeavy)
{
base.OnSetAlarm(code, isHeavy);
if (isHeavy) {
AlarmManager_PrismaticScanner.StopSequenceByAlarm(code);
}
}
public override async void OnStartUp()
{
var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo;
if (equipSetting.AutomaticallyConnectDevices) {
await ActivateDevices();
}
AuroraEx.RegisterRmsHandler<RMSHandlerForScanner>();
AuroraEnv.RecipeManager.RmsHandler().RegistryDeviceHandler(AuroraEnv);
AuroraEnv.RecipeManager.RmsHandler().Start();
// [Singleton Instance] Recipe Change History
AuroraEnv.RecipeManager.RchHandler().RegistryDeviceHandler(AuroraEnv);
//AlarmMonitroing Seq Start
AuroraEnv.SequenceEntry[SequenceIds.SeqAlarmMonitor].Start();
AuroraEnv.SequenceEntry[SequenceIds.SeqStatusMonitor].Start();
AuroraEnv.SequenceEntry[CommonSequenceIds.PLCMonitor].Start();
base.OnStartUp();
}
public override void OnShutDown()
{
var io = AuroraEnv.DeviceManager[CommonDeviceIds.IODevice] as PAIX_PrismaticCleaner;
io.WriteDoBit(PAIX_PrismaticCleaner.ePrismaticDOAddress.PilotLaserEnable, false);
io.WriteDoBit(PAIX_PrismaticCleaner.ePrismaticDOAddress.LaserEnable, false);
// 모니터링 시퀀스 먼저 종료
AuroraEnv.SequenceEntry[SequenceIds.SeqAlarmMonitor].Stop();
AuroraEnv.SequenceEntry[SequenceIds.SeqStatusMonitor].Stop();
AuroraEnv.SequenceEntry[CommonSequenceIds.PLCMonitor].Stop();
Thread.Sleep(200);
base.OnShutDown();
}
public override void OnPostDeviceActivated(string dev)
{
base.OnPostDeviceActivated(dev);
switch (dev) {
case DeviceIds.IODevice:
var io = AuroraEnv.DeviceManager[dev] as PAIX_PrismaticCleaner;
io.WriteDoBit(PAIX_PrismaticCleaner.ePrismaticDOAddress.AirKnife, true);
io.WriteDoBit(PAIX_PrismaticCleaner.ePrismaticDOAddress.PilotLaserEnable, false);
io.WriteDoBit(PAIX_PrismaticCleaner.ePrismaticDOAddress.LaserEnable, false);
break;
case DeviceIds.PLCDevice:
var plc = AuroraEnv.DeviceManager[dev] as PLCControllerPrismaticScanner;
plc.WriteBit(PLCControllerPrismaticScanner.eBitOutput.PC_AUTO_STATUS, false);
break;
case DeviceIds.Laser:
var laser = AuroraEnv.DeviceManager[dev] as Laser;
var core = laser.getCore() as TruPulse;
var truPulseConf = laser.Config as TruPulseConfig;
core.SetInterfaceMode(4);
Thread.Sleep(100);
core.SetPulseBurstLength(truPulseConf.BurstLength);
Thread.Sleep(100);
core.SetAnalogueSetPoint(1, (ushort)truPulseConf.Simmer);
break;
}
}
public override void RegisterDevices(IDeviceRegistry registry)
{
base.RegisterDevices(registry);
var isSimul = ApplicationExt.IsSimulation;
//registry.Register(CommonDeviceIds.OCT, () => new OCT(CommonDeviceIds.OCT, isSimul), new OCTConfig(),
// device => new UCOCTDevice() { DataContext = new UCOCTDeviceViewModel(AuroraEnv, CommonDeviceIds.OCT) });
//registry.Register(CommonDeviceIds.LBAD, () => new LBAD(CommonDeviceIds.LBAD, isSimul), new LBADConfig());
//registry.Register(CommonDeviceIds.CellTracker, () => new CellTracker(CommonDeviceIds.CellTracker, eCellTrackerType.Daekhon, isSimul), new CellTrackerConfig(),
// device => new UCCellTrackerDevice() { DataContext = new UCCellTrackerDeviceViewModel(AuroraEnv, CommonDeviceIds.CellTracker) });
var io = new PAIX_PrismaticCleaner(AuroraEnv, CommonDeviceIds.IODevice, isSimul);
registry.Register(CommonDeviceIds.IODevice, () => io, new IOUnitConfig());
var laser = new Laser(CommonDeviceIds.Laser, isSimul);
laser.ExtLaserEnable = (on) => io.WriteDoBit(PAIX_PrismaticCleaner.ePrismaticDOAddress.LaserEnable, on);
laser.ExtLaserDisable = (on) => io.WriteDoBit(PAIX_PrismaticCleaner.ePrismaticDOAddress.LaserDisable, on);
laser.ExtPilotOnOff = (on) => io.WriteDoBit(PAIX_PrismaticCleaner.ePrismaticDOAddress.PilotLaserEnable, on);
registry.Register(CommonDeviceIds.Laser, () => laser, new TruPulseConfig(), device => new UCTruPulseManual(AuroraEnv, CommonDeviceIds.Laser));
var _plc = new PLCControllerPrismaticScanner(CommonDeviceIds.PLCDevice, ePLCNetType.MXComponent, ApplicationExt.IsSimulation, PLCMMapFileType.CSV, AuroraEnv);
registry.Register(CommonDeviceIds.PLCDevice,
() => _plc, PLCMxComponentConfig.GetDefaultConfig(),
device => new UCPLCDevice() { DataContext = new UCPLCDeviceViewModel(AuroraEnv, _plc) });
AlarmManager.Init(AuroraEnv);
}
public override void RegisterRecipes(RecipeRegister register)
{
register(CommonRecipeIds.ScannerObjectTeaching, new ScannerObjectTeachingRecipe(),
(id, item) => new UCScannerObjectTeaching(AuroraEnv));
base.RegisterRecipes(register);
}
public override void RegisterModels(ModelRegister register)
{
register(CommonModelIds.EquipmentSpecificModel, new EquipmentSpecificModel_PrismaticScanner(),
(id, item) => new UCModelEditor(new UCModelEditorViewModel(AuroraEnv), ModelExternalDelegate.ExternalCreateEquipmentSpecificEditor));
base.RegisterModels(register);
}
public override void RegisterSequences(SequenceRegister register)
{
// Common Sequences register
SequenceManager.RegisterSequence(AuroraEnv, register);
base.RegisterSequences(register);
var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo;
register(SequenceIds.SeqStreamTest, SeqStreamTest.Builder());
// Event Q Test 추가
var seqEventQTest = new SeqEventQTest();
register(SequenceIds.SeqEventQTest, seqEventQTest.Builder());
var seqAutoRunPrismaticScanner = new SeqAutoRunPrismaticScanner();
var seqAutoRunComponentWeld = new SeqAutoRunComponentWeld();
var seqAlarmMonitor = new SeqAlarmMonitor();
_SeqAutoRunPrismaticScanner_Builder = seqAutoRunPrismaticScanner.Builder();
_SeqAutoRunComponentWeld_Builder = seqAutoRunComponentWeld.Builder();
_SeqAlarmMonitor_Builder = seqAlarmMonitor.Builder();
register(SequenceIds.SeqAutoRun, _SeqAutoRunPrismaticScanner_Builder);
register(SequenceIds.SeqAutoRunComponentWeld, _SeqAutoRunComponentWeld_Builder);
register(SequenceIds.SeqAlarmMonitor, _SeqAlarmMonitor_Builder);
register(SequenceIds.SeqStatusMonitor, SeqStatusMonitor.Builder());
// SequenceManager.RegisterSequence(AuroraEnv, register);
}
public override void RegisterSettings(SettingRegister register) {
base.RegisterSettings(register);
register(CommonSettingIds.UploadDatas, new SettingUploadDataListForScanner());
}
public override void RegisterServices(IServiceRegistry register)
{
//Stream 사용 시에만 등록하도록 하자
var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo;
if (equipSetting.UseStream) {
//LBAD
register.Register(CommonServiceIds.StreamLBADClient, () => new StreamLBADClient(CommonStreamServiceNames.LBADRPC), new StreamClientConfig());
#region StreamTest
//PubSub
register.Register(CommonServiceIds.StreamPubTest, () => new StreamPub(CommonStreamServiceNames.PubSubTest), new StreamPubConfig());
register.Register(CommonServiceIds.StreamSubTest, () => new StreamSub(CommonStreamServiceNames.PubSubTest), new StreamSubConfig());
//RPC
register.Register(CommonServiceIds.StreamServerTest, () => new StreamServer(CommonStreamServiceNames.LBADRPC), new StreamServerConfig());
register.Register(CommonServiceIds.StreamClientTest, () => new StreamClient(CommonStreamServiceNames.LBADRPC), new StreamClientConfig());
//MessageBroadcasting
register.Register(CommonServiceIds.StreamBroadcastPub, () => new StreamBroadcastPub(), new StreamBroadcastPubConfig());
register.Register(CommonServiceIds.StreamBroadcastSub, () => new StreamBroadcastSub(), new StreamBroadcastSubConfig());
#endregion
}
}
// Views는 장비별로 별도로 등록하자.
public override void RegisterViews(IViewManager manager)
{
base.RegisterViews(manager);
// Auto Run
var MainAutoRun = new MainMenu(CommonViewIds.AutoRun, MenuIcon.GetMenuIcon(eMenuIcon.HOME), PermissionLevel.NONE, false);
MainAutoRun.AddSubMenu(CommonViewIds.AutoRun, new UCMainAutoRun(new UCMainAutoRunViewModel(AuroraEnv, SequenceIds.SeqAutoRun)));
manager.RegisterMainMenu(MainAutoRun);
// Recipe
MainMenu recipe = new MainMenu(CommonViewIds.Recipe, MenuIcon.GetMenuIcon(eMenuIcon.RECIPE), PermissionLevel.NONE, true);
recipe.AddSubMenu(CommonViewIds.Recipe, new UCRecipe());
recipe.AddSubMenu(CommonViewIds.RecipeChangeHistory, new UCRecipeChangeHistory() { DataContext = new UCRecipeChangeHistoryViewModel(AuroraEnv) });
recipe.AddSubMenu(CommonViewIds.ModelEditor, new UCModel());
manager.RegisterMainMenu(recipe);
AuroraEnv.EventObservable.AsObservable(CommonEventIds.EVENT_EQUIPMENT_STATUS_CHANGE)
.Select(msg => (eEqpStatus)msg.Param)
.ObserveOnDispatcher()
.Subscribe(status => {
if (status == eEqpStatus.Auto) {
AuroraEnv.ViewManager.ChangeMenu(CommonViewIds.AutoRun);
AuroraEnv.ViewManager.MainMenuEnable(false, CommonViewIds.Recipe);
RecipeHelper.OnActiveReloaded();
} else{
AuroraEnv.ViewManager.MainMenuAllEnable(true);
//RecipeHelper.RollbackRecipe();
}
//recipe.SubViews.Where(view => view.SubName == CommonViewIds.Recipe).First().View.IsEnabled = !isAuto;
});
// Manual
//var manual = new MainMenu(CommonViewIds.Manual, MenuIcon.GetMenuIcon(eMenuIcon.DEVICE), PermissionLevel.LEVEL4, true); // Level4 가 맞으나, 개발때는 None 으로 뒀다가 완료되면 풀자.
var manual = new MainMenu(CommonViewIds.Manual, MenuIcon.GetMenuIcon(eMenuIcon.CAMERA), PermissionLevel.NONE, true);
manual.AddSubMenu(CommonViewIds.ScannerOperation, new UCManualScannerOperation(new UCManualScannerOperationViewModel(AuroraEnv, CommonDeviceIds.Scanner, false)));
//manual.AddSubMenu(CommonViewIds.OCT, new UCOCTManualMotion(AuroraEnv, CommonDeviceIds.OCT));
//manual.AddSubMenu(CommonViewIds.LBAD, new UCLBADDevice(AuroraEnv, CommonDeviceIds.LBAD, CommonDeviceIds.IODevice));
//manual.AddSubMenu(CommonViewIds.ConvEdgeObject, new UCConvEdgeObject(AuroraEnv));
manual.AddSubMenu(CommonViewIds.ModelFinder, new UCManualModelFinder(new UCManualModelFinderViewModel(AuroraEnv)));
// Manual - For Test
//manual.AddSubMenu(CommonViewIds.TestDevice, new UCTestDevice(new UCTestDeviceViewModel(AuroraEnv)));
//manual.AddSubMenu(CommonViewIds.TestSequence, new UCTestSequence(new UCTestSequenceViewModel(AuroraEnv)));
manager.RegisterMainMenu(manual);
//Calibration
var calibration = new MainMenu(CommonViewIds.Calibration, MenuIcon.GetMenuIcon(eMenuIcon.SCANNER), PermissionLevel.LEVEL3, true);
calibration.AddSubMenu(CommonViewIds.Scanner, new UCScannerCalibration(new UCScannerCalibrationViewModel(AuroraEnv)));
//calibration.AddSubMenu(CommonViewIds.Power, new UCPowerCalibration(AuroraEnv)); // 불필요
//calibration.AddSubMenu(CommonViewIds.PowerCalProfile, new UCPowerProfile(AuroraEnv, CommonDeviceIds.Laser)); // 불필요
calibration.AddSubMenu(CommonViewIds.PixelResolution, new UCCameraPixelResolution(new UCCameraPixelResolutionViewModel(AuroraEnv)));
manager.RegisterMainMenu(calibration);
// Monitoring
var monitoring = new MainMenu(CommonViewIds.Monitoring, MenuIcon.GetMenuIcon(eMenuIcon.MONITORING), PermissionLevel.NONE, true);
//manual.AddSubMenu(CommonViewIds.PLCInterfaceView, new UCPLCInterfaceView(AuroraEnv, CommonDeviceIds.PLCDevice));
monitoring.AddSubMenu(CommonViewIds.PLCBitMonitoring, new UCPLCBit() { DataContext = PLCStatic.GetInstanceBitVM(AuroraEnv, CommonDeviceIds.PLCDevice, ePLCNetType.MXComponent, PLCBase.ePLCDevice.M) });
monitoring.AddSubMenu(CommonViewIds.PLCWordMonitoring, new UCPLCWord() { DataContext = PLCStatic.GetInstanceWordVM(AuroraEnv, CommonDeviceIds.PLCDevice, ePLCNetType.MXComponent, PLCBase.ePLCDevice.D) });
monitoring.AddSubMenu(CommonViewIds.IOInterfaceView, new UCIOInterfaceView(AuroraEnv, CommonDeviceIds.IODevice));
manager.RegisterMainMenu(monitoring);
// Device
var device = new MainMenu(CommonViewIds.Device, MenuIcon.GetMenuIcon(eMenuIcon.GEAR), PermissionLevel.LEVEL3, false);
device.AddSubMenu(CommonViewIds.Device, new DeviceSettingView()); // "CommonViewIds.Setting" 는 EquipDef.cs 에서 정의한 ViewId
manager.RegisterMainMenu(device);
//Setting
var setting = new MainMenu(CommonViewIds.Setting, MenuIcon.GetMenuIcon(eMenuIcon.SETTING), PermissionLevel.LEVEL1, true);
setting.AddSubMenu(CommonViewIds.Setting, new EquipSettingView());
setting.AddSubMenu(CommonViewIds.LogSetting, new LogSettingView());
setting.AddSubMenu(CommonViewIds.AutoBackupView, new AutoBackupView2() { DataContext = new AutoBackupViewModel() });
manager.RegisterMainMenu(setting);
// Alarm
MainMenu alarm = new MainMenu(CommonViewIds.Alarm, MenuIcon.GetMenuIcon(eMenuIcon.BARCODE), PermissionLevel.NONE, true)
.AddSubMenu(CommonViewIds.History, new AlarmHistoryView())
.AddSubMenu(CommonViewIds.Description, new AlarmDescView());
manager.RegisterMainMenu(alarm);
var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo;
if (equipSetting.UseStream) {
MainMenu service = new MainMenu(CommonViewIds.StreamDevice, MenuIcon.GetMenuIcon(eMenuIcon.DEVICE))
.AddSubMenu(CommonViewIds.StreamDevice, new UCServiceSettingView());
manager.RegisterMainMenu(service);
}
// Vision (미사용)
//VisionFactory.RegisterViews(manager);
}
}
}