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