问题
I have an string array which contains 16 hexadecimal values. I need to convert them into byte to write them at Modbus's device register(size of each register is 16-bit). We have 8 registers to write 16 hexadecimal values. So, I'm converting them into the short and from short to byte for write them at device's register.
Here is my code --
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();
}
Whenever, I am reading the written data from the register through QModMaster , leading zeros are missing.
Need help to solve this Issue.
This is the result, when I read them from other application. In this result, leading zero are missing. This is the expected result.
回答1:
The only wrong thing I can see in your code is conversion. I think you should have avoided the String to Short
conversion especially when, you can directly convert hex to byte
.
You should have done it something like this -
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:
The only thing I see is that the QModMaster program does not show the leading zeros but values are transmitted correctly
Do not confuse values with their string representation, Modbus transmits values, not representations, then those values can be shown in hexadecimal, decimal, binary etc. and QModMaster author decided to don't show leading zeros.
Your question should have started with "I have an string array which contains the hexadecimal representation of 16 byte values".
来源:https://stackoverflow.com/questions/64352018/write-hexadecimal-values-into-register-with-leading-zeros