Skip to content

Commit 7900990

Browse files
committed
add support for inrange/outrange
1 parent 6a0df3d commit 7900990

File tree

9 files changed

+295
-9
lines changed

9 files changed

+295
-9
lines changed

TiaCodeGen.Tests/SampleTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
using NUnit.Framework;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using TiaCodegen.Blocks;
45
using TiaCodegen.Commands;
56
using TiaCodegen.Commands.Coils;
67
using TiaCodegen.Commands.Comparisons;
8+
using TiaCodegen.Commands.Functions.Base;
79
using TiaCodegen.Commands.Signals;
810
using TiaCodegen.Enums;
11+
using TiaCodegen.Interfaces;
912

1013
namespace TiaCodegen.Samples
1114
{
@@ -162,5 +165,41 @@ public void DynamicSample1()
162165
block.Interface = TestInterface;
163166
var xml = block.GetCode();
164167
}
168+
169+
[Test]
170+
public void TestCallWithOr()
171+
{
172+
var codeblock = new CodeBlock();
173+
174+
var nw = new Network("Test2");
175+
176+
var f = new FunctionBlockCall("CheckContour", "CheckContourInstance");
177+
f.Interface["BoolPar"] = new IOperationOrSignalDirectionWrapper(new Or(new Signal("P1"), new Signal("P2")), Direction.InOut);
178+
f.Children.AddRange(f.Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
179+
nw.Add(f);
180+
181+
codeblock.Add(nw);
182+
183+
var block = new Block("Test", "blabla", codeblock);
184+
block.Interface = TestInterface;
185+
var xml = block.GetCode();
186+
}
187+
188+
[Test]
189+
public void TestCallWithInRange()
190+
{
191+
var codeblock = new CodeBlock();
192+
193+
var nw = new Network("Test2");
194+
195+
var f = new InRangeCall(new Signal(1), new Signal(2), new Signal(3), new Coil(new Signal("MW0", SignalType.Int)));
196+
nw.Add(f);
197+
198+
codeblock.Add(nw);
199+
200+
var block = new Block("Test", "blabla", codeblock);
201+
block.Interface = TestInterface;
202+
var xml = block.GetCode();
203+
}
165204
}
166205
}

TiaCodegen/CodeGen/KopCodeHelper.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,19 @@ private void AddContactDefinitions(Network network, CodeBlock block)
291291

292292
if (fc is ArithmeticCall)
293293
{
294-
if (fc is AddCall)
294+
if (fc is VariableArithmeticCall)
295295
{
296296
_sb.AppendLine("<TemplateValue Name=\"Card\" Type=\"Cardinality\">" + (fc.Children.Count() - 1) + "</TemplateValue>");
297297
}
298298
_sb.AppendLine("<TemplateValue Name=\"SrcType\" Type=\"Type\">" + ((ArithmeticCall)fc).Type + "</TemplateValue>");
299299
}
300+
else if (fc is InRangeCall || fc is OutRangeCall)
301+
{
302+
var srctype = ((Signal)op.Children.First()).SignalType.ToString();
303+
if (srctype.StartsWith("Constant"))
304+
srctype = srctype.Substring(8);
305+
_sb.AppendLine("<TemplateValue Name=\"SrcType\" Type=\"Type\">" + srctype + "</TemplateValue>");
306+
}
300307
_sb.AppendLine("</Part>");
301308
}
302309
else if (op is FunctionCall)
@@ -502,7 +509,7 @@ private void AddWires(IOperationOrSignal op)
502509
}
503510
else
504511
{
505-
var inName = sng is FunctionCall ? "en" : "in";
512+
var inName = sng is FunctionCall ? ((sng is InRangeCall || sng is OutRangeCall) ? "pre" : "en") : "in";
506513
_sb.AppendLine("<NameCon UId=\"" + sng.OperationId + "\" Name=\"" + inName + "\" />");
507514
}
508515
_sb.AppendLine("</Wire>");
@@ -623,7 +630,7 @@ private void AddWires(IOperationOrSignal op)
623630

