什么是Modbus?

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)

public static string CRCCheck(string val){val = val.TrimEnd(' ');string[] spva = val.Split(' ');byte[] bufData = new byte[spva.Length + 2];bufData = ToBytesCRC(val);ushort CRC = 0xffff;ushort POLYNOMIAL = 0xa001;for (int i = 0; i < bufData.Length - 2; i++){CRC ^= bufData[i];for (int j = 0; j < 8; j++){if ((CRC & 0x0001) != 0){CRC >>= 1;CRC ^= POLYNOMIAL;}else{CRC >>= 1;}}}return Maticsoft.DBUtility.HLConvert.ToHex(System.BitConverter.GetBytes(CRC));}/// <summary>/// 例如把如下字符串转换成字节数组/// AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB   转换为字节数组/// </summary>/// <param name="hex">十六进制字符串</param>/// <returns></returns>public static byte[] ToBytesCRC(string hex){string[] temp = hex.Split(' ');byte[] b = new byte[temp.Length + 2];for (int i = 0; i < temp.Length; i++){b[i] = Convert.ToByte(temp[i], 16);}return b;}/// <summary>/// 将字节数据转换为十六进制字符串,中间用 “ ”分割 如:AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB/// </summary>/// <param name="vars">要转换的字节数组</param>/// <returns></returns>public static String ToHex(byte[] vars){return BitConverter.ToString(vars).Replace('-', ' ').Trim();}

CS校验(累加和)

public static string CSCheck(string str){if (str.Length == 0) return "";else str = str.Trim();byte[] sss = ToBytes(str);int n = 0;for (int i = 0; i < sss.Length; i++){n += sss[i];}return ToHex(n);}/// <summary>/// AB CD 12 3B     转换为字节数组/// </summary>/// <param name="hex">十六进制字符串</param>/// <returns></returns>public static byte[] ToBytes(string hex){string[] temp = hex.Split(' ');byte[] b = new byte[temp.Length];for (int i = 0; i < temp.Length; i++){if (temp[i].Length > 0)b[i] = Convert.ToByte(temp[i], 16);}return b;}/// <summary>/// 转换为符合本程序的十六进制格式/// </summary>/// <param name="var">1 2 3 等。</param>/// <returns>返回十六进制字符串,如果是1-9的话,前面带零</returns>/// <example>例如: 5  ="05"  12 ="0C" 无论何时,都是两位数。  </example>public static string ToHex(int var){int cs = var;string tmp = "";if (cs == 0) { tmp = "00"; }while (cs > 0){int ys;cs = Math.DivRem(cs, 256, out ys);tmp = tmp.Insert(0, string.Format(" {0}", Right("00" + Convert.ToString(ys, 16), 2).ToUpper()));}return tmp.Trim();}public static string Right(string str, int Length){if ((Length <= 0) || (str == null)){return "";}int length = str.Length;if (Length >= length){return str;}return str.Substring(length - Length, Length);}

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

/// <summary>/// 取模FF(255)/// 取反+1/// </summary>/// <param name="writeUncheck"></param>/// <returns></returns>public static string LRCheck(string writeUncheck){char[] hexArray = new char[writeUncheck.Length];hexArray = writeUncheck.ToCharArray();int decNum = 0, decNumMSB = 0, decNumLSB = 0;int decByte, decByteTotal = 0;bool msb = true;for (int t = 0; t <= hexArray.GetUpperBound(0); t++){if ((hexArray[t] >= 48) && (hexArray[t] <= 57))decNum = (hexArray[t] - 48);else if ((hexArray[t] >= 65) & (hexArray[t] <= 70))decNum = 10 + (hexArray[t] - 65);if (msb){decNumMSB = decNum * 16;msb = false;}else{decNumLSB = decNum;msb = true;}if (msb){decByte = decNumMSB + decNumLSB;decByteTotal += decByte;}}decByteTotal = (255 - decByteTotal) + 1;decByteTotal = decByteTotal & 255;int a, b = 0;string hexByte = "", hexTotal = "";double i;for (i = 0; decByteTotal > 0; i++){b = Convert.ToInt32(System.Math.Pow(16.0, i));a = decByteTotal % 16;decByteTotal /= 16;if (a <= 9)hexByte = a.ToString();else{switch (a){case 10:hexByte = "A";break;case 11:hexByte = "B";break;case 12:hexByte = "C";break;case 13:hexByte = "D";break;case 14:hexByte = "E";break;case 15:hexByte = "F";break;}}hexTotal = String.Concat(hexByte, hexTotal);}return hexTotal;}public void LRCheck(byte[] code){int sum = 0;foreach (byte b in code){sum += b;}sum = sum % 255;//取模FF(255)sum = ~sum + 1;//取反+1string lrc = Convert.ToString(sum, 16);return lrc;}

自定义Modbus数据表

自定义Modbus数据表例子:

设备相关读取信息:

