132 lines
4.0 KiB
C#
132 lines
4.0 KiB
C#
using Aitex.Core.Util;
|
|
using Aitex.Core.WCF;
|
|
using MECF.Framework.Common.MultiProcess.ProcessCenter;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace MECF.Framework.Common.MultiProcess
|
|
{
|
|
/// <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
|
|
}
|
|
} |