Modbus 随笔

1. 各波特率下的Modbus RTU的超时时间

 

Modbus master send float format record:

    假设设备ID = 1

下面分别举例4种格式下的modbus的float字节序:

  • Big-endian
  • Little-endian
  • Big-endian  Byte-Swap
  • Little-endian  Byte-Swap

 

1. Master -> Slave 的addr 4 地址开始处写入浮点数值 1.2345, CMD如下:

  • 浮点格式为:32bit float, Big-endian,顺序:[ 4->3->2->1 ]
ID功能码起始地址寄存器数量字节个数浮点数1.2345CRC
011000040002043F9E04195CAC
             

2. Master -> Slave 的addr 6 地址开始处写入浮点数值 2.3456,  CMD如下:

  • 浮点格式为:32bit float, Little-endian, 顺序:[ 1->2->3->4 ]
  • ID功能码起始地址寄存器数量字节个数浮点数2.3456CRC
    011000060002044F1E16400AC7
                 

3. Master -> Slave 的addr 6 地址开始处写入浮点数值5.1234,  CMD如下:

  • 浮点格式为:32bit float, Big-endian  Byte-Swap,  顺序:[ 3->4->1->2 ]
ID功能码起始地址寄存器数量字节个数浮点数5.1234CRC
01100006000204A340E5F29B00
             

 

4. Master -> Slave 的addr 6 地址开始处写入浮点数值0.1234,  CMD如下:

此格式为modbus协议发送float时常用的字节序;

  • 浮点格式为:32bit float, Little-endian  Byte-Swap  顺序:[ 2->1->4->3 ]
ID功能码起始地址寄存器数量字节个数浮点数0.1234CRC
01100006000204B9243DFC0603
             

 

Demo 如下:

typedef struct
{
    union{
        uint32_t u32_value;
        float    float_value;
    };

} typeConvert;

void MainWindow::on_Button_A_set_b_clicked()
{
    uint8_t bufLen=0;
    uint8_t sendBuf[15];
    uint16_t crc_val = 0;

    QString str_AK = ui->lineEdit_A_b->text();
    typeConvert temp;
    temp.float_value = str_AK.toFloat();

    sendBuf[bufLen++] = device_ID;
    sendBuf[bufLen++] = MB_FUNC_WR_MULTIPLE;
    sendBuf[bufLen++] = ((addr_B_set_K  ) >> 8); //caution: addr no need -1
    sendBuf[bufLen++] = ((addr_B_set_K  ) & 0xff);
    sendBuf[bufLen++] = 0x00; //count msb
    sendBuf[bufLen++] = 0x02; //count lsb
    sendBuf[bufLen++] = 0x04; //Byte count    2143

        /* Byte sequence : 2-1-4-3 */
    sendBuf[bufLen++] = ((temp.u32_value >> 8) & 0xff);
    sendBuf[bufLen++] = (temp.u32_value & 0xff);
    sendBuf[bufLen++] = ((temp.u32_value >> 24)& 0xff);
    sendBuf[bufLen++] = ((temp.u32_value >> 16)& 0xff);

    crc_val = mb_crc16(sendBuf,bufLen);

    sendBuf[bufLen++] = (crc_val & 0xff);
    sendBuf[bufLen++] = (crc_val >> 8);

    for(auto i=0;i<bufLen;i++)
    {
        qDebug()<<hex<<sendBuf[i]<<endl;
    }

    uartSend(sendBuf,bufLen);
}

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值