Qt modbus数据转换

C++ 将浮点数转为modbus需要的两个无符号短整数

以下是一个使用C++将浮点数转换为Modbus需要的两个无符号短整数的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstdint>

// 浮点数转换为Modbus无符号短整数
void floatToModbus(float f, uint16_t& highByte, uint16_t& lowByte) {
union {
float floatValue;
uint16_t ushortValue[2];
} converter;

converter.floatValue = f;

// 高字节在前,低字节在后
highByte = converter.ushortValue[0];
lowByte = converter.ushortValue[1];
}

int main() {
float floatNumber = 3.1415;
uint16_t highByte, lowByte;
floatToModbus(floatNumber, highByte, lowByte);
std::cout << "High Byte: " << highByte << std::endl;
std::cout << "Low Byte: " << lowByte << std::endl;

return 0;
}

在上述示例代码中,我们通过传入引用的方式,将高字节和低字节的值作为参数返回给调用者。在floatToModbus函数中,我们按照之前的方法使用联合体进行浮点数和无符号短整数之间的类型转换。

将浮点数赋值给floatValue,然后通过ushortValue读取高字节和低字节的值,并分别将它们赋值给highBytelowByte

最后,我们在主函数中输出高字节和低字节的值,以验证转换结果。

请注意,在实际应用中,你需要根据具体的Modbus协议规范,确定高字节和低字节的顺序,并进行相应的操作。这里的示例代码只是一个简单的演示,并可能需要根据实际情况进行调整。

Modbus的两个无符号短整数转浮点数

以下是一个使用C++将Modbus的两个无符号短整数转换为浮点数的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstdint>

// Modbus无符号短整数转换为浮点数
float modbusToFloat(uint16_t highByte, uint16_t lowByte) {
union {
float floatValue;
uint16_t ushortValue[2];
} converter;

// 将高字节和低字节合并
converter.ushortValue[0] = highByte;
converter.ushortValue[1] = lowByte;

return converter.floatValue;
}

int main() {
uint16_t highByte = 0x4000; // 示例高字节
uint16_t lowByte = 0xC000; // 示例低字节

float convertedFloat = modbusToFloat(highByte, lowByte);
std::cout << "Converted Float: " << convertedFloat << std::endl;

return 0;
}

在上述示例代码中,我们定义了一个函数modbusToFloat来进行Modbus的两个无符号短整数转换为浮点数的操作。

首先,我们使用一个联合体来实现无符号短整数和浮点数之间的类型转换。联合体中包含一个浮点数类型的成员floatValue和一个无符号短整数类型的数组成员ushortValue

然后,我们将Modbus的高字节和低字节分别赋值给联合体的ushortValue[0]ushortValue[1]

最后,我们通过联合体的floatValue成员来获取转换后的浮点数值。

在主函数中,我们给出了示例的高字节和低字节的数值,并输出转换后的浮点数结果。

请注意,在实际应用中,你需要根据具体的Modbus协议规范,确定高字节和低字节的顺序,并进行相应的操作。这里的示例代码只是一个简单的演示,并可能需要根据实际情况进行调整。

Qt modbus 中int 转 dint 写入

在 Qt 中使用 Modbus 进行 DINT 数据的写入,你可以借助 Qt 的 QModbusTcpClient 类来实现。以下是一个示例代码片段,演示了如何使用 Qt Modbus 写入 DINT 数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <QtSerialBus/QModbusTcpClient>
#include <QModbusDataUnit>

// 创建 Modbus TCP 客户端
QModbusTcpClient *modbusClient = new QModbusTcpClient(this);

// 连接到 Modbus 设备
modbusClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.1.1");
modbusClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);
modbusClient->connectDevice();

// 检查连接是否成功建立
if (!modbusClient->state() == QModbusDevice::ConnectedState) {
qDebug() << "Failed to connect to Modbus device";
return;
}

// 准备要写入的 DINT 数据
int dintValue = -12345; // 要写入的 DINT 值

