将十六进制值写入带前导零的寄存器
Write hexadecimal values into register with leading zeros
我有一个字符串数组,其中包含 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 从寄存器读取写入的数据时,前导零都丢失了。
需要帮助解决这个问题。
这是我从其他应用程序读取它们时的结果。在此结果中,缺少前导零。
这是预期的结果。
我唯一看到的是 QModMaster 程序不显示前导零,但值传输正确
不要将值与其字符串表示混淆,Modbus 传输值,而不是表示,然后这些值可以以十六进制、十进制、二进制等显示。QModMaster 作者决定不显示前导零。
您的问题应该以“我有一个字符串数组,其中包含 16 字节值的十六进制表示”开始。
我在您的代码中看到的唯一错误是转换。我认为你应该避免 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();
}
我有一个字符串数组,其中包含 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 从寄存器读取写入的数据时,前导零都丢失了。
需要帮助解决这个问题。
这是我从其他应用程序读取它们时的结果。在此结果中,缺少前导零。
我唯一看到的是 QModMaster 程序不显示前导零,但值传输正确
不要将值与其字符串表示混淆,Modbus 传输值,而不是表示,然后这些值可以以十六进制、十进制、二进制等显示。QModMaster 作者决定不显示前导零。
您的问题应该以“我有一个字符串数组,其中包含 16 字节值的十六进制表示”开始。
我在您的代码中看到的唯一错误是转换。我认为你应该避免 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();
}