C#
#region -- 温箱控制逻辑 --
public void StartTdControlTask()
{
if (refrechTdControlTask == null)
{
canRefresh = new CancellationTokenSource();
refrechTdControlTask = new Task(TdControlTask);
refrechTdControlTask.Start();
}
}
List<string> tdTask = new List<string>();
public void TdControlTask()
{
while (!canRefresh.IsCancellationRequested)
{
try
{
//遍历所有温箱映射关系
foreach (var obj in BAT.TD.TdBuffer.Instance.tdObject)
{
double stdTpt = 1000;
double dPc = 0;
//1.判断是否要调温
for (int i = 0; i < obj.BatName.Count; i++)
{
//判断ip是否正确
string sTempIp = obj.BatName[i];
if (sTempIp.Length < 9)
break;
if (tdTask.Contains(RealDataQueue[sTempIp].Addr + "-" + RealDataQueue[sTempIp].Chid))
break;
//判断配置的ip-设备-通道是否正确
if (obj.BatName[i].Split('-').Length < 2)
break;
//判断是否存在该通道,理论上一定存在
if (!RealDataBuffer.Instance.RealDataQueue.ContainsKey(sTempIp))
break;
if (RealDataQueue[sTempIp].RealtimeAuxData.auxtempperc == null)
{
continue;
}
#region -- 是否设置温箱温度 --
//所有通道处于停止、温箱配置、完成、断开链接状态才可以调温,其他不调温
if ((EnumState)RealDataBuffer.Instance.RealDataQueue[sTempIp].RealtimeData.stepname != EnumState.WaitTempDebug &&
(EnumState)RealDataBuffer.Instance.RealDataQueue[sTempIp].RealtimeData.status != EnumState.Stop &&
(EnumState)RealDataBuffer.Instance.RealDataQueue[sTempIp].RealtimeData.status != EnumState.Complete &&
(EnumState)RealDataBuffer.Instance.RealDataQueue[sTempIp].RealtimeData.status != EnumState.Disconnect)
break;
else
{
if (RealDataQueue[sTempIp].RealtimeAuxData.auxtempperc == null)
{
break;
}
}
//判断所有通道的温度设置是否一致
if ((EnumState)RealDataBuffer.Instance.RealDataQueue[sTempIp].RealtimeData.stepname == EnumState.WaitTempDebug)
{
string sStepParam1 = getParamStr(sTempIp);
if (sStepParam1.Trim() != "")
{
string[] str = sStepParam1.Split(',');
if (stdTpt == 1000 && i != obj.BatName.Count - 1)
{
stdTpt = double.Parse(str[0]);
dPc = double.Parse(str[1]);
continue;
}
else
{
stdTpt = double.Parse(str[0]);
dPc = double.Parse(str[1]);
}
if (double.Parse(str[0]) != stdTpt)
{
Console.WriteLine("同一个温箱下面的通道方案里的温度不同,请核对方案");
Log.Write("同一个温箱下面的通道方案里的温度不同,请核对方案");
stdTpt = 1000;
dPc = 0;
break;
}
}
}
//设置温箱
if (stdTpt != 1000 && i == obj.BatName.Count - 1)
{
Console.WriteLine(obj.ServerIp.ToString() + "控制溫箱溫度" + stdTpt.ToString());
TdBuffer.Instance.SetIncubatorTemp(RealDataQueue[sTempIp].Addr, RealDataQueue[sTempIp].Chid, stdTpt); //设置温度
Thread.Sleep(1000);
TdBuffer.Instance.SetIncubatorTemp(RealDataQueue[sTempIp].Addr, RealDataQueue[sTempIp].Chid, stdTpt); //设置温度
TdTestTask(obj, stdTpt, dPc);
}
#endregion
}
}
refrechUiEvent.WaitOne(Constants.DATA_FRESH_INTERVAL);
}
catch (Exception ex)
{
Debug.WriteLine("Lift:{0}", ex.StackTrace);
Log.Write(string.Format("{0}-{1}[{2}]", "TdControlTask", ex.Message, ex.StackTrace));
}
}
}
public void TdTestTask(TDObject obj, double stdTpt,double dPc)
{
for (int i = 0; i < obj.BatName.Count; i++)
{
string sTempIp = obj.BatName[i];
#region -- 继续指令 --
//增加綫程任務
if (!tdTask.Contains(RealDataQueue[sTempIp].Addr + "-" + RealDataQueue[sTempIp].Chid)
&& (EnumState)RealDataBuffer.Instance.RealDataQueue[sTempIp].RealtimeData.stepname == EnumState.WaitTempDebug)
{
tdTask.Add(RealDataQueue[sTempIp].Addr + "-" + RealDataQueue[sTempIp].Chid);
Thread.Sleep(1000);
Task.Factory.StartNew(() =>
{
Console.WriteLine("添加綫程:" + sTempIp);
//創建時鐘
Stopwatch stopWath = new Stopwatch();
stopWath.Start();
while (true)
{
Thread.Sleep(1000);
//Console.WriteLine("時間:" + stopWath.ElapsedMilliseconds.ToString());
if ((EnumState)RealDataBuffer.Instance.RealDataQueue[sTempIp].RealtimeData.stepname != EnumState.WaitTempDebug)
{
tdTask.Remove(RealDataQueue[sTempIp].Addr + "-" + RealDataQueue[sTempIp].Chid);
break;
}
//判斷溫度是否到達 并且時間到達30分鐘
double dTdTmp = RealDataQueue[sTempIp].RealtimeAuxData.auxtempperc[0] / 1000.000;
double hldTmp = TdBuffer.Instance.GetIncubatorTemp(RealDataQueue[sTempIp].Addr, RealDataQueue[sTempIp].Chid);
//Console.WriteLine("dTdTmp:" + dTdTmp.ToString());
//Console.WriteLine("stdTpt:" + stdTpt.ToString());
//Console.WriteLine("dPc:" + dPc.ToString());
//Console.WriteLine("hldTmp:" + hldTmp.ToString());
if ((dTdTmp >= (stdTpt - dPc) && dTdTmp <= (stdTpt + dPc)) &&
(hldTmp >= (stdTpt - 0.5) && hldTmp <= (stdTpt + 0.5)))
{
if (stopWath.ElapsedMilliseconds >= 180000)
{
Console.WriteLine("繼續指令:" + stopWath.ElapsedMilliseconds.ToString());
ActionBase action = new JumpAction(null, 0);
List<object> param = new List<object>();
List<ChannelObject> lstSelect = new List<ChannelObject>();
lstSelect.Clear();
lstSelect.Add(RealDataQueue[sTempIp]);
param.Clear();
Command command = new Command(EnmuControl.Jump, lstSelect, 0);
command.stepguid = "0"; //currentObject.Stepguid;
command.stepguid = command.stepguid.Replace("\0", "").Trim();
param.Add(command);
action.doAction(param, RealDataQueue[sTempIp].Addr, RealDataQueue[sTempIp].Chid);
Console.WriteLine("移除綫程:" + RealDataQueue[sTempIp].Addr + "-" + RealDataQueue[sTempIp].Chid);
// Console.WriteLine("耗時:" + stopWath.ElapsedMilliseconds.ToString());
tdTask.Remove(RealDataQueue[sTempIp].Addr + "-" + RealDataQueue[sTempIp].Chid);
break;
}
}
else
stopWath.Restart();
}
}
);
}
#endregion
}
}