alielie
2026-04-23 ef52fd6fd07508883dce4eb002acda59f0169e59
SimpleUtil/HMI.Simple.Util/ParameterUtil.cs
@@ -1,4 +1,4 @@
using Microsoft.Win32;
using NationalInstruments.TestStand.Interop.API;
using System;
using System.Collections.Generic;
using System.IO;
@@ -8,8 +8,12 @@
{
    public class ParameterUtil
    {
        private static string Company = "JingCe";
        private static string Program = "HMI";
        /// <summary>
        /// 根据路径和参数名获取参数值
        /// </summary>
        /// <param name="path">路径</param>
        /// <param name="name">参数名</param>
        /// <returns>参数值</returns>
        public static string GetCommonParameterValue(string path, string name)
        {
            if (!File.Exists(path)) return null;
@@ -22,45 +26,28 @@
        /// <summary>
        /// 获取HMI里配置的参数
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        /// <param name="name">参数名</param>
        /// <returns>参数值</returns>
        public static string GetCommonParameterValue(string name, out string errMsg)
        {
            errMsg = string.Empty;
            try
            {
                string registryPath = $@"SOFTWARE\{Company}\{Program}";
                // 尝试打开注册表键
                using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registryPath))
                string value = RegUtil.GetLocaltion();
                string path = Path.Combine(value, "Config", "Parameter", "CommonParameter.data");
                if (!File.Exists(path))
                {
                    if (key == null)
                    {
                        errMsg = "注册表不存在,请先运行一次HMI";
                        return null;
                    }
                    string value = key.GetValue("Location")?.ToString();
                    if (string.IsNullOrEmpty(value))
                    {
                        errMsg = "注册表不存在,请先运行一次HMI";
                        return null;
                    }
                    string path = Path.Combine(value, "Config", "Parameter", "CommonParameter.data");
                    if (!File.Exists(path))
                    {
                        errMsg = "未找到配置文件";
                        return null;
                    }
                    List<ParameterData> datas = XmlHelper.DeserializeFromXml<List<ParameterData>>(path);
                    ParameterData data = datas.FirstOrDefault(d => d.Name == name);
                    if (data == null)
                    {
                        errMsg = "未找到参数,请检查配置";
                        return null;
                    }
                    ;
                    return data.Value;
                    errMsg = "未找到配置文件";
                    return null;
                }
                List<ParameterData> datas = XmlHelper.DeserializeFromXml<List<ParameterData>>(path);
                ParameterData data = datas.FirstOrDefault(d => d.Name == name);
                if (data == null)
                {
                    errMsg = "未找到参数,请检查配置";
                    return null;
                }
                return data.Value;
            }
            catch (Exception ex)
            {
@@ -68,5 +55,190 @@
                return null;
            }
        }
        private static void WriteParameterData(SequenceContext context, ParameterData data)
        {
            string prefix = "SystemSetting";
            if (data.IsArray)
            {
                PropertyValueTypes type;
                if (data.Type == "Bool")
                {
                    type = PropertyValueTypes.PropValType_Boolean;
                }
                else if (data.Type == "Int")
                {
                    type = PropertyValueTypes.PropValType_Number;
                }
                else if (data.Type == "Double")
                {
                    type = PropertyValueTypes.PropValType_Number;
                }
                else
                {
                    type = PropertyValueTypes.PropValType_String;
                }
                string[] arr = data.Value?.Split(',') ?? new string[0];
                if (arr.Length > 0)
                {
                    context.StationGlobals.DeleteSubProperty($"{prefix}.{data.Name}", 2);
                    context.StationGlobals.NewSubProperty($"{prefix}.{data.Name}", type, true, null, 1);
                    context.StationGlobals.GetPropertyObject($"{prefix}.{data.Name}", 0).SetNumElements(arr.Length);
                    for (int i = 0; i < arr.Length; i++)
                    {
                        if (type == PropertyValueTypes.PropValType_String)
                        {
                            context.StationGlobals.SetValString($"{prefix}.{data.Name}[{i}]", 0, arr[i]);
                        }
                        if (data.Type == "Int")
                        {
                            context.StationGlobals.SetValNumber($"{prefix}.{data.Name}[{i}]", 0, int.Parse(arr[i]));
                        }
                        if (data.Type == "Double")
                        {
                            context.StationGlobals.SetValNumber($"{prefix}.{data.Name}[{i}]", 0, double.Parse(arr[i]));
                        }
                        if (data.Type == "Bool")
                        {
                            context.StationGlobals.SetValBoolean($"{prefix}.{data.Name}[{i}]", 0, bool.Parse(arr[i]));
                        }
                    }
                }
            }
            else
            {
                if (data.Type == "Bool")
                {
                    context.StationGlobals.SetValBoolean($"{prefix}.{data.Name}", 1, bool.Parse(data.Value));
                }
                else if (data.Type == "Int")
                {
                    context.StationGlobals.SetValNumber($"{prefix}.{data.Name}", 1, int.Parse(data.Value));
                }
                else if (data.Type == "Double")
                {
                    context.StationGlobals.SetValNumber($"{prefix}.{data.Name}", 1, double.Parse(data.Value));
                }
                else
                {
                    context.StationGlobals.SetValString($"{prefix}.{data.Name}", 1, data.Value);
                }
            }
        }
        /// <summary>
        /// 将参数写进Engine的StationGlobals.StationState
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static bool WriteConfigToContext(object instance, out string errMsg)
        {
            errMsg = string.Empty;
            try
            {
                string value = RegUtil.GetLocaltion();
                string path = Path.Combine(value, "Config", "Parameter", "CommonParameter.data");
                return WriteConfigToContext(path, instance, out errMsg);
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return false;
            }
        }
        /// <summary>
        /// 将参数写进Engine的StationGlobals.StationState
        /// </summary>
        /// <param name="xmlPath">绝对路径</param>
        /// <param name="instance">TestStand上下文</param>
        /// <param name="errMsg">异常信息</param>
        /// <returns>是否成功</returns>
        public static bool WriteConfigToContext(string xmlPath, object instance, out string errMsg)
        {
            errMsg = string.Empty;
            try
            {
                SequenceContext context = (SequenceContext)instance;
                if (string.IsNullOrEmpty(xmlPath))
                {
                    throw new Exception("配置文件路径不能为空");
                }
                if (!File.Exists(xmlPath))
                {
                    throw new Exception("未找到配置文件");
                }
                List<ParameterData> datas = XmlHelper.DeserializeFromXml<List<ParameterData>>(xmlPath);
                foreach (var data in datas)
                {
                    WriteParameterData(context, data);
                }
                return true;
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return false;
            }
        }
        /// <summary>
        /// 将参数写进Engine的StationGlobals.StationState
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static bool WriteConfigToEngineByName(string xmlPath, object instance, string name, out string errMsg)
        {
            errMsg = string.Empty;
            try
            {
                SequenceContext context = (SequenceContext)instance;
                if (string.IsNullOrEmpty(xmlPath))
                {
                    throw new Exception("配置文件路径不能为空");
                }
                if (!File.Exists(xmlPath))
                {
                    throw new Exception("未找到配置文件");
                }
                List<ParameterData> datas = XmlHelper.DeserializeFromXml<List<ParameterData>>(xmlPath);
                ParameterData data = datas.FirstOrDefault(d => d.Name == name);
                if (data == null)
                {
                    throw new Exception("未找到参数,请检查配置");
                }
                WriteParameterData(context, data);
                return true;
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return false;
            }
        }
        /// <summary>
        /// 将参数写进Engine的StationGlobals.StationState
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static bool WriteConfigToEngineByName(object instance, string name, out string errMsg)
        {
            errMsg = string.Empty;
            try
            {
                SequenceContext engine = (SequenceContext)instance;
                string value = RegUtil.GetLocaltion();
                string path = Path.Combine(value, "Config", "Parameter", "CommonParameter.data");
                return WriteConfigToEngineByName(path, instance, name, out errMsg);
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return false;
            }
        }
    }
}