624631
var ipName = "in";
625632

626-
if (orSignal is BaseOperationOrSignal && ((BaseOperationOrSignal)orSignal).GetFirstChildNotAnd() is CompareOperator)
633+
if (orSignal is BaseOperationOrSignal && (((BaseOperationOrSignal)orSignal).GetFirstChildNotAnd() is CompareOperator || ((BaseOperationOrSignal)orSignal).GetFirstChildNotAnd() is InRangeCall || ((BaseOperationOrSignal)orSignal).GetFirstChildNotAnd() is OutRangeCall))
627634
{
628635
ipName = "pre";
629636
}
@@ -642,7 +649,7 @@ private void AddWires(IOperationOrSignal op)
642649
var srcName = ch is Signal ? ((Signal)ch).Name : ch.GetType().Name;
643650
var dstName = next is Signal ? ((Signal)next).Name : next.GetType().Name;
644651
_sb.AppendLine("<NameCon UId=\"" + ch.OperationId + "\" Name=\"" + outName + "\" />" + " <!-- " + srcName + " -->");
645-
if (next is CompareOperator)
652+
if (next is CompareOperator || next is InRangeCall || next is OutRangeCall)
646653
{
647654
_sb.AppendLine("<NameCon UId=\"" + next.OperationId + "\" Name=\"pre\" />" + " <!-- " + dstName + " -->");
648655
}
@@ -669,7 +676,7 @@ private void AddWires(IOperationOrSignal op)
669676
akC = c.Children.First();
670677
}
671678

