研华GPIO的功能实现代码

基于研华工控机自带的GPIO做IO触发和接收IO信号。

代码如下

using Susi4.APIs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GpioLib
{
    public class IO
    {

        #region 私有变量
        const int MAX_BANK_NUM = 4;
        List<DeviceInfo> DevList = new List<DeviceInfo>();
        DeviceInfo Dev = null;
        List<DevPinInfo> DevPinList = new List<DevPinInfo>();
        DevPinInfo DevPin = null;
        #endregion
        #region 私有类
        class DeviceInfo
        {
            public UInt32 ID;
            public UInt32 SupportInput;
            public UInt32 SupportOutput;

            public DeviceInfo(UInt32 DeviceID)
            {
                ID = DeviceID;
                SupportInput = 0;
                SupportOutput = 0;
            }
        }
        class DevPinInfo
        {
            public UInt32 ID;

            private string _Name = "";
            public string Name
            {
                get { return _Name; }
            }

            override public string ToString()
            {
                return String.Format("{0} ({1})", ID, Name);
            }

            public DevPinInfo(UInt32 DeviceID)
            {
                ID = DeviceID;

                UInt32 Length = 32;
                StringBuilder sb = new StringBuilder((int)Length);
                if (SusiBoard.SusiBoardGetStringA(SusiBoard.SUSI_ID_MAPPING_GET_NAME_GPIO(ID), sb, ref Length) == SusiStatus.SUSI_STATUS_SUCCESS)
                {
                    _Name = sb.ToString();
                }
            }
        }
        #endregion
        #region 不常用的私有方法
        /// <summary>
        /// 初始化GPIO
        /// </summary>
        private void InitializeGPIO()
        {
            UInt32 Status;

            for (int i = 0; i < MAX_BANK_NUM; i++)
            {
                DeviceInfo info = new DeviceInfo(SusiGPIO.SUSI_ID_GPIO_BANK((UInt32)i));

                Status = SusiGPIO.SusiGPIOGetCaps(info.ID, SusiGPIO.SUSI_ID_GPIO_INPUT_SUPPORT, out info.SupportInput);
                if (Status != SusiStatus.SUSI_STATUS_SUCCESS)
                    continue;

                Status = SusiGPIO.SusiGPIOGetCaps(info.ID, SusiGPIO.SUSI_ID_GPIO_OUTPUT_SUPPORT, out info.SupportOutput);
                if (Status != SusiStatus.SUSI_STATUS_SUCCESS)
                    continue;

                DevList.Add(info);

            }

            if (DevList.Count > 0)
            {

            }
        }
       /// <summary>
       /// 初始化引脚
       /// </summary>
        private void InitializePins()
        {
            StringBuilder sb = new StringBuilder(32);
            UInt32 mask;

            for (int i = 0; i < DevList.Count; i++)
            {
                // 32 pins per bank
                for (int j = 0; j < 32; j++)
                {
                    mask = (UInt32)(1 << j);
                    if ((DevList[i].SupportInput & mask) > 0 || (DevList[i].SupportOutput & mask) > 0)
                    {
                        DevPinInfo pinInfo = new DevPinInfo((UInt32)((i << 5) + j));
                        DevPinList.Add(pinInfo);
                    }
                }
            }
            if (DevList.Count > 0)
            {
            }
        }
        /// <summary>
        /// 获取pin脚Id
        /// </summary>
        /// <returns></returns>
        private UInt32 GetID()
        {
            return DevPin.ID;
        }
        /// <summary>
        /// 获取Mask
        /// </summary>
        /// <returns></returns>
        private UInt32 GetMask()
        {
            return 1;
        }
        #endregion
        public IO()
        {
            try
            {
                UInt32 Status = SusiLib.SusiLibInitialize();
                if (Status != SusiStatus.SUSI_STATUS_SUCCESS && Status != SusiStatus.SUSI_STATUS_INITIALIZED)
                    return;
            }
            catch
            {
                return;
            }
            InitializeGPIO();
            InitializePins();
        }
      
        /// <summary>
        /// 设置引脚为输入还是输出
        /// </summary>
        /// <param name="pinNum">引脚Id</param>
        /// <param name="state">设置引脚是输入或者输出,只能是0/1</param>
        public void SetDirection(uint pinNum, OnOffState state)
        {
            DevPin = DevPinList[(int)pinNum];
            UInt32 Status;
            //只能是0或1
            UInt32 Value = (UInt32)state;
            Status = SusiGPIO.SusiGPIOSetDirection(GetID(), GetMask(), Value);
            if (Status != SusiStatus.SUSI_STATUS_SUCCESS)
                MessageBox.Show(String.Format("SusiGPIOSetDirection() failed. (0x{0:X8})", Status));
        }
        /// <summary>
        /// 设置信号电压
        /// </summary>
        /// <param name="PinNum">引脚Id</param>
        /// <param name="level">设置输出的电压,只能是0/1</param>
        public void SetLevel(uint pinNum, OnOffState level)
        {
            DevPin = DevPinList[(int)pinNum];
            UInt32 Status;
            UInt32 Value = (UInt32)level;
            Status = SusiGPIO.SusiGPIOSetLevel(GetID(), GetMask(), Value);
            if (Status != SusiStatus.SUSI_STATUS_SUCCESS)
                MessageBox.Show(String.Format("SusiGPIOSetLevel() failed. (0x{0:X8})", Status));
        }
        /// <summary>
        /// 获取电压信号
        /// </summary>
        /// <param name="PinNum">引脚id</param>
        /// <returns>返回对应引脚的电压状态</returns>
        public uint GetLevel(uint pinNum)
        {
            DevPin = DevPinList[(int)pinNum];

            UInt32 Status;
            UInt32 Value;

            Status = SusiGPIO.SusiGPIOGetLevel(GetID(), GetMask(), out Value);
            if (Status == SusiStatus.SUSI_STATUS_SUCCESS)
            {
                return Value;
            }
            else
            {
                MessageBox.Show(String.Format("SusiGPIOGetLevel() failed. (0x{0:X8})", Status));
                return 999;
            }
        }

     /// <summary>
     /// On或者Off状态
     /// </summary>
        public enum OnOffState
        {
            On = 1,
            Off = 0
        }
      
    }
}

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
LabVIEW研华5800是一款在工程领域中被广泛应用的数据采集与控制系统。研华5800采用了LabVIEW软件平台进行开发,它具有强大的数据采集与控制功能,可以满足各种工程应用的需求。 LabVIEW研华5800具备高性能的硬件平台,搭载了先进的处理器和大容量的存储器,保证了系统的高效运行和可靠性。它支持多种通信接,包括Ethernet、USB、RS232等,方便用户与其他设备进行连接和数据交换。 该系统的软件平台是基于LabVIEW开发的,LabVIEW是一款图形化编程语言,具有简洁明了的界面和简单易用的编程方法。用户可以通过拖拽图形化元件来构建程序,而不需要编写繁琐的代码。这样的设计使得LabVIEW研华5800的开发过程更加简单快速,减少了用户的开发时间和成本。 LabVIEW研华5800支持多种传感器和执行器设备的接入,用户可以通过它来进行数据采集、监测和控制,实现各种工程项目的自动化控制。它还提供丰富的数据处理和分析功能,可以对采集到的数据进行实时显示、曲线绘制和数据分析,以帮助用户更好地理解和分析实验结果。 总的来说,LabVIEW研华5800是一款功能强大且灵活易用的数据采集与控制系统。它被广泛应用于各种工程领域,包括自动化控制、实验室研究和工业生产等。使用LabVIEW研华5800可以提高工程项目的效率和精度,实现自动化控制和数据分析,从而推动工程技术的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值