c#集成程控电源SCPI 命令( 德国EA)

news/2024/10/31 1:32:39/

 public class EAPowerControl
    {


        #region  常用变量   
        /// <summary>
        /// 输出日志接口
        /// </summary>
        private IPrintAction printAction;

        private static readonly string readError = "SYST:ERR?"; // 读取错误代码
        private static readonly string noError = "0,\"No error\"";  // 正确信息
        private static int waitingSecond = 100;
        private static string ioAddress = DevicesConfig.Default.Config.ConnectName;//"dongzhou";//System.Configuration.ConfigurationManager.AppSettings["smartdac.ip"];
        private static string connectType = DevicesConfig.Default.Config.ConnectType;//"COM";//System.Configuration.ConfigurationManager.AppSettings["DAQ970.Connect.Type"];

        /// <summary>
        ///  设置电压   最大值 和最小值   把   MIN 替换成 数字即可 设置。 SOURce:VOLTage 10
        /// </summary> 
        private static string setVOLTageMin = "SOURce:VOLTage MIN";
        private static string setVOLTageMax = "SOURce:VOLTage MAX";
        /// <summary>
        ///  设置电流   最大值 和最小值   把   MIN 替换成 数字即可 设置。SOURce:CURRent 10
        /// </summary> 
        private static string setCURRentMin = "SOURce:CURRent MIN";
        private static string setCURRentMax = "SOURce:CURRent Max";
        /// <summary>
        ///  设置功率   最大值 和最小值   把   MIN 替换成 数字即可 设置。 SOURce:POWer 10
        /// </summary> 
        private static string setPOWerMin = "SOURce:POWer MIN";
        private static string setPOWerMax = "SOURce:POWer MAX";

        /// <summary>
        /// 输出 开关
        /// </summary> 
        private static string outPutOFF = "OUTPut OFF";
        private static string outPutON = "OUTPut ON";
        /// <summary>
        ///  输入开关
        /// </summary> 
        private static string inPutOFF = "OUTPut OFF";
        private static string inPutON = "OUTPut ON";

        /// <summary>
        ///关锁解锁   锁定了不能 远程。
        /// </summary>
        private static string lockOff = "SYSTem:LOCK OFF";
        private static string lockOn = "SYSTem:LOCK ON";

        /// <summary>
        ///系统:通信:协议:SCPI启用
        /// </summary>
        private static string SCPIEnable = " SYSTem:COMMunicate:PROTocol:SCPI ENABLE"; // 启用
        private static string SCPIDisable = "SYSTem:COMMunicate:PROTocol:SCPI DISABLE";// 禁用 scpi

        /// <summary>
        ///  获取当前设置电压
        /// </summary>
        private static string getVOLTage = "VOLTage?";//    MEASure:VOLTage? 测量电压  获取当前运行电压

        /// <summary>
        /// 获取当前设置电流
        /// </summary>
        private static readonly string getCURRent = "CURRent?";//  MEASure:CURRent? 测量电压  获取当前运行电流

        /// <summary>
        /// 获取当前设置 功率
        /// </summary> 
        private static readonly string getPOWer = "POWer?";//  MEASure:POWer? 测量电压  获取当前运行功率


        #endregion


        private static EAPowerControl eA_PowerControl { get; set; }
        /// <summary>
        ///  单例
        /// </summary>
        public static EAPowerControl EA_Control
        {
            get
            {
                Connect();
                return Singleton<EAPowerControl>.Instance;
            }
        }

        #region  SCPI 命令

        /// <summary>
        /// usbSession 
        /// </summary>
        private static MessageBasedSession iMessageSession;


        /// <summary>
        /// IMessageBasedFormattedIO
        /// </summary>
        private static IMessageBasedFormattedIO io { get; set; }

        public static bool Connect()
        {
            //check null
            if (iMessageSession == null)
            {

                switch (connectType)
                {
                    case "COM":
                        {
                            iMessageSession = new SerialSession(ioAddress);
                        }
                        break;
                    case "USB":
                        {
                            iMessageSession = new UsbSession(ioAddress);
                        }
                        break;
                    case "TCP":
                        {
                            iMessageSession = new TcpipSession(ioAddress);
                        }
                        break;
                    default:
                        throw new Exception("EA电源配置不正确");
                        break;
                }
                //TimeoutMilliseconds
                iMessageSession.TimeoutMilliseconds = 3000;
                io = iMessageSession.FormattedIO;
                try
                {
                    var ret = EA_Control.SendCommand(lockOn); // 打开远程
                    if (string.IsNullOrEmpty(ret))
                    {
                        ret = EA_Control.SendCommand(setPOWerMax); // 设置功率
                        if (string.IsNullOrEmpty(ret))
                        {
                            ret = EA_Control.SendCommand(setCURRentMax);// 设置电流
                            if (!string.IsNullOrEmpty(ret))
                            {
                               Util.LogUtil.Error("ERROR  EA电源设置电流失败" + ret);
                                throw new Exception($"EA电源设置电流失败 {ret}");
                            }
                        }
                        else
                        {
                           Util.LogUtil.Error("ERROR  EA电源设置功率失败" + ret);
                            throw new Exception($"EA电源设置功率失败 {ret}");
                        }
                    }
                    else
                    {
                       Util.LogUtil.Error("ERROR  EA电源配置不正确" + ret);
                        throw new Exception("EA电源配置不正确");
                    }
                }
                catch (Exception ex)
                {
                   Util.LogUtil.Error("ERROR  EA电源配置不正确" + ex.Message);
                    throw new Exception("EA电源配置不正确");
                }
            }
            return true;
        }

        public void DisConnect()
        {
            try
            {
                //check null
                iMessageSession?.Dispose();
                iMessageSession = null;
            }
            catch (Exception ex)
            {
               Util.LogUtil.Error("ERROR  DisConnect" + ex.ToString());

            }
        }
        public string Read()
        {

            //read
            string content = SendQuery("READ?");
            return content;
        }
        /// <summary>
        /// 发送查询命令
        /// </summary>
        /// <param name="command"></param>
        /// <returns> 正确返回  返回  接收信息 ,错误 返回错误 信息</returns>
        public string SendQuery(string command)
        {
            int counter = 3;
            while (counter > 0)
            {
                try
                {
                    Stopwatch sw = new Stopwatch();
                    sw.Start();
                   Util.LogUtil.Debug($"SendQuery:" + command);
                    //PrintfAndFlush
                    io.PrintfAndFlush(command);
                    string answer = io.ReadLine();
                    sw.Stop();
                    //log time
                   Util.LogUtil.Debug($"SendQuery:" + command + "\t" + sw.ElapsedMilliseconds);
                    // Console.WriteLine($"SendQuery:" + command + "\t" + sw.ElapsedMilliseconds);
                    //log receive
                   Util.LogUtil.Debug($"Receive:" + answer);
                    Thread.Sleep(waitingSecond);

                    io.PrintfAndFlush(readError);
                    Thread.Sleep(waitingSecond);
                    string error = io.ReadLine();
                    //Contains
                    if (error.Contains(noError))
                    {
                        return answer;
                    }
                    else if (counter == 1)
                    {
                       Util.LogUtil.Error("ERROR SendQuery: " + error);
                        return "";
                    }

                }
                catch (ThreadAbortException)
                {
                    return "";
                }
                catch (Exception ex)
                {
                    //log error
                   Util.LogUtil.Error("ERROR SendQuery: " + ex.ToString());
                }
                finally
                {
                    counter -= 1;
                }

            }
            return "";
        }
        /// <summary>
        /// 发送命令
        /// </summary>
        /// <param name="command"></param>
        /// <returns> 正确返回 空  错误 返回错误信息 </returns>
        public string SendCommand(string command)
        {
            //log
           Util.LogUtil.Debug("SendCommand:" + command);
            int counter = 3; // 默认三次响应
            while (counter > 0)
            {

                //mInstrument.WriteString(command);
                io.PrintfAndFlush(command);
                Thread.Sleep(waitingSecond); //500
                io.PrintfAndFlush(readError);
                Thread.Sleep(waitingSecond);
                string error = io.ReadLine();
                //Contains
                if (error.Contains(noError))
                {
                    break;
                }
                else if (counter == 1)
                {
                    string errorInfo = "ERROR 902: " + error;
                   Util.LogUtil.Error(errorInfo);
                    throw new Exception(errorInfo);
                }
                counter -= 1;
            }
            Thread.Sleep(500);
            return "";

        }

        #endregion

        #region   电源控制

        /// <summary>
        /// 打开 EA 程控电源
        /// </summary>
        /// <param name="line">通道 不需要 适配 接口</param> 
        /// <param name="voltage">电压 </param>
        /// <param name="name"> 名称  不需要适配 接口< </param>
        /// <returns></returns>
        public bool OpenPower(int line, double voltage, string name)
        {
            var com = setVOLTageMin.Replace("MIN", voltage.ToString());
            var ret = SendCommand(com);
            if (!string.IsNullOrEmpty(ret))
            {
               Util.LogUtil.Debug($"设置EA程控失败,错误原因:{ret}");
                return false;
            }
            ret = SendCommand(outPutON);
            if (!string.IsNullOrEmpty(ret))
            {
               Util.LogUtil.Debug($"设置EA程控失败,错误原因:{ret}");
                return false;
            }

            return true;
        }
        /// <summary>
        /// 关闭程控电源
        /// </summary>
        /// <param name="line"> 线路 适配 接口 </param>
        /// <param name="name"> </param>
        /// <returns></returns>
        public bool ClosePower(int line, string name)
        {
            var ret = SendCommand(outPutOFF);
            if (!string.IsNullOrEmpty(ret))
            {
               Util.LogUtil.Debug($"设置EA程控失败,错误原因:{ret}");
                return false;
            }

            return true;
        }
        /// <summary>
        /// 重置程控电源
        /// </summary>
        /// <param name="line"></param>
        /// <param name="voltage"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public bool RestartPower(int line, double voltage, string name, string path)
        {
            var ret = SendCommand(outPutOFF);
            if (!string.IsNullOrEmpty(ret))
            {
               Util.LogUtil.Debug($"设置EA程控失败,错误原因:{ret}");
                return false;
            }
            if (!string.IsNullOrEmpty(path))
                FileUtil.WriteFile(path, $"power{line}_off:{GlobalAPI.Global.Timer.Elapsed.TotalMilliseconds}", true);
            printAction.PrintAction("EA_POWER", $"Power Line:{line} Closed");
            Thread.Sleep(3000);//等待3秒 电压降下
            ret = SendCommand(outPutON);
            if (!string.IsNullOrEmpty(ret))
            {
               Util.LogUtil.Debug($"设置EA程控失败,错误原因:{ret}");
                return false;
            }
            var strvoltage = SendQuery(getVOLTage);
            if (!string.IsNullOrEmpty(path))
                FileUtil.WriteFile(path, $"power{line}_on:{GlobalAPI.Global.Timer.Elapsed.TotalMilliseconds}", true);
            printAction.PrintAction("EA_POWER", $"Power Line:{line} voltage set {strvoltage} ");

            return true;
        }


        public string GetPowerVoltage()
        {
            var com = $" MEASure:{getVOLTage}";
            var ret = SendQuery(com);
            return ret;
        }

        /// <summary>
        /// 打开 EA 程控电源
        /// </summary>
        /// <param name="line">通道 不需要</param>
        /// <param name="voltage">电压 </param>
        /// <param name="name"> 名称  不需要 </param>
        /// <returns></returns>
        public bool SetAcc(int line, double current, string name)
        {
            var com = setCURRentMin.Replace("MIN", current.ToString());
            var ret = SendCommand(com);
            if (!string.IsNullOrEmpty(ret))
            {
               Util.LogUtil.Debug($"设置EA程控失败,错误原因:{ret}");
                return false;
            }
            ret = SendCommand(outPutON);
            if (!string.IsNullOrEmpty(ret))
            {
               Util.LogUtil.Debug($"设置EA程控失败,错误原因:{ret}");
                return false;
            }

            return true;
        }

        #endregion

    }


