使用EasyModbusTCP Java,如何将寄存器读取为无符号值?
我正在尝试,读入ADAM 6017模拟单元的保持寄存器。我正在使用来熟悉这个图书馆。我似乎遇到的问题是,我需要将寄存器的值读取为无符号,但它会返回有符号的值。我有3.3548伏连接到该单位,规模设置为0-5v,它输出-10781从ADC。以下是我写的:使用EasyModbusTCP Java,如何将寄存器读取为无符号值?,java,modbus,modbus-tcp,Java,Modbus,Modbus Tcp,我正在尝试,读入ADAM 6017模拟单元的保持寄存器。我正在使用来熟悉这个图书馆。我似乎遇到的问题是,我需要将寄存器的值读取为无符号,但它会返回有符号的值。我有3.3548伏连接到该单位,规模设置为0-5v,它输出-10781从ADC。以下是我写的: package modbus.logger; import de.re.easymodbus.modbusclient.*; import java.lang.*; /** * * @author Michael Haire * SJVAP
package modbus.logger;
import de.re.easymodbus.modbusclient.*;
import java.lang.*;
/**
*
* @author Michael Haire
* SJVAPCD
*/
public class ModbusLogger {
public static void main(String[] args)
{
float volt;
int Input;
int x = 1;
float input;
ModbusClient modbusClient = new ModbusClient("192.168.1.201",502);
try
{ while(x>0){
modbusClient.Connect();
System.out.print("Raw ADC Value: ");System.out.println(modbusClient.ReadHoldingRegisters(0, 1)[0]);
Input = modbusClient.ReadHoldingRegisters(0, 1)[0];
System.out.print("Input: ");System.out.println(Input);
input = (float) Input;
volt = (float) ((input / 65536)*5.0);
System.out.print("Voltage: ");System.out.printf("%f%n" , volt);System.out.println("");
}}
catch (Exception e){
}
}
}
我应该如何获得无符号值?如果我没有弄错您的设备手册: 说明(第268页)通道0模拟值应在寄存器40001中 这意味着您应该使用
modbusClient.ReadHoldingRegisters
而不是输入寄存器
有时,在您忙于编写代码之前检查设备是很有用的。为此,您可以使用modpoll()或类似QModMaster()的工具。如果我没有弄错您的设备手册: 说明(第268页)通道0模拟值应在寄存器40001中 这意味着您应该使用
modbusClient.ReadHoldingRegisters
而不是输入寄存器
有时,在您忙于编写代码之前检查设备是很有用的。为此,您可以使用modpoll()或类似QModMaster()的东西。我使用[Simply Modbus](www.simplymodbus.ca)作为程序外的接口。我之前已经尝试过保持寄存器行,它给了我一个有符号的值,一旦超过2.7V,输出就变成负数。我知道Adam 6017手册,因为我经常使用这些装置。有符号的值是32767,我的输出是正的,但超过这个值,它就会变成负的。我需要和unsigned的值,因为使用unsigned可以得到完整的65565输出范围,我明白你的意思了。我不是Java专家,但显然,所有东西都是用Java签名的。我想你可以换成无签名的。看看这里:Java可能是有符号的,但是Modbus单元的输出应该是无符号的。但是您是否尝试过使用Byte.toUnsignedInt()进行转换;一旦您读取了寄存器?我将使用[Simply Modbus](www.simplymodbus.ca)作为程序外的接口。我之前已经尝试过保持寄存器行,它给了我一个有符号的值,一旦超过2.7V,输出就变成负数。我知道Adam 6017手册,因为我经常使用这些装置。有符号的值是32767,我的输出是正的,但超过这个值,它就会变成负的。我需要和unsigned的值,因为使用unsigned可以得到完整的65565输出范围,我明白你的意思了。我不是Java专家,但显然,所有东西都是用Java签名的。我想你可以换成无签名的。看看这里:Java可能是有符号的,但是Modbus单元的输出应该是无符号的。但是您是否尝试过使用Byte.toUnsignedInt()进行转换;一旦你读了注册表?