Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/MECF/Framework/Common/MultiProcess/MultiProcessManager.cs

132 lines
4.0 KiB
C#
Raw Normal View History

2024-02-01 19:05:50 +08:00
using Aitex.Core.Util;
2024-02-01 18:32:23 +08:00
using Aitex.Core.WCF;
2024-02-01 19:05:50 +08:00
using MECF.Framework.Common.MultiProcess.ProcessCenter;
2024-02-01 18:32:23 +08:00
using System;
using System.Collections.Generic;
using System.Text;
2024-02-01 19:05:50 +08:00
namespace MECF.Framework.Common.MultiProcess
2024-02-01 18:32:23 +08:00
{
/// <summary>
/// 用于限制同一区域的机台同时进行工艺的数量
/// </summary>
public class MultiProcessManager : Singleton<MultiProcessManager>
{
#region Variables
/// <summary>
/// 加热基数上限
/// </summary>
private const int Max_Heart_Num = 4;
private PeriodicJob _threadMonitor;
protected readonly R_TRIG _connectionFailed = new();
private readonly List<PMProcessData> _processStateList = [];
private static readonly object _lock = new object();
#endregion Variables
#region Constructors
public MultiProcessManager()
{
}
#endregion Constructors
#region Methods
public void Initialize(bool enableService)
{
MULTIPROCESS._multiprocessmanager = this;
if (enableService)
{
Singleton<WcfServiceManager>.Instance.Initialize(new Type[1] { typeof(MultiProcessService) });
}
}
private bool OnTimer()
{
return true;
}
public List<string> QueryAllProcessInformation()
{
return PMProcessStateManager.GetProcessInformation(_processStateList);
}
public List<PMProcessData> QueryAllProcessData()
{
List<PMProcessData> processDataList = new List<PMProcessData>();
foreach (var item in _processStateList)
{
processDataList.Add((PMProcessData)item.Clone());
}
return processDataList;
}
public bool CanEnterProcessNow(string sicMachineName, string pmName, out string result)
{
lock (_lock)
{
int heartBase = 1 + GetAllHeartBaseNum(out string infor);//添加初始基数1
if (heartBase <= Max_Heart_Num)
{
result = "OK";
return true;
}
result = $"加热基数超上限:{Max_Heart_Num} " + infor;
return false;
}
}
public bool CanEnterProcessIdleNow(string sicMachineName, string pmName, out string result)
{
lock (_lock)
{
int heartBase = 2 + GetAllHeartBaseNum(out string infor);//添加初始基数2
if (heartBase <= Max_Heart_Num)
{
result = "OK";
return true;
}
result = $"加热基数超上限:{Max_Heart_Num} " + infor;
return false;
}
}
public bool UpdateChamberState(string sicMachineName, string pmName, string state)
{
lock (_lock)
{
PMProcessData pmProcessData = new()
{
SicMachineName = sicMachineName,
PmName = pmName,
PmState = state
};
return PMProcessStateManager.ProcessStateChangeUpdate(pmProcessData, _processStateList);
}
}
private int GetAllHeartBaseNum(out string infor)
{
int heartBase = 0;
StringBuilder sb = new StringBuilder();
foreach (var pmProcessData in _processStateList)
{
heartBase += PMProcessStateManager.GetHeartBaseNum(pmProcessData);
if (pmProcessData.Process == 2)
sb.Append($"{pmProcessData.SicMachineID} is Process ; ");
if (pmProcessData.ProcessIdle == 1)
sb.Append($"{pmProcessData.SicMachineID} is ProcessIdle ; ");
}
infor = sb.ToString();
return heartBase;
}
#endregion Methods
}
}