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