Modbus通信中到底用大端还是小端???


MODBUS系列文章

干工控这么久了,还不清楚Modbus协议
为什么要将Modbus转成MQTT?
Modbus主站和从站的区别
这些数据可被Modbus采集,你还不知道???
Modbus/TCP和TCP/IP都走网线,一样吗?

MODBUS 是什么

MODBUS是一种广泛使用的串行通信协议,主要用于工业自动化领域的电子设备之间的通信。它支持多种类型的网络,包括以太网、串行通信等。MODBUS协议以其简单性、稳定性和开放性而受到青睐。

大小端模式起源

大端(Big Endian)和小端(Little Endian)的概念源于计算机科学中的字节序问题。大端模式中,数据的高位字节存储在低地址,而小端模式则相反。这两种模式的命名来源于Jonathan Swift的《格利佛游记》,其中描述了两个国家因为吃鸡蛋的方式不同而发生的战争,这被用来形象地描述字节序的差异。

MODBUS大小端是个啥

MODBUS协议中的"大小端"是指数据在内存中的字节序,即多字节数据的字节如何排列。在MODBUS通信中,尤其是MODBUS-RTU模式,使用的是大端模式(Big Endian)。下面通过一个例子来说明大端和小端的区别:

假设我们有一个16位的寄存器值0x1234,需要通过MODBUS-RTU协议发送这个值。

  • 大端模式(Big Endian):在大端模式下,数据的高位字节(MSB)存储在低地址处,低位字节(LSB)存储在高地址处。以0x1234为例,它在内存中的表示是:

    在MODBUS-RTU协议中发送时,会先发送0x12,然后发送0x34。

    • 地址0x00: 0x12(高8位)
    • 地址0x01: 0x34(低8位)
  • 小端模式(Little Endian):在小端模式下,数据的低位字节存储在低地址处,高位字节存储在高地址处。同样以0x1234为例,它在内存中的表示是:

    如果一个使用小端模式的系统直接发送0x1234,它会先发送0x34,然后发送0x12。

    • 地址0x00: 0x34(低8位)
    • 地址0x01: 0x12(高8位)

大小端使用场景

在MODBUS通信中,主要有两种协议:MODBUS-RTU和MODBUS-TCP。这两种协议在字节序的使用上有所不同

  1. MODBUS-RTU
  • 它使用的是大端模式(Big Endian)。在MODBUS-RTU协议中,所有的数据交换都是以大端字节序进行的。这意味着在发送和接收数据时,高位字节(MSB)总是被发送或接收在前,低位字节(LSB)在后。例如,如果有一个16位的寄存器值0x1234,在MODBUS-RTU中会先发送0x12,然后发送0x34
  1. MODBUS-TCP
  • MODBUS-TCP协议本身并不规定字节序,因为它是在IP网络层面上运行的,而IP网络通信通常使用大端字节序。然而,当MODBUS-TCP用于与MODBUS-RTU设备通信时,它通常会遵循MODBUS-RTU的约定,即使用大端模式。这是因为MODBUS-TCP通常作为MODBUS-RTU数据的封装,保持数据的一致性。
  • 但是,如果MODBUS-TCP用于其他上下文,比如在不同平台或设备之间的通信,可能需要根据接收端的字节序来转换数据。例如,如果一个使用小端字节序的设备接收到来自MODBUS-TCP的数据,可能需要将数据从大端转换为小端,以确保数据的正确解释。
  1. 跨平台数据交换
  • 当MODBUS通信涉及到不同硬件平台或操作系统时,字节序问题尤为重要。例如,如果一个使用小端字节序的PC机需要与使用大端字节序的嵌入式系统通信,就必须在发送和接收数据时进行字节序的转换。
  1. 设备配置和诊断
  • 在设备配置和诊断过程中,如果涉及到读取或写入寄存器值,这些值在MODBUS协议中是以大端字节序传输的。因此,即使设备内部可能使用小端字节序存储数据,通信时也需要转换为大端字节序。

C#大小端转换函数

在C#中进行MODBUS通信时,经常需要进行大小端字节序的转换,因为MODBUS协议通常使用大端模式,而C#运行的系统可能是小端模式。

从大端转换为小端

public static ushort BigEndianToLittleEndian(ushort bigEndianValue)
{
    return (ushort)((bigEndianValue << 8) | (bigEndianValue >> 8));
}

从小端转换为大端

public static ushort LittleEndianToBigEndian(ushort littleEndianValue)
{
    return (ushort)((littleEndianValue >> 8) | (littleEndianValue << 8));
}

总之,MODBUS协议的大小端问题不仅仅是一个技术细节,它关系到整个自动化系统的稳定性和效率。随着技术的不断进步,对这些基础知识的掌握将为工程师和开发者提供强大的支持,使他们能够构建更加智能、灵活和可靠的自动化解决方案。正确处理字节序,将为工业4.0时代的智能系统铺平道路。

近期热文:

啥啥!!!MODBUS RTU不能用网口通信
Modbus功能码就这么简单吗???
涨知识!!!DTU这样采集PLC数据呀!
工控机与PLC通信一点也不难???
要PLC远程控制???这样设计就行

相关推荐

  • 29.8K Star谷歌都在用!!!超2万人关注的测试爬虫工具
  • 开源日报 | Vitest 2.0;谷歌专用API;通义千问“国服最强”;加州起草法案把开源管起来;汽车基础软件开源引热议
  • AI技术创新可以有多硬核?GOTC 2024论坛议程抢先看
  • Rust即将进入前十:中赢、大赢、还是特大赢?
  • 上交发布MG-LLaVA,基于多粒度指令调整,横扫视觉大模型榜单
  • 新国立祭出视频生成“无限宝石“:2300帧仅需5分钟,提速100倍
  • 中国AI论文数量全球第一!中科院拿下研究机构双第一,腾讯企业排第三
  • 阿尔特曼20年:从创业失败到权力中心
  • 最近很火的老照片动起来,都是怎么玩的?
  • 苹果Vision Pro和AI的重磅新大招,被提前扒出来了
  • 还在用Jenkins?快来试试这款简而轻的自动化部署工具吧!
  • Anthropic 最近高产Claude各种更新,openai 堪忧~
  • 鸿蒙新篇章:转转 APP 的 HarmonyOS Next 开发之旅
  • 红杉资本合伙人Pat Grady七月深度访谈 2万字全文(附视频)
  • 面试官:业务开发时,接口不能对外暴露怎么办?我有 3 种实现方案!
  • Java之父宣布退休!
  • 英雄联盟的“翻译官”卖了200多亿
  • 上岸南大,面临抉择!
  • DeepMind 发布 JEST 算法,AI 模型训练耗能降低十倍
  • 1个芯片顶英伟达3个?这个偏爱印度的创始人爆肝8年,终于等来抢英伟达泼天富贵的一天!