首页 > 其他分享 >Modbus字节序说明

Modbus字节序说明

时间:2024-05-08 15:55:06浏览次数:17  
标签:说明 AB 正序 字节 array0xABCDEFGH 发送 Modbus endian

Modbus字节序说明 用littly endine byte swap 解析寄存器

最近做ModBus TCP方面的测试有点多,尽管对于ModBus协议算是比较了解了,也经常知道字节传输序列的不同对工程师带来了很多不必要的麻烦,这不是一个技术难题,仅仅只是过去各家各户开发遗留下来的标准统一问题,所以这里写下这篇文章作为备忘。
在Modbus通信中,目前我们主要有16bit(AB)、32bit(AB CD)和最新的64bit(AB CD EF GH)三种数据长度。每个字母代表一个字节。
 针对16bit传输,只存在正序(AB)或反序(BA)两种方式,也就所谓的正序先传高位,以及反序先传低位,为什么会出现这样的现象,可以联系堆栈处理的方式,不过这个不重要。

更多的应用场景针对的是双字32位数据传输。那么同样的正序(ABCD)以及反序(DCBA)似乎就够用了,但是却还有字节交换这样的问题,所以你经常会看到SWAP函数,这样的我们衍生出了以下四种排序方式。

Big-endian :ABCD
Little-endian :DCBA
Big-endian byte swap :BADC
Little-endian byte swap :CDAB

对于32bit的Real类型:对应十六进制:ABCD。

1. Big-endian: 大端模式,正序。即:大端排序,先传递高位A依次传递到低位D。压入发送队列发送。

所以在通讯中,收发到的数据不对,先要做的就是确定确定数据类型,其次要确定数据传输时的字节序是如何的,这有确保了这两点的正确性,才可以正确的解析出数据。

2. Little-endian:小端模式,正序。即:依次从低位到高位。压入发送队列,发送。

3. Big-endian byte swap: 大端模式,反序。先将寄存器内部字节交换,然后按照大端模式发送。 

4. Little-edian byte swap : 小端模式,反序。 先将寄存器内部字节交换顺序,然后按照小端模式依次压入发送队列,发送。

float readModbusDataReal32bitBigMode(quint16 dataHighSectionABCDInD1, quint16 dataLowSectionDEFHInD2)
{
    //55.23    (??) 0xEB85,    (B\) 0x425C
    /*
    *   float: ABCD。 
        小端模式交换字节:先发送的是低字节, CD  AB
        就是:(向左看)是压入发送队列的顺序。 modbus 中D1位置就是:CD, D2寄存器就是:AB
        解析:字节数组char floatArray[4], 其中:3是高位,0是低位。
        因此:因为是小端模式
        则D1是floatArray中的[0,1]字节,且正序,D是0字节,C是1字节。
            D2是flaotArray中的[2,3]字节,正序,A是3字节,B是2字节。
    */ 

    QByteArray array0xABCDEFGH;//4字节
    array0xABCDEFGH.resize(4);
    array0xABCDEFGH[3] = (dataLowSectionDEFHInD2 & 0xFF00) >> 8; 
    array0xABCDEFGH[2] = (dataLowSectionDEFHInD2 & 0xFF);

    array0xABCDEFGH[1] = (dataHighSectionABCDInD1 & 0xFF00) >> 8;
    array0xABCDEFGH[0] = (dataHighSectionABCDInD1 & 0xFF);
    float tempFloat32;
    memcpy(&tempFloat32, array0xABCDEFGH.data(), array0xABCDEFGH.length());
    return tempFloat32;
}
  
void writeModbusDataReal32bitBigMode(float realData, quint16* dataHighSectionABCD, quint16* dataLowSectionDEFH)
{
    //一个float占4个字节 AB CD. D是低端字节。
    // 小端模式,交换字节:先发送的是低字节, CD  AB
    int leng4Byte = sizeof(realData);
    QByteArray array0xABCDEFGH;//4字节
    array0xABCDEFGH.resize(leng4Byte);
    memcpy(array0xABCDEFGH.data(), &realData, leng4Byte);
    //
    quint16 temp16;
    temp16 = array0xABCDEFGH[1] << 8 & 0xFF00;
    temp16 |= array0xABCDEFGH[0] ;
    *dataHighSectionABCD = temp16;
    temp16 = 0;
    temp16 = array0xABCDEFGH[3] << 8 & 0xFF00;
    temp16 |= array0xABCDEFGH[2];
    *dataLowSectionDEFH = temp16;
}

 

