C# ModbusTcp(协议)

2023-10-30

以下用例为读取线圈,可读取多个连续的线圈(01功能码)

            //起始地址
            var inputAddress = 4;
            //读取长度
            var inputReadLength = 8;

            var station = BitConverter.GetBytes(4)[0]; //从站地址
            var funCode = BitConverter.GetBytes(1)[0];//功能码

            var startAddress = BitConverter.GetBytes(inputAddress)[1];
            var endAddress = BitConverter.GetBytes(inputAddress)[0];
            var startLength = BitConverter.GetBytes(inputReadLength)[1];
            var endLength = BitConverter.GetBytes(inputReadLength)[0];

            TcpClient tcpClient = new TcpClient();
            tcpClient.Connect("", 502);
            byte[] by = new byte[]
            {
                //事物标识符
                0x00,
                0x00,
                //协议标识符 固定值
                0x00,
                0x00,
                //长度
                0x00,
                0x06,
                //从站地址
                station,
                //功能码
                funCode,
                startAddress, //起始地址
                endAddress,
                startLength, //读个数
                endLength
            };

            tcpClient.Client.Send(by);

            byte[] result = new byte[1024];
            var ulength = tcpClient.Client.Receive(result);

            var newResult = result.ToList().Take(ulength).ToArray();
            //输出报文
            var output = string.Join(" ", newResult.Select(x => x.ToString("X2")));


            //00 00 00 00 00 04 04 01 01 00

            //00 00 //事物标识符 服务器复制
            //00 00 //协议标识符 固定值
            //00 04 //长度
            //04    //从站地址
            //01    //功能码
            //01    //个数
            //00    //数值

            byte[] bol = new byte[newResult[8]];
            if (newResult[8] > 1)
            {
                for (int i = 0; i < bol.Length; i++)
                    bol[i] = newResult[8 + i + 1];

                var getbyte = ByteToBoolArray(bol, by[by.Length - 1]);
                getbyte.ToList().ForEach(x =>
                {
                    Console.WriteLine(x);
                });
            }
            else
            {
                bol[0] = newResult[9];
                var getbyte = ByteToBoolArray(bol, by[by.Length - 1]);

                getbyte.ToList().ForEach(x =>
                {
                    Console.WriteLine(x);
                });
            }

        }

        public static bool[] ByteToBoolArray(byte[] InBytes, int length)
        {
            if (InBytes == null) return null;

            if (length > InBytes.Length * 8) length = InBytes.Length * 8;

            bool[] buffer = new bool[length];

            for (int i = 0; i < length; i++)
            {
                int index = i / 8;
                int offect = i % 8;

                byte temp = 0;
                switch (offect)
                {
                    case 0: temp = 0x01; break;
                    case 1: temp = 0x02; break;
                    case 2: temp = 0x04; break;
                    case 3: temp = 0x08; break;
                    case 4: temp = 0x10; break;
                    case 5: temp = 0x20; break;
                    case 6: temp = 0x40; break;
                    case 7: temp = 0x80; break;
                    default: break;
                }

                if ((InBytes[index] & temp) == temp)
                {
                    buffer[i] = true;
                }
            }

            return buffer;
        }

其他读写削微修改一下即可,如写入多个连续的float类型(float需要注意字节排序规则 ABCD...)

00 00 
00 00 
00 0F //报文长度

01 //从站地址

10 //功能码
00 00 //起始地址
00 04 //读取长度
08   //字节长度
42 05 33 33 
42 05 33 33

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# ModbusTcp(协议) 的相关文章

