115 lines
4.1 KiB
C#
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)
|
|
{
|
|
}
|
|
}
|
|
}
|