diff --git a/examples/test-simulation.xml b/examples/test-simulation.xml new file mode 100644 index 0000000..1f0d17d --- /dev/null +++ b/examples/test-simulation.xml @@ -0,0 +1,57 @@ + + + + + + 0x0001 + + 0x002A + + 0xA5B8 + + 0xFCDE + 0x88B8 + + 0x3AE0 + 0x2EE8 + 0x4D04 + 0x49B2 + + + + 0xFFD6 + + 0x002A + + 0xF688 + + 0xA5B8 + + 0xF18C + 0xF18C + + 0xFCDE + 0x88B8 + + 0xC51F + 0xD117 + 0xB2FB + 0xB64E + + 0x3AE0 + 0x2EE8 + 0x4D04 + 0x49B2 + + + + 0x4049 + 0x0FDC + + 0x4005 + 0xBF0A + 0x8B14 + 0x5FCF + + + diff --git a/src/main/kotlin/PlcMemory.kt b/src/main/kotlin/PlcMemory.kt index 7c11fa1..e20d1bd 100644 --- a/src/main/kotlin/PlcMemory.kt +++ b/src/main/kotlin/PlcMemory.kt @@ -26,11 +26,16 @@ class PlcMemory(configurationParser: ConfigurationParser) : IModbusServerEventL holdingRegister[register.address.toInt()] = lowWord.toShort() holdingRegister[register.address.toInt() + 1] = highWord.toShort() }else if(register.datatype == "UINT16"){ - holdingRegister[register.address.toInt()] = register.value.toUShort().toShort() + // Check if the value starts with "0x", if it does, interpret it as Hex value. + if(register.value.startsWith("0x", ignoreCase = true)){ + val hex = register.value.substring(2) + val parsed = hex.toUInt(16).toInt() and 0xFFFF + holdingRegister[register.address.toInt()] = parsed.toShort() + } else { + holdingRegister[register.address.toInt()] = register.value.toUShort().toShort() + } }else holdingRegister[register.address.toInt()] = register.value.toShort() - - } AddressType.COIL -> coils[register.address.toInt()] = (register.value.toInt() == 1) AddressType.DISCRETE_INPUT -> inputStatus[register.address.toInt()] = (register.value.toInt() == 1)