1.什么是Modbus?

  Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间,控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus协议定义了一个控制器能认识使用的消息结构,而不管他们是经过何种网络进行通信的。它描述了一个控制器请求访问其他设备的过程,如果回应来自其他设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

Modbus是一个请求/应答协议。

以下是要分解的Modbus热图

Modbus消息帧

了解了它,会使你对串口有一个清晰的认识!

通用消息帧

ASCII消息帧(在消息中的每个8Bit字节都作为两个ASCII字符发送)

十六进制,ASCII字符0...9,A...F

消息中的每个ASCII字符都是一个十六进制字符组成

每个字节的位

1个起始位

n个数据位,最小的有效位先发送

1个奇偶校验位,无校验则无

1个停止位(有校验时),2个Bit(无校验时)

错误检测域

LRC(纵向冗长检测)

RTU消息帧

8位二进制,十六进制数0...9,A...F

消息中的每个8位域都是一个两个十六进制字符组成

每个字节的位

1个起始位

8个数据位,最小的有效位先发送

1个奇偶校验位,无校验则无

1个停止位(有校验时),2个Bit(无校验时)

错误检测域

CRC(循环冗长检测)

CRC校验(http://baike.baidu.com/view/1664507.htm)

  1. public static string CRCCheck(string val)
  2. {
  3. val = val.TrimEnd(' ');
  4. string[] spva = val.Split(' ');
  5. byte[] bufData = new byte[spva.Length + 2];
  6. bufData = ToBytesCRC(val);
  7. ushort CRC = 0xffff;
  8. ushort POLYNOMIAL = 0xa001;
  9. for (int i = 0; i < bufData.Length - 2; i++)
  10. {
  11. CRC ^= bufData[i];
  12. for (int j = 0; j < 8; j++)
  13. {
  14. if ((CRC & 0x0001) != 0)
  15. {
  16. CRC >>= 1;
  17. CRC ^= POLYNOMIAL;
  18. }
  19. else
  20. {
  21. CRC >>= 1;
  22. }
  23. }
  24. }
  25. return Maticsoft.DBUtility.HLConvert.ToHex(System.BitConverter.GetBytes(CRC));
  26. }
  27. /// <summary>
  28. /// 例如把如下字符串转换成字节数组
  29. /// AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB 转换为字节数组
  30. /// </summary>
  31. /// <param name="hex">十六进制字符串</param>
  32. /// <returns></returns>
  33. public static byte[] ToBytesCRC(string hex)
  34. {
  35. string[] temp = hex.Split(' ');
  36. byte[] b = new byte[temp.Length + 2];
  37.  
  38. for (int i = 0; i < temp.Length; i++)
  39. {
  40. b[i] = Convert.ToByte(temp[i], 16);
  41. }
  42.  
  43. return b;
  44. }
  45. /// <summary>
  46. /// 将字节数据转换为十六进制字符串,中间用 “ ”分割 如:AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB
  47. /// </summary>
  48. /// <param name="vars">要转换的字节数组</param>
  49. /// <returns></returns>
  50. public static String ToHex(byte[] vars)
  51. {
  52. return BitConverter.ToString(vars).Replace('-', ' ').Trim();
  53. }

CS校验(累加和)

  1. public static string CSCheck(string str)
  2. {
  3. if (str.Length == 0) return "";
  4. else str = str.Trim();
  5. byte[] sss = ToBytes(str);
  6. int n = 0;
  7. for (int i = 0; i < sss.Length; i++)
  8. {
  9. n += sss[i];
  10. }
  11. return ToHex(n);
  12. }
  13. /// <summary>
  14. /// AB CD 12 3B 转换为字节数组
  15. /// </summary>
  16. /// <param name="hex">十六进制字符串</param>
  17. /// <returns></returns>
  18. public static byte[] ToBytes(string hex)
  19. {
  20. string[] temp = hex.Split(' ');
  21. byte[] b = new byte[temp.Length];
  22.  
  23. for (int i = 0; i < temp.Length; i++)
  24. {
  25. if (temp[i].Length > 0)
  26. b[i] = Convert.ToByte(temp[i], 16);
  27. }
  28.  
  29. return b;
  30. }
  31. /// <summary>
  32. /// 转换为符合本程序的十六进制格式
  33. /// </summary>
  34. /// <param name="var">1 2 3 等。</param>
  35. /// <returns>返回十六进制字符串,如果是1-9的话,前面带零</returns>
  36. /// <example>例如: 5 ="05" 12 ="0C" 无论何时,都是两位数。 </example>
  37. public static string ToHex(int var)
  38. {
  39. int cs = var;
  40. string tmp = "";
  41. if (cs == 0) { tmp = "00"; }
  42. while (cs > 0)
  43. {
  44. int ys;
  45. cs = Math.DivRem(cs, 256, out ys);
  46. tmp = tmp.Insert(0, string.Format(" {0}", Right("00" + Convert.ToString(ys, 16), 2).ToUpper()));
  47. }
  48. return tmp.Trim();
  49. }
  50. public static string Right(string str, int Length)
  51. {
  52. if ((Length <= 0) || (str == null))
  53. {
  54. return "";
  55. }
  56. int length = str.Length;
  57. if (Length >= length)
  58. {
  59. return str;
  60. }
  61. return str.Substring(length - Length, Length);
  62. }

LRC校验(LRC错误校验用于ASCII模式)

  1. /// <summary>
  2. /// 取模FF(255)
  3. /// 取反+1
  4. /// </summary>
  5. /// <param name="writeUncheck"></param>
  6. /// <returns></returns>
  7. public static string LRCheck(string writeUncheck)
  8. {
  9. char[] hexArray = new char[writeUncheck.Length];
  10. hexArray = writeUncheck.ToCharArray();
  11. int decNum = 0, decNumMSB = 0, decNumLSB = 0;
  12. int decByte, decByteTotal = 0;
  13.  
  14. bool msb = true;
  15.  
  16. for (int t = 0; t <= hexArray.GetUpperBound(0); t++)
  17. {
  18. if ((hexArray[t] >= 48) && (hexArray[t] <= 57))
  19.  
  20. decNum = (hexArray[t] - 48);
  21.  
  22. else if ((hexArray[t] >= 65) & (hexArray[t] <= 70))
  23. decNum = 10 + (hexArray[t] - 65);
  24.  
  25. if (msb)
  26. {
  27. decNumMSB = decNum * 16;
  28. msb = false;
  29. }
  30. else
  31. {
  32. decNumLSB = decNum;
  33. msb = true;
  34. }
  35. if (msb)
  36. {
  37. decByte = decNumMSB + decNumLSB;
  38. decByteTotal += decByte;
  39. }
  40. }
  41.  
  42. decByteTotal = (255 - decByteTotal) + 1;
  43. decByteTotal = decByteTotal & 255;
  44.  
  45. int a, b = 0;
  46.  
  47. string hexByte = "", hexTotal = "";
  48. double i;
  49.  
  50. for (i = 0; decByteTotal > 0; i++)
  51. {
  52. b = Convert.ToInt32(System.Math.Pow(16.0, i));
  53. a = decByteTotal % 16;
  54. decByteTotal /= 16;
  55. if (a <= 9)
  56. hexByte = a.ToString();
  57. else
  58. {
  59. switch (a)
  60. {
  61. case 10:
  62. hexByte = "A";
  63. break;
  64. case 11:
  65. hexByte = "B";
  66. break;
  67. case 12:
  68. hexByte = "C";
  69. break;
  70. case 13:
  71. hexByte = "D";
  72. break;
  73. case 14:
  74. hexByte = "E";
  75. break;
  76. case 15:
  77. hexByte = "F";
  78. break;
  79. }
  80. }
  81. hexTotal = String.Concat(hexByte, hexTotal);
  82. }
  83. return hexTotal;
  84. }
  85.  
  86. public void LRCheck(byte[] code)
  87. {
  88. int sum = 0;
  89. foreach (byte b in code)
  90. {
  91. sum += b;
  92. }
  93. sum = sum % 255;//取模FF(255)
  94. sum = ~sum + 1;//取反+1
  95. string lrc = Convert.ToString(sum, 16);
  96. return lrc;
  97. }

自定义Modbus数据表

自定义Modbus数据表例子:

设备相关读取信息:

命令报文信息解析:

自定义Modbus数据表定义注意

串口调试工具

串口调试工具的使用

串口调试工具 + RS485就可以读取硬件上的数据,和向硬件请求了,如何使用请看“调试篇”会有详细的说明。

网络调试助手:

调试助手主要还是TCP协议通讯的一个调试工具

远程通信计算机科学中,串行通信(英语:Serial communication)是指在计算机总线或其他数据信道上,每次传输一个比特数据,并连续进行以上单次过程的通信方式。与之对应的是并行通信,它在串行端口上通过一次同时传输若干比特数据的方式进行通信。串行通信被用于长距离通信以及大多数计算机网络,在这些应用场合里,电缆和同步化使并行通信实际应用面临困难。凭借着其改善的信号完整性和传播速度,串行通信总线正在变得越来越普遍,甚至在短程距离的应用中,其优越性已经开始超越并行总线不需要串行化组件(serializer),并解决了诸如时钟偏移(Clock skew)、互联密度(interconnect density)等缺点。PCIPCI Express的升级就一个例子。

认识Modbus协议的更多相关文章

  1. modbus协议讲义

        Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看 ...

  2. 模拟Modbus协议问题

    问题: 在嵌入式系统开发中,Modbus协议是工业控制系统中广泛应用的一种协议.本题用来简单模拟Modbus协议,只需根据条件生成符合该协议的数据帧,并解析所获取的数据.假设设备使用的协议发送数据格式 ...

  3. 各种非标232,485协议,自定义协议转modbus协议模块定制开发,各种流量计协议转modbus,

    工业现场经常会碰到通过485或者232采集各类仪表数据,但是很多早期的仪表和设备不支持标准modbus协议,而是采用自定义的协议,这些协议数据由plc或者dcs系统来实现采集,不仅费时麻烦,而且不方便 ...

  4. Socket编程之聊天程序 - 模拟Fins/ModBus协议通信过程

    设备控制软件编程涉及到的基本通信方式主要有TCP/IP与串口,用到的数据通信协议有Fins与ModBus. 更高级别的通信如.net中的Remoting与WCF在进行C/S架构软件开发时会采用. 本篇 ...

  5. 基于AVR128单纯Modbus协议实施

    Modbus通信协议Modicon公司1979在发展中,适用于工业现场总线协议控制.Modbus通信系统包含芯片的节点,并与组合物可编程控制的公共传输线,它的目的是收集和监视多个节点的数据.Modbu ...

  6. MODBUS协议详解

    MODBUS是一个工业上通信常用的通讯协议,一般在PLC上面用的比较多,主要是定义了一种数据传输的规范,比如数据发给谁,数据是干嘛的,数据错没错,接收到数据的从机告诉我数据有没有接受到等. 传输的方式 ...

  7. C# MODBUS协议 上位机(转)

    源:C# MODBUS协议 上位机 C#写了一款上位机监控软件,基于MODBUS_RTU协议. 软件的基本结构: 采用定时器(Timer控件)为时间片. 串口采用serialPort1_DataRec ...

  8. 串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧

    串口屏Modbus协议,串口屏的modbus协议资料,串口屏modbus通讯协议开发,串口屏之modbus协议使用技巧 本例程中用51单片机作为Modbus从机,从机的设备地址为2,从机有4个寄存器, ...

  9. 《ServerSuperIO Designer IDE使用教程》-3.Modbus协议,读取多个寄存器,实现多种数据类型解析。发布:v4.2.2版本

    更新内容,v4.2.2版本:1.增加Modbus协议读取多个寄存器,并且按多种数据类型解析数据.2.Modbus Serial和Modbus TCP两个驱动合并成一个驱动.3.修改数据库结构,保存配置 ...

随机推荐

  1. linux杀毒软件ClamAV的安装使用

    1.安装依赖环境 yum install -y zlib openssl-devel yum groupinstall -y "Development Tools" apt ins ...

  2. python崩溃到现在居然还没有放弃的Day07

    今天新入一个全新的知识面,叫做深浅拷贝,拷贝英文名copy,俗称复制,作为一个火影迷就会想到拷贝忍者旗木卡卡西,跑题了,在所有的数据存储时,都会有内存地址和存储地址,浅拷贝只拷贝第一层的内存地址,深拷 ...

  3. 013_针对单个pid的cpu/内存/io的资源占用统计

    #!/usr/bin/env python import sys import os import subprocess from decimal import Decimal from decima ...

  4. Doctype知识点总结

    DOCTYPE是document type (文档类型) 的缩写.<!DOCTYPE >声明位于文档的最前面,处于标签之前,它不是html标签.主要作用是告诉浏览器的解析器使用哪种HTML ...

  5. SIM 800C指令笔记

    拨号ATD137xxxxxxxx; 挂断-对方挂断收到NO CARRIER消息 挂断-主动挂断ATH 接电话ATA 打入电话消息RING 设置来电电话号码显示AT+CLIP=1显示消息格式:+CLIP ...

  6. 13 在 Django REST framework 善用 SerializerMethodField方法

    01-使用SerializerMethodField 来优化不必要的查询 class RepairQueueSerializer(serializers.ModelSerializer): # rq_ ...

  7. html中的meta标签是什么?有哪些属性?

    meta标签介绍 meta标签是HTML语言head区域的一个辅助性标签,常用于定义页面的说明,关键字,最后修改的日期和其他的元数据.这些元数据将服务于浏览器,搜索引擎和其他网络服务. meta标签的 ...

  8. Linux系统安装jdk教程

    本文仅仅适用于刚刚接触Linux系统的童鞋,毕竟本人也才刚刚玩这个东西,在此记录下以便于以后能查阅及其他童鞋能进行参考,本文为原创随笔,如需转发,请标明出处,谢谢: 此处我采用的是用VMware搭建的 ...

  9. Map the Debris 轨道周期

    返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: avgAlt}. 至于轨道周期怎么求, ...

  10. windows一键安装包的升级禅道

    如果你现在使用的是windows xampp 集成运行环境,那么请按照下面的步骤进行: 一.升级步骤: 下载新的源代码包(zip格式).(注意,不是.exe的集成运行环境,如果你下载这个,会造成数据被 ...