Skip to content

Commit ee19d36

Browse files
committed
Fixed issue with linear operation
1 parent 4058527 commit ee19d36

File tree

4 files changed

+78
-21
lines changed

4 files changed

+78
-21
lines changed

examples/configuration_simulation.xml

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
<register addressType="HOLDING_REGISTER" address="14" symbol="RPM_MOTOR">500</register>
66
<register addressType="HOLDING_REGISTER" address="8" datatype="FLOAT32" symbol="MOTOR_SPEED1">123.7</register>
77
<register addressType="HOLDING_REGISTER" address="10" datatype="FLOAT32" symbol="TEMPERATURE1">-12.5</register>
8-
<register addressType="HOLDING_REGISTER" address="0" datatype="INT16" symbol="RPM_MOTOR1">1</register>
9-
<register addressType="HOLDING_REGISTER" address="1" datatype="INT16" symbol="RPM_MOTOR2">-2</register>
10-
<register addressType="HOLDING_REGISTER" address="2" datatype="INT16" symbol="RPM_MOTOR3">3</register>
11-
<register addressType="HOLDING_REGISTER" address="3" datatype="INT16" symbol="RPM_MOTOR4">4</register>
12-
<register addressType="HOLDING_REGISTER" address="4" datatype="INT16" symbol="RPM_MOTOR5">5</register>
13-
<register addressType="HOLDING_REGISTER" address="5" datatype="INT16" symbol="RPM_MOTOR6">6</register>
14-
<register addressType="HOLDING_REGISTER" address="6" datatype="INT16" symbol="RPM_MOTOR7">7</register>
15-
<register addressType="HOLDING_REGISTER" address="7" datatype="INT16" symbol="RPM_MOTOR8">8</register>
8+
<register addressType="HOLDING_REGISTER" address="12" datatype="FLOAT32" symbol="TEMPERATURE_MOTOR1">-12.5</register>
9+
<register addressType="HOLDING_REGISTER" address="14" datatype="FLOAT32" symbol="TEMPERATURE_MOTOR2">-12.5</register>
10+
<register addressType="HOLDING_REGISTER" address="1" datatype="INT16" symbol="RPM_MOTOR1">1</register>
11+
<register addressType="HOLDING_REGISTER" address="2" datatype="INT16" symbol="RPM_MOTOR2">-2</register>
12+
<register addressType="HOLDING_REGISTER" address="3" datatype="INT16" symbol="RPM_MOTOR3">3</register>
13+
<register addressType="HOLDING_REGISTER" address="4" datatype="INT16" symbol="RPM_MOTOR4">4</register>
14+
<register addressType="HOLDING_REGISTER" address="5" datatype="INT16" symbol="RPM_MOTOR5">5</register>
15+
<register addressType="HOLDING_REGISTER" address="6" datatype="INT16" symbol="RPM_MOTOR6">6</register>
16+
<register addressType="HOLDING_REGISTER" address="7" datatype="INT16" symbol="RPM_MOTOR7">7</register>
17+
<register addressType="HOLDING_REGISTER" address="8" datatype="INT16" symbol="RPM_MOTOR8">8</register>
1618
<register addressType="COIL" address="1" symbol="RELAYON">1</register>
1719
<register addressType="COIL" address="2" symbol="RELAYON2">1</register>
1820
<register addressType="COIL" address="3" symbol="RELAYON3">1</register>
@@ -41,7 +43,8 @@
4143
<delay>500</delay>
4244
<set symbol="RPM">60</set>
4345
<set symbol="MOTOR_SPEED1">190.5</set>
44-
<linear symbol="RPM_MOTOR1" a="5" b="4" minX="500" maxX="1000" replay="false" step="3"/>
46+
<linear symbol="TEMPERATURE_MOTOR1" a="3" b="2" startX="0" endX="12" replay="true" step="1.5"/>
47+
<linear symbol="TEMPERATURE_MOTOR2" a="3" b="2" startX="12" endX="0" replay="true" step="1.5"/>
4548
<set symbol="RELAYON">1</set>
4649
<set symbol="RELAY_STATUS">1</set>
4750
<set symbol="RPM_MOTOR">400</set>

src/main/kotlin/ConfigurationParser.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class Simulation(
6363
}
6464

6565

