IOManager.cs 8.1 KB
using OnlineStore.Common;
using OnlineStore.DeviceLibrary.IO;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace OnlineStore.DeviceLibrary
{
    public abstract class IOManager
    {
        public delegate void DIChangeDelegate(string ioIP, ushort index, IO_VALUE oldValue, IO_VALUE newValue);
        internal static Dictionary<ConfigIO, DIChangeDelegate> DIChangeMap = new Dictionary<ConfigIO, DIChangeDelegate>();

        public static void AddDIEvent(string diType, int subType, DIChangeDelegate del)
        {
            ConfigIO Di = GetDI(diType, subType);
            if (Di != null)
            {
                DIChangeMap.Add(Di, del);
            }
        }
        public static IOManager instance = null;

        public abstract void ConnectionIOList(List<string> dIODeviceNameList);


        #region KNDIO

        private static void IOErrorLog(string ioType, int subType, string IOType = "IO")
        {

            LogUtil.error("未找到" + IOType + ",[" + ioType + "][" + subType + "]");

        }

        public static void IOMove(string ioType, IO_VALUE ioValue, int subType = 0)
        {
            ConfigIO configIo = GetDO(ioType, subType);
            if (configIo != null)
            {
                //instance.WriteSingleDO(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
                //Thread.Sleep(20);
                int tryCount = 1;
                if (subType == 1)
                {
                    tryCount = 5;
                }
                while (!IOValue(ioType, subType).Equals(ioValue))
                {
                    instance.WriteSingleDO(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
                    Thread.Sleep(20);
                    tryCount--;
                    if (tryCount <= 0)
                    {
                        //LogUtil.error("IO操作失败,未能设置到目标值[" + ioValue + "],请检查设备连接或配置![" + ioType + "][" + subType + "]");
                        break;
                    }
                }
            }
            else
            {
                IOErrorLog(ioType, subType, "DO");
            }
        }

        public static IO_VALUE IOValue(string ioType, int subType)
        {
            if (instance == null)
            {
                return IO_VALUE.None;
            }
            IO_VALUE ioValue = IO_VALUE.None;
            try
            {

                ConfigIO configIo = GetDI(ioType, subType);
                if (configIo == null)
                {
                    configIo = GetDO(ioType, subType);
                }

                if (configIo != null)
                {
                    if (configIo.ProType.Equals(ConfigItemType.DI))
                    {

                        ioValue = instance.GetDIValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
                    }
                    else
                    {
                        ioValue = instance.GetDOValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
                    }
                }
                else
                {
                    IOErrorLog(ioType, subType, "IO");
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("IOValue Error: " + ex.ToString());
            }
            return ioValue;
        }
        public static IO_VALUE DOValue(string ioType, int subType = 0)
        {
            if (instance == null)
            {
                return IO_VALUE.None;
            }
            IO_VALUE ioValue = IO_VALUE.None;
            ConfigIO configIo = GetDO(ioType, subType);

            if (configIo != null)
            {
                ioValue = instance.GetDOValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
            }
            else
            {
                IOErrorLog(ioType, subType, "DO");
            }
            return ioValue;
        }
        public static IO_VALUE DIValue(string ioType, int subType)
        {
            if (instance == null)
            {
                return IO_VALUE.None;
            }
            IO_VALUE ioValue = IO_VALUE.None;
            ConfigIO configIo = GetDI(ioType, subType);
            if (configIo != null)
            {
                ioValue = instance.GetDIValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
            }
            else
            {
                IOErrorLog(ioType, subType, "DI");
            }
            return ioValue;
        }
        internal static ConfigIO GetDI(string ioType, int subType)
        {
            ConfigIO configIo = null;
            // if (subType <= 0)
            // {
            if (StoreManager.Config.DIList.ContainsKey(ioType))
            {
                return StoreManager.Config.DIList[ioType];
            }
            //}
            else
            {
                if (StoreManager.allConfigMap.ContainsKey(subType))
                {
                    if (StoreManager.allConfigMap[subType].DIList.ContainsKey(ioType))
                    {
                        return StoreManager.allConfigMap[subType].DIList[ioType];
                    }
                }

            }
            return configIo;
        }
        internal static ConfigIO GetIO(string ioType, int subType)
        {
            ConfigIO configIo = GetDI(ioType, subType);
            if (configIo == null)
            {
                configIo = GetDO(ioType, subType);
            }

            return configIo;
        }
        private static ConfigIO GetDO(string ioType, int subType)
        {
            ConfigIO configIo = null;
            /// if (subType <= 0)
            //{
            if (StoreManager.Config.DOList.ContainsKey(ioType))
            {
                return StoreManager.Config.DOList[ioType];
            }
            // }
            else
            {
                if (StoreManager.allConfigMap.ContainsKey(subType))
                {
                    //string newType=ioType.Replace("SW1_", "SW_").Replace("SW2_", "SW_").Replace("SW3_", "SW_").Replace("SW4_", "SW_"); 
                    if (StoreManager.allConfigMap[subType].DOList.ContainsKey(ioType))
                    {
                        return StoreManager.allConfigMap[subType].DOList[ioType];
                    }
                }

            }
            return configIo;
        }
        public static void CloseDeviceDO(List<ConfigIO> DoList)
        {
            foreach (ConfigIO io in DoList)
            {
                instance.WriteSingleDO(io.IO_IP, io.SlaveID, io.GetIOAddr(), IO_VALUE.LOW);
                Thread.Sleep(60);
            }
        }
        public static void CloseDeviceDO(int subType)
        {
            List<ConfigIO> DoList = new List<ConfigIO>();
            if (subType <= 0)
            {
                DoList = new List<ConfigIO>(StoreManager.Config.DOList.Values);
            }
            else
            {
                if (StoreManager.allConfigMap.ContainsKey(subType))
                {
                    DoList = new List<ConfigIO>(StoreManager.allConfigMap[subType].DOList.Values);
                }
            }
            CloseDeviceDO(DoList);
        }
        #endregion
        public static void Init()
        {
            bool useHC = true;

            instance = new HCIOManager();

        }
        public abstract void ReadAllDI(string deviceName, byte slaveId);

        public abstract void ReadAllDO(string deviceName, byte slaveId);

        public abstract void WriteSingleDO(string deviceName, byte slaveId, ushort index, IO_VALUE value, int time);

        public abstract void WriteSingleDO(string deviceName, byte slaveId, ushort index, IO_VALUE value);

        public abstract IO_VALUE GetDIValue(string deviceName, byte slaveID, ushort v);

        public abstract IO_VALUE GetDOValue(string deviceName, byte slaveID, ushort v);

        public abstract IO_VALUE GetIOValue(ConfigIO configIO);

        public abstract void CloseAllDO();

        public abstract void CloseAllConnection();

        //public abstract bool IsConnect(string ip);

    }
}