命令报文信息解析:

自定义Modbus数据表定义注意

串口调试工具

串口调试工具的使用.

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

网络调试助手:

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

转载于:https://www.cnblogs.com/luomingui/archive/2013/06/14/Modbus.html

Modbus通讯协议学习 - 认识篇相关推荐

  1. 485之modbus通讯协议学习笔记

    485之modbus通讯协议学习笔记 这里主要探讨两个寄存器 03 读保持寄存器 04读输入寄存器 输入寄存器其中的温度值和湿度值分别各占两个字节,一个字节八位使用十六进制00 01表示两个字节的寄存 ...

  2. Modbus通讯协议学习文档

    1 什么是Modbus通讯协议 Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表.Mo ...

  3. MODBUS通讯协议学习总结

    ​ 最近学习了Modbus协议,通过UART驱动来实现控制板与上位机之间的通讯.这里把Modbus里须注意的点总结一下. 前面六点主要是对Modbus协议知识点的总结与归纳,后面记录了在开发过程中遇到 ...

  4. Modbus通讯协议的原文和详解

    这个协议很早以前就被公开发表了,现在Modbus已经成为工业领域通信协议的业界标准,有网站专门进行协议的整理和管理. 这里必须要吐槽一下,我就想查查协议发布时的原始文档,或者这个协议的英文原文和官方版 ...

  5. 3、Modbus通讯协议详解

    前言 在平时用的时候模块都会带有自己的通讯协议,直接查看手册用就可以,所以平时对于modbus虽然是在用但是原理性的东西时常忘记. 但是如果你做一个底层,自己写一个通讯协议,这时候就要对协议本身有所了 ...

  6. Modbus通讯协议的C语言实现

    刚写完一个modbus通讯协议,调试完,整理出来了,软件代码只能为大家提供一个思路,仅供参考. //communication.h #include "H01_Global\_Define. ...

  7. 基于modbus协议的工业自动化网络规范_工控学堂:解读Modbus通讯协议「宜收藏」...

    作为工控人,Modbus通讯协议想必都不陌生,Modbus通讯协议可以说是工业自动化领域应用最为广泛的通讯协议,因为他的开放性.可扩充性和标准化使他成为通用工业标准. 1979年施耐德电气制定了一个用 ...

  8. 一文搞懂物联网Modbus通讯协议

    简介: 一般来说,常见的物联网通讯协议众多,如蓝牙.Zigbee.WiFi.ModBus.PROFINET.EtherCAT.蜂窝等.而在众多的物联网通讯协议中,Modbus是当前非常流行的一种通讯协 ...

  9. 协议:Modbus通讯协议详细

    1.Modbus通讯协议详细解释 https://blog.csdn.net/rxiang12/article/details/79125813 2.Modbus通信协议详解 https://blog ...

  10. modbus通讯协议详解

    1.Modbus协议简介 Modbus协议是一种广泛应用于当今工业控制领域的通用通信协议.通过此协议,控制器相互之间.或者控制器经由网路(如以太网)可以和其他设备之间进行通信.Modbus协议使用的是 ...

最新文章

  1. asp.net2.0导出pdf文件完美解决方案【月儿原创】
  2. UPS不断电割接流程和步骤
  3. spring boot学习(5): 进程exit code自定义
  4. 正确获取Java事件通知
  5. RichEdit 各个版本介绍
  6. Pandas标签统计
  7. 关键词: iostream 和 iostream.h
  8. python 如何加密_Python如何玩转加密?
  9. 消息称微软Windows暂停接受华为新订单;2019 Q1 亚太区公有云IaaS、PaaS服务收入排名现已揭晓……...
  10. C++函数参数的缺省值
  11. 解决ubuntu16.04插耳机没有声音的问题
  12. Android Retrofit Put请求
  13. Rust更适合经验较少的程序员?
  14. Apache配置文件中Order Allow Deny笔记心得
  15. x265编码H265
  16. idea为web项目添加tomcat并配置Artifacts
  17. 创新力成中国互联网企业后发优势
  18. 一个搜狗打字法老客户的心得
  19. linux(centos)服务器时间校正
  20. HMI-59-【多媒体】收音机 2

热门文章

  1. access抓取数据_网页数据抓取之当当网
  2. Cannot add task ‘wrapper‘ as a task with that name already exists.
  3. gstreamer/deepstream方面的博文,全网首发且唯一,有图为证
  4. MAC编译OpenJDK8:error: invalid argument ‘-std=gnu++98‘ not allowed with ‘C‘
  5. Error:Module production: java.lang.NoClassDefFoundError: com/android/resources/ResourceFolderType
  6. LINUX出错解决办法:无法定位软件包 libX11-dev
  7. 同样是创业,同样是两年,有的已经做了几千万,这边已经内斗死了
  8. 热的感觉是顺经络走的
  9. Python安装Tensorflow
  10. Android Studio用不了jar