C# Modbus设备信息加载的实现方式(2)

GlobalProperties是一个全局的数据,类似CoreData:

 public class GlobalProperties
 {
     public static Device Device { set; get; }

     public static Action<int, string> AddLog;

     public static SysAdmin CurrentAdmin;

     public static ModbusTCP Modbus { get; set; }
     ///<summary>
     ///确定大小端
     ///</summary>
     public static DataFormat dataFormat = DataFormat.ABCD;


     /// <summary>
     ///通过标签名称找对应的Variable对象
     ///</summary>
     /// <param name="varName"></param>
     /// <returns></returns>
     private static Variable FindVariable(string varName)
     {
         foreach (var item in Device.GroupList)
         {
             var res = item.VarList.Find(c => c.VarName == varName);
             if (res != null)
             {
                 return res;
             }
         }
         return null;
     }

     public static bool CommonWrite(string varName, string varValue)
     {
         var variable = FindVariable(varName);

         //第一步:先找到变量对象
         if (variable != null)
         {
             // 第二步: 获取变量类型
             DataType dataType = (DataType)Enum.Parse(typeof(DataType), variable.DataType, true);
             // 第三步: 获取写入数据
             var result = MigrationLib.SetMigrationValue(varValue, dataType, variable.Scale.ToString(), variable.Offset.ToString());
             if (result.IsSuccess)
             {
                 // 第四步:写入数据
                 switch (dataType)
                 {
                     case DataType.Bool:                        
                         return Modbus.PreSetSingleColls(variable.Start, Convert.ToBoolean(result.Content));
                         /*return Modbus.PreSetSingleRegister(variable.Start, Convert.ToInt16(result.Content));*/
                     case DataType.Short:
                         return Modbus.PreSetSingleRegister(variable.Start, Convert.ToInt16(result.Content));
                     case DataType.UShort:
                         return Modbus.PreSetSingleRegister(variable.Start, Convert.ToUInt16(result.Content));
                     case DataType.Int:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromInt(Convert.ToInt32(result.Content), dataFormat));
                     case DataType.UInt:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromUInt(Convert.ToUInt32(result.Content), dataFormat));
                     case DataType.Float:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromFloat(Convert.ToSingle(result.Content), dataFormat));
                     case DataType.Double:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromDouble(Convert.ToDouble(result.Content), dataFormat));
                     case DataType.Long:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromLong(Convert.ToInt64(result.Content), dataFormat));
                     case DataType.ULong:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromULong(Convert.ToUInt64(result.Content), dataFormat));
                     case DataType.String:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromString(result.Content, Encoding.ASCII));
                     case DataType.ByteArray:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromHexString(result.Content));
                     case DataType.HexString:
                         return Modbus.PreSetMultiRegister(variable.Start, ByteArrayLib.GetByteArrayFromHexString(result.Content));
                     default:
                         break;

                 }
             }

         }

         return false;
     }

    
 }

实体设备类,含有报警的检查和恢复触发:

public class Device
{
    /// <summary>
    /// ip地址
    /// </summary>
    public string IPAddress { get; set; }

    /// <summary>
    /// 端口号
    /// </summary>
    public int Port { get; set; }

    /// <summary>
    /// 当前配方
    /// </summary>
    public string CurrentRecipe { get; set; }

    /// <summary>
    /// 通信类集合
    /// </summary>
    public List<Group> GroupList { get; set; }

    /// <summary>
    /// 通信状态
    /// </summary>
    public bool IsConnected { get; set; }
    /// <summary>
    /// 重连时间
    /// </summary>
    public int ReConnectTime { get; set; } = 100;
    /// <summary>
    /// 重连标志
    /// </summary>
    public bool ReConnect { get; set; }

    /// <summary>
    /// slave实时读取数据
    /// </summary>
    public Dictionary<string, object> CurrentValue = new Dictionary<string, object>();

    /// <summary>
    /// 定义报警触发事件和消除事件
    /// </summary>
    public event Action<bool, Variable> AlarmTrigEvent;


    public void UpdateVariable(Variable variable)
    {
        if (CurrentValue.ContainsKey(variable.VarName))
        {
            CurrentValue[variable.VarName] = variable.VarValue;
        }
        else
        {
            CurrentValue.Add(variable.VarName, variable.VarValue);
        }

        // 报警检测
        CheckAlarm(variable);
    }

    private void CheckAlarm(Variable variable)
    {
        // 上升沿报警检测  只有相关报警变量才为T
        if (variable.PosAlarm)
        {
            bool currentValue = variable.VarValue.ToString() == "1"?true:false;

            if (variable.PosCacheValue == false && currentValue == true)
            {
                // 检测到了报警触发 
                AlarmTrigEvent?.Invoke(true, variable);
            }


            if (variable.PosCacheValue == true && currentValue == false)
            {
                // 检测到了报警消除  
                AlarmTrigEvent?.Invoke(false, variable);
            }
            variable.PosCacheValue = currentValue;
        }

        // 下降沿报警检测
        if (variable.NegAlarm)
        {
            bool currentValue = variable.VarValue.ToString() == "True";
            if (variable.NegCacheValue == true & currentValue == false)
            {
                // 检测到了报警触发
                AlarmTrigEvent?.Invoke(true, variable);
            }
            if (variable.NegCacheValue == false & currentValue == true)
            {
                // 检测到了报警消除
                AlarmTrigEvent?.Invoke(false, variable);
            }
            variable.NegCacheValue = currentValue;
        }
    }



    public object this[string key]
    {
        get
        {
            if (CurrentValue.ContainsKey(key))
            {
                return CurrentValue[key];
            }
            else { return null; }

        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值