关于MODBUSmaster库读取浮点数的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2730|回复: 2

[未解决] 关于MODBUSmaster库读取浮点数的问题

[复制链接]
发表于 2021-6-12 12:50 | 显示全部楼层 |阅读模式
modbus读取按照字来读,我在MODBUS SLAVE内模拟,地址0 为一个int,读取正常,但是地址1、2位一个32位的浮点数(已经在slave端设置,高低字格式为ABCD),
如何才能将读取到的1、2两个字的内容合并成一个float (abcd),在arduino的体现出?
而非将slave端的浮点放大1000倍当整数传输,再在arduino上除以1000来恢复?
下面读到的float L只是高低字中的一半,当做int来读的,再转了float,值为16708.00,在LCD2004显示,,,,
谢谢高手为我解答

aaa.jpg

#include<ModbusMaster.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
uint8_t result;
ModbusMaster node;
void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600,SERIAL_8E1);
  node.begin(1,Serial1);
  lcd.begin(20, 4);
}


void loop()
{

result = node.readHoldingRegisters(0,3);

if (result == node.ku8MBSuccess)
{  lcd.setCursor(0, 0);
  lcd.print("modbus_test_data:");
  lcd.setCursor(0, 1);
  lcd.print( node.getResponseBuffer(0), DEC );
  lcd.setCursor(0, 2);
  lcd.print("TEST_REAL_VALUE" );
   float L = node.getResponseBuffer(1);
   lcd.setCursor(0, 3);
   lcd.print(L);

aa2.jpg
 楼主| 发表于 2021-6-12 15:20 | 显示全部楼层
目前我采用的方案是将modbus浮点数读取过来后的两个word拆分成4个byte,再合并转换成一个float,取得的浮点数目前拆分的4个byte的值(二进制)是对的,已经用Siemens PLC进行字节值(8bit)进行验证,但是组合成浮点数就没数值了,
我是新手,刚接触arduino,程序是网上找的代码改的,不知道是不是合成浮点数这段有问题,请帮我分析分析,谢谢了
screenshot_20210612_151347.jpg


----------------------代码
byte fH1low;
byte fH1high;
byte fL1low;
byte fL1high;

union SeFrame
{
  float Float;
  byte Byte[4];
};

SeFrame Sefram;  
float Rev_float()
{  
    Sefram.Byte[0] = fH1low;
  Sefram.Byte[1] = fH1high;
    Sefram.Byte[2] = fL1low;
   Sefram.Byte[3] = fL1high;

//  Sefram.Byte[0] = fL1low;
//  Sefram.Byte[1] = fL1high;
// Sefram.Byte[2] = fH1low;
//Sefram.Byte[3] = fH1high;

   return Sefram.Float;
}
float Rev_float( );







  word fL1 = node.getResponseBuffer(1);
   word fH1 = node.getResponseBuffer(2);

lcd.setCursor(0,3 );
//lcd.print(fH1);




byte fL1high = (byte)highByte(fL1);
byte fL1low = (byte)lowByte(fL1);
byte fH1high = (byte)highByte(fH1);
byte fH1low = (byte)lowByte(fH1);
lcd.setCursor(0,3 );
lcd.print(fL1high);
lcd.setCursor(4,3 );
lcd.print(fL1low);
lcd.setCursor(8,3 );
lcd.print(fH1high);
lcd.setCursor(12,3 );
lcd.print(fH1low);


   lcd.setCursor(0, 2);


float f;
    f = Rev_float();
lcd.print(f);
}





 楼主| 发表于 2021-6-12 16:15 | 显示全部楼层
终于成功了,原来是变量fL1high无法传到上面的float Rev_float()里面
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 04:03 , Processed in 0.075361 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表