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.mzph.cn/news/863355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的药房信息管理系统

1 项目介绍 1.1 研究的背景及意义 随着社会的飞速进步和药房行业竞争的白热化&#xff0c;传统的手工管理模式已难以适应药房信息管理的现代化需求。在计算机科学技术日臻完善的背景下&#xff0c;药房信息管理者们日益认识到运用计算机技术进行信息管理的迫切性和重要性。计…

【Git】LFS

什么是lfs Git 是分布式 版本控制系统&#xff0c;这意味着在克隆过程中会将仓库的整个历史记录传输到客户端。对于包涵大文件&#xff08;尤其是经常被修改的大文件&#xff09;的项目&#xff0c;初始克隆需要大量时间&#xff0c;因为客户端会下载每个文件的每个版本**。Gi…

快手正式推出Vision Pro版本,引领虚拟现实社交新潮流

6月28日&#xff0c;快手正式推出其专为Apple Vision Pro打造的版本——快手vp版app&#xff0c;成为国内首批登陆Apple Vision Pro的短视频平台。 借助先进的虚拟现实技术&#xff0c;用户可以在快手上体验更真实生动的视频内容&#xff0c;无论是观看趣味短视频内容&#xf…

产品是应该有生命力的

产品是应该有生命力的 在日新月异的商业环境中&#xff0c;产品被寄予厚望&#xff0c;不仅仅满足基本功能需求&#xff0c;而是要能够自我革新&#xff0c;适应市场和技术的快速变化&#xff0c;以及持续吸引并留住用户。 这种生命力体现在产品的迭代升级能力、对用户需求的精…

[鹏城杯 2022]babybit

发现一个压缩包提取出来提取出来两个压缩包里面是注册表使用MiTeC Windows Registry Recovery 恢复注册表 flag在ROOT\ControlSet001\Control\FVEStats里的OsvEncryptInit和OsvEncryptComplete中 NSSCTF{2022/6/13_15:17:39_2022/6/13_15:23:46}

互联网信任危机:Perplexity搜索引擎如何破坏内容创作者的权益

前段时间&#xff0c;Perplexity搜索引擎还是一颗冉冉升起的明日之星&#xff0c;手握巨额投资&#xff0c;有很美好的未来前景&#xff0c;这时&#xff0c;如果不出意外的话&#xff0c;要出意外。 喜好儿网 Perplexity这家公司&#xff0c;它正试图通过创建一个新型的“答…

LoRaWAN网关源码分析(基础概念篇)

目录 一、简介 1、lora_gateway 2、packet_forwarder 二、目录结构 1、lora_gateway 2、packet_forwarder 一、简介 LoRaWAN网关的实现主要依赖两个源代码&#xff1a;lora_gateway和packet_forwarder。接下来&#xff0c;我们将从分析源代码入手&#xff0c;移植LoRaWAN源…

LeetCode:经典题之21、24 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 …

深入探讨目标检测算法:原理、方法与应用

目录 1. 目标检测的基本原理 1.1 分类与定位 1.2 评价指标 2. 常见目标检测算法 2.1 传统方法 2.2 基于深度学习的方法 2.2.1 区域提议方法 2.2.2 单阶段检测方法 3. 目标检测算法的发展历程 3.1 早期阶段 3.2 深度学习时代 4. 目标检测的实际应用 4.1 自动驾驶 …

网页背景全屏就这?分享 1 段优质 CSS 代码片段!

大家好&#xff0c;我是大澈&#xff01; 本文约 700 字&#xff0c;整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段 CSS 代码片段&#xff0c;使用 CSS 设置网页全屏背景图片&#xff0c;很简单。 老规矩&#xff0c;先阅读代码片段并思考&#xff0c;再看…

Android Focused Window的更新

启动App时更新inputInfo/请求焦点窗口流程&#xff1a; App主线程调ViewRootImpl.java的relayoutWindow()&#xff1b;然后调用到Wms的relayoutWindow()&#xff0c;窗口布局流程。焦点窗口的更新&#xff0c;通过WMS#updateFocusedWindowLocked()方法开始&#xff0c;下面从这…

MIX OTP——监督树和应用

在上一章关于 GenServer 的内容中&#xff0c;我们实现了 KV.Registry 来管理存储容器。在某个时候&#xff0c;我们开始监控存储容器&#xff0c;这样每当 KV.Bucket 崩溃时&#xff0c;我们就能采取行动。虽然变化相对较小&#xff0c;但它提出了一个 Elixir 开发人员经常问的…

独家原创 | Matlab实现CNN-Transformer多变量时间序列预测

SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测 目录 SCI一区级 | Matlab实现BO-Transformer-GRU多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-Transformer多变量时间序列预测&#xff1b; 2.运行环境为Matlab2023b…

【JavaScript】JavaScript简介

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 JavaScript入门&#xff08;1&#xff09;————JavaScript简介开篇说明一、什么是JavaScript二、JavaScript的使用2.1 开发工具的选择…

JAVA 面试常见问题详解

JAVA 面试常见问题详解 目录 基础知识 Java基础面向对象编程异常处理 高级特性 多线程与并发集合框架JVM原理 实战问题 代码优化设计模式Spring框架 常见算法与数据结构 排序算法树与图动态规划 系统设计与架构 高并发系统设计分布式系统微服务架构 基础知识 Java基础 JDK…

fiddler抓包工具

概念 概念&#xff1a; Fiddler是一个http协议调试代理工具&#xff0c;它能够记录并检查所有你的电脑和互联网之间的http通讯。 http&#xff1a;不加密&#xff0c;端口为80 https&#xff1a;加密&#xff0c;端口为443 原理&#xff1a; 其实就在访问服务器时&#xff0…

如何在写代码中找到乐趣

平时我们写代码呢&#xff0c;多数情况都是流水线式写代码&#xff0c;基本就可以实现业务逻辑了。 如何在写代码中找到乐趣呢&#xff0c;我觉得&#xff0c;最好的方式就是&#xff1a;使用设计模式优化自己的业务代码。 参考资料&#xff1a; 实战&#xff01;工作中常用到…

[方法] Unity 3D模型与骨骼动画

1. 在软件中导出3D模型 1.1 3dsmax 2014 1.1.1 TGA转PNG 3dsmax的贴图格式为tga&#xff0c;我们需要在在线格式转换中将其转换为Unity可识别的png格式。 1.1.2 模型导出 导出文件格式为fbx。在导出设置中&#xff0c;要勾选三角算法&#xff0c;取消勾选摄像机和灯光&#…

三秒4张图!让 Stable Diffusion 出图速度暴增的新一代生成模型LCM!

前言 大家好&#xff0c;这里是和你们一起探索 AI绘画月月~ 最近一种新的图像生成形式逐渐兴起&#xff0c;即生成的图像会随输入的文字或笔画动作迅速变化&#xff0c;这让图像生成有了更多灵活探索和准确控制的空间。这种「实时反馈」的感觉源于模型能在几秒钟内&#xff0…

springMVC中的拦截器

文章目录 11、拦截器11.1书写拦截器的步骤一、首先需要在SpringMVC.xml中配置拦截器二、处理完配置文件进行配置类的书写书写的类需要实现HandlerInterceptor接口 11.2多个拦截器的执行顺序⑴如果每个拦截器的preHandle()都返回true⑵如果某个拦截器的preHandle()返回了false⑵…