DeviceConfig.cs 11.7 KB
using log4net;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
 
namespace OnlineStore.LoadCSVLibrary
{
    public class DeviceConfig
    {
        /// <summary>
        /// ID
        /// </summary>
        public int Id { get; set; } 
        /// <summary>
        /// 设备类型
        /// </summary>
        public string DType { get; set; }
        /// <summary>
        /// 配置文件路径
        /// </summary>
        public string ConfigFilePath { get; set; }

        public Dictionary<String, ConfigIO> DIList { get; set; } = new Dictionary<string, ConfigIO>();

        public Dictionary<String, ConfigIO> DOList { get; set; } = new Dictionary<string, ConfigIO>();
        public List<ConfigMoveAxis> moveAxisList = new List<ConfigMoveAxis>();
        public List<ConfigBase> configList = new List<ConfigBase>();
        public static Dictionary<String, ConfigIO> AllDOlist { get; set; }
        public static Dictionary<String, ConfigIO> AllDOEleclist { get; set; }

        public DeviceConfig()
        {
         
        }
        static DeviceConfig()
        {
            AllDOlist = new Dictionary<string, ConfigIO>();
            AllDOEleclist = new Dictionary<string, ConfigIO>();
        }
        public DeviceConfig(int id , string type, string filepath)
        { 
          
            this.Id = id; 
            this.DType = type;
            this.ConfigFilePath = filepath;
        }
        public virtual void LoadConfig(List<ConfigBase> configList)
        {
            this.configList.AddRange(configList);
            List<string> ioTypeList = IO_Type.GetTypeList();

            StringBuilder builder = new StringBuilder("\r\n");
            StringBuilder proBuilder = new StringBuilder("\r\n");
            //DIList = new Dictionary<string, ConfigIO>();
            //DOList = new Dictionary<string, ConfigIO>(); 
            //moveAxisList = new List<ConfigMoveAxis>();

            //取得属性集合
            PropertyInfo[] props = GetType().GetProperties();
            Dictionary<string, string> proMap = CSVReaderBase.getConfigProAttributeMap(GetType());

            List<string> checkProList = new List<string>(proMap.Keys);//用来检测attribute属性都应该要配置值
            foreach (ConfigBase con in configList)
            {
                try
                {
                    if (con.ProType == ConfigItemType.AXIS || con.ProType == ConfigItemType.PRO)
                    {
                        if (proMap.ContainsKey(con.ProName))
                        {
                            string proName = proMap[con.ProName];
                            checkProList.Remove(con.ProName);
                            PropertyInfo prop = props.First(c => c.Name == proName);//获取同名属性
                            if (prop != null)
                            {
                                if (con.ProType == ConfigItemType.AXIS)
                                {
                                    //如果属性存在
                                    prop.SetValue(this, Convert.ChangeType(con, prop.PropertyType), null);//赋值****在这里需要考虑类型问题
                                    ConfigMoveAxis axis = (ConfigMoveAxis)con;
                                    moveAxisList.Add(axis);

                                }
                                else if (con.ProType == ConfigItemType.PRO)
                                {
                                    prop.SetValue(this, Convert.ChangeType(con.ProValue, prop.PropertyType));//赋值 
                                    if (con.TargetSpeed > 0)
                                    {
                                        if (proMap.ContainsKey(proName + "_speed"))
                                        {
                                            checkProList.Remove(proName + "_speed");
                                            PropertyInfo speedprop = props.First(c => c.Name == proName + "_speed");
                                            if (speedprop != null)
                                            {
                                                speedprop.SetValue(this, Convert.ChangeType(con.TargetSpeed, typeof(int)));
                                            }
                                        }
                                        else
                                        {
                                            AddProSpeedBuffer(con, proBuilder);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                LogUtil.error("配置文件:" + this.ConfigFilePath + ",属性名=" + con.ProName + "的属性未找到匹配字段!");
                            }
                        }
                        else
                        {
                            AddProBuffer(con, proBuilder);
                            LogUtil.error("配置文件:" + this.ConfigFilePath + ",属性名=" + con.ProName + "的属性未找到匹配字段!");
                        }
                    }

                    else if (con.ProType == ConfigItemType.DI)
                    {
                        ConfigIO io = (ConfigIO)con;
                        if (DIList.ContainsKey(io.ProName))
                        {
                            LogUtil.debug("配置DI:[" + io.ToString() + "] ProName重复 ");
                        }
                        else
                        {
                            this.DIList.Add(con.ProName, io);
                        }

                        if (!ioTypeList.Contains(con.ProName))
                        {
                            AddBuffer(con, builder);
                        }

                    }
                    else if (con.ProType == ConfigItemType.DO)
                    {
                        ConfigIO io = (ConfigIO)con;
                        if (DOList.ContainsKey(io.ProName))
                        {
                            LogUtil.debug("配置DO:[" + io.ToString() + "] ProName重复 ");
                        }
                        else
                        {
                            this.DOList.Add(con.ProName, io);
                            if (!AllDOlist.ContainsKey(con.ProName))
                                AllDOlist.Add(con.ProName, io);
                            if (!AllDOEleclist.ContainsKey(io.ElectricalDefinition))
                                AllDOEleclist.Add(io.ElectricalDefinition, io);
                        }
                        if (!ioTypeList.Contains(con.ProName))
                        {
                            AddBuffer(con, builder);
                        }
                    }
                }catch(Exception ex)
                {
                    LogUtil.error("解析配置【"+con.ConfigStr+"】出错:" + ex.ToString());
                    throw new Exception("解析配置【" + con.ConfigStr + "】出错");
                }
            }
            if (String.IsNullOrEmpty(proBuilder.ToString()).Equals(false) && proBuilder.ToString().Equals("\r\n").Equals(false))
            {
                LogUtil.error(proBuilder.ToString());
                Console.Write(proBuilder.ToString());
            }
            if (String.IsNullOrEmpty(builder.ToString()).Equals(false) && builder.ToString().Equals("\r\n").Equals(false))
            {
                LogUtil.error(builder.ToString());
                Console.Write(builder.ToString());
            }
            if (checkProList.Count >= 0)
            {
                //常规属性检测
                foreach (string str in checkProList)
                {
                    PropertyInfo prop = props.First(c => c.Name == str);//获取同名属性
                                                                        //判断是否必须要配置
                    object[] array = prop.GetCustomAttributes(false);
                    if (array.Length > 0)
                    {
                        ConfigProAttribute att = (ConfigProAttribute)array[0];
                        if (att != null)
                        {
                            if (att.IsMust)
                            {
                                throw new CVSFieldNotMatchingExection(this.ToString() + "的属性【" + str + "】必须配置值!");
                            }
                            else
                            {
                                if (prop.PropertyType.Equals(typeof(int)))
                                {
                                    prop.SetValue(this, Convert.ChangeType(0, prop.PropertyType), null);//赋值****在这里需要考虑类型问题
                                }
                                else
                                {
                                    prop.SetValue(this, Convert.ChangeType("", prop.PropertyType), null);//赋值****在这里需要考虑类型问题
                                }
                            }
                        }
                    }
                }
              
                ////DI检测
                //foreach (string di in MustHaveDIList)
                //{
                //    if (!DIList.ContainsKey(di))
                //    {
                //        throw new CVSFieldNotMatchingExection(this.ToString() + "的DI属性" + di + "必须配置值!");
                //    }
                //}

                ////DO检测
                //foreach (string io in MustHaveDOList)
                //{
                //    if (!this.DOList.ContainsKey(io))
                //    {
                //        throw new CVSFieldNotMatchingExection(this.ToString() + "的DO属性" + io + "必须配置值!");
                //    }
                //}

            }
        }
        private void AddProBuffer(ConfigBase con, StringBuilder builder)
        {
            builder.Append(" /// <summary>\r\n");
            builder.Append(" ///  " + con.ConfigStr + "\r\n");
            builder.Append(" /// </summary>\r\n");
            builder.Append(" [ConfigProAttribute(\"" + con.ProName + "\")]\r\n");
            builder.Append(" public int " + con.ProName + "  { get; set; }\r\n");
        }
        private void AddProSpeedBuffer(ConfigBase con, StringBuilder builder)
        {
            builder.Append(" /// <summary>\r\n");
            builder.Append(" ///  " + con.ConfigStr + "\r\n");
            builder.Append(" /// </summary>\r\n");
            builder.Append(" [ConfigProAttribute(\"" + con.ProName + "_speed\")]\r\n");
            builder.Append(" public int " + con.ProName + "_speed  { get; set; }\r\n");
        }
        private void AddBuffer(ConfigBase con, StringBuilder builder)
        {
            builder.Append(" /// <summary>\r\n");
            builder.Append(" ///  " + con.ConfigStr + "\r\n");
            builder.Append(" /// </summary>\r\n");
            builder.Append(" public static string " + con.ProName + "=\"" + con.ProName + "\";\r\n");
        }

        public ConfigIO getWaitIO(string ioType)
        {
            if (DIList.ContainsKey(ioType))
            {
                return DIList[ioType];
            }
            else if (DOList.ContainsKey(ioType))
            {
                return DOList[ioType];
            }
            return null;
        }
       
    } 
    public class DeviceType
    {
        /// <summary>
        /// 流水线线体
        /// </summary>
        public static string Line = "Line";
   
        public static string XRay = "MoveEquip";
   
        public static string OutputDevice = "OutputDevice";
      
        public static string InputDevice = "InputDevice";
        

    }
   
}