随机推荐

  • 可解释的机器学习

    原文标题 Interpretable Machine Learning 作者 Parul Pandey 译者 intelLigenJ 算法工程师 鸢尾 编辑 王立鱼 原文链接 https towardsdatascience com int
  • [思维模式-5]:《如何系统思考》-1- 认识篇 - 总体结构与知识框架

    目录 前言 第一篇 认知篇 第1章 无所不在的系统 2 第2章 思维的转变 30 第二篇 方法与工具 第3章 深入思考 50 第4章 动态思考 78 第5章 全面思考 109 第6章 系统思考的 新语言 因果回路图 140 第7章 复杂背后
  • SpringCloud微服务项目快速搭建(SpringCloud Alibaba)

    一 概述 Spring Cloud Alibaba 是 Spring Cloud 和 Alibaba 面向微服务架构的一站式解决方案 为 Spring Cloud 生态中的各个组件提供了与 Alibaba 中间件的衔接 更方便 更易用的快速
  • Kali镜像下载

    http old kali org kali images 太全了 爱了爱了 存档
  • go语言实现NFT

    此文章以及链码 合约 均为原创 已通过以heco nft记录为NFT资产 HecoInfo Transaction Hash Txhash Details HecoInfo 请勿转载 如有兴趣 可扫描文章最后的二维码 基于erc721的以太
  • linux 硬盘分区,分区,删除分区,格式化,挂载,卸载笔记

    linux 虽然一直都有在玩 但是对硬盘操作确实不是很熟悉今天有空 就整理了下 1 创建分区 先查看下是否有磁盘没有分区 html view plain copy fdisk l 其中第一个框和第二个框 是已经分好区的磁盘 第三个硬盘没有分
  • 深入jvm虚拟机第4版_深入JVM虚拟机,阿里架构师直言,这份文档真的是JVM最深解读...

    作为一名优秀的 Java 开发程序员 以及想那些想要学习 Java 更深层一点的知识的同学 对 JVM 的熟悉与熟练使用是必不可缺的核心技能了 也是每个 Java 程序员应该要做到的 深入学习 JVM 可以有助于我们掌握 Java 应用程序
  • 推荐一款提高工作效率的屏幕扩展软件—Splashtop Wired XDisplay

    一 导读 使用Splashtop Wired XDisplay让闲置的手机平板成为电脑的第二块屏幕Splashtop Wired XDisplay 好文章 记得 收藏 点赞 关注 如果你和我一样抱怨着显示器太小 Idea编程软件占用了太多工
  • 03 ZooKeeper底层原理剖析与命令实战

    文章目录 03 ZooKeeper底层原理剖析与命令实战 1 Znode数据结构 1 1 目录结构 1 2 节点类型 2 ZK客户端命令行操作 3 ZooKeeper会话 4 事件监听机制原理剖析 5 广播模式剖析 6 ZooKeeper集
  • vs报错:TRACKER : 错误 TRK0005: 未能找到: “CL.exe”。系统找不到指定的文件

    平台 win 10 错误 如题 解决 1 参考 Windows11下配置Visual Studio2022 环境变量 Windows下配置Visual Studio 通用 2 1 运行 C Program Files Microsoft V
  • java定义一个类_Java类的定义格式:Java如何定义一个类

    在面向对象的思想中 最核心的就是对象 为了在程序中创建对象 首先需要定义一个类 类是对象的抽象 它用于描述一组对象的共同特征和行为 例如人都有姓名 年龄 性别等特征 还有学习 工作 购物等行为 以面向对象的编程思想 就可以将某一类中共同的特
  • 图的深度优先搜索和广度优先搜索

    图的深度优先搜索算法 dfs 图的深度优先搜索算法是以一个顶点为起始点开始挖掘 一个分支挖掘完 再继续挖掘下一个分支 在实现上需要用到栈 因此 图的深度优先搜索算法有很多条路径 取决于哪个顶点最先入栈 实现思路 非递归 dfs可以用栈来进行
  • 解决QT中TCP传数据的困惑

    问题一 当传输数据过大时 readAll不能读完这一条完整的报文 报文格式如下 解决方法 针对此问题 可以通过一个全局变量 将多次读到的数据合并 问题二 粘包现象之多次write对应一次read 深入查看ReadyRead 信号的产生条件可
  • CNN笔记:通俗理解卷积神经网络

    通俗理解卷积神经网络 cs231n与5月dl班课程笔记 1 前言 2012年我在北京组织过8期machine learning读书会 那时 机器学习 非常火 很多人都对其抱有巨大的热情 当我2013年再次来到北京时 有一个词似乎比 机器学习
  • make编译出错Relocations in generic ELF (EM: 62)

    参考 编译出错Relocations in generic ELF EM 62 main o Relocations in generic ELF EM 62 错误信息是 通过查看文件 main o 发现ELF 64bit x86 64 在
  • ClickHouse副本同步及分布式DDL的原理

    相信了解大数据的小伙伴们都知道 基本上所有的分布式存储系统都有一个共同的特点 将庞大的数据量分成多个小块存储在不同的机器上 通常称为分片 每个分片为了保证它数据不丢失 它们又有各自副本 ClickHouse也不例外 一起来看看ClickHo
  • 5.Mybatis 缓存详解

    5 1 一级缓存 一级缓存 也叫本地缓存 默认会开启 并且不能控制 想要关闭一级缓存可以在select标签上配置flushCache true 一级缓存存在于 SqlSession 的生命周期中 在同一个 SqlSession 中查询时 M
  • 微信小程序之如何注册微信小程序

    注册小程序帐号 在微信公众平台官网首页 mp weixin qq com 点击右上角的 立即注册 按钮 选择注册的帐号类型 显示了4选项 我们现在是注册小程序 所以选择小程序 填写邮箱和密码 请填写未注册过公众平台 开放平台 企业号 未绑定
  • VMware虚拟机安装ubuntu20.04缓慢、卡顿

    背景 VMware Workstation版本是14 本地虚拟机上ubuntu版本是16 04的 有32位和64位 编译原理课程需要18或20以上的版本 决定再装一个20的 出现各种问题 进入黑屏 等三五分钟才缓过来 选择语言中文后 安装卡
  • C# ModbusTcp(协议)

    以下用例为读取线圈 可读取多个连续的线圈 01功能码 起始地址 var inputAddress 4 读取长度 var inputReadLength 8 var station BitConverter GetBytes 4 0 从站地址