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

243 lines
10 KiB
C#

using ACS.SPiiPlusNET;
using Aurora;
using Aurora.Api;
using Aurora.Framework.Alarm;
using AuroraACS;
using AuroraChiller;
using AuroraIO;
using AuroraLaser;
using AuroraLaser.Trumpf;
using AuroraLaserScanner;
using AuroraLBAD;
using AuroraMotionBoard.Ajin;
using AuroraOCT;
using Hermes.Functional;
using ILSOS_PrismaticGun.Alarm;
using ILSOS_PrismaticGun.Device;
using ILSOS_PrismaticGun.Device.ACS;
using ILSOS_PrismaticGun.Process;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using WeldingCommon;
using WeldingCommon.Alarm;
using WeldingCommon.Devices;
using WeldingCommon.Sequences;
using WeldingCommon.Settings;
using WeldingCommon.Utils;
namespace ILSOS_PrismaticGun.Sequences.Monitoring
{
public class SeqAlarmMonitor
{
static readonly Logger Log = new Logger("AlarmMonitoring");
const string SEQ_START = "SEQ START"; // 딱 한번 Sequence 진입 시에만 실행될 Node
const string SEQ_LoopFirst = "SEQ Loop First";
public const string CHECK_ALARM_PLC = "Check Alarm PLC";
public const string CHECK_ALARM_ACS = "Check Alarm ACS";
public const string CHECK_ALARM_LASER = "Check Alarm Laser";
public const string CHECK_ALARM_IO = "Check Alarm IO";
private static SequenceSetting _SequenceSetting;
private static PLCControllerPrismaticGun _plc;
private static Laser _laser;
private static LaserTruFiber _laserCore;
private static PrismaticGunACSIO _io;
private static PrismaticGunACS _acs;
private static ACSMotor _axisAX, _axisAY, _axisBX, _axisBY;
private static AJINMotor _axisAZ, _axisBZ;
public const int NODE_SLEEP = 100; // msec
public static SequenceBuilder Builder()
{
SequenceBuilder sb = new SequenceBuilder(1000, true);
sb.AddAction(SEQ_START, StartNode);
sb.AddDecision(SEQ_LoopFirst, LoopFirstNode);
sb.AddAction(CHECK_ALARM_PLC, CheckAlarmPlc);
sb.AddAction(CHECK_ALARM_LASER, CheckAlarmLaser);
sb.AddAction(CHECK_ALARM_IO, CheckAlarmIO);
sb.AddAction(CHECK_ALARM_ACS, CheckAlarmAcs);
sb.Flows(sb.Init > sb[SEQ_START] > sb[SEQ_LoopFirst]
> sb[CHECK_ALARM_PLC] > sb[CHECK_ALARM_LASER]
> sb[CHECK_ALARM_IO] > sb[CHECK_ALARM_ACS]
> sb[SEQ_LoopFirst]);
sb.Flows(sb[SEQ_LoopFirst] > sb.Final);
sb.OnStopped(OnStopped);
sb.OnForceError(OnForceError);
//sb.Draw("SeqAlarmMonitor.pdf");
return sb;
}
private static SequenceActionResult StartNode(SequenceContext context, string id, SequenceActionResult param)
{
_SequenceSetting = context.Settings[CommonSettingIds.Sequence] as SequenceSetting;
if (_plc is null)
_plc = context.Devices[CommonDeviceIds.PLCDevice] as PLCControllerPrismaticGun;
if (_laser is null)
_laser = context.Devices[CommonDeviceIds.Laser] as Laser;
_laserCore = _laser.getCore() as LaserTruFiber;
if (_io is null)
_io = context.Devices[CommonDeviceIds.IODevice] as PrismaticGunACSIO;
if (_acs is null)
_acs = context.Devices[DeviceIds.ACS] as PrismaticGunACS;
if (_axisAX is null)
_axisAX = context.Devices[MotorIds.ALineX] as ACSMotor;
if (_axisAY is null)
_axisAY = context.Devices[MotorIds.ALineY] as ACSMotor;
if (_axisBX is null)
_axisBX = context.Devices[MotorIds.BLineX] as ACSMotor;
if (_axisBY is null)
_axisBY = context.Devices[MotorIds.BLineY] as ACSMotor;
if (_axisAZ is null)
_axisAZ = context.Devices[MotorIds.ALineZ] as AJINMotor;
if (_axisBZ is null)
_axisBZ = context.Devices[MotorIds.BLineZ] as AJINMotor;
return SequenceAction.Ok();
}
private static string LoopFirstNode(SequenceContext context, string id, ICollection<string> branches, SequenceActionResult param)
{
while (!context.Stopped) {
return CHECK_ALARM_PLC;
}
Thread.Sleep(NODE_SLEEP);
return SeqNodeIds.FINAL;
}
private static SequenceActionResult CheckAlarmPlc(SequenceContext context, string id, SequenceActionResult param)
{
if (_plc.ReadBit(PLCControllerPrismaticGun.eBitInput.PLC_LIGHT_ALARM_STATUS).data)
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.PLC_LIGHT_ALARM))
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.PLC_LIGHT_ALARM)}");
var plcHeavyAlarm = _plc.ReadBit(PLCControllerPrismaticGun.eBitInput.PLC_HEAVY_ALARM_STATUS).data;
if (ChangeChecker.IsChangedBoolMonitoring("PlcHeavyAlarm", plcHeavyAlarm, true)) {
Log.E("PLC Heavy Alarm 발생!!!");
Log.E($"Stage A : X = {_axisAX.GetActualPos()}, Y = {_axisAY.GetActualPos()}, Z = {_axisAZ.GetCurrentPosition()}");
Log.E($"Stage B : X = {_axisBX.GetActualPos()}, Y = {_axisBY.GetActualPos()}, Z = {_axisBZ.GetCurrentPosition()}");
ProcessManager.Instance.CycleStop();
}
var doorInterlock = _plc.ReadBit(PLCControllerPrismaticGun.eBitInput.PLC_DOOR_INTERLOCK).data;
if (doorInterlock) {
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.PLC_DOOR_INTERLOCK))
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.PLC_DOOR_INTERLOCK)}");
}
if(doorInterlock && _plc.ReadOutBit(PLCControllerPrismaticGun.eBitOutput.PC_STAGE_A_WELDING_BUSY).data) {
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.STAGE_A_DOOR_INTERLOCK_DURING_WELDING))
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.STAGE_A_DOOR_INTERLOCK_DURING_WELDING)}");
}
if (doorInterlock && _plc.ReadOutBit(PLCControllerPrismaticGun.eBitOutput.PC_STAGE_B_WELDING_BUSY).data) {
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.STAGE_B_DOOR_INTERLOCK_DURING_WELDING))
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.STAGE_B_DOOR_INTERLOCK_DURING_WELDING)}");
}
if (_plc.ReadBit(PLCControllerPrismaticGun.eBitInput.PLC_EMO_STATUS).data){
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.PLC_EMO_PUSH)) {
_laserCore.LaserOff();
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.PLC_EMO_PUSH)}");
}
}
Thread.Sleep(NODE_SLEEP);
return SequenceAction.Ok();
}
private static SequenceActionResult CheckAlarmAcs(SequenceContext context, string id, SequenceActionResult param)
{
if ((_acs.HasHeavyAlarm | _acs.HasLightAlarm) & _acs.IsActivated) {
foreach (var alarm in _acs.HaveAlarmCodes) {
if (alarm != 0) {
if (!AlarmManager.IsOccuredAlarm(alarm))
Log.E($"{context.AlarmAccured(alarm)}");
}
}
}
if (_axisAZ.IsAlarm())
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.DEVICE_STAGE_A_AXISZ_ERROR))
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.DEVICE_STAGE_A_AXISZ_ERROR)}");
if (_axisBZ.IsAlarm())
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.DEVICE_STAGE_B_AXISZ_ERROR))
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.DEVICE_STAGE_B_AXISZ_ERROR)}");
Thread.Sleep(NODE_SLEEP);
return SequenceAction.Ok();
}
private static SequenceActionResult CheckAlarmLaser(SequenceContext context, string id, SequenceActionResult param)
{
_laserCore = _laser.getCore() as LaserTruFiber;
if (_laserCore.GetEStopOpen()) {
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.DEVICE_IO_LASER_EMO))
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.DEVICE_IO_LASER_EMO)}");
}
if (_laserCore.GetFaultLaser()) {
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.DEVICE_LASER_ERROR_MSG)) {
string alarmCode = $"{Convert.ToString(_laserCore.GetLastMessageCompID(), 16).ToUpper().PadLeft(2, '0')}{Convert.ToString(_laserCore.GetLastMessageCompNum(), 16).ToUpper().PadLeft(2, '0')} {Convert.ToString(_laserCore.GetLastMessageMsgCode(), 16).ToUpper().PadLeft(2, '0')}";
string alarmDescription = $" {_laserCore.GetLastMessageShortText()}";
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.DEVICE_LASER_ERROR_MSG)} >> code desc {alarmCode + alarmDescription}");
}
} else if (_laserCore.GetMonitoring()) {
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.DEVICE_LASER_WARNING_MSG)) {
string alarmCode = $"{Convert.ToString(_laserCore.GetLastMessageCompID(), 16).ToUpper().PadLeft(2, '0')}{Convert.ToString(_laserCore.GetLastMessageCompNum(), 16).ToUpper().PadLeft(2, '0')} {Convert.ToString(_laserCore.GetLastMessageMsgCode(), 16).ToUpper().PadLeft(2, '0')}";
string alarmDescription = $" {_laserCore.GetLastMessageShortText()}";
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.DEVICE_LASER_WARNING_MSG)} >> code desc {alarmCode + alarmDescription}");
}
}
Thread.Sleep(NODE_SLEEP);
return SequenceAction.Ok();
}
private static SequenceActionResult CheckAlarmIO(SequenceContext context, string id, SequenceActionResult param)
{
if(!_io.ReadDiBit(PrismaticGunACSIO.InputIO.MAIN_CHILLER_Leak_Sensor))
if (!AlarmManager.IsOccuredAlarm(AlarmCode_PrismaticGun.CHILLER_LEAK_ALARM))
Log.E($"{context.AlarmAccured(AlarmCode_PrismaticGun.CHILLER_LEAK_ALARM)}");
Thread.Sleep(NODE_SLEEP);
return SequenceAction.Ok();
}
private static void OnStopped(SequenceContext context)
{
}
private static void OnForceError(SequenceContext context, string arg2)
{
}
}
}