当前位置: 首页 > news >正文

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){// 上升沿报警检测  只有相关报警变量才为Tif (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; }}}}

http://www.lryc.cn/news/384027.html

相关文章:

  • mongoDB基本命令操作
  • MySQL索引,事务
  • 嵌入式软件面试记录(5)
  • Linux-笔记 OverlayFS文件系统入门
  • Kubernetes面试整理-如何配置和使用Service, Ingress?
  • 深入浅出:NPM常用命令详解与实践
  • IPv6 address status lifetime
  • OpenVINO部署
  • 面试题:MySQL优化,项目中举例
  • Spring Boot中的事件驱动编程
  • 代码随想录算法训练营第五十天| 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列
  • 【Redis】数据持久化
  • 基于Python+Flask+MySQL+HTML的B站数据可视化分析系统
  • 桥接模式
  • docker中mysql突然无法远程连接设置
  • Nuxt3 的生命周期和钩子函数(二)
  • 用英文介绍孟买:Mumbai India‘s Transforming MEGACITY
  • 镜像发布至dockerHub
  • vscode + CMake编译(opencv显示图片工程)
  • JavaScript的学习之强制类型转换
  • 天润融通:AI赋能客户体验,推动企业收入和业绩增长
  • Android与服务器交互的方式中的对称加密和非对称加密(kotlin)
  • epoch和batch的区别
  • 非递归创建二叉查找树
  • 摄影师危!AI绘画即将降维打击摄影行业
  • ts 中class
  • 深度解析RocketMq源码-高可用存储组件(四)Dledger框架日志同步流程
  • ONLYOFFICE 文档开发者版 8.1:API 更新
  • Activemq单节点在Windows下的配置部署
  • SpringBoot-注解@ImportResource引入自定义spring的配置xml文件和配置类