>(reader);
+ }
+ }
+
+ return rec;
+ }
+
+ protected static Recording Squash(Recording
recording)
+ {
+ var squashed = new Recording
();
+
+ var adapter = new ConnectorAdapter(typeof(DummyConnectorFactory));
+ var connector = adapter.GetConnector(new object[] { });
+
+ T current = (T)Activator.CreateInstance(typeof(T), connector, string.Empty, string.Empty);
+ T next = (T)Activator.CreateInstance(typeof(T), connector, string.Empty, string.Empty);
+
+ for (int i = 0; i < recording.Frames.LongCount(); i++)
+ {
+ var currentFrame = recording.Frames[i];
+ P currentObject = currentFrame.Object;
+ long currentObjectStamp = recording.Frames[i].Stamp;
+ CopyToOnline(current, currentObject);
+ var currentTags = current.RetrieveValueTags().ToArray();
+
+
+ var nextFrame = currentFrame;
+ P nextObject = currentObject;
+ long nextObjectStamp = currentObjectStamp;
+ CopyToOnline(next, nextObject);
+ var nextTags = next.RetrieveValueTags().ToArray();
+
+ if (i < recording.Frames.LongCount() - 1)
+ {
+ nextFrame = recording.Frames[i + 1];
+ nextObject = nextFrame.Object;
+ nextObjectStamp = nextFrame.Stamp;
+ CopyToOnline(next, nextObject);
+ nextTags = next.RetrieveValueTags().ToArray();
+ }
+
+
+ var isSame = true;
+
+ for (int next_index = 0; next_index < nextTags.LongCount(); next_index++)
+ {
+ if (((dynamic)nextTags[next_index]).Cyclic != ((dynamic)currentTags[next_index]).Cyclic)
+ {
+ isSame = false;
+ break;
+ }
+ }
+
+ if (squashed.Frames.LongCount() == 0)
+ {
+ squashed.Frames.Add(currentFrame);
+ }
+
+ if (isSame)
+ {
+ squashed.Frames.Last().Stamp = nextObjectStamp;
+ }
+ else
+ {
+ squashed.Frames.Add(nextFrame);
+ }
+ }
+
+ return squashed;
+ }
+
+ protected static object GetPlainerCopyNow(dynamic obj)
+ {
+ var plain = obj.CreatePlainerType();
+ obj.FlushOnlineToPlain(plain);
+ return plain;
+ }
+
+ protected static void CopyToOnline(dynamic obj, P source)
+ {
+ obj.FlushPlainToOnline(source);
+ }
+
+ public Recording
Recording
+ {
+ get { return this.recording; }
+ }
+
+ protected Recording
recording
+ {
+ get;
+ set;
+ } = new Recording
();
+ }
+}
diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/RecorderModeEnum.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/RecorderModeEnum.cs
new file mode 100644
index 000000000..71fc08e99
--- /dev/null
+++ b/src/Tc.Prober/src/Tc.Prober/Recorder/RecorderModeEnum.cs
@@ -0,0 +1,9 @@
+namespace Tc.Prober.Recorder
+{
+ public enum RecorderModeEnum
+ {
+ None,
+ Player,
+ Graver
+ }
+}
diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/Recording.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/Recording.cs
new file mode 100644
index 000000000..64bb4f9f8
--- /dev/null
+++ b/src/Tc.Prober/src/Tc.Prober/Recorder/Recording.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+namespace Tc.Prober.Recorder
+{
+ using Vortex.Connector;
+
+ public class Recording
where P : IPlain
+ {
+ public void StartRecording()
+ {
+ CurrentFramePosition = 0;
+ Frames.Clear();
+ }
+ public void GoTop()
+ {
+ CurrentFramePosition = 0;
+ }
+
+ public long CurrentFramePosition
+ {
+ get;
+ private set;
+ }
+ public void AddRecordFrame(RecordFrame
frame)
+ {
+ frame.Stamp = CurrentFramePosition++;
+ Frames.Add(frame);
+ }
+
+ private long lastFrameSector = long.MaxValue;
+ public RecordFrame
ReadFrame()
+ {
+ var frame = Frames.Where(p => p.Stamp >= CurrentFramePosition && p.Stamp <= lastFrameSector).FirstOrDefault();
+ var closestFrame = Frames.Where(p => p.Stamp > CurrentFramePosition).FirstOrDefault();
+ lastFrameSector = closestFrame == null ? -1 : closestFrame.Stamp;
+ CurrentFramePosition++;
+ return frame;
+ }
+
+ public RecordFrame
ReadFrame(long position)
+ {
+ var frame = Frames.Where(p => p.Stamp >= position && p.Stamp <= lastFrameSector).FirstOrDefault();
+ var closestFrame = Frames.Where(p => p.Stamp > position).FirstOrDefault();
+ lastFrameSector = closestFrame == null ? -1 : closestFrame.Stamp;
+ return frame;
+ }
+
+ public IList> Frames
+ {
+ get;
+ } = new List>();
+ }
+}
diff --git a/src/Tc.Prober/src/Tc.Prober/Runners/Runner.cs b/src/Tc.Prober/src/Tc.Prober/Runners/Runner.cs
new file mode 100644
index 000000000..6a240d617
--- /dev/null
+++ b/src/Tc.Prober/src/Tc.Prober/Runners/Runner.cs
@@ -0,0 +1,93 @@
+namespace Tc.Prober.Recorder
+{
+ using System;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Runtime.CompilerServices;
+ using Vortex.Connector;
+
+ ///
+ /// Series of extension methods that are able to run the test with recording ability.
+ ///
+ public static class Runner
+ {
+ ///
+ /// Gets or sets the directory where the recodings are strored.
+ ///
+ public static string RecordingsShell { get; set; }
+
+ ///
+ /// Examines the stack and retrieves name of the method at the given level.
+ ///
+ /// Stack frame from which to retrieve the method name.
+ /// Method name.
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ public static string CallerMethodName(int frame = 1)
+ {
+ StackTrace st = new StackTrace();
+ StackFrame sf = st.GetFrame(frame);
+
+ return sf.GetMethod().Name;
+ }
+
+ ///
+ /// Gets the name of the method from the given level on the call stack.
+ ///
+ /// Stack level
+ /// Method name
+ public static string GetRecordingFilePathWithMethodName(int level = 2)
+ {
+ return Path.Combine(RecordingsShell, $"{CallerMethodName(level)}.json");
+ }
+
+
+ private static string GetAutoName()
+ {
+ return Path.Combine(RecordingsShell, $"{CallerMethodName(3)}.json");
+ }
+
+ ///
+ /// Runs test with recording/replaying.
+ ///
+ /// Test method return type.
+ /// Subject under test.
+ /// Action to be performed (typically test method)
+ /// Indicates that the test has finished.
+ /// What should be called prior to .
+ /// What should be called after .
+ /// Instance of the recorder/player.
+ /// Name of the recording file
+ /// Last result of the
+ public static T Run(this IVortexElement sut,
+ Func action,
+ Func done,
+ Action openCycle = null,
+ Action closeCycle = null,
+ IRecorder recorder = null,
+ string recordingFileName = null
+ )
+
+ {
+ T retVal = default(T);
+
+ recorder?.Begin(recordingFileName);
+
+ while (!done())
+ {
+ recorder?.Act();
+ openCycle?.Invoke();
+ retVal = action();
+ closeCycle?.Invoke();
+ recorder?.Act();
+ }
+
+ recorder?.Act();
+
+ recorder?.End(recordingFileName);
+
+ return retVal;
+ }
+
+
+ }
+}
diff --git a/src/Tc.Prober/src/Tc.Prober/Runners/TaskRunners.cs b/src/Tc.Prober/src/Tc.Prober/Runners/TaskRunners.cs
new file mode 100644
index 000000000..d5279c1b6
--- /dev/null
+++ b/src/Tc.Prober/src/Tc.Prober/Runners/TaskRunners.cs
@@ -0,0 +1,42 @@
+namespace Tc.Prober.Runners
+{
+ using System;
+ using Vortex.Connector;
+
+ ///
+ /// Contains series of helper methods for executing RPC plc methods.
+ ///
+ public static class TaskRunners
+ {
+ ///
+ /// Runs the test method until returns true.
+ ///
+ /// Type of subject under test. Must be of
+ /// Subject under test.
+ ///
+ public static void Run(this T sut, Func testMethod) where T : IVortexObject
+ {
+ while (!testMethod(sut));
+ }
+
+ ///
+ /// Runs the unit test given number of times.
+ ///
+ /// Type of subject under test. Must be of
+ /// Type of return value.
+ /// Subject under test
+ /// Test method.
+ /// Number of runs.
+ /// Return value of the test method
+ public static R Run(this T sut, Func testMethod, int numberOfRuns) where T : IVortexObject
+ {
+ object ret = null;
+ for (int i = 0; i < numberOfRuns; i++)
+ {
+ ret = testMethod(sut);
+ }
+
+ return (R)ret;
+ }
+ }
+}
diff --git a/src/Tc.Prober/src/Tc.Prober/Tc.Prober.csproj b/src/Tc.Prober/src/Tc.Prober/Tc.Prober.csproj
new file mode 100644
index 000000000..4adf3bd6a
--- /dev/null
+++ b/src/Tc.Prober/src/Tc.Prober/Tc.Prober.csproj
@@ -0,0 +1,29 @@
+
+
+ net48
+ TcOpen.Tc.Prober
+ petok
+ true
+ MIT
+ https://github.com/TcOpenGroup/tc.prober
+ https://github.com/TcOpenGroup/tc.prober
+ git
+ $(InformationalVersion)
+ $(InformationalVersion)
+ true
+ Library for unit testing TwinCAT3 Plc code.
+ TcOpenGroup contributors
+ TcOpenLogo128.png
+ twincat3 plc unit-testing
+ false
+
+
+
+
+
+
+ True
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/PlcTcProberTestsConnector/Entry.cs b/src/Tc.Prober/tests/PlcTcProberTestsConnector/Entry.cs
new file mode 100644
index 000000000..bca0f0aef
--- /dev/null
+++ b/src/Tc.Prober/tests/PlcTcProberTestsConnector/Entry.cs
@@ -0,0 +1,10 @@
+using System;
+using Vortex.Adapters.Connector.Tc3.Adapter;
+
+namespace PlcTcProberTestsConnector
+{
+ public static class Entry
+ {
+ public static PlcTcProberTests.PlcTcProberTestsTwinController Plc { get; } = new PlcTcProberTests.PlcTcProberTestsTwinController(Tc3ConnectorAdapter.Create(851));
+ }
+}
diff --git a/src/Tc.Prober/tests/PlcTcProberTestsConnector/PlcTcProberTestsConnector.csproj b/src/Tc.Prober/tests/PlcTcProberTestsConnector/PlcTcProberTestsConnector.csproj
new file mode 100644
index 000000000..a4b0c9f9a
--- /dev/null
+++ b/src/Tc.Prober/tests/PlcTcProberTestsConnector/PlcTcProberTestsConnector.csproj
@@ -0,0 +1,29 @@
+
+
+ net48
+ 0.3.0.0
+ 0.3.0.0
+ 0.3.0-alpha.1+Branch.develop.Sha.02a3c846fa59432b34737d664bc33a8546fd145a
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Localizations.resx
+
+
+
+
+ ResXFileCodeGenerator
+ Localizations.Designer.cs
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/PlcTcProberTestsConnector/Properties/Localizations.Designer.cs b/src/Tc.Prober/tests/PlcTcProberTestsConnector/Properties/Localizations.Designer.cs
new file mode 100644
index 000000000..db8c368ef
--- /dev/null
+++ b/src/Tc.Prober/tests/PlcTcProberTestsConnector/Properties/Localizations.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace PlcTcProberTestsConnector.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Localizations {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Localizations() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PlcTcProberTestsConnector.Properties.Localizations", typeof(Localizations).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/src/Tc.Prober/tests/PlcTcProberTestsConnector/Properties/Localizations.resx b/src/Tc.Prober/tests/PlcTcProberTestsConnector/Properties/Localizations.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/src/Tc.Prober/tests/PlcTcProberTestsConnector/Properties/Localizations.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/Tc.ProberTest/Properties/AssemblyInfo.cs b/src/Tc.Prober/tests/Tc.ProberTest/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..392edd1e4
--- /dev/null
+++ b/src/Tc.Prober/tests/Tc.ProberTest/Properties/AssemblyInfo.cs
@@ -0,0 +1,38 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("vortex.recorderTests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("vortex.recorderTests")]
+[assembly: AssemblyCopyright("Copyright © 2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("a44897b1-38fb-42e0-a2a8-7601d1448f39")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("0.4.1.0")]
+[assembly: AssemblyVersion("0.4.1.0")]
+[assembly: AssemblyFileVersion("0.4.1.0")]
+
+[assembly: AssemblyInformationalVersion("0.4.1-initial-dev.375+Branch.initial-dev.Sha.70df6b177f3b27b9fcedd3aa9c169ecdc6bd2d56")]
diff --git a/src/Tc.Prober/tests/Tc.ProberTest/RecorderTests.cs b/src/Tc.Prober/tests/Tc.ProberTest/RecorderTests.cs
new file mode 100644
index 000000000..b3828d598
--- /dev/null
+++ b/src/Tc.Prober/tests/Tc.ProberTest/RecorderTests.cs
@@ -0,0 +1,214 @@
+namespace Tc.Prober.RecorderTests
+{
+ using NUnit.Framework;
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Text;
+ using System.Threading.Tasks;
+ using Vortex.Connector;
+ using PlcTcProberTests;
+ using System.IO;
+ using System.Reflection;
+ using Tc.Prober.Recorder;
+ using Vortex.Adapters.Connector.Tc3.Adapter;
+
+ [TestFixture()]
+ public class RecorderTests
+ {
+
+ private PlcTcProberTestsTwinController connector = null;
+ private string RecordingFile;
+ private string SquashTestFile;
+
+ [OneTimeSetUp]
+ public void OneTimeSetUp()
+ {
+ var relativePath = Path.GetFullPath(Path.Combine(new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName, @"..\..\..\output\"));
+ RecordingFile = Path.Combine(relativePath, "baseRecord.rec");
+ SquashTestFile = Path.Combine(relativePath, "squashRecord.rec");
+
+
+ if (File.Exists(RecordingFile)) File.Delete(RecordingFile);
+ if (File.Exists(SquashTestFile)) File.Delete(SquashTestFile);
+
+ Assert.IsFalse(File.Exists(RecordingFile));
+ Assert.IsFalse(File.Exists(SquashTestFile));
+
+
+ connector = new PlcTcProberTestsTwinController(Tc3ConnectorAdapter.Create(null, 851, false));
+ connector.Connector.BuildAndStart().ReadWriteCycleDelay = 10;
+ }
+
+ [Test()]
+ [Order(100)]
+ public void RecordTest()
+ {
+ var recorder = new Graver(connector.MAIN.InheritanceRw);
+
+ recorder.StartRecording();
+
+ for (int i = 0; i < 254; i++)
+ {
+ connector.MAIN.InheritanceRw.level_0.BYTE_val.Cyclic = (byte)i;
+ connector.MAIN.InheritanceRw.level_1.BYTE_val.Cyclic = (byte)i;
+ connector.MAIN.InheritanceRw.level_2.WORD_val.Cyclic = (ushort)(i*2);
+ connector.MAIN.InheritanceRw.level_2.STRING_val.Cyclic = (i * 180).ToString();
+ connector.MAIN.InheritanceRw.level_3.WSTRING_val.Cyclic = (i * 258).ToString();
+ connector.MAIN.InheritanceRw.Write();
+ recorder.RecordFrame();
+ }
+
+ recorder.Stop(RecordingFile);
+
+ Assert.IsTrue(File.Exists(RecordingFile), "Recroding file not created.");
+ }
+
+ [Test()]
+ [Order(200)]
+ public void PlaySelectedFramesTest()
+ {
+ var recorder = new Player(connector.MAIN.InheritanceRw);
+ recorder.StartPlay(RecordingFile);
+
+ for (int i = 0; i < 254; i++)
+ {
+ var frame = recorder.PlayFrame((long)i);
+ connector.MAIN.InheritanceRw.Read();
+ Assert.AreEqual((byte)i, connector.MAIN.InheritanceRw.level_0.BYTE_val.Cyclic, $"Frame: {frame}:{i}");
+ Assert.AreEqual((byte)i, connector.MAIN.InheritanceRw.level_1.BYTE_val.Cyclic, $"Frame: {frame}:{i}");
+ Assert.AreEqual((ushort)(i * 2), connector.MAIN.InheritanceRw.level_2.WORD_val.Cyclic, $"Frame: {frame}:{i}");
+ Assert.AreEqual((i * 180).ToString(), connector.MAIN.InheritanceRw.level_2.STRING_val.Cyclic, $"Frame: {frame}:{i}");
+ Assert.AreEqual((i * 258).ToString(), connector.MAIN.InheritanceRw.level_3.WSTRING_val.Cyclic, $"Frame: {frame}:{i}");
+ }
+ }
+
+ [Test()]
+ [Order(300)]
+ public void PlayFramesTest()
+ {
+ var recorder = new Player(connector.MAIN.InheritanceRw);
+ recorder.StartPlay(RecordingFile);
+
+ for (int i = 0; i < 254; i++)
+ {
+ var frame = recorder.PlayFrame();
+ connector.MAIN.InheritanceRw.Read();
+ Assert.AreEqual((byte)i, connector.MAIN.InheritanceRw.level_0.BYTE_val.Cyclic, $"Frame: {frame}:{i}");
+ Assert.AreEqual((byte)i, connector.MAIN.InheritanceRw.level_1.BYTE_val.Cyclic, $"Frame: {frame}:{i}");
+ Assert.AreEqual((ushort)(i * 2), connector.MAIN.InheritanceRw.level_2.WORD_val.Cyclic, $"Frame: {frame}:{i}");
+ Assert.AreEqual((i * 180).ToString(), connector.MAIN.InheritanceRw.level_2.STRING_val.Cyclic, $"Frame: {frame}:{i}");
+ Assert.AreEqual((i * 258).ToString(), connector.MAIN.InheritanceRw.level_3.WSTRING_val.Cyclic, $"Frame: {frame}:{i}");
+ }
+ }
+
+ [Test()]
+ [Order(1000)]
+ public void SquashTest()
+ {
+ var recorder = new Graver(connector.MAIN.InheritanceRw.level_0);
+
+ recorder.StartRecording();
+
+ for (int i = 0; i < 254; i++)
+ {
+ if(i % 10 == 0)
+ {
+ connector.MAIN.InheritanceRw.level_0.STRING_val.Cyclic = i.ToString();
+ connector.MAIN.InheritanceRw.level_0.Write();
+ }
+
+ recorder.RecordFrame();
+ }
+
+ recorder.Stop(SquashTestFile);
+ Assert.IsTrue(File.Exists(SquashTestFile), "Squash test recording file not created.");
+
+ var player = new Player(connector.MAIN.InheritanceRw.level_0);
+
+ player.StartPlay(SquashTestFile);
+
+
+
+ foreach (var item in recorder.Recording.Frames)
+ {
+ Console.WriteLine($"{item.Stamp} : {item.Object.STRING_val}");
+ }
+
+ Assert.AreEqual(26, player.Recording.Frames.Count());
+ Assert.AreEqual(9, player.Recording.Frames[0].Stamp);
+ Assert.AreEqual("0", player.Recording.Frames[0].Object.STRING_val);
+ Assert.AreEqual(19, player.Recording.Frames[1].Stamp);
+ Assert.AreEqual("10", player.Recording.Frames[1].Object.STRING_val);
+ Assert.AreEqual(253, player.Recording.Frames[25].Stamp);
+ Assert.AreEqual("250", player.Recording.Frames[25].Object.STRING_val);
+ }
+
+ [Test()]
+ [Order(1100)]
+ public void PlaySquashedTest()
+ {
+ var recorder = new Player(connector.MAIN.InheritanceRw.level_0);
+
+ recorder.StartPlay(SquashTestFile);
+
+
+ var expected = 0;
+ for (int i = 0; i < 254; i++)
+ {
+ Console.WriteLine($"{i}:{recorder.PlayFrame()} : {connector.MAIN.InheritanceRw.level_0.STRING_val.Cyclic}");
+ if (i % 10 == 0)
+ {
+ expected = i;
+ }
+ Assert.AreEqual(expected.ToString(), connector.MAIN.InheritanceRw.level_0.STRING_val.Cyclic);
+ }
+ }
+
+ [Test()]
+ [Order(30000)]
+ public void PreventWriteTest()
+ {
+ var recorder = new Recorder(connector.MAIN.InheritanceRw.level_0, RecorderModeEnum.Graver).Actor;
+
+ recorder.Begin(SquashTestFile);
+
+
+ for (int i = 0; i < 254; i++)
+ {
+ if (i % 100 == 0)
+ {
+ connector.MAIN.InheritanceRw.level_0.STRING_val.Cyclic = i.ToString();
+ connector.MAIN.InheritanceRw.level_0.Write();
+ }
+
+ recorder.Act();
+ }
+
+ Assert.Throws(() => recorder.End(SquashTestFile));
+ }
+
+ [Test()]
+ [Order(30000)]
+ public void PreventWriteTestMore()
+ {
+ var recorder = new Recorder(connector.MAIN.InheritanceRw.level_0, RecorderModeEnum.Graver, 100).Actor;
+
+ recorder.Begin(SquashTestFile);
+
+
+ for (int i = 0; i < 254; i++)
+ {
+ if (i % 10 == 0)
+ {
+ connector.MAIN.InheritanceRw.level_0.STRING_val.Cyclic = i.ToString();
+ connector.MAIN.InheritanceRw.level_0.Write();
+ }
+
+ recorder.Act();
+ }
+
+ Assert.Throws(() => recorder.End(SquashTestFile));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/Tc.ProberTest/Runners/RunnerTests.cs b/src/Tc.Prober/tests/Tc.ProberTest/Runners/RunnerTests.cs
new file mode 100644
index 000000000..106aae3bd
--- /dev/null
+++ b/src/Tc.Prober/tests/Tc.ProberTest/Runners/RunnerTests.cs
@@ -0,0 +1,181 @@
+namespace Tc.Prober.RecorderTests
+{
+ using NUnit.Framework;
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Text;
+ using System.Threading.Tasks;
+ using PlcTcProberTests;
+ using System.IO;
+ using Vortex.Connector;
+ using System.Reflection;
+ using Tc.Prober.Recorder;
+ using Vortex.Adapters.Connector.Tc3.Adapter;
+
+ [TestFixture()]
+ public class RunnerTests
+ {
+ private PlcTcProberTestsTwinController connector = null;
+ private string _runner_recording_file;
+ private string _runner_with_test_method_file;
+
+ [OneTimeSetUp]
+ public void OneTimeSetUp()
+ {
+ Runner.RecordingsShell = Path.GetFullPath(Path.Combine(new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName, @"..\..\..\output\shell\"));
+ connector = new PlcTcProberTestsTwinController(Tc3ConnectorAdapter.Create(null, 851, false));
+ connector.Connector.BuildAndStart().ReadWriteCycleDelay = 10;
+ }
+
+ [Test()]
+ public void RunTest()
+ {
+ //-- Act
+ int iterationCount = 0;
+ int openCalsCount = 0;
+ int closeCallCount = 0;
+ connector.MAIN.Run(() => true,
+ () => { iterationCount++; return iterationCount >= 10; },
+ () => openCalsCount++,
+ () => closeCallCount++);
+
+ //-- Assert
+ Assert.AreEqual(10, iterationCount);
+ Assert.AreEqual(9, openCalsCount);
+ Assert.AreEqual(9, closeCallCount);
+
+ }
+
+ [Test()]
+ [Order(100)]
+ public void RunWithRecordingTest()
+ {
+
+ //-- Act
+ int iterationCount = 0;
+ int openCalsCount = 0;
+ int closeCallCount = 0;
+ connector.MAIN.Run(() => true,
+ () => { iterationCount++; return iterationCount >= 10; },
+ () => openCalsCount++,
+ () => closeCallCount++,
+ new Recorder(connector.MAIN.InheritanceRw, RecorderModeEnum.Graver, 0).Actor,
+ Recorder.Runner.GetRecordingFilePathWithMethodName(2));
+
+ //-- Assert
+ Assert.AreEqual(10, iterationCount);
+ Assert.AreEqual(9, openCalsCount);
+ Assert.AreEqual(9, closeCallCount);
+
+ }
+
+
+ [Test()]
+ [Order(200)]
+ public void RecordTestStructureTest()
+ {
+ var sut = connector.Tests._recorderRunnerTests;
+ // Recorder in 'recording' mode == RecorderModeEnum.Graver
+ var recorder = new Recorder.Recorder(sut._recorder, RecorderModeEnum.Graver);
+ sut._recorder.counter.Synchron = 0;
+
+ var count = 0;
+
+ sut.Run(() => sut.RunWithRecorder(), // Actual testing method.
+ () =>
+ {
+ Assert.AreEqual(count++, sut._recorder.counter.Synchron);
+ sut._recorder.counter.Synchron++; // this line changes the state of plc variable for simulation
+ return sut._recorder.counter.Synchron > 100;
+ },
+ null,
+ null,
+ recorder.Actor,
+ Path.Combine(Runner.RecordingsShell, Runner.GetRecordingFilePathWithMethodName())
+ );
+
+ }
+
+ [Test()]
+ [Order(300)]
+ public void PlayTestStructureTest()
+ {
+ var sut = connector.Tests._recorderRunnerTests;
+ var recorder = new Recorder.Recorder(sut._recorder, RecorderModeEnum.Player);
+ sut._recorder.counter.Synchron = 0;
+
+ var count = 0;
+
+ sut.Run(() => sut.RunWithRecorder(),
+ () =>
+ {
+ Assert.AreEqual(count++, sut._recorder.counter.Synchron);
+ // sut._recorder.counter.Synchron++;
+ return sut._recorder.counter.Synchron > 100;
+ },
+ null,
+ null,
+ recorder.Actor,
+ Path.Combine(Runner.RecordingsShell, $"{nameof(RecordTestStructureTest)}.json")
+ );
+ }
+
+ [Test()]
+ [Order(200)]
+ public void RecordAndReplayTest()
+ {
+ var sut = connector.Tests._recorderRunnerTests;
+ IRecorder actor;
+
+ // We run with recording
+
+ //-- Arrange
+ sut._recorder.counter.Synchron = 0;
+ var count = 0;
+
+ // Actor is recorder-graver
+ actor = new Recorder.Recorder(sut._recorder, RecorderModeEnum.Graver).Actor;
+
+ sut.Run(() => sut.RunWithRecorder(), // Actual testing method.
+ () =>
+ {
+ Assert.AreEqual(count++, sut._recorder.counter.Synchron);
+ sut._recorder.counter.Synchron++; // this line changes the state of plc variable for simulation
+ return sut._recorder.counter.Synchron > 100;
+ },
+ null,
+ null,
+ actor,
+ Path.Combine(Runner.RecordingsShell, $"{nameof(RecordAndReplayTest)}.json")
+ );
+
+
+
+
+ // We run the same code with re-play.
+
+ // Actor is player
+ actor = new Recorder.Recorder(sut._recorder, RecorderModeEnum.Player).Actor;
+
+ //-- Arrange
+ sut._recorder.counter.Synchron = 0;
+ count = 0;
+
+
+ sut.Run(() => sut.RunWithRecorder(), // Actual testing method.
+ () =>
+ {
+ Assert.AreEqual(count++, sut._recorder.counter.Synchron);
+ // sut._recorder.counter.Synchron++; // this line changes the state of plc variable for simulation commented out in replay.
+ return sut._recorder.counter.Synchron > 100;
+ },
+ null,
+ null,
+ actor,
+ Path.Combine(Runner.RecordingsShell, $"{nameof(RecordAndReplayTest)}.json")
+ );
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/Tc.ProberTest/Runners/TaskRunnersTests.cs b/src/Tc.Prober/tests/Tc.ProberTest/Runners/TaskRunnersTests.cs
new file mode 100644
index 000000000..6ef7873de
--- /dev/null
+++ b/src/Tc.Prober/tests/Tc.ProberTest/Runners/TaskRunnersTests.cs
@@ -0,0 +1,75 @@
+using NUnit.Framework;
+using PlcTcProberTestsConnector;
+using Tc.Prober.Runners;
+using Vortex.Connector;
+
+namespace Tc.Prober.RunnersTests
+{
+ public class TaskRunnersTests
+ {
+ const int __max_average_cycle_time = 10;
+
+ [OneTimeSetUp]
+ public void Setup()
+ {
+ Entry.Plc.Connector.BuildAndStart().ReadWriteCycleDelay = 1000;
+ Entry.Plc.Tests.Read();
+ }
+
+ [Test]
+ [Order(100)]
+ [TestCase((ushort)10)]
+ [TestCase((ushort)11)]
+ public void basic_runner_tests_run_count(ushort counts)
+ {
+
+ //-- Arrange
+ var sw = new System.Diagnostics.Stopwatch();
+ var sut = Entry.Plc.Tests._basicRunnerTests;
+ sut.ResetCounter();
+
+ //-- Act
+ sw.Start();
+ var actual = sut.Run((p) => p.RunCount(), counts);
+ sw.Stop();
+
+ var actualACT = sw.ElapsedMilliseconds / counts;
+
+ //-- Assert
+ Assert.AreEqual(counts, actual);
+ Assert.IsTrue(actualACT < __max_average_cycle_time, $"ACT exceeds expected: {actualACT} > {__max_average_cycle_time}");
+ }
+
+ [Test]
+ [Order(200)]
+ [TestCase((ushort)10)]
+ [TestCase((ushort)11)]
+ [Timeout(100)]
+ public void basic_runner_tests_run_unit_returns_true(ushort counts)
+ {
+
+ //-- Arrange
+ var sut = Entry.Plc.Tests._basicRunnerTests;
+ var sw = new System.Diagnostics.Stopwatch();
+
+
+ //-- Act
+
+ sut.ResetCounter();
+ var actual = 0;
+ sw.Start();
+ sut.Run((p) =>
+ {
+ actual++;
+ return p.RunUntilReturnsTrue(actual >= counts);
+ });
+ sw.Stop();
+
+
+ //-- Assert
+ var actualACT = sw.ElapsedMilliseconds / counts;
+ Assert.AreEqual(counts, actual);
+ Assert.IsTrue(actualACT < __max_average_cycle_time, $"ACT exceeds expected: {actualACT} > {__max_average_cycle_time}");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/Tc.ProberTest/Tc.ProberTest.csproj b/src/Tc.Prober/tests/Tc.ProberTest/Tc.ProberTest.csproj
new file mode 100644
index 000000000..4807556b5
--- /dev/null
+++ b/src/Tc.Prober/tests/Tc.ProberTest/Tc.ProberTest.csproj
@@ -0,0 +1,20 @@
+
+
+ net48
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RecordAndReplayTest.json b/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RecordAndReplayTest.json
new file mode 100644
index 000000000..e89600140
--- /dev/null
+++ b/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RecordAndReplayTest.json
@@ -0,0 +1 @@
+{"CurrentFramePosition":0,"Frames":[{"Stamp":1,"Object":{"counter":1}},{"Stamp":3,"Object":{"counter":2}},{"Stamp":5,"Object":{"counter":3}},{"Stamp":7,"Object":{"counter":4}},{"Stamp":9,"Object":{"counter":5}},{"Stamp":11,"Object":{"counter":6}},{"Stamp":13,"Object":{"counter":7}},{"Stamp":15,"Object":{"counter":8}},{"Stamp":17,"Object":{"counter":9}},{"Stamp":19,"Object":{"counter":10}},{"Stamp":21,"Object":{"counter":11}},{"Stamp":23,"Object":{"counter":12}},{"Stamp":25,"Object":{"counter":13}},{"Stamp":27,"Object":{"counter":14}},{"Stamp":29,"Object":{"counter":15}},{"Stamp":31,"Object":{"counter":16}},{"Stamp":33,"Object":{"counter":17}},{"Stamp":35,"Object":{"counter":18}},{"Stamp":37,"Object":{"counter":19}},{"Stamp":39,"Object":{"counter":20}},{"Stamp":41,"Object":{"counter":21}},{"Stamp":43,"Object":{"counter":22}},{"Stamp":45,"Object":{"counter":23}},{"Stamp":47,"Object":{"counter":24}},{"Stamp":49,"Object":{"counter":25}},{"Stamp":51,"Object":{"counter":26}},{"Stamp":53,"Object":{"counter":27}},{"Stamp":55,"Object":{"counter":28}},{"Stamp":57,"Object":{"counter":29}},{"Stamp":59,"Object":{"counter":30}},{"Stamp":61,"Object":{"counter":31}},{"Stamp":63,"Object":{"counter":32}},{"Stamp":65,"Object":{"counter":33}},{"Stamp":67,"Object":{"counter":34}},{"Stamp":69,"Object":{"counter":35}},{"Stamp":71,"Object":{"counter":36}},{"Stamp":73,"Object":{"counter":37}},{"Stamp":75,"Object":{"counter":38}},{"Stamp":77,"Object":{"counter":39}},{"Stamp":79,"Object":{"counter":40}},{"Stamp":81,"Object":{"counter":41}},{"Stamp":83,"Object":{"counter":42}},{"Stamp":85,"Object":{"counter":43}},{"Stamp":87,"Object":{"counter":44}},{"Stamp":89,"Object":{"counter":45}},{"Stamp":91,"Object":{"counter":46}},{"Stamp":93,"Object":{"counter":47}},{"Stamp":95,"Object":{"counter":48}},{"Stamp":97,"Object":{"counter":49}},{"Stamp":99,"Object":{"counter":50}},{"Stamp":101,"Object":{"counter":51}},{"Stamp":103,"Object":{"counter":52}},{"Stamp":105,"Object":{"counter":53}},{"Stamp":107,"Object":{"counter":54}},{"Stamp":109,"Object":{"counter":55}},{"Stamp":111,"Object":{"counter":56}},{"Stamp":113,"Object":{"counter":57}},{"Stamp":115,"Object":{"counter":58}},{"Stamp":117,"Object":{"counter":59}},{"Stamp":119,"Object":{"counter":60}},{"Stamp":121,"Object":{"counter":61}},{"Stamp":123,"Object":{"counter":62}},{"Stamp":125,"Object":{"counter":63}},{"Stamp":127,"Object":{"counter":64}},{"Stamp":129,"Object":{"counter":65}},{"Stamp":131,"Object":{"counter":66}},{"Stamp":133,"Object":{"counter":67}},{"Stamp":135,"Object":{"counter":68}},{"Stamp":137,"Object":{"counter":69}},{"Stamp":139,"Object":{"counter":70}},{"Stamp":141,"Object":{"counter":71}},{"Stamp":143,"Object":{"counter":72}},{"Stamp":145,"Object":{"counter":73}},{"Stamp":147,"Object":{"counter":74}},{"Stamp":149,"Object":{"counter":75}},{"Stamp":151,"Object":{"counter":76}},{"Stamp":153,"Object":{"counter":77}},{"Stamp":155,"Object":{"counter":78}},{"Stamp":157,"Object":{"counter":79}},{"Stamp":159,"Object":{"counter":80}},{"Stamp":161,"Object":{"counter":81}},{"Stamp":163,"Object":{"counter":82}},{"Stamp":165,"Object":{"counter":83}},{"Stamp":167,"Object":{"counter":84}},{"Stamp":169,"Object":{"counter":85}},{"Stamp":171,"Object":{"counter":86}},{"Stamp":173,"Object":{"counter":87}},{"Stamp":175,"Object":{"counter":88}},{"Stamp":177,"Object":{"counter":89}},{"Stamp":179,"Object":{"counter":90}},{"Stamp":181,"Object":{"counter":91}},{"Stamp":183,"Object":{"counter":92}},{"Stamp":185,"Object":{"counter":93}},{"Stamp":187,"Object":{"counter":94}},{"Stamp":189,"Object":{"counter":95}},{"Stamp":191,"Object":{"counter":96}},{"Stamp":193,"Object":{"counter":97}},{"Stamp":195,"Object":{"counter":98}},{"Stamp":197,"Object":{"counter":99}},{"Stamp":199,"Object":{"counter":100}},{"Stamp":200,"Object":{"counter":101}}]}
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RecordTestStructureTest.json b/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RecordTestStructureTest.json
new file mode 100644
index 000000000..e89600140
--- /dev/null
+++ b/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RecordTestStructureTest.json
@@ -0,0 +1 @@
+{"CurrentFramePosition":0,"Frames":[{"Stamp":1,"Object":{"counter":1}},{"Stamp":3,"Object":{"counter":2}},{"Stamp":5,"Object":{"counter":3}},{"Stamp":7,"Object":{"counter":4}},{"Stamp":9,"Object":{"counter":5}},{"Stamp":11,"Object":{"counter":6}},{"Stamp":13,"Object":{"counter":7}},{"Stamp":15,"Object":{"counter":8}},{"Stamp":17,"Object":{"counter":9}},{"Stamp":19,"Object":{"counter":10}},{"Stamp":21,"Object":{"counter":11}},{"Stamp":23,"Object":{"counter":12}},{"Stamp":25,"Object":{"counter":13}},{"Stamp":27,"Object":{"counter":14}},{"Stamp":29,"Object":{"counter":15}},{"Stamp":31,"Object":{"counter":16}},{"Stamp":33,"Object":{"counter":17}},{"Stamp":35,"Object":{"counter":18}},{"Stamp":37,"Object":{"counter":19}},{"Stamp":39,"Object":{"counter":20}},{"Stamp":41,"Object":{"counter":21}},{"Stamp":43,"Object":{"counter":22}},{"Stamp":45,"Object":{"counter":23}},{"Stamp":47,"Object":{"counter":24}},{"Stamp":49,"Object":{"counter":25}},{"Stamp":51,"Object":{"counter":26}},{"Stamp":53,"Object":{"counter":27}},{"Stamp":55,"Object":{"counter":28}},{"Stamp":57,"Object":{"counter":29}},{"Stamp":59,"Object":{"counter":30}},{"Stamp":61,"Object":{"counter":31}},{"Stamp":63,"Object":{"counter":32}},{"Stamp":65,"Object":{"counter":33}},{"Stamp":67,"Object":{"counter":34}},{"Stamp":69,"Object":{"counter":35}},{"Stamp":71,"Object":{"counter":36}},{"Stamp":73,"Object":{"counter":37}},{"Stamp":75,"Object":{"counter":38}},{"Stamp":77,"Object":{"counter":39}},{"Stamp":79,"Object":{"counter":40}},{"Stamp":81,"Object":{"counter":41}},{"Stamp":83,"Object":{"counter":42}},{"Stamp":85,"Object":{"counter":43}},{"Stamp":87,"Object":{"counter":44}},{"Stamp":89,"Object":{"counter":45}},{"Stamp":91,"Object":{"counter":46}},{"Stamp":93,"Object":{"counter":47}},{"Stamp":95,"Object":{"counter":48}},{"Stamp":97,"Object":{"counter":49}},{"Stamp":99,"Object":{"counter":50}},{"Stamp":101,"Object":{"counter":51}},{"Stamp":103,"Object":{"counter":52}},{"Stamp":105,"Object":{"counter":53}},{"Stamp":107,"Object":{"counter":54}},{"Stamp":109,"Object":{"counter":55}},{"Stamp":111,"Object":{"counter":56}},{"Stamp":113,"Object":{"counter":57}},{"Stamp":115,"Object":{"counter":58}},{"Stamp":117,"Object":{"counter":59}},{"Stamp":119,"Object":{"counter":60}},{"Stamp":121,"Object":{"counter":61}},{"Stamp":123,"Object":{"counter":62}},{"Stamp":125,"Object":{"counter":63}},{"Stamp":127,"Object":{"counter":64}},{"Stamp":129,"Object":{"counter":65}},{"Stamp":131,"Object":{"counter":66}},{"Stamp":133,"Object":{"counter":67}},{"Stamp":135,"Object":{"counter":68}},{"Stamp":137,"Object":{"counter":69}},{"Stamp":139,"Object":{"counter":70}},{"Stamp":141,"Object":{"counter":71}},{"Stamp":143,"Object":{"counter":72}},{"Stamp":145,"Object":{"counter":73}},{"Stamp":147,"Object":{"counter":74}},{"Stamp":149,"Object":{"counter":75}},{"Stamp":151,"Object":{"counter":76}},{"Stamp":153,"Object":{"counter":77}},{"Stamp":155,"Object":{"counter":78}},{"Stamp":157,"Object":{"counter":79}},{"Stamp":159,"Object":{"counter":80}},{"Stamp":161,"Object":{"counter":81}},{"Stamp":163,"Object":{"counter":82}},{"Stamp":165,"Object":{"counter":83}},{"Stamp":167,"Object":{"counter":84}},{"Stamp":169,"Object":{"counter":85}},{"Stamp":171,"Object":{"counter":86}},{"Stamp":173,"Object":{"counter":87}},{"Stamp":175,"Object":{"counter":88}},{"Stamp":177,"Object":{"counter":89}},{"Stamp":179,"Object":{"counter":90}},{"Stamp":181,"Object":{"counter":91}},{"Stamp":183,"Object":{"counter":92}},{"Stamp":185,"Object":{"counter":93}},{"Stamp":187,"Object":{"counter":94}},{"Stamp":189,"Object":{"counter":95}},{"Stamp":191,"Object":{"counter":96}},{"Stamp":193,"Object":{"counter":97}},{"Stamp":195,"Object":{"counter":98}},{"Stamp":197,"Object":{"counter":99}},{"Stamp":199,"Object":{"counter":100}},{"Stamp":200,"Object":{"counter":101}}]}
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RunWithRecordingTest.json b/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RunWithRecordingTest.json
new file mode 100644
index 000000000..f3bb62777
--- /dev/null
+++ b/src/Tc.Prober/tests/Tc.ProberTest/output/shell/RunWithRecordingTest.json
@@ -0,0 +1 @@
+{"CurrentFramePosition":0,"Frames":[{"Stamp":18,"Object":{"level_5":{"BOOL_val":false,"BYTE_val":0,"WORD_val":0,"DWORD_val":0,"LWORD_val":0,"SINT_val":0,"USINT_val":0,"INT_val":0,"UINT_val":0,"DINT_val":0,"UDINT_val":0,"LINT_val":0,"ULINT_val":0,"REAL_val":0.0,"LREAL_val":0.0,"STRING_val":"","WSTRING_val":"","TIME_val":"00:00:00","TIME_OF_DAY_val":"00:00:00","DATE_val":"1970-01-01T00:00:00","DATE_AND_TIME_val":"1970-01-01T00:00:00","TOD_val":"00:00:00","DT_val":"1970-01-01T00:00:00","LTIME_val":"00:00:00","ValueTypeArray":[[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]]},"level_4":{"BOOL_val":false,"BYTE_val":0,"WORD_val":0,"DWORD_val":0,"LWORD_val":0,"SINT_val":0,"USINT_val":0,"INT_val":0,"UINT_val":0,"DINT_val":0,"UDINT_val":0,"LINT_val":0,"ULINT_val":0,"REAL_val":0.0,"LREAL_val":0.0,"STRING_val":"","WSTRING_val":"","TIME_val":"00:00:00","TIME_OF_DAY_val":"00:00:00","DATE_val":"1970-01-01T00:00:00","DATE_AND_TIME_val":"1970-01-01T00:00:00","TOD_val":"00:00:00","DT_val":"1970-01-01T00:00:00","LTIME_val":"00:00:00","ValueTypeArray":[[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]]},"level_3":{"BOOL_val":false,"BYTE_val":0,"WORD_val":0,"DWORD_val":0,"LWORD_val":0,"SINT_val":0,"USINT_val":0,"INT_val":0,"UINT_val":0,"DINT_val":0,"UDINT_val":0,"LINT_val":0,"ULINT_val":0,"REAL_val":0.0,"LREAL_val":0.0,"STRING_val":"","WSTRING_val":"65274","TIME_val":"00:00:00","TIME_OF_DAY_val":"00:00:00","DATE_val":"1970-01-01T00:00:00","DATE_AND_TIME_val":"1970-01-01T00:00:00","TOD_val":"00:00:00","DT_val":"1970-01-01T00:00:00","LTIME_val":"00:00:00","ValueTypeArray":[[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]]},"level_2":{"BOOL_val":false,"BYTE_val":0,"WORD_val":506,"DWORD_val":0,"LWORD_val":0,"SINT_val":0,"USINT_val":0,"INT_val":0,"UINT_val":0,"DINT_val":0,"UDINT_val":0,"LINT_val":0,"ULINT_val":0,"REAL_val":0.0,"LREAL_val":0.0,"STRING_val":"45540","WSTRING_val":"","TIME_val":"00:00:00","TIME_OF_DAY_val":"00:00:00","DATE_val":"1970-01-01T00:00:00","DATE_AND_TIME_val":"1970-01-01T00:00:00","TOD_val":"00:00:00","DT_val":"1970-01-01T00:00:00","LTIME_val":"00:00:00","ValueTypeArray":[[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]]},"level_1":{"BOOL_val":false,"BYTE_val":253,"WORD_val":0,"DWORD_val":0,"LWORD_val":0,"SINT_val":0,"USINT_val":0,"INT_val":0,"UINT_val":0,"DINT_val":0,"UDINT_val":0,"LINT_val":0,"ULINT_val":0,"REAL_val":0.0,"LREAL_val":0.0,"STRING_val":"","WSTRING_val":"","TIME_val":"00:00:00","TIME_OF_DAY_val":"00:00:00","DATE_val":"1970-01-01T00:00:00","DATE_AND_TIME_val":"1970-01-01T00:00:00","TOD_val":"00:00:00","DT_val":"1970-01-01T00:00:00","LTIME_val":"00:00:00","ValueTypeArray":[[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]]},"level_0":{"BOOL_val":false,"BYTE_val":253,"WORD_val":0,"DWORD_val":0,"LWORD_val":0,"SINT_val":0,"USINT_val":0,"INT_val":0,"UINT_val":0,"DINT_val":0,"UDINT_val":0,"LINT_val":0,"ULINT_val":0,"REAL_val":0.0,"LREAL_val":0.0,"STRING_val":"200","WSTRING_val":"","TIME_val":"00:00:00","TIME_OF_DAY_val":"00:00:00","DATE_val":"1970-01-01T00:00:00","DATE_AND_TIME_val":"1970-01-01T00:00:00","TOD_val":"00:00:00","DT_val":"1970-01-01T00:00:00","LTIME_val":"00:00:00","ValueTypeArray":[[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]]},"level":5}}]}
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/GVLs/Tests.TcGVL b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/GVLs/Tests.TcGVL
new file mode 100644
index 000000000..d31277e1b
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/GVLs/Tests.TcGVL
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/POUs/MAIN.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/POUs/MAIN.TcPOU
new file mode 100644
index 000000000..a277ea23a
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/POUs/MAIN.TcPOU
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/PlcTask.TcTTO b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/PlcTask.TcTTO
new file mode 100644
index 000000000..93de566f0
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/PlcTask.TcTTO
@@ -0,0 +1,17 @@
+
+
+
+
+ 10000
+ 20
+
+ MAIN
+
+ {027464a4-75b6-4570-a962-6c351f90d94b}
+ {e55802ca-68e5-4149-ab0e-4b09d83ae5da}
+ {2b871b9b-720b-4c3d-9aae-55af334e2e6b}
+ {c07bc32e-bbac-490d-bf94-752aaf02853c}
+ {172a0dfc-480d-482b-adda-6da7cbc5fae7}
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/PlcTcProberTests.plcproj b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/PlcTcProberTests.plcproj
new file mode 100644
index 000000000..a1bd5baba
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/PlcTcProberTests.plcproj
@@ -0,0 +1,2414 @@
+
+
+
+ 1.0.0.0
+ 2.0
+ {69fd542b-8d82-415f-9189-1193d0b5f069}
+ True
+ true
+ true
+ false
+ PlcTcProberTests
+ 3.1.4023.0
+ {426bad30-cf35-4497-b87a-d5d9f4190a23}
+ {0b8350bc-8dee-42c3-b99b-b07c9a298389}
+ {2b222112-0555-4b00-8865-918002a29dcf}
+ {4b4057d0-91d4-40fc-8eef-953e1d6ab390}
+ {ac371999-d878-43b2-a046-38eeb6066451}
+ {9adb02a9-5d38-42bb-9fa5-4f842151f0f5}
+ Vortex.Library
+ false
+ PlcTcProberTests
+ 0.4.1.375
+ PlcTcProberTests
+ PlcTcProberTests
+
+
+
+ Code
+ true
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tc2_Standard, * (Beckhoff Automation GmbH)
+ Tc2_Standard
+
+
+ Tc2_System, * (Beckhoff Automation GmbH)
+ Tc2_System
+
+
+ Tc3_Module, * (Beckhoff Automation GmbH)
+ Tc3_Module
+
+
+
+
+ Content
+
+
+
+
+
+
+
+ "<ProjectRoot>"
+
+ {8F99A816-E488-41E4-9FA3-846536012284}
+
+ "{8F99A816-E488-41E4-9FA3-846536012284}"
+
+
+
+ {29BD8D0C-3586-4548-BB48-497B9A01693F}
+
+ "{29BD8D0C-3586-4548-BB48-497B9A01693F}"
+
+ NamingConventions
+
+ "NamingConventions"
+
+ 105
+
+ "105"
+
+
+ stPrefix
+
+
+
+ 8
+
+ "8"
+
+
+ stPrefix
+
+
+
+ 9
+
+ "9"
+
+
+ stPrefix
+
+
+
+ 3
+
+ "3"
+
+
+ stPrefix
+
+
+
+ 4
+
+ "4"
+
+
+ stPrefix
+
+
+
+ 5
+
+ "5"
+
+
+ stPrefix
+
+
+
+ 6
+
+ "6"
+
+
+ stPrefix
+
+
+
+ 7
+
+ "7"
+
+
+ stPrefix
+
+
+
+ 29
+
+ "29"
+
+
+ stPrefix
+
+
+
+ 59
+
+ "59"
+
+
+ stPrefix
+
+
+
+ 107
+
+ "107"
+
+
+ stPrefix
+
+
+
+ 22
+
+ "22"
+
+
+ stPrefix
+
+
+
+ 30
+
+ "30"
+
+
+ stPrefix
+
+
+
+ 25
+
+ "25"
+
+
+ stPrefix
+
+
+
+ 35
+
+ "35"
+
+
+ stPrefix
+
+
+
+ 62
+
+ "62"
+
+
+ stPrefix
+
+
+
+ 55
+
+ "55"
+
+
+ stPrefix
+ _
+
+
+ 65
+
+ "65"
+
+
+ stPrefix
+
+
+
+ 108
+
+ "108"
+
+
+ stPrefix
+ I
+
+
+ 70
+
+ "70"
+
+
+ stPrefix
+
+
+
+ 34
+
+ "34"
+
+
+ stPrefix
+
+
+
+ 54
+
+ "54"
+
+
+ stPrefix
+ _
+
+
+ 121
+
+ "121"
+
+
+ stPrefix
+
+
+
+ 151
+
+ "151"
+
+
+ stPrefix
+ st
+
+
+ 10
+
+ "10"
+
+
+ stPrefix
+
+
+
+ 102
+
+ "102"
+
+
+ stPrefix
+ prg
+
+
+ 18
+
+ "18"
+
+
+ stPrefix
+
+
+
+ 28
+
+ "28"
+
+
+ stPrefix
+
+
+
+ 123
+
+ "123"
+
+
+ stPrefix
+
+
+
+ 58
+
+ "58"
+
+
+ stPrefix
+
+
+
+ 61
+
+ "61"
+
+
+ stPrefix
+
+
+
+ 11
+
+ "11"
+
+
+ stPrefix
+
+
+
+ 21
+
+ "21"
+
+
+ stPrefix
+
+
+
+ 14
+
+ "14"
+
+
+ stPrefix
+
+
+
+ 24
+
+ "24"
+
+
+ stPrefix
+
+
+
+ 17
+
+ "17"
+
+
+ stPrefix
+
+
+
+ 27
+
+ "27"
+
+
+ stPrefix
+
+
+
+ 37
+
+ "37"
+
+
+ stPrefix
+
+
+
+ 53
+
+ "53"
+
+
+ stPrefix
+
+
+
+ 57
+
+ "57"
+
+
+ stPrefix
+
+
+
+ 73
+
+ "73"
+
+
+ stPrefix
+
+
+
+ 122
+
+ "122"
+
+
+ stPrefix
+
+
+
+ 104
+
+ "104"
+
+
+ stPrefix
+ fc
+
+
+ 153
+
+ "153"
+
+
+ stPrefix
+ union
+
+
+ 12
+
+ "12"
+
+
+ stPrefix
+
+
+
+ 106
+
+ "106"
+
+
+ stPrefix
+
+
+
+ 32
+
+ "32"
+
+
+ stPrefix
+
+
+
+ 19
+
+ "19"
+
+
+ stPrefix
+
+
+
+ 103
+
+ "103"
+
+
+ stPrefix
+ fb
+
+
+ 33
+
+ "33"
+
+
+ stPrefix
+
+
+
+ 72
+
+ "72"
+
+
+ stPrefix
+
+
+
+ 152
+
+ "152"
+
+
+ stPrefix
+ enum
+
+
+ 64
+
+ "64"
+
+
+ stPrefix
+
+
+
+ 20
+
+ "20"
+
+
+ stPrefix
+
+
+
+ 13
+
+ "13"
+
+
+ stPrefix
+
+
+
+ 23
+
+ "23"
+
+
+ stPrefix
+
+
+
+ 16
+
+ "16"
+
+
+ stPrefix
+
+
+
+ 26
+
+ "26"
+
+
+ stPrefix
+
+
+
+ 36
+
+ "36"
+
+
+ stPrefix
+
+
+
+ 63
+
+ "63"
+
+
+ stPrefix
+
+
+
+ 56
+
+ "56"
+
+
+ stPrefix
+
+
+
+ 124
+
+ "124"
+
+
+ stPrefix
+
+
+
+ 154
+
+ "154"
+
+
+ stPrefix
+ alias
+
+
+ 31
+
+ "31"
+
+
+ stPrefix
+
+
+
+ 51
+
+ "51"
+
+
+ stPrefix
+
+
+
+ 15
+
+ "15"
+
+
+ stPrefix
+
+
+
+ 38
+
+ "38"
+
+
+ stPrefix
+
+
+
+ 71
+
+ "71"
+
+
+ stPrefix
+
+
+
+
+
+
+ Metrics
+
+ "Metrics"
+
+ 9b526466-3bbe-40a9-b5a5-1cfadd791459
+
+ "9b526466-3bbe-40a9-b5a5-1cfadd791459"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ e58378e8-a2fb-4a33-8013-8a91270388d0
+
+ "e58378e8-a2fb-4a33-8013-8a91270388d0"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 2ee16325-7a34-4109-82cd-e99144bdbf43
+
+ "2ee16325-7a34-4109-82cd-e99144bdbf43"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 2a5d0bd7-5767-43e1-92ab-90d924ade69e
+
+ "2a5d0bd7-5767-43e1-92ab-90d924ade69e"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ ca51b834-cb16-4517-8b02-4807ce263107
+
+ "ca51b834-cb16-4517-8b02-4807ce263107"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ aebdfc4d-fc4f-4fac-bf2e-22b603bc1880
+
+ "aebdfc4d-fc4f-4fac-bf2e-22b603bc1880"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ bb1ff1d3-b0bc-4909-9034-11d7c6edb61f
+
+ "bb1ff1d3-b0bc-4909-9034-11d7c6edb61f"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 3fb5ac29-8ac7-4ca4-863e-49c3c89643b9
+
+ "3fb5ac29-8ac7-4ca4-863e-49c3c89643b9"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ c4137578-73e0-4a9c-ad9c-7773a1cff401
+
+ "c4137578-73e0-4a9c-ad9c-7773a1cff401"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ daa3e89b-a727-4bc9-bd38-29afc6024f90
+
+ "daa3e89b-a727-4bc9-bd38-29afc6024f90"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ b42720b9-b152-4b52-ad89-630e0f5acab1
+
+ "b42720b9-b152-4b52-ad89-630e0f5acab1"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 0ade9a3b-311c-4293-bc26-bcf994cdbbdc
+
+ "0ade9a3b-311c-4293-bc26-bcf994cdbbdc"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 15c07c54-9586-460c-802f-b3b4a408e3c7
+
+ "15c07c54-9586-460c-802f-b3b4a408e3c7"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 19fab17a-876c-4a8d-9d74-3e5d92b63dc8
+
+ "19fab17a-876c-4a8d-9d74-3e5d92b63dc8"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 87b20586-90da-40d8-82ce-62a7dd0ba8af
+
+ "87b20586-90da-40d8-82ce-62a7dd0ba8af"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ c20d083b-41ea-4867-b762-015491579932
+
+ "c20d083b-41ea-4867-b762-015491579932"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 827ae15d-4cb9-4177-b870-6bea1db8ee44
+
+ "827ae15d-4cb9-4177-b870-6bea1db8ee44"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 1a004255-b771-48b6-aa33-ea35ce4d37ea
+
+ "1a004255-b771-48b6-aa33-ea35ce4d37ea"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 8360c2b5-e762-4cc0-935b-fb129cda1b4a
+
+ "8360c2b5-e762-4cc0-935b-fb129cda1b4a"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 40f104a2-99f0-486d-9c44-47e8c759ca07
+
+ "40f104a2-99f0-486d-9c44-47e8c759ca07"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 62b98ef9-b4c6-4777-bc0a-29245bb8b9f3
+
+ "62b98ef9-b4c6-4777-bc0a-29245bb8b9f3"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 6c74d656-f35f-41b9-b449-eae882ed12fe
+
+ "6c74d656-f35f-41b9-b449-eae882ed12fe"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 0ba696f2-ce22-4330-931f-4ddd5c597896
+
+ "0ba696f2-ce22-4330-931f-4ddd5c597896"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 6549803a-9e82-4b28-aff1-2425cbec813b
+
+ "6549803a-9e82-4b28-aff1-2425cbec813b"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 6cb1bfb1-4d4a-43ed-96f4-cd0254fc33b5
+
+ "6cb1bfb1-4d4a-43ed-96f4-cd0254fc33b5"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ f6dd9a78-1e71-4d9c-9e61-394eb38f3809
+
+ "f6dd9a78-1e71-4d9c-9e61-394eb38f3809"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 571980c1-792d-4355-a9cb-4c3a8f254ab0
+
+ "571980c1-792d-4355-a9cb-4c3a8f254ab0"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ eb349b41-54d8-47ed-ab7d-b5dbbc17709f
+
+ "eb349b41-54d8-47ed-ab7d-b5dbbc17709f"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 209f2982-bd60-4988-9cf9-9ff21cbf643f
+
+ "209f2982-bd60-4988-9cf9-9ff21cbf643f"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+
+
+
+ NamingConventionsSettings
+
+ "NamingConventionsSettings"
+
+
+ FirstCharUpperCase
+ False
+ CombineScopeWithDatatypePrefix
+ True
+ CombinedDataTypesRecursive
+ True
+
+
+ Rules
+
+ "Rules"
+
+ 35
+
+ "35"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 105
+
+ "105"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 63
+
+ "63"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 8
+
+ "8"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 9
+
+ "9"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 47
+
+ "47"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 1
+
+ "1"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 2
+
+ "2"
+
+
+ bWarning
+ True
+ bActive
+ True
+
+
+ 3
+
+ "3"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 4
+
+ "4"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 5
+
+ "5"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 6
+
+ "6"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 7
+
+ "7"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 29
+
+ "29"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 133
+
+ "133"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 163
+
+ "163"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 90
+
+ "90"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 118
+
+ "118"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 22
+
+ "22"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 148
+
+ "148"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 42
+
+ "42"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 167
+
+ "167"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 62
+
+ "62"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 55
+
+ "55"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 65
+
+ "65"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 75
+
+ "75"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 14
+
+ "14"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 140
+
+ "140"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 150
+
+ "150"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 114
+
+ "114"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 34
+
+ "34"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 162
+
+ "162"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 13
+
+ "13"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 54
+
+ "54"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 121
+
+ "121"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 66
+
+ "66"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 41
+
+ "41"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 125
+
+ "125"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 60
+
+ "60"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 72
+
+ "72"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 112
+
+ "112"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 81
+
+ "81"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 102
+
+ "102"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 18
+
+ "18"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 132
+
+ "132"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 123
+
+ "123"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 28
+
+ "28"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 58
+
+ "58"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 78
+
+ "78"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 21
+
+ "21"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 61
+
+ "61"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 24
+
+ "24"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 17
+
+ "17"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 48
+
+ "48"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 37
+
+ "37"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 64
+
+ "64"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 57
+
+ "57"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 77
+
+ "77"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 100
+
+ "100"
+
+
+ bWarning
+ false
+ nUpperLimit
+ 1024
+ bActive
+ true
+
+
+ 130
+
+ "130"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 160
+
+ "160"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 27
+
+ "27"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 164
+
+ "164"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 119
+
+ "119"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 20
+
+ "20"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 111
+
+ "111"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 12
+
+ "12"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 115
+
+ "115"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 106
+
+ "106"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 145
+
+ "145"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 19
+
+ "19"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 166
+
+ "166"
+
+
+ MaxInOuts
+ 10
+ MaxOutputs
+ 10
+ bWarning
+ false
+ bActive
+ false
+ MaxInputs
+ 10
+
+
+ 56
+
+ "56"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 52
+
+ "52"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 16
+
+ "16"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 39
+
+ "39"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 103
+
+ "103"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 80
+
+ "80"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 44
+
+ "44"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 122
+
+ "122"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 113
+
+ "113"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 59
+
+ "59"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 10
+
+ "10"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 95
+
+ "95"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 117
+
+ "117"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 40
+
+ "40"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 33
+
+ "33"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 26
+
+ "26"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 36
+
+ "36"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 46
+
+ "46"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 73
+
+ "73"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 25
+
+ "25"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 76
+
+ "76"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 53
+
+ "53"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 107
+
+ "107"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 32
+
+ "32"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 120
+
+ "120"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 11
+
+ "11"
+
+
+ bWarning
+ True
+ bActive
+ True
+
+
+ 124
+
+ "124"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 147
+
+ "147"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 31
+
+ "31"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 134
+
+ "134"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 23
+
+ "23"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 51
+
+ "51"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 15
+
+ "15"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 38
+
+ "38"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 101
+
+ "101"
+
+
+ MinChars
+ 5
+ bWarning
+ false
+ bActive
+ false
+ MaxChars
+ 30
+ Exceptions
+ ""
+
+
+ 43
+
+ "43"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 131
+
+ "131"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 161
+
+ "161"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+
+
+
+
+
+ SuppressedKeywords
+ ""
+ PerformStaticAnalyse
+ false
+
+
+ {40450F57-0AA3-4216-96F3-5444ECB29763}
+
+ "{40450F57-0AA3-4216-96F3-5444ECB29763}"
+
+
+ ActiveVisuExtensionsLength
+ 0
+ ActiveVisuProfile
+ "IR0whWr8bwfwBwAAiD2qpQAAAABVAgAA37x72QAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDBUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgA0AC4ANwAFFlAAcgBvAGYAaQBsAGUARABhAHQAYQAGTHsAMQA2AGUANQA1AGIANgAwAC0ANwAwADQAMwAtADQAYQA2ADMALQBiADYANQBiAC0ANgAxADQANwAxADMAOAA3ADgAZAA0ADIAfQAHEkwAaQBiAHIAYQByAGkAZQBzAAhMewAzAGIAZgBkADUANAA1ADkALQBiADAANwBmAC0ANABkADYAZQAtAGEAZQAxAGEALQBhADgAMwAzADUANgBhADUANQAxADQAMgB9AAlMewA5AGMAOQA1ADgAOQA2ADgALQAyAGMAOAA1AC0ANAAxAGIAYgAtADgAOAA3ADEALQA4ADkANQBmAGYAMQBmAGUAZABlADEAYQB9AAoOVgBlAHIAcwBpAG8AbgALBmkAbgB0AAwKVQBzAGEAZwBlAA0KVABpAHQAbABlAA4aVgBpAHMAdQBFAGwAZQBtAE0AZQB0AGUAcgAPDkMAbwBtAHAAYQBuAHkAEAxTAHkAcwB0AGUAbQARElYAaQBzAHUARQBsAGUAbQBzABIwVgBpAHMAdQBFAGwAZQBtAHMAUwBwAGUAYwBpAGEAbABDAG8AbgB0AHIAbwBsAHMAEyhWAGkAcwB1AEUAbABlAG0AcwBXAGkAbgBDAG8AbgB0AHIAbwBsAHMAFCRWAGkAcwB1AEUAbABlAG0AVABlAHgAdABFAGQAaQB0AG8AcgAVIlYAaQBzAHUATgBhAHQAaQB2AGUAQwBvAG4AdAByAG8AbAAWFHYAaQBzAHUAaQBuAHAAdQB0AHMAFwxzAHkAcwB0AGUAbQAYGFYAaQBzAHUARQBsAGUAbQBCAGEAcwBlABkmRABlAHYAUABsAGEAYwBlAGgAbwBsAGQAZQByAHMAVQBzAGUAZAAaCGIAbwBvAGwAGyJQAGwAdQBnAGkAbgBDAG8AbgBzAHQAcgBhAGkAbgB0AHMAHEx7ADQAMwBkADUAMgBiAGMAZQAtADkANAAyAGMALQA0ADQAZAA3AC0AOQBlADkANAAtADEAYgBmAGQAZgAzADEAMABlADYAMwBjAH0AHRxBAHQATABlAGEAcwB0AFYAZQByAHMAaQBvAG4AHhRQAGwAdQBnAGkAbgBHAHUAaQBkAB8WUwB5AHMAdABlAG0ALgBHAHUAaQBkACBIYQBmAGMAZAA1ADQANAA2AC0ANAA5ADEANAAtADQAZgBlADcALQBiAGIANwA4AC0AOQBiAGYAZgBlAGIANwAwAGYAZAAxADcAIRRVAHAAZABhAHQAZQBJAG4AZgBvACJMewBiADAAMwAzADYANgBhADgALQBiADUAYwAwAC0ANABiADkAYQAtAGEAMAAwAGUALQBlAGIAOAA2ADAAMQAxADEAMAA0AGMAMwB9ACMOVQBwAGQAYQB0AGUAcwAkTHsAMQA4ADYAOABmAGYAYwA5AC0AZQA0AGYAYwAtADQANQAzADIALQBhAGMAMAA2AC0AMQBlADMAOQBiAGIANQA1ADcAYgA2ADkAfQAlTHsAYQA1AGIAZAA0ADgAYwAzAC0AMABkADEANwAtADQAMQBiADUALQBiADEANgA0AC0ANQBmAGMANgBhAGQAMgBiADkANgBiADcAfQAmFk8AYgBqAGUAYwB0AHMAVAB5AHAAZQAnVFUAcABkAGEAdABlAEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwARgBvAHIAQwBvAG4AdgBlAHIAdABpAGIAbABlAEwAaQBiAHIAYQByAGkAZQBzACgQTABpAGIAVABpAHQAbABlACkUTABpAGIAQwBvAG0AcABhAG4AeQAqHlUAcABkAGEAdABlAFAAcgBvAHYAaQBkAGUAcgBzACs4UwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAsEnYAaQBzAHUAZQBsAGUAbQBzAC1INgBjAGIAMQBjAGQAZQAxAC0AZAA1AGQAYwAtADQAYQAzAGIALQA5ADAANQA0AC0AMgAxAGYAYQA3ADUANgBhADMAZgBhADQALihJAG4AdABlAHIAZgBhAGMAZQBWAGUAcgBzAGkAbwBuAEkAbgBmAG8AL0x7AGMANgAxADEAZQA0ADAAMAAtADcAZgBiADkALQA0AGMAMwA1AC0AYgA5AGEAYwAtADQAZQAzADEANABiADUAOQA5ADYANAAzAH0AMBhNAGEAagBvAHIAVgBlAHIAcwBpAG8AbgAxGE0AaQBuAG8AcgBWAGUAcgBzAGkAbwBuADIMTABlAGcAYQBjAHkAMzBMAGEAbgBnAHUAYQBnAGUATQBvAGQAZQBsAFYAZQByAHMAaQBvAG4ASQBuAGYAbwA0MEwAbwBhAGQATABpAGIAcgBhAHIAaQBlAHMASQBuAHQAbwBQAHIAbwBqAGUAYwB0ADUaQwBvAG0AcABhAHQAaQBiAGkAbABpAHQAeQDQAAIaA9ADAS0E0AUGGgfQBwgaAUUHCQjQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtDtAPAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60BAAAA0A0BLRHQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0S0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAUAAAA0AwLrQIAAADQDQEtE9APAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAAAAAANAMC60CAAAA0A0BLRTQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0V0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtFtAPAS0X0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60EAAAA0A0BLRjQDwEtENAZGq0BRRscAdAAHBoCRR0LBAMAAAAFAAAADQAAAAAAAADQHh8tINAhIhoCRSMkAtAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAAAAANADAS0n0CgBLRHQKQEtENAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAQAAANADAS0n0CgBLRHQKQEtEJoqKwFFAAEC0AABLSzQAAEtF9AAHy0t0C4vGgPQMAutAQAAANAxC60XAAAA0DIarQDQMy8aA9AwC60CAAAA0DELrQMAAADQMhqtANA0Gq0A0DUarQA="
+
+
+ {192FAD59-8248-4824-A8DE-9177C94C195A}
+
+ "{192FAD59-8248-4824-A8DE-9177C94C195A}"
+
+
+
+ {F66C7017-BDD8-4114-926C-81D6D687E35F}
+
+ "{F66C7017-BDD8-4114-926C-81D6D687E35F}"
+
+
+
+ {246001F4-279D-43AC-B241-948EB31120E1}
+
+ "{246001F4-279D-43AC-B241-948EB31120E1}"
+
+
+ GlobalVisuImageFilePath
+ %APPLICATIONPATH%
+
+
+
+
+
+
+
+ System.Boolean
+ System.Collections.Hashtable
+ System.Int32
+ {54dd0eac-a6d8-46f2-8c27-2f43c7e49861}
+ System.String
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_1.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_1.TcPOU
new file mode 100644
index 000000000..739f16682
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_1.TcPOU
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_2.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_2.TcPOU
new file mode 100644
index 000000000..7fcbb7322
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_2.TcPOU
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_3.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_3.TcPOU
new file mode 100644
index 000000000..f26a7f9dc
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_3.TcPOU
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_4.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_4.TcPOU
new file mode 100644
index 000000000..66cdcba03
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_4.TcPOU
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_5.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_5.TcPOU
new file mode 100644
index 000000000..384bfa95d
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_5.TcPOU
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbRootLevelStruct.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbRootLevelStruct.TcPOU
new file mode 100644
index 000000000..efb9ed17d
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbRootLevelStruct.TcPOU
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/stAllTypes.TcDUT b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/stAllTypes.TcDUT
new file mode 100644
index 000000000..5aaa5a4b0
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/stAllTypes.TcDUT
@@ -0,0 +1,62 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/fbBasicRunnerTests.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/fbBasicRunnerTests.TcPOU
new file mode 100644
index 000000000..6398edf35
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/fbBasicRunnerTests.TcPOU
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/fbRecorderRunnerTests.TcPOU b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/fbRecorderRunnerTests.TcPOU
new file mode 100644
index 000000000..5b31e766f
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/fbRecorderRunnerTests.TcPOU
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/stRecorder.TcDUT b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/stRecorder.TcDUT
new file mode 100644
index 000000000..20267ed53
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/stRecorder.TcDUT
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tc.Prober/tests/TcProber/TcProber.tsproj b/src/Tc.Prober/tests/TcProber/TcProber.tsproj
new file mode 100644
index 000000000..9081a7b4e
--- /dev/null
+++ b/src/Tc.Prober/tests/TcProber/TcProber.tsproj
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ PlcTask
+
+
+
+
+
+
+ PlcTcProberTests Instance
+ {08500001-0000-0000-F000-000000000064}
+
+
+ 0
+ PlcTask
+
+ #x02010030
+
+ 20
+ 10000000
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/PlcAppExamplesConnector/Entry.cs b/src/TcoApplicationExamples/PlcAppExamplesConnector/Entry.cs
new file mode 100644
index 000000000..b2624ca55
--- /dev/null
+++ b/src/TcoApplicationExamples/PlcAppExamplesConnector/Entry.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+
+namespace PlcAppExamples
+{
+ public static class Entry
+ {
+ static string amsId = Environment.GetEnvironmentVariable("Tc3Target");
+ const int amsPort = 851;
+
+ public static PlcAppExamples.PlcAppExamplesTwinController PlcAppExamples { get; }
+ = new PlcAppExamples.PlcAppExamplesTwinController(Vortex.Adapters.Connector.Tc3.Adapter.Tc3ConnectorAdapter.Create(amsId, amsPort, true));
+ }
+}
diff --git a/src/TcoApplicationExamples/PlcAppExamplesConnector/PlcAppExamplesConnector.csproj b/src/TcoApplicationExamples/PlcAppExamplesConnector/PlcAppExamplesConnector.csproj
new file mode 100644
index 000000000..f899d0553
--- /dev/null
+++ b/src/TcoApplicationExamples/PlcAppExamplesConnector/PlcAppExamplesConnector.csproj
@@ -0,0 +1,23 @@
+
+
+
+ net48
+
+
+
+
+
+
+
+ True
+ True
+ Localizations.resx
+
+
+
+
+ PublicResXFileCodeGenerator
+ Localizations.Designer.cs
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/PlcAppExamplesConnector/Properties/Localizations.Designer.cs b/src/TcoApplicationExamples/PlcAppExamplesConnector/Properties/Localizations.Designer.cs
new file mode 100644
index 000000000..aa1f761d3
--- /dev/null
+++ b/src/TcoApplicationExamples/PlcAppExamplesConnector/Properties/Localizations.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace PlcAppExamplesConnector.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ public class Localizations {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Localizations() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PlcAppExamplesConnector.Properties.Localizations", typeof(Localizations).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/src/TcoApplicationExamples/PlcAppExamplesConnector/Properties/Localizations.resx b/src/TcoApplicationExamples/PlcAppExamplesConnector/Properties/Localizations.resx
new file mode 100644
index 000000000..1af7de150
--- /dev/null
+++ b/src/TcoApplicationExamples/PlcAppExamplesConnector/Properties/Localizations.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/App.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/App.xaml
new file mode 100644
index 000000000..297ba9229
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/App.xaml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/App.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/App.xaml.cs
new file mode 100644
index 000000000..f5bdb3ea9
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/App.xaml.cs
@@ -0,0 +1,55 @@
+using PlcAppExamples;
+using System;
+using System.Diagnostics;
+using System.Windows;
+using System.Windows.Documents;
+using System.Windows.Input;
+
+namespace TcoApplicationExamples.Wpf
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ public App() : base()
+ {
+ TcoCore.Threading.Dispatcher.SetDispatcher(TcoCore.Wpf.Threading.Dispatcher.Get);
+ PlcAppExamples.Connector.ReadWriteCycleDelay = 100;
+ PlcAppExamples.Connector.BuildAndStart();
+ }
+
+ public static PlcAppExamplesTwinController PlcAppExamples { get { return Entry.PlcAppExamples; } }
+ }
+
+ public static class HyperlinkExtensions
+ {
+ public static bool GetIsExternal(DependencyObject obj)
+ {
+ return (bool)obj.GetValue(IsExternalProperty);
+ }
+
+ public static void SetIsExternal(DependencyObject obj, bool value)
+ {
+ obj.SetValue(IsExternalProperty, value);
+ }
+ public static readonly DependencyProperty IsExternalProperty =
+ DependencyProperty.RegisterAttached("IsExternal", typeof(bool), typeof(HyperlinkExtensions), new UIPropertyMetadata(false, OnIsExternalChanged));
+
+ private static void OnIsExternalChanged(object sender, DependencyPropertyChangedEventArgs args)
+ {
+ var hyperlink = sender as Hyperlink;
+
+ if ((bool)args.NewValue)
+ hyperlink.RequestNavigate += Hyperlink_RequestNavigate;
+ else
+ hyperlink.RequestNavigate -= Hyperlink_RequestNavigate;
+ }
+
+ private static void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
+ {
+ Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
+ e.Handled = true;
+ }
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/AssemblyInfo.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/AssemblyInfo.cs
new file mode 100644
index 000000000..f8dc9618c
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/AssemblyInfo.cs
@@ -0,0 +1,16 @@
+using System.Reflection;
+using System.Windows;
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+[assembly: AssemblyVersion("0.4.1.0")]
+[assembly: AssemblyFileVersion("0.4.1.0")]
+[assembly: AssemblyInformationalVersion("0.4.1-initial-dev.375+Branch.initial-dev.Sha.70df6b177f3b27b9fcedd3aa9c169ecdc6bd2d56")]
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/MainWindow.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/MainWindow.xaml
new file mode 100644
index 000000000..13bbf0e6b
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/MainWindow.xaml
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Control
+ ControlSlim
+ Display
+ DisplaySlim
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/MainWindow.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/MainWindow.xaml.cs
new file mode 100644
index 000000000..50fe23825
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/MainWindow.xaml.cs
@@ -0,0 +1,26 @@
+using System.Diagnostics;
+using System.Windows;
+using System.Windows.Input;
+
+namespace TcoApplicationExamples.Wpf
+{
+ public partial class MainWindow : Window
+ {
+ public MainWindow()
+ {
+ InitializeComponent();
+
+ // Clicking on links in markdown will open browser.
+ CommandBindings.Add(new CommandBinding(
+ NavigationCommands.GoToPage,
+ (sender, e) =>
+ {
+ var proc = new Process();
+ proc.StartInfo.UseShellExecute = true;
+ proc.StartInfo.FileName = (string)e.Parameter;
+
+ proc.Start();
+ }));
+ }
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/NonFrameworkComponentUse/NFComponentUse.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/NonFrameworkComponentUse/NFComponentUse.xaml
new file mode 100644
index 000000000..184b4a2ac
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/NonFrameworkComponentUse/NFComponentUse.xaml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ # Use of component without TcOpen framework
+ This example demostrates the use of TcOpen component outside TcOpen Framework.
+ The single requirement is to have a [Context](https://docs.tcopengroup.org/api/TcoCore/TcoCore.TcoContext.PlcTcoContext.html) defined, as demostrated in `NF_MAIN` PRG block.
+ The instance of this context is then passed into FB_init of a TcOpen component (in the example piston).
+ Context must be opened at the beginning of the PLC cycle and closed at the end in our example `_context.VolatileOpen()`
+ and `_context.VolatileClose()`. Between the these two methods must be places all application logic.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/NonFrameworkComponentUse/NFComponentUse.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/NonFrameworkComponentUse/NFComponentUse.xaml.cs
new file mode 100644
index 000000000..dde828c1e
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/NonFrameworkComponentUse/NFComponentUse.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace TcoApplicationExamples.Wpf.NonFrameworkComponentUse
+{
+ ///
+ /// Interaction logic for NFComponentUse.xaml
+ ///
+ public partial class NFComponentUse : UserControl
+ {
+ public NFComponentUse()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/TcoApplicationExamples.Wpf.csproj b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/TcoApplicationExamples.Wpf.csproj
new file mode 100644
index 000000000..5a16c75d6
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/TcoApplicationExamples.Wpf.csproj
@@ -0,0 +1,72 @@
+
+
+ WinExe
+ net48
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ Always
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+ $(DefaultXamlRuntime)
+ Designer
+
+
+ $(DefaultXamlRuntime)
+ Designer
+
+
+ $(DefaultXamlRuntime)
+ Designer
+
+
+ $(DefaultXamlRuntime)
+ Designer
+
+
+ $(DefaultXamlRuntime)
+ Designer
+
+
+ $(DefaultXamlRuntime)
+ Designer
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/ColorExample101.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/ColorExample101.xaml
new file mode 100644
index 000000000..6812817e4
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/ColorExample101.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+ Welcome to TcOpen examples
+
+ First let's get started by a simple sequence
+
+ Follow the instruction on the sequence, turn on lights accordingly
+
+ Experiment with Step mode, step backward, forward.
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/ColorExample101.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/ColorExample101.xaml.cs
new file mode 100644
index 000000000..543f409d2
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/ColorExample101.xaml.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Markup;
+using Vortex.Presentation.Wpf;
+
+namespace PlcAppExamples
+{
+ public partial class ColorExample101 : UserControl
+ {
+ public ColorExample101()
+ {
+ InitializeComponent();
+ }
+ }
+
+
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/Color_ExampleView.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/Color_ExampleView.xaml
new file mode 100644
index 000000000..4adbfd07c
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/Color_ExampleView.xaml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/Color_ExampleView.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/Color_ExampleView.xaml.cs
new file mode 100644
index 000000000..ec091be1a
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/Color_ExampleView.xaml.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Markup;
+using Vortex.Presentation.Wpf;
+
+namespace PlcAppExamples
+{
+ public partial class Color_ExampleView : UserControl
+ {
+ public Color_ExampleView()
+ {
+ InitializeComponent();
+ }
+ }
+ public class Color_ExampleViewModel : RenderableViewModel
+ {
+ public Color_ExampleViewModel()
+ {
+
+ }
+
+ public Color_Example Color_Example { get; set; }
+
+ public override object Model { get => Color_Example; set => Color_Example = value as Color_Example; }
+ }
+
+
+ public class RgbConverter : MarkupExtension, IMultiValueConverter
+ {
+
+ public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
+ {
+ var vals = values.ToList().Cast().Select(x => x ? 255 : 0).ToArray();
+ var r = System.Convert.ToByte(vals[0]);
+ var g = System.Convert.ToByte(vals[1]);
+ var b = System.Convert.ToByte(vals[2]);
+ return System.Windows.Media.Color.FromRgb(r, g, b);
+ }
+
+
+
+ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override object ProvideValue(System.IServiceProvider serviceProvider)
+ {
+ return this;
+ }
+ }
+
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasks201.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasks201.xaml
new file mode 100644
index 000000000..60a10025a
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasks201.xaml
@@ -0,0 +1,32 @@
+
+
+
+
+ # Invoking Task
+ [Documentation](https://github.com/Inxton/TcOpen.Documentation/blob/dev/articles/TcOpenFramework/application.md#tasks-tcotask--itcotask)
+
+ Task allows you to control chunks of logic in asynchronous execution.
+ In this example, we have a Component - Pneumatic Cylinder. This component is doing three things,therefore it has three tasks.
+ One task for moving home, second for moving work and last for stopping the movement
+ When they're done you can reset them and run again.
+ Tasks also implement ICommand interface, ICommand is an interface between the Presentation and the Logic layer,so clicking a button will result in an action
+ Bellow the view for a cylinder, you can see a detailed view for each action. Once is done, it has to be restored, to run again.
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasks201.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasks201.xaml.cs
new file mode 100644
index 000000000..5ec74c190
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasks201.xaml.cs
@@ -0,0 +1,15 @@
+using System.Windows.Controls;
+
+namespace PlcAppExamples
+{
+ public partial class InvokingTasks201 : UserControl
+ {
+ public InvokingTasks201()
+ {
+ InitializeComponent();
+ }
+
+
+ }
+
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasksView.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasksView.xaml
new file mode 100644
index 000000000..c47cc9fcd
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasksView.xaml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasksView.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasksView.xaml.cs
new file mode 100644
index 000000000..c7dc66758
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasksView.xaml.cs
@@ -0,0 +1,21 @@
+using PlcAppExamples;
+using System.Windows.Controls;
+using Vortex.Presentation.Wpf;
+
+namespace PlcAppExamples
+{
+ public partial class InvokingTasksView : UserControl
+ {
+ public InvokingTasksView()
+ {
+ InitializeComponent();
+ }
+ }
+
+ public class InvokingTasksViewModel : RenderableViewModel
+ {
+
+ public InvokingTasks InvokingTasks { get; set; }
+ public override object Model { get => InvokingTasks; set => InvokingTasks = value as InvokingTasks; }
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecution301.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecution301.xaml
new file mode 100644
index 000000000..2593c98d6
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecution301.xaml
@@ -0,0 +1,30 @@
+
+
+
+
+ # Task execution
+ [Documentation](https://github.com/Inxton/TcOpen.Documentation/blob/dev/articles/TcOpenFramework/application.md#tasks-tcotask--itcotask)
+
+ Slow and Fast task simulate a moving servo. Tasks are done when they reach the end of the slider.
+ When they're done you can reset them and run again.
+ Try to interupt with slider (servo) movements! When you interupt fast task, it will stop.
+ After the dask is DONE, you need to restore it.
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecution301.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecution301.xaml.cs
new file mode 100644
index 000000000..327e8df9e
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecution301.xaml.cs
@@ -0,0 +1,15 @@
+using System.Diagnostics;
+using System.Windows.Controls;
+using System.Windows.Input;
+
+namespace PlcAppExamples
+{
+ public partial class TaskExecution301 : UserControl
+ {
+ public TaskExecution301()
+ {
+ InitializeComponent();
+
+ }
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecutionView.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecutionView.xaml
new file mode 100644
index 000000000..b89dabb42
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecutionView.xaml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecutionView.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecutionView.xaml.cs
new file mode 100644
index 000000000..019263d3e
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecutionView.xaml.cs
@@ -0,0 +1,20 @@
+using PlcAppExamples;
+using System.Windows.Controls;
+using Vortex.Presentation.Wpf;
+
+namespace PlcAppExamples
+{
+ public partial class TaskExecutionView : UserControl
+ {
+ public TaskExecutionView()
+ {
+ InitializeComponent();
+ }
+ }
+
+ public class TaskExecutionViewModel : RenderableViewModel
+ {
+ public TaskExecution TaskExecution { get; set; }
+ public override object Model { get => TaskExecution; set => TaskExecution = value as TaskExecution; }
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/ConnectingDots401.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/ConnectingDots401.xaml
new file mode 100644
index 000000000..26aa14be7
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/ConnectingDots401.xaml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+ # Components, Tasks, Sequencer together
+ Everything is explained in [this video](https://www.youtube.com/watch?v=yCUv2LW-6zo). This example uses the almost PLC code. Functionallity is similar.
+
+ Use the slider to adjust the speed of the simulation.
+
+ New step in sequence can result in automatic invoking of the `Restore` method - so you don't have to.
+
+
+
+
+
+
+
+
+
+
+
+ # Diagnostics
+ Everything is explained in [this video](https://www.youtube.com/watch?v=yCUv2LW-6zo). This example uses the almost PLC code. Functionallity is similar.
+
+ Discover messaging system - select Diagnostic message type to see what's going on.
+ Investigate, how components publish these messages.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/ConnectingDots401.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/ConnectingDots401.xaml.cs
new file mode 100644
index 000000000..39ce9fd56
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/ConnectingDots401.xaml.cs
@@ -0,0 +1,41 @@
+using System.Windows.Controls;
+using Vortex.Presentation.Wpf;
+using System.Linq;
+using TcoCore;
+
+namespace PlcAppExamples
+{
+ public partial class ConnectingDots401 : UserControl
+ {
+ public ConnectingDots401()
+ {
+ InitializeComponent();
+ }
+
+ private void OnRendered(object sender, System.Windows.SizeChangedEventArgs e)
+ {
+ var diagViewModel = sender
+ .As()
+ .Content
+ .As()
+ .Children[0]
+ .As()
+ .Content
+ .As()
+ .DataContext
+ .As();
+
+ if (SubscirbeOnce)
+ {
+ SubscirbeOnce = false;
+ Entry.PlcAppExamples.MAIN_PRG._TcOpenTutorial.Station001._sequence._currentStep.ID.Subscribe((a, b) => diagViewModel.UpdateMessagesCommand.Execute(null));
+ }
+ }
+ public bool SubscirbeOnce { get; set; } = true;
+ }
+
+ public static class Ext
+ {
+ public static T As(this object @object) where T : class => (@object as T);
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Images/100-800.PNG b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Images/100-800.PNG
new file mode 100644
index 000000000..362a2c6ec
Binary files /dev/null and b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Images/100-800.PNG differ
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml
new file mode 100644
index 000000000..cd4bfaa75
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml.cs
new file mode 100644
index 000000000..07d4103e6
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml.cs
@@ -0,0 +1,66 @@
+using PlcAppExamples;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Windows;
+using System.Windows.Controls;
+using Vortex.Connector;
+using Vortex.Connector.ValueTypes;
+using Vortex.Presentation.Wpf;
+
+namespace PlcAppExamples
+{
+ public partial class Station001View : UserControl
+ {
+ public Station001View()
+ {
+ InitializeComponent();
+ DataContextChanged += OnDataContextChanged;
+ }
+
+ private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
+ {
+ if (e.NewValue is Station001ViewModel viewModel)
+ UpdateImage(viewModel);
+ }
+
+ private void UpdateImage(Station001ViewModel viewModel)
+ {
+ viewModel.Station001._sequence._currentStep.ID.Subscribe(ChangeImage);
+ }
+
+ FileInfo rootPath = new FileInfo(Assembly.GetExecutingAssembly().Location);
+
+ private void ChangeImage(IValueTag sender, ValueChangedEventArgs args)
+ {
+ var scrollPosition = new Dictionary() {
+ {100,0.0},
+ {200,220},
+ {300,524},
+ {400,819},
+ {500,1011},
+ {600,1203},
+ {700,1395},
+ {800,1504}
+ };
+ var fileName = $@"{rootPath.DirectoryName}\Tutorial\401_ConnectingDots\Images\100-800.png";
+ if (File.Exists(fileName))
+ {
+ this.Dispatcher.Invoke(() =>
+ {
+ if (scrollPosition.ContainsKey((dynamic)args.NewValue))
+ {
+ scrollImage.ScrollToVerticalOffset(scrollPosition[(dynamic)args.NewValue]);
+ }
+ });
+ }
+ }
+ }
+
+ public class Station001ViewModel : RenderableViewModel
+ {
+ public Station001 Station001 { get; set; }
+ public override object Model { get => Station001; set => Station001 = value as Station001; }
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml
new file mode 100644
index 000000000..08b3011bf
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml.cs
new file mode 100644
index 000000000..d9af736c8
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace TcoApplicationExamples.Wpf
+{
+ ///
+ /// Interaction logic for TcOpenTutorialView.xaml
+ ///
+ public partial class TcOpenTutorialView : UserControl
+ {
+ public TcOpenTutorialView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/assets/nfuse.PNG b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/assets/nfuse.PNG
new file mode 100644
index 000000000..6c98ecb7e
Binary files /dev/null and b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/assets/nfuse.PNG differ
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/nfuse.PNG b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/nfuse.PNG
new file mode 100644
index 000000000..1ef9caf92
Binary files /dev/null and b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/nfuse.PNG differ
diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.slnf b/src/TcoApplicationExamples/TcoApplicationExamples.slnf
new file mode 100644
index 000000000..e98151c7e
--- /dev/null
+++ b/src/TcoApplicationExamples/TcoApplicationExamples.slnf
@@ -0,0 +1,24 @@
+{
+ "solution": {
+ "path": "..\\..\\TcOpen.sln",
+ "projects": [
+ "src\\TcoCore\\src\\TcoCore.Wpf\\TcoCore.Wpf.csproj",
+ "src\\TcoCore\\src\\TcoCoreConnector\\TcoCoreConnector.csproj",
+ "src\\TcoCore\\src\\XaeTcoCore\\XaeTcoCore.tsproj",
+ "src\\TcoCore\\tests\\TcoCore.Sandbox.Wpf\\TcoCore.Sandbox.Wpf.csproj",
+ "src\\TcoCore\\tests\\TcoCoreExamplesConnector\\TcoCoreExamplesConnector.csproj",
+ "src\\TcoCore\\tests\\TcoCoreTestsConnector\\TcoCoreTestsConnector.csproj",
+ "src\\TcoCore\\tests\\TcoCoreUnitTests\\TcoCoreUnitTests.csproj",
+ "src\\TcoCore\\tests\\TcoTestRunners\\TcoTestRunners.csproj",
+ "src\\TcoPneumatics\\src\\TcoPneumatics.Wpf\\TcoPneumatics.Wpf.csproj",
+ "src\\TcoPneumatics\\src\\TcoPneumaticsConnector\\TcoPneumaticsConnector.csproj",
+ "src\\TcoPneumatics\\src\\XaeTcoPneumatics\\XaeTcoPneumatics.tsproj",
+ "src\\TcoPneumatics\\tests\\Sandbox\\PlcOpen.Wpf.Sandbox\\TcoPneumatics.Wpf.Sandbox.csproj",
+ "src\\TcoPneumatics\\tests\\TcoPneumaticsTestsConnector\\TcoPneumaticsTestsConnector.csproj",
+ "src\\TcoPneumatics\\tests\\TcoPneumaticsTests_nUnit\\TcoPneumaticsTests_nUnit.csproj",
+ "src\\TcoApplicationExamples\\PlcAppExamplesConnector\\PlcAppExamplesConnector.csproj",
+ "src\\TcoApplicationExamples\\TcoApplicationExamples.Wpf\\TcoApplicationExamples.Wpf.csproj",
+ "src\\TcoApplicationExamples\\XaeAppExamples\\XaeAppExamples.tsproj"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Constanzia_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Constanzia_Object.TcPOU
new file mode 100644
index 000000000..5ea23162d
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Constanzia_Object.TcPOU
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Frederico_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Frederico_Object.TcPOU
new file mode 100644
index 000000000..1b55d019a
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Frederico_Object.TcPOU
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Michael_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Michael_Object.TcPOU
new file mode 100644
index 000000000..a4358b0c2
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Michael_Object.TcPOU
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Santino_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Santino_Object.TcPOU
new file mode 100644
index 000000000..69af854fc
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Santino_Object.TcPOU
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Thomas_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Thomas_Object.TcPOU
new file mode 100644
index 000000000..ef1845edf
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Thomas_Object.TcPOU
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/Leaves/AKid_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/Leaves/AKid_Object.TcPOU
new file mode 100644
index 000000000..07a04c710
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/Leaves/AKid_Object.TcPOU
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/VitoCorleone_Context.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/VitoCorleone_Context.TcPOU
new file mode 100644
index 000000000..e58167d05
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/VitoCorleone_Context.TcPOU
@@ -0,0 +1,161 @@
+
+
+
+
+(*
+
+ THIS EXAMPLE AIMS TO EXPLAIN WHAT CONTEXT AND IDENITY ARE IN A 'TcoOpen' APPLICATION.
+ SEE Main() method of this block.
+
+*)
+FUNCTION_BLOCK VitoCorleone_Context EXTENDS TcoCore.TcoContext
+VAR
+(*
+ Each context member object has it 'context' and assigned when instantiated (at birth)
+ This is typically done by instantiating the objects with FB_init(ITcoObject) as follows
+ These are Don Corleone's children. When you look inside definitions you' find
+ Don Corleone's grand-childrend (whole family shares the same context).
+*)
+ _santino : Santino_Object(THIS^);
+ _thomas : Thomas_Object(THIS^);
+ _frederico : Frederico_Object(THIS^);
+ _michael : Michael_Object(THIS^);
+ _costanzia : Constanzia_Object(THIS^);
+END_VAR
+
+VAR
+ _donCorleoneContext : ITcoContext;
+ _isSameContext : BOOL;
+
+ _donCorleoneIdentity : ULINT;
+ _isDifferentIndentity : BOOL;
+END_VAR
+//
+//--
+
+VAR
+ _JohnyFontaneCaseDone : BOOL := FALSE;
+ _MakeAnOfferThatCantBeRefused : MakeAnOfferThatCantBeRefused(THIS^, eRestoreMode.None);
+END_VAR]]>
+
+
+
+
+
+
+ _JohnyFontaneCaseDone);
+END_IF;]]>
+
+
+
+
+
+ Main method of the TcoContext. This is the entry point of any control logic that belongs to this context.
+ The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main
+]]>
+
+
+(*
+
+ CONTEXT vs IDENTITY
+
+*)
+
+// In Corleone family they all share the same context that is that of Don Vito Corleone
+
+
+// Here is the tree of family Corleone
+
+// https://godfather.fandom.com/wiki/Corleone_family
+
+_donCorleoneContext := THIS^.Context;
+_isSameContext :=
+ // Santino
+ _donCorleoneContext = THIS^._santino.Context
+ // Santino's kids
+ AND (THIS^._santino.Context = THIS^._santino._francesca.Context
+ AND THIS^._santino.Context = THIS^._santino._frank.Context
+ AND THIS^._santino.Context = THIS^._santino._kathryn.Context
+ AND THIS^._santino.Context = THIS^._santino._santino.Context)
+ // Thomas
+ AND THIS^._santino.Context = THIS^._thomas.Context
+ // Thomas' kids
+ AND (THIS^._thomas.Context = THIS^._thomas._andrew.Context
+ AND THIS^._thomas.Context = THIS^._thomas._christina.Context
+ AND THIS^._thomas.Context = THIS^._thomas._frank.Context
+ AND THIS^._thomas.Context = THIS^._thomas._gianna.Context)
+ // Frederico
+ AND THIS^._thomas.Context = THIS^._frederico.Context
+ // Frederico's kids
+ AND (THIS^._frederico.Context = THIS^._frederico._fredo.Context)
+ // Michael
+ AND THIS^._frederico.Context = THIS^._michael.Context
+ // Michael's kids
+ AND (THIS^._michael.Context = THIS^._michael._anthony.Context
+ AND THIS^._michael.Context = THIS^._michael._mary.Context)
+ // Constanzia
+ AND THIS^._michael.Context = THIS^._costanzia.Context
+ // Constanzia's kids
+ AND (THIS^._costanzia.Context = THIS^._costanzia._michael.Context
+ AND THIS^._costanzia.Context = THIS^._costanzia._victor.Context);
+
+// However each member of the family has different personal identity and that might
+// be source of trouble
+
+_donCorleoneIdentity := THIS^.Identity;
+_isDifferentIndentity :=
+ // Santino
+ _donCorleoneIdentity <> THIS^._santino.Identity
+ // Santino's kids
+ AND (THIS^._santino.Identity <> THIS^._santino._francesca.Identity
+ AND THIS^._santino.Identity <> THIS^._santino._frank.Identity
+ AND THIS^._santino.Identity <> THIS^._santino._kathryn.Identity
+ AND THIS^._santino.Identity <> THIS^._santino._santino.Identity)
+ // Thomas
+ AND THIS^._santino.Identity <> THIS^._thomas.Identity
+ // Thomas' kids
+ AND (THIS^._thomas.Identity <> THIS^._thomas._andrew.Identity
+ AND THIS^._thomas.Identity <> THIS^._thomas._christina.Identity
+ AND THIS^._thomas.Identity <> THIS^._thomas._frank.Identity
+ AND THIS^._thomas.Identity <> THIS^._thomas._gianna.Identity)
+ // Frederico
+ AND THIS^._thomas.Identity <> THIS^._frederico.Identity
+ // Frederico's kids
+ AND (THIS^._frederico.Identity <> THIS^._frederico._fredo.Identity)
+ // Michael
+ AND THIS^._frederico.Identity <> THIS^._michael.Identity
+ // Michael's kids
+ AND (THIS^._michael.Identity <> THIS^._michael._anthony.Identity
+ AND THIS^._michael.Identity <> THIS^._michael._mary.Identity)
+ // Constanzia
+ AND THIS^._michael.Identity <> THIS^._costanzia.Identity
+ // Constanzia's kids
+ AND (THIS^._costanzia.Identity <> THIS^._costanzia._michael.Identity
+ AND THIS^._costanzia.Identity <> THIS^._costanzia._victor.Identity);
+
+
+// Once the context is asigned (at birth [instantiated]) it cannot be changed,
+// an attempt to change the context will result in vendetta.
+//
+//--
+
+JohnyFontaneCase(MAIN_PRG._Jack_Woltz);
+]]>
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/MAIN_PRG.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/MAIN_PRG.TcPOU
new file mode 100644
index 000000000..7a15ffda6
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/MAIN_PRG.TcPOU
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_Logic.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_Logic.TcPOU
new file mode 100644
index 000000000..37c9e4ff3
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_Logic.TcPOU
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_MAIN.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_MAIN.TcPOU
new file mode 100644
index 000000000..a3798c497
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_MAIN.TcPOU
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Horse_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Horse_Object.TcPOU
new file mode 100644
index 000000000..11e587572
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Horse_Object.TcPOU
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Killer_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Killer_Object.TcPOU
new file mode 100644
index 000000000..69d51d475
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Killer_Object.TcPOU
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Person_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Person_Object.TcPOU
new file mode 100644
index 000000000..3464b2991
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Person_Object.TcPOU
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Woltz_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Woltz_Object.TcPOU
new file mode 100644
index 000000000..7ebfff963
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Woltz_Object.TcPOU
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/MakeAnOfferThatCantBeRefused.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/MakeAnOfferThatCantBeRefused.TcPOU
new file mode 100644
index 000000000..fca49d9a0
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/MakeAnOfferThatCantBeRefused.TcPOU
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the sequener. Custom code needs to be placed here. The sequencer is executed by call of InstanceName.Run() method.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main : BOOL
+]]>
+
+
+ //Starting the execution of the 'TcoTask' instance extended by input parameters from 'outside' of the instance.
+ Thomas.AskForTheFavor(Jack_Woltz,'Grant movie role to Johny Fontane.','No future problems with unions.').Invoke();
+
+// Checking from the 'outside' of the instance, if the task has already finished in expected way.
+ _FirstOfferAccepted := Thomas._AskForTheFavor.Done;
+
+// Checking from the 'outside' of the instance, if the task has finished in non-expected way.
+ _FirstOfferRefused := Thomas._AskForTheFavor.Error;
+//
+
+ StepCompleteWhen(_FirstOfferAccepted OR _FirstOfferRefused);
+END_IF
+
+IF Step(10,_FirstOfferAccepted,'Call somebody to call somebody to ensure no problems with unions in the future.') THEN
+//*
+//..
+//NoFutureUnionsProblems implementation
+//..
+//*
+ RequestStep(500);
+END_IF
+
+IF Step(20,TRUE,'Call somebody to call somebody to send somebody to kill the Woltz horse Khartoum.') THEN
+ StepCompleteWhen(_Killer.Kill(Jack_Woltz._Khartoum).Invoke().Done);
+END_IF
+
+IF Step(30,TRUE,'Waiting for granting the movie role to Johny Fontane by Jack Woltz.') THEN
+ Jack_Woltz.ThinkCarefully();
+
+
+ StepCompleteWhen(Jack_Woltz.FavorIsGranted());
+END_IF
+
+IF Step(500,TRUE,'Final step of the sequence.') THEN
+ Done := TRUE;
+ CompleteStep();
+END_IF
+]]>
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Automat.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Automat.TcPOU
new file mode 100644
index 000000000..dce347f97
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Automat.TcPOU
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the sequener. Custom code needs to be placed here, calling of the methods Open() at the beggining and Close() at the end is ensured by calling the InstanceName.Run() method.
+ This method is abstract, so each derived type has to implement its own implementation of this method.
+
+
+~*)
+METHOD PROTECTED Main : BOOL
+]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Components.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Components.TcPOU
new file mode 100644
index 000000000..708cc5cd9
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Components.TcPOU
@@ -0,0 +1,17 @@
+
+
+
+
+
+ ST_01_IO.OUTs[0], outToWorkPos=> ST_01_IO.OUTs[1]);
+_vertical(inAtHomePos:= ST_01_IO.INs[2], inAtWorkPos:= ST_01_IO.INs[3], outToHomePos=> ST_01_IO.OUTs[2], outToWorkPos=> ST_01_IO.OUTs[3]);
+_gripper(inAtHomePos:= ST_01_IO.INs[4], inAtWorkPos:= ST_01_IO.INs[5], outToHomePos=> ST_01_IO.OUTs[4], outToWorkPos=> ST_01_IO.OUTs[5]);]]>
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Context.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Context.TcPOU
new file mode 100644
index 000000000..77d901ed5
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Context.TcPOU
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the TcoContext. This is the entry point of any control logic that belongs to this context.
+ The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly.
+ This method is abstract, and it must be overriden in inherited block.
+
+
+~*)
+METHOD PROTECTED Main]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Ground.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Ground.TcPOU
new file mode 100644
index 000000000..36cbea9f4
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Ground.TcPOU
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the sequener. Custom code needs to be placed here, calling of the methods Open() at the beggining and Close() at the end is ensured by calling the InstanceName.Run() method.
+ This method is abstract, so each derived type has to implement its own implementation of this method.
+
+
+~*)
+METHOD PROTECTED Main : BOOL
+]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_IO.TcGVL b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_IO.TcGVL
new file mode 100644
index 000000000..3fe2383f0
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_IO.TcGVL
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/fbAwait.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/fbAwait.TcPOU
new file mode 100644
index 000000000..586d9ab4a
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/fbAwait.TcPOU
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/AskForTheFavor_Task.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/AskForTheFavor_Task.TcPOU
new file mode 100644
index 000000000..65f098e7b
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/AskForTheFavor_Task.TcPOU
@@ -0,0 +1,75 @@
+
+
+
+
+(*
+
+ This example shows using the 'Tcotask' application. 'TcoTask' is the simplest
+ 'TcoOpen' coordination primitive.
+ In general the body of the task could be devided into the three section:
+ 1.) Action
+ 2.) Termination condition for the expected behavior.
+ 3.) Termination condition for the non-expected behavior.
+ The body of the 'Tcotask' needs to be called cyclically. The 'Tcotask' could be then
+ invoked from 'outside'. The task of this 'Tcotask' is to ask for the favor
+ (in the name of the 'TcoContext' in this example Don Corleone) and offer the return favor.
+ Task could end up the expected way in the 'DONE' state if the requested person grant
+ the favor or it could end up in the 'ERROR' state if the requested person refuses to grant
+ the favor. Each task could be invoked only from the 'READY' state. So if the task enters
+ the 'ERROR' state, it cannot be invoked again and has to be restored before. Anyway in this
+ example this task is never restored and invoked again as Don Corleone never asks for the
+ next favor if the first one was refused.
+
+*)
+FUNCTION_BLOCK AskForTheFavor_Task EXTENDS TcoCore.TcoTask
+VAR_INPUT
+(*
+ 'Parameters' of this task are assigned in this example from 'outside' from the
+ 'upper level' of the hierarchy, where Invoke() method is triggered.
+*)
+ _Person_Requested : REFERENCE TO Person_Object;
+ _RequestedFavor : STRING;
+ _ReturnFavor : STRING;
+END_VAR
+//
+//--
+]]>
+
+
+// THIS part needs to be called cyclically.
+IF Execute() THEN
+ // First section: Action.
+ // Meet the right person and interpret the requirements so as a possible return favor.
+ _Person_Requested.RequestForTheFavor(_RequestedFavor,_ReturnFavor);
+ // Let the person requested to think carefully about the proposition.
+ _Person_Requested.ThinkCarefully();
+ // Second section: Termination condition for the expected behavior.
+ // In the case that the requested person is "smart" and "show the respect" to the
+ // 'TcoContext', task finishes in the 'DONE' state and process of the granted the
+ // return favor should be started.
+ DoneWhen(_Person_Requested.FavorIsGranted());
+ // Third section: Termination condition for the non-expected behavior.
+ // In the case that the requested person is so self-confident and refuse to grant
+ // the favor, task finishes in the 'ERROR' state and automatically the OnTaskError()
+ // method is triggered. In this method normally the value of the ReturnFavor is
+ // drammatically decreased OR changed to 'Nothing'. Anyway the requested person still
+ // have the possibility to grant the favor but under different condition, as he
+ // "had to do it the hard way".
+ ThrowWhen(_Person_Requested.FavorIsRefused());
+END_IF
+//
+//--
+]]>
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/Kill_Task.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/Kill_Task.TcPOU
new file mode 100644
index 000000000..40679091e
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/Kill_Task.TcPOU
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/ColorSequencer.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/ColorSequencer.TcPOU
new file mode 100644
index 000000000..f740cfa25
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/ColorSequencer.TcPOU
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the sequener. Custom code needs to be placed here. The sequencer is executed by call of InstanceName.Run() method.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main : BOOL
+]]>
+
+ = inoColors._luminosity) THEN
+ CompleteStep();
+ ELSE
+ RequestStep(500); // Luminosity is not where it should be; check again if the lights are on.
+ END_IF
+//--------------------------------------------
+END_IF;
+
+IF Step(800,
+ TRUE,
+ 'Complete sequence') THEN
+//--------------------------------------------
+ CompleteSequence(); // Returns to the first step (100) in the sequence.
+//--------------------------------------------
+END_IF;]]>
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/Color_Example.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/Color_Example.TcPOU
new file mode 100644
index 000000000..9ce783037
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/Color_Example.TcPOU
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the TcoContext. This is the entry point of any control logic that belongs to this context.
+ The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/stColors.TcDUT b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/stColors.TcDUT
new file mode 100644
index 000000000..3f1ae5766
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/stColors.TcDUT
@@ -0,0 +1,21 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/201/InvokingTasks.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/201/InvokingTasks.TcPOU
new file mode 100644
index 000000000..8a33828e7
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/201/InvokingTasks.TcPOU
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the TcoContext. This is the entry point of any control logic that belongs to this context.
+ The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main
+VAR_INST
+ ToHomeTemp:BOOL;
+ ToWorkTemp:BOOL;
+
+END_VAR]]>
+
+ ToHome,
+ outToWorkPos => ToWork
+);
+
+IF ToWork THEN
+ AtHome := FALSE;
+ _simTimer(IN:=TRUE,PT:= UINT_TO_TIME(_simTimerValue*4));
+ IF(_simTimer.Q) THEN
+ AtWork :=TRUE;
+ _simTimer(IN:=FALSE,PT:= UINT_TO_TIME(0));
+ Cylinder.Restore();
+ END_IF
+END_IF
+
+
+IF ToHome THEN
+ AtWork := FALSE;
+ _simTimer(IN:=TRUE,PT:= UINT_TO_TIME(_simTimerValue*4));
+ IF(_simTimer.Q) THEN
+ AtHome :=TRUE;
+ _simTimer(IN:=FALSE,PT:= UINT_TO_TIME(0));
+ Cylinder.Restore();
+ END_IF
+END_IF
+
+Cylinder.Service(); //enable manual control
+
+
+
+]]>
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/FastCounter.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/FastCounter.TcPOU
new file mode 100644
index 000000000..d45956b3d
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/FastCounter.TcPOU
@@ -0,0 +1,44 @@
+
+
+
+
+
+ Counter);
+ DoneWhen(Counter = 100);
+
+END_IF]]>
+
+
+
+
+ Restores this instance to the Ready state. Can be called explicitly or from within one of the restore mechanisms.
+
+ See also
+
+
+
+~*)
+METHOD Restore : ITcoRestorable]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/SlowCounter.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/SlowCounter.TcPOU
new file mode 100644
index 000000000..1ac11d678
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/SlowCounter.TcPOU
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+ Restores this instance to the Ready state. Can be called explicitly or from within one of the restore mechanisms.
+
+ See also
+
+
+
+~*)
+METHOD Restore : ITcoRestorable]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/TaskExecution.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/TaskExecution.TcPOU
new file mode 100644
index 000000000..f6fb034d2
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/TaskExecution.TcPOU
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the TcoContext. This is the entry point of any control logic that belongs to this context.
+ The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonGripper.TcIO b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonGripper.TcIO
new file mode 100644
index 000000000..83317e14c
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonGripper.TcIO
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonHorizontal.TcIO b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonHorizontal.TcIO
new file mode 100644
index 000000000..df31190cf
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonHorizontal.TcIO
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonVertical.TcIO b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonVertical.TcIO
new file mode 100644
index 000000000..a4abda00d
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonVertical.TcIO
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001.TcPOU
new file mode 100644
index 000000000..aab0c18db
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001.TcPOU
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the TcoContext. This is the entry point of any control logic that belongs to this context.
+ The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Components.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Components.TcPOU
new file mode 100644
index 000000000..ed2611ab8
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Components.TcPOU
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Sequencer.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Sequencer.TcPOU
new file mode 100644
index 000000000..df11087af
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Sequencer.TcPOU
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Main method of the sequener. Custom code needs to be placed here. The sequencer is executed by call of InstanceName.Run() method.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main : BOOL
+]]>
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPiston.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPiston.TcPOU
new file mode 100644
index 000000000..36d4625b8
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPiston.TcPOU
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Custom service (manual, maintenance) logic.
+ This method must be implemented in derived class.
+
+
+~*)
+METHOD PROTECTED ServiceMode
+]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPistonMoveTask.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPistonMoveTask.TcPOU
new file mode 100644
index 000000000..272a8515b
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPistonMoveTask.TcPOU
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/MAIN_PRG.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/MAIN_PRG.TcPOU
new file mode 100644
index 000000000..7a15ffda6
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/MAIN_PRG.TcPOU
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/TcOpenTutorial.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/TcOpenTutorial.TcPOU
new file mode 100644
index 000000000..cd6755f7c
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/TcOpenTutorial.TcPOU
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+ Main method of the TcoContext. This is the entry point of any control logic that belongs to this context.
+ The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly.
+ This method is abstract, and it must be overridden in derived block.
+
+
+~*)
+METHOD PROTECTED Main]]>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcAppExamples.plcproj b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcAppExamples.plcproj
new file mode 100644
index 000000000..0b4745253
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcAppExamples.plcproj
@@ -0,0 +1,2515 @@
+
+
+
+ 1.0.0.0
+ 2.0
+ {b8ce161a-872b-4092-b0f7-49898e4206a5}
+ True
+ true
+ true
+ false
+ PlcAppExamples
+ 3.1.4024.12
+ {53923bbf-941c-4a5a-82fb-3dbb5b0e7a0e}
+ {d999eaa9-0898-434c-8c1d-30dd1915b6a6}
+ {4affd3d4-be30-421f-8041-021e6f1ccca2}
+ {c33f8869-5174-4fd7-9b17-d319b0affe68}
+ {cedac463-324f-4973-969c-6ce54fca022d}
+ {fb853486-9367-48a7-b30f-ebadbaf333d6}
+ Vortex.Library
+ false
+ PlcAppExamples
+ 0.4.1.375
+ PlcAppExamples
+ PlcAppExamples
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+ true
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tc2_Standard, * (Beckhoff Automation GmbH)
+ Tc2_Standard
+
+
+ Tc2_System, * (Beckhoff Automation GmbH)
+ Tc2_System
+
+
+ Tc3_Module, * (Beckhoff Automation GmbH)
+ Tc3_Module
+
+
+ TcoCore, 0.4.1.375 (Vortex.Library)
+ TcoCore
+
+
+ TcoPneumatics, 0.4.1.375 (Vortex.Library)
+ TcoPneumatics
+
+
+
+
+ TcoCore, 0.4.1.375 (Vortex.Library)
+
+
+ TcoPneumatics, 0.4.1.375 (Vortex.Library)
+
+
+
+
+ Content
+
+
+
+
+
+
+
+ "<ProjectRoot>"
+
+ {192FAD59-8248-4824-A8DE-9177C94C195A}
+
+ "{192FAD59-8248-4824-A8DE-9177C94C195A}"
+
+
+
+ {246001F4-279D-43AC-B241-948EB31120E1}
+
+ "{246001F4-279D-43AC-B241-948EB31120E1}"
+
+
+ GlobalVisuImageFilePath
+ %APPLICATIONPATH%
+
+
+ {40450F57-0AA3-4216-96F3-5444ECB29763}
+
+ "{40450F57-0AA3-4216-96F3-5444ECB29763}"
+
+
+ ActiveVisuExtensionsLength
+ 0
+ ActiveVisuProfile
+ "IR0whWr8bwfwBwAAiD2qpQAAAABVAgAA37x72QAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDBUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgA0AC4ANwAFFlAAcgBvAGYAaQBsAGUARABhAHQAYQAGTHsAMQA2AGUANQA1AGIANgAwAC0ANwAwADQAMwAtADQAYQA2ADMALQBiADYANQBiAC0ANgAxADQANwAxADMAOAA3ADgAZAA0ADIAfQAHEkwAaQBiAHIAYQByAGkAZQBzAAhMewAzAGIAZgBkADUANAA1ADkALQBiADAANwBmAC0ANABkADYAZQAtAGEAZQAxAGEALQBhADgAMwAzADUANgBhADUANQAxADQAMgB9AAlMewA5AGMAOQA1ADgAOQA2ADgALQAyAGMAOAA1AC0ANAAxAGIAYgAtADgAOAA3ADEALQA4ADkANQBmAGYAMQBmAGUAZABlADEAYQB9AAoOVgBlAHIAcwBpAG8AbgALBmkAbgB0AAwKVQBzAGEAZwBlAA0KVABpAHQAbABlAA4aVgBpAHMAdQBFAGwAZQBtAE0AZQB0AGUAcgAPDkMAbwBtAHAAYQBuAHkAEAxTAHkAcwB0AGUAbQARElYAaQBzAHUARQBsAGUAbQBzABIwVgBpAHMAdQBFAGwAZQBtAHMAUwBwAGUAYwBpAGEAbABDAG8AbgB0AHIAbwBsAHMAEyhWAGkAcwB1AEUAbABlAG0AcwBXAGkAbgBDAG8AbgB0AHIAbwBsAHMAFCRWAGkAcwB1AEUAbABlAG0AVABlAHgAdABFAGQAaQB0AG8AcgAVIlYAaQBzAHUATgBhAHQAaQB2AGUAQwBvAG4AdAByAG8AbAAWFHYAaQBzAHUAaQBuAHAAdQB0AHMAFwxzAHkAcwB0AGUAbQAYGFYAaQBzAHUARQBsAGUAbQBCAGEAcwBlABkmRABlAHYAUABsAGEAYwBlAGgAbwBsAGQAZQByAHMAVQBzAGUAZAAaCGIAbwBvAGwAGyJQAGwAdQBnAGkAbgBDAG8AbgBzAHQAcgBhAGkAbgB0AHMAHEx7ADQAMwBkADUAMgBiAGMAZQAtADkANAAyAGMALQA0ADQAZAA3AC0AOQBlADkANAAtADEAYgBmAGQAZgAzADEAMABlADYAMwBjAH0AHRxBAHQATABlAGEAcwB0AFYAZQByAHMAaQBvAG4AHhRQAGwAdQBnAGkAbgBHAHUAaQBkAB8WUwB5AHMAdABlAG0ALgBHAHUAaQBkACBIYQBmAGMAZAA1ADQANAA2AC0ANAA5ADEANAAtADQAZgBlADcALQBiAGIANwA4AC0AOQBiAGYAZgBlAGIANwAwAGYAZAAxADcAIRRVAHAAZABhAHQAZQBJAG4AZgBvACJMewBiADAAMwAzADYANgBhADgALQBiADUAYwAwAC0ANABiADkAYQAtAGEAMAAwAGUALQBlAGIAOAA2ADAAMQAxADEAMAA0AGMAMwB9ACMOVQBwAGQAYQB0AGUAcwAkTHsAMQA4ADYAOABmAGYAYwA5AC0AZQA0AGYAYwAtADQANQAzADIALQBhAGMAMAA2AC0AMQBlADMAOQBiAGIANQA1ADcAYgA2ADkAfQAlTHsAYQA1AGIAZAA0ADgAYwAzAC0AMABkADEANwAtADQAMQBiADUALQBiADEANgA0AC0ANQBmAGMANgBhAGQAMgBiADkANgBiADcAfQAmFk8AYgBqAGUAYwB0AHMAVAB5AHAAZQAnVFUAcABkAGEAdABlAEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwARgBvAHIAQwBvAG4AdgBlAHIAdABpAGIAbABlAEwAaQBiAHIAYQByAGkAZQBzACgQTABpAGIAVABpAHQAbABlACkUTABpAGIAQwBvAG0AcABhAG4AeQAqHlUAcABkAGEAdABlAFAAcgBvAHYAaQBkAGUAcgBzACs4UwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAsEnYAaQBzAHUAZQBsAGUAbQBzAC1INgBjAGIAMQBjAGQAZQAxAC0AZAA1AGQAYwAtADQAYQAzAGIALQA5ADAANQA0AC0AMgAxAGYAYQA3ADUANgBhADMAZgBhADQALihJAG4AdABlAHIAZgBhAGMAZQBWAGUAcgBzAGkAbwBuAEkAbgBmAG8AL0x7AGMANgAxADEAZQA0ADAAMAAtADcAZgBiADkALQA0AGMAMwA1AC0AYgA5AGEAYwAtADQAZQAzADEANABiADUAOQA5ADYANAAzAH0AMBhNAGEAagBvAHIAVgBlAHIAcwBpAG8AbgAxGE0AaQBuAG8AcgBWAGUAcgBzAGkAbwBuADIMTABlAGcAYQBjAHkAMzBMAGEAbgBnAHUAYQBnAGUATQBvAGQAZQBsAFYAZQByAHMAaQBvAG4ASQBuAGYAbwA0MEwAbwBhAGQATABpAGIAcgBhAHIAaQBlAHMASQBuAHQAbwBQAHIAbwBqAGUAYwB0ADUaQwBvAG0AcABhAHQAaQBiAGkAbABpAHQAeQDQAAIaA9ADAS0E0AUGGgfQBwgaAUUHCQjQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtDtAPAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60BAAAA0A0BLRHQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0S0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAUAAAA0AwLrQIAAADQDQEtE9APAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAAAAAANAMC60CAAAA0A0BLRTQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0V0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtFtAPAS0X0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60EAAAA0A0BLRjQDwEtENAZGq0BRRscAdAAHBoCRR0LBAMAAAAFAAAADQAAAAAAAADQHh8tINAhIhoCRSMkAtAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAAAAANADAS0n0CgBLRHQKQEtENAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAQAAANADAS0n0CgBLRHQKQEtEJoqKwFFAAEC0AABLSzQAAEtF9AAHy0t0C4vGgPQMAutAQAAANAxC60XAAAA0DIarQDQMy8aA9AwC60CAAAA0DELrQMAAADQMhqtANA0Gq0A0DUarQA="
+
+
+ {29BD8D0C-3586-4548-BB48-497B9A01693F}
+
+ "{29BD8D0C-3586-4548-BB48-497B9A01693F}"
+
+ NamingConventions
+
+ "NamingConventions"
+
+ 105
+
+ "105"
+
+
+ stPrefix
+
+
+
+ 8
+
+ "8"
+
+
+ stPrefix
+
+
+
+ 9
+
+ "9"
+
+
+ stPrefix
+
+
+
+ 3
+
+ "3"
+
+
+ stPrefix
+
+
+
+ 4
+
+ "4"
+
+
+ stPrefix
+
+
+
+ 5
+
+ "5"
+
+
+ stPrefix
+
+
+
+ 6
+
+ "6"
+
+
+ stPrefix
+
+
+
+ 7
+
+ "7"
+
+
+ stPrefix
+
+
+
+ 29
+
+ "29"
+
+
+ stPrefix
+
+
+
+ 59
+
+ "59"
+
+
+ stPrefix
+
+
+
+ 107
+
+ "107"
+
+
+ stPrefix
+
+
+
+ 22
+
+ "22"
+
+
+ stPrefix
+
+
+
+ 30
+
+ "30"
+
+
+ stPrefix
+
+
+
+ 25
+
+ "25"
+
+
+ stPrefix
+
+
+
+ 35
+
+ "35"
+
+
+ stPrefix
+
+
+
+ 62
+
+ "62"
+
+
+ stPrefix
+
+
+
+ 55
+
+ "55"
+
+
+ stPrefix
+ _
+
+
+ 65
+
+ "65"
+
+
+ stPrefix
+
+
+
+ 108
+
+ "108"
+
+
+ stPrefix
+ I
+
+
+ 70
+
+ "70"
+
+
+ stPrefix
+
+
+
+ 34
+
+ "34"
+
+
+ stPrefix
+
+
+
+ 54
+
+ "54"
+
+
+ stPrefix
+ _
+
+
+ 121
+
+ "121"
+
+
+ stPrefix
+
+
+
+ 151
+
+ "151"
+
+
+ stPrefix
+ st
+
+
+ 10
+
+ "10"
+
+
+ stPrefix
+
+
+
+ 102
+
+ "102"
+
+
+ stPrefix
+ prg
+
+
+ 18
+
+ "18"
+
+
+ stPrefix
+
+
+
+ 28
+
+ "28"
+
+
+ stPrefix
+
+
+
+ 123
+
+ "123"
+
+
+ stPrefix
+
+
+
+ 58
+
+ "58"
+
+
+ stPrefix
+
+
+
+ 61
+
+ "61"
+
+
+ stPrefix
+
+
+
+ 11
+
+ "11"
+
+
+ stPrefix
+
+
+
+ 21
+
+ "21"
+
+
+ stPrefix
+
+
+
+ 14
+
+ "14"
+
+
+ stPrefix
+
+
+
+ 24
+
+ "24"
+
+
+ stPrefix
+
+
+
+ 17
+
+ "17"
+
+
+ stPrefix
+
+
+
+ 27
+
+ "27"
+
+
+ stPrefix
+
+
+
+ 37
+
+ "37"
+
+
+ stPrefix
+
+
+
+ 53
+
+ "53"
+
+
+ stPrefix
+
+
+
+ 57
+
+ "57"
+
+
+ stPrefix
+
+
+
+ 73
+
+ "73"
+
+
+ stPrefix
+
+
+
+ 122
+
+ "122"
+
+
+ stPrefix
+
+
+
+ 104
+
+ "104"
+
+
+ stPrefix
+ fc
+
+
+ 153
+
+ "153"
+
+
+ stPrefix
+ union
+
+
+ 12
+
+ "12"
+
+
+ stPrefix
+
+
+
+ 106
+
+ "106"
+
+
+ stPrefix
+
+
+
+ 32
+
+ "32"
+
+
+ stPrefix
+
+
+
+ 19
+
+ "19"
+
+
+ stPrefix
+
+
+
+ 103
+
+ "103"
+
+
+ stPrefix
+ fb
+
+
+ 33
+
+ "33"
+
+
+ stPrefix
+
+
+
+ 72
+
+ "72"
+
+
+ stPrefix
+
+
+
+ 152
+
+ "152"
+
+
+ stPrefix
+ enum
+
+
+ 64
+
+ "64"
+
+
+ stPrefix
+
+
+
+ 20
+
+ "20"
+
+
+ stPrefix
+
+
+
+ 13
+
+ "13"
+
+
+ stPrefix
+
+
+
+ 23
+
+ "23"
+
+
+ stPrefix
+
+
+
+ 16
+
+ "16"
+
+
+ stPrefix
+
+
+
+ 26
+
+ "26"
+
+
+ stPrefix
+
+
+
+ 36
+
+ "36"
+
+
+ stPrefix
+
+
+
+ 63
+
+ "63"
+
+
+ stPrefix
+
+
+
+ 56
+
+ "56"
+
+
+ stPrefix
+
+
+
+ 124
+
+ "124"
+
+
+ stPrefix
+
+
+
+ 154
+
+ "154"
+
+
+ stPrefix
+ alias
+
+
+ 31
+
+ "31"
+
+
+ stPrefix
+
+
+
+ 51
+
+ "51"
+
+
+ stPrefix
+
+
+
+ 15
+
+ "15"
+
+
+ stPrefix
+
+
+
+ 38
+
+ "38"
+
+
+ stPrefix
+
+
+
+ 71
+
+ "71"
+
+
+ stPrefix
+
+
+
+
+
+
+ Metrics
+
+ "Metrics"
+
+ 9b526466-3bbe-40a9-b5a5-1cfadd791459
+
+ "9b526466-3bbe-40a9-b5a5-1cfadd791459"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ e58378e8-a2fb-4a33-8013-8a91270388d0
+
+ "e58378e8-a2fb-4a33-8013-8a91270388d0"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 2ee16325-7a34-4109-82cd-e99144bdbf43
+
+ "2ee16325-7a34-4109-82cd-e99144bdbf43"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 2a5d0bd7-5767-43e1-92ab-90d924ade69e
+
+ "2a5d0bd7-5767-43e1-92ab-90d924ade69e"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ ca51b834-cb16-4517-8b02-4807ce263107
+
+ "ca51b834-cb16-4517-8b02-4807ce263107"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ aebdfc4d-fc4f-4fac-bf2e-22b603bc1880
+
+ "aebdfc4d-fc4f-4fac-bf2e-22b603bc1880"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ bb1ff1d3-b0bc-4909-9034-11d7c6edb61f
+
+ "bb1ff1d3-b0bc-4909-9034-11d7c6edb61f"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 3fb5ac29-8ac7-4ca4-863e-49c3c89643b9
+
+ "3fb5ac29-8ac7-4ca4-863e-49c3c89643b9"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ c4137578-73e0-4a9c-ad9c-7773a1cff401
+
+ "c4137578-73e0-4a9c-ad9c-7773a1cff401"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ daa3e89b-a727-4bc9-bd38-29afc6024f90
+
+ "daa3e89b-a727-4bc9-bd38-29afc6024f90"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ b42720b9-b152-4b52-ad89-630e0f5acab1
+
+ "b42720b9-b152-4b52-ad89-630e0f5acab1"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 0ade9a3b-311c-4293-bc26-bcf994cdbbdc
+
+ "0ade9a3b-311c-4293-bc26-bcf994cdbbdc"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 15c07c54-9586-460c-802f-b3b4a408e3c7
+
+ "15c07c54-9586-460c-802f-b3b4a408e3c7"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 19fab17a-876c-4a8d-9d74-3e5d92b63dc8
+
+ "19fab17a-876c-4a8d-9d74-3e5d92b63dc8"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 87b20586-90da-40d8-82ce-62a7dd0ba8af
+
+ "87b20586-90da-40d8-82ce-62a7dd0ba8af"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ c20d083b-41ea-4867-b762-015491579932
+
+ "c20d083b-41ea-4867-b762-015491579932"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 827ae15d-4cb9-4177-b870-6bea1db8ee44
+
+ "827ae15d-4cb9-4177-b870-6bea1db8ee44"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 1a004255-b771-48b6-aa33-ea35ce4d37ea
+
+ "1a004255-b771-48b6-aa33-ea35ce4d37ea"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 8360c2b5-e762-4cc0-935b-fb129cda1b4a
+
+ "8360c2b5-e762-4cc0-935b-fb129cda1b4a"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 40f104a2-99f0-486d-9c44-47e8c759ca07
+
+ "40f104a2-99f0-486d-9c44-47e8c759ca07"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ 62b98ef9-b4c6-4777-bc0a-29245bb8b9f3
+
+ "62b98ef9-b4c6-4777-bc0a-29245bb8b9f3"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 6c74d656-f35f-41b9-b449-eae882ed12fe
+
+ "6c74d656-f35f-41b9-b449-eae882ed12fe"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 0ba696f2-ce22-4330-931f-4ddd5c597896
+
+ "0ba696f2-ce22-4330-931f-4ddd5c597896"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 6549803a-9e82-4b28-aff1-2425cbec813b
+
+ "6549803a-9e82-4b28-aff1-2425cbec813b"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 6cb1bfb1-4d4a-43ed-96f4-cd0254fc33b5
+
+ "6cb1bfb1-4d4a-43ed-96f4-cd0254fc33b5"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ f6dd9a78-1e71-4d9c-9e61-394eb38f3809
+
+ "f6dd9a78-1e71-4d9c-9e61-394eb38f3809"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 571980c1-792d-4355-a9cb-4c3a8f254ab0
+
+ "571980c1-792d-4355-a9cb-4c3a8f254ab0"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+ eb349b41-54d8-47ed-ab7d-b5dbbc17709f
+
+ "eb349b41-54d8-47ed-ab7d-b5dbbc17709f"
+
+
+ stUpperLimit
+ ""
+ bActive
+ true
+ stLowerLimit
+ ""
+
+
+ 209f2982-bd60-4988-9cf9-9ff21cbf643f
+
+ "209f2982-bd60-4988-9cf9-9ff21cbf643f"
+
+
+ stUpperLimit
+ ""
+ bActive
+ false
+ stLowerLimit
+ ""
+
+
+
+
+
+ NamingConventionsSettings
+
+ "NamingConventionsSettings"
+
+
+ FirstCharUpperCase
+ False
+ CombineScopeWithDatatypePrefix
+ True
+ CombinedDataTypesRecursive
+ True
+
+
+ Rules
+
+ "Rules"
+
+ 35
+
+ "35"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 105
+
+ "105"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 63
+
+ "63"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 8
+
+ "8"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 9
+
+ "9"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 47
+
+ "47"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 1
+
+ "1"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 2
+
+ "2"
+
+
+ bWarning
+ True
+ bActive
+ True
+
+
+ 3
+
+ "3"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 4
+
+ "4"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 5
+
+ "5"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 6
+
+ "6"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 7
+
+ "7"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 29
+
+ "29"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 133
+
+ "133"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 163
+
+ "163"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 90
+
+ "90"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 118
+
+ "118"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 22
+
+ "22"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 148
+
+ "148"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 42
+
+ "42"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 167
+
+ "167"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 62
+
+ "62"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 55
+
+ "55"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 65
+
+ "65"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 75
+
+ "75"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 14
+
+ "14"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 140
+
+ "140"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 150
+
+ "150"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 114
+
+ "114"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 34
+
+ "34"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 162
+
+ "162"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 13
+
+ "13"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 54
+
+ "54"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 121
+
+ "121"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 66
+
+ "66"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 41
+
+ "41"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 125
+
+ "125"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 60
+
+ "60"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 72
+
+ "72"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 112
+
+ "112"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 81
+
+ "81"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 102
+
+ "102"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 18
+
+ "18"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 132
+
+ "132"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 123
+
+ "123"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 28
+
+ "28"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 58
+
+ "58"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 78
+
+ "78"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 21
+
+ "21"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 61
+
+ "61"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 24
+
+ "24"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 17
+
+ "17"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 48
+
+ "48"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 37
+
+ "37"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 64
+
+ "64"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 57
+
+ "57"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 77
+
+ "77"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 100
+
+ "100"
+
+
+ bWarning
+ false
+ nUpperLimit
+ 1024
+ bActive
+ true
+
+
+ 130
+
+ "130"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 160
+
+ "160"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 27
+
+ "27"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 164
+
+ "164"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 119
+
+ "119"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 20
+
+ "20"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 111
+
+ "111"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 12
+
+ "12"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 115
+
+ "115"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 106
+
+ "106"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 145
+
+ "145"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 19
+
+ "19"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 166
+
+ "166"
+
+
+ MaxInOuts
+ 10
+ MaxOutputs
+ 10
+ bWarning
+ false
+ bActive
+ false
+ MaxInputs
+ 10
+
+
+ 56
+
+ "56"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 52
+
+ "52"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 16
+
+ "16"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 39
+
+ "39"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 103
+
+ "103"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 80
+
+ "80"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 44
+
+ "44"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 122
+
+ "122"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 113
+
+ "113"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 59
+
+ "59"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 10
+
+ "10"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 95
+
+ "95"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 117
+
+ "117"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 40
+
+ "40"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 33
+
+ "33"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 26
+
+ "26"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 36
+
+ "36"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 46
+
+ "46"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 73
+
+ "73"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 25
+
+ "25"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 76
+
+ "76"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 53
+
+ "53"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 107
+
+ "107"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 32
+
+ "32"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 120
+
+ "120"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 11
+
+ "11"
+
+
+ bWarning
+ True
+ bActive
+ True
+
+
+ 124
+
+ "124"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 147
+
+ "147"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 31
+
+ "31"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 134
+
+ "134"
+
+
+ bWarning
+ False
+ bActive
+ False
+
+
+ 23
+
+ "23"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 51
+
+ "51"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 15
+
+ "15"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 38
+
+ "38"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 101
+
+ "101"
+
+
+ MinChars
+ 5
+ bWarning
+ false
+ bActive
+ false
+ MaxChars
+ 30
+ Exceptions
+ ""
+
+
+ 43
+
+ "43"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 131
+
+ "131"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+ 161
+
+ "161"
+
+
+ bWarning
+ False
+ bActive
+ True
+
+
+
+
+
+
+
+ SuppressedKeywords
+ ""
+ PerformStaticAnalyse
+ false
+
+
+ {F66C7017-BDD8-4114-926C-81D6D687E35F}
+
+ "{F66C7017-BDD8-4114-926C-81D6D687E35F}"
+
+
+
+
+
+
+
+
+ System.Boolean
+ System.Collections.Hashtable
+ System.Int32
+ {54dd0eac-a6d8-46f2-8c27-2f43c7e49861}
+ System.String
+
+
+
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcTask.TcTTO b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcTask.TcTTO
new file mode 100644
index 000000000..dc4eda1f1
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcTask.TcTTO
@@ -0,0 +1,19 @@
+
+
+
+
+ 10000
+ 20
+
+ MAIN_PRG
+
+
+ NF_MAIN
+
+ {e557b9b0-3001-4008-a7af-d682a779cf91}
+ {129f6b36-ba32-4c3d-a496-c52c4ff229d9}
+ {54748c74-33ba-429a-8c51-95fd48d5a95d}
+ {fd9f6efa-6fa4-4031-95d9-bc0108d1ad2b}
+ {d7aeb3c5-f5dd-49e9-a238-ae115fef391c}
+
+
\ No newline at end of file
diff --git a/src/TcoApplicationExamples/XaeAppExamples/XaeAppExamples.tsproj b/src/TcoApplicationExamples/XaeAppExamples/XaeAppExamples.tsproj
new file mode 100644
index 000000000..e39b9813d
--- /dev/null
+++ b/src/TcoApplicationExamples/XaeAppExamples/XaeAppExamples.tsproj
@@ -0,0 +1,59 @@
+
+
+
+
+ ARRAY [0..15] OF BOOL
+ 128
+ BOOL
+
+ 0
+ 16
+
+
+
+
+
+
+
+ PlcTask
+
+
+
+
+
+
+ PlcAppExamples Instance
+ {08500001-0000-0000-F000-000000000064}
+
+ PlcTask Inputs
+
+ ST_01_IO.INs
+ ARRAY [0..15] OF BOOL
+
+
+
+ PlcTask Outputs
+
+ ST_01_IO.OUTs
+ ARRAY [0..15] OF BOOL
+
+
+
+
+ 0
+ PlcTask
+
+ #x02010030
+
+ 20
+ 10000000
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TcoApplicationExamples/runbuild.ps1 b/src/TcoApplicationExamples/runbuild.ps1
new file mode 100644
index 000000000..df8d727c7
--- /dev/null
+++ b/src/TcoApplicationExamples/runbuild.ps1
@@ -0,0 +1 @@
+..\..\_Vortex\builder\vortex.compiler.console.exe -s .\TcoApplicationExamples.slnf
\ No newline at end of file
diff --git a/src/TcoCore/TcoCore.slnf b/src/TcoCore/TcoCore.slnf
index 72fcfc4e7..b4a090264 100644
--- a/src/TcoCore/TcoCore.slnf
+++ b/src/TcoCore/TcoCore.slnf
@@ -6,9 +6,10 @@
"src\\TcoCore\\src\\TcoCoreConnector\\TcoCoreConnector.csproj",
"src\\TcoCore\\src\\XaeTcoCore\\XaeTcoCore.tsproj",
"src\\TcoCore\\tests\\TcoCore.Sandbox.Wpf\\TcoCore.Sandbox.Wpf.csproj",
+ "src\\TcoCore\\tests\\TcoCoreExamplesConnector\\TcoCoreExamplesConnector.csproj",
"src\\TcoCore\\tests\\TcoCoreTestsConnector\\TcoCoreTestsConnector.csproj",
"src\\TcoCore\\tests\\TcoCoreUnitTests\\TcoCoreUnitTests.csproj",
- "src\\TcoCore\\tests\\TcoTestRunners\\TcoTestRunners.csproj"
+ "src\\TcoCore\\tests\\TcoTestRunners\\TcoTestRunners.csproj"
]
}
}
\ No newline at end of file
diff --git a/src/TcoPneumatics/src/TcoPneumatics.Wpf/Cyclinders/Converters/ActuatorToBrushConverter.cs b/src/TcoCore/src/TcoCore.Wpf/Converters/BooleanToVisibilityConverter.cs
similarity index 63%
rename from src/TcoPneumatics/src/TcoPneumatics.Wpf/Cyclinders/Converters/ActuatorToBrushConverter.cs
rename to src/TcoCore/src/TcoCore.Wpf/Converters/BooleanToVisibilityConverter.cs
index fe55109e5..27fc7f2c1 100644
--- a/src/TcoPneumatics/src/TcoPneumatics.Wpf/Cyclinders/Converters/ActuatorToBrushConverter.cs
+++ b/src/TcoCore/src/TcoCore.Wpf/Converters/BooleanToVisibilityConverter.cs
@@ -1,28 +1,32 @@
using System;
using System.Globalization;
using System.Linq;
+using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
-namespace TcOpen
+namespace TcoCore
{
- public class ActuatorToBrushConverter : MarkupExtension, IValueConverter
+ public class BooleanToVisibilityConverter : MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
try
{
- return (bool)value ? Vortex.Presentation.Styling.Wpf.VortexResources.Accent : Vortex.Presentation.Styling.Wpf.VortexResources.Secondary;
+ var @is = (bool)value;
+ return @is ? Visibility.Visible : Visibility.Collapsed;
}
catch (Exception)
{
- return Vortex.Presentation.Styling.Wpf.VortexResources.Alert;
+ //!Swallow
}
+
+ return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
- return value;
+ return null;
}
public override object ProvideValue(IServiceProvider serviceProvider)
diff --git a/src/TcoCore/src/TcoCore.Wpf/Converters/CountToVisibilityConverter.cs b/src/TcoCore/src/TcoCore.Wpf/Converters/CountToVisibilityConverter.cs
new file mode 100644
index 000000000..47427be61
--- /dev/null
+++ b/src/TcoCore/src/TcoCore.Wpf/Converters/CountToVisibilityConverter.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Windows;
+using System.Windows.Data;
+using System.Windows.Markup;
+
+namespace TcoCore
+{
+ public class CountToVisibilityConverter : MarkupExtension, IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ var list = value as IEnumerable