标签:说明,AB,正序,字节,array0xABCDEFGH,发送,Modbus,endian
From: https://www.cnblogs.com/JohnnyLei/p/18180046

相关文章

  • dbt on_configuration_change 简单说明
    dbton_configuration_change目前主要是在处理物化视图中,on_configuration_change包含了三类设置参考设置apply是默认参数,尝试进行更新存在的数据库对象continue允许继续运行,但是提供一个警告fail如果捕捉到变动就失败参考使用比如模型上的{{config(......
  • CVPR 2024 | 字节提出视觉基础模型:ViTamin,实现多项SOTA!
    前言 视觉语言模型屡屡出现新突破,但ViT仍是图像编码器的首选网络结构。字节提出新基础模型——ViTamin,专为视觉语言时代设计。本文转载自量子位(QbitAI)仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘......
  • 03_仿Modbus工具案例
    花了6个小时边学边写的Modbus通信案例,通信方式包括RTU,ASCII,TCP,UTP。案例图:   usingModbus.Data;usingModbus.Device;usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO.......
  • 大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题
    大数据面试SQL每日一题系列:最高峰同时在线主播人数。字节,快手等大厂高频面试题之后会不定期更新每日一题sql系列。SQL面试题每日一题系列内容均来自于网络以及实际使用情况收集,如有雷同,纯属巧合。1.题目问题1:如下为某直播平台各主播的开播及关播时间数据明细,现在需要计算该平......
  • 02_Modbus的功能码与报文详解
     Modbus协议类型  Modbus从站四张表类型 主站常用功能码  ModbusTCP请求报文,功能码03ModbusTCP应答报文,功能码03 0017为23个字节:请求长度加应答长度06+17=23;14为20长度:14+06=20  ModbusUDP请求报文,功能码03ModbusUDP应答报文,功能码03  M......
  • golang 获得一个结构体的字节大小
    golang的内存占用是如何构成的呢?unsafe.SizeOf()转载:如何在Go中获取变量的内存大小?--CSDN问答如果传递一个未初始化的变量,unsafe.Sizeof()与reflect.Type.Size()将只返回传递的变量的类型的大小,并不递归地遍历数据结构并增加所指向变量的大小。切片是一个相对简单的结构体st......
  • [UE 虚幻插件 DTPostgreSQL] PostgreSQL Connector 使用蓝图连接操作 PostgreSQL 数据
    本插件主要是支持在UE蓝图中连接和操作PostgreSQL数据库。下载连接在文章最后。数据库连接【CreatePostgreSQL】输入:Host:数据库IP地址。Port:数据库开放端口。User:数据库用户名。Password:数据库密码。DBName:指定连接的数据库库名。输出:Success:返回数据库是否......
  • stm32f103c8t6的freemodbus移植
    注意:demo.c不要加入到程序中来。1在main.h文件中加入#include"stm32f1xx_hal.h"文件也可以不加a:每次重新生成程序时在主程序main.c中注释掉//MX_USART2_UART_Init();函数,因为在freemodbus中已经调用了该函......
  • 232Modbus转Profinet网关接扫码枪与PLC通讯
    Modbus转Profinet网关(XD-PNR100/300)的主要作用是实现Modbus协议和Profinet协议之间的转换和通信。本案例是用Modbus转Profinet网关接扫码枪与PLC通讯,扫码枪通常通过特定的接口与计算机或其他设备传输数据,而PLC(可编程逻辑控制器)则通常使用Profinet等工业通信协议。要将扫码枪通过......
  • dremio UserService 简单说明
    以前是简单说明过dremio的UserService,dremio实际上支持内部以及外部用户的玩法类图可以看到,包含了simple以及executor两个,同时实现了UserServiceEvents支持发布订阅能力的接口(订阅是25.0版本的)executor的实现实际上是为空的,核心是方便执行节点bindUserService,实际内......