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
|
|
|
|
|
{
|
2023-05-09 16:30:01 +08:00
|
|
|
|
/// <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
|
|
|
|
|
{
|
2023-05-09 16:30:01 +08:00
|
|
|
|
#region Variables
|
2023-04-13 11:51:03 +08:00
|
|
|
|
|
2023-05-09 16:30:01 +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");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 16:30:01 +08:00
|
|
|
|
/// <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; }
|
|
|
|
|
|
2023-05-09 16:30:01 +08:00
|
|
|
|
/// <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
|
|
|
|
|
2023-05-09 16:30:01 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// <20><>ʼ<EFBFBD><CABC>ģ<EFBFBD>顣
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
2023-04-13 11:51:03 +08:00
|
|
|
|
public override bool Initialize()
|
|
|
|
|
{
|
2023-05-09 16:30:01 +08:00
|
|
|
|
return base.Initialize();
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 16:30:01 +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);
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 16:30:01 +08:00
|
|
|
|
/// <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();
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 16:30:01 +08:00
|
|
|
|
/// <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
|
|
|
|
{
|
2023-05-09 16:30:01 +08:00
|
|
|
|
if (_qRoutines.Count == 0)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
|
|
|
|
return Result.DONE;
|
|
|
|
|
}
|
|
|
|
|
var result = Result.DONE;
|
2023-05-09 16:30:01 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 16:30:01 +08:00
|
|
|
|
/// <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
|
|
|
|
{
|
2023-05-09 16:30:01 +08:00
|
|
|
|
if (_qRoutines.Count == 0)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
|
|
|
|
return Result.DONE;
|
|
|
|
|
}
|
2023-05-09 16:30:01 +08:00
|
|
|
|
var routine = _qRoutines.Peek();
|
|
|
|
|
var result = routine.Monitor();
|
2023-04-13 11:51:03 +08:00
|
|
|
|
if (result == Result.DONE)
|
|
|
|
|
{
|
2023-05-09 16:30:01 +08:00
|
|
|
|
_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;
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 16:30:01 +08:00
|
|
|
|
/// <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()
|
|
|
|
|
{
|
2023-05-09 16:30:01 +08:00
|
|
|
|
if (_qRoutines != null)
|
2023-04-13 11:51:03 +08:00
|
|
|
|
{
|
2023-05-09 16:30:01 +08:00
|
|
|
|
_qRoutines.Peek().Abort();
|
|
|
|
|
_qRoutines.Clear();
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 16:30:01 +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);
|
|
|
|
|
}
|
2023-05-09 16:30:01 +08:00
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
}
|
2023-04-13 11:51:03 +08:00
|
|
|
|
}
|