http://www.ppmy.cn/news/456007.html

相关文章

分级输出四路带保护程控电源设计与实现

目录 中文摘要………………………………………………….………………………………………….…VI 外文摘要………………….…………………………….………………………………………….…VII 1 引言 1 1.1 选题背景 1 2 系统综述 2 2.1文献综述 2 2.1.1稳定电压输出与可调电压技…

ArduPilot开源代码之AP_InertialSensor_Backend

ArduPilot开源代码之AP_InertialSensor_Backend 1. 源由2. 设计3. 实例BMI2703.1 AP_InertialSensor_BMI2703.2 probe3.3 init3.4 start3.5 read_fifo3.6 update 4. 总结5. 参考资料 1. 源由 惯性传感器是飞控关于姿态最重要的一个传感器。从复杂度角度看&#xff0c;除了数据…

python控制程控电源_如何对程控电源进行编程控制

代码解读。以上代码示范了如何使用visa API连接并控制仪器读写。 line 1~3 包含必须的头文件和库文件 line 8~11 定义变量&#xff0c;ViStatus用来检查仪器初始化及读写状态 ViSession 用来定义Visa库资源句柄 ViUint32 用来定义读写字符长度 ViBuf 用来定义读取仪器缓冲区 Li…

程控电阻白皮书(一)

