From de7b036b773612bef52f43fb0349ba0c308e817d Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Wed, 12 May 2021 17:30:12 +0200 Subject: [PATCH] Merge due to GitVersion calc (#65) * some more comments to corleone context/identity example * sequencer example moved to 'Sequencer' folder * Object tree viewer moved to TcoCore.Wpf library Examples visulized with object tree viewer * Object tree viewer moved to TcoCore.Wpf library Examples visulized with object tree viewer * (examples) sequencers have separate instances of components * (examples) sequencers have not shared instances of components * Links to code examples research * merged with remote * test publish in trx format * #17 TcoSequencer.Step method protected, OnSequencerError() Sequencer.Reset() => Sequencer.Restore() * TcoTask API docu, eTaskState refactoring, all tests passed, some comments in the test needs to be checked to fullfill the refatored values of the etskState. * TcoTask._taskState=> Readonly * TcoTask Enabled property added * #12 Each object has its own messeger; post method for each main category, activ/inactive flag; unit tests * TcoMessenger performance tests * packages update 1.9.6-nightly.260 * Time sync research * fix after update to 1.9.4-nightly.260, implementation of missing GetKids member in manually created IVortexObject wrapper (DynamicTreeView) * fixed binding exception on 'TcoContextView' * RTC * TcoRTC + tests, Messenger tests timestamp modification * TcoRtc + tests * small cleanup in messenger test instance * Output text logs to xml * TcoRtc - Clock PRG removed, Update method implementation moved to TcoRtc FB * rtc refactoring - start @TomKovac continues * task example started, not finished yet * TcoRtc diff in _messenger.Mime.Timestamp issue * Messanger performence tests commented out due to Rtc issues~ * Rtc my fucking last attempt to solve this fucking issue * minor clup * before modyfying T801-T812 tests * Messenger tests-added cyclicall call of the rtcupdate * test publishing * messaging feature and compatibility aligment * task example * solving compatibility issues VortexCore * before sync * #12 cont. messaging * before restorer added * restorer added + rtc issues * get ready for nuget publish on TcOpenGroup config * generated meta file removed from tracking * removes generate and meta, fixed an issue with TcoCoreExamples slnf (missing project) * add missing files to nuget TcoCore * #23 net5.0 platform added, test projects kept on net48 * build script improvements git version bump 0.4.0 * Changeable restorer removed * package updates v1.10.0+ * TcoTaskExample added, also into the documentation * prevent nre on missing context in messenger * #36 method EqualsTo added to TcoObject * removed super^ in TcoObject (some refactoring problem in tc3?) * minor refac * Fixed wording in documentation Fixed wording in documentation of TcoObject.EqualsTo() * Update TcoObjectTest.TcPOU * remote nuget publishing at this point to prevent build and publish on each change in the PR Inxon/dev -> TcOpenGroup/dev * #38 In addition to A.EqualsTo(B), B.EqualsTo(A) test case added. * ignore .vscode folder * #28 sStepforward, stepbackward restore call after reaching done state * readme prior to PR to TcOpenGroup * + repo structure description start * #39 Invoke returns new ITcoTaskStatus interface + refactoring * #41 add implementation and tests for messaging MinLevel, Suspend, Resume. * additions to TcoContex, Messaging, TcoObject API documentation, * Minor additions to TcoObject, TcoTask API documentation * TcoSequencer, unexpected OnStateChange method call after changing from step mode to cyclic mode issue solved * removed webinar submodule * remove webinar reference from the solution file * station example * Display in the render tree in the order they occur and do not render ignored ones. * Hiding implementation TcoCore.TcoSequencer #32 and TcoCore.TcoState #33 * TcoCequencer min max step id number * TcoCore.TcoSequencer RequestStep is already able to jump to very first step of the sequence so as to stepId 0 * Min / max StepId changed to constants, RequestStep change _currentStep.Status to Done #55 * Cleanup tree, and display selected item from tree in renderable content control * Remove unnecessary code * asp * Implemention of UI dispatcher for calls arising from different threads. Implementation of ICommand (CanExecute()) in TcoCore.TcoTask * - fixing documentation comment * synch with dev * docu sequencer * TcoSequencer Invalid mode tests * asp * WIP * asp * #53 Use enum instead of boolean for sequencer constructor. * An attempt to removed LineIds * Removed line ids * Leftover lineids * Changed the summary for the enum * asp * WIP * Make the startup sequence more user friendly * Added sequencer view * wip * simple sequence wip * TcoContext OnEntry OnExit tests added * Solved isssue when on calling Restore() method inside OnStateChange() causes pagefault #29 * Initial implementation of ITcoServiceable in TcoComponent. Allows to tell tasks of the component that in service mode active and tasks can be invoked remotely (HMI/SCADA) * Color examples 101 and Connecting sequences 201 * 301 - Invoking tasks to run sequences. * #66 Implementation of public member TcoSequencer.CurrentStep * #66 api documentation comments * asp * Update README.md * Update README.md * Task execution 302 * TcoCore.TcoComponent ServiceMode implementation added + unit tests #65 * Hiding _restoringSequence ~variable * wip * CurrentStep in not REFERENCE TO StepDetails https://github.com/TcOpenGroup/TcOpen/issues/24 * Added code from webinar replaced textblocks with markdown * Adds auto-renderable TcoObjectDiagnosticsView TcoObjectDiagnosticsViewModel will render on 'PresentationType' = 'Diagnostics' https://github.com/Inxton/TcOpen/issues/70 * Adds auto-renderable TcoContextDiagnosticsView TcoContextDiagnosticsViewModel will render on 'PresentationType' = 'Diagnostics' https://github.com/Inxton/TcOpen/issues/70 * diagnostics view usage * ++Adds auto-renderable TcoContextDiagnosticsView TcoContextDiagnosticsViewModel will render on 'PresentationType' = 'Diagnostics' https://github.com/Inxton/TcOpen/issues/70 * Get diagnostics from context * Autoupdate messages hotfix * remove MD * Update README.md * Update README.md * Update README.md * TcoTaskView, TcoObjectView -> TcoObjectControlView * package update inxton 1.10.0-nightly.436 * added package material design package * removed mahapp dependencies added noticies for new added depencencies * Update README.md * removed ivc script - replaced with modified behaviour of IVC CLI * minor to TaskView * + library tempate + script * Added RelayCommand Task can be aborted from GUI * Swallow an exception in the VisibleTaskStateConverter * library template + script * Update scaffoldnewlibrary.ps1 fixed a stupid logic mistake I made * Tests runners move to TcoCore + refactoring Arrange in .net - execute on plc task - assert in .net * library tempate script fix (not break but continue you silly boy) * basic scaffolding of TcoElements... digital sensor * Scaffolding TcoDrivesBeckhoff + build scripts updates * DI monitoring propreties attributes * Refactor fbCylinder to Cylinder * #40 Add cylinder info messages. * remove beckhof drive testing (missing hw) * solving merge issues - drive does not build in pipeline * version bump * #40 redesigned cylinder view fixed typo cyclinder :) * fixed an issue with duplicate assembly info and missing namespace imports for assembly attributes * #39 Simple digital signal UI * running rabbit * running rabbit killed while running * ()()()()() - next time ammend ()()()()() * + DigitalActuator + DigitalSensor components + tests * various build fixied * rebuild the complete solution * Use material colors * Fixed regarding material design dependency. * Naming refactoring: TcoDi and TcoDo instead of TcoDigitalSignal and TcoDigitalActuator * - build and test fixies * Update README.md * Update README.md * Update README.md * Components use outside TcOpenFramework/minor fixies to Cylinder component (#54) * Fixed returns from taks method (ITcoTask to ITcoTaskStatus) * Non framework context block for compnents use outside TcOpen framework. Fixed fbPiston in test examples. * fixed layout of piston component * Additions to Non framework use of components * Workaround an issue when at startup the connector may deadlock if batched operations are started prior to R/W loop operations are propertly initiated. Reported to Inxton core team as FOXTROTH #564 * fixed some typos * Added tasks to TcoDi/TcoDo for serviceablity, Update/refactor WPF UI components * line IDs removal from some blocks * exising line ids removed from everywhere I could find it Co-authored-by: PTKu * Stringbuilder using fleunt interface (#51) * #37 Implementation of StringBuilder * Unit tests for stringbuilder Co-authored-by: Jozef Chmelar ml Co-authored-by: Peter <61538034+PTKu@users.noreply.github.com> * Update README.md Removed build badge Azure will be replaced by gh actions * Test to setup Github Actions (#63) * Create main.yml * Update main.yml * Update main.yml Just a dummy edit, because I can't trigger the actions manually * Update main.yml * Use community version of msbuild Co-authored-by: Jozef Chmelar * Copy files in separate step. (#64) * Copy files in separate step. * Consolidate strings Display executing command by defualt Co-authored-by: Jozef Chmelar Co-authored-by: PTKu Co-authored-by: Tomas Kovac Co-authored-by: Jozef Chmelar Co-authored-by: MTS\peto.kurhajec Co-authored-by: TomKovac <61820360+TomKovac@users.noreply.github.com> Co-authored-by: Jokinko Co-authored-by: Gerhard Barteling <33071638+Barteling@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/development.md | 10 + .github/workflows/main.yml | 17 + .gitignore | 13 +- GitVersion.yml | 3 +- README.MD | 57 - README.md | 187 +- TcOpen.build.slnf | 24 +- TcOpen.plc.slnf | 13 +- TcOpen.sln | 1202 ++- _Vortex/builder/uvn.exe | Bin 8704 -> 8704 bytes assets/pics/build.png | Bin 0 -> 32480 bytes assets/pics/compile_profile.png | Bin 0 -> 1883 bytes assets/pics/environment.png | Bin 0 -> 44220 bytes notices.md | 79 + pipelines/azure-pipelines.yaml | 3 +- pipelines/build.ps1 | 181 +- pipelines/psake.psm1 | 1 + pipelines/runbuild.ps1 | 2 +- pipelines/tcobuildutils.psm1 | 36 + src/Tc.Prober/Tc.Prober.slnf | 11 + .../src/Tc.Prober/Assets/TcOpenLogo128.png | Bin 0 -> 3510 bytes .../src/Tc.Prober/Properties/AssemblyInfo.cs | 8 + .../src/Tc.Prober/Recorder/DummyRecorder.cs | 20 + .../src/Tc.Prober/Recorder/Graver.cs | 66 + .../src/Tc.Prober/Recorder/IRecorder.cs | 9 + .../InsufficientNumberOfFramesException.cs | 24 + .../src/Tc.Prober/Recorder/Player.cs | 72 + .../src/Tc.Prober/Recorder/RecordFrame.cs | 10 + .../src/Tc.Prober/Recorder/Recorder.cs | 36 + .../src/Tc.Prober/Recorder/RecorderBase.cs | 120 + .../Tc.Prober/Recorder/RecorderModeEnum.cs | 9 + .../src/Tc.Prober/Recorder/Recording.cs | 54 + src/Tc.Prober/src/Tc.Prober/Runners/Runner.cs | 93 + .../src/Tc.Prober/Runners/TaskRunners.cs | 42 + src/Tc.Prober/src/Tc.Prober/Tc.Prober.csproj | 29 + .../tests/PlcTcProberTestsConnector/Entry.cs | 10 + .../PlcTcProberTestsConnector.csproj | 29 + .../Properties/Localizations.Designer.cs | 63 + .../Properties/Localizations.resx | 120 + .../Tc.ProberTest/Properties/AssemblyInfo.cs | 38 + .../tests/Tc.ProberTest/RecorderTests.cs | 214 + .../Tc.ProberTest/Runners/RunnerTests.cs | 181 + .../Tc.ProberTest/Runners/TaskRunnersTests.cs | 75 + .../tests/Tc.ProberTest/Tc.ProberTest.csproj | 20 + .../output/shell/RecordAndReplayTest.json | 1 + .../output/shell/RecordTestStructureTest.json | 1 + .../output/shell/RunWithRecordingTest.json | 1 + .../PlcTcProberTests/GVLs/Tests.TcGVL | 10 + .../TcProber/PlcTcProberTests/POUs/MAIN.TcPOU | 13 + .../TcProber/PlcTcProberTests/PlcTask.TcTTO | 17 + .../PlcTcProberTests/PlcTcProberTests.plcproj | 2414 +++++ .../fbInheritanceLevel_1.TcPOU | 47 + .../fbInheritanceLevel_2.TcPOU | 23 + .../fbInheritanceLevel_3.TcPOU | 23 + .../fbInheritanceLevel_4.TcPOU | 23 + .../fbInheritanceLevel_5.TcPOU | 23 + .../nestedInheritance/fbRootLevelStruct.TcPOU | 48 + .../Runners/TestStructs/stAllTypes.TcDUT | 62 + .../Runners/fbBasicRunnerTests.TcPOU | 42 + .../Runners/fbRecorderRunnerTests.TcPOU | 31 + .../PlcTcProberTests/Runners/stRecorder.TcDUT | 11 + src/Tc.Prober/tests/TcProber/TcProber.tsproj | 34 + .../PlcAppExamplesConnector/Entry.cs | 18 + .../PlcAppExamplesConnector.csproj | 23 + .../Properties/Localizations.Designer.cs | 63 + .../Properties/Localizations.resx | 120 + .../TcoApplicationExamples.Wpf/App.xaml | 20 + .../TcoApplicationExamples.Wpf/App.xaml.cs | 55 + .../AssemblyInfo.cs | 16 + .../MainWindow.xaml | 109 + .../MainWindow.xaml.cs | 26 + .../NFComponentUse.xaml | 54 + .../NFComponentUse.xaml.cs | 28 + .../TcoApplicationExamples.Wpf.csproj | 72 + .../101_Color_sequencer/ColorExample101.xaml | 28 + .../ColorExample101.xaml.cs | 20 + .../Color_ExampleView.xaml | 61 + .../Color_ExampleView.xaml.cs | 56 + .../201_Invoking_tasks/InvokingTasks201.xaml | 32 + .../InvokingTasks201.xaml.cs | 15 + .../201_Invoking_tasks/InvokingTasksView.xaml | 28 + .../InvokingTasksView.xaml.cs | 21 + .../301_TaskExecution/TaskExecution301.xaml | 30 + .../TaskExecution301.xaml.cs | 15 + .../301_TaskExecution/TaskExecutionView.xaml | 49 + .../TaskExecutionView.xaml.cs | 20 + .../401_ConnectingDots/ConnectingDots401.xaml | 55 + .../ConnectingDots401.xaml.cs | 41 + .../401_ConnectingDots/Images/100-800.PNG | Bin 0 -> 62510 bytes .../401_ConnectingDots/Station001View.xaml | 39 + .../401_ConnectingDots/Station001View.xaml.cs | 66 + .../Tutorial/TcOpenTutorialView.xaml | 31 + .../Tutorial/TcOpenTutorialView.xaml.cs | 28 + .../assets/nfuse.PNG | Bin 0 -> 30317 bytes .../TcoApplicationExamples.Wpf/nfuse.PNG | Bin 0 -> 28632 bytes .../TcoApplicationExamples.slnf | 24 + .../CorleoneKids/Constanzia_Object.TcPOU | 14 + .../CorleoneKids/Frederico_Object.TcPOU | 13 + .../Context/CorleoneKids/Michael_Object.TcPOU | 14 + .../Context/CorleoneKids/Santino_Object.TcPOU | 16 + .../Context/CorleoneKids/Thomas_Object.TcPOU | 33 + .../POUs/Context/Leaves/AKid_Object.TcPOU | 10 + .../POUs/Context/VitoCorleone_Context.TcPOU | 161 + .../PlcAppExamples/POUs/MAIN_PRG.TcPOU | 18 + .../POUs/NonFrameworkUse/NF_Logic.TcPOU | 17 + .../POUs/NonFrameworkUse/NF_MAIN.TcPOU | 29 + .../POUs/Object/Horse_Object.TcPOU | 69 + .../POUs/Object/Killer_Object.TcPOU | 48 + .../POUs/Object/Person_Object.TcPOU | 92 + .../POUs/Object/Woltz_Object.TcPOU | 26 + .../MakeAnOfferThatCantBeRefused.TcPOU | 79 + .../POUs/Sequencer/ST_01_Automat.TcPOU | 140 + .../POUs/Sequencer/ST_01_Components.TcPOU | 17 + .../POUs/Sequencer/ST_01_Context.TcPOU | 44 + .../POUs/Sequencer/ST_01_Ground.TcPOU | 59 + .../POUs/Sequencer/ST_01_IO.TcGVL | 10 + .../POUs/Sequencer/fbAwait.TcPOU | 40 + .../POUs/Task/AskForTheFavor_Task.TcPOU | 75 + .../PlcAppExamples/POUs/Task/Kill_Task.TcPOU | 34 + .../101_Color_Sequencer/ColorSequencer.TcPOU | 114 + .../101_Color_Sequencer/Color_Example.TcPOU | 33 + .../101_Color_Sequencer/stColors.TcDUT | 21 + .../POUs/Tutorial/201/InvokingTasks.TcPOU | 81 + .../POUs/Tutorial/301/FastCounter.TcPOU | 44 + .../POUs/Tutorial/301/SlowCounter.TcPOU | 36 + .../POUs/Tutorial/301/TaskExecution.TcPOU | 30 + .../POUs/Tutorial/401/IPistonGripper.TcIO | 18 + .../POUs/Tutorial/401/IPistonHorizontal.TcIO | 18 + .../POUs/Tutorial/401/IPistonVertical.TcIO | 18 + .../POUs/Tutorial/401/POUs/Station001.TcPOU | 33 + .../401/POUs/Station001_Components.TcPOU | 75 + .../401/POUs/Station001_Sequencer.TcPOU | 161 + .../POUs/Tutorial/401/fbPiston.TcPOU | 126 + .../POUs/Tutorial/401/fbPistonMoveTask.TcPOU | 23 + .../POUs/Tutorial/MAIN_PRG.TcPOU | 18 + .../POUs/Tutorial/TcOpenTutorial.TcPOU | 37 + .../PlcAppExamples/PlcAppExamples.plcproj | 2515 +++++ .../PlcAppExamples/PlcTask.TcTTO | 19 + .../XaeAppExamples/XaeAppExamples.tsproj | 59 + src/TcoApplicationExamples/runbuild.ps1 | 1 + src/TcoCore/TcoCore.slnf | 3 +- .../BooleanToVisibilityConverter.cs} | 14 +- .../Converters/CountToVisibilityConverter.cs | 29 + .../EmptyStringToVisibilityConverter.cs | 28 + .../Converters/SignalToBrushConverter.cs | 38 + .../src/TcoCore.Wpf/Inxton.TcoCore.Wpf.csproj | 37 + .../DataTemplates/TreeItemTemplate.cs | 9 + .../DataTemplates/TreeItemTemplate.xaml | 15 + .../CustomTree/TreeElements/TreeItem.cs | 33 + .../CustomTree/TreeElements/TreeObject.cs | 22 +- .../ArraySymbolToHeaderConverter.cs | 0 .../DynamicTree/ChildDataTemplateSelector.cs | 0 .../DynamicTree/DataTemplates/Array.xaml | 0 .../DynamicTree/DataTemplates/ValueTag.cs | 9 + .../DynamicTree/DataTemplates/ValueTag.xaml | 2 +- .../DataTemplates/VortexObjectDataTemplate.cs | 25 +- .../VortexObjectDataTemplate.xaml | 5 +- .../DynamicTree/DynamicTreeView.xaml | 3 +- .../DynamicTree/DynamicTreeView.xaml.cs | 21 +- .../DynamicTree/VortexObjectWrapper.cs | 76 +- .../ObjectTreeViewer}/Extensions.cs | 0 .../ObservableContentControl.xaml | 10 + .../ObservableContentControl.xaml.cs | 42 + .../TcoCore.Wpf/Properties/AssemblyInfo.cs | 24 + .../Properties/Localization.Designer.cs | 234 + .../TcoCore.Wpf/Properties/Localization.resx | 177 + .../TcoCore.Wpf/Properties/_compatibilty.cs | 9 + .../Diagnostics/TcoContextDiagnostics.cs | 22 + .../TcoContext/TcoContextView.xaml | 59 + .../TcoContextView.xaml.cs} | 8 +- .../TcoContext/TcoContextViewModel.cs | 64 + .../src/TcoCore.Wpf/TcoCore.Wpf.csproj | 58 +- .../MessageCategoryToBrushConverter.cs | 62 + .../TcoCore.Wpf/TcoMessage/TcoDiagnostics.cs | 12 + .../TcoMessage/TcoDiagnosticsView.xaml | 159 + .../TcoMessage/TcoDiagnosticsView.xaml.cs | 108 + .../TcoMessage/TcoDiagnosticsViewModel.cs | 199 + .../TcoMessage/TcoMessengerView.xaml | 13 + .../TcoMessage/TcoMessengerView.xaml.cs | 28 + .../Diagnostics/TcoObjectDiagnostics.cs | 22 + .../TcoObject/TcoObjectControlView.xaml | 57 + .../TcoObject/TcoObjectControlView.xaml.cs | 30 + .../TcoCore.Wpf/TcoObject/TcoObjectView.xaml | 49 - ...wModel.cs => TcoObjectViewControlModel.cs} | 12 +- .../TcoSequencerModeControllerView.xaml | 34 + .../TcoSequencerModeControllerView.xaml.cs | 32 + .../TcoSequencerModeControllerViewModel.cs | 18 + .../TcoSequencer/TcoSequencerView.xaml | 26 + .../TcoSequencer/TcoSequencerView.xaml.cs | 15 + .../TcoSequencer/TcoSequencerViewModel.cs | 18 + .../TcoTask/TaskStateToBoolConverter.cs | 47 + .../TcoTask/TaskStateToProgressConverter.cs | 51 + .../TcoTask/TaskStateToVisibilityConverter.cs | 50 + .../src/TcoCore.Wpf/TcoTask/TcoTaskView.xaml | 42 +- .../TcoCore.Wpf/TcoTask/TcoTaskView.xaml.cs | 2 + .../TcoCore.Wpf/TcoTask/TcoTaskViewModel.cs | 51 +- .../TcoCore.Wpf/TcoTask/VisibleOnTaskState.cs | 35 + .../src/TcoCore.Wpf/Threading/Dispatcher.cs | 45 + .../ExcludeFromApiDocumentationAttribute.cs | 11 + .../IVortexObjectExtensions.cs | 18 +- .../TcoCoreConnector/Input/RelayCommand.cs | 28 + .../Inxton.TcoCoreConnector.csproj | 41 + src/TcoCore/src/TcoCoreConnector/Program.cs | 12 - .../Properties/AssemblyInfo.cs | 10 +- .../Properties/Localizations.Designer.cs | 99 + .../Properties/Localizations.resx | 63 + .../Properties/_compatibilty.cs | 9 + src/TcoCore/src/TcoCoreConnector/Tco.snk | Bin 0 -> 596 bytes .../TcoCoreConnector/TcoCoreConnector.csproj | 24 +- .../TcoCoreConnector/Threading/Dispatcher.cs | 57 + .../TcoCoreConnector/Threading/IDispatcher.cs | 20 + .../src/TcoCoreConnector/_generated/MAIN.g.cs | 284 - .../_generated/TcoComponent.g.cs | 175 - .../_generated/TcoContext.g.cs | 352 - .../TcoCoreConnector/_generated/TcoCore.g.cs | 268 - .../_generated/TcoMessage.g.cs | 623 -- .../_generated/TcoMessenger.g.cs | 610 -- .../_generated/TcoObject.g.cs | 352 - .../TcoCoreConnector/_generated/TcoState.g.cs | 368 - .../TcoCoreConnector/_generated/TcoTask.g.cs | 374 - .../_generated/eMessageCategory.g.cs | 86 - .../_generated/eTaskState.g.cs | 19 - .../src/TcoCoreConnector/_meta/TcoCore.json | 66 - .../src/TcoCoreConnector/_meta/TcoCore.lbz | 86 - .../src/TcoCoreConnector/_meta/version.info | 1 - .../pex/TcoContext/IsTcoContext.cs | 19 + .../pex/TcoContext/TcoContext.cs | 46 +- .../pex/TcoMessage/PlainTcoMessage.cs | 97 + .../pex/TcoMessage/TcoMessage.cs | 60 +- .../pex/TcoMessage/TcoMessenger.cs | 2 +- .../pex/TcoObject/IsTcoObject.cs | 14 + .../pex/TcoObject/TcoObject.cs | 36 +- .../pex/TcoSequencer/TcoSequencer.cs | 19 + .../TcoCoreConnector/pex/TcoTask/TcoTask.cs | 59 + .../pex/_internals_/ITestContext.cs | 12 + .../pex/_internals_/TcoContextTestRunners.cs | 65 + .../pex/_internals_/_internals_TcoContext.cs | 47 + .../src/XaeTcoCore/TcoCore/Class Diagram.TcCD | 679 -- .../TcoContextCompatibility.TcPOU | 29 + .../TcoContextNfCompatibility.TcPOU | 33 + .../src/XaeTcoCore/TcoCore/POUs/MAIN.TcPOU | 3 - .../TcoComponent/ITcoComponent.TcIO | 7 +- .../TcoComponent/ITcoServiceable.TcIO | 16 + .../TcoComponent/TcoComponent.TcPOU | 102 +- .../Prototypes/TcoContext/ITcoContext.TcIO | 12 + .../TcoContext/ITcoContextEnvironment.TcIO | 13 + .../Prototypes/TcoContext/TcoContext.TcPOU | 304 +- .../TcoContext/TcoContextEnvironment.TcPOU | 31 + .../Prototypes/TcoMessage/ITcoMessenger.TcIO | 27 +- .../TcoMessage/ITcoMessengerSettings.TcIO | 32 + .../Prototypes/TcoMessage/TcoMessage.TcDUT | 56 +- .../Prototypes/TcoMessage/TcoMessenger.TcPOU | 197 +- .../TcoMessage/TcoMessengerSettings.TcPOU | 117 + .../TcoMessage/eMessageCategory.TcDUT | 12 +- .../POUs/Prototypes/TcoObject/TcoObject.TcPOU | 179 +- .../TcoRestorable/ITcoObjectRestorer.TcIO | 31 + .../POUs/Prototypes/TcoRtc/ITcoRtc.TcIO | 39 + .../POUs/Prototypes/TcoRtc/RtcPrg.TcPOU | 283 + .../Prototypes/TcoRtc/RtcSynchParams.TcDUT | 14 + .../POUs/Prototypes/TcoRtc/TcoRtc.TcPOU | 138 + .../TcoSequencer/ITcoSequencer.TcIO | 59 +- .../ITcoSequencerModeController.TcIO | 65 + .../Prototypes/TcoSequencer/StepDetails.TcDUT | 85 + .../TcoSequencer/TcoSequencer.TcPOU | 1164 +++ .../TcoSequencerModeController.TcPOU | 278 + .../TcoSequencer/eSequencerError.TcDUT | 91 + .../TcoSequencer/eSequencerMode.TcDUT | 50 + .../Prototypes/TcoSequencer/eStepStatus.TcDUT | 69 + .../POUs/Prototypes/TcoState/ITcoState.TcIO | 29 +- .../POUs/Prototypes/TcoState/TcoState.TcPOU | 319 +- .../Prototypes/TcoState/TcoStateBase.TcPOU | 487 + .../TcoState/TcoStateExtendible.TcPOU | 21 + .../Prototypes/TcoState/eRestoreMode.TcDUT | 21 + .../POUs/Prototypes/TcoTask/ITcoTask.TcIO | 13 + .../Prototypes/TcoTask/ITcoTaskStatus.TcIO | 25 + .../TaskResult/F_AnyToUnionValue.TcDUT | 35 + .../TcoTask/TaskResult/TcoTaskResult.TcPOU | 213 + .../POUs/Prototypes/TcoTask/TcoTask.TcPOU | 561 +- .../POUs/Prototypes/TcoTask/eTaskState.TcDUT | 59 +- .../TestFixtures/_internals_TcoContext.TcPOU | 60 + .../_internals_TcoSequencer.TcPOU | 28 + .../POUs/Utilities/StringBuilder.TcPOU | 58 + .../src/XaeTcoCore/TcoCore/PlcTask.TcTTO | 3 +- .../src/XaeTcoCore/TcoCore/TcoCore.plcproj | 2430 ++++- .../TcoCore/TcoCore.plcproj.version.update | 255 - .../Examples/Components/IPistonGripper.TcIO | 18 + .../Components/IPistonHorizontal.TcIO | 18 + .../Examples/Components/IPistonVertical.TcIO | 18 + .../Examples/Components/fbPiston.TcPOU | 126 + .../Components/fbPistonMoveTask.TcPOU | 23 + .../Examples/EXAMPLES_PRG.TcPOU | 5 +- .../TcoContext/TcoContext_App_1.TcPOU | 100 +- .../TcoObject/TcoObject_Counter.TcPOU | 98 +- .../TcoState/TcoContext_App_2.TcPOU | 29 +- .../TcoTask/TcoTask_DownCounter.TcPOU | 49 +- .../Examples/Manipulator/MANIPULATOR.TcPOU | 8 +- .../Manipulator/fbManipulatorAutomat.TcPOU | 61 + .../Manipulator/fbManipulatorContext.TcPOU | 12 +- .../Manipulator/gMANIPULATOR_IO.TcGVL | 2 +- .../Examples/Station_001/Station001.TcPOU | 43 + .../Station_001/Station001_Components.TcPOU | 75 + .../Station_001/Station001_Sequencer.TcPOU | 157 + .../WaveForm/TcoContext_Waveform.TcPOU | 14 +- .../WaveForm/TcoObject_Waveform.TcPOU | 64 +- .../WaveForm/TcoState_WaveformSequence.TcPOU | 87 +- .../WaveForm/TcoTask_Transition.TcPOU | 72 +- .../Examples/WaveForm/WaveformPoint.TcDUT | 4 +- .../Examples/WaveForm/eTransitionType.TcDUT | 4 +- .../Examples/fbContext.TcPOU | 10 +- .../TcoCoreExamples/POUs/MAIN.TcPOU | 16 + .../XaeTcoCore/TcoCoreExamples/PlcTask.TcTTO | 17 + .../XaeTcoCore/TcoCoreExamples/PlcTask2.TcTTO | 16 + .../TcoCoreExamples/TcoCoreExamples.plcproj | 2468 +++++ .../Manipulator/Components/fbPiston.TcPOU | 74 - .../Components/fbPistonMoveTask.TcPOU | 30 - .../Manipulator/fbManipulatorAutomat.TcPOU | 81 - .../XaeTcoCore/TcoCoreTests/POUs/MAIN.TcPOU | 45 +- .../src/XaeTcoCore/TcoCoreTests/PlcTask.TcTTO | 22 - .../XaeTcoCore/TcoCoreTests/PlcTask1.TcTTO | 16 + .../TcoCoreTests/TcoCoreTests.plcproj | 2399 ++++- .../TcoCoreTests.plcproj.version.update | 275 - .../Tests/TcoComponent/TcoComponentTest.TcPOU | 113 + .../Tests/TcoComponent/_TcoComponent.TcPOU | 46 + .../Tests/TcoContext/TcoContextTest.TcPOU | 86 +- .../TcoContextMessagingPerf.TcPOU | 38 + .../TcoMessengerContextTest.TcPOU | 65 + .../TcoMessenger/TcoMessengerTests.TcPOU | 177 + .../EqualsOverride/TcoObjectEqualsTest.TcPOU | 66 + .../Tests/TcoObject/TcoObjectTest.TcPOU | 92 +- .../Tests/TcoRtc/TcoRtcTest.TcPOU | 91 + .../TcoSequencerAutoRestorableTest.TcPOU | 445 + .../TcoSequencerNonAutoRestorableTest.TcPOU | 435 + .../Tests/TcoSequencer/_TcoSequencer.TcPOU | 8612 +++++++++++++++++ .../TcoState/TcoStateAutoRestoreTest.TcPOU | 121 +- .../Tests/TcoState/TcoStateTest.TcPOU | 135 +- .../Tests/TcoTask/TcoTaskTest.TcPOU | 168 +- .../Tests/Utilities/StringBuilderTests.TcPOU | 59 + src/TcoCore/src/XaeTcoCore/XaeTcoCore.tsproj | 31 +- .../tests/TcoCore.Sandbox.Wpf/App.xaml | 19 +- .../tests/TcoCore.Sandbox.Wpf/App.xaml.cs | 7 +- .../tests/TcoCore.Sandbox.Wpf/AssemblyInfo.cs | 6 +- .../CustomTree/CustomTree.xaml | 40 - .../CustomTree/CustomTree.xaml.cs | 67 - .../CustomTree/CustomTreeViewModel.cs | 65 - .../DataTemplates/TreeGroupTemplate.cs | 46 - .../DataTemplates/TreeGroupTemplate.xaml | 65 - .../DataTemplates/TreeItemTemplate.cs | 29 - .../DataTemplates/TreeItemTemplate.xaml | 19 - .../CustomTree/DialogWindow.xaml | 20 - .../CustomTree/DialogWindow.xaml.cs | 29 - .../CustomTree/Persistence/TreeItemDTO.cs | 52 - .../CustomTree/TreeElements/TreeGroup.cs | 125 - .../CustomTree/TreeElements/TreeItem.cs | 43 - .../DragDrop/DragDropConsumer.cs | 20 - .../DragDrop/DragDropPublisher.cs | 37 - .../DragDrop/IDragConsumer.cs | 13 - .../DragDrop/IDraggable.cs | 20 - .../DynamicTree/DataTemplates/ValueTag.cs | 36 - .../Inxton.TcoCore.Sandbox.Wpf.csproj | 20 + .../tests/TcoCore.Sandbox.Wpf/MainWindow.xaml | 145 +- .../TcoCore.Sandbox.Wpf/MainWindow.xaml.cs | 8 +- .../TcoCore.Sandbox.Wpf.csproj | 8 +- .../tests/TcoCoreExamplesConnector/Entry.cs | 26 + .../Inxton.TcoCoreExamplesConnector.csproj | 23 + .../Properties/Localizations.Designer.cs | 63 + .../Properties/Localizations.resx | 120 + .../TcoCoreExamplesConnector.csproj | 23 + .../tests/TcoCoreTestsConnector/Entry.cs | 14 +- .../Inxton.TcoCoreTestsConnector.csproj | 26 + .../Properties/launchSettings.json | 7 + .../_generated/EXAMPLES_PRG.g.cs | 348 - .../_generated/MAIN.g.cs | 476 - .../_generated/MANIPULATOR.g.cs | 348 - .../_generated/TcoContextTest.g.cs | 742 -- .../_generated/TcoContext_App_1.g.cs | 1028 -- .../_generated/TcoContext_App_2.g.cs | 595 -- .../_generated/TcoContext_Waveform.g.cs | 348 - .../_generated/TcoCoreTests.g.cs | 463 - .../_generated/TcoObjectTest.g.cs | 855 -- .../_generated/TcoObject_Counter.g.cs | 1443 --- .../_generated/TcoObject_Waveform.g.cs | 900 -- .../_generated/TcoStateAutoRestoreTest.g.cs | 731 -- .../_generated/TcoStateTest.g.cs | 1144 --- .../_generated/TcoState_WaveformSequence.g.cs | 594 -- .../_generated/TcoTaskTest.g.cs | 1432 --- .../_generated/TcoTask_DownCounter.g.cs | 528 - .../_generated/TcoTask_Transition.g.cs | 1083 --- .../_generated/WaveformPoint.g.cs | 534 - .../_generated/eTransitionType.g.cs | 18 - .../_generated/fbContext.g.cs | 175 - .../_generated/fbManipulatorAutomat.g.cs | 367 - .../_generated/fbManipulatorContext.g.cs | 239 - .../_generated/fbPiston.g.cs | 547 -- .../_generated/fbPistonMoveTask.g.cs | 236 - .../_generated/gMANIPULATOR_IO.g.cs | 408 - .../_meta/TcoCoreTests.json | 150 - .../TcoCoreTestsConnector/_meta/version.info | 1 - .../pex/TcoContext/ITestTcoComponent.cs | 16 + .../TcoContext/ITestTcoMessengerContext.cs | 16 + .../ITestTcoSequencerAutoRestorable.cs | 18 + .../ITestTcoSequencerNonAutoRestorable.cs | 18 + .../pex/TcoContext/TcoComponentTest.cs | 12 + .../pex/TcoContext/TcoMessengerContextTest.cs | 12 + .../pex/TcoContext/TcoMessengerTests.cs | 23 + .../TcoSequencerAutoRestorableTest.cs | 12 + .../TcoSequencerNonAutoRestorableTest.cs | 12 + .../TcoCoreUnitTests/ConnectorFixture.cs | 16 +- .../Inxton.TcoCoreUnitTests.csproj | 19 + .../Properties/launchSettings.json | 10 + .../TcoCoreUnitTests/StringBuilderTests.cs | 103 + .../TcoCoreUnitTests/TcoComponentTests.cs | 326 + .../tests/TcoCoreUnitTests/TcoContextTests.cs | 276 +- .../TcoCoreUnitTests/TcoCoreUnitTests.csproj | 10 +- .../TcoCoreUnitTests/TcoMessengerTests.cs | 500 + .../tests/TcoCoreUnitTests/TcoObjectTests.cs | 125 +- .../tests/TcoCoreUnitTests/TcoRtcTests.cs | 279 + .../TcoSequencerAutoRestoreableTests.cs | 4456 +++++++++ .../TcoSequencerNonAutoRestoreableTests.cs | 4431 +++++++++ .../tests/TcoCoreUnitTests/TcoStateTests.cs | 490 +- .../tests/TcoCoreUnitTests/TcoTaskTests.cs | 1001 +- .../tests/TcoCoreUnitTests/TestRunners.cs | 221 + .../TcoCoreUnitTests/TestSetupFixture.cs | 27 +- .../Inxton.TcoTestRunners.csproj | 7 + src/TcoDrivesBeckhoff/TcoDrivesBeckhoff.slnf | 13 + .../src/TcoDrivesBeckhoff.Wpf/App.xaml | 9 + .../src/TcoDrivesBeckhoff.Wpf/App.xaml.cs | 17 + .../TcoDrivesBeckhoff.Wpf}/AssemblyInfo.cs | 8 +- .../src/TcoDrivesBeckhoff.Wpf/MainWindow.xaml | 12 + .../TcoDrivesBeckhoff.Wpf/MainWindow.xaml.cs | 28 + .../TcoDrivesBeckhoff.Wpf.csproj | 15 + .../src/TcoDrivesBeckhoffConnector/Entry.cs | 14 + .../Properties/AssemblyInfo.cs | 22 + .../Properties/Localizations.Designer.cs | 63 + .../Properties/Localizations.resx | 120 + .../TcoDrivesBeckhoffConnector.csproj | 24 + .../DUTs/TcoAxisOpModes.TcDUT | 21 + .../TcoDrivesBeckhoff/DUTs/TcoAxisRef.TcPOU | 10 + .../DUTs/TcoAxisStatus.TcDUT | 74 + .../TcoDrivesBeckhoff/DUTs/eAxisStates.TcDUT | 19 + .../TcoDrivesBeckhoff/DUTs/eDirection.TcDUT | 14 + .../DUTs/eEncoderReferenceMode.TcDUT | 17 + .../TcoDrivesBeckhoff/DUTs/eHomingMode.TcDUT | 14 + .../Tc2MC2_TO_Tco_AxisStates.TcPOU | 55 + .../Conversions/Tc2MC2_TO_Tco_Direction.TcPOU | 40 + .../Tc2MC2_TO_Tco_EncRefMode.TcPOU | 51 + .../Tc2MC2_TO_Tco_HomingMode.TcPOU | 35 + .../Tco_TO_Tc2MC2_AxisStates.TcPOU | 55 + .../Conversions/Tco_TO_Tc2MC2_Direction.TcPOU | 38 + .../Tco_TO_Tc2MC2_EncRefMode.TcPOU | 51 + .../Tco_TO_Tc2MC2_HomingMode.TcPOU | 35 + .../TcoDrivesBeckhoff/POUs/MAIN.TcPOU | 12 + .../TcoDriveSimple/AxisTasks/ResetTask.TcPOU | 82 + .../AxisTasks/SetPositionTask.TcPOU | 116 + .../AxisTasks/SoEResetTask.TcPOU | 84 + .../TcoDriveSimple/ITcoDriveSimple.TcIO | 14 + .../TcoDriveSimple/MotionTasks/HaltTask.TcPOU | 124 + .../TcoDriveSimple/MotionTasks/HomeTask.TcPOU | 142 + .../MotionTasks/MoveAbsoluteTask.TcPOU | 135 + .../MotionTasks/MoveModuloTask.TcPOU | 139 + .../MotionTasks/MoveRelativeTask.TcPOU | 135 + .../MotionTasks/MoveVelocityTask.TcPOU | 136 + .../TcoDriveSimple/MotionTasks/StopTask.TcPOU | 124 + .../TcoDriveSimple/TcoDriveSimple.TcPOU | 654 ++ .../TcoDrivesBeckhoff/PlcTask.TcTTO | 16 + .../TcoDrivesBeckhoff.plcproj | 2476 +++++ .../TcoDrivesBeckhoffTests/GVLs/GVL.TcGVL | 10 + .../TcoDrivesBeckhoffTests/POUs/MAIN.TcPOU | 13 + .../TcoDrivesBeckhoffTests/PlcTask1.TcTTO | 16 + .../TcoDrivesBeckhoffTests.plcproj | 2400 +++++ .../TcoDriveSimple/TcoDriveSimpleTest.TcPOU | 28 + .../TcoDrivesBeckhoffContext.TcPOU | 61 + .../XaeTcoDrivesBeckhoff.tsproj | 3970 ++++++++ .../TcoDrivesBeckhoff.Wpf.Sandbox/App.xaml | 9 + .../TcoDrivesBeckhoff.Wpf.Sandbox/App.xaml.cs | 17 + .../AssemblyInfo.cs | 16 + .../MainWindow.xaml | 12 + .../MainWindow.xaml.cs | 28 + .../TcoDrivesBeckhoff.Wpf.Sandbox.csproj | 15 + .../TcoDrivesBeckhoffTestsConnector/Entry.cs | 21 + .../Properties/Localizations.Designer.cs | 63 + .../Properties/Localizations.resx | 120 + .../TcoDrivesBeckhoffTestsConnector.csproj | 23 + .../ITestTcoDrivesBeckhoffContext.cs | 16 + .../TcoContext/TcoDrivesBeckhoffContext.cs | 12 + .../ConnectorFixture.cs | 38 + .../TcoDriveSimpleTests.cs | 94 + .../TcoDrivesBeckhoffUnitTests.csproj | 15 + .../TcoDrivesBeckhoffUnitTests/TestRunners.cs | 56 + .../TestSetupFixture.cs | 26 + src/TcoElements/TcoElements.slnf | 16 + .../src/TcoElementsConnector/Entry.cs | 17 + .../Properties/AssemblyInfo.cs | 7 + .../Properties/Localizations.Designer.cs | 81 + .../Properties/Localizations.resx | 126 + .../TcoElementsConnector.csproj | 32 + .../src/Wpf/TcoElements.Wpf/AssemblyInfo.cs | 21 + .../TcoDi/Service/TcoDiServiceView.xaml | 30 + .../TcoDi/Service/TcoDiServiceView.xaml.cs | 22 + .../Digital/TcoDiServiceView.xaml | 27 + .../Digital/TcoDiServiceView.xaml.cs | 22 + .../TcoDo/Service/TcoDoServiceView.xaml | 30 + .../TcoDo/Service/TcoDoServiceView.xaml.cs | 22 + .../TcoElements.Wpf/TcoElements.Wpf.csproj | 13 + .../_Sample/SampleComponentManualView.xaml | 46 + .../_Sample/SampleComponentManualView.xaml.cs | 28 + .../_Sample/fbSampleComponentManualView.xaml | 40 + .../fbSampleComponentManualView.xaml.cs | 28 + .../XAE/XAE/TcoElements/Digital/TcoDi.TcPOU | 140 + .../XAE/XAE/TcoElements/Digital/TcoDo.TcPOU | 173 + .../src/XAE/XAE/TcoElements/POUs/MAIN.TcPOU | 11 + .../TcoElements/POUs/fbSampleComponent.TcPOU | 129 + .../src/XAE/XAE/TcoElements/PlcTask.TcTTO | 16 + .../XAE/XAE/TcoElements/TcoElements.plcproj | 2385 +++++ .../XAE/XAE/TcoElementsTests/POUs/MAIN.TcPOU | 18 + .../XAE/XAE/TcoElementsTests/PlcTask.TcTTO | 16 + .../Sandbox/TcoElementsSandbox.TcPOU | 25 + .../TcoElementsTests/TcoElementsTests.plcproj | 2396 +++++ .../TcoElementsTests/Tests/TcoDiTests.TcPOU | 41 + .../TcoElementsTests/Tests/TcoDoTests.TcPOU | 50 + .../src/XAE/XAE/XAETcoElements.tsproj | 57 + src/TcoElements/tests/PlcUnitTests/TcoDi.cs | 70 + src/TcoElements/tests/PlcUnitTests/TcoDo.cs | 60 + .../PlcUnitTests/TcoElementsUnitTests.csproj | 18 + .../tests/Sandbox.TcoElements.Wpf/App.xaml | 19 + .../tests/Sandbox.TcoElements.Wpf/App.xaml.cs | 24 + .../Sandbox.TcoElements.Wpf/AssemblyInfo.cs | 15 + .../Sandbox.TcoElements.Wpf/MainWindow.xaml | 31 + .../MainWindow.xaml.cs | 29 + .../MainWindowViewModel.cs | 13 + .../Sandbox.TcoElements.Wpf.csproj | 12 + .../tests/TcoElementsTestsConnector/Entry.cs | 17 + .../Properties/Localizations.Designer.cs | 63 + .../Properties/Localizations.resx | 120 + .../TcoElementsTestsConnector.csproj | 29 + src/TcoElements/vortex_config.json | 31 + .../Inxton.TcoIoBeckhoff.Wpf.csproj | 24 + .../Properties/AssemblyInfo.cs | 6 +- .../TcoIoBeckhoff.Wpf.csproj | 19 +- .../src/TcoIoBeckhoffConnector/Entry.cs | 6 +- .../Inxton.TcoIoBeckhoffConnector.csproj | 39 + .../Properties/AssemblyInfo.cs | 6 +- .../Properties/Localizations.Designer.cs | 124 + .../TcoIoBeckhoffConnector.csproj | 15 +- .../_generated/AI_1_Module.g.cs | 482 - .../_generated/AI_Channel.g.cs | 423 - .../_generated/AI_ChannelStatus.g.cs | 284 - .../_generated/EL922x_ChannelBasic.g.cs | 424 - .../_generated/EL922x_ChannelExtended.g.cs | 692 -- .../_generated/FuseChannelBasic.g.cs | 348 - .../_generated/FuseChannelExtended.g.cs | 239 - .../_generated/FuseModuleEL922x.g.cs | 284 - .../_generated/Global_Version.g.cs | 284 - .../TcoIoBeckhoffConnector/_generated/IO.g.cs | 540 -- .../_generated/InfoData.g.cs | 353 - .../_generated/OutputStruct.g.cs | 284 - .../_generated/StatusStructBasic.g.cs | 284 - .../_generated/StatusStructExtended.g.cs | 284 - .../_generated/TcoIoBeckhoff.g.cs | 333 - .../_generated/WcState.g.cs | 422 - .../_meta/TcoIoBeckhoff.json | 96 - .../_meta/TcoIoBeckhoff.lbz | 102 - .../TcoIoBeckhoffConnector/_meta/version.info | 1 - .../Modules/EL922x/FBs/FuseChannelBasic.TcPOU | 41 +- .../EL922x/FBs/FuseChannelExtended.TcPOU | 32 +- .../Modules/EL922x/FBs/FuseModuleEL922x.TcPOU | 9 +- .../TcoIoBeckhoff/TcoIoBeckhoff.plcproj | 2260 ++++- .../TcoIoBeckhoff.plcproj.version.update | 238 - .../XaeTcoIoBeckhoff/XaeTcoIoBeckhoff.tsproj | 4 +- .../PlcOpen.Wpf.Sandbox/AssemblyInfo.cs | 6 +- .../Cyclinders/fbCylinderManualView.xaml | 45 - .../Converters/ActuatorToBrushConverter.cs | 48 + .../Converters/SensorToBrushConverter.cs | 5 +- .../Cylinders/CylinderMainView.xaml | 74 + .../Cylinders/CylinderMainView.xaml.cs | 28 + .../Cylinders/CylinderManualView.xaml | 33 + .../CylinderManualView.xaml.cs} | 4 +- .../CylinderViewModel.cs} | 8 +- .../Inxton.TcoPneumatics.Wpf.csproj | 25 + .../Properties/AssemblyInfo.cs | 6 +- .../TcoPneumatics.Wpf.csproj | 19 +- .../Inxton.TcoPneumaticsConnector.csproj | 37 + .../Properties/AssemblyInfo.cs | 6 +- .../Properties/Localizations.resx | 27 + .../TcoPneumaticsConnector.csproj | 17 +- .../_generated/Global_Version.g.cs | 284 - .../_generated/TcoPneumatics.g.cs | 268 - .../_generated/fbCylinder.g.cs | 706 -- .../TcoPneumaticsConnector/_meta/TcOpen.json | 108 - .../_meta/TcoPneumatics.json | 18 - .../_meta/TcoPneumatics.lbz | 20 - .../TcoPneumaticsConnector/_meta/version.info | 1 - .../{fbCyclinder.cs => Cyclinder.cs} | 2 +- .../{fbCylinder.TcPOU => Cylinder.TcPOU} | 50 +- .../POUs/Cylinders/ICylinder.TcIO | 4 +- .../TcOpen.plcproj.version.update | 142 - .../TcoPneumatics/TcoPneumatics.plcproj | 2268 ++++- .../TcoPneumatics.plcproj.version.update | 196 - .../POUs/DefaultContext.TcPOU | 15 +- .../TcoPneumaticsTests/POUs/MAIN.TcPOU | 3 - .../TcoPneumaticsTests.plcproj | 2256 ++++- .../TcoPneumaticsTests.plcproj.version.update | 200 - .../Sandbox/PlcOpen.Wpf.Sandbox/App.xaml | 9 +- .../PlcOpen.Wpf.Sandbox/AssemblyInfo.cs | 6 +- .../PlcOpen.Wpf.Sandbox/MainWindow.xaml | 7 +- .../TcoPneumatics.Wpf.Sandbox.csproj | 4 +- .../TcoPneumaticsTestsConnector/Entry.cs | 13 +- .../Properties/AssemblyInfo.cs | 6 +- .../TcoPneumaticsTestsConnector.csproj | 2 +- .../_generated/DefaultContext.g.cs | 431 - .../_generated/IO.g.cs | 408 - .../_generated/MAIN.g.cs | 348 - .../_generated/TcoPneumaticsTests.g.cs | 333 - .../_meta/TcOpen.json | 108 - .../_meta/TcoPneumatics.json | 108 - .../_meta/TcoPneumatics.lbz | 117 - .../_meta/TcoPneumaticsTests.json | 24 - .../_meta/TcoPneumaticsTests.lbz | 29 - .../_meta/version.info | 1 - .../{fbCylinderTests.cs => CylinderTests.cs} | 4 +- .../TcoPneumaticsTests_nUnit.csproj | 6 +- .../TestSetupFixture.cs | 26 +- src/librarytemplate/PlcTemplate.slnf | 13 + src/librarytemplate/scaffoldnewlibrary.ps1 | 108 + .../src/PlcTemplateConnector/Entry.cs | 17 + .../PlcTemplateConnector.csproj | 32 + .../Properties/AssemblyInfo.cs | 7 + .../Properties/Localizations.Designer.cs | 63 + .../Properties/Localizations.resx | 120 + .../src/Wpf/PlcTemplate.Wpf/AssemblyInfo.cs | 21 + .../PlcTemplate.Wpf/PlcTemplate.Wpf.csproj | 14 + .../_Sample/SampleComponentManualView.xaml | 43 + .../_Sample/SampleComponentManualView.xaml.cs | 28 + .../_Sample/fbSampleComponentManualView.xaml | 43 + .../fbSampleComponentManualView.xaml.cs | 28 + .../src/XAE/XAE/PlcTemplate/POUs/MAIN.TcPOU | 13 + .../SampleComponent/SampleComponent.TcPOU | 150 + .../SampleTaskFunctionBuffer.TcDUT | 12 + .../SampleComponent/SampleTaskIteration.TcPOU | 55 + .../XAE/PlcTemplate/POUs/SampleContext.TcPOU | 28 + .../PlcTemplate/POUs/fbSampleComponent.TcPOU | 129 + .../src/XAE/XAE/PlcTemplate/PlcTask.TcTTO | 17 + .../XAE/XAE/PlcTemplate/PlcTemplate.plcproj | 2390 +++++ .../XAE/XAE/PlcTemplateTests/POUs/MAIN.TcPOU | 13 + .../POUs/SampleComponentTests.TcPOU | 44 + .../XAE/XAE/PlcTemplateTests/PlcTask.TcTTO | 17 + .../PlcTemplateTests/PlcTemplateTests.plcproj | 2390 +++++ .../src/XAE/XAE/XAEPlcTemplate.tsproj | 57 + .../tests/PlcTemplateTestsConnector/Entry.cs | 17 + .../PlcTemplateTestsConnector.csproj | 23 + .../Properties/Localizations.Designer.cs | 63 + .../Properties/Localizations.resx | 120 + .../PlcUnitTests/PlcTemplateUnitTests.csproj | 19 + .../tests/PlcUnitTests/UnitTest1.cs | 45 + .../tests/Sandbox.PlcTemplate.Wpf/App.xaml | 19 + .../tests/Sandbox.PlcTemplate.Wpf/App.xaml.cs | 23 + .../Sandbox.PlcTemplate.Wpf/AssemblyInfo.cs | 16 + .../Sandbox.PlcTemplate.Wpf/MainWindow.xaml | 25 + .../MainWindow.xaml.cs | 28 + .../MainWindowViewModel.cs | 20 + .../Sandbox.PlcTemplate.Wpf.csproj | 11 + vortex_config.json | 4 +- 661 files changed, 82171 insertions(+), 35182 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/development.md create mode 100644 .github/workflows/main.yml delete mode 100644 README.MD create mode 100644 assets/pics/build.png create mode 100644 assets/pics/compile_profile.png create mode 100644 assets/pics/environment.png create mode 100644 src/Tc.Prober/Tc.Prober.slnf create mode 100644 src/Tc.Prober/src/Tc.Prober/Assets/TcOpenLogo128.png create mode 100644 src/Tc.Prober/src/Tc.Prober/Properties/AssemblyInfo.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/DummyRecorder.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/Graver.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/IRecorder.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/InsufficientNumberOfFramesException.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/Player.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/RecordFrame.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/Recorder.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/RecorderBase.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/RecorderModeEnum.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Recorder/Recording.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Runners/Runner.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Runners/TaskRunners.cs create mode 100644 src/Tc.Prober/src/Tc.Prober/Tc.Prober.csproj create mode 100644 src/Tc.Prober/tests/PlcTcProberTestsConnector/Entry.cs create mode 100644 src/Tc.Prober/tests/PlcTcProberTestsConnector/PlcTcProberTestsConnector.csproj create mode 100644 src/Tc.Prober/tests/PlcTcProberTestsConnector/Properties/Localizations.Designer.cs create mode 100644 src/Tc.Prober/tests/PlcTcProberTestsConnector/Properties/Localizations.resx create mode 100644 src/Tc.Prober/tests/Tc.ProberTest/Properties/AssemblyInfo.cs create mode 100644 src/Tc.Prober/tests/Tc.ProberTest/RecorderTests.cs create mode 100644 src/Tc.Prober/tests/Tc.ProberTest/Runners/RunnerTests.cs create mode 100644 src/Tc.Prober/tests/Tc.ProberTest/Runners/TaskRunnersTests.cs create mode 100644 src/Tc.Prober/tests/Tc.ProberTest/Tc.ProberTest.csproj create mode 100644 src/Tc.Prober/tests/Tc.ProberTest/output/shell/RecordAndReplayTest.json create mode 100644 src/Tc.Prober/tests/Tc.ProberTest/output/shell/RecordTestStructureTest.json create mode 100644 src/Tc.Prober/tests/Tc.ProberTest/output/shell/RunWithRecordingTest.json create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/GVLs/Tests.TcGVL create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/POUs/MAIN.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/PlcTask.TcTTO create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/PlcTcProberTests.plcproj create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_1.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_2.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_3.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_4.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbInheritanceLevel_5.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/nestedInheritance/fbRootLevelStruct.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/TestStructs/stAllTypes.TcDUT create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/fbBasicRunnerTests.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/fbRecorderRunnerTests.TcPOU create mode 100644 src/Tc.Prober/tests/TcProber/PlcTcProberTests/Runners/stRecorder.TcDUT create mode 100644 src/Tc.Prober/tests/TcProber/TcProber.tsproj create mode 100644 src/TcoApplicationExamples/PlcAppExamplesConnector/Entry.cs create mode 100644 src/TcoApplicationExamples/PlcAppExamplesConnector/PlcAppExamplesConnector.csproj create mode 100644 src/TcoApplicationExamples/PlcAppExamplesConnector/Properties/Localizations.Designer.cs create mode 100644 src/TcoApplicationExamples/PlcAppExamplesConnector/Properties/Localizations.resx create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/App.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/App.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/AssemblyInfo.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/MainWindow.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/MainWindow.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/NonFrameworkComponentUse/NFComponentUse.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/NonFrameworkComponentUse/NFComponentUse.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/TcoApplicationExamples.Wpf.csproj create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/ColorExample101.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/ColorExample101.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/Color_ExampleView.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/101_Color_sequencer/Color_ExampleView.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasks201.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasks201.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasksView.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/201_Invoking_tasks/InvokingTasksView.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecution301.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecution301.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecutionView.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/301_TaskExecution/TaskExecutionView.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/ConnectingDots401.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/ConnectingDots401.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Images/100-800.PNG create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml.cs create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/assets/nfuse.PNG create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.Wpf/nfuse.PNG create mode 100644 src/TcoApplicationExamples/TcoApplicationExamples.slnf create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Constanzia_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Frederico_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Michael_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Santino_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Thomas_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/Leaves/AKid_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/VitoCorleone_Context.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/MAIN_PRG.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_Logic.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_MAIN.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Horse_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Killer_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Person_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Woltz_Object.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/MakeAnOfferThatCantBeRefused.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Automat.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Components.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Context.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Ground.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_IO.TcGVL create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/fbAwait.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/AskForTheFavor_Task.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/Kill_Task.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/ColorSequencer.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/Color_Example.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/stColors.TcDUT create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/201/InvokingTasks.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/FastCounter.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/SlowCounter.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/TaskExecution.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonGripper.TcIO create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonHorizontal.TcIO create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonVertical.TcIO create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Components.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Sequencer.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPiston.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPistonMoveTask.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/MAIN_PRG.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/TcOpenTutorial.TcPOU create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcAppExamples.plcproj create mode 100644 src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcTask.TcTTO create mode 100644 src/TcoApplicationExamples/XaeAppExamples/XaeAppExamples.tsproj create mode 100644 src/TcoApplicationExamples/runbuild.ps1 rename src/{TcoPneumatics/src/TcoPneumatics.Wpf/Cyclinders/Converters/ActuatorToBrushConverter.cs => TcoCore/src/TcoCore.Wpf/Converters/BooleanToVisibilityConverter.cs} (63%) create mode 100644 src/TcoCore/src/TcoCore.Wpf/Converters/CountToVisibilityConverter.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/Converters/EmptyStringToVisibilityConverter.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/Converters/SignalToBrushConverter.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/Inxton.TcoCore.Wpf.csproj create mode 100644 src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/DataTemplates/TreeItemTemplate.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/DataTemplates/TreeItemTemplate.xaml create mode 100644 src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/TreeElements/TreeItem.cs rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/CustomTree/TreeElements/TreeObject.cs (55%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/ArraySymbolToHeaderConverter.cs (100%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/ChildDataTemplateSelector.cs (100%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/DataTemplates/Array.xaml (100%) create mode 100644 src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/ValueTag.cs rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/DataTemplates/ValueTag.xaml (79%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/DataTemplates/VortexObjectDataTemplate.cs (51%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/DataTemplates/VortexObjectDataTemplate.xaml (76%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/DynamicTreeView.xaml (95%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/DynamicTreeView.xaml.cs (51%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/DynamicTree/VortexObjectWrapper.cs (55%) rename src/TcoCore/{tests/TcoCore.Sandbox.Wpf => src/TcoCore.Wpf/ObjectTreeViewer}/Extensions.cs (100%) create mode 100644 src/TcoCore/src/TcoCore.Wpf/ObservableContentControl/ObservableContentControl.xaml create mode 100644 src/TcoCore/src/TcoCore.Wpf/ObservableContentControl/ObservableContentControl.xaml.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/Properties/AssemblyInfo.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/Properties/Localization.Designer.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/Properties/Localization.resx create mode 100644 src/TcoCore/src/TcoCore.Wpf/Properties/_compatibilty.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoContext/Diagnostics/TcoContextDiagnostics.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoContext/TcoContextView.xaml rename src/TcoCore/src/TcoCore.Wpf/{TcoObject/TcoObjectView.xaml.cs => TcoContext/TcoContextView.xaml.cs} (78%) create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoContext/TcoContextViewModel.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoMessage/MessageCategoryToBrushConverter.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoMessage/TcoDiagnostics.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoMessage/TcoDiagnosticsView.xaml create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoMessage/TcoDiagnosticsView.xaml.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoMessage/TcoDiagnosticsViewModel.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoMessage/TcoMessengerView.xaml create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoMessage/TcoMessengerView.xaml.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoObject/Diagnostics/TcoObjectDiagnostics.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoObject/TcoObjectControlView.xaml create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoObject/TcoObjectControlView.xaml.cs delete mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoObject/TcoObjectView.xaml rename src/TcoCore/src/TcoCore.Wpf/TcoObject/{TcoObjectViewModel.cs => TcoObjectViewControlModel.cs} (69%) create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoSequencer/TcoSequencerModeController/TcoSequencerModeControllerView.xaml create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoSequencer/TcoSequencerModeController/TcoSequencerModeControllerView.xaml.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoSequencer/TcoSequencerModeController/TcoSequencerModeControllerViewModel.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoSequencer/TcoSequencerView.xaml create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoSequencer/TcoSequencerView.xaml.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoSequencer/TcoSequencerViewModel.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoTask/TaskStateToBoolConverter.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoTask/TaskStateToProgressConverter.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoTask/TaskStateToVisibilityConverter.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/TcoTask/VisibleOnTaskState.cs create mode 100644 src/TcoCore/src/TcoCore.Wpf/Threading/Dispatcher.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/Attributes/ExcludeFromApiDocumentationAttribute.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/Input/RelayCommand.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/Inxton.TcoCoreConnector.csproj delete mode 100644 src/TcoCore/src/TcoCoreConnector/Program.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/Properties/_compatibilty.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/Tco.snk create mode 100644 src/TcoCore/src/TcoCoreConnector/Threading/Dispatcher.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/Threading/IDispatcher.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/MAIN.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/TcoComponent.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/TcoContext.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/TcoCore.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/TcoMessage.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/TcoMessenger.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/TcoObject.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/TcoState.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/TcoTask.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/eMessageCategory.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_generated/eTaskState.g.cs delete mode 100644 src/TcoCore/src/TcoCoreConnector/_meta/TcoCore.json delete mode 100644 src/TcoCore/src/TcoCoreConnector/_meta/TcoCore.lbz delete mode 100644 src/TcoCore/src/TcoCoreConnector/_meta/version.info create mode 100644 src/TcoCore/src/TcoCoreConnector/pex/TcoContext/IsTcoContext.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/pex/TcoMessage/PlainTcoMessage.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/pex/TcoObject/IsTcoObject.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/pex/TcoSequencer/TcoSequencer.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/pex/TcoTask/TcoTask.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/pex/_internals_/ITestContext.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/pex/_internals_/TcoContextTestRunners.cs create mode 100644 src/TcoCore/src/TcoCoreConnector/pex/_internals_/_internals_TcoContext.cs delete mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/Class Diagram.TcCD create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Compatibility/TcoContextCompatibility.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Compatibility/TcoContextNfCompatibility.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoComponent/ITcoServiceable.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoContext/ITcoContextEnvironment.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoContext/TcoContextEnvironment.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoMessage/ITcoMessengerSettings.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoMessage/TcoMessengerSettings.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoRestorable/ITcoObjectRestorer.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoRtc/ITcoRtc.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoRtc/RtcPrg.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoRtc/RtcSynchParams.TcDUT create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoRtc/TcoRtc.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoSequencer/ITcoSequencerModeController.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoSequencer/StepDetails.TcDUT create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoSequencer/TcoSequencer.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoSequencer/TcoSequencerModeController.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoSequencer/eSequencerError.TcDUT create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoSequencer/eSequencerMode.TcDUT create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoSequencer/eStepStatus.TcDUT create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoState/TcoStateBase.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoState/TcoStateExtendible.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoState/eRestoreMode.TcDUT create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoTask/ITcoTaskStatus.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoTask/TaskResult/F_AnyToUnionValue.TcDUT create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Prototypes/TcoTask/TaskResult/TcoTaskResult.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/TestFixtures/_internals_TcoContext.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/TestFixtures/_internals_TcoSequencer.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/POUs/Utilities/StringBuilder.TcPOU delete mode 100644 src/TcoCore/src/XaeTcoCore/TcoCore/TcoCore.plcproj.version.update create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Components/IPistonGripper.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Components/IPistonHorizontal.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Components/IPistonVertical.TcIO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Components/fbPiston.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Components/fbPistonMoveTask.TcPOU rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/EXAMPLES_PRG.TcPOU (61%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/Implementation/TcoContext/TcoContext_App_1.TcPOU (63%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/Implementation/TcoObject/TcoObject_Counter.TcPOU (53%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/Implementation/TcoState/TcoContext_App_2.TcPOU (66%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/Implementation/TcoTask/TcoTask_DownCounter.TcPOU (52%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/Manipulator/MANIPULATOR.TcPOU (53%) create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Manipulator/fbManipulatorAutomat.TcPOU rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/Manipulator/fbManipulatorContext.TcPOU (53%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/Manipulator/gMANIPULATOR_IO.TcGVL (75%) create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Station_001/Station001.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Station_001/Station001_Components.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/Examples/Station_001/Station001_Sequencer.TcPOU rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/WaveForm/TcoContext_Waveform.TcPOU (50%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/WaveForm/TcoObject_Waveform.TcPOU (59%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/WaveForm/TcoState_WaveformSequence.TcPOU (78%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/WaveForm/TcoTask_Transition.TcPOU (66%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/WaveForm/WaveformPoint.TcDUT (72%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/WaveForm/eTransitionType.TcDUT (62%) rename src/TcoCore/src/XaeTcoCore/{TcoCoreTests => TcoCoreExamples}/Examples/fbContext.TcPOU (57%) create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/POUs/MAIN.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/PlcTask.TcTTO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/PlcTask2.TcTTO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreExamples/TcoCoreExamples.plcproj delete mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Examples/Manipulator/Components/fbPiston.TcPOU delete mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Examples/Manipulator/Components/fbPistonMoveTask.TcPOU delete mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Examples/Manipulator/fbManipulatorAutomat.TcPOU delete mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/PlcTask.TcTTO create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/PlcTask1.TcTTO delete mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/TcoCoreTests.plcproj.version.update create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoComponent/TcoComponentTest.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoComponent/_TcoComponent.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoMessenger/TcoContextMessagingPerf.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoMessenger/TcoMessengerContextTest.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoMessenger/TcoMessengerTests.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoObject/EqualsOverride/TcoObjectEqualsTest.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoRtc/TcoRtcTest.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoSequencer/TcoSequencerAutoRestorableTest.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoSequencer/TcoSequencerNonAutoRestorableTest.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/TcoSequencer/_TcoSequencer.TcPOU create mode 100644 src/TcoCore/src/XaeTcoCore/TcoCoreTests/Tests/Utilities/StringBuilderTests.TcPOU delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/CustomTree.xaml delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/CustomTree.xaml.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/CustomTreeViewModel.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/DataTemplates/TreeGroupTemplate.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/DataTemplates/TreeGroupTemplate.xaml delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/DataTemplates/TreeItemTemplate.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/DataTemplates/TreeItemTemplate.xaml delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/DialogWindow.xaml delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/DialogWindow.xaml.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/Persistence/TreeItemDTO.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/TreeElements/TreeGroup.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/TreeElements/TreeItem.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/DragDrop/DragDropConsumer.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/DragDrop/DragDropPublisher.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/DragDrop/IDragConsumer.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/DragDrop/IDraggable.cs delete mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/ValueTag.cs create mode 100644 src/TcoCore/tests/TcoCore.Sandbox.Wpf/Inxton.TcoCore.Sandbox.Wpf.csproj create mode 100644 src/TcoCore/tests/TcoCoreExamplesConnector/Entry.cs create mode 100644 src/TcoCore/tests/TcoCoreExamplesConnector/Inxton.TcoCoreExamplesConnector.csproj create mode 100644 src/TcoCore/tests/TcoCoreExamplesConnector/Properties/Localizations.Designer.cs create mode 100644 src/TcoCore/tests/TcoCoreExamplesConnector/Properties/Localizations.resx create mode 100644 src/TcoCore/tests/TcoCoreExamplesConnector/TcoCoreExamplesConnector.csproj create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/Inxton.TcoCoreTestsConnector.csproj create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/Properties/launchSettings.json delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/EXAMPLES_PRG.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/MAIN.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/MANIPULATOR.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoContextTest.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoContext_App_1.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoContext_App_2.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoContext_Waveform.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoCoreTests.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoObjectTest.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoObject_Counter.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoObject_Waveform.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoStateAutoRestoreTest.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoStateTest.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoState_WaveformSequence.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoTaskTest.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoTask_DownCounter.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/TcoTask_Transition.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/WaveformPoint.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/eTransitionType.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/fbContext.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/fbManipulatorAutomat.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/fbManipulatorContext.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/fbPiston.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/fbPistonMoveTask.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_generated/gMANIPULATOR_IO.g.cs delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_meta/TcoCoreTests.json delete mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/_meta/version.info create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/ITestTcoComponent.cs create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/ITestTcoMessengerContext.cs create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/ITestTcoSequencerAutoRestorable.cs create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/ITestTcoSequencerNonAutoRestorable.cs create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/TcoComponentTest.cs create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/TcoMessengerContextTest.cs create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/TcoMessengerTests.cs create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/TcoSequencerAutoRestorableTest.cs create mode 100644 src/TcoCore/tests/TcoCoreTestsConnector/pex/TcoContext/TcoSequencerNonAutoRestorableTest.cs create mode 100644 src/TcoCore/tests/TcoCoreUnitTests/Inxton.TcoCoreUnitTests.csproj create mode 100644 src/TcoCore/tests/TcoCoreUnitTests/Properties/launchSettings.json create mode 100644 src/TcoCore/tests/TcoCoreUnitTests/StringBuilderTests.cs create mode 100644 src/TcoCore/tests/TcoCoreUnitTests/TcoComponentTests.cs create mode 100644 src/TcoCore/tests/TcoCoreUnitTests/TcoMessengerTests.cs create mode 100644 src/TcoCore/tests/TcoCoreUnitTests/TcoRtcTests.cs create mode 100644 src/TcoCore/tests/TcoCoreUnitTests/TcoSequencerAutoRestoreableTests.cs create mode 100644 src/TcoCore/tests/TcoCoreUnitTests/TcoSequencerNonAutoRestoreableTests.cs create mode 100644 src/TcoCore/tests/TcoTestRunners/Inxton.TcoTestRunners.csproj create mode 100644 src/TcoDrivesBeckhoff/TcoDrivesBeckhoff.slnf create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoff.Wpf/App.xaml create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoff.Wpf/App.xaml.cs rename src/{TcoCore/src/TcoCore.Wpf => TcoDrivesBeckhoff/src/TcoDrivesBeckhoff.Wpf}/AssemblyInfo.cs (71%) create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoff.Wpf/MainWindow.xaml create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoff.Wpf/MainWindow.xaml.cs create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoff.Wpf/TcoDrivesBeckhoff.Wpf.csproj create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoffConnector/Entry.cs create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoffConnector/Properties/AssemblyInfo.cs create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoffConnector/Properties/Localizations.Designer.cs create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoffConnector/Properties/Localizations.resx create mode 100644 src/TcoDrivesBeckhoff/src/TcoDrivesBeckhoffConnector/TcoDrivesBeckhoffConnector.csproj create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/DUTs/TcoAxisOpModes.TcDUT create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/DUTs/TcoAxisRef.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/DUTs/TcoAxisStatus.TcDUT create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/DUTs/eAxisStates.TcDUT create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/DUTs/eDirection.TcDUT create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/DUTs/eEncoderReferenceMode.TcDUT create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/DUTs/eHomingMode.TcDUT create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Conversions/Tc2MC2_TO_Tco_AxisStates.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Conversions/Tc2MC2_TO_Tco_Direction.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Conversions/Tc2MC2_TO_Tco_EncRefMode.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Conversions/Tc2MC2_TO_Tco_HomingMode.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Conversions/Tco_TO_Tc2MC2_AxisStates.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Conversions/Tco_TO_Tc2MC2_Direction.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Conversions/Tco_TO_Tc2MC2_EncRefMode.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Conversions/Tco_TO_Tc2MC2_HomingMode.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/MAIN.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/AxisTasks/ResetTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/AxisTasks/SetPositionTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/AxisTasks/SoEResetTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/ITcoDriveSimple.TcIO create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/MotionTasks/HaltTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/MotionTasks/HomeTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/MotionTasks/MoveAbsoluteTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/MotionTasks/MoveModuloTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/MotionTasks/MoveRelativeTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/MotionTasks/MoveVelocityTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/MotionTasks/StopTask.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/POUs/Prototypes/TcoDriveSimple/TcoDriveSimple.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/PlcTask.TcTTO create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoff/TcoDrivesBeckhoff.plcproj create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoffTests/GVLs/GVL.TcGVL create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoffTests/POUs/MAIN.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoffTests/PlcTask1.TcTTO create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoffTests/TcoDrivesBeckhoffTests.plcproj create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoffTests/Tests/TcoDriveSimple/TcoDriveSimpleTest.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/TcoDrivesBeckhoffTests/Tests/TcoDriveSimple/TcoDrivesBeckhoffContext.TcPOU create mode 100644 src/TcoDrivesBeckhoff/src/XaeTcoDrivesBeckhoff/XaeTcoDrivesBeckhoff.tsproj create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoff.Wpf.Sandbox/App.xaml create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoff.Wpf.Sandbox/App.xaml.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoff.Wpf.Sandbox/AssemblyInfo.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoff.Wpf.Sandbox/MainWindow.xaml create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoff.Wpf.Sandbox/MainWindow.xaml.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoff.Wpf.Sandbox/TcoDrivesBeckhoff.Wpf.Sandbox.csproj create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffTestsConnector/Entry.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffTestsConnector/Properties/Localizations.Designer.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffTestsConnector/Properties/Localizations.resx create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffTestsConnector/TcoDrivesBeckhoffTestsConnector.csproj create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffTestsConnector/pex/TcoContext/ITestTcoDrivesBeckhoffContext.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffTestsConnector/pex/TcoContext/TcoDrivesBeckhoffContext.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffUnitTests/ConnectorFixture.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffUnitTests/TcoDriveSimpleTests.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffUnitTests/TcoDrivesBeckhoffUnitTests.csproj create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffUnitTests/TestRunners.cs create mode 100644 src/TcoDrivesBeckhoff/tests/TcoDrivesBeckhoffUnitTests/TestSetupFixture.cs create mode 100644 src/TcoElements/TcoElements.slnf create mode 100644 src/TcoElements/src/TcoElementsConnector/Entry.cs create mode 100644 src/TcoElements/src/TcoElementsConnector/Properties/AssemblyInfo.cs create mode 100644 src/TcoElements/src/TcoElementsConnector/Properties/Localizations.Designer.cs create mode 100644 src/TcoElements/src/TcoElementsConnector/Properties/Localizations.resx create mode 100644 src/TcoElements/src/TcoElementsConnector/TcoElementsConnector.csproj create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/AssemblyInfo.cs create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/Digital/TcoDi/Service/TcoDiServiceView.xaml create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/Digital/TcoDi/Service/TcoDiServiceView.xaml.cs create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/Digital/TcoDiServiceView.xaml create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/Digital/TcoDiServiceView.xaml.cs create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/Digital/TcoDo/Service/TcoDoServiceView.xaml create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/Digital/TcoDo/Service/TcoDoServiceView.xaml.cs create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/TcoElements.Wpf.csproj create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/_Sample/SampleComponentManualView.xaml create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/_Sample/SampleComponentManualView.xaml.cs create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/_Sample/fbSampleComponentManualView.xaml create mode 100644 src/TcoElements/src/Wpf/TcoElements.Wpf/_Sample/fbSampleComponentManualView.xaml.cs create mode 100644 src/TcoElements/src/XAE/XAE/TcoElements/Digital/TcoDi.TcPOU create mode 100644 src/TcoElements/src/XAE/XAE/TcoElements/Digital/TcoDo.TcPOU create mode 100644 src/TcoElements/src/XAE/XAE/TcoElements/POUs/MAIN.TcPOU create mode 100644 src/TcoElements/src/XAE/XAE/TcoElements/POUs/fbSampleComponent.TcPOU create mode 100644 src/TcoElements/src/XAE/XAE/TcoElements/PlcTask.TcTTO create mode 100644 src/TcoElements/src/XAE/XAE/TcoElements/TcoElements.plcproj create mode 100644 src/TcoElements/src/XAE/XAE/TcoElementsTests/POUs/MAIN.TcPOU create mode 100644 src/TcoElements/src/XAE/XAE/TcoElementsTests/PlcTask.TcTTO create mode 100644 src/TcoElements/src/XAE/XAE/TcoElementsTests/Sandbox/TcoElementsSandbox.TcPOU create mode 100644 src/TcoElements/src/XAE/XAE/TcoElementsTests/TcoElementsTests.plcproj create mode 100644 src/TcoElements/src/XAE/XAE/TcoElementsTests/Tests/TcoDiTests.TcPOU create mode 100644 src/TcoElements/src/XAE/XAE/TcoElementsTests/Tests/TcoDoTests.TcPOU create mode 100644 src/TcoElements/src/XAE/XAE/XAETcoElements.tsproj create mode 100644 src/TcoElements/tests/PlcUnitTests/TcoDi.cs create mode 100644 src/TcoElements/tests/PlcUnitTests/TcoDo.cs create mode 100644 src/TcoElements/tests/PlcUnitTests/TcoElementsUnitTests.csproj create mode 100644 src/TcoElements/tests/Sandbox.TcoElements.Wpf/App.xaml create mode 100644 src/TcoElements/tests/Sandbox.TcoElements.Wpf/App.xaml.cs create mode 100644 src/TcoElements/tests/Sandbox.TcoElements.Wpf/AssemblyInfo.cs create mode 100644 src/TcoElements/tests/Sandbox.TcoElements.Wpf/MainWindow.xaml create mode 100644 src/TcoElements/tests/Sandbox.TcoElements.Wpf/MainWindow.xaml.cs create mode 100644 src/TcoElements/tests/Sandbox.TcoElements.Wpf/MainWindowViewModel.cs create mode 100644 src/TcoElements/tests/Sandbox.TcoElements.Wpf/Sandbox.TcoElements.Wpf.csproj create mode 100644 src/TcoElements/tests/TcoElementsTestsConnector/Entry.cs create mode 100644 src/TcoElements/tests/TcoElementsTestsConnector/Properties/Localizations.Designer.cs create mode 100644 src/TcoElements/tests/TcoElementsTestsConnector/Properties/Localizations.resx create mode 100644 src/TcoElements/tests/TcoElementsTestsConnector/TcoElementsTestsConnector.csproj create mode 100644 src/TcoElements/vortex_config.json create mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoff.Wpf/Inxton.TcoIoBeckhoff.Wpf.csproj create mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/Inxton.TcoIoBeckhoffConnector.csproj delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/AI_1_Module.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/AI_Channel.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/AI_ChannelStatus.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/EL922x_ChannelBasic.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/EL922x_ChannelExtended.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/FuseChannelBasic.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/FuseChannelExtended.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/FuseModuleEL922x.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/Global_Version.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/IO.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/InfoData.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/OutputStruct.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/StatusStructBasic.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/StatusStructExtended.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/TcoIoBeckhoff.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_generated/WcState.g.cs delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_meta/TcoIoBeckhoff.json delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_meta/TcoIoBeckhoff.lbz delete mode 100644 src/TcoIoBeckhoff/src/TcoIoBeckhoffConnector/_meta/version.info delete mode 100644 src/TcoIoBeckhoff/src/XaeTcoIoBeckhoff/TcoIoBeckhoff/TcoIoBeckhoff.plcproj.version.update delete mode 100644 src/TcoPneumatics/src/TcoPneumatics.Wpf/Cyclinders/fbCylinderManualView.xaml create mode 100644 src/TcoPneumatics/src/TcoPneumatics.Wpf/Cylinders/Converters/ActuatorToBrushConverter.cs rename src/TcoPneumatics/src/TcoPneumatics.Wpf/{Cyclinders => Cylinders}/Converters/SensorToBrushConverter.cs (75%) create mode 100644 src/TcoPneumatics/src/TcoPneumatics.Wpf/Cylinders/CylinderMainView.xaml create mode 100644 src/TcoPneumatics/src/TcoPneumatics.Wpf/Cylinders/CylinderMainView.xaml.cs create mode 100644 src/TcoPneumatics/src/TcoPneumatics.Wpf/Cylinders/CylinderManualView.xaml rename src/TcoPneumatics/src/TcoPneumatics.Wpf/{Cyclinders/fbCylinderManualView.xaml.cs => Cylinders/CylinderManualView.xaml.cs} (86%) rename src/TcoPneumatics/src/TcoPneumatics.Wpf/{Cyclinders/fbCylinderViewModel.cs => Cylinders/CylinderViewModel.cs} (57%) create mode 100644 src/TcoPneumatics/src/TcoPneumatics.Wpf/Inxton.TcoPneumatics.Wpf.csproj create mode 100644 src/TcoPneumatics/src/TcoPneumaticsConnector/Inxton.TcoPneumaticsConnector.csproj delete mode 100644 src/TcoPneumatics/src/TcoPneumaticsConnector/_generated/Global_Version.g.cs delete mode 100644 src/TcoPneumatics/src/TcoPneumaticsConnector/_generated/TcoPneumatics.g.cs delete mode 100644 src/TcoPneumatics/src/TcoPneumaticsConnector/_generated/fbCylinder.g.cs delete mode 100644 src/TcoPneumatics/src/TcoPneumaticsConnector/_meta/TcOpen.json delete mode 100644 src/TcoPneumatics/src/TcoPneumaticsConnector/_meta/TcoPneumatics.json delete mode 100644 src/TcoPneumatics/src/TcoPneumaticsConnector/_meta/TcoPneumatics.lbz delete mode 100644 src/TcoPneumatics/src/TcoPneumaticsConnector/_meta/version.info rename src/TcoPneumatics/src/TcoPneumaticsConnector/pex/Cylinders/{fbCyclinder.cs => Cyclinder.cs} (81%) rename src/TcoPneumatics/src/XaeTcoPneumatics/TcoPneumatics/POUs/Cylinders/{fbCylinder.TcPOU => Cylinder.TcPOU} (78%) delete mode 100644 src/TcoPneumatics/src/XaeTcoPneumatics/TcoPneumatics/TcOpen.plcproj.version.update delete mode 100644 src/TcoPneumatics/src/XaeTcoPneumatics/TcoPneumatics/TcoPneumatics.plcproj.version.update delete mode 100644 src/TcoPneumatics/src/XaeTcoPneumatics/TcoPneumaticsTests/TcoPneumaticsTests.plcproj.version.update delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_generated/DefaultContext.g.cs delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_generated/IO.g.cs delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_generated/MAIN.g.cs delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_generated/TcoPneumaticsTests.g.cs delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_meta/TcOpen.json delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_meta/TcoPneumatics.json delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_meta/TcoPneumatics.lbz delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_meta/TcoPneumaticsTests.json delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_meta/TcoPneumaticsTests.lbz delete mode 100644 src/TcoPneumatics/tests/TcoPneumaticsTestsConnector/_meta/version.info rename src/TcoPneumatics/tests/TcoPneumaticsTests_nUnit/{fbCylinderTests.cs => CylinderTests.cs} (97%) create mode 100644 src/librarytemplate/PlcTemplate.slnf create mode 100644 src/librarytemplate/scaffoldnewlibrary.ps1 create mode 100644 src/librarytemplate/src/PlcTemplateConnector/Entry.cs create mode 100644 src/librarytemplate/src/PlcTemplateConnector/PlcTemplateConnector.csproj create mode 100644 src/librarytemplate/src/PlcTemplateConnector/Properties/AssemblyInfo.cs create mode 100644 src/librarytemplate/src/PlcTemplateConnector/Properties/Localizations.Designer.cs create mode 100644 src/librarytemplate/src/PlcTemplateConnector/Properties/Localizations.resx create mode 100644 src/librarytemplate/src/Wpf/PlcTemplate.Wpf/AssemblyInfo.cs create mode 100644 src/librarytemplate/src/Wpf/PlcTemplate.Wpf/PlcTemplate.Wpf.csproj create mode 100644 src/librarytemplate/src/Wpf/PlcTemplate.Wpf/_Sample/SampleComponentManualView.xaml create mode 100644 src/librarytemplate/src/Wpf/PlcTemplate.Wpf/_Sample/SampleComponentManualView.xaml.cs create mode 100644 src/librarytemplate/src/Wpf/PlcTemplate.Wpf/_Sample/fbSampleComponentManualView.xaml create mode 100644 src/librarytemplate/src/Wpf/PlcTemplate.Wpf/_Sample/fbSampleComponentManualView.xaml.cs create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplate/POUs/MAIN.TcPOU create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplate/POUs/SampleComponent/SampleComponent.TcPOU create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplate/POUs/SampleComponent/SampleTaskFunctionBuffer.TcDUT create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplate/POUs/SampleComponent/SampleTaskIteration.TcPOU create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplate/POUs/SampleContext.TcPOU create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplate/POUs/fbSampleComponent.TcPOU create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplate/PlcTask.TcTTO create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplate/PlcTemplate.plcproj create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplateTests/POUs/MAIN.TcPOU create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplateTests/POUs/SampleComponentTests.TcPOU create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplateTests/PlcTask.TcTTO create mode 100644 src/librarytemplate/src/XAE/XAE/PlcTemplateTests/PlcTemplateTests.plcproj create mode 100644 src/librarytemplate/src/XAE/XAE/XAEPlcTemplate.tsproj create mode 100644 src/librarytemplate/tests/PlcTemplateTestsConnector/Entry.cs create mode 100644 src/librarytemplate/tests/PlcTemplateTestsConnector/PlcTemplateTestsConnector.csproj create mode 100644 src/librarytemplate/tests/PlcTemplateTestsConnector/Properties/Localizations.Designer.cs create mode 100644 src/librarytemplate/tests/PlcTemplateTestsConnector/Properties/Localizations.resx create mode 100644 src/librarytemplate/tests/PlcUnitTests/PlcTemplateUnitTests.csproj create mode 100644 src/librarytemplate/tests/PlcUnitTests/UnitTest1.cs create mode 100644 src/librarytemplate/tests/Sandbox.PlcTemplate.Wpf/App.xaml create mode 100644 src/librarytemplate/tests/Sandbox.PlcTemplate.Wpf/App.xaml.cs create mode 100644 src/librarytemplate/tests/Sandbox.PlcTemplate.Wpf/AssemblyInfo.cs create mode 100644 src/librarytemplate/tests/Sandbox.PlcTemplate.Wpf/MainWindow.xaml create mode 100644 src/librarytemplate/tests/Sandbox.PlcTemplate.Wpf/MainWindow.xaml.cs create mode 100644 src/librarytemplate/tests/Sandbox.PlcTemplate.Wpf/MainWindowViewModel.cs create mode 100644 src/librarytemplate/tests/Sandbox.PlcTemplate.Wpf/Sandbox.PlcTemplate.Wpf.csproj diff --git a/.github/ISSUE_TEMPLATE/development.md b/.github/ISSUE_TEMPLATE/development.md new file mode 100644 index 000000000..51cf01e21 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/development.md @@ -0,0 +1,10 @@ +--- +name: Development +about: Suggestion for improvement in development process +title: '' +labels: '' +assignees: '' + +--- + + diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..6b3214a6f --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,17 @@ +name: Build + +on: [push, pull_request, workflow_dispatch] + # Allows you to run this workflow manually from the Actions tab +jobs: + build: + runs-on: self-hosted + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it. Dummy edit + - uses: actions/checkout@v2 + # Check if the action works + - name: Run a one-line script + run: echo Hello, world! + # Run psake + - name: Run a multi-line script + run: | + .\pipelines\runbuild.ps1 -properties @{"buildConfig" = "Release"; "msbuild" = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" } diff --git a/.gitignore b/.gitignore index ead78b887..1aadab1dc 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,9 @@ bld/ *.VisualState.xml TestResult.xml +# dotnet test results +*.trx + # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ @@ -216,6 +219,12 @@ _Vortex/ CompilerCache.md log.txt pal.txt +_meta/ +_generated/ +*.g.cs +*.lbz +version.info +*.plcproj.version.update # IVF Tools _toolz/ @@ -224,5 +233,7 @@ nugets/ # CodeRush .cr/ +*.TcCD - +# VSCode +.vscode/ diff --git a/GitVersion.yml b/GitVersion.yml index ed16160be..4d3d54450 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,4 +1,5 @@ -mode: ContinuousDelivery +mode: ContinuousDeployment +next-version: 0.4.1 branches: {} ignore: sha: [] diff --git a/README.MD b/README.MD deleted file mode 100644 index d7fbc2456..000000000 --- a/README.MD +++ /dev/null @@ -1,57 +0,0 @@ -![TcOpen logo](assets/logo/TcOpenWide.png) -[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/TcOpenGroup/TcOpen/graphs/commit-activity) -[![GitHub license](https://img.shields.io/github/license/Naereen/StrapDown.js.svg)](https://github.com/TcOpenGroup/TcOpen/blob/dev/LICENSE) -[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/TcOpenGroup/TcOpen/pulls) -[![Open Source? Yes!](https://badgen.net/badge/Open%20Source%20%3F/Yes%21/blue?icon=github)](https://github.com/TcOpenGroup/TcOpen) -[![TcOpen Slack ](https://img.shields.io/badge/Slack-channel-ff69b4.svg)](https://tcopendevelopment.slack.com/) -[![Awesome Badges](https://img.shields.io/badge/badges-awesome-green.svg)](https://github.com/TcOpenGroup/TcOpen#awesome-twincat-3-projects-) -[![Build Status](https://dev.azure.com/petokurhajec0964/tc3/_apis/build/status/TcOpenGroup.TcOpen?branchName=dev)](https://dev.azure.com/petokurhajec0964/tc3/_build/latest?definitionId=6&branchName=dev) - -# TcOpen - -**Open Source TwinCAT 3 code by Automation Professionals for Automation Professionals.** - -TcOpen aims to provide standard classes to start building any real deployable application. TcOpen will help you by providing well tested components you can use in your project free of charge. - -## Why? - -Introduce modern software development practices to the PLC world so developers can shift from low-value work to high-value work. OpenSource offers a solid ground upon which many can build and bring ideas from all over the world. - -## Goals - -- Introduce software engineering patterns to PLC development. -- Modular, extensible and observable code. -- Bring the TwinCAT community together. -- Basic components for every project. -- Cultivate a place for sharing knowledge. - -## What is TwinCAT? - -TwinCAT software system turns almost any compatible PC into a real-time controller with a multi-PLC system, NC axis control, programming environment and operating station. TwinCAT replaces conventional PLC and NC/CNC controllers. It runs in Visual Studio with CodeSyS - -## Docs - -See [Introduction](/docs/Introduction.md) - -## Contributing - -Awesome! See [Conventions](/docs/Conventions.md) for a style guide. Clone the library, and submit a PR. - -Consider joining our [![TcOpen Slack](https://img.shields.io/badge/Slack-channel-ff69b4.svg)](https://tcopendevelopment.slack.com/) - -## Who is using TcOpen - -Is your company using TcOpen? Submit a PR or write to our Slack channel and we will mention you here. - -- example.org - -## Suggestions? Issues? - -Open an issue here and / or join the slack channel for discussion. - -### Awesome TwinCAT 3 projects 🌐 - -- An xUnit testing framework for Beckhoff TwinCAT3. [TcUnit](https://github.com/tcunit/TcUnit) -- Unofficial TwinCAT function for HTTP requests with json conversion [Beckhoff Http Client ](https://github.com/fbarresi/BeckhoffHttpClient) -- Opinionated code formatter for TwinCAT. [TcBlack](https://github.com/Roald87/TcBlack) -- Bring the power of Json.Net to TwinCAT [TwinCAT.JsonExtension](https://github.com/fbarresi/TwinCAT.JsonExtension) diff --git a/README.md b/README.md index 22611896e..c1734aaea 100644 --- a/README.md +++ b/README.md @@ -4,50 +4,205 @@ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](https://github.com/TcOpenGroup/TcOpen/pulls) [![Open Source? Yes!](https://badgen.net/badge/Open%20Source%20%3F/Yes%21/blue?icon=github)](https://github.com/TcOpenGroup/TcOpen) [![TcOpen Slack ](https://img.shields.io/badge/Slack-channel-ff69b4.svg)](https://tcopendevelopment.slack.com/) +[![Join the chat at https://gitter.im/dotnet/coreclr](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/TcOpenGroup/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Awesome Badges](https://img.shields.io/badge/badges-awesome-green.svg)](https://github.com/TcOpenGroup/TcOpen#awesome-twincat-3-projects-) -![Azure DevOps builds (branch)](https://img.shields.io/azure-devops/build/petokurhajec0964/tc3/TcOpenGroup.TcOpen/dev) + # TcOpen **Open Source TwinCAT 3 code by Automation Professionals for Automation Professionals.** -TcOpen aims to provide standard classes to start building any real deployable application. TcOpen will help you by providing well tested components you can use in your project free of charge. +TcOpen aims to provide standard classes to start building any **real deployable application**. TcOpen will help you by providing well-tested components you can use in your project free of charge. ## Why? -Introduce modern software development practices to the PLC world so developers can shift from low-value work to high-value work. OpenSource offers a solid ground upon which many can build and bring ideas from all over the world. +We want to introduce modern software development practices to the PLC world so developers can shift from low-value work to high-value work. Open-source offers a solid ground upon which many can build and bring ideas from all over the world. ## Goals - Introduce software engineering patterns to PLC development. -- Modular, extensible and observable code. +- Modular, extensible, and observable code and applications. - Bring the TwinCAT community together. -- Basic components for every project. +- Basic libraries and components for every project. - Cultivate a place for sharing knowledge. ## What is TwinCAT? -TwinCAT software system turns almost any compatible PC into a real-time controller with a multi-PLC system, NC axis control, programming environment and operating station. TwinCAT replaces conventional PLC and NC/CNC controllers. It runs in Visual Studio with CodeSyS +TwinCAT software system turns almost any compatible PC into a real-time controller with a multi-PLC system, NC axis control, programming environment, and operating station. TwinCAT replaces conventional PLC and NC/CNC controllers. It runs in Visual Studio with CodeSys. + +# Where are we - Development process + +The initial momentum of ```TcOpen``` project was powerful; however, we have seen a slow decline in activity over the past months. [Inxton](https://inxton.com/), [MTS](https://www.mts.sk/en/) team and some other heroic knights decided to keep the lights on and to carry on this initiative. + +We understand that many of you guys have hard times at work, a lot of late hours, endless traveling. Life in industrial automation is very demanding. We see this as one of the reasons for the declined activity. Also, many automation engineers are not that familiar with modern software development tooling and workflows. It may scare some people off. Unfamiliarity should not be the reason not to participate. We want this place to be welcoming to everyone that sees it as a meaningful path to industrial automation. The community is going to learn along the path. There are not that many open-source projects for industrial automation; we got to start somewhere and somehow. + +## Recent developments merging to TcOpenGroup + +There has been much activity without visible tracking in recent times. We are developing a set of base classes to help us craft components and projects in industrial automation. Most of the discussions were in pair-programming and online/in-person meetings. We did it this way to speed up initial development when transferring legacy libraries and concepts to TcOpen. + +[Here](https://docs.tcopengroup.org/articles/TcOpenFramework/application.html) is a conceptual description of the work done so far. + +[Here](https://docs.tcopengroup.org/articles/Conventions/Conventions.html) is the document describing conventions to adhere to. + +## Workflow (modified GitHub flow) + +We adopt a modified version of [**GitHub flow**](https://guides.github.com/introduction/flow/) with proper tracking and discussions under PRs. It is a very simple workflow; we would like to work in a continuous integration/deployment fashion. However, we have to consider the need for the LTS versions for stable and long time support. How do we exactly do it is open to discussion. At this point, we work with the following modification of *GitHub flow*: our default branch is ```dev```, and all PRs must be directed there instead of ```main``` (previously ``` master```). We release in the ```main``` branch once we see the version is stable and battle-tested in production by early adopters. + +## Versioning + +We adopt [semantic versioning](https://semver.org/). The pipeline uses [GitVersion tool](https://gitversion.net/docs/) for the version calculation. + +At this point, we keep the major version at ```0``` (0.x.x) since we do expect changes to the public interfaces, and time is needed before the public contracts are stable. + +## Monorepo + +We have also decided to work in a [monorepo](https://en.wikipedia.org/wiki/Monorepo) at this point. About the structure later down. Each unit (TcoCore, TcoPneumatics, TcoDrives, etc.) has its filtered solution (*.slnf) for that unit for faster IDE opening and manipulation. Monorepo makes it easier to work with the dependencies and prevent possible dependency hell scenarios, which is a genuine risk at this early stage of the project. Once the framework is stable, we may move to a poly-repository solution with separate maintainers. + +## The role of Inxton.Vortex.Framework (IVF) + +IVF is a set of tools and libraries for creating industrial .NET applications based on the TwinCAT 3 platform. Some libraries of IVF are commercial. However, there is no need for TcOpen developers to purchase any license for this project. The contributors can acquire the free developer license [here](https://inxton.com/register) or drop an email to team@inxton.com. + +All PLC libraries developed in TcOpen are under MIT license. [MIT](https://tldrlegal.com/license/mit-license) gives you the freedom to use, modify, sublicense, redistribute the libraries freely for private and commercial use. + +IVF will aid in the development of this project. It provides the infrastructure for testing, debugging, and tooling for the delivery pipeline (library compilation, version number updates, etc.). + +Inxton and MTS teams will contribute to the development of PLC libraries. There will also be a transfer of some existing codebases from MTS and Inxton internal repositories (WPF/Blazor UI components, data acquisition libraries); some may require Inxton commercial license when deployed in production. + +## Repository structure + +Some of the information here might be self-evident for traditional users of GitHub and open source in general. We provide here more details to aid people that are not familiar with similar structures. + +### Root + +| FOLDER | DESCRIPTION | +|--------------------|----------------------------------------------------------------------------------------------------------------| +| .github | GitHub related files, templates, ... | +| _Vortex | Inxton tools, builder, CLIs, config files, output files, and folders, ... | +| assets | misc files, logo, pictures | +| docs | temporary folder for documentation, notes, etc (about documentain repo later in this document). | +| pipelines | delivery pipeline scripts and configurations | +| src | all sources, tests, UI controls | +| GitVersion.yml | GitVersion configuration file | +| README.md | This file | +| TcoOpen.build.slnf | Filtered solution contains all other projects except for TwinCAT project (NuGet restore/build in the pipeline) | +| TcoOpen.plc.send | Filtered solution, contains only TwinCAT projects (bulk library compilation) | +| TcoOpen.sln | Full solution file | +| notices.MD | Licenses of other open-source projects used in this repository | + +### src + +| FOLDER | DESCRIPTION | +|------------------------|----------------------------------------------------------------| +| Tc.Prober | Unit testing libraries | +| TcoApplicationExamples | Contains application examples that use TcOpen libraries | +| TcoCore | Core libraries of TcOpen framework (task, coordinations, etc.) | +| TcoIoBeckhoff | Beckhoff hardware (I/O) library | +| TcoPeumatics | Pneumatic components library | +| Others..... | _each group of components will have its separate folder_ | + + +### Typical structure of library folder + +| FOLDER | DESCRIPTION | +|-----------------|-----------------------------------------------------------| +| src | library source files | +| src/..Wpf | Inxton WPF components | +| src/..Connector | Inxton compiler connector | +| src/Xae.. | Plc project/sources | +| tests | unit, and integration tests and sandbox project(s) folder | + + +## Testing + +Testing is vital to this project. We will be using two unit testing frameworks [**TcUnit**](https://github.com/tcunit/TcUnit) and **TcProber**, which is part of this repository. [Here is an article](https://alltwincat.com/2021/02/16/unit-testing-in-the-world-of-industrial-automation/) that briefly explains what those frameworks are and how they differ. + +## Documentation + +There is a separate documentation repository for this project [here](https://github.com/TcOpenGroup/TcOpen.Documentation). In this moment we use [docfx](https://github.com/dotnet/docfx) to generate documentation. The ```docfx``` uses IVF twin objects of PLC code to generate the API documentation. There is room for improvement in generated documentation; we do plan - in the course of the development of TcOpen - to improve that. + +## How to get started with TcOpen + +### Prerequisites + +1. [Visual Studio 2019 (at least Community Edition)](https://visualstudio.microsoft.com/vs/older-downloads/) v16.8.3+ +1. [TwinCAT 3.1 eXtended Automation Engineering (XAE)](https://www.beckhoff.com/english.asp?download/tc3-downloads.htm) TwinCAT 3.1 4024.4+ +1. [.NET Framework 4.8 developer pack](https://dotnet.microsoft.com/download/dotnet-framework/thank-you/net48-developer-pack-offline-installer) +1. [.NET5 developer pack](https://dotnet.microsoft.com/download/dotnet/5.0) +1. [Inxton Vortex Builder extension](https://marketplace.visualstudio.com/items?itemName=Inxton.InxtonVortexBuilderExtensionPre) + +**Clone this repository** + +~~~bash +git clone https://github.com/TcOpenGroup/TcOpen.git +~~~ + +**Environment variables** + +You should setup Windows environment variable ```Tc3Target``` with the value of AMS ID of you testing target system. + +![Environment](assets/pics/environment.png) + +**Build project to restore necessary tooling and packages** + +_build in Debug profile_ +~~~ PowerShell +cd your_tcopen_folder +.\pipelines\runbuild.ps1 -properties @{"buildConfig" = "Debug"} +~~~ + +_build in Release profile_ +~~~ PowerShell +cd your_tcopen_folder +.\pipelines\runbuild.ps1 -properties @{"buildConfig" = "Release"} +~~~ + +**In the initial part of the build, you may see some errors popping up due to missing g.cs files (untracked by git). You can ignore those messages as long as the build completes like this:** + +![build](assets/pics/build.png) + + +**Open visual studio TcOpen.sln** + +Switch profile to Debug|TwinCAT RT (x64) + +![Profile set](assets/pics/compile_profile.png) + +> The build process might be susceptible to some issues due to configuration and evnironment differences. Should you encounter a problem please report the issue [here](https://github.com/TcOpenGroup/TcOpen/issues) + +## Communication channels + +Some of you complained you were unable to join the Slack Channel for various reasons. After a discussion with @dhullett08 we are opening a new gitter channel: + +[![Join the chat at https://gitter.im/dotnet/coreclr](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/TcOpenGroup/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +## Code of Conduct + +We do not adopt any document describing conduct at this point. However, there are few straightforward rules to observe: + +1. Treat others as you would like others to treat you +1. Everyone is free to express his/her ideas. +1. Truth is more important than kindness, but be kind. +1. Your contributions are under MIT license. -## Docs -See [Introduction](/docs/Introduction.md) +## Contributions? Suggestions? Issues? -## Contributing +You can submit your ideas in the form of [PullRequests](https://github.com/TcOpenGroup/TcOpen/pulls) -Awesome! See [Conventions](/docs/Conventions.md) for a style guide. Clone the library, and submit a PR. +Please submit questions, suggestions, bug reports [here](https://github.com/TcOpenGroup/TcOpen/issues). -Consider joining our [![TcOpen Slack](https://img.shields.io/badge/Slack-channel-ff69b4.svg)](https://tcopendevelopment.slack.com/) +Various discussion [here](https://github.com/TcOpenGroup/TcOpen/discussions). -## Who is using TcOpen +## Code format +TcOpen is powered by STweep for TwinCAT a source code formatter for Structured Text. -Is your company using TcOpen? Submit a PR or write to our Slack channel and we will mention you here. +When contributing to TcOpen please use this set of settings for STweep: [TCOpen.zip](https://github.com/Barteling/TcOpen/files/6455049/TCOpen.zip) -- example.org +STweep is free of charge for active contributers to this project. -## Suggestions? Issues? +For requesting a license for STweep visit www.stweep.com/Opensource -Open an issue here and / or join the slack channel for discussion. + ### Awesome TwinCAT 3 projects 🌐 diff --git a/TcOpen.build.slnf b/TcOpen.build.slnf index 60b8c22a6..7cdce9ae3 100644 --- a/TcOpen.build.slnf +++ b/TcOpen.build.slnf @@ -2,6 +2,10 @@ "solution": { "path": "TcOpen.sln", "projects": [ + "src\\Tc.Prober\\src\\Tc.Prober\\Tc.Prober.csproj", + "src\\Tc.Prober\\tests\\PlcTcProberTestsConnector\\PlcTcProberTestsConnector.csproj", + "src\\Tc.Prober\\tests\\Tc.ProberTest\\Tc.ProberTest.csproj", + "src\\Tc.Prober\\tests\\TcProber\\TcProber.tsproj", "src\\TcoCore\\src\\TcoCore.Wpf\\TcoCore.Wpf.csproj", "src\\TcoCore\\src\\TcoCoreConnector\\TcoCoreConnector.csproj", "src\\TcoCore\\src\\XaeTcoCore\\XaeTcoCore.tsproj", @@ -9,15 +13,31 @@ "src\\TcoCore\\tests\\TcoCoreTestsConnector\\TcoCoreTestsConnector.csproj", "src\\TcoCore\\tests\\TcoCoreUnitTests\\TcoCoreUnitTests.csproj", "src\\TcoCore\\tests\\TcoTestRunners\\TcoTestRunners.csproj", + "src\\TcoDrivesBeckhoff\\src\\TcoDrivesBeckhoff.Wpf\\TcoDrivesBeckhoff.Wpf.csproj", + "src\\TcoDrivesBeckhoff\\src\\TcoDrivesBeckhoffConnector\\TcoDrivesBeckhoffConnector.csproj", + "src\\TcoDrivesBeckhoff\\src\\XaeTcoDrivesBeckhoff\\XaeTcoDrivesBeckhoff.tsproj", + "src\\TcoDrivesBeckhoff\\tests\\TcoDrivesBeckhoffTestsConnector\\TcoDrivesBeckhoffTestsConnector.csproj", + "src\\TcoDrivesBeckhoff\\tests\\TcoDrivesBeckhoffUnitTests\\TcoDrivesBeckhoffUnitTests.csproj", + "src\\TcoElements\\src\\TcoElementsConnector\\TcoElementsConnector.csproj", + "src\\TcoElements\\src\\Wpf\\TcoElements.Wpf\\TcoElements.Wpf.csproj", + "src\\TcoElements\\src\\XAE\\XAE\\XAETcoElements.tsproj", + "src\\TcoElements\\tests\\PlcUnitTests\\TcoElementsUnitTests.csproj", + "src\\TcoElements\\tests\\Sandbox.TcoElements.Wpf\\Sandbox.TcoElements.Wpf.csproj", + "src\\TcoElements\\tests\\TcoElementsTestsConnector\\TcoElementsTestsConnector.csproj", "src\\TcoIoBeckhoff\\src\\TcoIoBeckhoff.Wpf\\TcoIoBeckhoff.Wpf.csproj", "src\\TcoIoBeckhoff\\src\\TcoIoBeckhoffConnector\\TcoIoBeckhoffConnector.csproj", "src\\TcoIoBeckhoff\\src\\XaeTcoIoBeckhoff\\XaeTcoIoBeckhoff.tsproj", "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\\TcoPneumatics\\tests\\TcoPneumaticsTests_nUnit\\TcoPneumaticsTests_nUnit.csproj", + "src\\librarytemplate\\src\\PlcTemplateConnector\\PlcTemplateConnector.csproj", + "src\\librarytemplate\\src\\Wpf\\PlcTemplate.Wpf\\PlcTemplate.Wpf.csproj", + "src\\librarytemplate\\src\\XAE\\XAE\\XAEPlcTemplate.tsproj", + "src\\librarytemplate\\tests\\PlcTemplateTestsConnector\\PlcTemplateTestsConnector.csproj", + "src\\librarytemplate\\tests\\PlcUnitTests\\PlcTemplateUnitTests.csproj", + "src\\librarytemplate\\tests\\Sandbox.PlcTemplate.Wpf\\Sandbox.PlcTemplate.Wpf.csproj" ] } } \ No newline at end of file diff --git a/TcOpen.plc.slnf b/TcOpen.plc.slnf index d69091708..4a78c9ed6 100644 --- a/TcOpen.plc.slnf +++ b/TcOpen.plc.slnf @@ -1,10 +1,15 @@ { "solution": { "path": "TcOpen.sln", - "projects": [ - "src\\TcoCore\\src\\XaeTcoCore\\XaeTcoCore.tsproj", - "src\\TcoIoBeckhoff\\src\\XaeTcoIoBeckhoff\\XaeTcoIoBeckhoff.tsproj", - "src\\TcoPneumatics\\src\\XaeTcoPneumatics\\XaeTcoPneumatics.tsproj" + "projects": [ + "src\\Tc.Prober\\tests\\TcProber\\TcProber.tsproj", + "src\\TcoApplicationExamples\\XaeAppExamples\\XaeAppExamples.tsproj", + "src\\TcoCore\\src\\XaeTcoCore\\XaeTcoCore.tsproj", + "src\\TcoDrivesBeckhoff\\src\\XaeTcoDrivesBeckhoff\\XaeTcoDrivesBeckhoff.tsproj", + "src\\TcoElements\\src\\XAE\\XAE\\XAETcoElements.tsproj", + "src\\TcoIoBeckhoff\\src\\XaeTcoIoBeckhoff\\XaeTcoIoBeckhoff.tsproj", + "src\\TcoPneumatics\\src\\XaeTcoPneumatics\\XaeTcoPneumatics.tsproj", + "src\\librarytemplate\\src\\XAE\\XAE\\XAEPlcTemplate.tsproj" ] } } \ No newline at end of file diff --git a/TcOpen.sln b/TcOpen.sln index b8694b12d..ee6a988c3 100644 --- a/TcOpen.sln +++ b/TcOpen.sln @@ -75,6 +75,84 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pipelines", "pipelines", "{ pipelines\build.ps1 = pipelines\build.ps1 EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tc.Prober", "Tc.Prober", "{FB9E08DA-4550-4BAB-B694-2E7F041A8AF6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{80DF2836-FD54-438B-8754-3584FE808383}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{AB86699C-3DF8-4E72-8092-F25405D28D64}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tc.Prober", "src\Tc.Prober\src\Tc.Prober\Tc.Prober.csproj", "{9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlcTcProberTestsConnector", "src\Tc.Prober\tests\PlcTcProberTestsConnector\PlcTcProberTestsConnector.csproj", "{095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tc.ProberTest", "src\Tc.Prober\tests\Tc.ProberTest\Tc.ProberTest.csproj", "{60477712-18D4-4EB9-AEFE-80BDB903D21A}" +EndProject +Project("{B1E792BE-AA5F-4E3C-8C82-674BF9C0715B}") = "TcProber", "src\Tc.Prober\tests\TcProber\TcProber.tsproj", "{B128B7A5-E6F5-4544-9508-5F0028058086}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TcoApplicationExamples", "TcoApplicationExamples", "{E9009CC7-A561-4E59-B584-77CF416901D6}" +EndProject +Project("{B1E792BE-AA5F-4E3C-8C82-674BF9C0715B}") = "XaeAppExamples", "src\TcoApplicationExamples\XaeAppExamples\XaeAppExamples.tsproj", "{CBB44910-D138-4D2E-8A51-F7350E5E822D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlcAppExamplesConnector", "src\TcoApplicationExamples\PlcAppExamplesConnector\PlcAppExamplesConnector.csproj", "{A941542C-F0A6-4C3D-A1E9-8DB9C103296D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoApplicationExamples.Wpf", "src\TcoApplicationExamples\TcoApplicationExamples.Wpf\TcoApplicationExamples.Wpf.csproj", "{BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoCoreExamplesConnector", "src\TcoCore\tests\TcoCoreExamplesConnector\TcoCoreExamplesConnector.csproj", "{69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_librarytemplate", "_librarytemplate", "{A6F4DDAB-FFA2-49AE-B4BB-5197FFF4A55E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{C73FBCBD-F503-439A-8A88-C9FDFDA63140}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{2CE83B2C-17D1-4ADF-80B2-21E28592D7AC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlcTemplateConnector", "src\librarytemplate\src\PlcTemplateConnector\PlcTemplateConnector.csproj", "{FF49692B-18DE-45E1-9F71-14620462B5F1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlcTemplate.Wpf", "src\librarytemplate\src\Wpf\PlcTemplate.Wpf\PlcTemplate.Wpf.csproj", "{F0C01A63-2A50-4853-BD3C-36EB294BCA85}" +EndProject +Project("{B1E792BE-AA5F-4E3C-8C82-674BF9C0715B}") = "XAEPlcTemplate", "src\librarytemplate\src\XAE\XAE\XAEPlcTemplate.tsproj", "{F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlcTemplateUnitTests", "src\librarytemplate\tests\PlcUnitTests\PlcTemplateUnitTests.csproj", "{3CBCBAD3-E48B-4103-A722-21D13F940718}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox.PlcTemplate.Wpf", "src\librarytemplate\tests\Sandbox.PlcTemplate.Wpf\Sandbox.PlcTemplate.Wpf.csproj", "{8D2E5441-4B80-45B5-BC10-9A64DCC386EB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlcTemplateTestsConnector", "src\librarytemplate\tests\PlcTemplateTestsConnector\PlcTemplateTestsConnector.csproj", "{307DECC5-960B-4437-BB0D-5ABB068DBE9B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TcoElements", "TcoElements", "{99F8A176-C063-43C6-A77F-5207C770BEE8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8551D818-4865-46CC-952B-1DA39B737512}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{A1AD8D81-F434-4439-9722-60FBF6148C63}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoElementsConnector", "src\TcoElements\src\TcoElementsConnector\TcoElementsConnector.csproj", "{EC6FF702-086F-4C13-99A1-4851796DF41B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoElements.Wpf", "src\TcoElements\src\Wpf\TcoElements.Wpf\TcoElements.Wpf.csproj", "{1FAC7CCD-4FD0-4630-A198-190CAC498E44}" +EndProject +Project("{B1E792BE-AA5F-4E3C-8C82-674BF9C0715B}") = "XAETcoElements", "src\TcoElements\src\XAE\XAE\XAETcoElements.tsproj", "{15AC3639-93F0-4808-96C8-FC73FAA97C0D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoElementsUnitTests", "src\TcoElements\tests\PlcUnitTests\TcoElementsUnitTests.csproj", "{5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sandbox.TcoElements.Wpf", "src\TcoElements\tests\Sandbox.TcoElements.Wpf\Sandbox.TcoElements.Wpf.csproj", "{152A59BD-1FA8-4F0F-A126-D410F89229B5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoElementsTestsConnector", "src\TcoElements\tests\TcoElementsTestsConnector\TcoElementsTestsConnector.csproj", "{63EACDC5-2F7A-4885-85CF-D5474A780E2A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TcoBeckhoffDrive", "TcoBeckhoffDrive", "{B649F399-4C3C-4D11-8F52-02C3EFE949FE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{81F89033-9726-423A-97FA-85831C98E08F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoDrivesBeckhoff.Wpf", "src\TcoDrivesBeckhoff\src\TcoDrivesBeckhoff.Wpf\TcoDrivesBeckhoff.Wpf.csproj", "{36434F1D-C7F0-4EEC-98BC-6ECC7D764238}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoDrivesBeckhoffConnector", "src\TcoDrivesBeckhoff\src\TcoDrivesBeckhoffConnector\TcoDrivesBeckhoffConnector.csproj", "{C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}" +EndProject +Project("{B1E792BE-AA5F-4E3C-8C82-674BF9C0715B}") = "XaeTcoDrivesBeckhoff", "src\TcoDrivesBeckhoff\src\XaeTcoDrivesBeckhoff\XaeTcoDrivesBeckhoff.tsproj", "{9BFBEFCD-1854-47BE-9BE2-2F97411A783B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{8BCFD506-1939-48EF-BC45-F6C5C253C3AC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoDrivesBeckhoff.Wpf.Sandbox", "src\TcoDrivesBeckhoff\tests\TcoDrivesBeckhoff.Wpf.Sandbox\TcoDrivesBeckhoff.Wpf.Sandbox.csproj", "{B5A02533-966F-49ED-911E-52A9C8C5F9C4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoDrivesBeckhoffTestsConnector", "src\TcoDrivesBeckhoff\tests\TcoDrivesBeckhoffTestsConnector\TcoDrivesBeckhoffTestsConnector.csproj", "{EE7B8306-796A-4785-9E6D-9186B51283ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TcoDrivesBeckhoffUnitTests", "src\TcoDrivesBeckhoff\tests\TcoDrivesBeckhoffUnitTests\TcoDrivesBeckhoffUnitTests.csproj", "{6961610B-1C57-4BAD-8507-EBD2000E680B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -568,38 +646,777 @@ Global {045B7A24-E6BF-45AA-B00C-63A8726F4D65}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU {045B7A24-E6BF-45AA-B00C-63A8726F4D65}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU {045B7A24-E6BF-45AA-B00C-63A8726F4D65}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|Any CPU.Build.0 = Debug|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|Any CPU.Build.0 = Release|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) - {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) - {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x64) - {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|Any CPU.Build.0 = Debug|TwinCAT RT (x64) + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|Any CPU.Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|Any CPU.Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|Any CPU.Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {60477712-18D4-4EB9-AEFE-80BDB903D21A}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {B128B7A5-E6F5-4544-9508-5F0028058086}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {CBB44910-D138-4D2E-8A51-F7350E5E822D}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|Any CPU.Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|Any CPU.Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|Any CPU.Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|Any CPU.Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {FF49692B-18DE-45E1-9F71-14620462B5F1}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|Any CPU.Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {F0C01A63-2A50-4853-BD3C-36EB294BCA85}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|Any CPU.Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {3CBCBAD3-E48B-4103-A722-21D13F940718}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|Any CPU.Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|Any CPU.Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {307DECC5-960B-4437-BB0D-5ABB068DBE9B}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|Any CPU.Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {EC6FF702-086F-4C13-99A1-4851796DF41B}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|Any CPU.Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {1FAC7CCD-4FD0-4630-A198-190CAC498E44}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {15AC3639-93F0-4808-96C8-FC73FAA97C0D}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|Any CPU.Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|Any CPU.Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {152A59BD-1FA8-4F0F-A126-D410F89229B5}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|Any CPU.Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {63EACDC5-2F7A-4885-85CF-D5474A780E2A}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|Any CPU.Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|Any CPU.Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|Any CPU.Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {B5A02533-966F-49ED-911E-52A9C8C5F9C4}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|Any CPU.Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {EE7B8306-796A-4785-9E6D-9186B51283ED}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|TwinCAT RT (x64).Build.0 = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Debug|TwinCAT RT (x86).Build.0 = Debug|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|Any CPU.Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|TwinCAT RT (x64).Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.Release|TwinCAT RT (x86).Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|Any CPU.ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|Any CPU.Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|Any CPU + {6961610B-1C57-4BAD-8507-EBD2000E680B}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|Any CPU + {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) @@ -608,8 +1425,7 @@ Global {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) - {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x64) - {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|Any CPU.Build.0 = Release|TwinCAT RT (x64) + {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) @@ -618,8 +1434,8 @@ Global {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) - {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x64) - {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x64) + {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) @@ -628,6 +1444,62 @@ Global {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) {3F433F3D-9648-4FAC-AAFD-9FA134BFD44D}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {2266F99A-9250-4E68-A8BB-FC036A975355}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {6D5BD0DF-0C04-46C3-A05C-0FC422597B46}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) {DB3B2462-5D2B-4A75-B045-8AD45758239C}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) {DB3B2462-5D2B-4A75-B045-8AD45758239C}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) {DB3B2462-5D2B-4A75-B045-8AD45758239C}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) @@ -712,6 +1584,230 @@ Global {7DB1F25E-9FE8-42FD-A45E-F8FD0ACF6EA7}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) {7DB1F25E-9FE8-42FD-A45E-F8FD0ACF6EA7}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) {7DB1F25E-9FE8-42FD-A45E-F8FD0ACF6EA7}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {69FD542B-8D82-415F-9189-1193D0B5F069}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {B8CE161A-872B-4092-B0F7-49898E4206A5}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {CFBC043B-C3FB-403E-B3EC-38B73B6C9F17}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {711D4247-A0B7-46C4-92AB-BEA8CAD07A56}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {84AF4B0E-F835-4083-910E-C0AA0BB9E50D}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {BF3E9621-3F23-47E0-B5CF-D3280EF53276}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {4F0E1158-49EA-45D6-89E6-C1A4D3AF626F}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|Any CPU.ActiveCfg = Debug|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|Any CPU.ActiveCfg = Release|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|Any CPU.Build.0 = Release|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86) + {C03634C4-AC7A-4A21-803F-218553AAE7F4}.ReleaseDevelop|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86) EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -740,6 +1836,40 @@ Global {06AE5479-22D0-4BCF-9112-A431E59F0596} = {CF798B3E-497C-4AF1-9270-DD3030968911} {045B7A24-E6BF-45AA-B00C-63A8726F4D65} = {CF798B3E-497C-4AF1-9270-DD3030968911} {EF70FF38-22B7-4BA3-B946-32522E7A0072} = {2F807C41-9462-47B4-B278-4B6C1907AA36} + {80DF2836-FD54-438B-8754-3584FE808383} = {FB9E08DA-4550-4BAB-B694-2E7F041A8AF6} + {AB86699C-3DF8-4E72-8092-F25405D28D64} = {FB9E08DA-4550-4BAB-B694-2E7F041A8AF6} + {9BCC6DE2-B67E-4030-A626-A4DAF914FAA2} = {80DF2836-FD54-438B-8754-3584FE808383} + {095E8D81-53D6-4E3F-8F82-F9D6255E7AD0} = {AB86699C-3DF8-4E72-8092-F25405D28D64} + {60477712-18D4-4EB9-AEFE-80BDB903D21A} = {AB86699C-3DF8-4E72-8092-F25405D28D64} + {B128B7A5-E6F5-4544-9508-5F0028058086} = {AB86699C-3DF8-4E72-8092-F25405D28D64} + {CBB44910-D138-4D2E-8A51-F7350E5E822D} = {E9009CC7-A561-4E59-B584-77CF416901D6} + {A941542C-F0A6-4C3D-A1E9-8DB9C103296D} = {E9009CC7-A561-4E59-B584-77CF416901D6} + {BAA7647B-6D9C-4272-BB7E-C87EB751EA8B} = {E9009CC7-A561-4E59-B584-77CF416901D6} + {69B9B27A-4285-42C2-A1D7-E6D3F2F5B6D7} = {269172C0-2C17-490A-83F3-039F1C6E2323} + {C73FBCBD-F503-439A-8A88-C9FDFDA63140} = {A6F4DDAB-FFA2-49AE-B4BB-5197FFF4A55E} + {2CE83B2C-17D1-4ADF-80B2-21E28592D7AC} = {A6F4DDAB-FFA2-49AE-B4BB-5197FFF4A55E} + {FF49692B-18DE-45E1-9F71-14620462B5F1} = {C73FBCBD-F503-439A-8A88-C9FDFDA63140} + {F0C01A63-2A50-4853-BD3C-36EB294BCA85} = {C73FBCBD-F503-439A-8A88-C9FDFDA63140} + {F9E8CB0C-87A9-4377-9234-E2ACBFE1E5FE} = {C73FBCBD-F503-439A-8A88-C9FDFDA63140} + {3CBCBAD3-E48B-4103-A722-21D13F940718} = {2CE83B2C-17D1-4ADF-80B2-21E28592D7AC} + {8D2E5441-4B80-45B5-BC10-9A64DCC386EB} = {2CE83B2C-17D1-4ADF-80B2-21E28592D7AC} + {307DECC5-960B-4437-BB0D-5ABB068DBE9B} = {2CE83B2C-17D1-4ADF-80B2-21E28592D7AC} + {8551D818-4865-46CC-952B-1DA39B737512} = {99F8A176-C063-43C6-A77F-5207C770BEE8} + {A1AD8D81-F434-4439-9722-60FBF6148C63} = {99F8A176-C063-43C6-A77F-5207C770BEE8} + {EC6FF702-086F-4C13-99A1-4851796DF41B} = {8551D818-4865-46CC-952B-1DA39B737512} + {1FAC7CCD-4FD0-4630-A198-190CAC498E44} = {8551D818-4865-46CC-952B-1DA39B737512} + {15AC3639-93F0-4808-96C8-FC73FAA97C0D} = {8551D818-4865-46CC-952B-1DA39B737512} + {5D40ADE8-31CB-4B89-9F8C-337EA2A456EA} = {A1AD8D81-F434-4439-9722-60FBF6148C63} + {152A59BD-1FA8-4F0F-A126-D410F89229B5} = {A1AD8D81-F434-4439-9722-60FBF6148C63} + {63EACDC5-2F7A-4885-85CF-D5474A780E2A} = {A1AD8D81-F434-4439-9722-60FBF6148C63} + {81F89033-9726-423A-97FA-85831C98E08F} = {B649F399-4C3C-4D11-8F52-02C3EFE949FE} + {36434F1D-C7F0-4EEC-98BC-6ECC7D764238} = {81F89033-9726-423A-97FA-85831C98E08F} + {C7C819BC-9EA1-4B6E-91E7-D7F2DEAE1E3C} = {81F89033-9726-423A-97FA-85831C98E08F} + {9BFBEFCD-1854-47BE-9BE2-2F97411A783B} = {81F89033-9726-423A-97FA-85831C98E08F} + {8BCFD506-1939-48EF-BC45-F6C5C253C3AC} = {B649F399-4C3C-4D11-8F52-02C3EFE949FE} + {B5A02533-966F-49ED-911E-52A9C8C5F9C4} = {8BCFD506-1939-48EF-BC45-F6C5C253C3AC} + {EE7B8306-796A-4785-9E6D-9186B51283ED} = {8BCFD506-1939-48EF-BC45-F6C5C253C3AC} + {6961610B-1C57-4BAD-8507-EBD2000E680B} = {8BCFD506-1939-48EF-BC45-F6C5C253C3AC} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D3448A2B-59D1-4DD2-AE4B-0EFF7BC92E81} diff --git a/_Vortex/builder/uvn.exe b/_Vortex/builder/uvn.exe index 758228511d29891ee77b5ee9ce54656e4e9d7f81..515a6ede826be9e561133468860fb29c51847462 100644 GIT binary patch delta 177 zcmZp0X>gg)!D5oaykKHa31i`8M#le)OE)tz^$Q9ZzsU1{VExi}dI|S29qYO~n->WG zVdlMX;r4q5M&AG?1_p+>$t%U>S-s2{7`!H*6<1a|r(Tx3+JCoa_q8{gCch8yF#^>% zTg5oK8^*+!=NDzi7)=(Du-AnulY}V)8EJDZM0~Hp{8PHGnYCvE4TOQslN%(Y8JA9; MBcZkVh=dI%06(EYb^rhX delta 179 zcmZp0X>gg)!J@TI<@3az62{`mjEw&omv3fd>K7FFS05^WBX7C?yxBs&JROM{n->WG zVdi~*#^w+`kvSW-V3rX1P!W3#k6@m=CcKhS`B>yQ(o#I#DoeeY+2DVPFlaOXy OK6#de*5+dpR-6E6?LpK4 diff --git a/assets/pics/build.png b/assets/pics/build.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3cc18e7f2d70d3d5df9d28b4fc64a3c3e03972 GIT binary patch literal 32480 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∋qz!ou`S>5gFEtKU6VIc!n6nKm?D@T{N9`)9XZ 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 literal 0 HcmV?d00001 diff --git a/assets/pics/compile_profile.png b/assets/pics/compile_profile.png new file mode 100644 index 0000000000000000000000000000000000000000..87984750fc13475947da416152c2263bd9caf659 GIT binary patch literal 1883 zcma)7do&Y@AK$zV%XG)2?I)UNEOuiaxfbTR%7~Kph@!e>zq=5o6&tSjd3MQ_XPP{t zP2OTRaS>_P$|KEOLc_dfhVHuO{QkM;{LcCP@qM53eVp?>pU=1wWr z4B-VeZuESh*+u~!H#t?UkyVeYZ{jMJpKr^1R%tF2kuunN7G0F>Hf?I=Sdb+ITR`PH z$X``XQb9b%9mZ2L^@6`8L%l5HcPF#tY{y+jtguZoqVsD55tLgNHtn$!usiYMJXzP= z66yY(qc?QIk0AUK$c86R7Ve9LHjO}d)>GB1vgr{p{11-WCQPl`5`huxDm~ociPvLQ zbmwJDJ~X|Loyth)eW6HyR0etIo8>jK{R@}jiPrK&j)LIRCWTR{PNCNveeHODN$>D) zQ_j}9Aj8Q6#BqcFHjh@tuV}2aPD~^(n>9z>2zU61MPk2$PaCV?SBhI%{2Q7&CzD^h z-5!!TjF*OIo$>9sbI%N(@44hQHDKShwaV^D$Nft6%Sm54iYs#trAMeK>W4lKDw|l|Pj5F@VqLY>{^>&X zU5gd<01rHv?mGhQ>8JK_Z|?3hhr?O8A{Z99O~ixwu+wg05*oD=lA?$BT=eIyA$qxh z|2ubaiN_>4p|+|Tnon8jqdh+{=W;6!-gFJr+KX5p&?kaOhgp`Ed<{L?#g(Q!~S>0$2*D1IDOCAC)lO5|7P zMwl%pBq!8_fiR_;B6#Q2@xr7sQN!Ry%!$O?qla56BN5qxk?;E_5jBjmp;Db&xS+(p z4`6$jC}hBOz%z@gV?D&|>t8;;jd{55*+)3~u>R7B>6k4-W-mMN*VeA5_sN0YZM^9$ zO8lPGvzz^Uxv@PQMa;1L8F3Vk2qJ-KDsz4I;U&i|nV>ZDu2{~{0<;SiJw6w_luPfs zP%HJUVQtQ0vz3A-l>?qxfhjDxf!(7Fck`wSWeuVxAEpIRr+qT5+=?D979&BiZG>HN zU`C?63Z-}V|8zgmRrzssp&#t^=?W65d|A3mwi&+P=>x@_z36v07^RJGa z5VY1sCJ2gt)}75B_zX95w=o_9vlQ}eV5pc9sgExvsf(tKtE6GD&|ET1s4!nZI(Tp@ zo`Tsdw$WsJY$esYjv^nlzF%L%&>M3jUhG-u2M=1_3(3}N{zNp{-F`Pr^e=<7R9z@x zdpFs|2WYGOYtR3NzbntGf8-@X>os$8E8SOSdu5gg3ZY@%sNylrSG0jD%c@ht_r4_= zNxI}VSIZbkhEw6OMKkKV^M9|Ki%#iHwq1OkSbA@4z2~X*!E@`_In;?$M%J-GIbyLx zSoKzPAa#FjUSntJCsbUNSz-HYvA7bla{cr9jCm_% zLSw!(PT<`D!`rK1HktRYX`=6JAXIA~!mU0ucO?r7GDH<6)rQuwAny5gw?FsiMC)OZ z8qB!&>yGke4Ml>x2AsjVBMTj*QUSk}JNqipaU(brG;u(6D3Z&rSDW$9v4`;X+AXid zAEy@QrP0J+f-Plvzgoo9Ot`!Glz-rc%E!JGef0FizFgL}w!9pmIL?yB&?hxzQ>TQV z9ihjL-Zrh*KFyu&<*c>zzBrJS193~Bol;JNLDVK`o)IZOe%*C78O#tG%IgT9_pFCK zYS+6CSwwOQq4-1fId8SP7Zei__IGrJ>>|iH1$uedjJTNjbya=2g;?^0nYRgBK%Oxu zEJHCv$uM+hfL@_-LZsunGKgr6IgT{`zG>s|POP8uH_X(%7BM6@l0p{v^7EN2#48%F zpi2qe*|9@3nd|#aV1x48!-Yxe2EGA$6~%r7p8Gx>>hS5c0fXHMJ8T=_EHJ%Ktz7j3 z=Kq4x|AEm=F4Z^lW2tx_jeTnoh9scyf(2>t}zkA{`^B a5Nlp4O-t4d6}U?X5rA{VJJex=68-|>^^Y9@ literal 0 HcmV?d00001 diff --git a/assets/pics/environment.png b/assets/pics/environment.png new file mode 100644 index 0000000000000000000000000000000000000000..87c01a883b0d3118855f864b3bd6b1378153aaa5 GIT binary patch literal 44220 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 literal 0 HcmV?d00001 diff --git a/notices.md b/notices.md index df4b0d6f5..fcf4172f8 100644 --- a/notices.md +++ b/notices.md @@ -275,3 +275,82 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +# MaterialDesignInXamlToolkit + +https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit + +The MIT License (MIT) + +Copyright (c) James Willock, Mulholland Software and Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +# MdXaml + +https://github.com/whistyun/MdXaml + +Copyright (c) 2020 Bevan Arps, Whistyun + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +# TcUnit + +https://github.com/tcunit/TcUnit + +MIT License + +Copyright (c) 2018 Jakob Sagatowski and contributors +For a complete list of contributors, see https://github.com/tcunit/TcUnit/graphs/contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/pipelines/azure-pipelines.yaml b/pipelines/azure-pipelines.yaml index 692ed61b1..a3575d221 100644 --- a/pipelines/azure-pipelines.yaml +++ b/pipelines/azure-pipelines.yaml @@ -8,7 +8,6 @@ steps: ./pipelines/runbuild.ps1 -properties @{ "publishNugets"=$false; "updateAssemblyInfo" = $true; - "testTargetAmsId" = "172.20.10.2.1.1"; "isTestingEnabled" = $true } displayName: 'Psake build' @@ -20,5 +19,5 @@ steps: - task: PublishTestResults@2 inputs: testResultsFormat: 'NUnit' - testResultsFiles: '**/TEST-*.xml' + testResultsFiles: '**/*TEST*.xml' testRunTitle: 'TcoUnitTests' diff --git a/pipelines/build.ps1 b/pipelines/build.ps1 index 1c76e829b..cf31165b7 100644 --- a/pipelines/build.ps1 +++ b/pipelines/build.ps1 @@ -9,13 +9,16 @@ $publishNugets = $false $updateAssemblyInfo = $false $gitVersion - $msbuild = '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe"' - $dotnet = '"C:\Program Files\dotnet\dotnet.exe"' - $testTargetAmsId = "" + $msbuild = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe" + $dotnet = "C:\Program Files\dotnet\dotnet.exe" + $devenv = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.com" + $testTargetAmsId = ([System.Environment]::GetEnvironmentVariable('Tc3Target')) + $testingStrength = 0 } task default -depends CloseVs, Tests, CreatePackages, Finish + FormatTaskName (("="*25) + " [ {0} ] " + ("="*25)) task Init { @@ -26,9 +29,6 @@ task Init { } task BuildScripts -continueOnError -depends Init { - #Push-Location .\ci.scripting - #.\Build\build.ps1 - #Pop-Location Push-Location .\pipelines Import-Module .\tcobuildutils.psm1 -Force -Verbose Pop-Location @@ -43,6 +43,8 @@ task Clean -depends Start { CleanObjBin RemoveTcBins RemoveTcProjBins + RemoveGenerated + RemoveMeta mkdir .\_Vortex\builder -ErrorAction SilentlyContinue mkdir .\.nuget -ErrorAction SilentlyContinue mkdir .\_toolz -ErrorAction SilentlyContinue @@ -52,49 +54,67 @@ task Clean -depends Start { task NugetRestore -depends Clean { EnsureNuget - $command = $msbuild + " -t:restore /p:Configuration=$buildConfig -v:$msbuildVerbosity /consoleloggerparameters:ErrorsOnly TcOpen.build.slnf" - Write-Host $command + exec{ - cmd /c $command + & $dotnet restore TcOpen.build.slnf } - - # To Restore IVC into _Vortex directory - $command = $msbuild + " -v:$msbuildVerbosity /consoleloggerparameters:ErrorsOnly src\TcoCore\TcoCore.slnf" - Write-Host $command - exec{ - cmd /c $command - } } -task GitVersion -depends NugetRestore { +task CopyInxton -depends NugetRestore -continueOnError { + exec { + & $dotnet build ` + .\src\TcoApplicationExamples\PlcAppExamplesConnector\PlcAppExamplesConnector.csproj ` + /p:SolutionDir=$solutionDir + } +} + +task GitVersion -depends CopyInxton { EnsureGitVersion -pathToGitVersion ".\_toolz\gitversion.exe" $updateAssemblyInfoFlag = if( $updateAssemblyInfo) {"/updateassemblyinfo"} else {""} - $updateAssemblyInfoFlag - $script:gitVersion = & ".\_toolz\gitversion.exe" "$updateAssemblyInfoFlag" "/nofetch" "/config" "$baseDir" | ConvertFrom-Json + $script:gitVersion = & ".\_toolz\gitversion.exe" "$updateAssemblyInfoFlag" "/nofetch" "/config" "$baseDir/GitVersion.yml" | ConvertFrom-Json $buildNumber =$script:gitVersion.SemVer - Write-Host "##vso[build.updatebuildnumber]$buildNumber" - - if($script:gitVersion.BuildMetaData -ne "") - { - $v = $script:gitVersion.BuildMetaData.ToString(); + + if($script:gitVersion.BuildMetaData -ne ""){ + $v= $script:gitVersion.BuildMetaData; + Write-Host "##vso[build.updatebuildnumber]$buildNumber-$v" } - else - { - $v = $script:gitVersion.PreReleaseNumber.ToString(); - } - $plcversion = $script:gitVersion.Major.ToString() + "." + $script:gitVersion.Minor.ToString() + "." + $script:gitVersion.Patch.ToString() +"." + $v - if($updateAssemblyInfo) {.\_Vortex\builder\uvn.exe -v $plcversion} + else { + Write-Host "##vso[build.updatebuildnumber]$buildNumber" + } + + if($script:gitVersion.BuildMetaData -ne "" -and $script:gitVersion.PreReleaseTag -ne ""){ + $plcversion = $script:gitVersion.Major.ToString() + "." + $script:gitVersion.Minor.ToString() + "." + $script:gitVersion.Patch.ToString() +"." + $script:gitVersion.BuildMetaData.ToString() + } + else { + if($script:gitVersion.PreReleaseNumber -ne "") + { + $plcversion = $script:gitVersion.Major.ToString() + "." + $script:gitVersion.Minor.ToString() + "." + $script:gitVersion.Patch.ToString() +"." + $script:gitVersion.PreReleaseNumber.ToString() + } + else + { + $plcversion = $script:gitVersion.Major.ToString() + "." + $script:gitVersion.Minor.ToString() + "." + $script:gitVersion.Patch.ToString() +".0" + } + } + + #(GitVersionToPlcVersion $script:gitVersion) + if( $updateAssemblyInfo){.\_Vortex\builder\uvn.exe -v $plcversion} } task OpenVisualStudio -depends GitVersion { Start-Process .\TcOpen.plc.slnf } + task BuildWithInxtonBuilder -depends OpenVisualStudio { - $projects = @( + $projects = @( + "src\Tc.Prober\Tc.Prober.slnf", "src\TcoCore\TcoCore.slnf", + "src\TcoDrivesBeckhoff\TcoDrivesBeckhoff.slnf", "src\TcoIoBeckhoff\TcoIoBeckhoff.slnf", "src\TcoPneumatics\TcoPneumatics.slnf" + "src\TcoElements\TcoElements.slnf", + "src\TcoApplicationExamples\TcoApplicationExamples.slnf", + "src\librarytemplate\PlcTemplate.slnf" ) foreach($project in $projects) @@ -110,10 +130,13 @@ task BuildWithInxtonBuilder -depends OpenVisualStudio { task Build -depends BuildWithInxtonBuilder { #/consoleloggerparameters:ErrorsOnly - $command = $msbuild + " /p:Configuration=$buildConfig -noWarn:CS1591;CS0067;CS0108;CS1570 /consoleloggerparameters:ErrorsOnly -v:$msbuildVerbosity .\TcOpen.build.slnf" Write-Host $command exec{ - cmd /c $command + & $msbuild .\TcOpen.build.slnf ` + /p:Configuration=$buildConfig ` + -noWarn:CS1591;CS0067;CS0108;CS1570 ` + /consoleloggerparameters:ErrorsOnly ` + -v:$msbuildVerbosity } } @@ -127,27 +150,74 @@ task CloseVs -depends Build { task Tests -depends CloseVs -precondition { return $isTestingEnabled } { - & "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.com" .\TcOpen.plc.slnf /Rebuild "$buildConfig|TwinCAT RT (x64)" + Set-Location $baseDir - $BootDir = $solutionDir +"\src\TcoCore\src\XaeTcoCore\" - .\pipelines\utils\Load-XaeProject.ps1 $testTargetAmsId $BootDir - exec{ - dotnet test .\src\TcoCore\TcoCore.slnf -c $buildConfig -f net48 -v $msbuildVerbosity - } + Write-Host '--------------------------------------------' -ForegroundColor Cyan + Write-Host 'Building plc projects' -ForegroundColor Cyan + Write-Host '--------------------------------------------' -ForegroundColor Cyan - $BootDir = $solutionDir +"\src\TcoIoBeckhoff\src\XaeTcoIoBeckhoff\" - .\pipelines\utils\Load-XaeProject.ps1 $testTargetAmsId $BootDir - exec{ - dotnet test .\src\TcoIoBeckhoff\TcoIoBeckhoff.slnf -c $buildConfig -f net48 -v $msbuildVerbosity - } + $command = "`"$devenv`" .\TcOpen.plc.slnf /Rebuild " + "`"$buildConfig|TwinCAT RT (x64)`"" + + exec{ + cmd /c $command + } + + $testProjects = @( + [System.Tuple]::Create(".\src\TcoCore\TcoCore.slnf", "\src\TcoCore\src\XaeTcoCore\", -1, "TcoCore"), + [System.Tuple]::Create(".\src\TcoElements\TcoElements.slnf", ".\src\TcoElements\src\XAE\XAE\", -1, "TcoElements"), + [System.Tuple]::Create(".\src\TcoIoBeckhoff\TcoIoBeckhoff.slnf", "\src\TcoIoBeckhoff\src\XaeTcoIoBeckhoff\", -1, "TcoIoBeckhoff"), + [System.Tuple]::Create(".\src\TcoPneumatics\TcoPneumatics.slnf", "src\TcoPneumatics\src\XaeTcoPneumatics\", -1, "TcoPneumatics") + ) + # removed due to missing hardware + # [System.Tuple]::Create(".\src\TcoDrivesBeckhoff\TcoDrivesBeckhoff.slnf", "\src\TcoDrivesBeckhoff\src\XaeTcoDrivesBeckhoff\", -1, "TcoDrivesBeckhoff"), + + Write-Host "Running tests up to strength $testingStrength" + + foreach ($testProject in $testProjects) + { + $testProjectOrSolution = $testProject.Item1; + $xaeProjectFolder = $testProject.Item2; + $tier = $testProject.Item3; + $projName = $testProject.Item4; - $BootDir = $solutionDir +"src\TcoPneumatics\src\XaeTcoPneumatics\" - .\pipelines\utils\Load-XaeProject.ps1 $testTargetAmsId $BootDir - exec{ - dotnet test .\src\TcoPneumatics\TcoPneumatics.slnf -c $buildConfig -f net48 -v $msbuildVerbosity - } - .\pipelines\utils\CleanupTargetBoot.ps1 $testTargetAmsId + if($tier -le $testingStrength) + { + Write-Host '--------------------------------------------' -ForegroundColor Cyan + Write-Host "Running test for $testProjectOrSolution | plc: $xaeProjectFolder" -ForegroundColor Cyan + Write-Host '--------------------------------------------' -ForegroundColor Cyan + + + if($xaeProjectFolder -ne "") + { + Start-Sleep 5 + .\pipelines\utils\CleanupTargetBoot.ps1 $testTargetAmsId; + Start-Sleep 5 + $BootDir = $solutionDir + $xaeProjectFolder; + .\pipelines\utils\Load-XaeProject.ps1 $testTargetAmsId $BootDir; + Start-Sleep 5 + } + + + $LogFileName = "TEST-$projName.xml" + exec{ + & $dotnet test $testProjectOrSolution ` + -c $buildConfig ` + -f net48 ` + -v $msbuildVerbosity ` + -l:"trx;LogFileName=$LogFileName" ` + --no-build ` + --no-restore + } + + + } + else { + Write-Host '--------------------------------------------' -ForegroundColor Yellow + Write-Host "Skipping tests for $testProjectOrSolution due to testing strenght settings $tier -le $testingStrength" -ForegroundColor Yellow + Write-Host '--------------------------------------------' -ForegroundColor Yellow + } + } } @@ -163,24 +233,23 @@ task CreatePackages -depends ClearPackages { #Packaging "src\TcoCore\src\TcoCore.Wpf\TcoCore.Wpf.csproj", "src\TcoCore\src\TcoCoreConnector\TcoCoreConnector.csproj", + "src\TcoDrivesBeckhoff\src\TcoDrivesBeckhoff.Wpf\TcoDrivesBeckhoff.Wpf.csproj", + "src\TcoDrivesBeckhoff\src\TcoDrivesBeckhoffConnector\TcoDrivesBeckhoffConnector.csproj", "src\TcoIoBeckhoff\src\TcoIoBeckhoff.Wpf\TcoIoBeckhoff.Wpf.csproj", "src\TcoIoBeckhoff\src\TcoIoBeckhoffConnector\TcoIoBeckhoffConnector.csproj", "src\TcoPneumatics\src\TcoPneumatics.Wpf\TcoPneumatics.Wpf.csproj", "src\TcoPneumatics\src\TcoPneumaticsConnector\TcoPneumaticsConnector.csproj" ) foreach($project in $projects) - { - $command = $dotnet + " pack $project -p:PackageVersion=$semVer --output nugets -c $buildConfig /p:SolutionDir=$solutionDir -v $msbuildVerbosity --no-restore --no-build" - Write-Host $command + { exec { - cmd /c $command + & $dotnet pack $project -p:PackageVersion=$semVer --output nugets -c $buildConfig /p:SolutionDir=$solutionDir -v $msbuildVerbosity --no-restore --no-build } } } task PublishPackages -depends CreatePackages -precondition {return $publishNugets} { - Write-Host "About to" - PushNugets -folderWithNugets .\nugets\dependants -token $nugetToken -source $nugetSource + Write-Host "About to" PushNugets -folderWithNugets .\nugets -token $nugetToken -source $nugetSource } diff --git a/pipelines/psake.psm1 b/pipelines/psake.psm1 index 74be70c4f..cef8366a7 100644 --- a/pipelines/psake.psm1 +++ b/pipelines/psake.psm1 @@ -142,6 +142,7 @@ function Exec do { try { $global:lastexitcode = 0 + Write-Host ($ExecutionContext.InvokeCommand.ExpandString($cmd).Trim()) & $cmd if ($lastexitcode -ne 0) { throw ("Exec: " + $errorMessage) diff --git a/pipelines/runbuild.ps1 b/pipelines/runbuild.ps1 index 3fd1c5f90..145ca5066 100644 --- a/pipelines/runbuild.ps1 +++ b/pipelines/runbuild.ps1 @@ -7,7 +7,7 @@ $path = Split-Path -Path $MyInvocation.MyCommand.Path write-host "Importing psake" Import-Module ($path + '\psake.psm1') -Import-Module ($path + '\tcobuildutils.psm1') +Import-Module ($path + '\tcobuildutils.psm1') -Force Try { write-host "Starting build.ps1" diff --git a/pipelines/tcobuildutils.psm1 b/pipelines/tcobuildutils.psm1 index 3390703be..d1a71eaf3 100644 --- a/pipelines/tcobuildutils.psm1 +++ b/pipelines/tcobuildutils.psm1 @@ -198,6 +198,42 @@ function RemoveTcProjBins { } } +function RemoveGenerated { + GetRootDirectoryOf "*.csproj" | ForEach-Object { + Push-Location ($_) + + $removeFolders = @( ".\_generated") + # $removeFolderContent = @(".\_meta\*", ".\_meta\*") + + $folder = $_.Replace("Microsoft.PowerShell.Core\FileSystem::","") + + foreach($item in ($removeFolders)){ + Write-Host "In $folder trying to remove $item" + Remove-Item -r $item -ErrorAction SilentlyContinue + } + + Pop-Location + } +} + +function RemoveMeta { + GetRootDirectoryOf "*.csproj" | ForEach-Object { + Push-Location ($_) + + $removeFolders = @( ".\_meta") + # $removeFolderContent = @(".\_meta\*", ".\_meta\*") + + $folder = $_.Replace("Microsoft.PowerShell.Core\FileSystem::","") + + foreach($item in ($removeFolders)){ + Write-Host "In $folder trying to remove $item" + Remove-Item -r $item -ErrorAction SilentlyContinue + } + + Pop-Location + } +} + function GitVersionToPlcVersion{ param($gitVersion) return $gitVersion.Major.ToString() + "." + $gitVersion.Minor.ToString() + "." + $gitVersion.Patch.ToString() + "." + $gitVersion.PreReleaseNumber.ToString() diff --git a/src/Tc.Prober/Tc.Prober.slnf b/src/Tc.Prober/Tc.Prober.slnf new file mode 100644 index 000000000..ca252b463 --- /dev/null +++ b/src/Tc.Prober/Tc.Prober.slnf @@ -0,0 +1,11 @@ +{ + "solution": { + "path": "..\\..\\TcOpen.sln", + "projects": [ + "src\\Tc.Prober\\src\\Tc.Prober\\Tc.Prober.csproj", + "src\\Tc.Prober\\tests\\PlcTcProberTestsConnector\\PlcTcProberTestsConnector.csproj", + "src\\Tc.Prober\\tests\\Tc.ProberTest\\Tc.ProberTest.csproj", + "src\\Tc.Prober\\tests\\TcProber\\TcProber.tsproj", + ] + } +} \ No newline at end of file diff --git a/src/Tc.Prober/src/Tc.Prober/Assets/TcOpenLogo128.png b/src/Tc.Prober/src/Tc.Prober/Assets/TcOpenLogo128.png new file mode 100644 index 0000000000000000000000000000000000000000..4375c14c5ae86163eeffab7e54386c7e68bdbde3 GIT binary patch literal 3510 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 WrA3Q)kI-ItEdZ%+s#m9jiu(`uDQ|lK literal 0 HcmV?d00001 diff --git a/src/Tc.Prober/src/Tc.Prober/Properties/AssemblyInfo.cs b/src/Tc.Prober/src/Tc.Prober/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..57852c4ee --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly:InternalsVisibleTo("Tc.ProberTest")] +[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/src/Tc.Prober/Recorder/DummyRecorder.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/DummyRecorder.cs new file mode 100644 index 000000000..973a44148 --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Recorder/DummyRecorder.cs @@ -0,0 +1,20 @@ +namespace Tc.Prober.Recorder +{ + internal class DummyRecorder : IRecorder + { + public void Act() + { + + } + + public void Begin(string fileName) + { + + } + + public void End(string fileName) + { + + } + } +} diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/Graver.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/Graver.cs new file mode 100644 index 000000000..219d853d7 --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Recorder/Graver.cs @@ -0,0 +1,66 @@ +namespace Tc.Prober.Recorder +{ + using Newtonsoft.Json; + using System.IO; + using System.Linq; + using Vortex.Connector; + + internal class Graver : RecorderBase, IRecorder where T : IVortexObject, new() where P : IPlain, new() + { + public Graver(T obj, long minUniqueFrames = 10) : base(obj) + { + MinUniqueFrames = minUniqueFrames; + } + + private long MinUniqueFrames { get; } + + public void Stop(string fileName) + { + var squashedRecording = Squash(this.recording); + + + if (squashedRecording.Frames.LongCount() < MinUniqueFrames) + { + throw new InsufficientNumberOfFramesException($"There is no sufficient number of unique frames recorded ('{squashedRecording.Frames.LongCount()}'). Minimum required number of frames is '{MinUniqueFrames}'. " + + $"You can modify the value by setting 'minUniqueFrames' construction parameter."); + } + + using (StreamWriter sw = new StreamWriter(fileName)) + { + using (JsonWriter writer = new JsonTextWriter(sw)) + { + var serializer = new Newtonsoft.Json.JsonSerializer(); + serializer.Serialize(writer, squashedRecording); + } + } + } + + private string FileName { get; } + private IValueTag Stamper { get; } + + public void StartRecording() + { + recording.StartRecording(); + } + + public void RecordFrame() + { + recording.AddRecordFrame(new RecordFrame

() { Object = (P)GetPlainerCopyNow(Object) }); + } + + public void Begin(string fileName) + { + this.StartRecording(); + } + + public void Act() + { + this.RecordFrame(); + } + + public void End(string fileName) + { + this.Stop(fileName); + } + } +} diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/IRecorder.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/IRecorder.cs new file mode 100644 index 000000000..27681fb88 --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Recorder/IRecorder.cs @@ -0,0 +1,9 @@ +namespace Tc.Prober.Recorder +{ + public interface IRecorder + { + void Begin(string fileName); + void Act(); + void End(string fileName); + } +} diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/InsufficientNumberOfFramesException.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/InsufficientNumberOfFramesException.cs new file mode 100644 index 000000000..733d99cf4 --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Recorder/InsufficientNumberOfFramesException.cs @@ -0,0 +1,24 @@ +namespace Tc.Prober.Recorder +{ + using System; + using System.Runtime.Serialization; + + public class InsufficientNumberOfFramesException : Exception + { + public InsufficientNumberOfFramesException() + { + } + + public InsufficientNumberOfFramesException(string message) : base(message) + { + } + + public InsufficientNumberOfFramesException(string message, Exception innerException) : base(message, innerException) + { + } + + protected InsufficientNumberOfFramesException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/Player.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/Player.cs new file mode 100644 index 000000000..bec9ab137 --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Recorder/Player.cs @@ -0,0 +1,72 @@ +namespace Tc.Prober.Recorder +{ + using System.Collections.Generic; + using Vortex.Connector; + + internal class Player : RecorderBase, IRecorder where T : IVortexObject, new() where P : IPlain, new() + { + public Player(T obj) : base(obj) + { + + } + + public IEnumerable Play(string fileName) + { + var valueTags = this.Object.RetrieveValueTags(); + Recording

rec = LoadRecording(fileName); + + foreach (var item in rec.Frames) + { + CopyToOnline(this.Object, item.Object); + yield return false; + } + + yield return true; + } + + public void StartPlay(string fileName) + { + this.recording = LoadRecording(fileName); + recording.GoTop(); + } + + public long PlayFrame() + { + var frame = this.recording.ReadFrame(); + if (frame != null) + { + CopyToOnline(this.Object, frame.Object); + return frame.Stamp; + } + + return -1; + } + + public long PlayFrame(long position) + { + var frame = this.recording.ReadFrame(position); + if (frame != null) + { + CopyToOnline(this.Object, frame.Object); + return frame.Stamp; + } + + return -1; + } + + public void Begin(string fileName) + { + this.StartPlay(fileName); + } + + public void Act() + { + this.PlayFrame(); + } + + public void End(string fileName) + { + + } + } +} diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/RecordFrame.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/RecordFrame.cs new file mode 100644 index 000000000..8cd59dcca --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Recorder/RecordFrame.cs @@ -0,0 +1,10 @@ +namespace Tc.Prober.Recorder +{ + using Vortex.Connector; + + public class RecordFrame

where P : IPlain + { + public long Stamp { get; set; } + public P Object { get; set; } + } +} diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/Recorder.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/Recorder.cs new file mode 100644 index 000000000..ced921b3a --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Recorder/Recorder.cs @@ -0,0 +1,36 @@ +namespace Tc.Prober.Recorder +{ + + using Vortex.Connector; + + public class Recorder where T : IVortexObject, new() where P : IPlain, new() + { + public Recorder(T obj, RecorderModeEnum mode, long minUniqueFrames = 10) + { + this.Mode = mode; + + switch (mode) + { + case RecorderModeEnum.None: + Actor = new DummyRecorder(); + break; + case RecorderModeEnum.Player: + Actor = new Player(obj); + break; + case RecorderModeEnum.Graver: + Actor = new Graver(obj, minUniqueFrames); + break; + } + } + + public RecorderModeEnum Mode + { + get; + } + + public IRecorder Actor + { + get; + } + } +} diff --git a/src/Tc.Prober/src/Tc.Prober/Recorder/RecorderBase.cs b/src/Tc.Prober/src/Tc.Prober/Recorder/RecorderBase.cs new file mode 100644 index 000000000..0237434c2 --- /dev/null +++ b/src/Tc.Prober/src/Tc.Prober/Recorder/RecorderBase.cs @@ -0,0 +1,120 @@ +namespace Tc.Prober.Recorder +{ + using Newtonsoft.Json; + using System; + using System.IO; + using System.Linq; + using Vortex.Connector; + + internal class RecorderBase where T : IVortexObject, new() where P : IPlain, new() + { + public RecorderBase(T obj) + { + Object = obj; + } + + protected T Object { get; } + + protected static Recording

LoadRecording(string fileName) + { + var rec = new Recording

(); + using (StreamReader sr = new StreamReader(fileName)) + { + using (JsonReader reader = new JsonTextReader(sr)) + { + var serializer = new Newtonsoft.Json.JsonSerializer(); + rec = serializer.Deserialize>(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 0000000000000000000000000000000000000000..362a2c6ec8366f1141d6db3ca3821f9324d72029 GIT binary patch literal 62510 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 + + + + + + + + + + + + + + + + + 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 0000000000000000000000000000000000000000..6c98ecb7e67d3da8473ea52bb002b167569e0b51 GIT binary patch literal 30317 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%0DiVj z9R`lyBjgZuH^g}Ex(|(F#I9VrHSltg@iriOXYCWH^EKJ?a8GM7((1?}+AIIS-(Ce# zAL;fY^H1EMbuPrY_d_eV7UuG+-g+z!jTI9IW!;j%T>)GzLkomemv`kY*45>z2EiOV54V?eo$mE7x@LPMh=Yksx z5qMK$VHX^E0E;E@(9?PLG%kxBuH~(_?t!ynVrPYN?78A(T12bH0^=Ta;;AIa`)K{t zo_)ER5ET|8_F4oc~{w>Qth|E!o`1|n0bX5M)g`73_Ne(UP;>CRiW&D-+O^uiMY|YE~#)%$sz@uE$$|} zwW;=~S_gk8=;9ufiL;#0sC#D$gsE1)RY0?z*O zG)bZanv?F0G**yV6Z6#`J|?7k7>Ux`5{YY%GBF~~tpifb7(|(V>OqkaA4n11uX)dI z_MC-_@5zDYWcEJfcf1y~Y~^_O52{6(%dV|kHCNENy&}_IbBc);*M`I?$(?aCBCx{c zpM_y`N^U%?!Eas~ijI(ZJtss0VL6Oo;5%%BZS8 zQnwW+y^S(KIMYU)fR;~G$WO;5DOb??%!nG=Pcq152EU*Ecr6sY-na(oX=g)wGY`!P zz0?@EdNLSgGB0FLO%Q@nhaTadYP%%8P$=mii*Go^#G5Ik@DYUm_gIfU0Csf`nHLdu9Zd^Thoz2>8IK-teqYMfJ^V z8LTtux4#}6_MI$w^A$RBcH2r2!Ss6!>VS^yW3PIbkSpHr=5W`5)`Ig$0k4*Al5}%i z%>EOShjA~Aol`QPlJj*|4U;ISzV*sCeUia?31M<2Mw8h#y5%ICGdmUQS4PgKZ8-x^ zBv=%!7G-ZtsPGnaWT*~nlepI5kIss`;7g4XTP)=)#jBIWK9;QL%@w0099|wT@A`^e zpmcTo)>RGxNC`!w_1;Xh&rwCSeYzFvZ1hs*kI7lK@6w<@Wa%!IJxv0~(nbft>|GY} zT?n9J>{>O+O$6(yIl^^fSD=0arJVS_u7o37Q#lXOe#pfmT{XEIo~_`wB&=QCgMT_M zmr=QUr@6x`P78D_|HMs~zB=mLgC2|O>tf|KAqzL}JUtDny$j9Bu#vOWw0B8WY0H(9 z-1h?C5)k&oyDbvI&E}obx1(1}Db0G@=DAI#&84>DR=l-=r{8si-!!Zg8>~6oX+t)X zd!+;o!MOLk_vMg$r&Ga3LzL6N#vZxKj!y(L++u18*;!4m7ow-&o)amxk~f0n5-79E zg~0J&XwQ(fhu?IA`=vhVHW0f;d4fN7%Cp%kWelqFNH+xgXsaFl_D!5IPe@>qi<#vc&WuK1x&fl^?mdjh*#rL1(ZIAC4&XK z6LNn4TvS}dnjI#AH3nu@)W42uHZ&)-s7mY5e$_2Sqo-%eKCNnXX=?I*Xz)nauC9h? zOg$24Id*Kt29woa;`I;AU``v0H}+8N`GU#WZFH}@xu{0L$cIQ0?h#97c542dNeUt8 z(Xmmsm`N)x;+;E?Asr00EAgt{+A{2`ZF;qJdjdUP9&uZrT%r55?ZT_-gBjNKFBr#l z)64|-*tHbW3XtAKB~;^RPpMu#pHgN4UkLJ&=QByT{;e4Gnb*T_qh0?*hg!lEKN_;( zh)`-msB-$5{M}-4m+gTd9^Ei~JF465fpcF*=5DB$tCQ8qy&*{NQ!@FAey5GP?a0}i zpIRWt8bMgw+g95Y|Ll3~GV^I|LL_bXM1a2%w`WW3w}ZTDOmvW4^4!)U;5W|_3OaQd zW+7%MlbB5IK>`wfR;)SZmh8rg>oY+?V*LOa8M~#&vDoMu+Oys?Rn|0ahAVvls*2TU zV}&@&y?GU}*Q_;sYT`?{`=f}$ez!Dp6!OASs813mtEuS0ZYyL;TXX*+%q#rnA++#{ zaC)-j?Szf^Y|j&IfA-Jp2|sT$lcpI zl5OmudfWz)ECwoa!vI-pPX!XOd7f(lbW|lbst&m^!LENd+F#$);Q2D_y!`aR{TG#2 z*^#bK_9BHbY~4)m9_qxqiNP($>wr&eNpbp;Fud9_uDq6S`S(g9T?1mgNG|Qc zuwBF!144l+AbipLYUZ|9Tv{$31iJV<5q#^`Ox3&JIzxxQhPlgT%K%aCPd9*sR$l&- z-cHC{oXI)NW-anA22ErM-G99EL6I*ynzMgX^@gJ6SDI=?&3A>o$)s`9M=P$4{xzbg zoq;=LB(g7$=PGam-j2O`5u-~kHh_+tN(6U420niLFU*)GdbZ`$qF^JcQJeQhTShi7 zZpT5Hv?tZVvu`|hL%gGZlt@5_Y5dDsx%ojVzpjr9q?;?o%dhFT%&i8oyZ^qV6`*Se z46NY;H7sE5j$AvP;gVjRE`DAPzUn~h8W89$5KuRRKo4?*XUCzqo}Itk+jVJGu#o+Mx7qEeJ+1K};S5aOmMb$ob@4^;TSF*z}?*&@kIv@Mj{J zTx#3!b~()=h(N7Q^La#d^G>H;mMb}D1QdEh-j`l#DPMra8CTvKAleyeXO$Bib@TFF zOG45M^=LOiAYU^P%%3;(fkzft3LOblI zi!k-)(8{8qHCtF>phKxFBCmVhJAlVJ**o#F4VrT?Yc=Sa$!b)iEs@hTqgWx75^5@C z-J44}>Uz-3>Mefi;8|f@;-oydhpbqm3<7Q7QLtRZ|0Y>L z*XE@iq@$4RR@pLbEF0-+k!Ad@e(5nb2|XW+Y{39MiY)#R9j(QEBa7L^9mKLJeWPUJ zeJ^8{d>=i6+1ZziAf_5cER*_t1moHn75E2>#$>92!V=iQ@?z5*S5l#YRR*-z_ojX(gZ-c{QYbu=T24B!Ki(Z7LYR0nPl52p* z>e043`~$8r8F1EbL+YzSii(OPH%QuQ>Auf<*sDs!zOYnEe~ia@-L#F_ju70N_*{HD z&dlEHLGuP9lPw@nbj?kub36B-s~Ti_5d^yX`5}G{cGFot>U0wD&J9Y+6$q&utm4@N z7IFz5UKf-N@u67rF1zy+=Zq?y>T&7un*bv_9Ff~QfzDh^{A*?6pHv}l;2{jz!wep$ zSQs|H{GiU>D=~%O(ryD^I=E|cHvJjmqrN!%^Ih8H{)J`rZ6J_$3xNGz(ihVU@h`|? zpjU?g!0MSuoPR6dw+qI8H;63|DlbN}YkY>tdaY@)-s^^{!?nX1mZ6Z~dgzF6E_Y7* z<}-<@UL-paYjl?S*|>L)l)L=I9qtOy*0%3M7ymW%o*HP5!KnkD>CMpbhNOm7%O{H) z7jpn)Fx)a2qpaOSA+G5^8)Hacn7i12mycXu;nR5! z$ckU&Su%~NRy6xQ>_XN}o>KwZBdqDIz z-&Ck`|37|pz6QS>i=D@|%ES`y^R z!Z2O2y5UsrPzt{{UIbv0FwBqYtlPB_!T0Ozjn4uB-d8g%u=2tM zn&BF*h77y?&69}qqq~Bhc9Z;#v}|ZbVoSZ2ls00Eiamp!J`Fljj$i(~8fGWGu6cub zv-Fuk!N7#EZ6eV0VSF{_bj0t56y-J>16|eM=ec5%4$H(?KkwLa?mik+6Zv^{nPYv1 zrVW{7zsE7Ht6|!mU0&N{_5dN5;FCz?wDPCB5ad?FOq9=Ho8AYy4)&uuWL$-}FwKtT zb>p4nIK4hs6x#YK59zX3HLKWvatu!(GB204%BYDYhaJn+U zd~JNt2=#IjCxWwP>JoRL#nl>H=PxIjtU1=p+7Xe`-#J@~t(%%IV7d%k^k{(|BI zQOUsp`$ju;jMR0zk=WweKds>Jn?7ND>y9}c@W5Jk2!7v)$z!8BDjeQwZgQH&Yz3A^P<7c!s|it!bEx|>jH5q$$lB%K)i2{)YhvT za9J*DnDM*Rn5gi#^}(WNrXN;lMEM`0=fLyEIT`P%J%v8Rc%Q+#7N~QDzW>?A&*<`A zVq4*!r?7JTnm2+W6>K3h04RPvA4kz7NwvF$6n3d1HKq~WKL)lN05Pw4l|T2y{9gSyg2NVTX-7?MhqKt>N|juW>IwNIo7Z`3ohFBT%( zjr2x*miDzr1BuIdPjP+q)4 z=3I3Wt8iO(9pFu6Y?Ke{3UkX^sa{1@9gYUYS(Z z)H|Af&hlv4++YEj5JIH!6Uc;RJsXV08~-4pcQearF6@hIOE9{inf&fB_1!S+WzIFFS!^tClg&pMG3p(Q0qsikni$ye=0E(=qxw0_$jG2wSSBJNkX4pAipL z!gqR+!LnK2mP`$vYuNKeVCuMrlmvrO9rOQ?ccJlVMoE)(U7J{@PiE@Gk7p7;+*wW& z;`PLOx?a%Dx7Eh;O6F?k*7>UQ?&X`o=C~ioydJuz&}-JXU=KPVQmb~Nn>3Sd3>{$_ z$IeXLrONIstk0{g` zp!(S1=Zr1ty6>W1es$xvYe(!FnSxdZSoZnU8plO64>N(#3#laM;;Wuy6A{7HSiPIn ziQ%j9jN`Yd+>Y1f^+bxiyR#I!kdFWJ*dps{X> zP*N3HfB!M>Kn8bMbC>W<#GLW@2j0T-PKuAD*9Ue9hL|;#89lR9^AO_dbsaqOvz?ia zx8unAen>_+g<>lahTXMJkxqop8HTEluG&A0%dGE-djSjXpKiqgX4D>+Y0sEk*{!F+ zi6ndqoBpJIeIzEp!?;PRh*{ep_4y0jG)sAl0}(WOXHKx%diizea-^rvvQ&}f6`w}J zV5_S_ch@{Q$LmXQ-umRi{x5MSxW?kT4GcpHHjP2v{haGOWS^%yXPyEku+HhEV86v zm!66PWzTScVWq!)yabiHCd)LO?@2h`*-ig2Gwec*YM^Z?ZwqPcBZx_L2dgdgzQ7(u zD-<9ljqB1r3k77$?$}KLbiA>^!)(!R8RQWPGRt$22b>7!hW{zg@ndl`h ziHQlCdLHJ(-Z0&5J7R`VmTiN9wzZv#$A{SP zl0J|M?*yP48R;CSPeJ~#iUg4rS9!80N2H2IVjLG!J|2$ao!*UkF&>|VDQ>{}-Z^q< zuxGH{HDWpdFV7iNOC&ywuYSvNx+_;i?GsQuYkOW~mu1oOC2H?a(Z7V^ZlJG}ST?Q`%CZZC^+ zc&ax*EeZ^`iC;`12E+zj)wYjJHRNM@24*VHkN{M%zfpfQj9FACV*~j2-lchOD8Z^GEmPiaJhRzjFvh$n5$KT zR82)X>=@sC+}q<+vB9&LskHh1kkaYG8dhlvHNs}-4E#cmm-pwvcBvu(>aUWJLNsGPjaeUSiJ?X+6W6w{wrK4VL zJyDV^BN%xUI_*)}PLIdhh8Izz<0b|sA6n3!$IX@Aj z&qB!gnYps-&RX%5;@iroJnvwNw}}e<@vJV(I_7zn;}oG+W^*Y(^T-UBHWiaN>de=Ll;sWzzb3rYB3Vq4sw0%(kf7(4l`8N3_Q&EC2 zwa!uldFgI#OFnJ#FUP~n>oDx1WdN>N0bp9RK3+rWs;G3qLIcdc7L#cI~+Eq&wV`m@;Q%SSfkFQz;xa%ortg2k>>T9-R2Jkjc~Acj=sW zSbz3Z_JC@8)@d|3ZnxHCiqDtv1N-F$cA^>qv88wKHEOQeQLNsyB6VmolRD!~xzqA4 zFw5{|+XtPi84~AU=pLVlYL~bO+4Gd-!vXb$6L$g)UrbB{wZ35VNekbfObD#qf00tO z=h9%H1w|Mh;F?B~ zFT#|eG3fr~g=nPiyt1QF%C>i%5ylkd3q8a+`;%iS=R0T6Z@bu>EsGMJmAW^g+X;7J z-7mp9W84?}=E@!nb0kQV2+Uow%cM{@H_JK%$%YTTHlR%HhTNbmYoul!wQKM9FQ=Xq z@FtJ=JID@c=t8H~C0ST0a+HL69l(~9CldV~)-=@_*~)%=clj7~U!mu~~{ms?Ng0=>1I zdZ5FO^Vl*MUY_4fuZiHQy)QF9zKoU?uImT#VFS7j z*TO6mLi?i8oZ-1OQ=i9(KzrgL(}~A76=uY+0zH*A7cz_Uv2uPq=kddPFJi9_UX6Gg z*>lvllggN3jRj!{OT2T?F~f71VhTy#xXd}!KA7bgoe{wwpJMh-3|_<*b$Z6(Ls%U< z!(Ue4wFkEPMYf}{-5L16P5<17ylr;dd67OsUscb%L9>)R{!t%p!(-jzNo3ISHe`+P zvvS0IF&FQ`jYB1-?O5^ZOeh>SN`aFDG8wGe6ENpC!`!)u65t{RLSFgS)JCFTRyy@ zUe}JWnHhr?Dl)Xju65u-f^lwE zAi=sYRKF*Uzf^Xxsil!Lw`7 z36$&MMleDm_NZ9>eLjJzo=2F8ejYQ_xf4xR$vS6TSh7__j9g*GF?#TJ+){M@;rlQXlEW)b%7RP-tHniAKBB;?iJDFGar1CO7(%r zbsC16Sj6&QdY2iSS*1Z&Uh7*Y?^2S1aD483w9aF-8ueC7@YXOz!8!uKAMieE*Cp^9 zu*>`UV9Tqw!7})KqL5XZ#s2edJPO9|R3-_AsN5@=S-ThJm_{*?)k=&TdzeUX8e@qkl0A;%+{K9=|?jhy6${E~lfj`f0 zDZct*L?#Qi`;Fj&wuni6r7CA4_jp7*pxQXax%oY^V{QasR$;sbpD}jibQ+Zx#^kYk zN_`?m&($08x~8X)LVspOu~A#55%&zUt61>A&Da5q3PAhrBqFXWg?Ul@&Mr^QGdsY0 z;7yibH0gJ4K%J_Ht#AnlX(=amhb2f#mNEa_18&8+S-~GIhD+-=RVuz>{2NB&{aB#m zwY<#!rVxNg-Va1`HHbSvwO!C6id{?uNN^DceFlCC*qp!QJt8van24hI8~+UGtbw-y zT(CNjsQ@}Y4j{(=#&G=W0MX!|ga`Dfu?tAw@W;Cg_s`TSA77o|15$zqFJRP<>tQ}W`4}z_K^THRkkNNYJJE?G(?< zaY{0mD^oB*Q%Gg`MEuJ;GnzqUKjk#04J_rT>OdX+}0>7}|N8C$MmUdEidPvtV`8nMMr~_HhSd<@? zAsm5G6Ltru%KTx7SbZBH4A9s@l)R7J-ZpYboksAfhB*IFWzdVq_|1eObS9u?T${Fw zU1?jd*)_DPXtvnPW&f&~sZPXrNk-*<98!Hh$1AJSB-yPvmF3j;K}$WSSkXa>yg2j0 z-+pl?6QK4kUxK3=?@xEx&bk&8Q-sBUptQOb$D215giI}uwHb(45mtRDm|FR1=inI2 zD}Dn`s?sM=R>kRIt&zUtdqZ)%T{CT;jEG54XKsBe>QEL`Mf@`|@7hy9d2x!hZzu&E zp9BVd$iZ(en?+~JTEaa~-rVyLDLJbwEzX_RC3BL&uiqWXwyzMMF>4r1*tnXq0L+f= zf3AC%qv3h@Slpl#$ana%6}&c(<;eUvxQim+irc4ebS%RCVr`Z28;tgL>W6r;Yq(;R zhxpl;6?2ftj$O*(mO&^JEe)hV*ky0%2&i&bwFI<7-?)l{79Zg^7aIedwI*cCEd__W zluhDY4>9`(??RnzB^!~sR^{)XZjzko@zAt)J$^=8@lAq4m$HUw(SCr$eFuo#q~%9w z$Tc(G>JaaquZKrmBFRylhv9yynZW1fDXBk_RmnYz)NTR^Fl?@poS&5o9X(Flx9VEx z894qd8J!6zw%9xEM~~eMNCuaTWE)6W)g4pyO34k{-c;h2JC%KE#8LsEHFbd+p(Aqo zvF)ts#{qp?_`r5lJgMl0Gf+maWOLy4CxBUns|;fIiOEetfgx~ zm_1iod~6XX0P4P_Vr^998z)!no!brNj(`%dr0T8zO3?e>=UNx*Mq6GgL zjO4liIvjr|qv*i>Z=uemS$zMmp)utOeTNy=(^OBlzjpzYb} zkhXML%lks+wpNX^kH}{)13^Ql*A$wG!j$JkSwDwk7F9Hab z34KZ6V(I}*ODS|DtPfBX-4qk^;rrF%u>cVT zLI++tuM`LK^ks4Q=+JtR+%KvK65vHJ5fE>%MW=6#E zp8?WJgPGw$)6@EcQUN1?E2^FTA2P;+ck1n3RGvCx)XnkYgIjZQVxT{OgrUoVI@f6w z@9)^Ru4kPI@!JqJ>cOa6e0$oqUx4iea z_UAu2_@A8q{xs;wx1!V0jn=+1oDgyFG{D`za%;uSPnH49k*K+R*&1HUd0Ok&=#>JV zqEY&~tPwI6rETMGmCpwWKtprlLoL>jKkE7N${-qMkp+AMSd-G9^U0n^H*5V(efcq&LSu(}2MzbWK zyBS|L>6SFhI9-PXI=*n=ZKBls#=~xN2kkc@+{Z|z#`FChP?g|m46vZXe_K$OXDd#OZuHKv zE`V6#hv|mqB(!w={?g&~X^BbOP6;(g5bY3ezkw+Ue}35aIZrjEuxxvNisbOIxP?Tk z5)U&FXl_IevU7Xs_Z=7q6l_E2MGSKxjofMv(Sqo*J0}q;>1BA_CaEsB2a~2p+-ejm zAZl@D@(xm{4e=u&&}R|*_qgu+2mq2fusdw*km$Ao{3xcz;LL~y%B09zRY6+Pkn3?) z;R%D&+=^@3pS%%t%{~wRKt|+WR(q$QD(O}X(-d&vjPuCDi&q>rS0m*tWq#{1=zkb= zwei-}q3O6G{d;eL*>@jhYzb8m`RRGU{oLr^+vDee{z~!nH%*kGFdrgVU{gg;;?*w% z?TLdrBUKyMM$e#8KsIda90Umii(h}x+9DZ$TR-qO_@ni=iek=h1D}I|K(!&QIKRo7 zAO09{sj((rx33_0mL@++sf}>G@AEW8D%raRe?|Ha#KyHz{SSFsU0bm;XOA@j!j^s; z@3CW%9JL447B9;$_>khwxL4wM{E9q@zLXt>Jud|}#6Z50K(Og@1ta8a5c2tKkjYSC|>k15U zr)no~op$=~M|2-tBAi zMJBjlc?iJkYkT5DXc(sZRJoaG=k(2f?3}wJ3eZOYqo)5H_5V0#|Nm!zw#WG8Ws$a(<++Z(1(kmdnp1C(?GAjOqS&54^lq@ok6!`1dj` z^`x9%{!r*dhRR`2*yUqD2;BK^3O;e5A^z|3WttgK1YNeZC3!jwT~dkg2EF>@=S<$t z{MS1gA=z-|%fb{N*VwMbh3=utj6F5yjWvB%fF^!U*!htXF}ZI3y40mC^o&(snFU(N zBjMx;?a8*Wo)v07aYH-pHD&v{x~%^+t+X4bJNYHigxT?o(TF-D<1_e!WTKRheG16; z^3RFvJS3NJ@dQxs*lWu4`8yzc%__A>e~5kIKbM)$RoUIt0gm0pPW>I!E`lw89r)i) zJ;K{*lZcbZ=Wkkk=56^k#3iIg*;~7CH&(ieBJK5)z@=9zS(pr>`KZoer;9{m@@1J0 z*f=LWz6zGuGr8_|XtPD2^w7x~eDCv=8dTrqaOtMkh6S1d z^M5AN%c_gd%cfZ`*7@XlVRb{@*FnDokP2-JQIgacUOnev~vzwkB*i&~- zS-yoHe#zwJg~BI~9{6nDqwQl`Y1$lgEka#omXV!K7r9>^qKVLvi!XRjF(?z&4I_w?H=7(3cr=V9 zyj*sqF+qawRf&+2Mj@<26eQp4t-JZ;MQsPeDq<&l(V*LOnlHmrTZy~okBoido+$r=W)f0dK`Y1#`fBG4VeW$6PmRpo8mFMy;TvX@wL5&v8LE9g z9W2!amIl2F{l=esQ+t3=jee$1>(eG0Nw_mEdx)D~ScGKM188ABY&euXmEjnrcMkrj z_$UGndZqtsYM?wfgRdcnKNt}cJ9P%H%7Mc(PK2{Zim6VAwgorSbkApLWjAeW=mS^uJ>P9(?sK*IwW>?* z!edpcjD?HW&@~sh>kNH1$=by!`0cI5hoq9RhEMDCp=%ry!R+vO$Ml*y@h0$Z?1joF z5_y3J=as}&e_N3AnkW;OePGPYoHQ^d4D!y?HPfSaU+AqC2+j=IKUS4e3QDwKyLJ#R z*uk`n%Zz_t4f0L@iK!F9c;}gK3D|JvyJJH|j18k25SzZrh^HBJn79D}9!Q9st8hE- zCT<+V*0L>(Jvh;6GG4RsTr~V}X_?|?s+sIKWy?XTWMa>_^_?rSs1|{s;rgt|XH+DU zw;|)_n+A1?GD=M4fm{Blmp71A1g!pN2AW<=b0$dK?UZeh)B$Gm`*AoK5nq`x?< z-gO9_#<)1uxZ7XswWJ?M=c)if^Oq-7?o9&6i+=(7j88Nini!|40pJ^JOZ%BH+k-N9`TT+$pB1MW#vD{ z9aA#GDS<8jMY5^}c{?@u45#YT{7q;2YyG23B5;*rFIyn_Q)VZ^qksDxyp^h=W7rO* zZy^5R&#C<-F#CU9B>vw79A3Jp#;`vf95l-ULxEBRxGnQdKL@z0vk0&fMO!BVto1eT zhBTF*0caIf7hz~GIt)zRf|$Op1-H<3po>aB{SW^M@D5w#%d9%imvf=bWqLsj<~2X0v4 zi}7}vBM8&8w{sytExebp3k2%<4W&*aDSuX47u`b61jSXib&RpM{Xz>6!`Y zuc}hIX`U4qK8^orL2O6n`Gw_0q;jSzOL6tDb|T~YBO0!f0?VXZsN|do&p(L?oTXSE zKS=2Vpw)#5oe&2Wu72nM3h@RWgKBdT1j_xjJqANzK#>Sgc(lU84n;X|5&wnVrPv(R zrxFQ1-F?u3;H#f%xyPbULp5yL?p-XC+;MpN{6=&sK{RN1u;Hgc30>*F%NgwNp6a`ScoOvm5*>HhQK{C4KbZUCm|60ZgNZJUJbIHX_w z`CCHF5$@jvo}VJw2h&m7ME3LAKsS_$iRI?T@dHKBHwj?Ss~x`rpyqv5NL&)A=b%~V z-sW{TX4#L^pQt^?SIv9CrDYr2^Avqwdw{M5{Bl8adUUMyx1&8&AEK&tk$(b%3^m+5 zkpLz!JiR(6}dE72G~mvzZ%2&=C|RJ$GN`+DjGkg-auij8At{57QjRuHe`mjK*i zBt^z3(prH2sSzoPF`9$>V&w}|x~e}h5ODetY16dHk*=oSpC3J7X>7N}Rjy=hF1zU! zHV_?i`gHkQE&-u*HXiX&RpL!VN`YtH+8u|zQd=T|RY)IHj|J(nr_)HKb^wOsHJLv1 zSbVl6GDp0RihXu$4Z=u6)U=A>C>epJ^8zL{^gtj-fDmy0-o4Q6hu%2a)FB=puW)$2 zR%i*Pfu-xrCw>FXt^5`9fsD6QcYv?EHaYC8Jn( zcRvUud-&&ZD*vBShzB4!{=b?+PQ5OhW*7q63r8SsTMt?NBM|TWEXoXqK+px4cF-x@ z&jU~ro?ORit()%B(-Y;JoxfmrRUKEPF*8il2)7V%3V=%ByP9@$8Bntp1KA3zEkud} z^v2wu0lM~EK>s>>e@5aT|MKYeLiWMk&cXJg!LI%qEFU2S%=)G5@&A&}c8c5`bP8yS z?gi2u0-%|{<-5JV9E{E|H1GTk^lItnaQ~|G{dZ;3|0wPKNh|&eN&i1cIsc+g{?8Kr ztK$1Ve(>)pga4cbQG5MgF!aAl{r_{A{&SfA-4&Am1eE^-l>d&0{ZByoPf!KG>faNK zuadHGxtWHy{Lx_gR>ECdTq8CH-2SxPe(%{KoKZ4xTV?5QDlB~|RO38Q-%SAR`JepL zw_gHJ3A(8q`)^l|9p23JUIi{v14P5mMCJ=L+DE_chCEw2az}5d_i?qhZXMK_BjSF( zeF+rM&541IgaFs8OH^`B1eTj{fh)29Wq<=V@N$c`Pv)xI-(V?uo`8rf3usM!`;Mqp zplge#;R+Tt_@}axUD25ENFwlQM{MN%18q%(5YH&yF__rLr5O?manh zie25cm{TmgHGQ;hBG{n06*rj*c5;F72q)GH>^Fgn+){VUPS1tD&0PlYvX@mUtTNj+1;nJ1!q~-Ze)ue z4Yj|ne76Gwl#nVn12<~p6oxy?d>9y;al8)mAR2iRku{fliD3CYkVuxFFVmRKZLhLK}bx00cDzi5-h{>D^+Rtf#d zgC47vSQEX-(Ob!ac2(xwOO|uM7dQV{`p8+>?0tCE@>w(4OZlGTExA8%?AEeKj3es? zy<7AT3+2GkZKKEICkgSOh*mu}N0B#RYNsfKSvpg{hC+V?WT9zpkE=)q#zTjpT^1Nptd`h|8PH5^q6YZp6g) zd$U{Cf6o|4%y0kD|1{)ys+%%3>Hc#8B@Ga}zLsI@tg+jrLA6<0GCgdvY>FWi3X=BB zEpw#teZc_l78Eks&hGM+AMu8(FR<-7aiU#w39YErpmIQG@nLvb2$kSL@4GN$MuN=N zij!uyZ^v~3qIeU*#V2%#r`OeC&3tLfj7EqP^?W4jumV|ZlhX~D(WLsTo0G1{W-sT} zOdx{$Gstb!@LKC@*uK+t$1QuuqR=>AEA7{~Rlhn5=k$;CNyb#40~9jU=j@_uDVNM{ zTz=(_&T|6}F4X}B-A`_GP9|TgvbJ@>9z+&h0>lq8ifDbjWYHU)=2SPg%o_M z{k>s+1@YD5>|BeM(01y&)zE#*1$m+}jTXFOxz?q_MEB`y8D7l{Ea_|WsPZ-+dx z9ir5Kn41l9#w?~GJgyLgV<_zpe3UX?neJXK_5}Tln+XC$5xP{6b&fcFS*K?Rtwo(# zm78RS{amp3++++PrqoOxfrD;njXXavza02@>R3v_dR#CC=KYb5z7n1hFL9O7qbR^C zH1JISKn;IeG?+d{$8Y_S$9zr0?c{-Y|G;I@AWiWuNg<+7{Ko;om&)gKdV2kfR7GD7 z=3Dkk2#lvx$n@V}Fo+cmj$UY5;TKQot37j0RSiP{SE~)nkMZ^k@#W%|EiB)O{9L}Q zC}0j+?G*Q8#tYVN_rRZ{mr=)q>lzLS`7{JHKv2k!OmYdxyu4oB3E9}T4~`jwq(^H!KTqi_ zbOO`VFf>_|^Mx~pPKJ10A2dkhA3vEYw&}mMk{N0h{nn-zC)7`}^}&68U6;3$kDq=b zoVwN)S)CA6OuN^!Rm#7qc6ML7i)TI-}RHm2?V@J`ym_nF}f3&%J=FY zPEMbA8x90bZDU4>`|4a9>*&|R5<{LQWP$|ZL#y8Qn=Rt;d2}RCC*9oi! z#^*NUg4fnrrL&`gnBQj4W`9(i(rAPC?_HNW&3BuE{74D#oCyURy@$TAGK4nu@6?VB zt<9gKDnIm=+N_H%j2T)`JcVE{w;T>}{euD0678@u9X*^?B&`d(YiwzoU%ja_wX++O za=13`Z3>@|dbiD{Cf!CZA1*>`VwWuyzUMkifQrRoA~0y_VT$)EJZfL6sVesTkUj`EE63||`k2kWP(w<(vXx%mB zH;Y>+Tf2|TQg|Hqmb5gxV2Yo>X8sMUAvcZK~xqAR_B8bh8$BIzcyoTE2~1C1Vy@_mF&T(jCFDCm`cZttK* z`g%L+eVWMs;n2^yi;6YX*4OBBM?f$-!`a?qwit(1TV7lU^THAfGyq&8ypx%m8!%k* zUNv!vJ2>`P_do-z1@J8xo<%78!M^@{@oScpJisr2yv2Tsn&QbzBHq(mo%Opz_`BP;Ke#9}bBXh1_eaN(5U~$+dph!rEd1DGfw5+fE~TV6toq zePw9lTC%Lj;)F%-5t5JTJMX&J?PmG~mK1+27h%e99o{TPi5*RlZ%;7uFbN4(^6)Xj zRyhbHj$_-~#=+YUd|=Rol+-S_2Xjp#t0VNWFVYsJZ6XyjiFQD{*CZ|QKCPlTgQSWy zjGaFFkEFwlosUz4rM@#NdVFD+N-`Il795T|hI4`ePz3_XT3nIgO6a57n(=X2%-q+>tV<{fW|4W#uhwj<%ch7K}DpUSjgVvdf9X|y?z zT&td=ZS9HGHACRm@;k)Y-V%Kn^kNLo{+4SiP;5LOh0jsb*ypT1PD_1qSzyZ3qSxOv z!#mkaBG2ujU9^5!waLBwgyRN=s*_G^(>>j}Jbo)v^^uut6#%D)xPYV*X^&Ng@9e=b z7uamWD<+oXDo~%fiilsijGZmWH?iB`lx_SG^t@aGgsq6p&ddt~-A|5^%lQdOoUhpY~?Ep#PuXTR>O*4^Z&mJoWE^ z@xPH&DRO#kctxI2jK@o}8EWtlC@Kkh)oReRphS;N{dQg?63Z&sx>hO16dTA3!|lc7 zfO9+`bF)kIVSorZnd3StMlG(G9;Db;cN}7rI-y%n+tkg}zfZG^9(xg-J{t5CU1F`r zG!E{dPnTOe9p^v-RWQDzQQj$x6@BYe2 z3{jxy{KB>9*B-mDzEC?tH-24dul7hClksBg!X`0BjIw?zylvCKARi|*-xIFxV84qO z63BIRbT0=Q)Afe5#&<^hjnv1hu+o{xeT65_L~;OXy2 z`b5q@>0m9O~nR*_d~#(_XDn<&zLZDqF)&h@i9`mXXcYx0(O4EFR~mij57ATeoC;e*=ICt?e*nALYiuoLSgKczqU zrP7{UjCkCrR7W~PlN5g@DFum0`-aOm#}Qz6fxJ*Hu6BK_WG)4KZ35!Y2J#9jE;DND z`lwB<#PsxEe!B|W7qw_Bc&cZMG+o{jn;pA5{4PyH#RN3|!@=hqmQU`@ptq0aKeQiQ zpk_ZwEnKp{M&r@G z#9=+0_Vdh>+fvY!JC6^<$`y8f6&?@Po4Mc*KWHU1e+Vex9-M<^*vcQ}+cK8dWx2lT zM9VjlNY_6{+_-H3$H~;;LC3(~^DJo5NJOU&eYhrVj`d}Hz&pZ0p0(rwNI0@)A3Q`5 z^P*_Su)mrG=v&_vf#dY8^QO+b{A71r)fO7^I~w2hJ@L+Xm4LeOd{a553j4aA=0CVP z7ddxSxdKd^(DVYefobl!gt(ZsvUZ?a{ALHGz4HXyUM%hS9;1B_JC;T;Q+5>fp^|3i zp1grCMQXg|bt_3H7%!H)O_JC++;8*I)HV(uVB_%2IMK7597-D?q6fphig9?XrHIJ$ zy`y@oj&2V@sG2p=4h|EI^%6=IF7KFrLg^6aAKY8n4LE{v!kCh^H6h;bv2&SAL~>BX zvW{q_m%Q%vzHX1p7$VuBtY_NTKDq&P)@}72<$Ji6PqSSMEA0r4?`E}V_d5>}9~ewE zr;3BSo1%ctplt@V@<`Hm@gB~RZv7>Pss%K)vBNdxwl4H;gxYYFrT5Tv{GPvIhD2QC z!YQ0iWx;@NulSv692t8ftWI5ne`6|s<_$g22%>ZNFF0JzST*}_P@tZlxgO0wOG@d` zH#;D@f5G6O-3a-=5ApShB(T|q^RGcc$&2f7{(am95B)V1|96OUS@`dIwd8JJoBm&~ egsMyL796unt@OzYoi+&gyP$8RS9sR(=05?}^k|m= literal 0 HcmV?d00001 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; + return list?.Count() > 0 ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return null; + } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/src/TcoCore/src/TcoCore.Wpf/Converters/EmptyStringToVisibilityConverter.cs b/src/TcoCore/src/TcoCore.Wpf/Converters/EmptyStringToVisibilityConverter.cs new file mode 100644 index 000000000..0511bb369 --- /dev/null +++ b/src/TcoCore/src/TcoCore.Wpf/Converters/EmptyStringToVisibilityConverter.cs @@ -0,0 +1,28 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Windows; +using System.Windows.Data; +using System.Windows.Markup; + +namespace TcoCore +{ + public class EmptyStringToVisibilityConverter : MarkupExtension, IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var list = value as string; + return list?.Length > 0 ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return null; + } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + return this; + } + } +} diff --git a/src/TcoCore/src/TcoCore.Wpf/Converters/SignalToBrushConverter.cs b/src/TcoCore/src/TcoCore.Wpf/Converters/SignalToBrushConverter.cs new file mode 100644 index 000000000..0e11d70a2 --- /dev/null +++ b/src/TcoCore/src/TcoCore.Wpf/Converters/SignalToBrushConverter.cs @@ -0,0 +1,38 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Media; +using Vortex.Presentation.Wpf.Converters; + +namespace TcoCore +{ + /// + /// Will convert boolean values to Brush which represent whether signal is on, or off + /// Using the MaterialDesignXaml toolkit http://materialdesigninxaml.net/ and it's color palette + /// + /// Signal On is the Accent color from the palette, signal off si Dark color. + /// https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/blob/master/MainDemo.Wpf/Palette.xaml + /// + public class SignalToBrushConverter : BaseConverter + { + public override object ToConvert(object value, Type targetType, object parameter, CultureInfo culture) + { + try + { + var signal = (bool)value; + if (signal) + { + return Application.Current.TryFindResource("SecondaryHueMidBrush") ?? Brushes.GreenYellow; + } + else + { + return Application.Current.TryFindResource("PrimaryHueDarkBrush") ?? Brushes.DimGray; + } + } + catch (Exception e) + { + return Brushes.DarkGray; + } + } + } +} diff --git a/src/TcoCore/src/TcoCore.Wpf/Inxton.TcoCore.Wpf.csproj b/src/TcoCore/src/TcoCore.Wpf/Inxton.TcoCore.Wpf.csproj new file mode 100644 index 000000000..f9bff1d36 --- /dev/null +++ b/src/TcoCore/src/TcoCore.Wpf/Inxton.TcoCore.Wpf.csproj @@ -0,0 +1,37 @@ + + + Library + net48;netcoreapp3.1;net5.0-windows + true + false + true + + + + + + + + + + + + + True + True + Localization.resx + + + + + PublicResXFileCodeGenerator + Localization.Designer.cs + + + + + $(DefaultXamlRuntime) + Designer + + + diff --git a/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/DataTemplates/TreeItemTemplate.cs b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/DataTemplates/TreeItemTemplate.cs new file mode 100644 index 000000000..b4a257736 --- /dev/null +++ b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/DataTemplates/TreeItemTemplate.cs @@ -0,0 +1,9 @@ +namespace Tco.Wpf.CustomTree.DataTemplates +{ + public partial class TreeItemTemplate + { + public TreeItemTemplate() + { + } + } +} diff --git a/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/DataTemplates/TreeItemTemplate.xaml b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/DataTemplates/TreeItemTemplate.xaml new file mode 100644 index 000000000..bde66c0a5 --- /dev/null +++ b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/DataTemplates/TreeItemTemplate.xaml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/TreeElements/TreeItem.cs b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/TreeElements/TreeItem.cs new file mode 100644 index 000000000..a923e869b --- /dev/null +++ b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/TreeElements/TreeItem.cs @@ -0,0 +1,33 @@ +using System; +using System.Linq; +using Vortex.Connector; + +namespace Tco.Wpf +{ + + public class TreeItem : TreeObject + { + + public TreeItem(string Header) : base(Header) + { + } + + public TreeItem(IValueTag tag) + { + Header = tag.Symbol; + Item = tag; + } + + public TreeItem(string Header, object Item) : base(Header) + { + this.Item = Item; + } + + + public object Item { get; set; } + + } + + + +} \ No newline at end of file diff --git a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/TreeElements/TreeObject.cs b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/TreeElements/TreeObject.cs similarity index 55% rename from src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/TreeElements/TreeObject.cs rename to src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/TreeElements/TreeObject.cs index 5fdb3e991..5cd49a446 100644 --- a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/CustomTree/TreeElements/TreeObject.cs +++ b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/CustomTree/TreeElements/TreeObject.cs @@ -1,12 +1,11 @@ -using Tco.Wpf.CustomTree.Persistence; -using System; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; using Vortex.Connector; -namespace inxton.vortex.framework.dynamictreeview.wpf.sandbox +namespace Tco.Wpf { public abstract class TreeObject : INotifyPropertyChanged { @@ -38,23 +37,6 @@ public TreeObject() public static class TreeItemExtension { - public static TreeItemDTO AsDTO(this TreeObject treeObject) - { - if (treeObject is TreeItem item) - return new TreeItemDTO(item); - if (treeObject is TreeGroup group) - return new TreeItemDTO(group); - throw new ArgumentException("DTO for this type is not supported"); - } - - public static TreeObject FromDTO(this TreeItemDTO treeDTO, IConnector connector) - { - if (treeDTO.Kind == nameof(TreeGroup)) - return new TreeGroup(treeDTO, connector); - if (treeDTO.Kind == nameof(TreeItem)) - return new TreeItem(treeDTO, connector); - throw new ArgumentException("Can't convert this item from DTO"); - } public static IList ToObservableCollection(this IEnumerable source) => new ObservableCollection(source); } diff --git a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/ArraySymbolToHeaderConverter.cs b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/ArraySymbolToHeaderConverter.cs similarity index 100% rename from src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/ArraySymbolToHeaderConverter.cs rename to src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/ArraySymbolToHeaderConverter.cs diff --git a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/ChildDataTemplateSelector.cs b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/ChildDataTemplateSelector.cs similarity index 100% rename from src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/ChildDataTemplateSelector.cs rename to src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/ChildDataTemplateSelector.cs diff --git a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/Array.xaml b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/Array.xaml similarity index 100% rename from src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/Array.xaml rename to src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/Array.xaml diff --git a/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/ValueTag.cs b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/ValueTag.cs new file mode 100644 index 000000000..cad819ff6 --- /dev/null +++ b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/ValueTag.cs @@ -0,0 +1,9 @@ +namespace Tco.Wpf.DynamicTree.DataTemplates +{ + public partial class ValueTag + { + public ValueTag() + { + } + } +} diff --git a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/ValueTag.xaml b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/ValueTag.xaml similarity index 79% rename from src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/ValueTag.xaml rename to src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/ValueTag.xaml index d20857492..3233e379f 100644 --- a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/ValueTag.xaml +++ b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/ValueTag.xaml @@ -5,7 +5,7 @@ xmlns:vortex="http://vortex.mts/xaml"> - + diff --git a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/VortexObjectDataTemplate.cs b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/VortexObjectDataTemplate.cs similarity index 51% rename from src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/VortexObjectDataTemplate.cs rename to src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/VortexObjectDataTemplate.cs index 86c3dbc22..0a871d611 100644 --- a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/VortexObjectDataTemplate.cs +++ b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/VortexObjectDataTemplate.cs @@ -1,36 +1,13 @@ using System; using System.Globalization; -using System.Windows; using System.Windows.Data; -using System.Windows.Input; using System.Windows.Markup; using Vortex.Connector; namespace Tco.Wpf.DynamicTree.DataTemplates { - public partial class VortexObjectDataTemplate : IDraggable + public partial class VortexObjectDataTemplate { - public VortexObjectDataTemplate() - { - dragDropPublisher = new DragDropPublisher(this); - } - private DragDropPublisher dragDropPublisher { get; set; } - public void DragMouseLeftButtonDown(object sender, MouseEventArgs e) - { - dragDropPublisher.StoreMouseClick(e); - } - - public void DragMouseMove(object sender, MouseEventArgs e) - { - if (dragDropPublisher.IsDragging(e)) - { - var data = sender.As() - .DataContext.As(); - dragDropPublisher.DoDragDrop(sender, data); - } - } - - public Type PublishType() => typeof(IVortexObject); } public class SymbolOrHumanReadableConverter : MarkupExtension, IValueConverter diff --git a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/VortexObjectDataTemplate.xaml b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/VortexObjectDataTemplate.xaml similarity index 76% rename from src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/VortexObjectDataTemplate.xaml rename to src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/VortexObjectDataTemplate.xaml index fe768160d..5ebbb75fa 100644 --- a/src/TcoCore/tests/TcoCore.Sandbox.Wpf/DynamicTree/DataTemplates/VortexObjectDataTemplate.xaml +++ b/src/TcoCore/src/TcoCore.Wpf/ObjectTreeViewer/DynamicTree/DataTemplates/VortexObjectDataTemplate.xaml @@ -12,10 +12,7 @@ x:Name="VortexObjectTemplate" ItemTemplateSelector="{StaticResource ChildDataTemplateSelector}" ItemsSource="{Binding Children}"> -