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

342 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 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;
}
}
}