目录 什么是可编程电阻&#xff1f; 市场和科技力量 可编程电阻模块的分类和参数介绍 需要更高的精度? 需要了解更多请联系ltthkaco.com。进入正题: 仔细想想&#xff0c;我们的日常生活有很多传感器控制的场景。传感器能保证冰箱里的食物保持低温状态&#xff0c;外出跑…

基于DAC0832的程控衰减器

基于DAC0832的程控衰减器 文章目录 基于DAC0832的程控衰减器一、需求分析&#xff1a;二、主要元器件&#xff1a;三、设计流程四、工作原理4.1完整原理图4.2仿真环境4.3基准源 2.56V4.4基准源 0.02V4.5衰减电路4.6放大电路4.7模式切换 五、程序代码六、相关资料下载 一、需求分…

python控制程控电源_程控开关与控制的基础介绍

为了使测试系统达到准确和精确就需要选择适当的仪器&#xff0c;在设计测试方法方面需要有创造性&#xff0c;同时要仔细地考虑技术指标和误差源。大多数测试系统设计的十分复杂&#xff0c;设计者们最 关心的是将不受控制的变量减少到最少。为了实现这个目的&#xff0c;此系统…

VC++控制程控电源2306读取电流

VC++开发常用功能一系列文章 (欢迎订阅,持续更新...) 吉时利2306 KEITHLEY2306通讯测试程控电源程序控制 支持双通道控制: 直接上代码: 自动化技术得到飞跃发展的今天,测试中各种仪表也都支持IEEE 488协议,可以利用PC完成控制。在GPIB总线编程中,将总结过去用到…

python控制程控电源_程控电源的用途

简介 程控电源指通过外部控制来设定输出电压、输出电流的稳压、稳流或稳压/稳流的电源。程控河试电源采用微机控制&#xff0c;技术先进&#xff0c;全程控、全按键操作&#xff0c;体积小、重量轻、携带方便&#xff0c;既可用于实验室&#xff0c;也可以现场使用。 程控电源的…