#java #hex #byte #ascii #modbus
#java #шестнадцатеричное #байт #ascii #modbus
Вопрос:
У меня есть массив строк, который содержит 16 шестнадцатеричных значений. Мне нужно преобразовать их в байты, чтобы записать их в регистр устройства Modbus (размер каждого регистра 16 бит). У нас есть 8 регистров для записи 16 шестнадцатеричных значений. Итак, я преобразую их в короткие и из коротких в байтовые для записи их в регистр устройства.
Вот мой код —
String[] advanceByte = { "00", "00", "00", "00", "07", "46", "46", "07", "01", "00", "02", "02", "02", "03", "00", "00"};
short[] hexToShort = new short[16];
for (int i = 0; i < 16; i ) {
hexToShort[i] = Short.parseShort(advanceByte[i], 16);
}
// Converting Integer to Byte
byte[] byteData = new byte[16];
for (int i = 0; i < advanceByte.length; i ) {
byteData`[i] = (byte) hexToShort[i];
}
for (int i = 0; i < byteData.length - 1;) {
byte[] byteArr1 = {(byte) byteData[i], (byte) byteData[i 1]};
try {
trans = new ModbusSerialTransaction(serialConnection);
SimpleRegister myregister;
myregister = new SimpleRegister(byteArr1[0], byteArr1[1]);
writeSingleRegisterRequest = new WriteSingleRegisterRequest();
writeSingleRegisterRequest.setUnitID(slave_Address);
writeSingleRegisterRequest.setHeadless();
writeSingleRegisterRequest.setReference(ref2); //register number
myregister.setValue(byteArr1);
Register[] register = {myregister};
writeSingleRegisterRequest.setRegister(myregister);
trans.setRequest(writeSingleRegisterRequest);
trans.execute();
i = i 2;
ref2 ;
} catch (com.ghgande.j2mod.modbus.ModbusException exception) {
advancedStatus = false;
System.out.println("Table 4x4 data Writing Exception");
System.out.println("Exception Occured ----" exception);
}
serialConnection.close();
}
Всякий раз, когда я считываю записанные данные из регистра через QModMaster, начальные нули отсутствуют.
Нужна помощь для решения этой проблемы.
Это результат, когда я читаю их из другого приложения. В этом результате начальный ноль отсутствует. Это ожидаемый результат.
Ответ №1:
Единственная неправильная вещь, которую я вижу в вашем коде, — это преобразование. Я думаю, вам следовало избегать String to Short
преобразования, особенно когда вы можете напрямую конвертировать hex to byte
. Вы должны были сделать это примерно так —
String[] advanceByte = { "00", "00", "00", "00", "07", "46", "46", "07", "01", "00", "02", "02", "02", "03", "00", "00"};
byte[] byteData = new byte[16];
for (int i = 0; i < advanceByte.length; i ) {
byteData[i] = Byte.parseByte(advanceByte[i],16);
}
for (int i = 0; i < byteData.length - 1;) {
byte[] byteArr1 = {(byte) byteData[i], (byte) byteData[i 1]};
try {
trans = new ModbusSerialTransaction(serialConnection);
SimpleRegister myregister;
myregister = new SimpleRegister(byteArr1[0], byteArr1[1]);
writeSingleRegisterRequest = new WriteSingleRegisterRequest();
writeSingleRegisterRequest.setUnitID(slave_Address);
writeSingleRegisterRequest.setHeadless();
writeSingleRegisterRequest.setReference(ref2); //register number
myregister.setValue(byteArr1);
Register[] register = {myregister};
writeSingleRegisterRequest.setRegister(myregister);
trans.setRequest(writeSingleRegisterRequest);
trans.execute();
i = i 2;
ref2 ;
} catch (com.ghgande.j2mod.modbus.ModbusException exception) {
advancedStatus = false;
System.out.println("Table 4x4 data Writing Exception");
System.out.println("Exception Occured ----" exception);
}
serialConnection.close();
}
Ответ №2:
Единственное, что я вижу, это то, что программа QModMaster не показывает начальные нули, но значения передаются правильно
Не путайте значения с их строковым представлением, Modbus передает значения, а не представления, тогда эти значения могут быть показаны в шестнадцатеричном, десятичном, двоичном и т.д. и автор QModMaster решил не показывать начальные нули.
Ваш вопрос должен был начинаться с «У меня есть массив строк, который содержит шестнадцатеричное представление 16-байтовых значений».