288 lines
8.2 KiB
C#
288 lines
8.2 KiB
C#
|
using Aitex.Core.RT.DataCenter;
|
|||
|
using Aitex.Core.RT.Event;
|
|||
|
using Aitex.Core.RT.OperationCenter;
|
|||
|
using Aitex.Core.RT.SCCore;
|
|||
|
using Aitex.Core.Util;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
|
|||
|
namespace Aitex.Core.RT.MultiProcess.ProcessCenter
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Rt作为客户端与服务器进行通讯,定期发送设备状态并接受服务器信息;问询服务器是否可以进行Process操作
|
|||
|
/// </summary>
|
|||
|
public class MultiProcessClient : Singleton<MultiProcessClient>
|
|||
|
{
|
|||
|
#region Service
|
|||
|
|
|||
|
private IMultiProcessService _service;
|
|||
|
public bool InProcess { get; set; }
|
|||
|
|
|||
|
public IMultiProcessService Service
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (_service == null)
|
|||
|
{
|
|||
|
if (InProcess)
|
|||
|
{
|
|||
|
_service = new MultiProcessService();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_service = new MultiProcessServiceClient();
|
|||
|
}
|
|||
|
}
|
|||
|
return _service;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Variables
|
|||
|
|
|||
|
private readonly PeriodicJob _threadMonitor;
|
|||
|
|
|||
|
private bool _isConnected = true;
|
|||
|
protected readonly R_TRIG _connectionTrig = new();
|
|||
|
|
|||
|
private bool _isPM1Installed = false;
|
|||
|
private bool _isPM2Installed = false;
|
|||
|
|
|||
|
private string _name = "Sic08";
|
|||
|
|
|||
|
private int _total = -1;
|
|||
|
private int _process = -1;
|
|||
|
private int _processidle = -1;
|
|||
|
private Dictionary<string, string> _allmachinestatedic = new();
|
|||
|
|
|||
|
private bool PM1CanEnterProcess
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
string result;
|
|||
|
bool temp = Service.CanEnterProcessNow(_name, "PM1", out result);
|
|||
|
if (!temp)
|
|||
|
{
|
|||
|
EV.PostWarningLog("MultiProcess", result);
|
|||
|
}
|
|||
|
return temp;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private bool PM1CanEnterProcessIdle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
string result;
|
|||
|
bool temp = Service.CanEnterProcessIdleNow(_name, "PM1", out result);
|
|||
|
if (!temp)
|
|||
|
{
|
|||
|
EV.PostWarningLog("MultiProcess", result);
|
|||
|
}
|
|||
|
return temp;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private bool PM2CanEnterProcess
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
string result;
|
|||
|
bool temp = Service.CanEnterProcessNow(_name, "PM2", out result);
|
|||
|
if (!temp)
|
|||
|
{
|
|||
|
EV.PostWarningLog("MultiProcess", result);
|
|||
|
}
|
|||
|
return temp;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
private bool PM2CanEnterProcessIdle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
string result;
|
|||
|
bool temp = Service.CanEnterProcessIdleNow(_name, "PM2", out result);
|
|||
|
if (!temp)
|
|||
|
{
|
|||
|
EV.PostWarningLog("MultiProcess", result);
|
|||
|
}
|
|||
|
return temp;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Properties
|
|||
|
|
|||
|
#endregion
|
|||
|
#region Constructors
|
|||
|
|
|||
|
public MultiProcessClient()
|
|||
|
{
|
|||
|
_threadMonitor = new PeriodicJob(10000, OnTimer, "MultiProcessHandleThread", true, true);
|
|||
|
}
|
|||
|
|
|||
|
#endregion Constructors
|
|||
|
|
|||
|
#region Methods
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// RT作为客户端和外部服务器进行交互;注意初始化位置
|
|||
|
/// </summary>
|
|||
|
public void Initialize()
|
|||
|
{
|
|||
|
_isPM1Installed = SC.GetValue<bool>("System.SetUp.IsPM1Installed");
|
|||
|
_isPM2Installed = SC.GetValue<bool>("System.SetUp.IsPM2Installed");
|
|||
|
|
|||
|
_name = SC.GetStringValue("System.MachineName");
|
|||
|
|
|||
|
#region InitData
|
|||
|
|
|||
|
DATA.Subscribe("MultiProcessClient.PM1.CanEnterProcessNow", () => PM1CanEnterProcess,SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|||
|
DATA.Subscribe("MultiProcessClient.PM1.CanEnterProcessIdleNow", () => PM1CanEnterProcessIdle, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|||
|
|
|||
|
DATA.Subscribe("MultiProcessClient.PM2.CanEnterProcessNow", () => PM2CanEnterProcess, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|||
|
DATA.Subscribe("MultiProcessClient.PM2.CanEnterProcessIdleNow", () => PM2CanEnterProcessIdle, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region InitOp
|
|||
|
|
|||
|
OP.Subscribe("MultiProcessClient.UpdateChamberState", UpdateChamberState);
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 实时发送本机腔体状态
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
private bool OnTimer()
|
|||
|
{
|
|||
|
var ds = Service.UpdateChamberState(_name, "PM1", DateTime.Now.ToString());
|
|||
|
//GetMultiProcessInformation();
|
|||
|
//if (UpdateChamberState(null, null))
|
|||
|
//{
|
|||
|
|
|||
|
//}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 实时收集Process信息
|
|||
|
/// </summary>
|
|||
|
private void GetMultiProcessInformation()
|
|||
|
{
|
|||
|
var list = MultiProcessClient.Instance.Service.QueryAllProcessInformation();
|
|||
|
foreach (var info in list)
|
|||
|
{
|
|||
|
if (info.StartsWith("State."))
|
|||
|
{
|
|||
|
string temp = info.Substring(6);
|
|||
|
string[] temps = temp.Split('.');
|
|||
|
if (temps.Length == 3)
|
|||
|
{
|
|||
|
_allmachinestatedic[temp[0] + "." + temp[1]] = temps[2];
|
|||
|
}
|
|||
|
}
|
|||
|
else if (info.StartsWith("Total."))
|
|||
|
{
|
|||
|
int num = -1;
|
|||
|
try
|
|||
|
{
|
|||
|
num = Convert.ToInt16(info.Substring(6));
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{
|
|||
|
;
|
|||
|
}
|
|||
|
_total = num;
|
|||
|
}
|
|||
|
else if (info.StartsWith("Process."))
|
|||
|
{
|
|||
|
int num = -1;
|
|||
|
try
|
|||
|
{
|
|||
|
num = Convert.ToInt16(info.Substring(8));
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{
|
|||
|
;
|
|||
|
}
|
|||
|
_process = num;
|
|||
|
}
|
|||
|
else if (info.StartsWith("ProcessIdle."))
|
|||
|
{
|
|||
|
int num = -1;
|
|||
|
try
|
|||
|
{
|
|||
|
num = Convert.ToInt16(info.Substring(12));
|
|||
|
}
|
|||
|
catch (Exception)
|
|||
|
{
|
|||
|
;
|
|||
|
}
|
|||
|
_processidle = num;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 发送腔体状态
|
|||
|
/// </summary>
|
|||
|
private bool UpdateChamberState(string arg1, object[] args)
|
|||
|
{
|
|||
|
var workenable = SC.GetValue<bool>("System.MultiProcessMode");
|
|||
|
if (workenable)
|
|||
|
{
|
|||
|
_isConnected = UpdateState();
|
|||
|
}
|
|||
|
|
|||
|
_connectionTrig.CLK = _isConnected;
|
|||
|
if (_connectionTrig.Q)
|
|||
|
{
|
|||
|
EV.PostWarningLog("MultiProcessClient", "Failed to Connect MultiProcess Service");
|
|||
|
}
|
|||
|
|
|||
|
return _isConnected;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
private bool UpdateState()
|
|||
|
{
|
|||
|
if (_isPM1Installed)
|
|||
|
{
|
|||
|
string state = (string)DATA.Poll("PM1.Status");
|
|||
|
if (state != null)
|
|||
|
{
|
|||
|
if (!Service.UpdateChamberState(_name, "PM1", state))
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
if (_isPM2Installed)
|
|||
|
{
|
|||
|
string state = (string)DATA.Poll("PM2.Status");
|
|||
|
if (state != null)
|
|||
|
{
|
|||
|
if (!Service.UpdateChamberState(_name, "PM2", state))
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
}
|
|||
|
}
|