Sic.Framework/MECF.Framework.RT.Equipment.../Devices/IoGasConnector.cs

291 lines
10 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 GasConnectorState
{
Tighten = 0,
Loosen = 1,
Unknown = 2,
Error = 3,
}
public class AITGasConnectorOperation
{
public const string GasConnectorLoosen = "Loosen";
public const string GasConnectorTighten = "Tighten";
}
public partial class IoGasConnector : BaseDevice, IDevice
{
public int SetPoint
{
get
{
if (_doGasConnectorLoosen.Value && _doGasConnectorTighten.Value) return (int)GasConnectorState.Error;
if (_doGasConnectorLoosen.Value && !_doGasConnectorTighten.Value) return (int)GasConnectorState.Loosen;
if (!_doGasConnectorLoosen.Value && _doGasConnectorTighten.Value) return (int)GasConnectorState.Tighten;
if (!_doGasConnectorLoosen.Value && !_doGasConnectorTighten.Value) return (int)GasConnectorState.Unknown;
return (int)GasConnectorState.Unknown;
}
}
public int Status
{
get
{
if (_diGasConnectorLoosen.Value && _diGasConnectorTighten.Value) return (int)GasConnectorState.Error;
if (_diGasConnectorLoosen.Value && !_diGasConnectorTighten.Value) return (int)GasConnectorState.Loosen;
if (!_diGasConnectorLoosen.Value && _diGasConnectorTighten.Value) return (int)GasConnectorState.Tighten;
if (!_diGasConnectorLoosen.Value && !_diGasConnectorTighten.Value) return (int)GasConnectorState.Unknown;
return (int)GasConnectorState.Unknown;
}
}
private DIAccessor _diGasConnectorLoosen = null;
private DIAccessor _diGasConnectorTighten = null;
private DOAccessor _doGasConnectorLoosen = null;
private DOAccessor _doGasConnectorTighten = null;
private GasConnectorState _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 GasConnectorLoosenFeedback
{
get
{
if (_diGasConnectorLoosen != null)
return _diGasConnectorLoosen.Value;
return false;
}
}
public bool GasConnectorTightenFeedback
{
get
{
if (_diGasConnectorTighten != null)
return _diGasConnectorTighten.Value;
return false;
}
}
#endregion
#region DO
public bool GasConnectorLoosenSetpoint
{
get
{
if (_doGasConnectorLoosen != null)
return _doGasConnectorLoosen.Value;
return false;
}
}
public bool GasConnectorTightenSetpoint
{
get
{
if (_doGasConnectorTighten != null)
return _doGasConnectorTighten.Value;
return false;
}
}
#endregion
public AITDeviceData DeviceData
{
get
{
AITDeviceData data = new AITDeviceData()
{
Module = Module,
DeviceName = Name,
DisplayName = Display,
DeviceSchematicId = DeviceID,
UniqueName = UniqueName,
};
data.AttrValue["GasConnectorLoosen"] = _diGasConnectorLoosen.Value;
data.AttrValue["GasConnectorTighten"] = _diGasConnectorTighten.Value;
data.AttrValue["GasConnectorLoosen"] = _doGasConnectorLoosen.Value;
data.AttrValue["GasConnectorTighten"] = _doGasConnectorTighten.Value;
//data.AttrValue["PV"] = _aiFeedBack.Value;
return data;
}
}
public IoGasConnector(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");
_diGasConnectorLoosen = ParseDiNode("diGasConnectorLoosen", node, ioModule);
_diGasConnectorTighten = ParseDiNode("diGasConnectorTighten", node, ioModule);
_doGasConnectorLoosen = ParseDoNode("doGasConnectorLoosen", node, ioModule);
_doGasConnectorTighten = ParseDoNode("doGasConnectorTighten", node, ioModule);
}
public bool Initialize()
{
DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
DATA.Subscribe($"{Module}.{Name}.GasConnectorLoosenSetpoint", () => GasConnectorLoosenSetpoint);
DATA.Subscribe($"{Module}.{Name}.GasConnectorTightenSetpoint", () => GasConnectorTightenSetpoint);
DATA.Subscribe($"{Module}.{Name}.GasConnectorLoosenFeedback", () => GasConnectorLoosenFeedback);
DATA.Subscribe($"{Module}.{Name}.GasConnectorTightenFeedback", () => GasConnectorTightenFeedback);
OP.Subscribe($"{Module}.{Name}.SetGasConnectorLoosen", (function, args) =>
{
SetGasConnector(false, out string reason);
return true;
});
OP.Subscribe($"{Module}.{Name}.SetGasConnectorTighten", (function, args) =>
{
SetGasConnector(true,out string reason);
return true;
});
DEVICE.Register(String.Format("{0}.{1}", Name, AITGasConnectorOperation.GasConnectorLoosen), (out string reason, int time, object[] param) =>
{
bool ret = SetGasConnector(false, out reason);
if (ret)
{
reason = string.Format("Open Lid {0}", Name);
return true;
}
return false;
});
DEVICE.Register(String.Format("{0}.{1}", Name, AITGasConnectorOperation.GasConnectorTighten), (out string reason, int time, object[] param) =>
{
bool ret = SetGasConnector(true, out reason);
if (ret)
{
reason = string.Format("Close Lid {0}", Name);
return true;
}
return false;
});
return false;
}
string reason = string.Empty;
public bool SetGasConnector(bool isTigen, out string reason)
{
if ((Status == (int)GasConnectorState.Loosen && !isTigen) || (Status == (int)GasConnectorState.Tighten && isTigen))
{
reason = "";
return true;
}
if (!_doGasConnectorLoosen.Check(!isTigen, out reason))
{
EV.PostMessage(Module, EventEnum.DefaultWarning, reason);
return false;
}
if (!_doGasConnectorTighten.Check(isTigen, out reason))
{
EV.PostMessage(Module, EventEnum.DefaultWarning, reason);
return false;
}
if (!_doGasConnectorLoosen.SetValue(!isTigen, out reason))
return false;
if (!_doGasConnectorTighten.SetValue(isTigen, out reason))
return false;
_operation = isTigen ? GasConnectorState.Tighten: GasConnectorState.Loosen;
_timer.Start(1000 * 5);
return true;
}
public void Monitor()
{
try
{
_trigTimer.CLK = _timer.IsIdle();
if (_trigTimer.Q)
{
_doGasConnectorTighten.Value = false;
_doGasConnectorLoosen.Value = false;
}
if (_timer.IsTimeout())
{
_timer.Stop();
if (Status != (int)_operation)
{
if (_operation == GasConnectorState.Loosen)
{
string reason;
if (!_doGasConnectorLoosen.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 (!_doGasConnectorLoosen.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 = (GasConnectorState)SetPoint;
}
}
else if (_timer.IsIdle())
{
}
}
catch (Exception ex)
{
LOG.Write(ex);
}
}
public void Reset()
{
_trigReset.RST = true;
_trigError.RST = true;
_trigTimer.RST = true;
}
public void Terminate()
{
_doGasConnectorTighten.Value = false;
_doGasConnectorLoosen.Value = false;
}
}
}