Skip to content

Commit 08d5225

Browse files
committed
Fixed issue with parameter loading
1 parent 5574b4f commit 08d5225

File tree

5 files changed

+42
-12
lines changed

5 files changed

+42
-12
lines changed

examples/configuration_simulation.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
<parameter symbol="PARAM_CURRENT_SELECTION" datatype="INT16">15</parameter>
55
<parameter symbol="PARAM_SET_TEMPERATURE" datatype="FLOAT32">5.45</parameter>
66
<parameter symbol="PARAM_ENABLE_FAST_MODE" datatype="BOOL">1</parameter>
7-
<parameter symbol="PARAM_DISABLE_MAIN_CONVEYOR" datatype="BOOL"/>
87
</parameters>
98
<configuration initializeUndefinedRegisters="true" initialValue="0">
109
<registers>
@@ -24,7 +23,7 @@
2423
<register addressType="HOLDING_REGISTER" address="6" datatype="INT16" symbol="RPM_MOTOR6">6</register>
2524
<register addressType="HOLDING_REGISTER" address="7" datatype="INT16" symbol="RPM_MOTOR7">7</register>
2625
<register addressType="HOLDING_REGISTER" address="8" datatype="INT16" symbol="RPM_MOTOR8">8</register>
27-
<register addressType="HOLDING_REGISTER" address="9" datatype="INT16" symbol="RPM_MOTOR9">9</register>
26+
<register addressType="HOLDING_REGISTER" address="22" datatype="INT16" symbol="RPM_MOTOR9">9</register>
2827
<register addressType="COIL" address="1" symbol="RELAYON">1</register>
2928
<register addressType="COIL" address="2" symbol="RELAYON2">1</register>
3029
<register addressType="COIL" address="3" symbol="RELAYON3">1</register>

src/main/kotlin/ConfigurationParser.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class ConfigurationParser {
1717
}
1818
private fun load(): Device? {
1919
try {
20-
val context = JAXBContext.newInstance(Device::class.java, Set::class.java, Random::class.java, Delay::class.java, Linear::class.java, Add::class.java, Sub::class.java, Csv::class.java, IfEqual::class.java)
20+
val context = JAXBContext.newInstance(Device::class.java, Set::class.java, Random::class.java, Delay::class.java, Linear::class.java, Add::class.java, Sub::class.java, Csv::class.java, IfEqual::class.java, Parameters::class.java, Parameter::class.java)
2121
val unmarshaller = context.createUnmarshaller()
2222
if(fileName.isEmpty()) {
2323
val reader = StringReader(this::class.java.classLoader.getResource("configuration.xml")!!.readText())
@@ -181,8 +181,9 @@ data class Set(
181181
constructor(): this("", "0")
182182
}
183183

184+
@XmlAccessorType(XmlAccessType.NONE)
184185
data class Parameters(
185-
@field:XmlElement(name = "register")
186+
@field:XmlElement(name = "parameter")
186187
val parameters: MutableList<Parameter>
187188
) {
188189
constructor(): this(mutableListOf())
@@ -196,6 +197,7 @@ data class Parameters(
196197
}
197198
}
198199

200+
@XmlAccessorType(XmlAccessType.NONE)
199201
data class Parameter(
200202
@XmlAttribute
201203
val symbol: String,

src/main/kotlin/EnvironmentVariables.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ init {
2020
if(jsonParameter.datatype == "BOOL" && envParameter.value != "0" && envParameter.value != "1"){
2121
throw InvalidPropertiesFormatException("Environment variable for parameter ${jsonParameter.symbol} has value ${envParameter.value} which does not conform with its datatype BOOL")
2222
}
23-
enviromentVars.add(EnvParameter(envParameter.symbol, envParameter.value))
23+
enviromentVars.add(EnvParameter(envParameter.symbol, envParameter.value, envParameter.type))
2424
found = true
2525
}
2626
}
2727
if (!found) {
2828
if (jsonParameter.value.isEmpty()) {
2929
throw InvalidPropertiesFormatException("Environment variable for parameter ${jsonParameter.symbol} not found, json definition do not have a default value, which makes it mandatory")
3030
} else {
31-
enviromentVars.add(EnvParameter(jsonParameter.symbol, jsonParameter.value))
31+
enviromentVars.add(EnvParameter(jsonParameter.symbol, jsonParameter.value, jsonParameter.datatype))
3232
}
3333
}
3434
}

src/main/kotlin/Main.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import kotlin.system.exitProcess
99

1010
data class EnvParameter(
1111
var symbol : String,
12-
var value: String
12+
var value: String,
13+
var type: String
1314
)
1415
@Command(name = "modbussimulatorcli", mixinStandardHelpOptions = true, version = ["CLI 0.0.99"],
1516
description = ["Modbus TCP Simulator"])
@@ -41,7 +42,7 @@ class Checksum : Callable<Int> {
4142
if(parts.count() != 2){
4243
throw InvalidPropertiesFormatException("Environment parameter does not follow the format NAME=VALUE")
4344
}else{
44-
envParameter.add(EnvParameter(parts[0],parts[1]))
45+
envParameter.add(EnvParameter(parts[0],parts[1], ""))
4546
}
4647
}
4748
}
@@ -71,7 +72,8 @@ class Checksum : Callable<Int> {
7172
}
7273
// if not set default, reading internal xml
7374
plcMemory = PlcMemory(configuration)
74-
plcSimulation = PlcSimulation(configuration, plcMemory,EnvironmentVariables(environmentParameters, configuration), mainCoroutineScope)
75+
var envVariables = EnvironmentVariables(environmentParameters, configuration)
76+
plcSimulation = PlcSimulation(configuration, plcMemory,envVariables, mainCoroutineScope)
7577
modbusServer = ModbusServer(plcMemory)
7678
}
7779

src/main/kotlin/PlcSimulation.kt

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,37 @@ class PlcSimulation(
8989
var value = processValue(element.value)
9090
var variable = configuration.registers.getVarConfiguration(element.symbol)
9191
if (variable == null) {
92+
val envVar = parameters.resolveEnvVar(element.symbol)
93+
if(envVar != null){
94+
if(envVar.type == "FLOAT32"){
95+
if(envVar.value.toFloat() != value.toFloat()){
96+
//abort and continue
97+
//since the value does not match the condition
98+
return
99+
}
100+
//execute operations
101+
element.randomElements.forEach { subElement ->
102+
processOperationElement(subElement, configuration, memory)
103+
}
104+
}else
105+
if(envVar.type == "INT16" || envVar.type == "BOOL" ){
106+
if(envVar.value.toInt() != value.toInt()){
107+
//abort and continue
108+
//since the value does not match the condition
109+
return
110+
}
111+
//execute operations
112+
element.randomElements.forEach { subElement ->
113+
processOperationElement(subElement, configuration, memory)
114+
}
115+
}else {
116+
println("ERROR: Symbol ${element.symbol} has invalid datatype during IfEqual execution")
117+
}
92118

93-
94-
println("ERROR: Symbol ${element.symbol} not found during IfEqual execution")
95-
throw CancellationException("Error - IfEqual")
119+
}else {
120+
println("ERROR: Symbol ${element.symbol} not found during IfEqual execution")
121+
throw CancellationException("Error - IfEqual")
122+
}
96123
} else {
97124

98125
when (variable.addressType) {

0 commit comments

Comments
 (0)