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