using Aitex.Common.Util;
using Aitex.Core.Common.DeviceData;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Device.Unit;
using Aitex.Core.RT.Routine;
using Aitex.Core.Util;
using FurnaceRT.Equipments.PMs.Devices;
using FurnaceRT.Instances;
using HslCommunication.Profinet.Panasonic;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
namespace FurnaceRT.Extraction
{
///
/// RT模块中重复方法抽离
///
public class ExtractionMethods
{
public static string systemSCFile = PathManager.GetCfgDir() + $"System.sccfg";
public static Dictionary> AllNameKeyDict = new Dictionary>();
public static Dictionary RecipeExecIoValve = new Dictionary() { };
public static Dictionary RecipeExecIoMFC = new Dictionary() { };
///
/// 解析DeviceModelDefine文件 指定类型节点下的ids
///
///
public static Dictionary> GetNameKeyDict(List typeNames)
{
Dictionary> result = new Dictionary>();
foreach (string name in typeNames)
{
if (result.ContainsKey(name)) continue;
result.Add(name, new List());
}
GetXmlElement("DeviceModelPM", result);
GetXmlElement("DeviceModelHeater", result, true);
GetXmlElement("DeviceModelGasLine", result);
return result;
}
public static void GetXmlElement(string fileName, Dictionary> result, bool isSystem = false)
{
XmlDocument xmlDoc = new XmlDocument();
var cfDirPath = PathManager.GetCfgDir();
var path = cfDirPath + $"IO\\{fileName}.xml";
if (!File.Exists(path)) return;
xmlDoc.Load(path);
XmlNode node = xmlDoc.SelectSingleNode("DeviceModelDefine");
foreach (XmlNode item in node.ChildNodes)
{
if (item.NodeType != XmlNodeType.Element) continue;
var element = item as XmlElement;
var classType = element.GetAttribute("classType");
if (classType == null) continue;
classType = classType.Split('.').LastOrDefault();
if (!result.Keys.Contains(classType)) continue;
foreach (XmlNode children in item.ChildNodes)
{
if (children is XmlElement childElement)
{
if (result[classType].Contains(childElement.GetAttribute("id"))) continue;
var key = isSystem ? $"System.{childElement.GetAttribute("id")}.DeviceData" : $"PM1.{childElement.GetAttribute("id")}.DeviceData";
result[classType].Add(key);
}
}
}
}
public static void InitRecipeIoValve()
{
XmlDocument xmlDoc = new XmlDocument();
var cfDirPath = PathManager.GetCfgDir();
var path = cfDirPath + $"GasXml\\GasViewXml.xml";
if (!File.Exists(path))
{
return;
}
xmlDoc.Load(path);
XmlNodeList boolConditions = xmlDoc.SelectNodes("//BoolCondition");
if (boolConditions == null)
return;
foreach (XmlNode condition in boolConditions)
{
if (string.IsNullOrEmpty(condition.InnerText) || !condition.InnerText.Contains("Valve") || condition.InnerText.Contains("ILKValue"))
continue;
var cleanedString = new string(condition.InnerText.Where(c => !char.IsWhiteSpace(c)).ToArray());
var valveName = cleanedString.Replace("return", "").Trim().Split('.')[1];
if (RecipeExecIoValve.ContainsKey(valveName))
continue;
IDevice device = DEVICE.GetDevice($"PM1.{valveName}");
if (device == null)
continue;
RecipeExecIoValve.Add(valveName, device as IoValve);
}
}
public static void InitRecipeIoMFC()
{
XmlDocument xmlDoc = new XmlDocument();
var cfDirPath = PathManager.GetCfgDir();
var path = cfDirPath + $"GasXml\\GasViewXml.xml";
if (!File.Exists(path))
{
return;
}
XDocument doc = XDocument.Load(path);
// 查找Analogs节点下的所有Analog节点
var analogs = doc.Descendants("Analog");
foreach (var analog in analogs)
{
// 检查Analog节点的Enable属性是否为True
if (analog.Attribute("Enable")?.Value == "True")
{
var topButton = analog.Element("TopButton");
if (topButton != null)
{
var innerText = topButton.Element("InnerText");
if (innerText != null)
{
string textContent = innerText.Attribute("Text")?.Value;
var mfcName = $"MFC{textContent}";
if (RecipeExecIoMFC.ContainsKey(mfcName))
{
continue;
}
IDevice device = DEVICE.GetDevice($"PM1.{mfcName}");
if (device == null)
continue;
RecipeExecIoMFC.Add(mfcName, device as IoMFC);
}
}
}
}
}
///
/// 根据xml配置获取N2PurgeSequenceAction配置
///
///
public static Dictionary>>> GetN2PurgeSequenceAction()
{
Dictionary>>> result = new Dictionary>>>();
XDocument doc = XDocument.Load(ExtractionMethods.systemSCFile);
var pmNode = doc.Root.Elements("configs")
.Where(x => (string)x.Attribute("name") == "PM1")
.FirstOrDefault();
var nameGroup = pmNode.Elements("configs")
.Where(x => (string)x.Attribute("name") == "N2Purge")
.FirstOrDefault()
.Elements("configs")
.GroupBy(a => (string)a.Attribute("name"));
var pM1N2PurgeNodeChildren = nameGroup.ToDictionary(a => a.Key, a => a.ToList().FirstOrDefault());
foreach (var xmlItem in pM1N2PurgeNodeChildren)
{
var configElements = xmlItem.Value.Elements("config").ToList();
var resultItem = new List>();
foreach (var valveConfig in configElements)
{
if (valveConfig != null &&
valveConfig.Attribute("name") != null &&
valveConfig.Attribute("default") != null)
{
string name = (string)valveConfig.Attribute("name");
var defaultValue = (string)valveConfig.Attribute("default");
var deviceItem = DEVICE.GetDevice($"PM1.{name}");
if (deviceItem == null)
continue;
var item = Tuple.Create(deviceItem, defaultValue);
resultItem.Add(item);
}
}
result.Add(xmlItem.Key, Tuple.Create(new R_TRIG(), resultItem));
}
return result;
}
}
}