use of org.apache.plc4x.java.modbus.field.ModbusFieldInputRegister in project plc4x by apache.
the class ModbusFieldDataTypeTest method testInput_DataType.
@Test
public void testInput_DataType() {
// Datatype, Length in Words
String[][] datatypes = { { "INT", "1" }, { "UINT", "1" }, { "REAL", "2" } };
for (int i = 0; i < datatypes.length; i++) {
ModbusFieldInputRegister inputregister = ModbusFieldInputRegister.of("input-register:1:" + datatypes[i][0]);
Assertions.assertEquals(datatypes[i][0], inputregister.getDataType().name());
Assertions.assertEquals(1, inputregister.getNumberOfElements());
Assertions.assertEquals(Integer.parseInt(datatypes[i][1]) * 2, inputregister.getLengthBytes());
Assertions.assertEquals(Integer.parseInt(datatypes[i][1]), inputregister.getLengthWords());
}
}
use of org.apache.plc4x.java.modbus.field.ModbusFieldInputRegister in project plc4x by apache.
the class ModbusFieldTest method testInput_INT_ARRAY_RANGE.
@Test
public void testInput_INT_ARRAY_RANGE() {
for (int i = 1; i < 125; i++) {
final ModbusFieldInputRegister inputregister = ModbusFieldInputRegister.of("300001:INT[" + i + "]");
Assertions.assertEquals(i, inputregister.getNumberOfElements());
}
}
use of org.apache.plc4x.java.modbus.field.ModbusFieldInputRegister in project plc4x by apache.
the class ModbusProtocolLogic method getReadRequestPdu.
private ModbusPDU getReadRequestPdu(PlcField field) {
if (field instanceof ModbusFieldDiscreteInput) {
ModbusFieldDiscreteInput discreteInput = (ModbusFieldDiscreteInput) field;
return new ModbusPDUReadDiscreteInputsRequest(discreteInput.getAddress(), discreteInput.getNumberOfElements());
} else if (field instanceof ModbusFieldCoil) {
ModbusFieldCoil coil = (ModbusFieldCoil) field;
return new ModbusPDUReadCoilsRequest(coil.getAddress(), coil.getNumberOfElements());
} else if (field instanceof ModbusFieldInputRegister) {
ModbusFieldInputRegister inputRegister = (ModbusFieldInputRegister) field;
return new ModbusPDUReadInputRegistersRequest(inputRegister.getAddress(), Math.max(inputRegister.getLengthWords(), 1));
} else if (field instanceof ModbusFieldHoldingRegister) {
ModbusFieldHoldingRegister holdingRegister = (ModbusFieldHoldingRegister) field;
return new ModbusPDUReadHoldingRegistersRequest(holdingRegister.getAddress(), Math.max(holdingRegister.getLengthWords(), 1));
} else if (field instanceof ModbusExtendedRegister) {
ModbusExtendedRegister extendedRegister = (ModbusExtendedRegister) field;
int group1Address = extendedRegister.getAddress() % 10000;
int group2Address = 0;
int group1Quantity;
int group2Quantity;
short group1FileNumber = (short) (Math.floor((float) extendedRegister.getAddress() / 10000) + 1);
short group2FileNumber;
List<ModbusPDUReadFileRecordRequestItem> itemArray;
if ((group1Address + extendedRegister.getLengthWords()) <= FC_EXTENDED_REGISTERS_FILE_RECORD_LENGTH) {
// If request doesn't span file records, use a single group
group1Quantity = extendedRegister.getLengthWords();
ModbusPDUReadFileRecordRequestItem group1 = new ModbusPDUReadFileRecordRequestItem((short) 6, group1FileNumber, group1Address, group1Quantity);
itemArray = Collections.singletonList(group1);
} else {
// If it doesn't span a file record. e.g. 609998[10] request 2 words in first group and 8 in second.
group1Quantity = FC_EXTENDED_REGISTERS_FILE_RECORD_LENGTH - group1Address;
group2Quantity = extendedRegister.getLengthWords() - group1Quantity;
group2FileNumber = (short) (group1FileNumber + 1);
ModbusPDUReadFileRecordRequestItem group1 = new ModbusPDUReadFileRecordRequestItem((short) 6, group1FileNumber, group1Address, group1Quantity);
ModbusPDUReadFileRecordRequestItem group2 = new ModbusPDUReadFileRecordRequestItem((short) 6, group2FileNumber, group2Address, group2Quantity);
itemArray = Arrays.asList(group1, group2);
}
return new ModbusPDUReadFileRecordRequest(itemArray);
}
throw new PlcRuntimeException("Unsupported read field type " + field.getClass().getName());
}
Aggregations