672-
if (akC is CompareOperator)
679+
if (akC is CompareOperator || akC is InRangeCall || akC is OutRangeCall)
673680
{
674681
_sb.AppendLine("<NameCon UId=\"" + akC.OperationId + "\" Name=\"pre\" />" + " <!-- " + akC.GetType().Name + " -->");
675682
}
@@ -749,7 +756,16 @@ private void AddPowerrails(Network network)
749756
break;
750757
}
751758
if (!noPowerRail)
752-
_sb.AppendLine("<NameCon UId=\"" + s.OperationId + "\" Name=\"en\" />" + " <!-- " + ((FunctionCall)s).FunctionName + " -->");
759+
{
760+
if (s is InRangeCall || s is OutRangeCall)
761+
{
762+
_sb.AppendLine("<NameCon UId=\"" + s.OperationId + "\" Name=\"pre\" />" + " <!-- " + ((FunctionCall)s).FunctionName + " -->");
763+
}
764+
else
765+
{
766+
_sb.AppendLine("<NameCon UId=\"" + s.OperationId + "\" Name=\"en\" />" + " <!-- " + ((FunctionCall)s).FunctionName + " -->");
767+
}
768+
}
753769
noPowerRail = true;
754770
}
755771
else if (s.Parent is FunctionCall)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Linq;
2+
using TiaCodegen.Commands.Functions.Base;
3+
using TiaCodegen.Enums;
4+
using TiaCodegen.Interfaces;
5+
6+
namespace TiaCodegen.Commands.Comparisons
7+
{
8+
public class InRangeCall : SystemFunctionCall
9+
{
10+
public InRangeCall(
11+
IOperationOrSignal min,
12+
IOperationOrSignal @in,
13+
IOperationOrSignal max,
14+
IOperationOrSignal @out,
15+
IOperationOrSignal eno = null) : base("InRange", eno)
16+
{
17+
DisableEno = false;
18+
Interface["min"] = new IOperationOrSignalDirectionWrapper(min, Direction.Input);
19+
Interface["in"] = new IOperationOrSignalDirectionWrapper(@in, Direction.Input);
20+
Interface["max"] = new IOperationOrSignalDirectionWrapper(max, Direction.Output);
21+
Interface["out"] = new IOperationOrSignalDirectionWrapper(@out, Direction.Output);
22+
23+
Children.AddRange(Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
24+
}
25+
}
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Linq;
2+
using TiaCodegen.Commands.Functions.Base;
3+
using TiaCodegen.Enums;
4+
using TiaCodegen.Interfaces;
5+
6+
namespace TiaCodegen.Commands.Comparisons
7+
{
8+
public class OutRangeCall : SystemFunctionCall
9+
{
10+
public OutRangeCall(
11+
IOperationOrSignal min,
12+
IOperationOrSignal @in,
13+
IOperationOrSignal max,
14+
IOperationOrSignal @out,
15+
IOperationOrSignal eno = null) : base("OutRange", eno)
16+
{
17+
DisableEno = false;
18+
Interface["min"] = new IOperationOrSignalDirectionWrapper(min, Direction.Input);
19+
Interface["in"] = new IOperationOrSignalDirectionWrapper(@in, Direction.Input);
20+
Interface["max"] = new IOperationOrSignalDirectionWrapper(max, Direction.Output);
21+
Interface["out"] = new IOperationOrSignalDirectionWrapper(@out, Direction.Output);
22+
23+
Children.AddRange(Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
24+
}
25+
}
26+
}

TiaCodegen/Commands/Functions/Arithmetic/AddCall.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
namespace TiaCodegen.Commands.Functions.Arithmetic
66
{
7-
public class AddCall : ArithmeticCall
7+
public class MulCall : VariableArithmeticCall
88
{
9-
public AddCall(string type,
9+
public MulCall(string type,
1010
IOperationOrSignal in1,
1111
IOperationOrSignal in2,
1212
IOperationOrSignal in3 = null,
@@ -58,7 +58,7 @@ public AddCall(string type,
5858
IOperationOrSignal in49 = null,
5959
IOperationOrSignal in50 = null,
6060
IOperationOrSignal out1 = null,
61-
IOperationOrSignal eno = null) : base("Add", eno)
61+
IOperationOrSignal eno = null) : base("Mul", eno)
6262
{
6363
DisableEno = true;
6464
Type = type;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Linq;
2+
using TiaCodegen.Enums;
3+
using TiaCodegen.Interfaces;
4+
5+
namespace TiaCodegen.Commands.Functions.Arithmetic
6+
{
7+
public class DivCall : ArithmeticCall
8+
{
9+
public DivCall(string type,
10+
IOperationOrSignal in1,
11+
IOperationOrSignal in2,
12+
IOperationOrSignal out1 = null,
13+
IOperationOrSignal eno = null) : base("Div", eno)
14+
{
15+
DisableEno = true;
16+
Type = type;
17+
Interface["IN1"] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input);
18+
Interface["IN2"] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input);
19+
Interface["OUT"] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output);
20+
21+
Children.AddRange(Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
22+
}
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Linq;
2+
using TiaCodegen.Enums;
3+
using TiaCodegen.Interfaces;
4+
5+
namespace TiaCodegen.Commands.Functions.Arithmetic
6+
{
7+
public class ModCall : ArithmeticCall
8+
{
9+
public ModCall(string type,
10+
IOperationOrSignal in1,
11+
IOperationOrSignal in2,
12+
IOperationOrSignal out1 = null,
13+
IOperationOrSignal eno = null) : base("Mod", eno)
14+
{
15+
DisableEno = true;
16+
Type = type;
17+
Interface["IN1"] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input);
18+
Interface["IN2"] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input);
19+
Interface["OUT"] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output);
20+
21+
Children.AddRange(Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
22+
}
23+
}
24+
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
using System.Linq;
2+
using TiaCodegen.Enums;
3+
using TiaCodegen.Interfaces;
4+
5+
namespace TiaCodegen.Commands.Functions.Arithmetic
6+
{
7+
public class AddCall : VariableArithmeticCall
8+
{
9+
public AddCall(string type,
10+
IOperationOrSignal in1,
11+
IOperationOrSignal in2,
12+
IOperationOrSignal in3 = null,
13+
IOperationOrSignal in4 = null,
14+
IOperationOrSignal in5 = null,
15+
IOperationOrSignal in6 = null,
16+
IOperationOrSignal in7 = null,
17+
IOperationOrSignal in8 = null,
18+
IOperationOrSignal in9 = null,
19+
IOperationOrSignal in10 = null,
20+
IOperationOrSignal in11 = null,
21+
IOperationOrSignal in12 = null,
22+
IOperationOrSignal in13 = null,
23+
IOperationOrSignal in14 = null,
24+
IOperationOrSignal in15 = null,
25+
IOperationOrSignal in16 = null,
26+
IOperationOrSignal in17 = null,
27+
IOperationOrSignal in18 = null,
28+
IOperationOrSignal in19 = null,
29+
IOperationOrSignal in20 = null,
30+
IOperationOrSignal in21 = null,
31+
IOperationOrSignal in22 = null,
32+
IOperationOrSignal in23 = null,
33+
IOperationOrSignal in24 = null,
34+
IOperationOrSignal in25 = null,
35+
IOperationOrSignal in26 = null,
36+
IOperationOrSignal in27 = null,
37+
IOperationOrSignal in28 = null,
38+
IOperationOrSignal in29 = null,
39+
IOperationOrSignal in30 = null,
40+
IOperationOrSignal in31 = null,
41+
IOperationOrSignal in32 = null,
42+
IOperationOrSignal in33 = null,
43+
IOperationOrSignal in34 = null,
44+
IOperationOrSignal in35 = null,
45+
IOperationOrSignal in36 = null,
46+
IOperationOrSignal in37 = null,
47+
IOperationOrSignal in38 = null,
48+
IOperationOrSignal in39 = null,
49+
IOperationOrSignal in40 = null,
50+
IOperationOrSignal in41 = null,
51+
IOperationOrSignal in42 = null,
52+
IOperationOrSignal in43 = null,
53+
IOperationOrSignal in44 = null,
54+
IOperationOrSignal in45 = null,
55+
IOperationOrSignal in46 = null,
56+
IOperationOrSignal in47 = null,
57+
IOperationOrSignal in48 = null,
58+
IOperationOrSignal in49 = null,
59+
IOperationOrSignal in50 = null,
60+
IOperationOrSignal out1 = null,
61+
IOperationOrSignal eno = null) : base("Add", eno)
62+
{
63+
DisableEno = true;
64+
Type = type;
65+
Interface["IN1"] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input);
66+
Interface["IN2"] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input);
67+
Interface["IN3"] = new IOperationOrSignalDirectionWrapper(in3, Direction.Input);
68+
Interface["IN4"] = new IOperationOrSignalDirectionWrapper(in4, Direction.Input);
69+
Interface["IN5"] = new IOperationOrSignalDirectionWrapper(in5, Direction.Input);
70+
Interface["IN6"] = new IOperationOrSignalDirectionWrapper(in6, Direction.Input);
71+
Interface["IN7"] = new IOperationOrSignalDirectionWrapper(in7, Direction.Input);
72+
Interface["IN8"] = new IOperationOrSignalDirectionWrapper(in8, Direction.Input);
73+
Interface["IN9"] = new IOperationOrSignalDirectionWrapper(in9, Direction.Input);
74+
Interface["IN10"] = new IOperationOrSignalDirectionWrapper(in10, Direction.Input);
75+
Interface["IN11"] = new IOperationOrSignalDirectionWrapper(in11, Direction.Input);
76+
Interface["IN12"] = new IOperationOrSignalDirectionWrapper(in12, Direction.Input);
77+
Interface["IN13"] = new IOperationOrSignalDirectionWrapper(in13, Direction.Input);
78+
Interface["IN14"] = new IOperationOrSignalDirectionWrapper(in14, Direction.Input);
79+
Interface["IN15"] = new IOperationOrSignalDirectionWrapper(in15, Direction.Input);
80+
Interface["IN16"] = new IOperationOrSignalDirectionWrapper(in16, Direction.Input);
81+
Interface["IN17"] = new IOperationOrSignalDirectionWrapper(in17, Direction.Input);
82+
Interface["IN18"] = new IOperationOrSignalDirectionWrapper(in18, Direction.Input);
83+
Interface["IN19"] = new IOperationOrSignalDirectionWrapper(in19, Direction.Input);
84+
Interface["IN20"] = new IOperationOrSignalDirectionWrapper(in20, Direction.Input);
85+
Interface["IN21"] = new IOperationOrSignalDirectionWrapper(in21, Direction.Input);
86+
Interface["IN22"] = new IOperationOrSignalDirectionWrapper(in22, Direction.Input);
87+
Interface["IN23"] = new IOperationOrSignalDirectionWrapper(in23, Direction.Input);
88+
Interface["IN24"] = new IOperationOrSignalDirectionWrapper(in24, Direction.Input);
89+
Interface["IN25"] = new IOperationOrSignalDirectionWrapper(in25, Direction.Input);
90+
Interface["IN26"] = new IOperationOrSignalDirectionWrapper(in26, Direction.Input);
91+
Interface["IN27"] = new IOperationOrSignalDirectionWrapper(in27, Direction.Input);
92+
Interface["IN28"] = new IOperationOrSignalDirectionWrapper(in28, Direction.Input);
93+
Interface["IN29"] = new IOperationOrSignalDirectionWrapper(in29, Direction.Input);
94+
Interface["IN30"] = new IOperationOrSignalDirectionWrapper(in30, Direction.Input);
95+
Interface["IN31"] = new IOperationOrSignalDirectionWrapper(in31, Direction.Input);
96+
Interface["IN32"] = new IOperationOrSignalDirectionWrapper(in32, Direction.Input);
97+
Interface["IN33"] = new IOperationOrSignalDirectionWrapper(in33, Direction.Input);
98+
Interface["IN34"] = new IOperationOrSignalDirectionWrapper(in34, Direction.Input);
99+
Interface["IN35"] = new IOperationOrSignalDirectionWrapper(in35, Direction.Input);
100+
Interface["IN36"] = new IOperationOrSignalDirectionWrapper(in36, Direction.Input);
101+
Interface["IN37"] = new IOperationOrSignalDirectionWrapper(in37, Direction.Input);
102+
Interface["IN38"] = new IOperationOrSignalDirectionWrapper(in38, Direction.Input);
103+
Interface["IN39"] = new IOperationOrSignalDirectionWrapper(in39, Direction.Input);
104+
Interface["IN40"] = new IOperationOrSignalDirectionWrapper(in40, Direction.Input);
105+
Interface["IN41"] = new IOperationOrSignalDirectionWrapper(in41, Direction.Input);
106+
Interface["IN42"] = new IOperationOrSignalDirectionWrapper(in42, Direction.Input);
107+
Interface["IN43"] = new IOperationOrSignalDirectionWrapper(in43, Direction.Input);
108+
Interface["IN44"] = new IOperationOrSignalDirectionWrapper(in44, Direction.Input);
109+
Interface["IN45"] = new IOperationOrSignalDirectionWrapper(in45, Direction.Input);
110+
Interface["IN46"] = new IOperationOrSignalDirectionWrapper(in46, Direction.Input);
111+
Interface["IN47"] = new IOperationOrSignalDirectionWrapper(in47, Direction.Input);
112+
Interface["IN48"] = new IOperationOrSignalDirectionWrapper(in48, Direction.Input);
113+
Interface["IN49"] = new IOperationOrSignalDirectionWrapper(in49, Direction.Input);
114+
Interface["IN50"] = new IOperationOrSignalDirectionWrapper(in50, Direction.Input);
115+
Interface["OUT"] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output);
116+
117+
Children.AddRange(Interface.Values.Where(x => x.OperationOrSignal != null).Select(x => x.OperationOrSignal));
118+
}
119+
}
120+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using TiaCodegen.Interfaces;
2+
3+
namespace TiaCodegen.Commands.Functions.Arithmetic
4+
{
5+
public abstract class VariableArithmeticCall : ArithmeticCall
6+
{
7+
public VariableArithmeticCall(string functionName, IOperationOrSignal eno = null) : base(functionName, eno)
8+
{
9+
}
10+
}
11+
}

0 commit comments

Comments
 (0)