Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/MECF/Framework/Common/Fsm/ModuleFsmDevice.cs

220 lines
4.9 KiB
C#
Raw Normal View History

2023-04-13 11:51:03 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
namespace MECF.Framework.Common.Fsm
{
/// <summary>
/// Ӧ<><D3A6><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD>ģ<EFBFBD>飨Module<6C><65>״̬<D7B4><CCAC><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <remarks>
/// ģ<>飨Module<6C><65><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ӦӲ<D3A6><D3B2>ϵͳ<CFB5>Ŀ<EFBFBD><C4BF>Ƶ<EFBFBD>Ԫ<EFBFBD><D4AA>
/// <br/>
/// ͨ<><CDA8>һ<EFBFBD><D2BB>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E8B1B8>Device<63><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>Routine<6E><EFBFBD><E1B9A9><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD>Եĸ<D4B5><C4B8>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD>
/// <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ͬ<EFBFBD><CDAC>ģ<EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>µ<EFBFBD>Routine<6E><65><EFBFBD>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD><DCB6><EFBFBD><EFBFBD><EFBFBD>
/// <20><><EFBFBD><EFBFBD>Routine<6E><65>ϸ<EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>ο<EFBFBD><see cref="ModuleRoutine"/><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <br/>
/// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>FSM<53><4D><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ת<CCAC><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ת<CCAC><D7AA><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
/// ״̬<D7B4><CCAC>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ч<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD>ġ<EFBFBD><C4A1>ȶ<EFBFBD><C8B6><EFBFBD>ϵͳ<CFB5>ܹ<EFBFBD><DCB9><EFBFBD>
/// </remarks>
2023-04-13 11:51:03 +08:00
public class ModuleFsmDevice : FsmDevice
{
#region Variables
2023-04-13 11:51:03 +08:00
/// <summary>
/// <20><>ģ<EFBFBD><EFBFBD><E9B7A2><EFBFBD>쳣ʱ<ECB3A3><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>
/// </summary>
/// <remarks>
/// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Error<6F><72>Alarm<72><6D>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʹ״̬<D7B4><CCAC>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>Error<6F><72>Alarm״̬<D7B4><CCAC>
/// </remarks>
public event EventHandler<string> OnEnterError;
private readonly Queue<IRoutine> _qRoutines;
#endregion
#region Constructors
/// <summary>
/// <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>
/// </summary>
public ModuleFsmDevice()
{
_qRoutines = new Queue<IRoutine>();
}
#endregion
#region Properties
/// <summary>
/// <20><><EFBFBD>ص<EFBFBD>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
/// </summary>
2023-04-13 11:51:03 +08:00
public bool IsInstalled
{
get
{
if (!SC.ContainsItem("System.SetUp.Is" + base.Module + "Installed"))
{
return true;
}
return SC.GetValue<bool>("System.SetUp.Is" + base.Module + "Installed");
}
}
/// <summary>
/// <20><><EFBFBD>û򷵻ص<F2B7B5BB>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ߡ<EFBFBD>
/// </summary>
2023-04-13 11:51:03 +08:00
public bool IsOnline { get; set; }
/// <summary>
/// <20><><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ִ<EFBFBD>е<EFBFBD>Routine<6E><65><EFBFBD>жӡ<D0B6>
/// </summary>
protected Queue<IRoutine> QueueRoutine => _qRoutines;
#endregion
#region Methods
2023-04-13 11:51:03 +08:00
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>ģ<EFBFBD>
/// </summary>
/// <returns></returns>
2023-04-13 11:51:03 +08:00
public override bool Initialize()
{
return base.Initialize();
2023-04-13 11:51:03 +08:00
}
/// <summary>
/// ʹ<><CAB9>ָ<EFBFBD><D6B8><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Routine<6E><65>
/// </summary>
/// <param name="routine">Routine<6E><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD></param>
/// <param name="args">
/// Routine<6E><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <remarks>
/// <20>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>Routine<6E><65>Start()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </remarks>
/// </param>
/// <returns>
/// <see cref="Result"/>
/// <br/>
/// Routine<6E><65>ִ<EFBFBD><D6B4>״̬<D7B4><CCAC></returns>
2023-04-13 11:51:03 +08:00
public Result StartRoutine(IRoutine routine, params object[] args)
{
QueueRoutine.Clear();
QueueRoutine.Enqueue(routine);
return QueueRoutine.Peek().Start(args);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Routine<6E><65>
/// </summary>
/// <param name="routine">Routine<6E><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD></param>
/// <returns>
/// <see cref="Result"/>
/// <br/>
/// Routine<6E><65>ִ<EFBFBD><D6B4>״̬<D7B4><CCAC></returns>
public Result StartRoutine(IRoutine routine)
2023-04-13 11:51:03 +08:00
{
QueueRoutine.Clear();
QueueRoutine.Enqueue(routine);
return QueueRoutine.Peek().Start();
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>е<EFBFBD>Routine<6E><65>
/// </summary>
/// <remarks>
/// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ִ<EFBFBD>е<EFBFBD>Routine<6E><65><EFBFBD>ӵ<EFBFBD><see cref="QueueRoutine"/><3E><><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
/// </remarks>
/// <returns>
/// <see cref="Result"/>
/// <br/>
/// Routine<6E><65>ִ<EFBFBD><D6B4>״̬<D7B4><CCAC>
/// </returns>
public Result StartRoutine()
2023-04-13 11:51:03 +08:00
{
if (_qRoutines.Count == 0)
2023-04-13 11:51:03 +08:00
{
return Result.DONE;
}
var result = Result.DONE;
var list = _qRoutines.ToList();
for (int i = 0; i < list.Count; _qRoutines.Dequeue(), i++)
2023-04-13 11:51:03 +08:00
{
switch (list[i].Start())
{
case Result.DONE:
continue;
case Result.FAIL:
return Result.FAIL;
}
break;
}
return Result.RUN;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>е<EFBFBD>Routine<6E><65>
/// </summary>
/// <returns>
/// <see cref="Result"/>
/// <br/>
/// Routine<6E><65>ִ<EFBFBD><D6B4>״̬<D7B4><CCAC>
/// </returns>
public Result MonitorRoutine()
2023-04-13 11:51:03 +08:00
{
if (_qRoutines.Count == 0)
2023-04-13 11:51:03 +08:00
{
return Result.DONE;
}
var routine = _qRoutines.Peek();
var result = routine.Monitor();
2023-04-13 11:51:03 +08:00
if (result == Result.DONE)
{
_qRoutines.Dequeue();
var list = _qRoutines.ToList();
for (var i = 0; i < list.Count; _qRoutines.Dequeue(), i++)
2023-04-13 11:51:03 +08:00
{
result = list[i].Start();
switch (result)
{
case Result.DONE:
continue;
case Result.FAIL:
return Result.FAIL;
}
break;
}
}
return result;
}
/// <summary>
/// <20><>ֹ<EFBFBD><D6B9>ǰģ<C7B0><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>е<EFBFBD>Routine<6E><65>
/// </summary>
2023-04-13 11:51:03 +08:00
public void AbortRoutine()
{
if (_qRoutines != null)
2023-04-13 11:51:03 +08:00
{
_qRoutines.Peek().Abort();
_qRoutines.Clear();
2023-04-13 11:51:03 +08:00
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>
/// </summary>
/// <param name="module"></param>
2023-04-13 11:51:03 +08:00
protected virtual void InvokeOnEnterError(string module)
{
OnEnterError?.Invoke(this, module);
}
#endregion
}
2023-04-13 11:51:03 +08:00
}