724 lines
24 KiB
C#
724 lines
24 KiB
C#
using Aitex.Core.Common.DeviceData;
|
||
using Aitex.Core.RT.DataCenter;
|
||
using Aitex.Core.RT.Device;
|
||
using Aitex.Core.RT.Event;
|
||
using Aitex.Core.RT.IOCore;
|
||
using Aitex.Core.RT.Log;
|
||
using Aitex.Core.RT.OperationCenter;
|
||
using Aitex.Core.RT.SCCore;
|
||
using Aitex.Core.Util;
|
||
using DePacker;
|
||
using Global;
|
||
using Mainframe.Devices;
|
||
using MECF.Framework.Common.CommonData;
|
||
using MECF.Framework.Common.Event;
|
||
//using RTOverEthernetDevelopmentKit;
|
||
using SessionLayer;
|
||
using System;
|
||
using System.Collections.ObjectModel;
|
||
using System.Runtime.InteropServices;
|
||
using System.Runtime.Serialization;
|
||
using System.Xml;
|
||
|
||
namespace Mainframe.Devices
|
||
{
|
||
public struct BEI_SYSTEM_STATUS_ZH
|
||
{
|
||
public int nStatus;
|
||
public double dReflectWaferAverageInner; //内圈衬底反射率平均值
|
||
public double dReflectWaferAverageMiddle;//中圈衬底反射率平均值
|
||
public double dReflectWaferAverageOutter;//外圈衬底反射率平均值
|
||
public double dTemperatureAverageWaferInner; //内圈衬底温度平均值
|
||
public double dTemperatureAverageWaferMiddle; //中圈衬底温度平均值
|
||
public double dTemperatureAverageWaferOutter;//外圈衬底温度平均值
|
||
public double dTemperatureAverageSusceptorInner; //内圈托盘温度平均值
|
||
public double dTemperatureAverageSusceptorMiddle; //中圈托盘温度平均值
|
||
public double dTemperatureAverageSusceptorOutter;//外圈托盘温度平均值
|
||
};
|
||
|
||
public class OpticsViperStatus : NotifiableItem
|
||
{
|
||
public int Status { get; set; }
|
||
public int Head { get; set; }
|
||
public int DetectorMask { get; set; }
|
||
public int Reserved { get; set; }
|
||
public double SusAvg_1 { get; set; }
|
||
public double SusAvg_2 { get; set; }
|
||
public double SusAvg_3 { get; set; }
|
||
public double SusAvg_4 { get; set; }
|
||
public double WaferAvg_1 { get; set; }
|
||
public double WaferAvg_2 { get; set; }
|
||
public double WaferAvg_3 { get; set; }
|
||
public double WaferAvg_4 { get; set; }
|
||
|
||
public OpticsViperStatus()
|
||
{
|
||
Status = 0;
|
||
Head = 0;
|
||
DetectorMask = 0;
|
||
Reserved = 0;
|
||
SusAvg_1 = 0.0;
|
||
SusAvg_2 = 0.0;
|
||
SusAvg_3 = 0.0;
|
||
SusAvg_4 = 0.0;
|
||
WaferAvg_1 = 0.0;
|
||
WaferAvg_2 = 0.0;
|
||
WaferAvg_3 = 0.0;
|
||
WaferAvg_4 = 0.0;
|
||
}
|
||
}
|
||
public class OpticsViperInfo
|
||
{
|
||
private int _lastStatus = 0;
|
||
public int lastStatus
|
||
{
|
||
get
|
||
{
|
||
return _lastStatus;
|
||
}
|
||
}
|
||
|
||
private OpticsViperStatus _opticsViperStatus = new OpticsViperStatus();
|
||
public OpticsViperStatus opticsViperStatus
|
||
{
|
||
get
|
||
{
|
||
return _opticsViperStatus;
|
||
}
|
||
}
|
||
|
||
private AITOpticsViperData[] _innerOpticsViperItem = new AITOpticsViperData[0];
|
||
public AITOpticsViperData[] innerOpticsViperItem
|
||
{
|
||
get
|
||
{
|
||
return _innerOpticsViperItem;
|
||
}
|
||
}
|
||
|
||
|
||
private AITOpticsViperData[] _middleOpticsViperItem = new AITOpticsViperData[0];
|
||
public AITOpticsViperData[] middleOpticsViperItem
|
||
{
|
||
get
|
||
{
|
||
return _middleOpticsViperItem;
|
||
}
|
||
}
|
||
|
||
private AITOpticsViperData[] _outerOpticsViperItem = new AITOpticsViperData[0];
|
||
public AITOpticsViperData[] outerOpticsViperItem
|
||
{
|
||
get
|
||
{
|
||
return _outerOpticsViperItem;
|
||
}
|
||
}
|
||
|
||
private AITOpticsViperData[] _exOpticsViperItem = new AITOpticsViperData[0];
|
||
public AITOpticsViperData[] exOpticsViperItem
|
||
{
|
||
get
|
||
{
|
||
return _exOpticsViperItem;
|
||
}
|
||
}
|
||
|
||
public OpticsViperInfo()
|
||
{
|
||
_innerOpticsViperItem = new AITOpticsViperData[0];
|
||
_middleOpticsViperItem = new AITOpticsViperData[0];
|
||
_outerOpticsViperItem = new AITOpticsViperData[0];
|
||
_exOpticsViperItem = new AITOpticsViperData[0];
|
||
}
|
||
|
||
public OpticsViperInfo(OpticsViperStatus opticsViperStatus, AITOpticsViperData[] innerOpticsViperItem, AITOpticsViperData[] middleOpticsViperItem, AITOpticsViperData[] outerOpticsViperItem)
|
||
{
|
||
_opticsViperStatus = opticsViperStatus;
|
||
_innerOpticsViperItem = innerOpticsViperItem;
|
||
_middleOpticsViperItem = middleOpticsViperItem;
|
||
_outerOpticsViperItem = outerOpticsViperItem;
|
||
}
|
||
|
||
public OpticsViperInfo(OpticsViperStatus opticsViperStatus, AITOpticsViperData[] innerOpticsViperItem, AITOpticsViperData[] middleOpticsViperItem, AITOpticsViperData[] outerOpticsViperItem, AITOpticsViperData[] exOpticsViperItem)
|
||
{
|
||
_opticsViperStatus = opticsViperStatus;
|
||
_innerOpticsViperItem = innerOpticsViperItem;
|
||
_middleOpticsViperItem = middleOpticsViperItem;
|
||
_outerOpticsViperItem = outerOpticsViperItem;
|
||
_exOpticsViperItem = exOpticsViperItem;
|
||
_lastStatus = opticsViperStatus.Status;
|
||
|
||
//_opticsViperStatus = opticsViperStatus;
|
||
//_innerOpticsViperItem = new AITOpticsViperData[innerOpticsViperItem.Length / 2];
|
||
//_middleOpticsViperItem = new AITOpticsViperData[middleOpticsViperItem.Length / 2];
|
||
//_outerOpticsViperItem = new AITOpticsViperData[outerOpticsViperItem.Length / 2];
|
||
//_exOpticsViperItem = new AITOpticsViperData[exOpticsViperItem.Length / 2];
|
||
//_lastStatus = opticsViperStatus.Status;
|
||
|
||
//bool tempIsWafer = SC.GetValue<bool>("PM.AnngkunWaferTemp");
|
||
//for (int i = 0; i < _innerOpticsViperItem.Length; i++)
|
||
//{
|
||
// if (tempIsWafer)
|
||
// {
|
||
// _innerOpticsViperItem[i] = innerOpticsViperItem[i * 2];
|
||
// }
|
||
// else if(i * 2 + 1 < innerOpticsViperItem.Length)
|
||
// {
|
||
// _innerOpticsViperItem[i] = innerOpticsViperItem[i * 2 + 1];
|
||
// }
|
||
//}
|
||
|
||
//for (int i = 0; i < _middleOpticsViperItem.Length; i++)
|
||
//{
|
||
// if (tempIsWafer)
|
||
// {
|
||
// _middleOpticsViperItem[i] = middleOpticsViperItem[i * 2];
|
||
// }
|
||
// else if (i * 2 + 1 < middleOpticsViperItem.Length)
|
||
// {
|
||
// _middleOpticsViperItem[i] = middleOpticsViperItem[i * 2 + 1];
|
||
// }
|
||
//}
|
||
|
||
//for (int i = 0; i < _outerOpticsViperItem.Length; i++)
|
||
//{
|
||
// if (tempIsWafer)
|
||
// {
|
||
// _outerOpticsViperItem[i] = outerOpticsViperItem[i * 2];
|
||
// }
|
||
// else if (i * 2 + 1 < outerOpticsViperItem.Length)
|
||
// {
|
||
// _outerOpticsViperItem[i] = outerOpticsViperItem[i * 2 + 1];
|
||
// }
|
||
//}
|
||
|
||
//for (int i = 0; i < exOpticsViperItem.Length; i++)
|
||
//{
|
||
// if (tempIsWafer)
|
||
// {
|
||
// _exOpticsViperItem[i] = exOpticsViperItem[i * 2];
|
||
// }
|
||
// else
|
||
// {
|
||
// _exOpticsViperItem[i] = exOpticsViperItem[i * 2 + 1];
|
||
// }
|
||
//}
|
||
}
|
||
|
||
public void SetlastStatus(int lastStatus)
|
||
{
|
||
_lastStatus = lastStatus;
|
||
}
|
||
}
|
||
public class AkOpticsViperGuide : BaseDevice, IDevice
|
||
{
|
||
|
||
|
||
public AkOpticsViperGuide(string module, string name)
|
||
{
|
||
this.Name = name;
|
||
this.Module = module;
|
||
|
||
TcpSession = new Session();
|
||
|
||
|
||
TcpSession.BeforeConnect += TcpSession_BeforeConnect;
|
||
TcpSession.AfterConnect += TcpSession_AfterConnect;
|
||
TcpSession.DisConnected += TcpSession_DisConnected;
|
||
TcpSession.MsgRecv += TcpSession_MsgRecv;
|
||
|
||
DP = new DePacker.DPack();
|
||
DP.GetPackCallback += GetPack;
|
||
DP.BeginDepack();
|
||
DATA.Subscribe($"PM1.{Name}.InnerOpticsViperItem", () => _opticsViperInfo?.innerOpticsViperItem);
|
||
DATA.Subscribe($"PM1.{Name}.MiddleOpticsViperItem", () => _opticsViperInfo?.middleOpticsViperItem);
|
||
DATA.Subscribe($"PM1.{Name}.OuterOpticsViperItem", () => _opticsViperInfo?.outerOpticsViperItem);
|
||
DATA.Subscribe($"PM1.{Name}.ExOpticsViperItem", () => _opticsViperInfo?.exOpticsViperItem);
|
||
DATA.Subscribe($"PM1.{Name}.OpticsViperStatus", () => _opticsViperInfo?.opticsViperStatus);
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
struct BinaryData
|
||
{
|
||
public BEI_SYSTEM_STATUS_EX status;
|
||
|
||
public TempData[] zoneInner;
|
||
|
||
public TempData[] zoneMiddle;
|
||
|
||
public TempData[] zoneOuter;
|
||
|
||
public TempData[] zoneEx;
|
||
|
||
public BinaryData(bool IsCreate)
|
||
{
|
||
status = new BEI_SYSTEM_STATUS_EX();
|
||
zoneInner = new TempData[18];
|
||
zoneMiddle = new TempData[36];
|
||
zoneOuter = new TempData[36];
|
||
zoneEx = new TempData[72];
|
||
}
|
||
}
|
||
|
||
BinaryData Data = new BinaryData(true);
|
||
|
||
private bool IsNewStatus = false;
|
||
private PeriodicJob _thread;//工作线程
|
||
|
||
|
||
Session TcpSession;
|
||
DPack DP;
|
||
|
||
private OpticsViperInfo _opticsViperInfo = new OpticsViperInfo();
|
||
|
||
public event Action<string, AlarmEventItem> OnDeviceAlarmStateChanged;
|
||
|
||
/// <summary>
|
||
/// 接受到数据时触发事件
|
||
/// </summary>
|
||
public event Action<OpticsViperInfo> DataReceivedEvent;
|
||
/// <summary>
|
||
/// 通讯数据
|
||
/// </summary>
|
||
public OpticsViperInfo OpticsViperInfo
|
||
{
|
||
get
|
||
{
|
||
return _opticsViperInfo;
|
||
}
|
||
set
|
||
{
|
||
_opticsViperInfo = value;
|
||
DataReceivedEvent?.Invoke(_opticsViperInfo);
|
||
}
|
||
}
|
||
|
||
|
||
public string Module { get; set; }
|
||
public string Name { get; set; }
|
||
public bool HasAlarm => false;
|
||
|
||
public int reconnectionNumber;
|
||
|
||
public bool jobThreadStop;
|
||
public AkOpticsViperGuide()
|
||
{
|
||
|
||
|
||
}
|
||
BEI_SYSTEM_STATUS_ZH SystemStatus = new BEI_SYSTEM_STATUS_ZH();
|
||
|
||
const int StatusSize = 7856;
|
||
const int VoltBinarySize = 48024;
|
||
|
||
private void GetPack(byte[] bin)
|
||
{
|
||
switch (bin.Length)
|
||
{
|
||
case StatusSize:
|
||
UpdateStatus(bin);
|
||
break;
|
||
//case VoltBinarySize:
|
||
// {
|
||
// UpdateVoltData(bin);
|
||
// if (IsSaveVolt)
|
||
// {
|
||
// SaveVoltData();
|
||
// IsSaveVolt = false;
|
||
// btnSaveVolt.Enabled = true;
|
||
// }
|
||
// }
|
||
|
||
// break;
|
||
//default:
|
||
// txtMsgRecv.Text += System.Text.Encoding.Default.GetString(bin);
|
||
// break;
|
||
}
|
||
}
|
||
|
||
private void TcpSession_MsgRecv(int id, byte[] buf)
|
||
{
|
||
DP.AddStream(buf);
|
||
//throw new NotImplementedException();
|
||
}
|
||
|
||
private void TcpSession_DisConnected(int id, bool IsSuccess)
|
||
{
|
||
//throw new NotImplementedException();
|
||
}
|
||
|
||
private void TcpSession_AfterConnect(int id, bool IsSuccess)
|
||
{
|
||
string fmtLeft = "<RT_Plus>";
|
||
string fmtRight = "<End>;";
|
||
string request_command = fmtLeft + "RuntimeData" + fmtRight;
|
||
|
||
byte[] buf = System.Text.Encoding.ASCII.GetBytes(request_command);
|
||
|
||
TcpSession.Send(buf, buf.Length);
|
||
}
|
||
|
||
private void TcpSession_BeforeConnect()
|
||
{
|
||
|
||
}
|
||
|
||
|
||
public AITOpticsViperData ConvertTempData(int WaferNo, TempData tempData)
|
||
{
|
||
AITOpticsViperData opticsViperItem = new AITOpticsViperData();
|
||
|
||
opticsViperItem.WaferNo = WaferNo;
|
||
opticsViperItem.DateTime = tempData.DateTime;
|
||
opticsViperItem.Para1 = tempData.Para1;
|
||
opticsViperItem.Para2 = tempData.Para2;
|
||
opticsViperItem.Para3 = tempData.Para3;
|
||
opticsViperItem.Para4 = tempData.Para4;
|
||
opticsViperItem.Temperature = tempData.Temperature;
|
||
|
||
return opticsViperItem;
|
||
}
|
||
|
||
public AITOpticsViperData[] ConvertTempData(TempData[] tempData)
|
||
{
|
||
AITOpticsViperData[] opticsViperItem = new AITOpticsViperData[tempData.Length];
|
||
for (int i = 0; i < tempData.Length; i++)
|
||
{
|
||
|
||
opticsViperItem[i] = ConvertTempData(i + 1, tempData[i]);
|
||
}
|
||
|
||
return opticsViperItem;
|
||
}
|
||
public OpticsViperStatus ConvertStatusData(BEI_SYSTEM_STATUS_EX statusData)
|
||
{
|
||
OpticsViperStatus opticsViperStatus = new OpticsViperStatus();
|
||
|
||
opticsViperStatus.Status = statusData.nStatus;
|
||
opticsViperStatus.Head = statusData.Head;
|
||
opticsViperStatus.DetectorMask = statusData.DetectorMask;
|
||
opticsViperStatus.Reserved = statusData.Reserved;
|
||
opticsViperStatus.SusAvg_1 = statusData.SusAvg_1;
|
||
opticsViperStatus.SusAvg_2 = statusData.SusAvg_2;
|
||
opticsViperStatus.SusAvg_3 = statusData.SusAvg_3;
|
||
opticsViperStatus.SusAvg_4 = statusData.SusAvg_4;
|
||
opticsViperStatus.WaferAvg_1 = statusData.WaferAvg_1;
|
||
opticsViperStatus.WaferAvg_2 = statusData.WaferAvg_2;
|
||
opticsViperStatus.WaferAvg_3 = statusData.WaferAvg_3;
|
||
opticsViperStatus.WaferAvg_4 = statusData.WaferAvg_4;
|
||
|
||
return opticsViperStatus;
|
||
}
|
||
|
||
public void Connect()
|
||
{
|
||
try
|
||
{
|
||
string ip = SC.GetStringValue($"{Name}.Address"); ;
|
||
int port = SC.GetValue<int>($"{Name}.Port");
|
||
|
||
if (!TcpSession.Query(ip, port))
|
||
{
|
||
//MessageBox.Show("Target IP port is error!");
|
||
return;
|
||
}
|
||
if (_thread == null)
|
||
{
|
||
_thread = new PeriodicJob(1000, OnTimer, "AkOpticsTimer", true);//测试用,直接连接
|
||
}
|
||
|
||
|
||
if (!TcpSession.Link())
|
||
{
|
||
// MessageBox.Show("Target connect failed !");
|
||
return;
|
||
}
|
||
|
||
// RT.Init();
|
||
//Task.Factory.StartNew(()=> {
|
||
|
||
//});
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LOG.Write(e.ToString());
|
||
}
|
||
}
|
||
|
||
|
||
|
||
public void AddLog(int Status, bool IsAdd)
|
||
{
|
||
switch (Status)
|
||
{
|
||
case 0:
|
||
if (IsAdd) LOG.Write("AkOptics-" + Status.ToString() + ": ProcessWell");
|
||
break;
|
||
case 1:
|
||
if (IsAdd) LOG.Write("AkOptics-" + Status.ToString() + ": DetectorConnectError");
|
||
break;
|
||
case 2:
|
||
if (IsAdd) LOG.Write("AkOptics-" + Status.ToString() + ": TimeIntervalError");
|
||
break;
|
||
case 3:
|
||
if (IsAdd) LOG.Write("AkOptics-" + Status.ToString() + ": MemeoryAllocError");
|
||
break;
|
||
case 4:
|
||
if (IsAdd) LOG.Write("AkOptics-" + Status.ToString() + ": Initializing");
|
||
break;
|
||
case 5:
|
||
if (IsAdd) LOG.Write("AkOptics-" + Status.ToString() + ": UnStarted");
|
||
break;
|
||
default:
|
||
if (IsAdd) LOG.Write("AkOptics-" + Status.ToString() + ": 未知错误");
|
||
break;
|
||
}
|
||
}
|
||
|
||
public void StartRT()
|
||
{
|
||
try
|
||
{
|
||
///RT.StartRT();
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LOG.Write(e.ToString());
|
||
}
|
||
}
|
||
|
||
public void Close()
|
||
{
|
||
try
|
||
{
|
||
//DP.StopDepack();
|
||
//TcpSession.UnLink();
|
||
//RT.Close();
|
||
//_thread?.Stop();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LOG.Write("AkOpticsViper Close Error:" + ex.Message);
|
||
}
|
||
}
|
||
public object locker = new object();
|
||
|
||
public bool ReadData()
|
||
{
|
||
bool Result = false;
|
||
try
|
||
{
|
||
|
||
int lastStatus = _opticsViperInfo.lastStatus;
|
||
|
||
OpticsViperInfo = new OpticsViperInfo(ConvertStatusData(Data.status), ConvertTempData(Data.zoneInner), ConvertTempData(Data.zoneMiddle), ConvertTempData(Data.zoneOuter), ConvertTempData(Data.zoneEx));
|
||
if (_opticsViperInfo.lastStatus == lastStatus)
|
||
{
|
||
IsNewStatus = false;
|
||
}
|
||
else
|
||
{
|
||
IsNewStatus = true;
|
||
_opticsViperInfo.SetlastStatus(lastStatus);
|
||
AddLog(_opticsViperInfo.lastStatus, (_opticsViperInfo.lastStatus == 0 ? false : true));
|
||
|
||
}
|
||
|
||
Result = true;
|
||
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LOG.Write("AkOpticsViper ReadData Error:" + e.ToString());
|
||
}
|
||
|
||
return Result;
|
||
}
|
||
|
||
|
||
|
||
public bool OnTimer()
|
||
{
|
||
try
|
||
{
|
||
if (!TcpSession.IsConnected)//未连接,尝试重新连接
|
||
{
|
||
Close();
|
||
if (reconnectionNumber > 3)
|
||
{
|
||
reconnectionNumber = 0;
|
||
EV.PostAlarmLog(Module,"AkOptics connection failed");
|
||
jobThreadStop = true;
|
||
_thread?.Stop();
|
||
|
||
return false;
|
||
}
|
||
if (jobThreadStop)
|
||
{
|
||
return false;
|
||
}
|
||
Connect();
|
||
reconnectionNumber ++;
|
||
return true;
|
||
}
|
||
ReadData();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LOG.Write("AkOpticsViper OnTimer Error:" + ex.Message);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
public void ChangeStepID(int stepID, string stepName, string stepDesc)
|
||
{
|
||
try
|
||
{
|
||
//if (RT.Data.status.nStatus == 0)
|
||
//{
|
||
// RT.ChangeStepID(stepID, stepName, stepDesc);
|
||
//}
|
||
//else
|
||
//{
|
||
// AddLog(_opticsViperInfo.lastStatus, (_opticsViperInfo.lastStatus == 0 ? false : true));
|
||
//}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
LOG.Write(e.ToString());
|
||
}
|
||
}
|
||
|
||
#region 接口
|
||
/// <summary>
|
||
/// 初始化
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public bool Initialize()
|
||
{
|
||
try
|
||
{
|
||
Connect();
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
EV.PostAlarmLog("AkOpticsViper", "AkOpticsViper connect failed.");
|
||
LOG.Write(ex);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public void Monitor()
|
||
{
|
||
//if (!TcpSession.IsConnected)//如果未读取到数据,尝试重新连接
|
||
//{
|
||
// Close();
|
||
// Connect();
|
||
//return;
|
||
//}
|
||
//ReadData();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 终止
|
||
/// </summary>
|
||
public void Terminate()
|
||
{
|
||
try
|
||
{
|
||
Close();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
System.Diagnostics.Trace.WriteLine(ex.Message);
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 复位
|
||
/// </summary>
|
||
public void Reset()
|
||
{
|
||
|
||
if (!TcpSession.IsConnected)
|
||
{
|
||
jobThreadStop = false;
|
||
_thread = null;
|
||
Connect();
|
||
}
|
||
|
||
//IsNewStatus = true;
|
||
}
|
||
#endregion
|
||
|
||
const int BinSize = 7856;
|
||
void UpdateStatus(byte[] bin)
|
||
{
|
||
IntPtr hPack = Marshal.AllocHGlobal(BinSize);
|
||
|
||
Marshal.Copy(bin, 0, hPack, bin.Length);
|
||
|
||
Data.status = (BEI_SYSTEM_STATUS_EX)Marshal.PtrToStructure(hPack, typeof(BEI_SYSTEM_STATUS_EX));
|
||
|
||
SystemStatus.nStatus = Data.status.nStatus;
|
||
SystemStatus.dTemperatureAverageWaferInner = Data.status.WaferAvg_1;
|
||
SystemStatus.dTemperatureAverageWaferMiddle = Data.status.WaferAvg_2;
|
||
SystemStatus.dTemperatureAverageWaferOutter = Data.status.WaferAvg_3;
|
||
|
||
SystemStatus.dTemperatureAverageSusceptorInner = Data.status.SusAvg_1;
|
||
SystemStatus.dTemperatureAverageSusceptorMiddle = Data.status.SusAvg_2;
|
||
SystemStatus.dTemperatureAverageSusceptorOutter = Data.status.SusAvg_3;
|
||
|
||
|
||
int offset = Marshal.SizeOf(typeof(BEI_SYSTEM_STATUS_EX));
|
||
int sizeTemp = Marshal.SizeOf(typeof(TempData));
|
||
|
||
double reflectAvg = 0.0;
|
||
for (int i = 0; i < Data.zoneInner.Length; ++i)
|
||
{
|
||
Data.zoneInner[i] = (TempData)Marshal.PtrToStructure(hPack + offset + i * sizeTemp, typeof(TempData));
|
||
reflectAvg += Data.zoneInner[i].Para2;
|
||
}
|
||
|
||
SystemStatus.dReflectWaferAverageInner = reflectAvg / Data.zoneInner.Length;
|
||
|
||
reflectAvg = 0.0;
|
||
|
||
offset += Data.zoneInner.Length * sizeTemp;
|
||
|
||
for (int i = 0; i < Data.zoneMiddle.Length; ++i)
|
||
{
|
||
Data.zoneMiddle[i] = (TempData)Marshal.PtrToStructure(hPack + offset + i * sizeTemp, typeof(TempData));
|
||
reflectAvg += Data.zoneMiddle[i].Para2;
|
||
}
|
||
|
||
SystemStatus.dReflectWaferAverageMiddle = reflectAvg / Data.zoneMiddle.Length;
|
||
|
||
reflectAvg = 0.0;
|
||
|
||
offset += Data.zoneMiddle.Length * sizeTemp;
|
||
|
||
for (int i = 0; i < Data.zoneOuter.Length; ++i)
|
||
{
|
||
Data.zoneOuter[i] = (TempData)Marshal.PtrToStructure(hPack + offset + i * sizeTemp, typeof(TempData));
|
||
reflectAvg += Data.zoneOuter[i].Para2;
|
||
}
|
||
|
||
SystemStatus.dReflectWaferAverageOutter = reflectAvg / Data.zoneOuter.Length;
|
||
|
||
offset += Data.zoneOuter.Length * sizeTemp;
|
||
|
||
for (int i = 0; i < Data.zoneEx.Length; ++i)
|
||
{
|
||
Data.zoneEx[i] = (TempData)Marshal.PtrToStructure(hPack + offset + i * sizeTemp, typeof(TempData));
|
||
}
|
||
|
||
Marshal.FreeHGlobal(hPack);
|
||
}
|
||
}
|
||
}
|