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 758228511..515a6ede8 100644 Binary files a/_Vortex/builder/uvn.exe and b/_Vortex/builder/uvn.exe differ diff --git a/assets/pics/build.png b/assets/pics/build.png new file mode 100644 index 000000000..fc3cc18e7 Binary files /dev/null and b/assets/pics/build.png differ diff --git a/assets/pics/compile_profile.png b/assets/pics/compile_profile.png new file mode 100644 index 000000000..87984750f Binary files /dev/null and b/assets/pics/compile_profile.png differ diff --git a/assets/pics/environment.png b/assets/pics/environment.png new file mode 100644 index 000000000..87c01a883 Binary files /dev/null and b/assets/pics/environment.png differ 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 000000000..4375c14c5 Binary files /dev/null and b/src/Tc.Prober/src/Tc.Prober/Assets/TcOpenLogo128.png differ 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 000000000..362a2c6ec Binary files /dev/null and b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Images/100-800.PNG differ diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml new file mode 100644 index 000000000..cd4bfaa75 --- /dev/null +++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml.cs new file mode 100644 index 000000000..07d4103e6 --- /dev/null +++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/401_ConnectingDots/Station001View.xaml.cs @@ -0,0 +1,66 @@ +using PlcAppExamples; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Windows; +using System.Windows.Controls; +using Vortex.Connector; +using Vortex.Connector.ValueTypes; +using Vortex.Presentation.Wpf; + +namespace PlcAppExamples +{ + public partial class Station001View : UserControl + { + public Station001View() + { + InitializeComponent(); + DataContextChanged += OnDataContextChanged; + } + + private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e) + { + if (e.NewValue is Station001ViewModel viewModel) + UpdateImage(viewModel); + } + + private void UpdateImage(Station001ViewModel viewModel) + { + viewModel.Station001._sequence._currentStep.ID.Subscribe(ChangeImage); + } + + FileInfo rootPath = new FileInfo(Assembly.GetExecutingAssembly().Location); + + private void ChangeImage(IValueTag sender, ValueChangedEventArgs args) + { + var scrollPosition = new Dictionary() { + {100,0.0}, + {200,220}, + {300,524}, + {400,819}, + {500,1011}, + {600,1203}, + {700,1395}, + {800,1504} + }; + var fileName = $@"{rootPath.DirectoryName}\Tutorial\401_ConnectingDots\Images\100-800.png"; + if (File.Exists(fileName)) + { + this.Dispatcher.Invoke(() => + { + if (scrollPosition.ContainsKey((dynamic)args.NewValue)) + { + scrollImage.ScrollToVerticalOffset(scrollPosition[(dynamic)args.NewValue]); + } + }); + } + } + } + + public class Station001ViewModel : RenderableViewModel + { + public Station001 Station001 { get; set; } + public override object Model { get => Station001; set => Station001 = value as Station001; } + } +} diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml new file mode 100644 index 000000000..08b3011bf --- /dev/null +++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml.cs b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml.cs new file mode 100644 index 000000000..d9af736c8 --- /dev/null +++ b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/Tutorial/TcOpenTutorialView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace TcoApplicationExamples.Wpf +{ + /// + /// Interaction logic for TcOpenTutorialView.xaml + /// + public partial class TcOpenTutorialView : UserControl + { + public TcOpenTutorialView() + { + InitializeComponent(); + } + } +} diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/assets/nfuse.PNG b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/assets/nfuse.PNG new file mode 100644 index 000000000..6c98ecb7e Binary files /dev/null and b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/assets/nfuse.PNG differ diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/nfuse.PNG b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/nfuse.PNG new file mode 100644 index 000000000..1ef9caf92 Binary files /dev/null and b/src/TcoApplicationExamples/TcoApplicationExamples.Wpf/nfuse.PNG differ diff --git a/src/TcoApplicationExamples/TcoApplicationExamples.slnf b/src/TcoApplicationExamples/TcoApplicationExamples.slnf new file mode 100644 index 000000000..e98151c7e --- /dev/null +++ b/src/TcoApplicationExamples/TcoApplicationExamples.slnf @@ -0,0 +1,24 @@ +{ + "solution": { + "path": "..\\..\\TcOpen.sln", + "projects": [ + "src\\TcoCore\\src\\TcoCore.Wpf\\TcoCore.Wpf.csproj", + "src\\TcoCore\\src\\TcoCoreConnector\\TcoCoreConnector.csproj", + "src\\TcoCore\\src\\XaeTcoCore\\XaeTcoCore.tsproj", + "src\\TcoCore\\tests\\TcoCore.Sandbox.Wpf\\TcoCore.Sandbox.Wpf.csproj", + "src\\TcoCore\\tests\\TcoCoreExamplesConnector\\TcoCoreExamplesConnector.csproj", + "src\\TcoCore\\tests\\TcoCoreTestsConnector\\TcoCoreTestsConnector.csproj", + "src\\TcoCore\\tests\\TcoCoreUnitTests\\TcoCoreUnitTests.csproj", + "src\\TcoCore\\tests\\TcoTestRunners\\TcoTestRunners.csproj", + "src\\TcoPneumatics\\src\\TcoPneumatics.Wpf\\TcoPneumatics.Wpf.csproj", + "src\\TcoPneumatics\\src\\TcoPneumaticsConnector\\TcoPneumaticsConnector.csproj", + "src\\TcoPneumatics\\src\\XaeTcoPneumatics\\XaeTcoPneumatics.tsproj", + "src\\TcoPneumatics\\tests\\Sandbox\\PlcOpen.Wpf.Sandbox\\TcoPneumatics.Wpf.Sandbox.csproj", + "src\\TcoPneumatics\\tests\\TcoPneumaticsTestsConnector\\TcoPneumaticsTestsConnector.csproj", + "src\\TcoPneumatics\\tests\\TcoPneumaticsTests_nUnit\\TcoPneumaticsTests_nUnit.csproj", + "src\\TcoApplicationExamples\\PlcAppExamplesConnector\\PlcAppExamplesConnector.csproj", + "src\\TcoApplicationExamples\\TcoApplicationExamples.Wpf\\TcoApplicationExamples.Wpf.csproj", + "src\\TcoApplicationExamples\\XaeAppExamples\\XaeAppExamples.tsproj" + ] + } +} \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Constanzia_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Constanzia_Object.TcPOU new file mode 100644 index 000000000..5ea23162d --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Constanzia_Object.TcPOU @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Frederico_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Frederico_Object.TcPOU new file mode 100644 index 000000000..1b55d019a --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Frederico_Object.TcPOU @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Michael_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Michael_Object.TcPOU new file mode 100644 index 000000000..a4358b0c2 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Michael_Object.TcPOU @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Santino_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Santino_Object.TcPOU new file mode 100644 index 000000000..69af854fc --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Santino_Object.TcPOU @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Thomas_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Thomas_Object.TcPOU new file mode 100644 index 000000000..ef1845edf --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/CorleoneKids/Thomas_Object.TcPOU @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/Leaves/AKid_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/Leaves/AKid_Object.TcPOU new file mode 100644 index 000000000..07a04c710 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/Leaves/AKid_Object.TcPOU @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/VitoCorleone_Context.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/VitoCorleone_Context.TcPOU new file mode 100644 index 000000000..e58167d05 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Context/VitoCorleone_Context.TcPOU @@ -0,0 +1,161 @@ + + + + +(* + + THIS EXAMPLE AIMS TO EXPLAIN WHAT CONTEXT AND IDENITY ARE IN A 'TcoOpen' APPLICATION. + SEE Main() method of this block. + +*) +FUNCTION_BLOCK VitoCorleone_Context EXTENDS TcoCore.TcoContext +VAR +(* + Each context member object has it 'context' and assigned when instantiated (at birth) + This is typically done by instantiating the objects with FB_init(ITcoObject) as follows + These are Don Corleone's children. When you look inside definitions you' find + Don Corleone's grand-childrend (whole family shares the same context). +*) + _santino : Santino_Object(THIS^); + _thomas : Thomas_Object(THIS^); + _frederico : Frederico_Object(THIS^); + _michael : Michael_Object(THIS^); + _costanzia : Constanzia_Object(THIS^); +END_VAR + +VAR + _donCorleoneContext : ITcoContext; + _isSameContext : BOOL; + + _donCorleoneIdentity : ULINT; + _isDifferentIndentity : BOOL; +END_VAR +// +//-- + +VAR + _JohnyFontaneCaseDone : BOOL := FALSE; + _MakeAnOfferThatCantBeRefused : MakeAnOfferThatCantBeRefused(THIS^, eRestoreMode.None); +END_VAR]]> + + + + + + + _JohnyFontaneCaseDone); +END_IF;]]> + + + + + + Main method of the TcoContext. This is the entry point of any control logic that belongs to this context. + The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main +]]> + + +(* + + CONTEXT vs IDENTITY + +*) + +// In Corleone family they all share the same context that is that of Don Vito Corleone + + +// Here is the tree of family Corleone + +// https://godfather.fandom.com/wiki/Corleone_family + +_donCorleoneContext := THIS^.Context; +_isSameContext := + // Santino + _donCorleoneContext = THIS^._santino.Context + // Santino's kids + AND (THIS^._santino.Context = THIS^._santino._francesca.Context + AND THIS^._santino.Context = THIS^._santino._frank.Context + AND THIS^._santino.Context = THIS^._santino._kathryn.Context + AND THIS^._santino.Context = THIS^._santino._santino.Context) + // Thomas + AND THIS^._santino.Context = THIS^._thomas.Context + // Thomas' kids + AND (THIS^._thomas.Context = THIS^._thomas._andrew.Context + AND THIS^._thomas.Context = THIS^._thomas._christina.Context + AND THIS^._thomas.Context = THIS^._thomas._frank.Context + AND THIS^._thomas.Context = THIS^._thomas._gianna.Context) + // Frederico + AND THIS^._thomas.Context = THIS^._frederico.Context + // Frederico's kids + AND (THIS^._frederico.Context = THIS^._frederico._fredo.Context) + // Michael + AND THIS^._frederico.Context = THIS^._michael.Context + // Michael's kids + AND (THIS^._michael.Context = THIS^._michael._anthony.Context + AND THIS^._michael.Context = THIS^._michael._mary.Context) + // Constanzia + AND THIS^._michael.Context = THIS^._costanzia.Context + // Constanzia's kids + AND (THIS^._costanzia.Context = THIS^._costanzia._michael.Context + AND THIS^._costanzia.Context = THIS^._costanzia._victor.Context); + +// However each member of the family has different personal identity and that might +// be source of trouble + +_donCorleoneIdentity := THIS^.Identity; +_isDifferentIndentity := + // Santino + _donCorleoneIdentity <> THIS^._santino.Identity + // Santino's kids + AND (THIS^._santino.Identity <> THIS^._santino._francesca.Identity + AND THIS^._santino.Identity <> THIS^._santino._frank.Identity + AND THIS^._santino.Identity <> THIS^._santino._kathryn.Identity + AND THIS^._santino.Identity <> THIS^._santino._santino.Identity) + // Thomas + AND THIS^._santino.Identity <> THIS^._thomas.Identity + // Thomas' kids + AND (THIS^._thomas.Identity <> THIS^._thomas._andrew.Identity + AND THIS^._thomas.Identity <> THIS^._thomas._christina.Identity + AND THIS^._thomas.Identity <> THIS^._thomas._frank.Identity + AND THIS^._thomas.Identity <> THIS^._thomas._gianna.Identity) + // Frederico + AND THIS^._thomas.Identity <> THIS^._frederico.Identity + // Frederico's kids + AND (THIS^._frederico.Identity <> THIS^._frederico._fredo.Identity) + // Michael + AND THIS^._frederico.Identity <> THIS^._michael.Identity + // Michael's kids + AND (THIS^._michael.Identity <> THIS^._michael._anthony.Identity + AND THIS^._michael.Identity <> THIS^._michael._mary.Identity) + // Constanzia + AND THIS^._michael.Identity <> THIS^._costanzia.Identity + // Constanzia's kids + AND (THIS^._costanzia.Identity <> THIS^._costanzia._michael.Identity + AND THIS^._costanzia.Identity <> THIS^._costanzia._victor.Identity); + + +// Once the context is asigned (at birth [instantiated]) it cannot be changed, +// an attempt to change the context will result in vendetta. +// +//-- + +JohnyFontaneCase(MAIN_PRG._Jack_Woltz); +]]> + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/MAIN_PRG.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/MAIN_PRG.TcPOU new file mode 100644 index 000000000..7a15ffda6 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/MAIN_PRG.TcPOU @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_Logic.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_Logic.TcPOU new file mode 100644 index 000000000..37c9e4ff3 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_Logic.TcPOU @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_MAIN.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_MAIN.TcPOU new file mode 100644 index 000000000..a3798c497 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/NonFrameworkUse/NF_MAIN.TcPOU @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Horse_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Horse_Object.TcPOU new file mode 100644 index 000000000..11e587572 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Horse_Object.TcPOU @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Killer_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Killer_Object.TcPOU new file mode 100644 index 000000000..69d51d475 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Killer_Object.TcPOU @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Person_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Person_Object.TcPOU new file mode 100644 index 000000000..3464b2991 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Person_Object.TcPOU @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Woltz_Object.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Woltz_Object.TcPOU new file mode 100644 index 000000000..7ebfff963 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Object/Woltz_Object.TcPOU @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/MakeAnOfferThatCantBeRefused.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/MakeAnOfferThatCantBeRefused.TcPOU new file mode 100644 index 000000000..fca49d9a0 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/MakeAnOfferThatCantBeRefused.TcPOU @@ -0,0 +1,79 @@ + + + + + + + + + + + Main method of the sequener. Custom code needs to be placed here. The sequencer is executed by call of InstanceName.Run() method. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main : BOOL +]]> + + + //Starting the execution of the 'TcoTask' instance extended by input parameters from 'outside' of the instance. + Thomas.AskForTheFavor(Jack_Woltz,'Grant movie role to Johny Fontane.','No future problems with unions.').Invoke(); + +// Checking from the 'outside' of the instance, if the task has already finished in expected way. + _FirstOfferAccepted := Thomas._AskForTheFavor.Done; + +// Checking from the 'outside' of the instance, if the task has finished in non-expected way. + _FirstOfferRefused := Thomas._AskForTheFavor.Error; +// + + StepCompleteWhen(_FirstOfferAccepted OR _FirstOfferRefused); +END_IF + +IF Step(10,_FirstOfferAccepted,'Call somebody to call somebody to ensure no problems with unions in the future.') THEN +//* +//.. +//NoFutureUnionsProblems implementation +//.. +//* + RequestStep(500); +END_IF + +IF Step(20,TRUE,'Call somebody to call somebody to send somebody to kill the Woltz horse Khartoum.') THEN + StepCompleteWhen(_Killer.Kill(Jack_Woltz._Khartoum).Invoke().Done); +END_IF + +IF Step(30,TRUE,'Waiting for granting the movie role to Johny Fontane by Jack Woltz.') THEN + Jack_Woltz.ThinkCarefully(); + + + StepCompleteWhen(Jack_Woltz.FavorIsGranted()); +END_IF + +IF Step(500,TRUE,'Final step of the sequence.') THEN + Done := TRUE; + CompleteStep(); +END_IF +]]> + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Automat.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Automat.TcPOU new file mode 100644 index 000000000..dce347f97 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Automat.TcPOU @@ -0,0 +1,140 @@ + + + + + + + + + + + Main method of the sequener. Custom code needs to be placed here, calling of the methods Open() at the beggining and Close() at the end is ensured by calling the InstanceName.Run() method. + This method is abstract, so each derived type has to implement its own implementation of this method. + + +~*) +METHOD PROTECTED Main : BOOL +]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Components.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Components.TcPOU new file mode 100644 index 000000000..708cc5cd9 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Components.TcPOU @@ -0,0 +1,17 @@ + + + + + + ST_01_IO.OUTs[0], outToWorkPos=> ST_01_IO.OUTs[1]); +_vertical(inAtHomePos:= ST_01_IO.INs[2], inAtWorkPos:= ST_01_IO.INs[3], outToHomePos=> ST_01_IO.OUTs[2], outToWorkPos=> ST_01_IO.OUTs[3]); +_gripper(inAtHomePos:= ST_01_IO.INs[4], inAtWorkPos:= ST_01_IO.INs[5], outToHomePos=> ST_01_IO.OUTs[4], outToWorkPos=> ST_01_IO.OUTs[5]);]]> + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Context.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Context.TcPOU new file mode 100644 index 000000000..77d901ed5 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Context.TcPOU @@ -0,0 +1,44 @@ + + + + + + + + + + + Main method of the TcoContext. This is the entry point of any control logic that belongs to this context. + The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly. + This method is abstract, and it must be overriden in inherited block. + + +~*) +METHOD PROTECTED Main]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Ground.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Ground.TcPOU new file mode 100644 index 000000000..36cbea9f4 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_Ground.TcPOU @@ -0,0 +1,59 @@ + + + + + + + + + + + Main method of the sequener. Custom code needs to be placed here, calling of the methods Open() at the beggining and Close() at the end is ensured by calling the InstanceName.Run() method. + This method is abstract, so each derived type has to implement its own implementation of this method. + + +~*) +METHOD PROTECTED Main : BOOL +]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_IO.TcGVL b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_IO.TcGVL new file mode 100644 index 000000000..3fe2383f0 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/ST_01_IO.TcGVL @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/fbAwait.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/fbAwait.TcPOU new file mode 100644 index 000000000..586d9ab4a --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Sequencer/fbAwait.TcPOU @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/AskForTheFavor_Task.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/AskForTheFavor_Task.TcPOU new file mode 100644 index 000000000..65f098e7b --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/AskForTheFavor_Task.TcPOU @@ -0,0 +1,75 @@ + + + + +(* + + This example shows using the 'Tcotask' application. 'TcoTask' is the simplest + 'TcoOpen' coordination primitive. + In general the body of the task could be devided into the three section: + 1.) Action + 2.) Termination condition for the expected behavior. + 3.) Termination condition for the non-expected behavior. + The body of the 'Tcotask' needs to be called cyclically. The 'Tcotask' could be then + invoked from 'outside'. The task of this 'Tcotask' is to ask for the favor + (in the name of the 'TcoContext' in this example Don Corleone) and offer the return favor. + Task could end up the expected way in the 'DONE' state if the requested person grant + the favor or it could end up in the 'ERROR' state if the requested person refuses to grant + the favor. Each task could be invoked only from the 'READY' state. So if the task enters + the 'ERROR' state, it cannot be invoked again and has to be restored before. Anyway in this + example this task is never restored and invoked again as Don Corleone never asks for the + next favor if the first one was refused. + +*) +FUNCTION_BLOCK AskForTheFavor_Task EXTENDS TcoCore.TcoTask +VAR_INPUT +(* + 'Parameters' of this task are assigned in this example from 'outside' from the + 'upper level' of the hierarchy, where Invoke() method is triggered. +*) + _Person_Requested : REFERENCE TO Person_Object; + _RequestedFavor : STRING; + _ReturnFavor : STRING; +END_VAR +// +//-- +]]> + + +// THIS part needs to be called cyclically. +IF Execute() THEN + // First section: Action. + // Meet the right person and interpret the requirements so as a possible return favor. + _Person_Requested.RequestForTheFavor(_RequestedFavor,_ReturnFavor); + // Let the person requested to think carefully about the proposition. + _Person_Requested.ThinkCarefully(); + // Second section: Termination condition for the expected behavior. + // In the case that the requested person is "smart" and "show the respect" to the + // 'TcoContext', task finishes in the 'DONE' state and process of the granted the + // return favor should be started. + DoneWhen(_Person_Requested.FavorIsGranted()); + // Third section: Termination condition for the non-expected behavior. + // In the case that the requested person is so self-confident and refuse to grant + // the favor, task finishes in the 'ERROR' state and automatically the OnTaskError() + // method is triggered. In this method normally the value of the ReturnFavor is + // drammatically decreased OR changed to 'Nothing'. Anyway the requested person still + // have the possibility to grant the favor but under different condition, as he + // "had to do it the hard way". + ThrowWhen(_Person_Requested.FavorIsRefused()); +END_IF +// +//-- +]]> + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/Kill_Task.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/Kill_Task.TcPOU new file mode 100644 index 000000000..40679091e --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Task/Kill_Task.TcPOU @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/ColorSequencer.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/ColorSequencer.TcPOU new file mode 100644 index 000000000..f740cfa25 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/ColorSequencer.TcPOU @@ -0,0 +1,114 @@ + + + + + + + + + + + Main method of the sequener. Custom code needs to be placed here. The sequencer is executed by call of InstanceName.Run() method. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main : BOOL +]]> + + = inoColors._luminosity) THEN + CompleteStep(); + ELSE + RequestStep(500); // Luminosity is not where it should be; check again if the lights are on. + END_IF +//-------------------------------------------- +END_IF; + +IF Step(800, + TRUE, + 'Complete sequence') THEN +//-------------------------------------------- + CompleteSequence(); // Returns to the first step (100) in the sequence. +//-------------------------------------------- +END_IF;]]> + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/Color_Example.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/Color_Example.TcPOU new file mode 100644 index 000000000..9ce783037 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/Color_Example.TcPOU @@ -0,0 +1,33 @@ + + + + + + + + + + + Main method of the TcoContext. This is the entry point of any control logic that belongs to this context. + The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/stColors.TcDUT b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/stColors.TcDUT new file mode 100644 index 000000000..3f1ae5766 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/101_Color_Sequencer/stColors.TcDUT @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/201/InvokingTasks.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/201/InvokingTasks.TcPOU new file mode 100644 index 000000000..8a33828e7 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/201/InvokingTasks.TcPOU @@ -0,0 +1,81 @@ + + + + + + + + + + + Main method of the TcoContext. This is the entry point of any control logic that belongs to this context. + The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main +VAR_INST + ToHomeTemp:BOOL; + ToWorkTemp:BOOL; + +END_VAR]]> + + ToHome, + outToWorkPos => ToWork +); + +IF ToWork THEN + AtHome := FALSE; + _simTimer(IN:=TRUE,PT:= UINT_TO_TIME(_simTimerValue*4)); + IF(_simTimer.Q) THEN + AtWork :=TRUE; + _simTimer(IN:=FALSE,PT:= UINT_TO_TIME(0)); + Cylinder.Restore(); + END_IF +END_IF + + +IF ToHome THEN + AtWork := FALSE; + _simTimer(IN:=TRUE,PT:= UINT_TO_TIME(_simTimerValue*4)); + IF(_simTimer.Q) THEN + AtHome :=TRUE; + _simTimer(IN:=FALSE,PT:= UINT_TO_TIME(0)); + Cylinder.Restore(); + END_IF +END_IF + +Cylinder.Service(); //enable manual control + + + +]]> + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/FastCounter.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/FastCounter.TcPOU new file mode 100644 index 000000000..d45956b3d --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/FastCounter.TcPOU @@ -0,0 +1,44 @@ + + + + + + Counter); + DoneWhen(Counter = 100); + +END_IF]]> + + + + + Restores this instance to the Ready state. Can be called explicitly or from within one of the restore mechanisms. + + See also + + + +~*) +METHOD Restore : ITcoRestorable]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/SlowCounter.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/SlowCounter.TcPOU new file mode 100644 index 000000000..1ac11d678 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/SlowCounter.TcPOU @@ -0,0 +1,36 @@ + + + + + + + + + + + Restores this instance to the Ready state. Can be called explicitly or from within one of the restore mechanisms. + + See also + + + +~*) +METHOD Restore : ITcoRestorable]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/TaskExecution.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/TaskExecution.TcPOU new file mode 100644 index 000000000..f6fb034d2 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/301/TaskExecution.TcPOU @@ -0,0 +1,30 @@ + + + + + + + + + + + Main method of the TcoContext. This is the entry point of any control logic that belongs to this context. + The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonGripper.TcIO b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonGripper.TcIO new file mode 100644 index 000000000..83317e14c --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonGripper.TcIO @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonHorizontal.TcIO b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonHorizontal.TcIO new file mode 100644 index 000000000..df31190cf --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonHorizontal.TcIO @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonVertical.TcIO b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonVertical.TcIO new file mode 100644 index 000000000..a4abda00d --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/IPistonVertical.TcIO @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001.TcPOU new file mode 100644 index 000000000..aab0c18db --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001.TcPOU @@ -0,0 +1,33 @@ + + + + + + + + + + + Main method of the TcoContext. This is the entry point of any control logic that belongs to this context. + The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Components.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Components.TcPOU new file mode 100644 index 000000000..ed2611ab8 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Components.TcPOU @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Sequencer.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Sequencer.TcPOU new file mode 100644 index 000000000..df11087af --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/POUs/Station001_Sequencer.TcPOU @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + Main method of the sequener. Custom code needs to be placed here. The sequencer is executed by call of InstanceName.Run() method. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main : BOOL +]]> + + + + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPiston.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPiston.TcPOU new file mode 100644 index 000000000..36d4625b8 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPiston.TcPOU @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Custom service (manual, maintenance) logic. + This method must be implemented in derived class. + + +~*) +METHOD PROTECTED ServiceMode +]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPistonMoveTask.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPistonMoveTask.TcPOU new file mode 100644 index 000000000..272a8515b --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/401/fbPistonMoveTask.TcPOU @@ -0,0 +1,23 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/MAIN_PRG.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/MAIN_PRG.TcPOU new file mode 100644 index 000000000..7a15ffda6 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/MAIN_PRG.TcPOU @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/TcOpenTutorial.TcPOU b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/TcOpenTutorial.TcPOU new file mode 100644 index 000000000..cd6755f7c --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/POUs/Tutorial/TcOpenTutorial.TcPOU @@ -0,0 +1,37 @@ + + + + + + + + + + + Main method of the TcoContext. This is the entry point of any control logic that belongs to this context. + The call of this method is ensured by calling the InstanceName.Run() method, and it must not be called explicitly. + This method is abstract, and it must be overridden in derived block. + + +~*) +METHOD PROTECTED Main]]> + + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcAppExamples.plcproj b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcAppExamples.plcproj new file mode 100644 index 000000000..0b4745253 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcAppExamples.plcproj @@ -0,0 +1,2515 @@ + + + + 1.0.0.0 + 2.0 + {b8ce161a-872b-4092-b0f7-49898e4206a5} + True + true + true + false + PlcAppExamples + 3.1.4024.12 + {53923bbf-941c-4a5a-82fb-3dbb5b0e7a0e} + {d999eaa9-0898-434c-8c1d-30dd1915b6a6} + {4affd3d4-be30-421f-8041-021e6f1ccca2} + {c33f8869-5174-4fd7-9b17-d319b0affe68} + {cedac463-324f-4973-969c-6ce54fca022d} + {fb853486-9367-48a7-b30f-ebadbaf333d6} + Vortex.Library + false + PlcAppExamples + 0.4.1.375 + PlcAppExamples + PlcAppExamples + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + true + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + + + + + + + + + + + + + + + Tc2_Standard, * (Beckhoff Automation GmbH) + Tc2_Standard + + + Tc2_System, * (Beckhoff Automation GmbH) + Tc2_System + + + Tc3_Module, * (Beckhoff Automation GmbH) + Tc3_Module + + + TcoCore, 0.4.1.375 (Vortex.Library) + TcoCore + + + TcoPneumatics, 0.4.1.375 (Vortex.Library) + TcoPneumatics + + + + + TcoCore, 0.4.1.375 (Vortex.Library) + + + TcoPneumatics, 0.4.1.375 (Vortex.Library) + + + + + Content + + + + + + + + "<ProjectRoot>" + + {192FAD59-8248-4824-A8DE-9177C94C195A} + + "{192FAD59-8248-4824-A8DE-9177C94C195A}" + + + + {246001F4-279D-43AC-B241-948EB31120E1} + + "{246001F4-279D-43AC-B241-948EB31120E1}" + + + GlobalVisuImageFilePath + %APPLICATIONPATH% + + + {40450F57-0AA3-4216-96F3-5444ECB29763} + + "{40450F57-0AA3-4216-96F3-5444ECB29763}" + + + ActiveVisuExtensionsLength + 0 + ActiveVisuProfile + "IR0whWr8bwfwBwAAiD2qpQAAAABVAgAA37x72QAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDBUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgA0AC4ANwAFFlAAcgBvAGYAaQBsAGUARABhAHQAYQAGTHsAMQA2AGUANQA1AGIANgAwAC0ANwAwADQAMwAtADQAYQA2ADMALQBiADYANQBiAC0ANgAxADQANwAxADMAOAA3ADgAZAA0ADIAfQAHEkwAaQBiAHIAYQByAGkAZQBzAAhMewAzAGIAZgBkADUANAA1ADkALQBiADAANwBmAC0ANABkADYAZQAtAGEAZQAxAGEALQBhADgAMwAzADUANgBhADUANQAxADQAMgB9AAlMewA5AGMAOQA1ADgAOQA2ADgALQAyAGMAOAA1AC0ANAAxAGIAYgAtADgAOAA3ADEALQA4ADkANQBmAGYAMQBmAGUAZABlADEAYQB9AAoOVgBlAHIAcwBpAG8AbgALBmkAbgB0AAwKVQBzAGEAZwBlAA0KVABpAHQAbABlAA4aVgBpAHMAdQBFAGwAZQBtAE0AZQB0AGUAcgAPDkMAbwBtAHAAYQBuAHkAEAxTAHkAcwB0AGUAbQARElYAaQBzAHUARQBsAGUAbQBzABIwVgBpAHMAdQBFAGwAZQBtAHMAUwBwAGUAYwBpAGEAbABDAG8AbgB0AHIAbwBsAHMAEyhWAGkAcwB1AEUAbABlAG0AcwBXAGkAbgBDAG8AbgB0AHIAbwBsAHMAFCRWAGkAcwB1AEUAbABlAG0AVABlAHgAdABFAGQAaQB0AG8AcgAVIlYAaQBzAHUATgBhAHQAaQB2AGUAQwBvAG4AdAByAG8AbAAWFHYAaQBzAHUAaQBuAHAAdQB0AHMAFwxzAHkAcwB0AGUAbQAYGFYAaQBzAHUARQBsAGUAbQBCAGEAcwBlABkmRABlAHYAUABsAGEAYwBlAGgAbwBsAGQAZQByAHMAVQBzAGUAZAAaCGIAbwBvAGwAGyJQAGwAdQBnAGkAbgBDAG8AbgBzAHQAcgBhAGkAbgB0AHMAHEx7ADQAMwBkADUAMgBiAGMAZQAtADkANAAyAGMALQA0ADQAZAA3AC0AOQBlADkANAAtADEAYgBmAGQAZgAzADEAMABlADYAMwBjAH0AHRxBAHQATABlAGEAcwB0AFYAZQByAHMAaQBvAG4AHhRQAGwAdQBnAGkAbgBHAHUAaQBkAB8WUwB5AHMAdABlAG0ALgBHAHUAaQBkACBIYQBmAGMAZAA1ADQANAA2AC0ANAA5ADEANAAtADQAZgBlADcALQBiAGIANwA4AC0AOQBiAGYAZgBlAGIANwAwAGYAZAAxADcAIRRVAHAAZABhAHQAZQBJAG4AZgBvACJMewBiADAAMwAzADYANgBhADgALQBiADUAYwAwAC0ANABiADkAYQAtAGEAMAAwAGUALQBlAGIAOAA2ADAAMQAxADEAMAA0AGMAMwB9ACMOVQBwAGQAYQB0AGUAcwAkTHsAMQA4ADYAOABmAGYAYwA5AC0AZQA0AGYAYwAtADQANQAzADIALQBhAGMAMAA2AC0AMQBlADMAOQBiAGIANQA1ADcAYgA2ADkAfQAlTHsAYQA1AGIAZAA0ADgAYwAzAC0AMABkADEANwAtADQAMQBiADUALQBiADEANgA0AC0ANQBmAGMANgBhAGQAMgBiADkANgBiADcAfQAmFk8AYgBqAGUAYwB0AHMAVAB5AHAAZQAnVFUAcABkAGEAdABlAEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwARgBvAHIAQwBvAG4AdgBlAHIAdABpAGIAbABlAEwAaQBiAHIAYQByAGkAZQBzACgQTABpAGIAVABpAHQAbABlACkUTABpAGIAQwBvAG0AcABhAG4AeQAqHlUAcABkAGEAdABlAFAAcgBvAHYAaQBkAGUAcgBzACs4UwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAsEnYAaQBzAHUAZQBsAGUAbQBzAC1INgBjAGIAMQBjAGQAZQAxAC0AZAA1AGQAYwAtADQAYQAzAGIALQA5ADAANQA0AC0AMgAxAGYAYQA3ADUANgBhADMAZgBhADQALihJAG4AdABlAHIAZgBhAGMAZQBWAGUAcgBzAGkAbwBuAEkAbgBmAG8AL0x7AGMANgAxADEAZQA0ADAAMAAtADcAZgBiADkALQA0AGMAMwA1AC0AYgA5AGEAYwAtADQAZQAzADEANABiADUAOQA5ADYANAAzAH0AMBhNAGEAagBvAHIAVgBlAHIAcwBpAG8AbgAxGE0AaQBuAG8AcgBWAGUAcgBzAGkAbwBuADIMTABlAGcAYQBjAHkAMzBMAGEAbgBnAHUAYQBnAGUATQBvAGQAZQBsAFYAZQByAHMAaQBvAG4ASQBuAGYAbwA0MEwAbwBhAGQATABpAGIAcgBhAHIAaQBlAHMASQBuAHQAbwBQAHIAbwBqAGUAYwB0ADUaQwBvAG0AcABhAHQAaQBiAGkAbABpAHQAeQDQAAIaA9ADAS0E0AUGGgfQBwgaAUUHCQjQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtDtAPAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60BAAAA0A0BLRHQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0S0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAUAAAA0AwLrQIAAADQDQEtE9APAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAAAAAANAMC60CAAAA0A0BLRTQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0V0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtFtAPAS0X0AAJGgRFCgsEAwAAAAUAAAANAAAAKAAAANAMC60EAAAA0A0BLRjQDwEtENAZGq0BRRscAdAAHBoCRR0LBAMAAAAFAAAADQAAAAAAAADQHh8tINAhIhoCRSMkAtAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAAAAANADAS0n0CgBLRHQKQEtENAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAQAAANADAS0n0CgBLRHQKQEtEJoqKwFFAAEC0AABLSzQAAEtF9AAHy0t0C4vGgPQMAutAQAAANAxC60XAAAA0DIarQDQMy8aA9AwC60CAAAA0DELrQMAAADQMhqtANA0Gq0A0DUarQA=" + + + {29BD8D0C-3586-4548-BB48-497B9A01693F} + + "{29BD8D0C-3586-4548-BB48-497B9A01693F}" + + NamingConventions + + "NamingConventions" + + 105 + + "105" + + + stPrefix + + + + 8 + + "8" + + + stPrefix + + + + 9 + + "9" + + + stPrefix + + + + 3 + + "3" + + + stPrefix + + + + 4 + + "4" + + + stPrefix + + + + 5 + + "5" + + + stPrefix + + + + 6 + + "6" + + + stPrefix + + + + 7 + + "7" + + + stPrefix + + + + 29 + + "29" + + + stPrefix + + + + 59 + + "59" + + + stPrefix + + + + 107 + + "107" + + + stPrefix + + + + 22 + + "22" + + + stPrefix + + + + 30 + + "30" + + + stPrefix + + + + 25 + + "25" + + + stPrefix + + + + 35 + + "35" + + + stPrefix + + + + 62 + + "62" + + + stPrefix + + + + 55 + + "55" + + + stPrefix + _ + + + 65 + + "65" + + + stPrefix + + + + 108 + + "108" + + + stPrefix + I + + + 70 + + "70" + + + stPrefix + + + + 34 + + "34" + + + stPrefix + + + + 54 + + "54" + + + stPrefix + _ + + + 121 + + "121" + + + stPrefix + + + + 151 + + "151" + + + stPrefix + st + + + 10 + + "10" + + + stPrefix + + + + 102 + + "102" + + + stPrefix + prg + + + 18 + + "18" + + + stPrefix + + + + 28 + + "28" + + + stPrefix + + + + 123 + + "123" + + + stPrefix + + + + 58 + + "58" + + + stPrefix + + + + 61 + + "61" + + + stPrefix + + + + 11 + + "11" + + + stPrefix + + + + 21 + + "21" + + + stPrefix + + + + 14 + + "14" + + + stPrefix + + + + 24 + + "24" + + + stPrefix + + + + 17 + + "17" + + + stPrefix + + + + 27 + + "27" + + + stPrefix + + + + 37 + + "37" + + + stPrefix + + + + 53 + + "53" + + + stPrefix + + + + 57 + + "57" + + + stPrefix + + + + 73 + + "73" + + + stPrefix + + + + 122 + + "122" + + + stPrefix + + + + 104 + + "104" + + + stPrefix + fc + + + 153 + + "153" + + + stPrefix + union + + + 12 + + "12" + + + stPrefix + + + + 106 + + "106" + + + stPrefix + + + + 32 + + "32" + + + stPrefix + + + + 19 + + "19" + + + stPrefix + + + + 103 + + "103" + + + stPrefix + fb + + + 33 + + "33" + + + stPrefix + + + + 72 + + "72" + + + stPrefix + + + + 152 + + "152" + + + stPrefix + enum + + + 64 + + "64" + + + stPrefix + + + + 20 + + "20" + + + stPrefix + + + + 13 + + "13" + + + stPrefix + + + + 23 + + "23" + + + stPrefix + + + + 16 + + "16" + + + stPrefix + + + + 26 + + "26" + + + stPrefix + + + + 36 + + "36" + + + stPrefix + + + + 63 + + "63" + + + stPrefix + + + + 56 + + "56" + + + stPrefix + + + + 124 + + "124" + + + stPrefix + + + + 154 + + "154" + + + stPrefix + alias + + + 31 + + "31" + + + stPrefix + + + + 51 + + "51" + + + stPrefix + + + + 15 + + "15" + + + stPrefix + + + + 38 + + "38" + + + stPrefix + + + + 71 + + "71" + + + stPrefix + + + + + + + Metrics + + "Metrics" + + 9b526466-3bbe-40a9-b5a5-1cfadd791459 + + "9b526466-3bbe-40a9-b5a5-1cfadd791459" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + e58378e8-a2fb-4a33-8013-8a91270388d0 + + "e58378e8-a2fb-4a33-8013-8a91270388d0" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 2ee16325-7a34-4109-82cd-e99144bdbf43 + + "2ee16325-7a34-4109-82cd-e99144bdbf43" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + 2a5d0bd7-5767-43e1-92ab-90d924ade69e + + "2a5d0bd7-5767-43e1-92ab-90d924ade69e" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + ca51b834-cb16-4517-8b02-4807ce263107 + + "ca51b834-cb16-4517-8b02-4807ce263107" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + aebdfc4d-fc4f-4fac-bf2e-22b603bc1880 + + "aebdfc4d-fc4f-4fac-bf2e-22b603bc1880" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + bb1ff1d3-b0bc-4909-9034-11d7c6edb61f + + "bb1ff1d3-b0bc-4909-9034-11d7c6edb61f" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + 3fb5ac29-8ac7-4ca4-863e-49c3c89643b9 + + "3fb5ac29-8ac7-4ca4-863e-49c3c89643b9" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + c4137578-73e0-4a9c-ad9c-7773a1cff401 + + "c4137578-73e0-4a9c-ad9c-7773a1cff401" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + daa3e89b-a727-4bc9-bd38-29afc6024f90 + + "daa3e89b-a727-4bc9-bd38-29afc6024f90" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + b42720b9-b152-4b52-ad89-630e0f5acab1 + + "b42720b9-b152-4b52-ad89-630e0f5acab1" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 0ade9a3b-311c-4293-bc26-bcf994cdbbdc + + "0ade9a3b-311c-4293-bc26-bcf994cdbbdc" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 15c07c54-9586-460c-802f-b3b4a408e3c7 + + "15c07c54-9586-460c-802f-b3b4a408e3c7" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 19fab17a-876c-4a8d-9d74-3e5d92b63dc8 + + "19fab17a-876c-4a8d-9d74-3e5d92b63dc8" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 87b20586-90da-40d8-82ce-62a7dd0ba8af + + "87b20586-90da-40d8-82ce-62a7dd0ba8af" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + c20d083b-41ea-4867-b762-015491579932 + + "c20d083b-41ea-4867-b762-015491579932" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 827ae15d-4cb9-4177-b870-6bea1db8ee44 + + "827ae15d-4cb9-4177-b870-6bea1db8ee44" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 1a004255-b771-48b6-aa33-ea35ce4d37ea + + "1a004255-b771-48b6-aa33-ea35ce4d37ea" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + 8360c2b5-e762-4cc0-935b-fb129cda1b4a + + "8360c2b5-e762-4cc0-935b-fb129cda1b4a" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + 40f104a2-99f0-486d-9c44-47e8c759ca07 + + "40f104a2-99f0-486d-9c44-47e8c759ca07" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + 62b98ef9-b4c6-4777-bc0a-29245bb8b9f3 + + "62b98ef9-b4c6-4777-bc0a-29245bb8b9f3" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 6c74d656-f35f-41b9-b449-eae882ed12fe + + "6c74d656-f35f-41b9-b449-eae882ed12fe" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 0ba696f2-ce22-4330-931f-4ddd5c597896 + + "0ba696f2-ce22-4330-931f-4ddd5c597896" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 6549803a-9e82-4b28-aff1-2425cbec813b + + "6549803a-9e82-4b28-aff1-2425cbec813b" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 6cb1bfb1-4d4a-43ed-96f4-cd0254fc33b5 + + "6cb1bfb1-4d4a-43ed-96f4-cd0254fc33b5" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + f6dd9a78-1e71-4d9c-9e61-394eb38f3809 + + "f6dd9a78-1e71-4d9c-9e61-394eb38f3809" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 571980c1-792d-4355-a9cb-4c3a8f254ab0 + + "571980c1-792d-4355-a9cb-4c3a8f254ab0" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + eb349b41-54d8-47ed-ab7d-b5dbbc17709f + + "eb349b41-54d8-47ed-ab7d-b5dbbc17709f" + + + stUpperLimit + "" + bActive + true + stLowerLimit + "" + + + 209f2982-bd60-4988-9cf9-9ff21cbf643f + + "209f2982-bd60-4988-9cf9-9ff21cbf643f" + + + stUpperLimit + "" + bActive + false + stLowerLimit + "" + + + + + + NamingConventionsSettings + + "NamingConventionsSettings" + + + FirstCharUpperCase + False + CombineScopeWithDatatypePrefix + True + CombinedDataTypesRecursive + True + + + Rules + + "Rules" + + 35 + + "35" + + + bWarning + False + bActive + True + + + 105 + + "105" + + + bWarning + False + bActive + False + + + 63 + + "63" + + + bWarning + False + bActive + True + + + 8 + + "8" + + + bWarning + False + bActive + True + + + 9 + + "9" + + + bWarning + False + bActive + True + + + 47 + + "47" + + + bWarning + False + bActive + True + + + 1 + + "1" + + + bWarning + False + bActive + True + + + 2 + + "2" + + + bWarning + True + bActive + True + + + 3 + + "3" + + + bWarning + False + bActive + True + + + 4 + + "4" + + + bWarning + False + bActive + False + + + 5 + + "5" + + + bWarning + False + bActive + True + + + 6 + + "6" + + + bWarning + False + bActive + False + + + 7 + + "7" + + + bWarning + False + bActive + True + + + 29 + + "29" + + + bWarning + False + bActive + True + + + 133 + + "133" + + + bWarning + False + bActive + False + + + 163 + + "163" + + + bWarning + False + bActive + False + + + 90 + + "90" + + + bWarning + False + bActive + True + + + 118 + + "118" + + + bWarning + False + bActive + False + + + 22 + + "22" + + + bWarning + False + bActive + True + + + 148 + + "148" + + + bWarning + False + bActive + False + + + 42 + + "42" + + + bWarning + False + bActive + True + + + 167 + + "167" + + + bWarning + False + bActive + False + + + 62 + + "62" + + + bWarning + False + bActive + True + + + 55 + + "55" + + + bWarning + False + bActive + True + + + 65 + + "65" + + + bWarning + False + bActive + True + + + 75 + + "75" + + + bWarning + False + bActive + True + + + 14 + + "14" + + + bWarning + False + bActive + True + + + 140 + + "140" + + + bWarning + False + bActive + True + + + 150 + + "150" + + + bWarning + False + bActive + False + + + 114 + + "114" + + + bWarning + False + bActive + False + + + 34 + + "34" + + + bWarning + False + bActive + True + + + 162 + + "162" + + + bWarning + False + bActive + False + + + 13 + + "13" + + + bWarning + False + bActive + True + + + 54 + + "54" + + + bWarning + False + bActive + True + + + 121 + + "121" + + + bWarning + False + bActive + False + + + 66 + + "66" + + + bWarning + False + bActive + True + + + 41 + + "41" + + + bWarning + False + bActive + True + + + 125 + + "125" + + + bWarning + False + bActive + False + + + 60 + + "60" + + + bWarning + False + bActive + True + + + 72 + + "72" + + + bWarning + False + bActive + True + + + 112 + + "112" + + + bWarning + False + bActive + False + + + 81 + + "81" + + + bWarning + False + bActive + True + + + 102 + + "102" + + + bWarning + False + bActive + True + + + 18 + + "18" + + + bWarning + False + bActive + True + + + 132 + + "132" + + + bWarning + False + bActive + True + + + 123 + + "123" + + + bWarning + False + bActive + False + + + 28 + + "28" + + + bWarning + False + bActive + False + + + 58 + + "58" + + + bWarning + False + bActive + True + + + 78 + + "78" + + + bWarning + False + bActive + True + + + 21 + + "21" + + + bWarning + False + bActive + True + + + 61 + + "61" + + + bWarning + False + bActive + True + + + 24 + + "24" + + + bWarning + False + bActive + False + + + 17 + + "17" + + + bWarning + False + bActive + True + + + 48 + + "48" + + + bWarning + False + bActive + True + + + 37 + + "37" + + + bWarning + False + bActive + True + + + 64 + + "64" + + + bWarning + False + bActive + True + + + 57 + + "57" + + + bWarning + False + bActive + True + + + 77 + + "77" + + + bWarning + False + bActive + True + + + 100 + + "100" + + + bWarning + false + nUpperLimit + 1024 + bActive + true + + + 130 + + "130" + + + bWarning + False + bActive + True + + + 160 + + "160" + + + bWarning + False + bActive + True + + + 27 + + "27" + + + bWarning + False + bActive + False + + + 164 + + "164" + + + bWarning + False + bActive + False + + + 119 + + "119" + + + bWarning + False + bActive + False + + + 20 + + "20" + + + bWarning + False + bActive + True + + + 111 + + "111" + + + bWarning + False + bActive + False + + + 12 + + "12" + + + bWarning + False + bActive + True + + + 115 + + "115" + + + bWarning + False + bActive + False + + + 106 + + "106" + + + bWarning + False + bActive + False + + + 145 + + "145" + + + bWarning + False + bActive + False + + + 19 + + "19" + + + bWarning + False + bActive + True + + + 166 + + "166" + + + MaxInOuts + 10 + MaxOutputs + 10 + bWarning + false + bActive + false + MaxInputs + 10 + + + 56 + + "56" + + + bWarning + False + bActive + True + + + 52 + + "52" + + + bWarning + False + bActive + True + + + 16 + + "16" + + + bWarning + False + bActive + False + + + 39 + + "39" + + + bWarning + False + bActive + True + + + 103 + + "103" + + + bWarning + False + bActive + True + + + 80 + + "80" + + + bWarning + False + bActive + True + + + 44 + + "44" + + + bWarning + False + bActive + True + + + 122 + + "122" + + + bWarning + False + bActive + False + + + 113 + + "113" + + + bWarning + False + bActive + False + + + 59 + + "59" + + + bWarning + False + bActive + True + + + 10 + + "10" + + + bWarning + False + bActive + True + + + 95 + + "95" + + + bWarning + False + bActive + True + + + 117 + + "117" + + + bWarning + False + bActive + False + + + 40 + + "40" + + + bWarning + False + bActive + True + + + 33 + + "33" + + + bWarning + False + bActive + False + + + 26 + + "26" + + + bWarning + False + bActive + True + + + 36 + + "36" + + + bWarning + False + bActive + True + + + 46 + + "46" + + + bWarning + False + bActive + True + + + 73 + + "73" + + + bWarning + False + bActive + False + + + 25 + + "25" + + + bWarning + False + bActive + True + + + 76 + + "76" + + + bWarning + False + bActive + True + + + 53 + + "53" + + + bWarning + False + bActive + True + + + 107 + + "107" + + + bWarning + False + bActive + False + + + 32 + + "32" + + + bWarning + False + bActive + True + + + 120 + + "120" + + + bWarning + False + bActive + False + + + 11 + + "11" + + + bWarning + True + bActive + True + + + 124 + + "124" + + + bWarning + False + bActive + False + + + 147 + + "147" + + + bWarning + False + bActive + False + + + 31 + + "31" + + + bWarning + False + bActive + True + + + 134 + + "134" + + + bWarning + False + bActive + False + + + 23 + + "23" + + + bWarning + False + bActive + True + + + 51 + + "51" + + + bWarning + False + bActive + True + + + 15 + + "15" + + + bWarning + False + bActive + True + + + 38 + + "38" + + + bWarning + False + bActive + True + + + 101 + + "101" + + + MinChars + 5 + bWarning + false + bActive + false + MaxChars + 30 + Exceptions + "" + + + 43 + + "43" + + + bWarning + False + bActive + True + + + 131 + + "131" + + + bWarning + False + bActive + True + + + 161 + + "161" + + + bWarning + False + bActive + True + + + + + + + + SuppressedKeywords + "" + PerformStaticAnalyse + false + + + {F66C7017-BDD8-4114-926C-81D6D687E35F} + + "{F66C7017-BDD8-4114-926C-81D6D687E35F}" + + + + + + + + + System.Boolean + System.Collections.Hashtable + System.Int32 + {54dd0eac-a6d8-46f2-8c27-2f43c7e49861} + System.String + + + + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcTask.TcTTO b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcTask.TcTTO new file mode 100644 index 000000000..dc4eda1f1 --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/PlcAppExamples/PlcTask.TcTTO @@ -0,0 +1,19 @@ + + + + + 10000 + 20 + + MAIN_PRG + + + NF_MAIN + + {e557b9b0-3001-4008-a7af-d682a779cf91} + {129f6b36-ba32-4c3d-a496-c52c4ff229d9} + {54748c74-33ba-429a-8c51-95fd48d5a95d} + {fd9f6efa-6fa4-4031-95d9-bc0108d1ad2b} + {d7aeb3c5-f5dd-49e9-a238-ae115fef391c} + + \ No newline at end of file diff --git a/src/TcoApplicationExamples/XaeAppExamples/XaeAppExamples.tsproj b/src/TcoApplicationExamples/XaeAppExamples/XaeAppExamples.tsproj new file mode 100644 index 000000000..e39b9813d --- /dev/null +++ b/src/TcoApplicationExamples/XaeAppExamples/XaeAppExamples.tsproj @@ -0,0 +1,59 @@ + + + + + ARRAY [0..15] OF BOOL + 128 + BOOL + + 0 + 16 + + + + + + + + PlcTask + + + + + + + PlcAppExamples Instance + {08500001-0000-0000-F000-000000000064} + + PlcTask Inputs + + ST_01_IO.INs + ARRAY [0..15] OF BOOL + + + + PlcTask Outputs + + ST_01_IO.OUTs + ARRAY [0..15] OF BOOL + + + + + 0 + PlcTask + + #x02010030 + + 20 + 10000000 + + + + + + + + + + diff --git a/src/TcoApplicationExamples/runbuild.ps1 b/src/TcoApplicationExamples/runbuild.ps1 new file mode 100644 index 000000000..df8d727c7 --- /dev/null +++ b/src/TcoApplicationExamples/runbuild.ps1 @@ -0,0 +1 @@ +..\..\_Vortex\builder\vortex.compiler.console.exe -s .\TcoApplicationExamples.slnf \ No newline at end of file diff --git a/src/TcoCore/TcoCore.slnf b/src/TcoCore/TcoCore.slnf index 72fcfc4e7..b4a090264 100644 --- a/src/TcoCore/TcoCore.slnf +++ b/src/TcoCore/TcoCore.slnf @@ -6,9 +6,10 @@ "src\\TcoCore\\src\\TcoCoreConnector\\TcoCoreConnector.csproj", "src\\TcoCore\\src\\XaeTcoCore\\XaeTcoCore.tsproj", "src\\TcoCore\\tests\\TcoCore.Sandbox.Wpf\\TcoCore.Sandbox.Wpf.csproj", + "src\\TcoCore\\tests\\TcoCoreExamplesConnector\\TcoCoreExamplesConnector.csproj", "src\\TcoCore\\tests\\TcoCoreTestsConnector\\TcoCoreTestsConnector.csproj", "src\\TcoCore\\tests\\TcoCoreUnitTests\\TcoCoreUnitTests.csproj", - "src\\TcoCore\\tests\\TcoTestRunners\\TcoTestRunners.csproj" + "src\\TcoCore\\tests\\TcoTestRunners\\TcoTestRunners.csproj" ] } } \ No newline at end of file diff --git a/src/TcoPneumatics/src/TcoPneumatics.Wpf/Cyclinders/Converters/ActuatorToBrushConverter.cs b/src/TcoCore/src/TcoCore.Wpf/Converters/BooleanToVisibilityConverter.cs similarity index 63% rename from src/TcoPneumatics/src/TcoPneumatics.Wpf/Cyclinders/Converters/ActuatorToBrushConverter.cs rename to src/TcoCore/src/TcoCore.Wpf/Converters/BooleanToVisibilityConverter.cs index fe55109e5..27fc7f2c1 100644 --- a/src/TcoPneumatics/src/TcoPneumatics.Wpf/Cyclinders/Converters/ActuatorToBrushConverter.cs +++ b/src/TcoCore/src/TcoCore.Wpf/Converters/BooleanToVisibilityConverter.cs @@ -1,28 +1,32 @@ using System; using System.Globalization; using System.Linq; +using System.Windows; using System.Windows.Data; using System.Windows.Markup; -namespace TcOpen +namespace TcoCore { - public class ActuatorToBrushConverter : MarkupExtension, IValueConverter + public class BooleanToVisibilityConverter : MarkupExtension, IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { try { - return (bool)value ? Vortex.Presentation.Styling.Wpf.VortexResources.Accent : Vortex.Presentation.Styling.Wpf.VortexResources.Secondary; + var @is = (bool)value; + return @is ? Visibility.Visible : Visibility.Collapsed; } catch (Exception) { - return Vortex.Presentation.Styling.Wpf.VortexResources.Alert; + //!Swallow } + + return Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { - return value; + return null; } public override object ProvideValue(IServiceProvider serviceProvider) diff --git a/src/TcoCore/src/TcoCore.Wpf/Converters/CountToVisibilityConverter.cs b/src/TcoCore/src/TcoCore.Wpf/Converters/CountToVisibilityConverter.cs new file mode 100644 index 000000000..47427be61 --- /dev/null +++ b/src/TcoCore/src/TcoCore.Wpf/Converters/CountToVisibilityConverter.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Windows; +using System.Windows.Data; +using System.Windows.Markup; + +namespace TcoCore +{ + public class CountToVisibilityConverter : MarkupExtension, IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var list = value as IEnumerable; + 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}"> -