IOManager.cs 5.6 KB
using OnlineStore.Common;
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 static IOManager instance = null;

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


        #region KNDIO
        public static void IOMove(string ioType, IO_VALUE ioValue)
        {
            if (LineManager.Config.DOList.ContainsKey(ioType))
            {
                ConfigIO configIo = LineManager.Config.DOList[ioType];
                instance.WriteSingleDO(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
                Thread.Sleep(60);


                //IO重写功能,过滤掉线体运转信号,其他信号重写
                //判断是否是线体运转信号
                string Line = "Line";
                string HddLed = "HddLed";
                if (ioType.Contains(Line) || ioType.Contains(HddLed))
                {
                    //线体和灯信号不重写
                }
                else
                {
                    int tryTime = 0;
                    while (tryTime < 10)
                    {
                        IO_VALUE currValue = instance.GetDOValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
                        if (currValue.Equals(ioValue))
                        {
                            break;
                        }
                        instance.WriteSingleDO(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
                        tryTime++;
                        LogUtil.error("IOMove: tryTime=" + tryTime + ", ioType =" + ioType + ",ioValue=" + ioValue + ",currValue=" + currValue);
                        Thread.Sleep(60);
                    }
                }               
            }
            else
            {
                LogUtil.error("没有DO=" + ioType);
            }
        }
        public static void CIOMove(string ioType, IO_VALUE ioValue)
        {
            if (!IOValue(ioType).Equals(ioValue))
            {
                IOMove(ioType, ioValue);
            }
        }
        public static IO_VALUE IOValue(string ioType)
        {
            IO_VALUE ioValue = IO_VALUE.None;
            if (LineManager.Config.DIList.ContainsKey(ioType))
            {
                ConfigIO configIo = LineManager.Config.DIList[ioType];
                ioValue = instance.GetDIValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
                //UpdateDoValue(ioType, ioValue);
            }
            else if (LineManager.Config.DOList.ContainsKey(ioType))
            {
                ConfigIO configIo = LineManager.Config.DOList[ioType];
                ioValue = instance.GetDOValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
            }
            else
            {
                LogUtil.error("没有DO=" + ioType);
            }
            return ioValue;
        }

        public static IO_VALUE DOValue(string ioType)
        {
            IO_VALUE ioValue = IO_VALUE.None;
            ConfigIO configIo = GetDO(ioType);

            if (configIo != null)
            {
                ioValue = instance.GetDOValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
            }
            else
            {
                LogUtil.error("没有DO=" + ioType);
            }
            return ioValue;
        }
        public static IO_VALUE DIValue(string ioType)
        {
            IO_VALUE ioValue = IO_VALUE.None;
            ConfigIO configIo = GetDI(ioType);
            if (configIo != null)
            {
                ioValue = instance.GetDIValue(configIo.IO_IP, configIo.SlaveID, configIo.GetIOAddr());
            }
            else
            {
                LogUtil.error("未找到 DI [" + ioType + "] ");
            }
            return ioValue;
        }
        private static ConfigIO GetDI(string ioType)
        {
            ConfigIO configIo = null;
            if (LineManager.Config.DIList.ContainsKey(ioType))
            {
                return LineManager.Config.DIList[ioType];
            }
            return configIo;
        }
        private static ConfigIO GetDO(string ioType)
        {
            ConfigIO configIo = null;
            if (LineManager.Config.DOList.ContainsKey(ioType))
            {
                return LineManager.Config.DOList[ioType];
            }
            return configIo;
        }
        #endregion
        public static void Init()
        {
            bool isAIOBox = ConfigAppSettings.GetIntValue(Setting_Init.UseAIOBOX).Equals(1);
            if (isAIOBox)
            {
                instance = new AIOBOXManager();
            }
            else
            {
                instance = new KNDManager();
            }
        }
        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();

    }
}