Sic04/FrameworkLocal/RTCore/OfflineTimeoutNotifiableMod...

106 lines
3.0 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 MECF.Framework.Common.Fsm;
using System.Threading;
using System.Threading.Tasks;
using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.Equipment;
namespace MECF.Framework.RT.Core
{
public class OfflineTimeoutNotifiableModuleBase : ModuleFsmDevice
{
#region Variables
private CancellationTokenSource _notifyModuleOfflineCancellation;
#endregion
#region Constructors
public OfflineTimeoutNotifiableModuleBase()
{
IsStayOfflineTimeout = false;
_notifyModuleOfflineCancellation = new CancellationTokenSource();
}
#endregion
public bool IsStayOfflineTimeout { get; protected set; }
#region Methods
public override bool Initialize()
{
OP.Subscribe($"{Module}.SetOnline", (string cmd, object[] args) => PutOnline());
OP.Subscribe($"{Module}.SetOffline", (string cmd, object[] args) => PutOffline());
DATA.Subscribe($"{Module}.IsOfflineTimeout", ()=> IsStayOfflineTimeout);
return base.Initialize();
}
protected virtual bool PutOnline()
{
IsStayOfflineTimeout = false;
IsOnline = true;
_notifyModuleOfflineCancellation.Cancel();
return true;
}
protected virtual bool PutOffline()
{
// 是否在Auto模式仅Auto模式启用超时机制
var sta = DATA.Poll("Rt.Status").ToString();
IsOnline = false;
IsStayOfflineTimeout = false;
if (sta != "AutoRunning" && sta != "AutoIdle")
return true;
// 如果是Auto模式启用超时机制。
var timeoutSec = SC.GetValue<int>("System.ModuleOfflineTimeout");
if (timeoutSec <= 0)
timeoutSec = 0;
if (timeoutSec > 0)
{
_notifyModuleOfflineCancellation?.Dispose();
_notifyModuleOfflineCancellation = new CancellationTokenSource();
NotifyModuleOfflineTask(timeoutSec * 1000);
}
return true;
}
private Task NotifyModuleOfflineTask(int delayTime)
{
var t1 = Task.Run(async () =>
{
await Task.Delay(delayTime, _notifyModuleOfflineCancellation.Token).ContinueWith(
x =>
{
IsStayOfflineTimeout = true;
EV.PostWarningLog(Module, $"{Module} offline timeout");
},
_notifyModuleOfflineCancellation.Token);
});
return t1;
}
public void InvokeOffline()
{
PutOffline();
}
public void InvokeOnline()
{
PutOnline();
}
#endregion
}
}