MoS2/Framework/MECF.Framework.RT.EquipmentLibrary/HardwareUnits/Temps/AE/AETemp.cs
2026-06-15 10:56:30 +08:00

214 lines
7.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using MECF.Framework.Common.Communications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Xml;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Temps
{
public sealed class AETemp : TempSensorBase
{
private AETempConnection _connection;
private readonly R_TRIG _trigCommunicationError = new ();
private readonly R_TRIG _trigFewChannels = new ();
private readonly R_TRIG _trigMonitorExcepted = new ();
private readonly LinkedList<HandlerBase> _lstHandler = new ();
private readonly object _locker = new ();
private double[] _tempBuff;
/// <summary>
/// 设备通道启用
/// </summary>
private bool[] _channelInstalled;
public override bool IsConnected => _connection is { IsConnected: true };
public AETemp(string module, XmlElement node, string ioModule = "") : base(module, node, ioModule)
{
RTrigs.Add(_trigCommunicationError);
RTrigs.Add(_trigFewChannels);
RTrigs.Add(_trigMonitorExcepted);
}
private void QueryTemp()
{
lock (_locker)
{
_lstHandler.AddLast(new AETempReadCommandHandler(this, "OUT", "1"));
}
}
protected override bool HandleInitialize()
{
InitController();
_channelInstalled=new bool[MaxChannels];
for (int i = 0; i < _channelInstalled.Length; i++)
_channelInstalled[i] = SC.GetValue<bool>($"{ScBasePath}.{Name}.Channel{i+1}");
_tempBuff = new double[MaxChannels];
return true;
}
private void InitController()
{
Address = SC.GetStringValue($"{ScBasePath}.{Name}.Address");
_connection = new AETempConnection(Address);
_connection.EnableLog(IsEnableLog);
SC.RegisterValueChangedCallback($"TempSensors.EnableLogMessage", (obj) =>
{
_connection.EnableLog((bool)obj);
});
}
protected override double[] HandleReadTemp()
{
OnTimeQueryTemp();
return IsConnected ? _tempBuff : null;
}
protected void OnTimeQueryTemp()
{
try
{
_connection.MonitorTimeout();
if (!_connection.IsConnected || _connection.IsCommunicationError)
{
lock (_locker)
{
_lstHandler.Clear();
}
//只要断开,就进行连接
if (!_connection.Connect())
{
_trigCommunicationError.CLK = !_connection.IsConnected;
if (_trigCommunicationError.Q)
{
TempBasFunction.PM1PM2PostLog($"Can not connect with {_connection.Address}, {Module}.{Name}",EV.PostAlarmLog);
TempBasFunction.SetPm1Pm2IoForInterlock(true);
}
_connection.ForceClear();
Thread.Sleep(1000);//重连延时
}
else
{
//连接成功后不会再进入所以也只是写入一次LOG
LOG.Write($"{Module} {Name} Connected");
EV.PostInfoLog(Module, $"{Name} Connected");
TempBasFunction.PM1PM2PostLog($"{Name} Connected", EV.PostInfoLog);
TempBasFunction.SetPm1Pm2IoForInterlock(false);
}
_trigCommunicationError.CLK = !_connection.IsConnected;
_connection.ForceClear();
}
else
{
lock (_locker)
{
if (_lstHandler.Count == 0)
QueryTemp();
if (_lstHandler.Count > 0 && !_connection.IsBusy)
{
var handler = _lstHandler.First.Value;
_lstHandler.RemoveFirst();
if (handler != null)
{
_connection.Execute(handler);
}
}
}
}
}
catch (Exception ex)
{
_trigMonitorExcepted.CLK = true;
if(_trigMonitorExcepted.Q)
LOG.Write(ex);
}
}
public void ParseCommandInfo(string command, string message)
{
try
{
switch (command)
{
case "OUT":
{
if (message != null)
{
if (message.Contains(" "))
{
var strs = message.Split(' ');
if (strs.Length > 0 )
{
//判断AE温度通道启用和上位机设定通道启用是否相同
if (strs.Length != _channelInstalled.Count(c => c == true))
{
_trigFewChannels.CLK = true;
if (_trigFewChannels.Q)
{
TempBasFunction.PM1PM2PostLog("AE Error: Too few channels.", EV.PostAlarmLog);
}
return;
}
//温度数组,根据通道是否屏蔽来赋值,
_trigFewChannels.RST = true;
for (int i = 0; i < strs.Length; i++)
{
if (_channelInstalled[i] == true)
{
_tempBuff[i] = float.Parse(strs[i]);
}
}
//温度连续多次不变化侦测
//TempInvariantCount = TempBasFunction.TempInvariantCount(TempDatasArray, out string tempInvariantData);
//_trigTempNoChange.CLK = TempInvariantCount >= TempInvariantCountMax ? true : false;
//if (_trigTempNoChange.Q)
//{
// TempBasFunction.PM1PM2PostLog($"{Name} {TempInvariantCount} temp no changeCount {tempInvariantData}", EV.PostWarningLog);
//}
}
}
}
}
break;
}
}
catch (Exception ex)
{
// ignored
}
}
public override void Reset()
{
_connection?.SetCommunicationError(false, "");
base.Reset();
}
public override void Terminate()
{
_connection.Disconnect();
}
}
}