KTKDIOManager.cs 8.5 KB
using log4net;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
 

namespace OnlineStore.DeviceLibrary
{
    /// <summary>
    /// 康泰克IO版操作类
    /// </summary>
    public class KTKDIOManager
    {

        public static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        public static string KTK_PI_DeviceName = ConfigAppSettings.GetValue(Setting_Init.KTK_PI_BoardName);
        public static string KTK_PO_DeviceName = ConfigAppSettings.GetValue(Setting_Init.KTK_PO_BoardName);

        private static Dictionary<string, KTKDeviceInfo> DIODeviceMap = new Dictionary<string, KTKDeviceInfo>();
        private static Cdio cdio = new Cdio();
      
        //每一个port的io数量
        private static int portIONum=8;
        private static int ret = 0;

        /// <summary>
        /// io卡初始化
        /// </summary> 
        public static string DIOInit(string DeviceName)
        {
            
            if (!DIODeviceMap.ContainsKey(DeviceName))
            {
                short dio_Id = 0;
                //初始化 
                ret = cdio.Init(DeviceName, out dio_Id);
                short inPortName=0;
                short outPortName=0;
                //获取最多的端口
                cdio.GetMaxPorts(dio_Id, out inPortName, out outPortName);
                KTKDeviceInfo ktk = new KTKDeviceInfo(dio_Id, DeviceName, inPortName, outPortName);
                DIODeviceMap.Add(DeviceName, ktk);
                return DIOGetErrorString(ret);               
            }
            return "";
        }
        /// <summary>
        /// 判断设备是否初始化过了
        /// </summary>
        public static Boolean DIODeviceIsInit(string deviceName)
        {
            if (DIODeviceMap.ContainsKey(deviceName))
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 退出DIO卡
        /// </summary> 
        public static string DIOExit(string DeviceName)
        {
            if (DIODeviceMap.ContainsKey(DeviceName))
           { 
                short id = DIODeviceMap[DeviceName].DeviceId;
                //退出
                int ret = cdio.Exit(id);
                DIODeviceMap.Remove(DeviceName);
                return DIOGetErrorString(ret);
           }
            return "";
        }

        /// <summary>
        /// 读取单个DI
        /// </summary> 
        public static IO_VALUE ReadSingDI(string DeviceName, short ioIndex)
        {
            IO_VALUE value  = (IO_VALUE)ReadSingDIValue(DeviceName,ioIndex); 
            return value;
        }
        public static int ReadSingDIValue(string DeviceName, short ioIndex)
        {
            byte Data = 0;
            if (DIODeviceMap.ContainsKey(DeviceName))
            {
                short id = DIODeviceMap[DeviceName].DeviceId;
                DateTime time = DateTime.Now;

                cdio.InpBit(id, ioIndex, out Data);       
                TimeSpan span = DateTime.Now - time;
                if (span.TotalMilliseconds > 10)
                {
                    log.Error("执行cdio.InpBit【" + DeviceName + "   " + ioIndex + "】,共耗费了【" + span.TotalMilliseconds + "】毫秒");
                }                    
            }
            return Data;
        }
        /// <summary>
        /// 读取这块板子上所有DI的值
        /// </summary>
        public static List<IO_VALUE> ReadAllDI(string DeviceName)
        {
            List<IO_VALUE> returnList = new List<IO_VALUE>();
            try
            {
                if (DIODeviceMap.ContainsKey(DeviceName))
                {
                    KTKDeviceInfo deviceInfo = DIODeviceMap[DeviceName];
                    short inPortNum = deviceInfo.InPortNum;
                    if (inPortNum <= 0)
                    {
                        return returnList;
                    }
                    short[] portArray = new short[inPortNum];
                    byte[] portValueArr = new byte[inPortNum];
                    for (int inPort = 0; inPort < inPortNum; inPort++)
                    {
                        portArray[inPort] = (short)inPort;
                    }
                    cdio.InpMultiByte(deviceInfo.DeviceId, portArray, inPortNum, portValueArr);

                    foreach (byte value in portValueArr)
                    {
                        string strValue = System.Convert.ToString(value, 2).PadLeft(portIONum, '0');
                        for (int index = portIONum - 1; index >= 0; index--)
                        {
                            string ioVStr = strValue.Substring(index, 1);
                            IO_VALUE iov = (IO_VALUE)Int32.Parse(ioVStr);
                            returnList.Add(iov);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(log, ex.ToString());
            }
            return returnList;
        }
        /// <summary>
        /// 读取单个DO
        /// </summary> 
        public static IO_VALUE ReadSingDO(string DeviceName, short ioIndex)
        { 
            return (IO_VALUE)ReadSingDOValue(DeviceName,ioIndex);
        }
        public static int ReadSingDOValue(string DeviceName, short ioIndex)
        {
            byte Data = 0;
            if (DIODeviceMap.ContainsKey(DeviceName))
            {
                short id = DIODeviceMap[DeviceName].DeviceId;
                DateTime time = DateTime.Now;
                cdio.EchoBackBit(id, ioIndex, out Data);
                TimeSpan span = DateTime.Now - time;
                if (span.TotalMilliseconds > 10)
                {
                    log.Error("执行cdio.EchoBackBit【" + DeviceName + "   " + ioIndex + "】,共耗费了【" + span.TotalMilliseconds + "】毫秒");
                }               
             
            }
            return Data;
        }
        /// <summary>
        /// 写入单个DO
        /// </summary> 
        public static int WriteSingDO(string DeviceName, short ioIndex, IO_VALUE value)
        {
            if (DIODeviceMap.ContainsKey(DeviceName))
            {
                short id = DIODeviceMap[DeviceName].DeviceId;
                byte Data = (byte)value;
                return cdio.OutBit(id, ioIndex, Data);               
            }
            return 0;
        }
     
        /// <summary>
        /// 读取这块板子上所有DO的值
        /// </summary>
        public static List<IO_VALUE> ReadAllDO(string DeviceName)
        {
            List<IO_VALUE> returnList = new List<IO_VALUE>();
            try
            {
                if (DIODeviceMap.ContainsKey(DeviceName))
                {
                    KTKDeviceInfo deviceInfo = DIODeviceMap[DeviceName];
                    short outPortNum = deviceInfo.OutPortNum;
                    if (outPortNum <= 0)
                    {
                        return returnList;
                    }
                    short[] portArray = new short[outPortNum];
                    byte[] portValueArr = new byte[outPortNum];
                    for (int inPort = 0; inPort < outPortNum; inPort++)
                    {
                        portArray[inPort] = (short)inPort;
                    }
                    cdio.EchoBackMultiByte(deviceInfo.DeviceId, portArray, outPortNum, portValueArr);

                    foreach (byte value in portValueArr)
                    {
                        string strValue = System.Convert.ToString(value, 2).PadLeft(portIONum, '0');
                        for (int index = portIONum - 1; index >= 0; index--)
                        {
                            string ioVStr = strValue.Substring(index, 1);
                            IO_VALUE iov = (IO_VALUE)Int32.Parse(ioVStr);
                            returnList.Add(iov);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(log, ex.ToString());
            }
            return returnList;
        }
      
        /// <summary>
        /// 获取错误文字提示
        /// </summary> 
        public static string DIOGetErrorString(int ErrorCode)
        {
            //获取错误信息
            string errMsg = "";
            if (ret != 0)
            {
                cdio.GetErrorString(ErrorCode, out errMsg);
            }
            return errMsg;
        } 
    }
}