315 lines
10 KiB
C#
315 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 Aitex.Sorter.Common;
|
|||
|
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 BottomSectionStateEnum
|
|||
|
{
|
|||
|
Unknown,
|
|||
|
Up,
|
|||
|
Down,
|
|||
|
Error,
|
|||
|
}
|
|||
|
public partial class IoBottomSection : BaseDevice, IDevice
|
|||
|
{
|
|||
|
//public BottomSectionStateEnum State
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// if (_diUpFaceback.Value && _diDownFaceback.Value)
|
|||
|
// return BottomSectionStateEnum.Error;
|
|||
|
// if (_diUpFaceback.Value && !_diDownFaceback.Value)
|
|||
|
// return BottomSectionStateEnum.Up;
|
|||
|
// if (!_diUpFaceback.Value && _diDownFaceback.Value)
|
|||
|
// return BottomSectionStateEnum.Down;
|
|||
|
// return BottomSectionStateEnum.Unknown;
|
|||
|
// }
|
|||
|
//}
|
|||
|
enum DeviceState
|
|||
|
{
|
|||
|
Idle,
|
|||
|
MovingUp,
|
|||
|
MovingDown,
|
|||
|
Error,
|
|||
|
}
|
|||
|
//private DIAccessor _diUpFaceback = null;
|
|||
|
//private DIAccessor _diDownFaceback = null;
|
|||
|
//private DOAccessor _doUpSetpoint = null;
|
|||
|
//private DOAccessor _doDownSetpoint = null;
|
|||
|
|
|||
|
private DeviceState _state = DeviceState.Idle;
|
|||
|
private DeviceTimer _timer = new DeviceTimer();
|
|||
|
|
|||
|
private SCConfigItem _scTimeout;
|
|||
|
|
|||
|
//public bool IsUp { get { return !_diDownFaceback.Value && _diUpFaceback.Value; } }
|
|||
|
//public bool IsDown { get { return _diDownFaceback.Value && !_diUpFaceback.Value; } }
|
|||
|
#region DI
|
|||
|
//public bool UpFaceback
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// if (_diUpFaceback != null)
|
|||
|
// return _diUpFaceback.Value;
|
|||
|
|
|||
|
// return false;
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
//public bool DownFaceback
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// if (_diDownFaceback != null)
|
|||
|
// return _diDownFaceback.Value;
|
|||
|
|
|||
|
// return false;
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region DO
|
|||
|
//public bool UpSetpoint
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// if (_doUpSetpoint != null)
|
|||
|
// return _doUpSetpoint.Value;
|
|||
|
|
|||
|
// return false;
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
//public bool DownSetpoint
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// if (_doDownSetpoint != null)
|
|||
|
// return _doDownSetpoint.Value;
|
|||
|
|
|||
|
// return false;
|
|||
|
// }
|
|||
|
//}
|
|||
|
#endregion
|
|||
|
|
|||
|
//public AITDeviceData DeviceData
|
|||
|
//{
|
|||
|
// get
|
|||
|
// {
|
|||
|
// AITDeviceData data = new AITDeviceData()
|
|||
|
// {
|
|||
|
// Module = Module,
|
|||
|
// DeviceName = Name,
|
|||
|
// DisplayName = Display,
|
|||
|
// DeviceSchematicId = DeviceID,
|
|||
|
// UniqueName = UniqueName,
|
|||
|
|
|||
|
// };
|
|||
|
// data.AttrValue["UpFaceback"] = _diUpFaceback.Value;
|
|||
|
// data.AttrValue["DownFaceback"] = _diDownFaceback.Value;
|
|||
|
// data.AttrValue["UpSetpoint"] = _doUpSetpoint.Value;
|
|||
|
// data.AttrValue["DownSetpoint"] = _doDownSetpoint.Value;
|
|||
|
// //data.AttrValue["PV"] = _aiFeedBack.Value;
|
|||
|
// return data;
|
|||
|
// }
|
|||
|
//}
|
|||
|
public IoBottomSection(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");
|
|||
|
|
|||
|
//_diUpFaceback = ParseDiNode("diUpFaceback", node, ioModule);
|
|||
|
//_diDownFaceback = ParseDiNode("diDownFaceback", node, ioModule);
|
|||
|
|
|||
|
//_doUpSetpoint = ParseDoNode("doUpSetpoint", node, ioModule);
|
|||
|
//_doDownSetpoint = ParseDoNode("doDownSetpoint", node, ioModule);
|
|||
|
|
|||
|
_scTimeout = ParseScNode("ButtomSectionUpTimeout", node, "PM", "PM.Motion.ButtomSectionUpTimeout");
|
|||
|
}
|
|||
|
public bool Initialize()
|
|||
|
{
|
|||
|
//DATA.Subscribe($"{Module}.{Name}.DeviceData", () => DeviceData);
|
|||
|
//DATA.Subscribe($"{Module}.{Name}.Status", () => ((BottomSectionStateEnum)State).ToString());
|
|||
|
//DATA.Subscribe($"{Module}.{Name}.UpFaceback", () => UpFaceback);
|
|||
|
//DATA.Subscribe($"{Module}.{Name}.DownFaceback", () => DownFaceback);
|
|||
|
//DATA.Subscribe($"{Module}.{Name}.UpSetpoint", () => UpSetpoint);
|
|||
|
//DATA.Subscribe($"{Module}.{Name}.DownSetpoint", () => DownSetpoint);
|
|||
|
|
|||
|
OP.Subscribe($"{Module}.{Name}.Up", (function, args) =>
|
|||
|
{
|
|||
|
bool ret = MoveUp(out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("Open Lid {0}", Name);
|
|||
|
return true;
|
|||
|
}
|
|||
|
return true;
|
|||
|
});
|
|||
|
OP.Subscribe($"{Module}.{Name}.Down", (function, args) =>
|
|||
|
{
|
|||
|
bool ret = MoveDown(out reason);
|
|||
|
if (ret)
|
|||
|
{
|
|||
|
reason = string.Format("Close Lid {0}", Name);
|
|||
|
return true;
|
|||
|
}
|
|||
|
return true;
|
|||
|
});
|
|||
|
|
|||
|
OP.Subscribe($"{Module}.{Name}.SetUpSetpoint", (function, args) =>
|
|||
|
{
|
|||
|
MoveUp(out reason);
|
|||
|
return true;
|
|||
|
});
|
|||
|
OP.Subscribe($"{Module}.{Name}.SetDownSetpoint", (function, args) =>
|
|||
|
{
|
|||
|
MoveDown(out reason);
|
|||
|
return true;
|
|||
|
});
|
|||
|
return false;
|
|||
|
}
|
|||
|
string reason = string.Empty;
|
|||
|
public bool MoveUp(out string reason)
|
|||
|
{
|
|||
|
//if (State == BottomSectionStateEnum.Up)
|
|||
|
//{
|
|||
|
reason = "";
|
|||
|
// return true;
|
|||
|
//}
|
|||
|
|
|||
|
//if (!_doDownSetpoint.Check(false, out reason))
|
|||
|
// return false;
|
|||
|
//if (!_doUpSetpoint.Check(true, out reason))
|
|||
|
// return false;
|
|||
|
|
|||
|
//if (!_doDownSetpoint.SetValue(false, out reason))
|
|||
|
// return false;
|
|||
|
//if (!_doUpSetpoint.SetValue(true, out reason))
|
|||
|
// return false;
|
|||
|
|
|||
|
|
|||
|
//_timer.Start(_scTimeout.IntValue * 1000);
|
|||
|
|
|||
|
//_state = DeviceState.MovingUp;
|
|||
|
return true;
|
|||
|
}
|
|||
|
public bool MoveDown(out string reason)
|
|||
|
{
|
|||
|
//if (State == BottomSectionStateEnum.Down)
|
|||
|
//{
|
|||
|
reason = "";
|
|||
|
// return true;
|
|||
|
//}
|
|||
|
|
|||
|
//if (!_doDownSetpoint.Check(true, out reason))
|
|||
|
//{
|
|||
|
// EV.PostMessage(Module, EventEnum.DefaultWarning, reason);
|
|||
|
// return false;
|
|||
|
//}
|
|||
|
//if (!_doUpSetpoint.Check(false, out reason))
|
|||
|
//{
|
|||
|
// EV.PostMessage(Module, EventEnum.DefaultWarning, reason);
|
|||
|
// return false;
|
|||
|
//}
|
|||
|
|
|||
|
//if (!_doDownSetpoint.SetValue(true, out reason))
|
|||
|
// return false;
|
|||
|
//if (!_doUpSetpoint.SetValue(false, out reason))
|
|||
|
// return false;
|
|||
|
|
|||
|
|
|||
|
//_timer.Start(_scTimeout.IntValue * 1000);
|
|||
|
|
|||
|
//_state = DeviceState.MovingDown;
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
public void Monitor()
|
|||
|
{
|
|||
|
//switch (_state)
|
|||
|
//{
|
|||
|
// case DeviceState.MovingUp:
|
|||
|
// if (IsUp)
|
|||
|
// {
|
|||
|
// if (!_doUpSetpoint.Check(false, out string reason))
|
|||
|
// {
|
|||
|
// LOG.Error($"{Module} reset DO failed, {reason}");
|
|||
|
// }
|
|||
|
|
|||
|
// _doUpSetpoint.Value = false;
|
|||
|
// _state = DeviceState.Idle;
|
|||
|
// }
|
|||
|
// else if (_timer.IsTimeout())
|
|||
|
// {
|
|||
|
// _timer.Stop();
|
|||
|
// if (!_doUpSetpoint.Check(false, out string reason))
|
|||
|
// {
|
|||
|
// LOG.Error($"{Module} reset DO failed, {reason}");
|
|||
|
// }
|
|||
|
|
|||
|
// EV.PostAlarmLog(Module, $"{Module} {Name} Can not move up in {_scTimeout.IntValue} seconds");
|
|||
|
// _doUpSetpoint.Value = false;
|
|||
|
// _state = DeviceState.Error;
|
|||
|
// }
|
|||
|
// break;
|
|||
|
// case DeviceState.MovingDown:
|
|||
|
// if (IsDown)
|
|||
|
// {
|
|||
|
// if (!_doDownSetpoint.Check(false, out string reason))
|
|||
|
// {
|
|||
|
// LOG.Error($"{Module} reset DO failed, {reason}");
|
|||
|
// }
|
|||
|
|
|||
|
// _doDownSetpoint.Value = false;
|
|||
|
// _state = DeviceState.Idle;
|
|||
|
// }
|
|||
|
// else if (_timer.IsTimeout())
|
|||
|
// {
|
|||
|
// _timer.Stop();
|
|||
|
// if (!_doDownSetpoint.Check(false, out string reason))
|
|||
|
// {
|
|||
|
// LOG.Error($"{Module} reset DO failed, {reason}");
|
|||
|
// }
|
|||
|
|
|||
|
// EV.PostAlarmLog(Module, $"{Module} {Name} Can not move down in {_scTimeout.IntValue} seconds");
|
|||
|
|
|||
|
// _doDownSetpoint.Value = false;
|
|||
|
// _state = DeviceState.Error;
|
|||
|
// }
|
|||
|
// break;
|
|||
|
// default:
|
|||
|
// break;
|
|||
|
//}
|
|||
|
}
|
|||
|
|
|||
|
public void Reset()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public void Terminate()
|
|||
|
{
|
|||
|
//_doDownSetpoint.SetValue(false, out _);
|
|||
|
//_doUpSetpoint.SetValue(false, out _);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|