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

342 lines
12 KiB
C#
Raw Normal View History

2023-04-13 11:51:03 +08:00
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 LidState
{
Tighten = 0,
Loosen = 1,
Unknown = 2,
Closed=3,
Error = 4,
}
public class AITLidOperation
{
public const string LidLoosen = "Loosen";
public const string LidTighten = "Tighten";
}
public partial class IoLid : BaseDevice, IDevice
{
public int SetPoint
{
get
{
if (_doLoosenSetpoint.Value && _doTightenSetpoint.Value) return (int)LidState.Error;
if (_doLoosenSetpoint.Value && !_doTightenSetpoint.Value) return (int)LidState.Loosen;
if (!_doLoosenSetpoint.Value && _doTightenSetpoint.Value) return (int)LidState.Tighten;
if (!_doLoosenSetpoint.Value && !_doTightenSetpoint.Value) return (int)LidState.Unknown;
return (int)LidState.Unknown;
}
}
public int Status
{
get
{
if (_diLoosenFaceback.Value &&( _diTightenFaceback.Value|| _diClosedFaceback.Value))
return (int)LidState.Error;
if (_diLoosenFaceback.Value && !_diTightenFaceback.Value )
return (int)LidState.Loosen;
if (!_diLoosenFaceback.Value && _diTightenFaceback.Value )
return (int)LidState.Tighten;
if (!_diLoosenFaceback.Value && !_diTightenFaceback.Value)
return (int)LidState.Unknown;
return (int)LidState.Unknown;
}
}
private DIAccessor _diLoosenFaceback = null;
private DIAccessor _diTightenFaceback = null;
private DIAccessor _diClosedFaceback = null;
private DOAccessor _doLoosenSetpoint = null;
private DOAccessor _doTightenSetpoint = null;
private LidState _operation;
private SCConfigItem _scTimeout;
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 LoosenFaceback
{
get
{
if (_diLoosenFaceback != null )
return _diLoosenFaceback.Value;
return false;
}
}
public bool TightenFaceback
{
get
{
if (_diTightenFaceback != null)
return _diTightenFaceback.Value ;
return false;
}
}
public bool ClosedFaceback
{
get
{
if (_diClosedFaceback != null)
return _diClosedFaceback.Value;
return false;
}
}
#endregion
#region DO
public bool LoosenSetpoint
{
get
{
if (_doLoosenSetpoint != null)
return _doLoosenSetpoint.Value;
return false;
}
}
public bool TightenSetpoint
{
get
{
if (_doTightenSetpoint != null)
return _doTightenSetpoint.Value;
return false;
}
}
#endregion
public AITDeviceData DeviceData
{
get
{
AITDeviceData data = new AITDeviceData()
{
Module = Module,
DeviceName = Name,
DisplayName = Display,
DeviceSchematicId = DeviceID,
UniqueName = UniqueName,
};
//data.AttrValue["Status"] = Status;
data.AttrValue["LoosenFaceback"] = _diLoosenFaceback.Value;
data.AttrValue["TightenFaceback"] = _diTightenFaceback.Value;
data.AttrValue["ClosedFaceback"] = _diClosedFaceback.Value;
data.AttrValue["LoosenSetpoint"] = _doLoosenSetpoint.Value;
data.AttrValue["TightenSetpoint"] = _doTightenSetpoint.Value;
return data;
}
}
public IoLid(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");
_diLoosenFaceback = ParseDiNode("diLoosenFaceback", node, ioModule);
_diTightenFaceback = ParseDiNode("diTightenFaceback", node, ioModule);
_diClosedFaceback = ParseDiNode("diClosedFaceback", node, ioModule);
_doLoosenSetpoint = ParseDoNode("doLoosenSetpoint", node, ioModule);
_doTightenSetpoint = ParseDoNode("doTightenSetpoint", node, ioModule);
_scTimeout= ParseScNode("LidTimeout", node, "PM", "PM.LidMotionTimeout");
}
public bool Initialize()
{
DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
DATA.Subscribe($"{Module}.{Name}.Status", () =>((LidState)Status).ToString());
DATA.Subscribe($"{Module}.{Name}.LoosenFaceback", () => LoosenFaceback);
DATA.Subscribe($"{Module}.{Name}.TightenFaceback", () => TightenFaceback);
DATA.Subscribe($"{Module}.{Name}.ClosedFaceback", () => ClosedFaceback);
DATA.Subscribe($"{Module}.{Name}.LoosenSetpoint", () => LoosenSetpoint);
DATA.Subscribe($"{Module}.{Name}.TightenSetpoint", () => LoosenSetpoint);
OP.Subscribe($"{Module}.{Name}.Loosen", (function, args) =>
{
bool ret = SetLid(true, out reason);
if (ret)
{
reason = string.Format("Open Lid {0}", Name);
return true;
}
return true;
});
OP.Subscribe($"{Module}.{Name}.Tighten", (function, args) =>
{
bool ret = SetLid(false, out reason);
if (ret)
{
reason = string.Format("Close Lid {0}", Name);
return true;
}
return true;
});
DEVICE.Register(String.Format("{0}.{1}", Name, AITLidOperation.LidLoosen), (out string reason, int time, object[] param) =>
{
bool ret = SetLid(true, out reason);
if (ret)
{
reason = string.Format("Open Lid {0}", Name);
return true;
}
return false;
});
DEVICE.Register(String.Format("{0}.{1}", Name, AITLidOperation.LidTighten), (out string reason, int time, object[] param) =>
{
bool ret = SetLid(false, out reason);
if (ret)
{
reason = string.Format("Close Lid {0}", Name);
return true;
}
return false;
});
return false;
}
string reason = string.Empty;
public bool SetLid(bool isLoosen, out string reason)
{
if ((isLoosen && Status== (int)LidState.Loosen))
{
_doTightenSetpoint.SetValue(!isLoosen, out reason);
reason = "";
return true;
}
if ((!isLoosen && Status == (int)LidState.Tighten))
{
_doLoosenSetpoint.SetValue(isLoosen, out reason);
reason = "";
return true;
}
if (!_doLoosenSetpoint.Check(isLoosen, out reason))
{
EV.PostMessage(Module, EventEnum.DefaultWarning, reason);
return false;
}
if (!_doTightenSetpoint.Check(!isLoosen, out reason))
{
EV.PostMessage(Module, EventEnum.DefaultWarning, reason);
return false;
}
if (!_doLoosenSetpoint.SetValue(isLoosen, out reason))
return false;
if (!_doTightenSetpoint.SetValue(!isLoosen, out reason))
return false;
_operation = isLoosen ? LidState.Loosen : LidState.Tighten;
_timer.Start(1000 * _scTimeout.IntValue);
return true;
}
public void Monitor()
{
try
{
_trigTimer.CLK = _timer.IsIdle();
if (_trigTimer.Q)
{
_doLoosenSetpoint.Value = false;
_doTightenSetpoint.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 == LidState.Loosen)
{
string reason;
if (!_doLoosenSetpoint.Check(true, out reason))
EV.PostMessage(Module, EventEnum.SwInterlock, Module, string.Format("Lid {0} was {1}Reason{2}", Display, "Close", reason));
else
EV.PostMessage(Module, EventEnum.SwInterlock, Module, string.Format("Lid {0} was {1}Reason {2}", Display, "Close", "PLC kept"));
}
else
{
string reason;
if (!_doLoosenSetpoint.Check(false, out reason))
EV.PostMessage(Module, EventEnum.SwInterlock, Module, string.Format("Lid {0} was {1}Reason{2}", Display, "Open", reason));
else
EV.PostMessage(Module, EventEnum.SwInterlock, Module, string.Format("Lid {0} was {1}Reason {2}", Display, "Open", "PLC Kept"));
}
_operation = (LidState)SetPoint;
}
}
else if (_timer.IsIdle())
{
}
//_trigError.CLK = Status == (int)LidState.Error;
//if (_trigError.Q)
//{
// EV.PostMessage(Module, EventEnum.DefaultWarning, "Lid in error status,loosen and tighten are both Off");
//}
}
catch (Exception ex)
{
LOG.Write(ex);
}
}
public void Reset()
{
_trigReset.RST = true;
_trigError.RST = true;
_trigTimer.RST = true;
}
public void Terminate()
{
_doLoosenSetpoint.Value = false;
_doTightenSetpoint.Value = false;
}
}
}