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

Modbus-RTU协议C#实现

1、安装依赖包
System.IO.Ports
2、读协议

/// <summary>/// Modbus-RTU协议读实例/// </summary>private static void Read(){//组装一个请求报文// 01 03 00 00 00 0A C5 CDbyte slave = 0x01;//byte function = 0x03;   //读单个寄存器byte function = 0x01;   //读单个线圈状态int startAddress = 0;int length = 10;List<byte> bytes = new List<byte>();bytes.Add(slave);bytes.Add(function);bytes.Add(BitConverter.GetBytes(startAddress)[1]);bytes.Add(BitConverter.GetBytes(startAddress)[0]);bytes.Add(BitConverter.GetBytes(length)[1]);bytes.Add(BitConverter.GetBytes(length)[0]);//CRC校验bytes = CRC16(bytes);//组装好了进行串口通信SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.Open();//向从站发送请求serialPort.Write(bytes.ToArray(), 0, bytes.Count);Task.Run(async () =>{await Task.Delay(100);byte[] buffer = new byte[serialPort.BytesToRead];serialPort.DiscardInBuffer();List<byte> bufferList = new List<byte>(buffer);bufferList.RemoveAt(0);bufferList.RemoveAt(0);bufferList.RemoveAt(0);bufferList.RemoveAt(bufferList.Count - 1);bufferList.RemoveAt(bufferList.Count - 1);//读寄存器//for(int i = 0; i < bufferList.Count; i++)//{//    List<byte> valueList = new List<byte>();//    valueList.Add(bufferList[i]);//    valueList.Add(bufferList[++i]);//    valueList.Reverse();//    ushort value=BitConverter.ToUInt16(valueList.ToArray(), 0);//    Console.WriteLine(value);//}//读线圈 09 00bufferList.Reverse();var values = string.Join("", bufferList.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')).ToList()).ToList();values.Reverse();for (int i = 0; i < values.Count; i++){Console.WriteLine(Convert.ToBoolean(int.Parse(values[i].ToString())));}});}

3、写协议

/// <summary>/// Modbus-RTU协议写实例/// </summary>private static void Write(){//组装报文byte slave = 0x01;//byte function = 0x05;   //写单个线圈状态byte function = 0x06;   //写单个寄存器int startAddress = 0;bool value = false;int iv = 123;List<byte> bytes = new List<byte>();bytes.Add(slave);bytes.Add(function);bytes.Add(BitConverter.GetBytes(startAddress)[1]);bytes.Add(BitConverter.GetBytes(startAddress)[0]);//单线圈的写入//bytes.Add(value ? (byte)0xFF : (byte)0x00);//bytes.Add(0x00);//单寄存器写入bytes.Add(BitConverter.GetBytes(iv)[1]);bytes.Add(BitConverter.GetBytes(iv)[0]);//CRC校验bytes = CRC16(bytes);SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.Open();//向从站发送请求serialPort.Write(bytes.ToArray(), 0, bytes.Count);//接收后如果报文一致,说明发送请求成功}

4、CRC16校验

/// <summary>/// CRC-16校验/// </summary>/// <param name="value"></param>/// <param name="poly"></param>/// <param name="crcInit"></param>/// <returns></returns>/// <exception cref="ArgumentException"></exception>private static List<byte> CRC16(List<byte> value,ushort poly=0xA001,ushort crcInit=0xFFFF){if (value == null || !value.Any())throw new ArgumentException("");//运算ushort crc = crcInit;for(int i=0; i<value.Count; i++){crc = (ushort)(crc ^ value[i]);for(int j=0; j<8; j++){crc=(crc&1)!=0?(ushort)((crc>>1)^poly):(ushort)(crc>>1);}}byte hi = (byte)((crc & 0xFF00) >> 8);byte lo=(byte)(crc & 0xFF);List<byte> buffer = new List<byte>();buffer.AddRange(value);buffer.Add(lo);buffer.Add(hi);return buffer;}
http://www.lryc.cn/news/105169.html

相关文章:

  • Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)
  • 基于组合双向拍卖的共享储能机制研究(Matlab代码实现)
  • 服务机器人有哪些品类
  • 3.netty和protobuf
  • NLP实践——Llama-2 多轮对话prompt构建
  • 《TCP IP网络编程》第十四章
  • 网络基础-认识每层的设备和每层的特点用途
  • 【Linux操作系统】深入解析Linux定时任务调度机制-cronat指令
  • 动手学深度学习(一)预备知识
  • item_get-KS-获取商品详情
  • [华为OD] 最小传输时延(dijkstra算法)
  • 问道管理:总资产大于总市值好吗?
  • IBM Spectrum LSF (“LSF“ ,简称为负载共享设施) 用户案例
  • Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)
  • Gis入门,使用起止点和两个控制点生成三阶贝塞尔曲线(共四个控制点,线段转曲线)
  • Web-7-深入理解Cookie与Session:实现用户跟踪和数据存储
  • Springboot设置Https
  • Windows 使用 Linux 子系统,轻轻松松安装多个linux
  • 中级课程——弱口令(认证崩溃)
  • web自动化测试进阶篇05 ——— 界面交互场景测试
  • NICE-SLAM: Neural Implicit Scalable Encoding for SLAM论文阅读
  • cmake 配置Visual studio的调试命令
  • MPDIoU: A Loss for Efficient and Accurate Bounding BoxRegression--论文学习笔记
  • 【Uniapp 的APP热更新】
  • MySQL主从复制配置
  • Linux - 添加普通用户为信任用户
  • flask----路由系统
  • 驶向专业:嵌入式开发在自动驾驶中的学习之道
  • Go语言入门:从零开始的快速指南(一)
  • Windows7+内网, 安装高版本nodejs,使用vite+vue3+typescript开发项目