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

291 lines
10 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 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;
}
}
}