我正在使用NodeMCU和电表。电能表是Modbus RTU设备,以32位显示参数。使用下面的代码,我可以从从属设备读取数据,但需要将类型强制转换为32位浮动和显示的方法
当我在ModScan软件中将值更改为无符号十进制时,这些值会正确显示。但是我需要以32位浮点数显示值。
#include <ModbusMaster232.h>
#include <SoftwareSerial.h>
float data[100];
ModbusMaster232 node(1);
// Define one address for reading
#define address 1
// Define the number of bits to read
#define bitQty 70
void setup()
{
Serial.begin(9600);
// Initialize Modbus communication baud rate
node.begin(9600);
}
void loop()
{
int result = node.readHoldingRegisters(address, bitQty);
data[0] = (float)node.getResponseBuffer(0);
data[1] = (float)node.getResponseBuffer(1);
data[2] = (float)node.getResponseBuffer(2);
data[3] = (float)node.getResponseBuffer(3);
data[4] = (float)node.getResponseBuffer(4);
data[5] = (float)node.getResponseBuffer(5);
for (int i = 0; i < 100; i++)
{
//data[i] = node.getResponseBuffer(i);
Serial.println(data[i]);
}
Serial.println("............");
}
我想使用类型转换显示Modbus中显示的读数。
从模块实际输出的Modbus设备:
从电表读取数据时的Arduino输出:
答案 0 :(得分:0)
您正在将16位字转换为浮点数。请查阅从站文档,以了解如何将32位浮点映射到两个Modbus寄存器中。基本上,您需要知道最低有效字在哪里(第一个或第二个寄存器),将它们加载到内存中(必要时进行移位)并强制转换为浮点数。
答案 1 :(得分:0)
我正在寻找并尝试解决完全相同的问题(具有相同的结果)。这可能会帮助:
function read() {
client.readHoldingRegisters(0000, 12)
.then(function(d) {
var floatA = d.buffer.readFloatBE(0);
console.log("Total kWh: ", floatA); })
.catch(function(e) {
console.log(e.message); })
.then(close);
}
这是NodeJS和javascript版本,可以工作,而Arduino不能。可以在此处找到完整的示例,它可以在Raspberry Pi https://github.com/yaacov/node-modbus-serial/blob/master/examples/buffer.js
上运行