using Aurora.Api; using Hermes; using ILSOS_PrismaticGun.Device; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using static ILSOS_PrismaticGun.Device.PLCControllerPrismaticGun; namespace ILSOS_PrismaticGun.Sequences.SubSequence.PLCInterface { public class SeqAutoStart { static readonly Logger Log = new Logger("SeqAutoStart"); const string SEQ_ENTER = "SEQ_ENTER"; const string SEQ_CHECK_INIT_CONDITION = "Check Init Condition"; const string SEQ_CHECK_AUTO_REQUEST = "Check PLC Auto Request"; const string SEQ_AUTO_REQUEST_ACK = "PLC Auto Request Ack"; const string SEQ_COMPLETE = "Complete"; const int PLC_TIMEOUT = 60 * 1000; // sec, Timeout은 시퀀스 정지가 아니라 타임아웃 시간마다 로그만 남기도록 한다 const int NODE_SLEEP = 100; private static eBitInput _request; private static eBitOutput _requestAck; private static PLCControllerPrismaticGun _PLC; public static SequenceBuilder Builder() { var sb = new SequenceBuilder(1000, true); sb.AddAction(SEQ_ENTER, SequenceEnter); sb.AddAction(SEQ_CHECK_INIT_CONDITION, CheckInitCondition); //분기 sb.AddAction(SEQ_CHECK_AUTO_REQUEST, CheckAutoRequest); sb.AddAction(SEQ_AUTO_REQUEST_ACK, AutoRequestAck); sb.AddAction(SEQ_COMPLETE, Complete); sb.Flows(sb.Init > sb[SEQ_ENTER] > sb[SEQ_CHECK_INIT_CONDITION] > sb[SEQ_CHECK_AUTO_REQUEST] > sb[SEQ_AUTO_REQUEST_ACK] > sb[SEQ_COMPLETE] > sb.Final); sb.OnStopped(OnStopped); sb.OnForceError(OnForceError); //sb.Draw("SeqAutoStart.pdf"); return sb; } private static SequenceActionResult SequenceEnter(SequenceContext context, string id, SequenceActionResult param) { var recv = ((eBitInput input, eBitOutput output))param.Param; _request = recv.input; _requestAck = recv.output; if (_PLC is null) _PLC = context.Devices[DeviceIds.PLCDevice] as PLCControllerPrismaticGun; return SequenceAction.Ok(); } private static SequenceActionResult CheckInitCondition(SequenceContext context, string id, SequenceActionResult param) { if (!_PLC.IsActivated) return null; return SequenceAction.Ok(); } private static SequenceActionResult CheckAutoRequest(SequenceContext context, string id, SequenceActionResult param) { var res = context.RetryUntilSuccess(() => _PLC.ReadBit(_request).data, PLC_TIMEOUT, interval: 100, true); if (res == E2.TIMEOUT) { Log.FuncE($"Check PLC AutoRequest Timeout"); return null; } return SequenceAction.Ok(); } private static SequenceActionResult AutoRequestAck(SequenceContext context, string id, SequenceActionResult param) { var res = context.RetryUntilSuccess(() => _PLC.ReadBit(_request).data, PLC_TIMEOUT, interval: 100, true); if (res == E2.TIMEOUT) { Log.FuncE($"Check PLC AutoRequest Timeout"); return null; } _PLC.WriteBit(_requestAck, true); res = context.RetryUntilSuccess(() => _PLC.ReadBit(_request).data, PLC_TIMEOUT, interval: 100, false); if (res == E2.TIMEOUT) { Log.FuncE($"Check PLC AutoRequest Timeout"); return null; } _PLC.WriteBit(_requestAck, false); return SequenceAction.Ok(); } private static SequenceActionResult Complete(SequenceContext context, string id, SequenceActionResult param) { return SequenceAction.Ok(true); } private static void OnStopped(SequenceContext context) { } private static void OnForceError(SequenceContext context, string arg2) { } } }