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

115 lines
4.1 KiB
C#

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)
{
}
}
}