C#与PLC通讯时,数据读取和写入浮点数,字节转换问题(ModbusTCP)

在与PLC进行通讯时,会发现一个问题,浮点数1.2接收过来后,居然变成了两个16位的整数。
在这里插入图片描述
经过一系列的分析,这是因为在PLC存储浮点数时32位,我们接收过来的数据会变成两个16位的高低字节,而且我们进行下发数据时,也需要进行转换,否则PLC那边的数据会乱码。
我这边使用的资源包是NModbus来实现ModbusTCP通讯的,可以根据自己的需求进行下载程序包。如果是其他的通讯方式遇到字节转换问题,可也以直接用核心代码。
在这里插入图片描述
现在开始上核心代码

读取数据浮点数处理

在这里插入图片描述
从104的点位开始读取了11位的数据,01、23 、45则是读取的浮点数转换为的高低字节,这时候我们需要封装一个方法 ConvertRegistersToDecimal 进行数据处理。
这里大家需要注意一下,浮点数float是32位,double是64位,decimal是128位,因为我这边的浮点数是decimal,所以进行了强制转换,如果没有强制转换的话则是32位float。

 private decimal ConvertRegistersToDecimal(ushort highPart,ushort lowPart){decimal result = (decimal)BitConverter.ToSingle(new byte[]{(byte)(highPart & 0xFF),(byte)((highPart >> 8) & 0xFF),(byte)(lowPart & 0xFF),(byte)((lowPart >> 8) & 0xFF)}, 0);return result;// Incorrect, just for illustration}

还有一点需要注意,字节的顺序不要写错,比如[0]和[1]。

写入浮点数数据处理

这里和读取的概念一样,有一点需要再次强调一下,浮点数float是32位,double是64位,decimal是128位,因为我这边的浮点数是decimal,所以进行了强制转换,如果没有强制转换的话则是32位float。
我们这里进行转换时,记得把浮点数转变为32位float类型。我这里用的时decimal,转成了float。
在这里插入图片描述
我们在写入数据时需要进行一下数据处理,封装一个ConvertDecimalToRegisters方法,我这里用的时decimal,转成了float。

 private ushort[] ConvertDecimalToRegisters(decimal value){float floatValue = (float)value; // 示例值// 将浮点数转换为字节数组(注意:这里假设PLC期望的是IEEE 754标准的32位浮点数)byte[] floatBytes = BitConverter.GetBytes(floatValue);// 发送浮点数到PLC(注意:这里假设NModbus库支持直接发送浮点数,如果不支持,则需要手动拆分字节并发送到两个16位寄存器中)// 但是,请注意,NModbus实际上并不直接支持写入浮点数到单个寄存器地址。// 你需要将其拆分为两个16位值或使用支持浮点数的库扩展。// 正确的做法应该是:ushort[] registerValues = new ushort[2];if (BitConverter.IsLittleEndian){registerValues[0] = (ushort)((floatBytes[2] << 8) | floatBytes[3]); // 高16位(对于小端字节序)registerValues[1] = (ushort)((floatBytes[0] << 8) | floatBytes[1]); // 低16位(对于小端字节序)}else{registerValues[0] = (ushort)((floatBytes[0] << 8) | floatBytes[1]); // 高16位(对于大端字节序,但不常见)registerValues[1] = (ushort)((floatBytes[2] << 8) | floatBytes[3]); // 低16位(对于大端字节序,但不常见)}ushort[] a = { BitConverter.ToUInt16(floatBytes, 0), BitConverter.ToUInt16(floatBytes, 2) };return a;}

到此我们的与PLC通讯的浮点数问题已经解决,如有疑问,欢迎大家商讨。
小白路漫漫,让我们一起加油!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/33693.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

替代FTP最佳跨网文件传输解决方案——FileLink

在传统的企业文件传输中&#xff0c;FTP&#xff08;文件传输协议&#xff09;曾因其便捷性和高效性被广泛应用。然而&#xff0c;其固有的安全漏洞、对大文件传输支持的局限性、易受网络攻击等问题&#xff0c;已逐渐暴露出FTP在现代企业环境下的不足。针对这一问题&#xff0…

纯粹直播 1.7.7 |手机版和TV版,聚合六大直播平台,原画播放

纯粹直播是一款开源的应用程序&#xff0c;支持兴趣化主题的游戏直播、户外直播和才艺直播节目。目前可以观看斗鱼、B站、虎牙和抖音等六大直播平台的内容。该应用适配了安卓手机和电视盒子平台使用&#xff0c;并且软件无广告&#xff0c;提供原画质播放体验。 大小&#xff…

汉诺塔(递归)

递归、搜索与回溯算法 文章目录 递归、搜索与回溯算法前言一、递归的思想二、汉诺塔三、为什么可以使用递归思想&#xff1f;四、代码实现 Leetcode汉诺塔 前言 这是记录我学习算法的一个专题&#xff0c;如果你正在备战这类比赛&#xff0c;我想这对你一定有帮助。 一、递归…

【JUC-锁升级】简要版本

锁升级过程 一、偏向锁二、轻量级锁三、重量级锁四、整体流程 为什么不全部使用Synchronized、Lock等重量级锁呢&#xff1f; 重量级锁底层是基于操作系统的互斥锁实现的&#xff0c;涉及到用户态与内核态之间的切换。 一、偏向锁 如果只有一个线程A频繁的访问某一个共享资源…

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构&#xff0c;它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试&#xff1f; 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…

家庭财务管理系统的设计与实现ssm小程序+论文源码调试讲解

2系统关键技术 2.1 微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验。 小程序的主要开发语言是JavaScript&#xff0c;它与普…

linux运维命令

防火墙相关命令 防火墙规则查看 firewall-cmd --list-all 禁ping firewall-cmd --permanent --add-rich-rulerule protocol valueicmp drop firewall-cmd --reload 执行完以上命令后&#xff0c;通过firewall-cmd --list-all查看规则生效情况 firewall-cmd --list-all 其…

高通---Camera调试流程及常见问题分析

文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中&#xff0c;经常会遇到各种状况&#xff0c;本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…

HCIA-openGauss_2_1数据库安装部署

本章导读 openGauss是关系型数据库&#xff0c;采用客户端/服务器&#xff0c;单进程多线程架构&#xff0c;支持单机和一主多备部署方式&#xff0c;备机可读&#xff0c;支持双机高可用和读扩展。 本章详细介绍了安装openGauss的环境和安装部署配置、openGauss数据库的连接…

《Tyche: Stochastic In-Context Learning for Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了一个名为Tyche的模型&#xff0c;它用于医学图像分割任务。Tyche通过使用上下文集来为以前未见过的任务生成随机预测&#xff0c;无需重新训练。该模型解决了两个主要问题&#xff1a;1) 对于大多数新的分割任务&#xff0c;需要重新训练或微调新模型&…

47 基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

NAND闪存行业全面且深入的分析

根据QYResearch调研团队的最新报告“全球NAND闪存市场报告2023-2029”&#xff0c;预计2029年全球NAND闪存市场规模将达到1263亿美元&#xff0c;未来几年年复合增长率&#xff08;CAGR&#xff09;为10.0%。这一预测揭示了NAND闪存市场的强劲增长潜力。 一、市场研究与发展趋…

html-两个div,让一个div跟随另外一个div的高度

在开发的过程中遇到有些场景事这样的&#xff0c;两个div的高度不一致&#xff0c;而且都是动态高度&#xff0c;有的时候div1高&#xff0c;有的时候div2高&#xff0c;如果设置flex的话&#xff0c;那么就会把较矮的元素撑大&#xff0c;但是我想始终都以div1的高度作为基准&…

函数方法不占额外存储空间(内存分区)?

上篇博客说到扩展是不会增加存储空间的&#xff0c;且扩展不能扩展存储属性。既然这样&#xff0c;那我们就能理所应当推断出方法是不占存储空间的&#xff0c;为什么呢&#xff1f; 首先&#xff0c;我们要先了解内存的五大分区&#xff1a;栈&#xff0c;堆&#xff0c;静态…

IDEA注释格式、匹配补全调整

1.注释格式调整 目前重新捡起一部分Java&#xff0c;写代码时候发现注释快捷键总是放在第一列&#xff0c;看起来很难受&#xff0c;故寻找方法如下&#xff1a; 分别点击 编辑器-代码样式-Java 修改注释代码选项如下 2.大小写匹配补全问题 还发现在写代码过程中&#xff0c…

抖音矩阵系统快速部署指南/抖音矩阵系统源码分发,短视频矩阵账号管理系统开发部署—

抖音矩阵系统的源码分发与短视频账号管理平台的开发部署&#xff0c;要求通过对接官方API来实现功能的拓展。当前开发的账号矩阵管理系统专注于提供一键式管理多个账户的能力&#xff0c;支持定时发布内容、自动化关键词生成以实现搜索引擎优化&#xff08;SEO&#xff09;和霸…

算法笔记:力扣49.字母异位词分组

思路&#xff1a;排序哈希表映射 关键API&#xff1a; char [] arr str.toCharArray(); 将字符串转为字符数组返回。 Arrays.sort(arr)&#xff1b; 对数组进行排序&#xff1b; Map.getOrDefault(Object key, V defaultValue): 要查找的键和默认值。如果键存在&#xf…

医疗服务高质量发展项目会议在杭州成功举办

2024年11月30日&#xff0c;医疗服务高质量发展项目会议在杭州成功举办&#xff0c;此次会议旨在探讨医疗服务领域的最新进展和未来趋势&#xff0c;推动医疗服务的高质量发展。来自全国各地的医院管理者、专家学者齐聚一堂&#xff0c;共同分享智慧医疗、绩效考核、精细化管理…

k近邻法基本知识简记

一、原理与概念 1、样本 k近邻法使用的样本数据集合&#xff0c;称作训练样本集&#xff0c;并且样本集中每个数据都存在标签&#xff0c;即样本集中每个数据与所属分类的对应关系已知。 2、原理 输入没有标签的新数据后&#xff0c;将新数据的每个特征与样本集中数据对应的…

开源C代码之路:一、Gitee

开源c代码之路&#xff1a;一&#xff0c;Gitee 前言1、开源项目2、从哪里找&#xff1f;3、举个例子4、总结&#xff1a; 本系列回顾清单开源代码示例 前言 从开源开发的角度&#xff0c;由浅入深&#xff0c;一步步初探C语言编程的入门之路。 本篇讲解&#xff1a;Gitee 1…