You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

702 lines
28 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using Mesnac.Equips.BaseInfo;
using System.Xml;
namespace Mesnac.Equips.SetConfig
{
/// <summary>
/// 设备配置类,在平台设计环境中保存设备配置
/// </summary>
public class ConfigEquip : BaseEquip
{
#region 扩展字段
private bool _isEnableGroup = false;
private string _groupRange = String.Empty;
#endregion
#region 扩展属性
/// <summary>
/// 是否启用设备群组
/// </summary>
public bool IsEnableGroup
{
get { return _isEnableGroup; }
set { _isEnableGroup = value; }
}
/// <summary>
/// 设备群组范围
/// </summary>
public string GroupRange
{
get { return _groupRange; }
set { _groupRange = value; }
}
#endregion
#region 方法重载
public override bool Open()
{
return false;
}
public override bool Read(string block, int start, int len, out object[] buff)
{
buff = null;
return false;
}
public override bool Write(int block, int start, object[] buff)
{
return false;
}
public override void Close()
{
}
#endregion
}
public class ConfigEquipFactory
{
private string _configFile = string.Empty;
private string _projectWizardName = string.Empty;
public ConfigEquipFactory(string _configFile, string _projectWizardName)
{
this._configFile = _configFile;
this._projectWizardName = _projectWizardName;
this.AllEquips = new Dictionary<string, ConfigEquip>();
this.AllEquips.Clear();
}
public string ProjectWizardName { get { return _projectWizardName; } }
public Dictionary<string, ConfigEquip> AllEquips { get; set; }
public event EventHandler OnCurrentEquipChange;
public event EventHandler OnCurrentGroupChange;
public event EventHandler OnCurrentDataChange;
private ConfigEquip _currentEquip = null;
public ConfigEquip CurrentEquip
{
get
{
return _currentEquip;
}
set
{
if (_currentEquip != value)
{
_currentEquip = value;
this.CurrentGroup = null;
this.CurrentData = null;
if (OnCurrentEquipChange != null)
{
OnCurrentEquipChange(value, EventArgs.Empty);
}
}
}
}
private Mesnac.Equips.BaseInfo.Group _currentGroup = null;
public Mesnac.Equips.BaseInfo.Group CurrentGroup
{
get
{
return _currentGroup;
}
set
{
if (_currentGroup != value)
{
_currentGroup = value;
this.CurrentData = null;
if (OnCurrentGroupChange != null)
{
OnCurrentEquipChange(value, EventArgs.Empty);
}
}
}
}
private Mesnac.Equips.BaseInfo.Data _currentData = null;
public Mesnac.Equips.BaseInfo.Data CurrentData
{
get
{
return _currentData;
}
set
{
if (_currentData != value)
{
_currentData = value;
}
if (OnCurrentDataChange != null)
{
OnCurrentDataChange(value, EventArgs.Empty);
}
}
}
public void SaveConfig()
{
if (string.IsNullOrWhiteSpace(_configFile))
{
return;
}
if (!Directory.Exists(Path.GetDirectoryName(_configFile)))
{
Directory.CreateDirectory(Path.GetDirectoryName(_configFile));
}
XmlDocument xmlDocument = new XmlDocument();
XmlTextWriter xtw = new XmlTextWriter(_configFile, Encoding.UTF8);
xtw.WriteStartDocument();
xtw.WriteStartElement("EquipFactory");
xtw.WriteEndElement();
xtw.WriteEndDocument();
xtw.Close();
xmlDocument.Load(_configFile);
XmlNode xn = xmlDocument.DocumentElement;
foreach (ConfigEquip equip in this.AllEquips.Values)
{
XmlElement xe_equip = xmlDocument.CreateElement("Equip");
xe_equip.SetAttribute("name", equip.Name.Trim());
if (equip.Project == null)
{
xe_equip.SetAttribute("project", string.Empty);
}
else
{
xe_equip.SetAttribute("project", equip.Project.Trim());
}
#region 郑立兵于2015-01-19增加用于保存群组设备的配置至配置文件中
if (equip.IsEnableGroup)
{
xe_equip.SetAttribute("isEnableGroup", "True");
if (String.IsNullOrEmpty(equip.GroupRange))
{
xe_equip.SetAttribute("groupRange", "1");
}
else
{
xe_equip.SetAttribute("groupRange", equip.GroupRange.Trim());
}
}
#endregion
xn.AppendChild(xe_equip);
#region Main
XmlElement xe_main = xmlDocument.CreateElement("Main");
xe_equip.AppendChild(xe_main);
XmlElement xe_main_child = xmlDocument.CreateElement("Brand");
xe_main_child.SetAttribute("value", equip.Main.Brand);
xe_main.AppendChild(xe_main_child);
xe_main_child = xmlDocument.CreateElement("Model");
xe_main_child.SetAttribute("value", equip.Main.Model);
xe_main.AppendChild(xe_main_child);
xe_main_child = xmlDocument.CreateElement("ReadHz");
xe_main_child.SetAttribute("value", equip.Main.ReadHz.ToString());
xe_main.AppendChild(xe_main_child);
xe_main_child = xmlDocument.CreateElement("UnitLen");
xe_main_child.SetAttribute("value", equip.Main.UnitLen.ToString());
xe_main.AppendChild(xe_main_child);
xe_main_child = xmlDocument.CreateElement("Connection");
xe_main_child.SetAttribute("mode", equip.Main.ConnType.Name.ToString());
xe_main.AppendChild(xe_main_child);
#region 连接属性
PropertyInfo[] piList = (equip.Main.ConnType.GetType()).GetProperties();
foreach (PropertyInfo pi in piList)
{
if (pi.Name.Equals("Name", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
if (pi.Name.Equals("Connection", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
XmlElement xe_info = xmlDocument.CreateElement(pi.Name);
string ssValue = string.Empty;
if (pi.GetValue(equip.Main.ConnType, null) != null)
{
ssValue = pi.GetValue(equip.Main.ConnType, null).ToString();
}
xe_info.SetAttribute("value", ssValue.Trim());
xe_main_child.AppendChild(xe_info);
}
#endregion
#endregion
#region Group
XmlElement xe_groups = xmlDocument.CreateElement("Group");
xe_equip.AppendChild(xe_groups);
foreach (Group group in equip.Group.Values)
{
XmlElement xe_group = xmlDocument.CreateElement("Group");
xe_groups.AppendChild(xe_group);
PropertyInfo[] group_pilst = (group.GetType()).GetProperties();
foreach (PropertyInfo pi in group_pilst)
{
if (pi.Name.Equals("value", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
if (pi.Name.Equals("Data", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
if (pi.Name.Equals("equip", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
xe_group.SetAttribute(pi.Name.ToLower(), pi.GetValue(group, null).ToString().Trim());
}
XmlElement xe_datas = xmlDocument.CreateElement("Data");
xe_group.AppendChild(xe_datas);
foreach (Data data in group.Data.Values)
{
XmlElement xe_data = xmlDocument.CreateElement("Data");
xe_datas.AppendChild(xe_data);
PropertyInfo[] data_pilst = (data.GetType()).GetProperties();
foreach (PropertyInfo pi in data_pilst)
{
if (pi.Name.Equals("value", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
if (pi.Name.Equals("group", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
if (pi.Name.Equals("ReadTime", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
if (pi.Name.Equals("LastBeforeMathValue", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
if (pi.Name.Equals("keyname", StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
string ssValue = string.Empty;
if (pi.GetValue(data, null) != null)
{
ssValue = pi.GetValue(data, null).ToString();
}
xe_data.SetAttribute(pi.Name.ToLower(), ssValue.Trim());
}
}
}
#endregion
}
xmlDocument.Save(_configFile);
}
private bool GetNodeAttributeValue(XmlNode node, string attribute, bool throwException, out string value)
{
value = string.Empty;
try
{
XmlAttribute a = node.Attributes[attribute.ToLower()];
if (a != null && a.Value != null)
{
value = a.Value.ToString().Trim();
}
}
catch (Exception ex)
{
if (throwException)
{
throw (ex);
}
return false;
}
return true;
}
private bool GetFirstNodeValue(XmlNode node, string path, string attribute, bool throwException, out string value)
{
value = string.Empty;
try
{
XmlNode a = node.SelectSingleNode(path);
if (a != null)
{
GetNodeAttributeValue(a, attribute, throwException, out value);
}
}
catch (Exception ex)
{
if (throwException)
{
throw (ex);
}
return false;
}
return true;
}
private readonly string _deviceBasePath = "\\Data\\DeviceConfig"; //设备接口基本目录
private BaseEquip ToEquip(BaseEquip baseEquip)
{
string thisPath = this.GetType().Assembly.Location;
string assPath = (new FileInfo(thisPath)).Directory + this._deviceBasePath + "\\Mesnac.Equips\\";
string dllName = "Mesnac.Equip." + baseEquip.Main.Brand.Trim();
string path = assPath + dllName + "\\" + dllName + ".dll";
string className = "Mesnac.Equip." + baseEquip.Main.Brand.Trim() + "."
+ baseEquip.Main.Model.Trim() + "."
+ baseEquip.Main.ConnType.Name.Trim() + ".Equip";
if (!File.Exists(path))
{
return baseEquip;
}
Assembly ass = Assembly.LoadFile(path);
if (ass == null)
{
return baseEquip;
}
Type type = ass.GetType(className);
if (type == null)
{
return baseEquip;
}
var obj = ass.CreateInstance(className, true);
BaseEquip to = (BaseEquip)Activator.CreateInstance(type);
if (to == null)
{
return baseEquip;
}
to.Name = baseEquip.Name;
to.Project = baseEquip.Project;
to.Main = baseEquip.Main;
to.Group = baseEquip.Group;
foreach (Group group in to.Group.Values)
{
group.Equip = to;
}
return to;
}
/// <summary>
///
/// </summary>
/// <param name="isConfigEquip"></param>
/// <returns></returns>
private Dictionary<string, BaseEquip> ReadBaseEquip(bool isConfigEquip)
{
Dictionary<string, BaseEquip> Result = new Dictionary<string, BaseEquip>();
if (!File.Exists(this._configFile))
{
return Result;
}
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(this._configFile);
foreach (XmlNode factoryNode in xmlDocument)
{
if (factoryNode.Name == "EquipFactory")
{
foreach (XmlNode EquipNode in factoryNode.ChildNodes)
{
string equipNameStr = EquipNode.Attributes["name"].Value.ToString();
ParseEquip(equipNameStr, isConfigEquip, Result, EquipNode);
}
}
}
return Result;
}
/// <summary>
/// 从Xml配置文件中解析设备
/// </summary>
/// <param name="equipName"></param>
/// <param name="isConfigEquip"></param>
/// <param name="Result"></param>
/// <param name="EquipNode"></param>
private void ParseEquip(string equipName, bool isConfigEquip, Dictionary<string, BaseEquip> Result, XmlNode EquipNode)
{
ConfigEquip equip = new ConfigEquip();
equip.Name = equipName;
equip.Project = EquipNode.Attributes["project"].Value.ToString();
#region 郑立兵于2014-01-19扩展用于解析设备的群组配置
if (null == EquipNode.Attributes["isEnableGroup"] || String.IsNullOrEmpty(EquipNode.Attributes["isEnableGroup"].Value))
{
equip.IsEnableGroup = false;
equip.GroupRange = String.Empty;
}
else
{
string strIsEnableGroup = EquipNode.Attributes["isEnableGroup"].Value.Trim();
bool isEnableGroup = false;
bool.TryParse(strIsEnableGroup, out isEnableGroup);
equip.IsEnableGroup = isEnableGroup;
if (null == EquipNode.Attributes["groupRange"])
{
equip.GroupRange = String.Empty;
}
else
{
string strGroupRange = EquipNode.Attributes["groupRange"].Value.Trim();
if (!String.IsNullOrEmpty(strGroupRange))
{
equip.GroupRange = strGroupRange;
}
}
}
#endregion
#region Main
string ss = string.Empty;
equip.Main.Equip = equip;
GetFirstNodeValue(EquipNode, ".//Main//Brand[@value]", "value", true, out ss);
equip.Main.Brand = ss;
GetFirstNodeValue(EquipNode, ".//Main//Model[@value]", "value", true, out ss);
equip.Main.Model = ss;
GetFirstNodeValue(EquipNode, ".//Main//ReadHz[@value]", "value", true, out ss);
int strToInt = 0;
if (int.TryParse(ss, out strToInt))
{
equip.Main.ReadHz = strToInt;
}
GetFirstNodeValue(EquipNode, ".//Main//UnitLen[@value]", "value", true, out ss);
strToInt = 0;
if (int.TryParse(ss, out strToInt))
{
equip.Main.UnitLen = strToInt;
}
GetFirstNodeValue(EquipNode, ".//Main//Connection[@mode]", "mode", true, out ss);
equip.Main.ConnType = Mesnac.Equips.Connection.Factory.Instance.GetConfig(EquipNode.SelectNodes(".//Main//Connection[@mode]")[0]);
//add by yinzf 2017-07-03 如果是default格式填写ip地址信息
//var Conntype=equip.Main.ConnType as Mesnac.Equips.Connection.Default.ConnType;
//if(Conntype!=null)
//{
// GetFirstNodeValue(EquipNode, ".//Main//Connection//IP[@value]", "value", true, out ss);
// Conntype.IP=ss;
// equip.Main.ConnType=Conntype;
//}
//end add
#endregion
#region Group
XmlNodeList groupNodes = EquipNode.SelectNodes(".//Group")[0].ChildNodes;
foreach (XmlNode groupNode in groupNodes)
{
Group group = new Group();
group.Equip = equip;
GetNodeAttributeValue(groupNode, "name", true, out ss);
group.Name = ss;
GetNodeAttributeValue(groupNode, "remark", false, out ss);
group.Remark = ss;
GetNodeAttributeValue(groupNode, "start", true, out ss);
group.Start = Convert.ToInt32(ss);
GetNodeAttributeValue(groupNode, "block", true, out ss);
group.Block = ss;
GetNodeAttributeValue(groupNode, "len", true, out ss);
group.Len = Convert.ToInt32(ss);
GetNodeAttributeValue(groupNode, "isautoread", false, out ss);
group.IsAutoRead = true;
if (ss.ToLower() == "false" ||
ss == "0")
{
group.IsAutoRead = false;
}
GetNodeAttributeValue(groupNode, "access", false, out ss);
group.Access = System.IO.FileAccess.ReadWrite;
if (string.IsNullOrEmpty(ss))
{
ss = "ReadWrite";
}
if (ss.Equals("Read", StringComparison.CurrentCultureIgnoreCase))
{
group.Access = System.IO.FileAccess.Read;
}
if (ss.Equals("Write", StringComparison.CurrentCultureIgnoreCase))
{
group.Access = System.IO.FileAccess.Write;
}
equip.Group.Add(group.Name, group);
#region Data
XmlNodeList dataNodes = groupNode.SelectNodes(".//Data")[0].ChildNodes;
foreach (XmlNode node in dataNodes)
{
Data data = new Data();
data.Group = group;
GetNodeAttributeValue(node, "name", true, out ss);
data.Name = ss;
data.KeyName = equip.Name + "." + group.Name + "." + data.Name;
GetNodeAttributeValue(node, "remark", false, out ss);
data.Remark = ss;
GetNodeAttributeValue(node, "runname", false, out ss);
data.RunName = ss;
if (GetNodeAttributeValue(node, "max", false, out ss))
{
double d = 0;
if (double.TryParse(ss, out d))
{
data.Max = d.ToString();
}
}
if (GetNodeAttributeValue(node, "subtractor", false, out ss))
{
double d = 0;
if (double.TryParse(ss, out d))
{
data.Subtractor = d.ToString();
}
}
GetNodeAttributeValue(node, "start", true, out ss);
data.Start = Convert.ToInt32(ss);
GetNodeAttributeValue(node, "len", true, out ss);
data.Len = Convert.ToInt32(ss);
GetNodeAttributeValue(node, "method", false, out ss);
data.Method = ss;
GetNodeAttributeValue(node, "issave", false, out ss);
if (!string.IsNullOrWhiteSpace(ss))
{
data.IsSave = ss.ToLower().Trim() == "true";
}
group.Data.Add(data.Name, data);
}
#endregion
}
#endregion
#region 郑立兵于2014-01-19修改用于解析设备群组通过一个设备组配置生成多个设备
if (!isConfigEquip)
{
BaseEquip baseEquip = ToEquip(equip as BaseEquip);
if (equip.IsEnableGroup)
{
string[] nameIndexes = EquipTools.GetNameIndexFromRange(equip.GroupRange);
if (nameIndexes != null && nameIndexes.Length > 0)
{
foreach (string nameIndex in nameIndexes)
{
string keyName = equip.Name + nameIndex;
BaseEquip newEquip = new ConfigEquip();
newEquip.Name = keyName;
newEquip.Project = equip.Project;
newEquip.Main.Brand = equip.Main.Brand;
newEquip.Main.ConnType = equip.Main.ConnType;
newEquip.Main.Model = equip.Main.Model;
newEquip.Main.ReadHz = equip.Main.ReadHz;
newEquip.Main.UnitLen = equip.Main.UnitLen;
newEquip.Main.Equip = newEquip;
newEquip = ToEquip(newEquip);
foreach (string groupkey in equip.Group.Keys)
{
Group g = new Group();
g.Access = equip.Group[groupkey].Access;
g.Block = equip.Group[groupkey].Block;
g.Equip = newEquip;
g.IsAutoRead = equip.Group[groupkey].IsAutoRead;
g.Len = equip.Group[groupkey].Len;
g.Name = equip.Group[groupkey].Name;
g.Remark = equip.Group[groupkey].Remark;
g.Start = equip.Group[groupkey].Start;
//g.Value = equip.Group[groupkey].Value;
foreach (string datakey in equip.Group[groupkey].Data.Keys)
{
Data d = new Data();
d.Group = g;
d.IsSave = equip.Group[groupkey].Data[datakey].IsSave;
d.KeyName = newEquip.Name + equip.Group[groupkey].Data[datakey].KeyName.Substring(equip.Group[groupkey].Data[datakey].KeyName.IndexOf("."));
d.LastBeforeMathValue = equip.Group[groupkey].Data[datakey].LastBeforeMathValue;
d.Len = equip.Group[groupkey].Data[datakey].Len;
d.Max = equip.Group[groupkey].Data[datakey].Max;
d.Method = equip.Group[groupkey].Data[datakey].Method;
d.Name = equip.Group[groupkey].Data[datakey].Name;
d.ReadTime = equip.Group[groupkey].Data[datakey].ReadTime;
d.Remark = equip.Group[groupkey].Data[datakey].Remark;
d.RunName = equip.Group[groupkey].Data[datakey].RunName;
d.Start = equip.Group[groupkey].Data[datakey].Start;
d.Subtractor = equip.Group[groupkey].Data[datakey].Subtractor;
//d.Value = equip.Group[groupkey].Data[datakey].Value;
g.Data.Add(datakey, d);
}
newEquip.Group.Add(groupkey, g);
}
Result.Add(keyName, newEquip);
}
}
else
{
Result.Add(equip.Name, equip);
}
}
else
{
Result.Add(baseEquip.Name, baseEquip);
}
}
else
{
Result.Add(equip.Name, equip);
}
#endregion
}
public void ReadConfig()
{
if (!File.Exists(_configFile))
{
return;
}
this.AllEquips.Clear();
this.CurrentEquip = null;
this.CurrentGroup = null;
this.CurrentData = null;
Dictionary<string, BaseEquip> Result = new Dictionary<string, BaseEquip>();
Result = ReadBaseEquip(true);
foreach (BaseEquip baseEquip in Result.Values)
{
this.AllEquips.Add(baseEquip.Name, (ConfigEquip)baseEquip);
}
}
public Dictionary<string, BaseEquip> GetBaseEquip()
{
Dictionary<string, BaseEquip> Result = new Dictionary<string, BaseEquip>();
if (!File.Exists(_configFile))
{
return Result;
}
Result = ReadBaseEquip(false);
return Result;
}
public Dictionary<string, ConfigEquip> GetAllConfigEquip()
{
if (File.Exists(_configFile))
{
this.AllEquips.Clear();
this.CurrentEquip = null;
this.CurrentGroup = null;
this.CurrentData = null;
Dictionary<string, BaseEquip> Result = new Dictionary<string, BaseEquip>();
Result = ReadBaseEquip(true);
foreach (BaseEquip baseEquip in Result.Values)
{
this.AllEquips.Add(baseEquip.Name, (ConfigEquip)baseEquip);
}
}
return this.AllEquips;
}
}
}