66-
// <linear symbol="RPM_MOTOR1" a="5" b="" minX="500" maxX="1000" replay="false" step="3"/>
66+
// <linear symbol="RPM_MOTOR1" a="5" b="3" startX="500" endX="1000" replay="false" step="3"/>
6767
@XmlRootElement(name="linear")
6868
data class Linear(
6969
@field:XmlAttribute(required = true)
@@ -73,9 +73,9 @@ data class Linear(
7373
@field:XmlAttribute(required = true)
7474
val b: Double,
7575
@field:XmlAttribute(required = true)
76-
val minX: Double,
76+
val startX: Double,
7777
@field:XmlAttribute(required = true)
78-
val maxX: Double,
78+
val endX: Double,
7979
@field:XmlAttribute(required = true)
8080
val replay: Boolean,
8181
@field:XmlAttribute(required = false)

src/main/kotlin/PlcSimulation.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class PlcSimulation(
77
memory: PlcMemory,
88
coroutineScope: CoroutineScope
99
) {
10-
10+
val linearOperations = LinearOperation()
1111
init {
1212
var simulationConfiguration = configurationParser.getConfiguredDevice().simulation
1313
var configuration = configurationParser.getConfiguredDevice().configuration
@@ -31,7 +31,7 @@ class PlcSimulation(
3131
}
3232

3333
is Linear -> {
34-
//TODO
34+
linearOperations.process(element, configuration, memory)
3535
}
3636

3737
is Add -> {

src/main/kotlin/operations/LinearOperation.kt

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,72 @@ import Configuration
44
import PlcMemory
55
import Linear
66
import java.util.concurrent.CancellationException
7-
import toBooleanFromBinary
7+
88
class LinearOperation {
99
private var linearVariables: MutableMap<String, Double> = mutableMapOf<String, Double>()
10-
fun getNextValue(linear: Linear): String{
11-
val x = linearVariables.getOrDefault(linear.symbol, linear.minX)
12-
if(x + linear.step < linear.maxX) {
13-
linearVariables[linear.symbol] = x + linear.step
10+
11+
private fun getNextValue(linear: Linear): String {
12+
var x =0.0
13+
if(linear.endX > linear.startX) {
14+
//crescente
15+
x = linearVariables.getOrDefault(linear.symbol, linear.startX)
16+
if (x + linear.step <= linear.endX) {
17+
linearVariables[linear.symbol] = x + linear.step
18+
} else {
19+
if (linear.replay) {
20+
linearVariables[linear.symbol] = linear.startX
21+
}
22+
}
1423
}else{
15-
if(linear.replay){
16-
linearVariables[linear.symbol] = linear.minX
24+
//decrescente
25+
x = linearVariables.getOrDefault(linear.symbol, linear.startX)
26+
if (x - linear.step >= linear.endX) {
27+
linearVariables[linear.symbol] = x - linear.step
28+
} else {
29+
if (linear.replay) {
30+
linearVariables[linear.symbol] = linear.startX
31+
}
1732
}
1833
}
1934
return (linear.a * x + linear.b).toString()
2035
}
36+
37+
fun process(element: Linear, configuration: Configuration, memory: PlcMemory) {
38+
var nextValue = getNextValue(element)
39+
var variable = configuration.registers.getVarConfiguration(element.symbol)
40+
if (variable == null) {
41+
println("ERROR: Symbol ${element.symbol} not found during Linear execution")
42+
throw CancellationException("Error - Linear")
43+
} else {
44+
if (variable.addressType == AddressType.COIL || variable.addressType == AddressType.DISCRETE_INPUT) {
45+
println("ERROR: Symbol ${element.symbol} is of type COIL or DISCRETE_INPUT which is not support by Linear operation")
46+
throw CancellationException("Error - Linear")
47+
}
48+
49+
when (variable.addressType) {
50+
51+
AddressType.HOLDING_REGISTER -> {
52+
//get the current value
53+
//add
54+
//set back the new value
55+
56+
if (variable.datatype == "FLOAT32") {
57+
58+
setHoldingRegisterFloat32(nextValue.toFloat(), memory, variable)
59+
} else {
60+
61+
setHoldingRegisterInt16(memory, variable, nextValue.toFloat().toInt().toShort())
62+
}
63+
}
64+
65+
AddressType.INPUT_REGISTER -> {
66+
memory.setInputRegister(variable.address.toInt(), nextValue.toFloat().toInt().toShort())
67+
}
68+
69+
else -> {
70+
throw CancellationException("Error - Linear")
71+
}
72+
}
73+
}
74+
}
2175
}

0 commit comments

Comments
 (0)