123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- using System;
- using System.Xml;
- using Aitex.Core.Common.DeviceData;
- using Aitex.Core.RT.DataCenter;
- using Aitex.Core.RT.Device;
- using Aitex.Core.RT.Event;
- using Aitex.Core.RT.IOCore;
- using Aitex.Core.RT.Log;
- using Aitex.Core.RT.OperationCenter;
- using Aitex.Core.Util;
- namespace Aitex.Core.RT.Device.Unit
- {
- public class IoLid : BaseDevice, IDevice
- {
- private DIAccessor _diOFF;
- private DOAccessor _doON;
- private DOAccessor _doOFF;
- private CylinderState _operation;
- private DeviceTimer _timer = new DeviceTimer();
- private R_TRIG _trigReset = new R_TRIG();
- private R_TRIG _trigError = new R_TRIG();
- public int SetPoint
- {
- get
- {
- return (int)CylinderState.Unknown;
- /*
- if (_doON.Value && _doOFF.Value) return (int)CylinderState.Error;
- if (_doON.Value && !_doOFF.Value) return (int)CylinderState.Open;
- if (!_doON.Value && _doOFF.Value) return (int)CylinderState.Close;
- if (!_doON.Value && !_doOFF.Value) return (int)CylinderState.Unknown;
- */
- }
- }
- public CylinderState State
- {
- get
- {
- return _diOFF.Value ? CylinderState.Close : CylinderState.Open;
- }
- }
- public bool OFFFeedback
- {
- get { return _diOFF.Value; }
- }
- public bool ONSetPoint
- {
- get
- {
- return _doON.Value;
- }
- set
- {
- if (_doON != null && _doON.Check(value, out _))
- _doON.Value = value;
- }
- }
- public bool OFFSetPoint
- {
- get
- {
- return _doOFF.Value;
- }
- set
- {
- if (_doOFF != null && _doOFF.Check(value, out _))
- _doOFF.Value = value;
- }
- }
- private AITCylinderData DeviceData
- {
- get
- {
- AITCylinderData deviceData = new AITCylinderData
- {
- Module = Module,
- DeviceName = Name,
- DeviceSchematicId = DeviceID,
- DisplayName = Display,
- CloseFeedback = OFFFeedback,
- //OpenSetPoint = ONSetPoint,
- //CloseSetPoint = OFFSetPoint
- };
- return deviceData;
- }
- }
- public IoLid(string module, XmlElement node, string ioModule = "")
- {
- base.Module = module;
- base.Name = node.GetAttribute("id");
- base.Display = node.GetAttribute("display");
- base.DeviceID = node.GetAttribute("schematicId");
- _diOFF = ParseDiNode("diOFF", node, ioModule);
- _doON = ParseDoNode("doON", node, ioModule);
- _doOFF = ParseDoNode("doOFF", node, ioModule);
- }
- public bool Initialize()
- {
- DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
- OP.Subscribe($"{Module}.{Name}.{AITCylinderOperation.Open}", InvokeOpenCylinder);
- OP.Subscribe($"{Module}.{Name}.{AITCylinderOperation.Close}", InvokeCloseCylinder);
- DEVICE.Register($"{Module}.{Name}.{AITCylinderOperation.Open}", (out string reason, int time, object[] param) =>
- {
- bool ret = SetCylinder(true, out reason);
- if (ret)
- {
- reason = $"Open Cylinder {Name}";
- return true;
- }
- return false;
- });
- DEVICE.Register($"{Module}.{Name}.{AITCylinderOperation.Close}", (out string reason, int time, object[] param) =>
- {
- bool ret = SetCylinder(false, out reason);
- if (ret)
- {
- reason = $"Close Cylinder {Name}";
- return true;
- }
- return false;
- });
- return true;
- }
- private bool InvokeOpenCylinder(string arg1, object[] arg2)
- {
- if (!SetCylinder(true, out var reason))
- {
- EV.PostWarningLog(Module, $"Can not open cylinder {Module}.{Name}, {reason}");
- return false;
- }
- EV.PostInfoLog(Module, $"Open cylinder {Module}.{Name}");
- return true;
- }
- private bool InvokeCloseCylinder(string arg1, object[] arg2)
- {
- if (!SetCylinder(false, out var reason))
- {
- EV.PostWarningLog(Module, $"Can not close cylinder {Module}.{Name}, {reason}");
- return false;
- }
- EV.PostInfoLog(Module, $"Close cylinder {Module}.{Name}");
- return true;
- }
- public void Terminate()
- {
- OFFSetPoint = false;
- ONSetPoint = false;
- }
- public bool SetCylinder(bool isOpen, out string reason)
- {
- reason = "";
- ONSetPoint = isOpen;
- OFFSetPoint = !isOpen;
- _operation = isOpen ? CylinderState.Open : CylinderState.Close;
- _timer.Start(1000 * 60 * 3);
- return true;
- }
- public void Monitor()
- {
- try
- {
- if (_timer.IsTimeout())
- {
- _timer.Stop();
- if (State != _operation)
- {
- if (_operation == CylinderState.Open)
- {
- if (!_doON.Check(true, out var reason))
- EV.PostAlarmLog(Module, "Open Cylinder Failed for interlock, " + reason);
- else
- EV.PostAlarmLog(Module, "Cylinder hold close status");
- }
- else
- {
- if (!_doON.Check(false, out var reason))
- EV.PostAlarmLog(Module, "Close Cylinder Failed for interlock, " + reason);
- else
- EV.PostAlarmLog(Module, "Cylinder hold open status");
- }
- }
- _operation = (CylinderState)SetPoint;
- }
- else if (_timer.IsIdle())
- {
- return;
- /*
- _trigReset.CLK = SetPoint != (int)_operation; // fire event only check at first, SetPoint set by interlock
- if (_trigReset.Q)
- {
- if (_operation == CylinderState.Open)
- {
- string reason;
- if (!_doON.Check(true, out reason))
- EV.PostMessage(Module, EventEnum.SwInterlock, Module,
- $"Cylinder {Display} was {"Close"},Reason:{reason}");
- else
- EV.PostMessage(Module, EventEnum.SwInterlock, Module,
- $"Cylinder {Display} was {"Close"},Reason {"PLC kept"}");
- }
- else
- {
- string reason;
- if (!_doON.Check(false, out reason))
- EV.PostMessage(Module, EventEnum.SwInterlock, Module,
- $"Cylinder {Display} was {"Open"},Reason:{reason}");
- else
- EV.PostMessage(Module, EventEnum.SwInterlock, Module,
- $"Cylinder {Display} was {"Open"},Reason {"PLC Kept"}");
- }
- _operation = (CylinderState)SetPoint;
- }
- */
- }
- _trigError.CLK = State == CylinderState.Error;
- if (_trigError.Q)
- {
- EV.PostAlarmLog(Module, "Cylinder in error status");
- }
- if ((SetPoint == (int)State) && (SetPoint == (int)CylinderState.Open || SetPoint == (int)CylinderState.Close))
- {
- OFFSetPoint = false;
- ONSetPoint = false;
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- }
- }
- public void Reset()
- {
- _trigReset.RST = true;
- _trigError.RST = true;
- }
- }
- }
|