#java #modbus
#java #modbus
Вопрос:
Я использую Jamod для извлечения значений с устройства Modbus. Это отлично работает для нормальных значений. Когда я пытаюсь извлечь отрицательное значение из register, оно генерирует некоторое случайное значение.
Код:
private float getData (String address, int count) {
float sum = 0.0f;
request = new ReadMultipleRegistersRequest(Integer.parseInt(address), count);
response = new ReadMultipleRegistersResponse();
request.setUnitID(1);
response.setUnitID(1);
request.setHeadless();
try {
response = (ReadMultipleRegistersResponse) execute(connection, holdingRequest);
for ( int i=0; i<registerCount; i ) {
sum = sum response.getRegisterValue(i);
}
System.out.println("Sum: " sum);
} catch (Exception e) {
e.printStackTrace();
}
return sum;
}
private ModbusResponse execute(SerialConnection connection, ModbusRequest request) {
try {
transaction = new ModbusSerialTransaction(connection);
transaction.setRequest(request);
transaction.execute();
return transaction.getResponse();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Пожалуйста, помогите. Заранее спасибо
Ответ №1:
В устройствах modbus размер регистра в основном равен 16 битам, поэтому, когда вы получаете значения из register с помощью jamod, вы должны позаботиться о сохранении их в надлежащем типе данных.
например. в регистре 0x1000 сохранено значение -12456, и когда мы прочитаем его, скажем
int value = readRegister(0x1000);
it returns me value = 53080
таким образом, int является 32-разрядным, изменение типа данных int (32-разрядный) на short (16-разрядный) возвращает исходное отрицательное значение
short value = (short) readRegister(0x1000);
it returns value = -12456
надеюсь, это ответит на вашу проблему!