// 创建 Modbus 数据单元
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 0, 2); // 从寄存器地址 0 开始写入 2 个寄存器

// 将 DINT 值分解为两个 INT 值
int lowInt = qint16(dintValue); // 低位 INT 值
int highInt = qint16(dintValue >> 16); // 高位 INT 值

// 设置写入数据
writeUnit.setValue(0, lowInt); // 第一个寄存器写入低位 INT 值
writeUnit.setValue(1, highInt); // 第二个寄存器写入高位 INT 值

// 执行写入操作
if (auto *reply = modbusClient->sendWriteRequest(writeUnit, 1)) {
if (!reply->isFinished()) {
// 等待写入操作完成
QEventLoop loop;
connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
loop.exec();
}
if (reply->error() != QModbusDevice::NoError) {
qDebug() << "Failed to write DINT data:" << reply->errorString();
} else {
qDebug() << "DINT data has been written successfully";
}

// 清理资源
delete reply;
} else {
qDebug() << "Failed to send write request";
}

在上述示例中,首先创建了一个 Modbus TCP 客户端,并连接到指定的 Modbus 设备。然后,将要写入的 DINT 数据拆分为两个 INT 值,并将它们写入连续的两个寄存器中。最后,使用 sendWriteRequest 方法发送写入请求,并根据返回的响应进行错误处理和结果验证。

请注意,这只是一个简单的示例代码片段,你需要根据实际情况进行适当的修改和扩展,例如设置正确的 Modbus 连接参数、处理连接错误、选择合适的寄存器地址等。

Qt modbus 中int 转 dint 读取

在 Qt 中使用 Modbus 进行 DINT 数据的读取,你可以借助 Qt 的 QModbusTcpClient 类来实现。以下是一个示例代码片段,演示了如何使用 Qt Modbus 读取 DINT 数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <QtSerialBus/QModbusTcpClient>
#include <QModbusDataUnit>

// 创建 Modbus TCP 客户端
QModbusTcpClient *modbusClient = new QModbusTcpClient(this);

// 连接到 Modbus 设备
modbusClient->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.1.1");
modbusClient->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);
modbusClient->connectDevice();

// 检查连接是否成功建立
if (!modbusClient->state() == QModbusDevice::ConnectedState) {
qDebug() << "Failed to connect to Modbus device";
return;
}

// 创建 Modbus 数据单元
QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 2); // 从寄存器地址 0 开始读取 2 个寄存器

// 执行读取操作
if (auto *reply = modbusClient->sendReadRequest(readUnit, 1)) {
if (!reply->isFinished()) {
// 等待读取操作完成
QEventLoop loop;
connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
loop.exec();
}
if (reply->error() != QModbusDevice::NoError) {
qDebug() << "Failed to read DINT data:" << reply->errorString();
} else {
// 从读取的寄存器数据中获取 DINT 值
int lowInt = reply->result().value(0).toUInt(); // 低位 INT 值
int highInt = reply->result().value(1).toUInt(); // 高位 INT 值

// 合并两个 INT 值得到 DINT 值
int dintValue = (highInt << 16) | lowInt;

qDebug() << "Read DINT data:" << dintValue;
}

// 清理资源
delete reply;
} else {
qDebug() << "Failed to send read request";
}

在上述示例中,首先创建一个 Modbus TCP 客户端,并连接到指定的 Modbus 设备。然后,创建一个 Modbus 数据单元用于读取连续的两个寄存器。接下来,使用 sendReadRequest 方法发送读取请求,并根据返回的响应进行错误处理和结果解析。在读取的寄存器数据中,通过合并两个 INT 值得到 DINT 值。

请注意,这只是一个简单的示例代码片段,你需要根据实际情况进行适当的修改和扩展,例如设置正确的 Modbus 连接参数、处理连接错误、选择合适的寄存器地址等。

ModBus 数据格式

Folat数据格式:

ABCD ——> Big-endian

BADC ——> Big-endian byte swap

DCBA ——> little-endian

CDAB ——> little-endian byte swap

-------------本文结束感谢您的阅读-------------