Modbus 隨筆

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.2345 CRC
01 10 00 04 00 02 04 3F 9E 04 19 5C AC
                         

2. Master -> Slave 的addr 6 地址開始處寫入浮點數值 2.3456,  CMD如下:

  • 浮點格式爲:32bit float, Little-endian, 順序:[ 1->2->3->4 ]
  • ID 功能碼 起始地址 寄存器數量 字節個數 浮點數2.3456 CRC
    01 10 00 06 00 02 04 4F 1E 16 40 0A C7
                             

3. Master -> Slave 的addr 6 地址開始處寫入浮點數值5.1234,  CMD如下:

  • 浮點格式爲:32bit float, Big-endian  Byte-Swap,  順序:[ 3->4->1->2 ]
ID 功能碼 起始地址 寄存器數量 字節個數 浮點數5.1234 CRC
01 10 00 06 00 02 04 A3 40 E5 F2 9B 00
                         

 

4. Master -> Slave 的addr 6 地址開始處寫入浮點數值0.1234,  CMD如下:

此格式爲modbus協議發送float時常用的字節序;

  • 浮點格式爲:32bit float, Little-endian  Byte-Swap  順序:[ 2->1->4->3 ]
ID 功能碼 起始地址 寄存器數量 字節個數 浮點數0.1234 CRC
01 10 00 06 00 02 04 B9 24 3D FC 06 03
                         

 

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);
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章