Sic.Framework-Nanjing-Baishi/MECF.Framework.RT.Equipment.../Devices/IoLidSwing.cs

332 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.RT.SCCore;
using Aitex.Core.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace Aitex.Core.RT.Device.Devices
{
public enum LidSwingState
{
Lock = 0,
UnLock = 1,
Unknown = 2,
Error = 3,
}
public class LidSwingOperation
{
public const string LidSwingLock = "Lock";
public const string LidSwingUnLock = "Unlock";
}
public partial class IoLidSwing : BaseDevice, IDevice
{
public int SetPoint
{
get
{
if (_doLidLockSetpoint.Value && _doLidUnlockSetpoint.Value) return (int)LidSwingState.Error;
if (_doLidLockSetpoint.Value && !_doLidUnlockSetpoint.Value) return (int)LidSwingState.Lock;
if (!_doLidLockSetpoint.Value && _doLidUnlockSetpoint.Value) return (int)LidSwingState.UnLock;
if (!_doLidLockSetpoint.Value && !_doLidUnlockSetpoint.Value) return (int)LidSwingState.Unknown;
return (int)LidSwingState.Unknown;
}
}
public int Status
{
get
{
if (_diLidLockFaceback.Value && _diLidUnlockFaceback.Value) return (int)LidSwingState.Error;
if (_diLidLockFaceback.Value && !_diLidUnlockFaceback.Value) return (int)LidSwingState.Lock;
if (!_diLidLockFaceback.Value && _diLidUnlockFaceback.Value) return (int)LidSwingState.UnLock;
if (!_diLidLockFaceback.Value && !_diLidUnlockFaceback.Value) return (int)LidSwingState.Unknown;
return (int)LidSwingState.Unknown;
}
}
private DIAccessor _diLidLockFaceback = null;
private DIAccessor _diLidUnlockFaceback = null;
private DOAccessor _doLidLockSetpoint = null;
private DOAccessor _doLidUnlockSetpoint = null;
private SCConfigItem _scTimeout;
private LidSwingState _operation;
private DeviceTimer _timer = new DeviceTimer();
private R_TRIG _trigReset = new R_TRIG();
private R_TRIG _trigError = new R_TRIG();
private R_TRIG _trigTimer = new R_TRIG();
#region DI
public bool LidLockFaceback
{
get
{
if (_diLidLockFaceback != null)
return _diLidLockFaceback.Value;
return false;
}
}
public bool LidUnlockFaceback
{
get
{
if (_diLidUnlockFaceback != null)
return _diLidUnlockFaceback.Value;
return false;
}
}
#endregion
#region DO
public bool LidLockSetpoint
{
get
{
if (_doLidLockSetpoint != null)
return _doLidLockSetpoint.Value;
return false;
}
}
public bool LidUnlockSetpoint
{
get
{
if (_doLidUnlockSetpoint != null)
return _doLidUnlockSetpoint.Value;
return false;
}
}
#endregion
public AITDeviceData DeviceData
{
get
{
AITDeviceData data = new AITDeviceData()
{
Module = Module,
DeviceName = Name,
DisplayName = Display,
DeviceSchematicId = DeviceID,
UniqueName = UniqueName,
};
data.AttrValue["LidLockFaceback"] = _diLidLockFaceback.Value;
data.AttrValue["LidUnlockFaceback"] = _diLidUnlockFaceback.Value;
data.AttrValue["LidLockSetpoint"] = _doLidLockSetpoint.Value;
data.AttrValue["LidUnlockSetpoint"] = _doLidUnlockSetpoint.Value;
//data.AttrValue["PV"] = _aiFeedBack.Value;
return data;
}
}
public IoLidSwing(string module, XmlElement node, string ioModule = "")
{
var attrModule = node.GetAttribute("module");
base.Module = string.IsNullOrEmpty(attrModule) ? module : attrModule;
base.Name = node.GetAttribute("id");
base.Display = node.GetAttribute("display");
base.DeviceID = node.GetAttribute("schematicId");
_diLidLockFaceback = ParseDiNode("diLidLockFaceback", node, ioModule);
_diLidUnlockFaceback = ParseDiNode("diLidUnlockFaceback", node, ioModule);
_doLidLockSetpoint = ParseDoNode("doLidLockSetpoint", node, ioModule);
_doLidUnlockSetpoint = ParseDoNode("doLidUnlockSetpoint", node, ioModule);
_scTimeout = ParseScNode("LidTimeout", node, "PM", "PM.LidMotionTimeout");
}
public bool Initialize()
{
DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
DATA.Subscribe($"{Module}.{Name}.LidLockFaceback", () => LidLockFaceback);
DATA.Subscribe($"{Module}.{Name}.LidUnlockFaceback", () => LidUnlockFaceback);
DATA.Subscribe($"{Module}.{Name}.LidLockSetpoint", () => LidLockSetpoint);
DATA.Subscribe($"{Module}.{Name}.LidUnlockSetpoint", () => LidUnlockSetpoint);
OP.Subscribe($"{Module}.{Name}.SetLidLockSetpoint", (function, args) =>
{
SetLidSwing(true, out string reason);
return true;
});
OP.Subscribe($"{Module}.{Name}.SetLidUnlockSetpoint", (function, args) =>
{
SetLidSwing(false, out string reason);
return true;
});
DEVICE.Register(String.Format("{0}.{1}", Name, LidSwingOperation.LidSwingLock), (out string reason, int time, object[] param) =>
{
bool ret = SetLidSwing(true, out reason);
if (ret)
{
reason = string.Format("{0} is Lock", Name);
return true;
}
return false;
});
DEVICE.Register(String.Format("{0}.{1}", Name, LidSwingOperation.LidSwingUnLock), (out string reason, int time, object[] param) =>
{
bool ret = SetLidSwing(false, out reason);
if (ret)
{
reason = string.Format("{0} is Unlock", Name);
return true;
}
return false;
});
return false;
}
string reason = string.Empty;
//public bool SetLidLockSetpoint(bool falg)
//{
// if (_doLidLockSetpoint.SetValue(falg, out reason))
// {
// return true;
// }
// return false;
//}
//public bool SetLidUnlockSetpoint(bool falg)
//{
// if (_doLidUnlockSetpoint.SetValue(falg, out reason))
// {
// return true;
// }
// return false;
//}
public bool SetLidSwing(bool isLock, out string reason)
{
if (isLock && Status == (int)LidSwingState.Lock)
{
_doLidUnlockSetpoint.SetValue(!isLock, out reason);
reason = "";
return true;
}
if (!isLock && Status == (int)LidSwingState.UnLock)
{
_doLidLockSetpoint.SetValue(isLock, out reason);
reason = "";
return true;
}
if (!_doLidLockSetpoint.Check(isLock, out reason))
{
EV.PostMessage(Module, EventEnum.DefaultWarning, reason);
return false;
}
if (!_doLidUnlockSetpoint.Check(!isLock, out reason))
{
EV.PostMessage(Module, EventEnum.DefaultWarning, reason);
return false;
}
if (!_doLidLockSetpoint.SetValue(isLock, out reason))
return false;
if (!_doLidUnlockSetpoint.SetValue(!isLock, out reason))
return false;
_operation = isLock ? LidSwingState.Lock : LidSwingState.UnLock;
_timer.Start(1000 * _scTimeout.IntValue);
return true;
}
public void Monitor()
{
try
{
_trigTimer.CLK = _timer.IsIdle();
if (_trigTimer.Q)
{
_doLidLockSetpoint.Value = false;
_doLidUnlockSetpoint.Value = false;
}
if (_timer.IsTimeout())
{
_timer.Stop();
//_trigReset.CLK = Status != (int)_operation; // fire event only check at first, SetPoint set by interlock
//if (_trigReset.Q)
if (Status != (int)_operation)
{
if (_operation == LidSwingState.Lock)
{
string reason;
if (!_doLidLockSetpoint.Check(true, out reason))
EV.PostMessage(Module, EventEnum.SwInterlock, Module, string.Format("Lid {0} was {1}Reason{2}", Display, "UnLock", reason));
else
EV.PostMessage(Module, EventEnum.SwInterlock, Module, string.Format("Lid {0} was {1}Reason {2}", Display, "UnLock", "PLC kept"));
}
else
{
string reason;
if (!_doLidLockSetpoint.Check(false, out reason))
EV.PostMessage(Module, EventEnum.SwInterlock, Module, string.Format("Lid {0} was {1}Reason{2}", Display, "Lock", reason));
else
EV.PostMessage(Module, EventEnum.SwInterlock, Module, string.Format("Lid {0} was {1}Reason {2}", Display, "Lock", "PLC Kept"));
}
_operation = (LidSwingState)SetPoint;
}
}
else if (_timer.IsIdle())
{
}
//_trigError.CLK = Status == (int)GasConnectorState.Error;
//if (_trigError.Q)
//{
// EV.PostMessage(Module, EventEnum.DefaultWarning, "LidSwing in error status,lock and unlock are both Off");
//}
//if (SetPoint == Status)// && (SetPoint == (int)LidSwingState.Lock || SetPoint == (int)LidSwingState.UnLock))
//{
// _timer.Stop();
// //_doLidUnlockSetpoint.Value = false;
// //_doLidLockSetpoint.Value = false;
//}
}
catch (Exception ex)
{
LOG.Write(ex);
}
}
public void Reset()
{
_trigReset.RST = true;
_trigError.RST = true;
_trigTimer.RST = true;
}
public void Terminate()
{
_doLidUnlockSetpoint.Value = false;
_doLidLockSetpoint.Value = false;
}
}
}