From 331fb5a15d9364714a7e0168de2017f5929ad530 Mon Sep 17 00:00:00 2001 From: PTKu Date: Wed, 16 Aug 2023 09:07:31 +0200 Subject: [PATCH 01/28] Create draft PR for #173 From f4c90d7b762a48d8386dea5d07493ffec1cfa00c Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Wed, 16 Aug 2023 14:17:06 +0200 Subject: [PATCH 02/28] adds observation of alarms into AxoComponentView --- src/README.md | 9 ++- .../AxoComponent/AxoComponentView.razor | 66 ++++++++++++++--- .../AxoComponent/AxoComponentView.razor.cs | 73 ++++++++++++++++++- .../Static/AxoMessengerView.razor | 39 +++++----- 4 files changed, 153 insertions(+), 34 deletions(-) diff --git a/src/README.md b/src/README.md index 6a48db1cf..afd73405a 100644 --- a/src/README.md +++ b/src/README.md @@ -10,10 +10,15 @@ dotnet new install .\template.axolibrary\ --force 3. Create library template using following command: ~~~PowerShell -dotnet new axolibrary -o OutputFolder -n LibraryName -ax axlibraryname - -p AXOpen.Components.Pneumatics +dotnet new axolibrary -o OutputFolder -n LibraryName -ax axlibraryname -p AXOpen.Components.Pneumatics ~~~ +E.G. +~~~PowerShell +dotnet new axolibrary -o components.elements -n ElementComponents -ax axopen.components.elements -p AXOpen.Components.Elements +~~~ + + > ![IMPORTANT] > Make sure you run all the commands from within the `src` folder of the repostory. And paramter -o OutputFolder must be in the `src` folder. diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor index 8c793db52..c7dda92cf 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor @@ -7,14 +7,47 @@
@Component.AttributeName
-
+
@if (containsDetailsAttribute) { - }
+
+ + @switch (AlarmLevel) + { + case eAlarmLevel.NoAlarms: + break; + case eAlarmLevel.Unacknowledged: + + break; + case eAlarmLevel.ActiveInfo: + + break; + case eAlarmLevel.ActiveWarnings: + + break; + case eAlarmLevel.ActiveErrors: + + break; + default: + + break; + } +
@@ -33,20 +66,20 @@ @if (containsDetailsAttribute) { -
+
- @if (!isCollapsed) + @if (!areDetailsCollapsed) { @foreach (var detailsTab in DetailsTabs) { + Context=@detailsTab + Presentation="@currentPresentation" + Class="bg-light rounded-3 shadow" + LayoutClass="align-items-end" + LayoutChildrenClass="ms-0"/> } @@ -54,4 +87,17 @@
} + + @if (AlarmLevel > eAlarmLevel.NoAlarms) + { + @if (!areAlarmsCollapsed) + { + @foreach (var message in Messengers) + { +
+ +
+ } + } + }
diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs index 0a8c671b4..8c0b918df 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs @@ -1,12 +1,17 @@ -using AXSharp.Connector; +using AXOpen.Messaging; +using AXOpen.Messaging.Static; +using AXSharp.Connector; using Microsoft.AspNetCore.Components; +using Pocos.AXOpen.Core; +using Serilog; namespace AXOpen.Core { public partial class AxoComponentView : IDisposable { - private bool isCollapsed = true; + private bool areDetailsCollapsed = true; + private bool areAlarmsCollapsed = true; private string currentPresentation = "Status-Display"; private bool containsHeaderAttribute; private bool containsDetailsAttribute; @@ -22,6 +27,18 @@ public override void AddToPolling(ITwinElement element, int pollingInterval = 25 axoComponent._isManuallyControllable.StartPolling(pollingInterval, this); PolledElements.Add(axoComponent._isManuallyControllable); } + + Messengers?.Select(p => p.IsActive).ToList().ForEach(messenger => + { + messenger.StartPolling(1500, this); + PolledElements.Add(messenger); + }); + + Messengers?.Select(p => p.WaitingForAcknowledge).ToList().ForEach(messenger => + { + messenger.StartPolling(1500, this); + PolledElements.Add(messenger); + }); } private IEnumerable GetAllTabNames(ITwinObject twinObject) @@ -83,11 +100,59 @@ protected override void OnInitialized() tabNames = GetAllTabNames(this.Component); containsDetailsAttribute = this.DetailsTabs.Count() != 0; UpdateValuesOnChange(Component); + + + } + + private IEnumerable? Messengers => this.Component?.GetChildren().OfType(); + + + private eAlarmLevel AlarmLevel + { + get + { + var _messengers = Messengers?.ToList(); + + if (_messengers == null) { return eAlarmLevel.NoAlarms; } + + if (_messengers.Any(p => p.IsActive.Cyclic)) + { + _messengers.First().GetConnector().ReadBatchAsync(_messengers.Select(p => p.Category)); + var seriousness = (eAxoMessageCategory)_messengers.Max(p => p.Category.LastValue); + + if(seriousness <= eAxoMessageCategory.Info) + return eAlarmLevel.ActiveInfo; + else if (seriousness <= eAxoMessageCategory.Warning) + return eAlarmLevel.ActiveWarnings; + else if (seriousness <= eAxoMessageCategory.Error) + return eAlarmLevel.ActiveErrors; + } + else if (_messengers.Any(p => p.WaitingForAcknowledge.Cyclic)) + { + return eAlarmLevel.Unacknowledged; + } + + return eAlarmLevel.NoAlarms; + } + } + + public enum eAlarmLevel + { + NoAlarms, + Unacknowledged, + ActiveInfo, + ActiveWarnings, + ActiveErrors + } + + private void ToggleCollapseDetails() + { + areDetailsCollapsed = !areDetailsCollapsed; } - private void Collapse() + private void ToggleAlarmsDetails() { - isCollapsed = !isCollapsed; + areAlarmsCollapsed = !areAlarmsCollapsed; } } diff --git a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor index 3da9bec76..1db107dd7 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor @@ -4,23 +4,26 @@ @inherits RenderableComplexComponentBase @implements IDisposable; -
-
- +@if (Component.WaitingForAcknowledge.Cyclic || Component.IsActive.Cyclic) +{ +
+
+ - - - + + + +
-
\ No newline at end of file +} \ No newline at end of file From a1945701a9f3e94268ce18143bd786058dff504f Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Thu, 17 Aug 2023 10:56:39 +0200 Subject: [PATCH 03/28] additions to prev + docu --- docfx/articles/core/AXOCOMPONENT.md | 46 ++++++++++++++++++- .../AxoComponent/AxoComponentView.razor | 2 +- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/docfx/articles/core/AXOCOMPONENT.md b/docfx/articles/core/AXOCOMPONENT.md index 8e1c57ccb..b6ae7b095 100644 --- a/docfx/articles/core/AXOCOMPONENT.md +++ b/docfx/articles/core/AXOCOMPONENT.md @@ -61,4 +61,48 @@ UI side of the `AxoComponent`. and the rendered result: -![Alt text](~/images/ComplexComponentExample.gif) \ No newline at end of file +![Alt text](~/images/ComplexComponentExample.gif) + + +# Alarm Level + +AxoComponent provides visual indicators to represent different alarm levels. Below is an explanation of each alarm level and its corresponding visual indicator. + +## 1. No Alarms +**Description**: No active alarms or messages are present. + +**Icon**: There's no visual indicator for this state. + +## 2. Unacknowledged +**Description**: There are messages that are waiting for acknowledgment. + + + + + + +## 3. Active Info +**Description**: Active informational messages are present. + + + + + + +## 4. Active Warnings +**Description**: Active warning messages are present. + + + + + + +## 5. Active Errors +**Description**: Active error messages are present. + + + + + + +--- \ No newline at end of file diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor index c7dda92cf..a91088105 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor @@ -38,7 +38,7 @@ break; case eAlarmLevel.ActiveErrors: break; default: From 118bdf759f5cf4f1a49f98dcf79e4e9ed13222f2 Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Thu, 17 Aug 2023 16:06:47 +0200 Subject: [PATCH 04/28] wip on generic pneumatics --- .../.cr/personal/FavoritesList/List.xml | 6 + .../.vscode/settings.json | 3 + .../PneumaticComponents.sln | 120 ++++ src/components.pneumatics/app/.gitignore | 6 + .../app/AXSharp.config.json | 1 + src/components.pneumatics/app/apax.yml | 22 + .../app/ix-blazor/JSONREPOS/Groups/AdminGroup | 12 + .../PneumaticComponents.blazor/App.razor | 12 + .../Pages/Documentation.razor | 5 + .../Pages/Error.cshtml | 42 ++ .../Pages/Error.cshtml.cs | 27 + .../Pages/Index.razor | 9 + .../Pages/Testing.razor | 6 + .../Pages/_Host.cshtml | 35 ++ .../PneumaticComponents.blazor.csproj | 19 + .../PneumaticComponents.blazor/Program.cs | 104 ++++ .../Properties/launchSettings.json | 37 ++ .../Shared/MainLayout.razor | 19 + .../Shared/MainLayout.razor.css | 70 +++ .../Shared/NavMenu.razor | 39 ++ .../Shared/NavMenu.razor.css | 68 +++ .../PneumaticComponents.blazor/Usings.cs | 1 + .../PneumaticComponents.blazor/_Imports.razor | 16 + .../appsettings.Development.json | 9 + .../appsettings.json | 9 + .../wwwroot/css/bootstrap/bootstrap.min.css | 7 + .../css/bootstrap/bootstrap.min.css.map | 1 + .../wwwroot/css/open-iconic/FONT-LICENSE | 86 +++ .../wwwroot/css/open-iconic/ICON-LICENSE | 21 + .../wwwroot/css/open-iconic/README.md | 114 ++++ .../font/css/open-iconic-bootstrap.min.css | 1 + .../open-iconic/font/fonts/open-iconic.eot | Bin 0 -> 28196 bytes .../open-iconic/font/fonts/open-iconic.otf | Bin 0 -> 20996 bytes .../open-iconic/font/fonts/open-iconic.svg | 543 ++++++++++++++++++ .../open-iconic/font/fonts/open-iconic.ttf | Bin 0 -> 28028 bytes .../open-iconic/font/fonts/open-iconic.woff | Bin 0 -> 14984 bytes .../wwwroot/css/site.css | 68 +++ .../wwwroot/favicon.png | Bin 0 -> 1148 bytes src/components.pneumatics/app/ix/Entry.cs | 22 + .../app/ix/PneumaticComponents.csproj | 22 + src/components.pneumatics/app/ix/Usings.cs | 1 + .../src/Documentation/DocumentationContext.st | 16 + .../app/src/Sandbox/SandboxContext.st | 20 + .../app/src/configuration.st | 12 + src/components.pneumatics/app/src/program.st | 15 + src/components.pneumatics/app/test/test.st | 13 + src/components.pneumatics/ctrl/.gitignore | 8 + src/components.pneumatics/ctrl/.npmrc | 1 + .../ctrl/.vscode/launch.json | 15 + .../ctrl/AXSharp.config.json | 1 + src/components.pneumatics/ctrl/apax.yml | 18 + .../ctrl/package-lock.json | 11 + .../ctrl/src/AxoCylinder.st | 139 +++++ .../ctrl/test/CylinderTests.st | 89 +++ ...AXOpen.Components.Pneumatics.blazor.csproj | 72 +++ .../Properties/AssemblyInfo.cs | 3 + .../Usings.cs | 1 + .../_Imports.razor | 3 + .../wwwroot/background.png | Bin 0 -> 378 bytes .../wwwroot/exampleJsInterop.js | 6 + .../Properties/AssemblyInfo.cs | 3 + .../AXOpen.Components.Pneumatics/Usings.cs | 1 + .../ix_ax_axopen_components_pneumatics.csproj | 84 +++ .../AXOpen.Components.Pneumatics_tests.csproj | 39 ++ .../Usings.cs | 1 + .../xunit.runner.json | 4 + 66 files changed, 2158 insertions(+) create mode 100644 src/components.pneumatics/.cr/personal/FavoritesList/List.xml create mode 100644 src/components.pneumatics/.vscode/settings.json create mode 100644 src/components.pneumatics/PneumaticComponents.sln create mode 100644 src/components.pneumatics/app/.gitignore create mode 100644 src/components.pneumatics/app/AXSharp.config.json create mode 100644 src/components.pneumatics/app/apax.yml create mode 100644 src/components.pneumatics/app/ix-blazor/JSONREPOS/Groups/AdminGroup create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/App.razor create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Documentation.razor create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Error.cshtml create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Error.cshtml.cs create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Index.razor create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Testing.razor create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/_Host.cshtml create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/PneumaticComponents.blazor.csproj create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Program.cs create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Properties/launchSettings.json create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/MainLayout.razor create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/MainLayout.razor.css create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/NavMenu.razor create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/NavMenu.razor.css create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Usings.cs create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/appsettings.Development.json create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/appsettings.json create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/bootstrap/bootstrap.min.css create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/bootstrap/bootstrap.min.css.map create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/FONT-LICENSE create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/ICON-LICENSE create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/README.md create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.eot create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.otf create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.svg create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.woff create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/site.css create mode 100644 src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/favicon.png create mode 100644 src/components.pneumatics/app/ix/Entry.cs create mode 100644 src/components.pneumatics/app/ix/PneumaticComponents.csproj create mode 100644 src/components.pneumatics/app/ix/Usings.cs create mode 100644 src/components.pneumatics/app/src/Documentation/DocumentationContext.st create mode 100644 src/components.pneumatics/app/src/Sandbox/SandboxContext.st create mode 100644 src/components.pneumatics/app/src/configuration.st create mode 100644 src/components.pneumatics/app/src/program.st create mode 100644 src/components.pneumatics/app/test/test.st create mode 100644 src/components.pneumatics/ctrl/.gitignore create mode 100644 src/components.pneumatics/ctrl/.npmrc create mode 100644 src/components.pneumatics/ctrl/.vscode/launch.json create mode 100644 src/components.pneumatics/ctrl/AXSharp.config.json create mode 100644 src/components.pneumatics/ctrl/apax.yml create mode 100644 src/components.pneumatics/ctrl/package-lock.json create mode 100644 src/components.pneumatics/ctrl/src/AxoCylinder.st create mode 100644 src/components.pneumatics/ctrl/test/CylinderTests.st create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/Properties/AssemblyInfo.cs create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/Usings.cs create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/_Imports.razor create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/wwwroot/background.png create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/wwwroot/exampleJsInterop.js create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics/Properties/AssemblyInfo.cs create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics/Usings.cs create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj create mode 100644 src/components.pneumatics/tests/AXOpen.Components.Pneumatics.Tests/AXOpen.Components.Pneumatics_tests.csproj create mode 100644 src/components.pneumatics/tests/AXOpen.Components.Pneumatics.Tests/Usings.cs create mode 100644 src/components.pneumatics/tests/AXOpen.Components.Pneumatics.Tests/xunit.runner.json diff --git a/src/components.pneumatics/.cr/personal/FavoritesList/List.xml b/src/components.pneumatics/.cr/personal/FavoritesList/List.xml new file mode 100644 index 000000000..a60e5ed6c --- /dev/null +++ b/src/components.pneumatics/.cr/personal/FavoritesList/List.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/components.pneumatics/.vscode/settings.json b/src/components.pneumatics/.vscode/settings.json new file mode 100644 index 000000000..f25a0a8f4 --- /dev/null +++ b/src/components.pneumatics/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "dotnet.defaultSolution": "pneumaticcomponents.sln" +} \ No newline at end of file diff --git a/src/components.pneumatics/PneumaticComponents.sln b/src/components.pneumatics/PneumaticComponents.sln new file mode 100644 index 000000000..b00463580 --- /dev/null +++ b/src/components.pneumatics/PneumaticComponents.sln @@ -0,0 +1,120 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.002.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E51BBDA9-04D1-4AF0-9783-FEC5E9DEE133}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{2FE687B0-D4AC-4418-BA7D-3B2F611AB95D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{F3F99DF4-1967-489F-B6D0-2F2F31B99D08}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_core", "..\core\src\AXOpen.Core\ix_ax_axopen_core.csproj", "{784C64F8-6B8B-411E-B820-CF4A20BB8CA9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_core_blazor", "..\core\src\AXOpen.Core.Blazor\axopen_core_blazor.csproj", "{E4C9F351-1DD3-4F2D-8C35-05F612F22C46}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_axo", "_axo", "{A2D5F309-0577-4946-B4E6-7E00A26EF5F5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Base.Abstractions", "..\base\src\AXOpen.Base.Abstractions\AXOpen.Base.Abstractions.csproj", "{8FB50832-A226-42C9-8A32-9C4744394AB1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_abstractions", "..\abstractions\src\AXOpen.Abstractions\ix_ax_axopen_abstractions.csproj", "{6503DFAE-A91B-48A3-A7E6-B13C5AA0F4F7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Security", "..\security\src\AXOpen.Security\AXOpen.Security.csproj", "{669A9C33-4E08-45C9-94EF-CA1CE7AC3FBA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Security.Blazor", "..\security\src\AXOpen.Security.Blazor\AXOpen.Security.Blazor.csproj", "{84298C32-DBB3-4491-91E0-DFF77120E28A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Data.Json", "..\data\src\repositories\Json\AXOpen.Data.Json.csproj", "{F4C377AE-74AF-4FA6-99F4-9659BDF1795F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Logging.Serilog", "..\base\src\AXOpen.Logging\AXOpen.Logging.Serilog.csproj", "{633FB178-C1F0-4D49-9B73-063C94E27585}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "pneumaticcomponents", "app\ix\pneumaticcomponents.csproj", "{C28B1092-C5EE-44B2-AD9A-EDCE119AEE76}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "pneumaticcomponents.blazor", "app\ix-blazor\pneumaticcomponents.blazor\pneumaticcomponents.blazor.csproj", "{CA9C6A8B-383E-45A0-82EF-8FDB0DCB0BC3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_components_pneumatics", "src\AXOpen.Components.Pneumatics\ix_ax_axopen_components_pneumatics.csproj", "{45F7C288-E915-4AA9-B983-B207EDC102AC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Components.Pneumatics.blazor", "src\AXOpen.Components.Pneumatics.blazor\AXOpen.Components.Pneumatics.blazor.csproj", "{242379CB-CE5F-43FB-8734-3B17747F8C53}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Components.Pneumatics_tests", "tests\AXOpen.Components.Pneumatics.Tests\AXOpen.Components.Pneumatics_tests.csproj", "{289BF388-A523-4F76-8DEB-DC573D77DBC5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {784C64F8-6B8B-411E-B820-CF4A20BB8CA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {784C64F8-6B8B-411E-B820-CF4A20BB8CA9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {784C64F8-6B8B-411E-B820-CF4A20BB8CA9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {784C64F8-6B8B-411E-B820-CF4A20BB8CA9}.Release|Any CPU.Build.0 = Release|Any CPU + {E4C9F351-1DD3-4F2D-8C35-05F612F22C46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4C9F351-1DD3-4F2D-8C35-05F612F22C46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4C9F351-1DD3-4F2D-8C35-05F612F22C46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4C9F351-1DD3-4F2D-8C35-05F612F22C46}.Release|Any CPU.Build.0 = Release|Any CPU + {8FB50832-A226-42C9-8A32-9C4744394AB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8FB50832-A226-42C9-8A32-9C4744394AB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FB50832-A226-42C9-8A32-9C4744394AB1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8FB50832-A226-42C9-8A32-9C4744394AB1}.Release|Any CPU.Build.0 = Release|Any CPU + {6503DFAE-A91B-48A3-A7E6-B13C5AA0F4F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6503DFAE-A91B-48A3-A7E6-B13C5AA0F4F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6503DFAE-A91B-48A3-A7E6-B13C5AA0F4F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6503DFAE-A91B-48A3-A7E6-B13C5AA0F4F7}.Release|Any CPU.Build.0 = Release|Any CPU + {669A9C33-4E08-45C9-94EF-CA1CE7AC3FBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {669A9C33-4E08-45C9-94EF-CA1CE7AC3FBA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {669A9C33-4E08-45C9-94EF-CA1CE7AC3FBA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {669A9C33-4E08-45C9-94EF-CA1CE7AC3FBA}.Release|Any CPU.Build.0 = Release|Any CPU + {84298C32-DBB3-4491-91E0-DFF77120E28A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84298C32-DBB3-4491-91E0-DFF77120E28A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84298C32-DBB3-4491-91E0-DFF77120E28A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84298C32-DBB3-4491-91E0-DFF77120E28A}.Release|Any CPU.Build.0 = Release|Any CPU + {F4C377AE-74AF-4FA6-99F4-9659BDF1795F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4C377AE-74AF-4FA6-99F4-9659BDF1795F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4C377AE-74AF-4FA6-99F4-9659BDF1795F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4C377AE-74AF-4FA6-99F4-9659BDF1795F}.Release|Any CPU.Build.0 = Release|Any CPU + {633FB178-C1F0-4D49-9B73-063C94E27585}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {633FB178-C1F0-4D49-9B73-063C94E27585}.Debug|Any CPU.Build.0 = Debug|Any CPU + {633FB178-C1F0-4D49-9B73-063C94E27585}.Release|Any CPU.ActiveCfg = Release|Any CPU + {633FB178-C1F0-4D49-9B73-063C94E27585}.Release|Any CPU.Build.0 = Release|Any CPU + {C28B1092-C5EE-44B2-AD9A-EDCE119AEE76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C28B1092-C5EE-44B2-AD9A-EDCE119AEE76}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C28B1092-C5EE-44B2-AD9A-EDCE119AEE76}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C28B1092-C5EE-44B2-AD9A-EDCE119AEE76}.Release|Any CPU.Build.0 = Release|Any CPU + {CA9C6A8B-383E-45A0-82EF-8FDB0DCB0BC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA9C6A8B-383E-45A0-82EF-8FDB0DCB0BC3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA9C6A8B-383E-45A0-82EF-8FDB0DCB0BC3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA9C6A8B-383E-45A0-82EF-8FDB0DCB0BC3}.Release|Any CPU.Build.0 = Release|Any CPU + {45F7C288-E915-4AA9-B983-B207EDC102AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {45F7C288-E915-4AA9-B983-B207EDC102AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45F7C288-E915-4AA9-B983-B207EDC102AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {45F7C288-E915-4AA9-B983-B207EDC102AC}.Release|Any CPU.Build.0 = Release|Any CPU + {242379CB-CE5F-43FB-8734-3B17747F8C53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {242379CB-CE5F-43FB-8734-3B17747F8C53}.Debug|Any CPU.Build.0 = Debug|Any CPU + {242379CB-CE5F-43FB-8734-3B17747F8C53}.Release|Any CPU.ActiveCfg = Release|Any CPU + {242379CB-CE5F-43FB-8734-3B17747F8C53}.Release|Any CPU.Build.0 = Release|Any CPU + {289BF388-A523-4F76-8DEB-DC573D77DBC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {289BF388-A523-4F76-8DEB-DC573D77DBC5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {289BF388-A523-4F76-8DEB-DC573D77DBC5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {289BF388-A523-4F76-8DEB-DC573D77DBC5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {784C64F8-6B8B-411E-B820-CF4A20BB8CA9} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {E4C9F351-1DD3-4F2D-8C35-05F612F22C46} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {8FB50832-A226-42C9-8A32-9C4744394AB1} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {6503DFAE-A91B-48A3-A7E6-B13C5AA0F4F7} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {669A9C33-4E08-45C9-94EF-CA1CE7AC3FBA} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {84298C32-DBB3-4491-91E0-DFF77120E28A} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {F4C377AE-74AF-4FA6-99F4-9659BDF1795F} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {633FB178-C1F0-4D49-9B73-063C94E27585} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {C28B1092-C5EE-44B2-AD9A-EDCE119AEE76} = {F3F99DF4-1967-489F-B6D0-2F2F31B99D08} + {CA9C6A8B-383E-45A0-82EF-8FDB0DCB0BC3} = {F3F99DF4-1967-489F-B6D0-2F2F31B99D08} + {45F7C288-E915-4AA9-B983-B207EDC102AC} = {E51BBDA9-04D1-4AF0-9783-FEC5E9DEE133} + {242379CB-CE5F-43FB-8734-3B17747F8C53} = {E51BBDA9-04D1-4AF0-9783-FEC5E9DEE133} + {289BF388-A523-4F76-8DEB-DC573D77DBC5} = {2FE687B0-D4AC-4418-BA7D-3B2F611AB95D} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1F40781D-14F8-4DE5-80E3-F8EFD896A3AD} + EndGlobalSection +EndGlobal diff --git a/src/components.pneumatics/app/.gitignore b/src/components.pneumatics/app/.gitignore new file mode 100644 index 000000000..42d9b3c6a --- /dev/null +++ b/src/components.pneumatics/app/.gitignore @@ -0,0 +1,6 @@ +.apax +.env +bin + +obj +testresult diff --git a/src/components.pneumatics/app/AXSharp.config.json b/src/components.pneumatics/app/AXSharp.config.json new file mode 100644 index 000000000..543f25b00 --- /dev/null +++ b/src/components.pneumatics/app/AXSharp.config.json @@ -0,0 +1 @@ +{"OutputProjectFolder":"ix"} \ No newline at end of file diff --git a/src/components.pneumatics/app/apax.yml b/src/components.pneumatics/app/apax.yml new file mode 100644 index 000000000..82089534e --- /dev/null +++ b/src/components.pneumatics/app/apax.yml @@ -0,0 +1,22 @@ +name: "pneumaticcomponents" +version: 0.0.0 +type: app +targets: + - "1500" + - plcsim + - axunit-llvm +variables: + APAX_BUILD_ARGS: + - "--debug" # Generate debug information for target "1500" +devDependencies: + "@ax/sdk": 4.0.3 +dependencies: + "@ix-ax/axopen_components_pneumatics" : 0.1.4-alpha.79 +scripts: + download: + - apax install -L + - apax build + - dotnet ixc + - apax sld -i $AXTARGETPLATFORMINPUT -t $AXTARGET --accept-security-disclaimer --default-server-interface -r + + diff --git a/src/components.pneumatics/app/ix-blazor/JSONREPOS/Groups/AdminGroup b/src/components.pneumatics/app/ix-blazor/JSONREPOS/Groups/AdminGroup new file mode 100644 index 000000000..c0ba12c88 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/JSONREPOS/Groups/AdminGroup @@ -0,0 +1,12 @@ +{ + "Changes": [], + "RecordId": null, + "DataEntityId": "AdminGroup", + "Name": "AdminGroup", + "Roles": [ + "Administrator" + ], + "RolesHash": "AQAAAAIAAYagAAAAEOnVgoEc0N/grlrKHOmSswEnXUk0/PHHYrCCns0sBFfQdP27cLrZ3LZPIFyLd6X/oA==", + "Created": "2023-08-09T12:33:03.2736142+02:00", + "Modified": "2023-08-09T12:33:03.4914502+02:00" +} \ No newline at end of file diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/App.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/App.razor new file mode 100644 index 000000000..6fd3ed1b5 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/App.razor @@ -0,0 +1,12 @@ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Documentation.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Documentation.razor new file mode 100644 index 000000000..ab6a3e46d --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Documentation.razor @@ -0,0 +1,5 @@ +@page "/Documentation" + +Documentation + + diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Error.cshtml b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Error.cshtml new file mode 100644 index 000000000..0c621e358 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Error.cshtml @@ -0,0 +1,42 @@ +@page +@model pneumaticcomponents.blazor.Pages.ErrorModel + + + + + + + + Error + + + + + +
+
+

Error.

+

An error occurred while processing your request.

+ + @if (Model.ShowRequestId) + { +

+ Request ID: @Model.RequestId +

+ } + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

+
+
+ + + diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Error.cshtml.cs b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Error.cshtml.cs new file mode 100644 index 000000000..e166a5825 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Error.cshtml.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using System.Diagnostics; + +namespace pneumaticcomponents.blazor.Pages +{ + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + [IgnoreAntiforgeryToken] + public class ErrorModel : PageModel + { + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + private readonly ILogger _logger; + + public ErrorModel(ILogger logger) + { + _logger = logger; + } + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } + } +} \ No newline at end of file diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Index.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Index.razor new file mode 100644 index 000000000..6085c4aa9 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Index.razor @@ -0,0 +1,9 @@ +@page "/" + +Index + +

Hello, world!

+ +Welcome to your new app. + + diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Testing.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Testing.razor new file mode 100644 index 000000000..f2f06b311 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/Testing.razor @@ -0,0 +1,6 @@ +@page "/testing" +@using pneumaticcomponents + +Testing + + diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/_Host.cshtml b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/_Host.cshtml new file mode 100644 index 000000000..90775e112 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Pages/_Host.cshtml @@ -0,0 +1,35 @@ +@page "/" +@using Microsoft.AspNetCore.Components.Web +@namespace pneumaticcomponents.blazor.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + + + + + + + + + + + +
+ + An error has occurred. This application may no longer respond until reloaded. + + + An unhandled exception has occurred. See browser dev tools for details. + + Reload + 🗙 +
+ + + + diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/PneumaticComponents.blazor.csproj b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/PneumaticComponents.blazor.csproj new file mode 100644 index 000000000..b3961884a --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/PneumaticComponents.blazor.csproj @@ -0,0 +1,19 @@ + + + + net7.0 + enable + enable + false + + + + + + + + + + + + diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Program.cs b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Program.cs new file mode 100644 index 000000000..1e9135c11 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Program.cs @@ -0,0 +1,104 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; +using System.Data; +using AXOpen.Core; +using AxOpen.Security.Services; +using AXSharp.Presentation.Blazor.Services; +using AXSharp.Connector; +using AXOpen.Base.Data; +using AxOpen.Security.Entities; +using System.Reflection; +using AXOpen.Data.Json; +using AxOpen.Security; +using Serilog; +using AXOpen; +using AXOpen.Logging; +using pneumaticcomponents; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.ConfigureAxBlazorSecurity(SetUpJSon(), Roles.CreateRoles()); +builder.Services.AddLocalization(); +builder.Services.AddRazorPages(); +builder.Services.AddServerSideBlazor(); +builder.Services.AddIxBlazorServices(); +builder.Services.AddAxoCoreServices(); + +Entry.Plc.Connector.SubscriptionMode = ReadSubscriptionMode.Polling; +Entry.Plc.Connector.BuildAndStart().ReadWriteCycleDelay = 250; +Entry.Plc.Connector.SetLoggerConfiguration(new LoggerConfiguration() + .WriteTo + .Console() + .WriteTo + .File($"connector.log", + outputTemplate: "{Timestamp:yyyy-MMM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}", + fileSizeLimitBytes: 100000) + .MinimumLevel.Debug() + .CreateLogger()); +await Entry.Plc.Connector.IdentityProvider.ConstructIdentitiesAsync(); + +AxoApplication.CreateBuilder().ConfigureLogger(new SerilogLogger(new LoggerConfiguration() + .WriteTo.Console().MinimumLevel.Verbose() + .CreateLogger())); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); + +app.UseStaticFiles(); + +app.UseRouting(); + +app.MapBlazorHub(); +app.MapFallbackToPage("/_Host"); + +app.Run(); + +static (IRepository, IRepository) SetUpJSon(string path = "..\\..\\..\\..\\..\\JSONREPOS\\") +{ + var executingAssemblyFile = new FileInfo(Assembly.GetExecutingAssembly().Location); + var repositoryDirectory = Path.GetFullPath($"{executingAssemblyFile.Directory}{path}"); + if (!Directory.Exists(repositoryDirectory)) + { + Directory.CreateDirectory(repositoryDirectory); + } + + IRepository userRepo = new JsonRepository(new JsonRepositorySettings(Path.Combine(repositoryDirectory, "Users"))); + IRepository groupRepo = new JsonRepository(new JsonRepositorySettings(Path.Combine(repositoryDirectory, "Groups"))); + + return (userRepo, groupRepo); +} + +public static class Roles +{ + public static List CreateRoles() + { + var roles = new List + { + new Role(process_settings_access), + new Role(process_traceability_access), + new Role(can_run_ground_mode), + new Role(can_run_automat_mode), + new Role(can_run_service_mode), + new Role(can_skip_steps_in_sequence), + }; + + return roles; + } + + public const string can_run_ground_mode = nameof(can_run_ground_mode); + public const string can_run_automat_mode = nameof(can_run_automat_mode); + public const string can_run_service_mode = nameof(can_run_service_mode); + public const string process_settings_access = nameof(process_settings_access); + public const string process_traceability_access = nameof(process_traceability_access); + public const string can_skip_steps_in_sequence = nameof(can_skip_steps_in_sequence); +} diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Properties/launchSettings.json b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Properties/launchSettings.json new file mode 100644 index 000000000..ff08147fd --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Properties/launchSettings.json @@ -0,0 +1,37 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:8555", + "sslPort": 44324 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5073", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7225;http://localhost:5073", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/MainLayout.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/MainLayout.razor new file mode 100644 index 000000000..e8cdc0fd1 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/MainLayout.razor @@ -0,0 +1,19 @@ +@inherits LayoutComponentBase + +pneumaticcomponents.blazor + +
+ + +
+
+ About +
+ +
+ @Body +
+
+
diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/MainLayout.razor.css b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/MainLayout.razor.css new file mode 100644 index 000000000..551e4b276 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/MainLayout.razor.css @@ -0,0 +1,70 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + } + + .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row:not(.auth) { + display: none; + } + + .top-row.auth { + justify-content: space-between; + } + + .top-row a, .top-row .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/NavMenu.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/NavMenu.razor new file mode 100644 index 000000000..7d6dca772 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/NavMenu.razor @@ -0,0 +1,39 @@ + + + + +@code { + private bool collapseNavMenu = true; + + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() + { + collapseNavMenu = !collapseNavMenu; + } +} diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/NavMenu.razor.css b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/NavMenu.razor.css new file mode 100644 index 000000000..604b7a1a1 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Shared/NavMenu.razor.css @@ -0,0 +1,68 @@ +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.oi { + width: 2rem; + font-size: 1.1rem; + vertical-align: text-top; + top: -2px; +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.25); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Usings.cs b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Usings.cs new file mode 100644 index 000000000..7cd5f91b2 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Usings.cs @@ -0,0 +1 @@ +global using AXOpen.Core; \ No newline at end of file diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor new file mode 100644 index 000000000..2af591e8a --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor @@ -0,0 +1,16 @@ +@using System.Net.Http +@using AXOpen.Core.Resources +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using pneumaticcomponents.blazor +@using pneumaticcomponents.blazor.Shared + +@using AXSharp.Presentation.Blazor.Controls.RenderableContent +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer PlcLocalizer diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/appsettings.Development.json b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/appsettings.Development.json new file mode 100644 index 000000000..770d3e931 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/appsettings.json b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/appsettings.json new file mode 100644 index 000000000..10f68b8c8 --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/bootstrap/bootstrap.min.css b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/bootstrap/bootstrap.min.css new file mode 100644 index 000000000..02ae65b5f --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/bootstrap/bootstrap.min.css @@ -0,0 +1,7 @@ +@charset "UTF-8";/*! + * Bootstrap v5.1.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-rgb:33,37,41;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/bootstrap/bootstrap.min.css.map b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/bootstrap/bootstrap.min.css.map new file mode 100644 index 000000000..afcd9e33e --- /dev/null +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/wwwroot/css/bootstrap/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_root.scss","../../scss/_reboot.scss","dist/css/bootstrap.css","../../scss/vendor/_rfs.scss","../../scss/mixins/_border-radius.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/_tables.scss","../../scss/mixins/_table-variants.scss","../../scss/forms/_labels.scss","../../scss/forms/_form-text.scss","../../scss/forms/_form-control.scss","../../scss/mixins/_transition.scss","../../scss/mixins/_gradients.scss","../../scss/forms/_form-select.scss","../../scss/forms/_form-check.scss","../../scss/forms/_form-range.scss","../../scss/forms/_floating-labels.scss","../../scss/forms/_input-group.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_caret.scss","../../scss/_button-group.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_accordion.scss","../../scss/_breadcrumb.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_toasts.scss","../../scss/_modal.scss","../../scss/mixins/_backdrop.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/mixins/_clearfix.scss","../../scss/_spinners.scss","../../scss/_offcanvas.scss","../../scss/_placeholders.scss","../../scss/helpers/_colored-links.scss","../../scss/helpers/_ratio.scss","../../scss/helpers/_position.scss","../../scss/helpers/_stacks.scss","../../scss/helpers/_visually-hidden.scss","../../scss/mixins/_visually-hidden.scss","../../scss/helpers/_stretched-link.scss","../../scss/helpers/_text-truncation.scss","../../scss/mixins/_text-truncate.scss","../../scss/helpers/_vr.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$variable-prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$variable-prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$variable-prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$variable-prefix}white-rgb: #{to-rgb($white)};\n --#{$variable-prefix}black-rgb: #{to-rgb($black)};\n --#{$variable-prefix}body-rgb: #{to-rgb($body-color)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$variable-prefix}gradient: #{$gradient};\n\n // Root and body\n // stylelint-disable custom-property-empty-line-before\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$variable-prefix}root-font-size: #{$font-size-root};\n }\n --#{$variable-prefix}body-font-family: #{$font-family-base};\n --#{$variable-prefix}body-font-size: #{$font-size-base};\n --#{$variable-prefix}body-font-weight: #{$font-weight-base};\n --#{$variable-prefix}body-line-height: #{$line-height-base};\n --#{$variable-prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$variable-prefix}body-text-align: #{$body-text-align};\n }\n --#{$variable-prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n // stylelint-enable custom-property-empty-line-before\n}\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n font-size: var(--#{$variable-prefix}-root-font-size);\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$variable-prefix}body-font-family);\n @include font-size(var(--#{$variable-prefix}body-font-size));\n font-weight: var(--#{$variable-prefix}body-font-weight);\n line-height: var(--#{$variable-prefix}body-line-height);\n color: var(--#{$variable-prefix}body-color);\n text-align: var(--#{$variable-prefix}body-text-align);\n background-color: var(--#{$variable-prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n background-color: currentColor;\n border: 0;\n opacity: $hr-opacity;\n}\n\nhr:not([size]) {\n height: $hr-height; // 2\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-bs-original-title] { // 1\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n text-decoration-skip-ink: none; // 4\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n\n &:hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n direction: ltr #{\"/* rtl:ignore */\"};\n unicode-bidi: bidi-override;\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: $code-color;\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-` break; default: @@ -100,4 +100,8 @@ } } } + else + { + areAlarmsCollapsed = true; + }

diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs index 8c0b918df..14930c4cb 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs @@ -127,7 +127,7 @@ private eAlarmLevel AlarmLevel else if (seriousness <= eAxoMessageCategory.Error) return eAlarmLevel.ActiveErrors; } - else if (_messengers.Any(p => p.WaitingForAcknowledge.Cyclic)) + else if (_messengers.Any(p => p.WaitingForAcknowledge.LastValue)) { return eAlarmLevel.Unacknowledged; } From 1f56653528f334d4d34c697ce97881b9c1bbf3ef Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Tue, 22 Aug 2023 10:51:00 +0200 Subject: [PATCH 06/28] wip --- src/components.pneumatics/app/apax.yml | 76 +++++++++++++++---- .../ctrl/.vscode/settings.json | 3 + src/components.pneumatics/ctrl/apax.yml | 18 +++-- .../ctrl/test/CylinderTests.st | 2 +- 4 files changed, 77 insertions(+), 22 deletions(-) create mode 100644 src/components.pneumatics/ctrl/.vscode/settings.json diff --git a/src/components.pneumatics/app/apax.yml b/src/components.pneumatics/app/apax.yml index 82089534e..bdb12bd25 100644 --- a/src/components.pneumatics/app/apax.yml +++ b/src/components.pneumatics/app/apax.yml @@ -1,22 +1,70 @@ name: "pneumaticcomponents" -version: 0.0.0 +version: '0.1.4-alpha.79' type: app -targets: - - "1500" - - plcsim - - axunit-llvm -variables: - APAX_BUILD_ARGS: - - "--debug" # Generate debug information for target "1500" devDependencies: "@ax/sdk": 4.0.3 dependencies: - "@ix-ax/axopen_components_pneumatics" : 0.1.4-alpha.79 + "@ix-ax/axopen_components_pneumatics": 0.1.4-alpha.79 + "@ax/axunit": ^4.0.7 +variables: + APAX_BUILD_ARGS: + - "--debug" # Generate debug information for target "1500" scripts: + ixc: + - START=$(date +%s) + - dotnet tool restore + - dotnet ixc + - echo "Builded by ixc in :" $(expr $(date +%s) - $START) "s" download: - - apax install -L + - START=$(date +%s) + - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface + - echo "Downloaded in :" $(expr $(date +%s) - $START) "s" + check+download: | + if [ $AXTARGET ]; then + if [ $AXTARGETPLATFORMINPUT ]; then + if ping -n 1 $AXTARGET &> /dev/null; then + echo "Downloading from:" $AXTARGETPLATFORMINPUT "=>" $AXTARGET + apax download + else + echo "Target with IP address:" $AXTARGET "is not accessible. No download is going to be performed!!!" + fi + else + echo "Environment variable AXTARGETPLATFORMINPUT not defined!!!" + fi + else + echo "Environment variable AXTARGET not defined!!!" + fi + do-it-all: + - apax install - apax build - - dotnet ixc - - apax sld -i $AXTARGETPLATFORMINPUT -t $AXTARGET --accept-security-disclaimer --default-server-interface -r - - + - apax download + update-targets: | + if [ $AXBUILDTARGET_1 ]; then + yq -i "del(.targets)" apax.yml + yq -i ".targets[0] = strenv(AXBUILDTARGET_1)" apax.yml + if [ $AXBUILDTARGET_2 ]; then + yq -i ".targets[1] = strenv(AXBUILDTARGET_2)" apax.yml + fi + if [ $AXBUILDTARGET_3 ]; then + yq -i ".targets[2] = strenv(AXBUILDTARGET_3)" apax.yml + fi + fi + prebuild: + - apax update-targets + postbuild: + - apax ixc + watch: + - dotnet watch --project ..\\app_src\\AXOpen.Components.Cognex.Vision.Integrations.Blazor\\axopen_components_cognex_vision_integrations_blazor.csproj + rr: + - apax build + - apax download + - apax watch + fr: + - ..\\..\\integrations\\scripts\\StartPlcSimAdvCli.exe + - apax da + da: + - START=$(date +%s) + - apax do-it-all + - echo "Finished in :" $(expr $(date +%s) - $START) "s" +targets: + - plcsim diff --git a/src/components.pneumatics/ctrl/.vscode/settings.json b/src/components.pneumatics/ctrl/.vscode/settings.json new file mode 100644 index 000000000..54e5bb81a --- /dev/null +++ b/src/components.pneumatics/ctrl/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "axunit-vscode.runWithNewAxunitDependency": true +} \ No newline at end of file diff --git a/src/components.pneumatics/ctrl/apax.yml b/src/components.pneumatics/ctrl/apax.yml index 43340f43c..1ee638db4 100644 --- a/src/components.pneumatics/ctrl/apax.yml +++ b/src/components.pneumatics/ctrl/apax.yml @@ -3,16 +3,20 @@ version: '0.1.4-alpha.79' type: lib targets: - axunit-llvm + - llvm + - plcsim + - "1500" files: - src variables: APAX_BUILD_ARGS: - - "--debug" - AXUNIT_TARGET_IP : "192.168.0.4" - SIM_ENABLED : "true" + - "--debug" + AXUNIT_TARGET_IP: "172.20.30.110" + SIM_ENABLED: "true" devDependencies: - "@ax/sdk": ^4.0.3 -dependencies: + "@ax/sdk": ^4.0.3 + "@ax/axunitst": ^2.0.10 +dependencies: "@ix-ax/axopen.components.abstractions": '0.1.4-alpha.79' - "@ix-ax/axopen.core" : 0.1.4-alpha.79 - + "@ix-ax/axopen.core": 0.1.4-alpha.79 + diff --git a/src/components.pneumatics/ctrl/test/CylinderTests.st b/src/components.pneumatics/ctrl/test/CylinderTests.st index 144e1c026..ffea9ec74 100644 --- a/src/components.pneumatics/ctrl/test/CylinderTests.st +++ b/src/components.pneumatics/ctrl/test/CylinderTests.st @@ -83,7 +83,7 @@ NAMESPACE Cylinder.Tests context.Close(); AxUnit.Assert.Equal(FALSE, _moveWorkSignal); - AxUnit.Assert.Equal(TRUE, _moveHomeSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); END_METHOD END_CLASS END_NAMESPACE From c2fc81d03e25d4aec4b40aeb130b10f91e800cd4 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Wed, 23 Aug 2023 18:12:46 +0200 Subject: [PATCH 07/28] Pneumatic piston --- src/components.pneumatics/app/apax.yml | 3 +- .../PneumaticComponents.blazor/Program.cs | 3 + .../app/ix/PneumaticComponents.csproj | 6 +- .../app/src/Sandbox/SandboxContext.st | 20 + src/components.pneumatics/ctrl/apax.yml | 10 +- .../ctrl/src/AxoCylinder.st | 169 +++++- .../ctrl/test/CylinderTests.st | 510 ++++++++++++++++-- ...AXOpen.Components.Pneumatics.blazor.csproj | 4 +- .../ix_ax_axopen_components_pneumatics.csproj | 4 +- .../AxoComponent/AxoComponentView.razor | 4 +- .../AxoComponent/AxoComponentView.razor.cs | 8 +- src/integrations/ctrl/apax.yml | 2 - src/templates.simple/ctrl/apax.yml | 2 - 13 files changed, 654 insertions(+), 91 deletions(-) diff --git a/src/components.pneumatics/app/apax.yml b/src/components.pneumatics/app/apax.yml index bdb12bd25..49d09bfa6 100644 --- a/src/components.pneumatics/app/apax.yml +++ b/src/components.pneumatics/app/apax.yml @@ -5,7 +5,6 @@ devDependencies: "@ax/sdk": 4.0.3 dependencies: "@ix-ax/axopen_components_pneumatics": 0.1.4-alpha.79 - "@ax/axunit": ^4.0.7 variables: APAX_BUILD_ARGS: - "--debug" # Generate debug information for target "1500" @@ -58,7 +57,7 @@ scripts: rr: - apax build - apax download - - apax watch + # - apax watch fr: - ..\\..\\integrations\\scripts\\StartPlcSimAdvCli.exe - apax da diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Program.cs b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Program.cs index 1e9135c11..b6edb9e72 100644 --- a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Program.cs +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/Program.cs @@ -42,6 +42,9 @@ .WriteTo.Console().MinimumLevel.Verbose() .CreateLogger())); + +//Entry.Plc.sandbox.Logger.StartDequeuing(AxoApplication.Current.Logger, 250); + var app = builder.Build(); // Configure the HTTP request pipeline. diff --git a/src/components.pneumatics/app/ix/PneumaticComponents.csproj b/src/components.pneumatics/app/ix/PneumaticComponents.csproj index ca2dabafa..310dd7039 100644 --- a/src/components.pneumatics/app/ix/PneumaticComponents.csproj +++ b/src/components.pneumatics/app/ix/PneumaticComponents.csproj @@ -7,9 +7,9 @@ - - - + + + diff --git a/src/components.pneumatics/app/src/Sandbox/SandboxContext.st b/src/components.pneumatics/app/src/Sandbox/SandboxContext.st index 7c6b9e519..ebe5d48b7 100644 --- a/src/components.pneumatics/app/src/Sandbox/SandboxContext.st +++ b/src/components.pneumatics/app/src/Sandbox/SandboxContext.st @@ -1,6 +1,20 @@ CLASS SandboContext EXTENDS AXOpen.Core.AxoContext VAR PUBLIC + // Logger : AXOpen.Logging.AxoLogger; _manualControl : BOOL; + {#ix-attr:[Container(Layout.UniformGrid)]} + {#ix-set:AttributeName = "<#Suspend move to work#>"} + _suspendMoveToWork : BOOL; + {#ix-set:AttributeName = "<#Suspend move to home#>"} + _suspendMoveToHome : BOOL; + + {#ix-attr:[Container(Layout.UniformGrid)]} + {#ix-set:AttributeName = "<#Abort move to work#>"} + _abortMoveToWork : BOOL; + {#ix-set:AttributeName = "<#Abort move to home#>"} + _abortMoveToHome : BOOL; + {#ix-attr:[Container(Layout.Stack)]} + {#ix-set:AttributeName = "<#Test cylinder#>"} _testCyclinder : AXOpen.Components.Pneumatics.AxoCylinder; END_VAR @@ -12,6 +26,12 @@ CLASS SandboContext EXTENDS AXOpen.Core.AxoContext END_VAR METHOD PROTECTED OVERRIDE Main + // THIS.InjectLogger(Logger); + // Logger.SetMinimumLevel(AXOpen.Logging.eLogLevel#Verbose); + _testCyclinder.SuspendMoveToWorkWhile(_suspendMoveToWork); + _testCyclinder.SuspendMoveToHomeWhile(_suspendMoveToHome); + _testCyclinder.AbortMoveToWorkWhen(_abortMoveToWork); + _testCyclinder.AbortMoveToHomeWhen(_abortMoveToHome); _testCyclinder.Run(THIS, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); IF(_manualControl) THEN _testCyclinder.ActivateManualControl(); diff --git a/src/components.pneumatics/ctrl/apax.yml b/src/components.pneumatics/ctrl/apax.yml index 1ee638db4..c84ce3761 100644 --- a/src/components.pneumatics/ctrl/apax.yml +++ b/src/components.pneumatics/ctrl/apax.yml @@ -3,9 +3,6 @@ version: '0.1.4-alpha.79' type: lib targets: - axunit-llvm - - llvm - - plcsim - - "1500" files: - src variables: @@ -15,8 +12,11 @@ variables: SIM_ENABLED: "true" devDependencies: "@ax/sdk": ^4.0.3 - "@ax/axunitst": ^2.0.10 dependencies: "@ix-ax/axopen.components.abstractions": '0.1.4-alpha.79' "@ix-ax/axopen.core": 0.1.4-alpha.79 - +scripts: + download: + - START=$(date +%s) + - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface + - echo "Downloaded in :" $(expr $(date +%s) - $START) "s" \ No newline at end of file diff --git a/src/components.pneumatics/ctrl/src/AxoCylinder.st b/src/components.pneumatics/ctrl/src/AxoCylinder.st index a748ce1b1..dd2384f54 100644 --- a/src/components.pneumatics/ctrl/src/AxoCylinder.st +++ b/src/components.pneumatics/ctrl/src/AxoCylinder.st @@ -8,12 +8,15 @@ NAMESPACE AXOpen.Components.Pneumatics VAR PUBLIC {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentHeader()]} - MoveToWork : AxoTask; + {#ix-set:AttributeName = "<#Move to work#>"} + _MoveToWorkTask : AxoTask; {#ix-attr:[ComponentHeader()]} - MoveToHome : AxoTask; + {#ix-set:AttributeName = "<#Move to home#>"} + _MoveToHomeTask : AxoTask; {#ix-attr:[ComponentDetails("Tasks")]} - Stop : AxoTask; + {#ix-set:AttributeName = "<#Stop#>"} + _StopTask : AxoTask; {#ix-attr:[Container(Layout.Stack)]} {#ix-attr:[ComponentDetails("Signals")]} @@ -41,12 +44,29 @@ NAMESPACE AXOpen.Components.Pneumatics {#ix-set:MessageText = "<#Movement to home position did not succeed.#>"} {#ix-set:Help = "<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>"} _MoveToHomeNotReached : AXOpen.Messaging.Static.AxoMessenger; + + {#ix-set:MessageText = "<#Movement to work position is temporarily suspended.#>"} + {#ix-set:Help = "<#Check the blocking condition.#>"} + _MoveToWorkSuspended : AXOpen.Messaging.Static.AxoMessenger; + + {#ix-set:MessageText = "<#Movement to home position is temporarily suspended.#>"} + {#ix-set:Help = "<#Check the blocking condition.#>"} + _MoveToHomeSuspended : AXOpen.Messaging.Static.AxoMessenger; + + {#ix-set:MessageText = "<#Movement to work position is aborted.#>"} + {#ix-set:Help = "<#Check the blocking condition.#>"} + _MoveToWorkAborted : AXOpen.Messaging.Static.AxoMessenger; + + {#ix-set:MessageText = "<#Movement to home position is aborted.#>"} + {#ix-set:Help = "<#Check the blocking condition.#>"} + _MoveToHomeAborted : AXOpen.Messaging.Static.AxoMessenger; END_VAR - - /// - /// Runs tasks and logic of this component. - /// >[!IMPORTANT] This method or one of its overloads must be called cyclically. - /// + + VAR PRIVATE + _MoveToWorkIsSuspended : BOOL; + _MoveToHomeIsSuspended : BOOL; + END_VAR + METHOD PUBLIC Run VAR_INPUT parent : IAxoObject; @@ -78,42 +98,52 @@ NAMESPACE AXOpen.Components.Pneumatics END_VAR THIS.Initialize(context); - MoveToWork.Initialize(THIS); - MoveToHome.Initialize(THIS); - THIS.Open(); + _MoveToWorkTask.Initialize(THIS); + _MoveToHomeTask.Initialize(THIS); + _StopTask.Initialize(THIS); - - Stop.Initialize(THIS); + THIS.Open(); _MoveToWorkNotReached.Serve(THIS); _MoveToHomeNotReached.Serve(THIS); + _MoveToWorkSuspended.Serve(THIS); + _MoveToHomeSuspended.Serve(THIS); + _MoveToWorkAborted.Serve(THIS); + _MoveToHomeAborted.Serve(THIS); - IF(Stop.Execute()) THEN + IF(_StopTask.Execute()) THEN moveHomeSignal := FALSE; moveWorkSignal := FALSE; - MoveToHome.Restore(); - MoveToWork.Restore(); - Stop.DoneWhen(TRUE); - Stop.Restore(); + _MoveToHomeTask.Restore(); + _MoveToWorkTask.Restore(); + _StopTask.DoneWhen(TRUE); END_IF; - IF(MoveToWork.Execute()) THEN + IF(_MoveToWorkTask.Execute()) THEN moveHomeSignal := FALSE; moveWorkSignal := TRUE; - MoveToWork.DoneWhen(workSensor); - MoveToHome.Restore(); + _MoveToWorkTask.DoneWhen(workSensor); + _MoveToHomeTask.Restore(); - _MoveToWorkNotReached.ActivateOnCondition(MoveToWork.Duration >= T#10S, eAxoMessageCategory#Error); + _MoveToWorkNotReached.ActivateOnCondition(_MoveToWorkTask.Duration >= T#10S, eAxoMessageCategory#Error); END_IF; - IF(MoveToHome.Execute()) THEN + IF(_MoveToHomeTask.Execute()) THEN moveHomeSignal := TRUE; moveWorkSignal := FALSE; - MoveToHome.DoneWhen(homeSensor); - MoveToWork.Restore(); - _MoveToHomeNotReached.ActivateOnCondition(MoveToHome.Duration >= T#10S, eAxoMessageCategory#Error); + _MoveToHomeTask.DoneWhen(homeSensor); + _MoveToWorkTask.Restore(); + _MoveToHomeNotReached.ActivateOnCondition(_MoveToHomeTask.Duration >= T#10S, eAxoMessageCategory#Error); END_IF; + IF _MoveToWorkIsSuspended THEN + moveWorkSignal := FALSE; + END_IF; + + IF _MoveToHomeIsSuspended THEN + moveHomeSignal := FALSE; + END_IF; + _HomeSensor := homeSensor; _WorkSensor := workSensor; @@ -131,9 +161,90 @@ NAMESPACE AXOpen.Components.Pneumatics /// Restores this component into intial state. /// METHOD PROTECTED OVERRIDE Restore : IAxoTask - MoveToWork.Restore(); - MoveToWork.Restore(); - Stop.Restore(); + _MoveToWorkTask.Restore(); + _MoveToHomeTask.Restore(); + _StopTask.Restore(); + END_METHOD + + /// + /// Invokes the movement to the work position and returns the task state. + /// + METHOD PUBLIC MoveToWork : IAxoTaskState + MoveToWork := _MoveToWorkTask.Invoke(); + END_METHOD + + /// + /// Invokes the movement to the home position and returns the task state. + /// + METHOD PUBLIC MoveToHome : IAxoTaskState + MoveToHome := _MoveToHomeTask.Invoke(); + END_METHOD + + /// + /// Stops any movement. + /// + METHOD PUBLIC Stop : IAxoTaskState + Stop := _StopTask.Invoke(); + END_METHOD + + /// + /// Suspends the movement to the work position while the condition is 'true'. Task remains still executing. + /// + METHOD PUBLIC SuspendMoveToWorkWhile + VAR_INPUT + Condition : BOOL; + END_VAR + + IF(Condition) THEN + _moveWorkSignal := FALSE; + _MoveToWorkSuspended.Activate(eAxoMessageCategory#Info); + END_IF; + _MoveToWorkIsSuspended := Condition; + END_METHOD + + /// + /// Suspends the movement to the home position while the condition is 'true'. Task remains still executing. + /// + METHOD PUBLIC SuspendMoveToHomeWhile + VAR_INPUT + Condition : BOOL; + END_VAR + + IF(Condition) THEN + _moveHomeSignal := FALSE; + _MoveToHomeSuspended.Activate(eAxoMessageCategory#Info); + END_IF; + _MoveToHomeIsSuspended := Condition; + END_METHOD + + /// + /// Aborts the movement to the work position when the condition is 'true' and restores the respective task. + /// + METHOD PUBLIC AbortMoveToWorkWhen + VAR_INPUT + Condition : BOOL; + END_VAR + + IF(Condition) THEN + _moveWorkSignal := FALSE; + _MoveToWorkAborted.Activate(eAxoMessageCategory#Info); + END_IF; + _MoveToWorkTask.IsDisabled := Condition; + END_METHOD + + /// + /// Aborts the movement to the home position when the condition is 'true' and restores the respective task. + /// + METHOD PUBLIC AbortMoveToHomeWhen + VAR_INPUT + Condition : BOOL; + END_VAR + + IF(Condition) THEN + _moveHomeSignal := FALSE; + _MoveToHomeAborted.Activate(eAxoMessageCategory#Info); + END_IF; + _MoveToHomeTask.IsDisabled := Condition; END_METHOD END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.pneumatics/ctrl/test/CylinderTests.st b/src/components.pneumatics/ctrl/test/CylinderTests.st index ffea9ec74..c99d5de81 100644 --- a/src/components.pneumatics/ctrl/test/CylinderTests.st +++ b/src/components.pneumatics/ctrl/test/CylinderTests.st @@ -5,11 +5,16 @@ USING AXOpen.Logging; NAMESPACE Cylinder.Tests CLASS TestContext IMPLEMENTS AXOpen.Core.IAxoContext - VAR + VAR PROTECTED _openCounter : ULINT; - _closeCounter : ULINT; - END_VAR - + _closeCounter : ULINT; + _identityCounter : ULINT; + END_VAR + VAR PRIVATE + NULL_RTC : _NULL_RTC; + + _rtc : IAxoRtc; + END_VAR METHOD PUBLIC Open : ULINT _openCounter := _openCounter + ULINT#1; END_METHOD @@ -18,43 +23,62 @@ NAMESPACE Cylinder.Tests _closeCounter := _closeCounter + ULINT#1; END_METHOD - METHOD PUBLIC CreateIdentity : ULINT - ; - END_METHOD - METHOD PUBLIC OpenCycleCount : ULINT OpenCycleCount := _openCounter; END_METHOD + + METHOD PUBLIC ClosedCycleCount : ULINT + ClosedCycleCount := _closeCounter; + END_METHOD - METHOD PUBLIC GetRtc : AXOpen.Rtc.IAxoRtc - ; + METHOD PUBLIC CreateIdentity : ULINT + _identityCounter := _identityCounter + ULINT#1; + CreateIdentity := _identityCounter; + END_METHOD + + METHOD PUBLIC GetRtc : IAxoRtc + IF(_rtc <> NULL) THEN + GetRtc := _rtc; + ELSE + GetRtc := NULL_RTC; + END_IF; END_METHOD METHOD PUBLIC InjectRtc VAR_INPUT Rtc : IAxoRtc; END_VAR - - ; - END_METHOD - - METHOD PUBLIC GetLogger : IAxoLogger - ; + _rtc := Rtc; END_METHOD + VAR PRIVATE + NULL_LOGGER : _NULL_LOGGER; + END_VAR + METHOD PUBLIC GetLogger : AXOpen.Logging.IAxoLogger GetLogger := NULL_LOGGER; END_METHOD + METHOD PUBLIC InjectLogger VAR_INPUT _logger : AXOpen.Logging.IAxoLogger; END_VAR ; END_METHOD + END_CLASS + CLASS AxoRtcMock IMPLEMENTS IAxoRtc + VAR PRIVATE + _NowUTC : LDATE_AND_TIME; + END_VAR - METHOD PUBLIC InjectLogger + METHOD INTERNAL SetNowUTC : LDATE_AND_TIME VAR_INPUT - _logger : IAxoLogger; - END_VAR - - ; + Set : LDATE_AND_TIME; + END_VAR; + _NowUTC := Set; END_METHOD + + METHOD PUBLIC NowUTC : LDATE_AND_TIME + NowUTC := _NowUTC; + END_METHOD END_CLASS + {TestFixture} CLASS CylinderTests VAR context : TestContext; cylinder : AxoCylinder; + _rtc : AxoRtcMock; _homeSensor : BOOL; _workSensor : BOOL; _moveHomeSignal : BOOL; @@ -62,28 +86,438 @@ NAMESPACE Cylinder.Tests _done : BOOL; END_VAR + METHOD PRIVATE Init + VAR_INPUT + dt : LDATE_AND_TIME := LDATE_AND_TIME#2012-01-12-15:58:12.123; + END_VAR + _rtc.SetNowUTC(dt); + context.InjectRtc(_rtc); + context.Open(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + END_METHOD + + METHOD AreEqual : BOOL + VAR_INPUT + expected: LDATE_AND_TIME; + actual: LDATE_AND_TIME; + END_VAR + AreEqual := expected = actual; + END_METHOD + {Test} - METHOD PUBLIC MoveHome - - context.Open(); - cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); - cylinder.MoveToHome.Invoke(); - context.Close(); + METHOD PUBLIC MoveHome + THIS.Init(); + + context.Open(); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); - context.Open(); - cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); - context.Close(); + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + END_METHOD + + {Test} + METHOD PUBLIC MoveWork + THIS.Init(); + + context.Open(); + cylinder.MoveToWork(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); - context.Open(); - cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); - context.Close(); + AxUnit.Assert.Equal(TRUE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); + END_METHOD - context.Open(); - cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); - context.Close(); + {Test} + METHOD PUBLIC MoveHomeStop + THIS.Init(); + + context.Open(); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); - AxUnit.Assert.Equal(FALSE, _moveWorkSignal); - AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + context.Open(); + cylinder._StopTask.Invoke(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); END_METHOD + + {Test} + METHOD PUBLIC MoveWorkStop + THIS.Init(); + + context.Open(); + cylinder.MoveToWork(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + context.Open(); + cylinder._StopTask.Invoke(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); + END_METHOD + + {Test} + METHOD PUBLIC MoveWorkSuspendBeforeRun + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2023-01-12-15:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.MoveToWork(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(TRUE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + + context.Open(); + cylinder.SuspendMoveToWorkWhile(TRUE); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveWorkSuspendAfterRun + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-15:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.MoveToWork(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(TRUE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + + context.Open(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + cylinder.SuspendMoveToWorkWhile(TRUE); + context.Close(); + + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveHomeSuspendBeforeRun + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-13:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(TRUE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + + context.Open(); + cylinder.SuspendMoveToHomeWhile(TRUE); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveHomeSuspendAfterRun + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-05:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(TRUE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + + context.Open(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + cylinder.SuspendMoveToHomeWhile(TRUE); + context.Close(); + + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveWorkWhileSuspended + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-05:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.SuspendMoveToWorkWhile(TRUE); + cylinder.MoveToWork(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveHomeWhileSuspended + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-05:41:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.SuspendMoveToHomeWhile(TRUE); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveWorkAbortBeforeRun + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2023-01-12-15:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.MoveToWork(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(TRUE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + + context.Open(); + cylinder.AbortMoveToWorkWhen(TRUE); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveWorkAbortAfterRun + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-15:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.MoveToWork(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(TRUE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + + context.Open(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + cylinder.AbortMoveToWorkWhen(TRUE); + context.Close(); + + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveHomeAbortBeforeRun + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-13:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(TRUE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + + context.Open(); + cylinder.AbortMoveToHomeWhen(TRUE); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveHomeAbortAfterRun + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-05:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(TRUE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + + context.Open(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + cylinder.AbortMoveToHomeWhen(TRUE); + context.Close(); + + AxUnit.Assert.Equal(FALSE, cylinder._MoveWorkSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveWorkWhileAborted + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-05:49:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.AbortMoveToWorkWhen(TRUE); + cylinder.MoveToWork(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + END_METHOD + + {Test} + METHOD PUBLIC MoveHomeWhileAborted + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-05:41:12.123; + END_VAR + + THIS.Init(dt); + + context.Open(); + cylinder.AbortMoveToHomeWhen(TRUE); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + END_METHOD END_CLASS + END_NAMESPACE diff --git a/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj b/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj index 3f0fbb9fe..ea448f361 100644 --- a/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj +++ b/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj @@ -46,8 +46,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj b/src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj index 600ce8546..6872db29c 100644 --- a/src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj +++ b/src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj @@ -40,8 +40,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor index a91088105..6ced834a4 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor @@ -17,7 +17,7 @@
- @switch (AlarmLevel) + @switch (AlarmLevel().Result) { case eAlarmLevel.NoAlarms: break; @@ -88,7 +88,7 @@
} - @if (AlarmLevel > eAlarmLevel.NoAlarms) + @if (AlarmLevel().Result > eAlarmLevel.NoAlarms) { @if (!areAlarmsCollapsed) { diff --git a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs index 8c0b918df..010eb29dd 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoComponent/AxoComponentView.razor.cs @@ -107,17 +107,17 @@ protected override void OnInitialized() private IEnumerable? Messengers => this.Component?.GetChildren().OfType(); - private eAlarmLevel AlarmLevel + private async Task AlarmLevel() { - get - { + //get + { var _messengers = Messengers?.ToList(); if (_messengers == null) { return eAlarmLevel.NoAlarms; } if (_messengers.Any(p => p.IsActive.Cyclic)) { - _messengers.First().GetConnector().ReadBatchAsync(_messengers.Select(p => p.Category)); + //_messengers.FirstOrDefault()?.GetConnector().ReadBatchAsync(_messengers.Select(p => p.Category)).Wait(); var seriousness = (eAxoMessageCategory)_messengers.Max(p => p.Category.LastValue); if(seriousness <= eAxoMessageCategory.Info) diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index fe2e05cf8..28a1edf14 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -66,5 +66,3 @@ scripts: - apax do-it-all targets: - plcsim - - axunit-llvm - - llvm diff --git a/src/templates.simple/ctrl/apax.yml b/src/templates.simple/ctrl/apax.yml index d8b6bdb39..6c8665c2f 100644 --- a/src/templates.simple/ctrl/apax.yml +++ b/src/templates.simple/ctrl/apax.yml @@ -69,5 +69,3 @@ scripts: - apax rr targets: - plcsim - - axunit-llvm - - llvm From a723092ea88dac57c74b91154cab134ae92bd270 Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Thu, 24 Aug 2023 06:38:45 +0200 Subject: [PATCH 08/28] add pneumatics to pipeline --- cake/BuildContext.cs | 1 + src/AXOpen-L1-tests.slnf | 2 + src/AXOpen-L2-tests.slnf | 2 + src/AXOpen-L3-tests.slnf | 2 + src/AXOpen-packable-only.slnf | 2 + src/AXOpen.sln | 53 ++++++++++++++----- .../Properties/launchSettings.json | 12 +++++ 7 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 src/tools/src/axo.snippetify/Properties/launchSettings.json diff --git a/cake/BuildContext.cs b/cake/BuildContext.cs index 27c14d841..8a501a075 100644 --- a/cake/BuildContext.cs +++ b/cake/BuildContext.cs @@ -147,6 +147,7 @@ public BuildContext(ICakeContext context, BuildParameters buildParameters) ("inspectors", "axopen.inspectors"), ("components.abstractions", "axopen.components.abstractions"), ("components.cognex.vision", "axopen.cognex.vision"), + ("components.pneumatics", "axopen_components_pneumatics") }; public IEnumerable<(string folder, string name, string targetIp, string targetPlatform)> Integrations { get; } = new[] diff --git a/src/AXOpen-L1-tests.slnf b/src/AXOpen-L1-tests.slnf index b6e328c4a..7fe2a2c71 100644 --- a/src/AXOpen-L1-tests.slnf +++ b/src/AXOpen-L1-tests.slnf @@ -4,6 +4,8 @@ "projects": [ "base\\tests\\AXOpen.Base.AbstractionsTests\\AXOpen.Base.AbstractionsTests.csproj", "base\\tests\\AXOpen.LoggingTests\\AXOpen.Logging.SerologTests.csproj", + "components.cognex.vision\\tests\\AXOpen.Cognex.Vision.Tests\\axopen_cognex_vision_tests.csproj", + "components.pneumatics\\tests\\AXOpen.Components.Pneumatics.Tests\\AXOpen.Components.Pneumatics_tests.csproj", "core\\tests\\AXOpen.Core.Tests\\axopen_core_tests.csproj", "data\\tests\\AXOpen.Data.Tests\\axopen_data_tests.csproj", "data\\tests\\AXOpen.Repository.Integration.Tests_L1\\axopen_repository_integration_tests_L1.csproj", diff --git a/src/AXOpen-L2-tests.slnf b/src/AXOpen-L2-tests.slnf index b6e328c4a..7fe2a2c71 100644 --- a/src/AXOpen-L2-tests.slnf +++ b/src/AXOpen-L2-tests.slnf @@ -4,6 +4,8 @@ "projects": [ "base\\tests\\AXOpen.Base.AbstractionsTests\\AXOpen.Base.AbstractionsTests.csproj", "base\\tests\\AXOpen.LoggingTests\\AXOpen.Logging.SerologTests.csproj", + "components.cognex.vision\\tests\\AXOpen.Cognex.Vision.Tests\\axopen_cognex_vision_tests.csproj", + "components.pneumatics\\tests\\AXOpen.Components.Pneumatics.Tests\\AXOpen.Components.Pneumatics_tests.csproj", "core\\tests\\AXOpen.Core.Tests\\axopen_core_tests.csproj", "data\\tests\\AXOpen.Data.Tests\\axopen_data_tests.csproj", "data\\tests\\AXOpen.Repository.Integration.Tests_L1\\axopen_repository_integration_tests_L1.csproj", diff --git a/src/AXOpen-L3-tests.slnf b/src/AXOpen-L3-tests.slnf index 983e4054d..19cd14ab2 100644 --- a/src/AXOpen-L3-tests.slnf +++ b/src/AXOpen-L3-tests.slnf @@ -6,6 +6,8 @@ "core\\src\\AXOpen.Core.Blazor\\axopen_core_blazor.csproj", "core\\src\\AXOpen.Core\\ix_ax_axopen_core.csproj", "core\\tests\\AXOpen.Core.Tests\\axopen_core_tests.csproj", + "components.cognex.vision\\tests\\AXOpen.Cognex.Vision.Tests\\axopen_cognex_vision_tests.csproj", + "components.pneumatics\\tests\\AXOpen.Components.Pneumatics.Tests\\AXOpen.Components.Pneumatics_tests.csproj", "data\\src\\AXOpen.Data.Blazor\\axopen_data_blazor.csproj", "data\\src\\AXOpen.Data\\ix_ax_axopen_data.csproj", "data\\src\\repositories\\InMemory\\AXOpen.Data.InMemory.csproj", diff --git a/src/AXOpen-packable-only.slnf b/src/AXOpen-packable-only.slnf index 467e0591a..baa82b486 100644 --- a/src/AXOpen-packable-only.slnf +++ b/src/AXOpen-packable-only.slnf @@ -7,6 +7,8 @@ "components.abstractions\\src\\AXOpen.Components.Abstractions\\ix_ax_axopen_components_abstractions.csproj", "components.cognex.vision\\src\\AXOpen.Cognex.Vision.Blazor\\axopen_cognex_vision_blazor.csproj", "components.cognex.vision\\src\\AXOpen.Cognex.Vision\\ix_ax_axopen_cognex_vision.csproj", + "components.pneumatics\\src\\AXOpen.Components.Pneumatics.blazor\\AXOpen.Components.Pneumatics.blazor.csproj", + "components.pneumatics\\src\\AXOpen.Components.Pneumatics\\ix_ax_axopen_components_pneumatics.csproj", "core\\src\\AXOpen.Core.Blazor\\axopen_core_blazor.csproj", "core\\src\\AXOpen.Core\\ix_ax_axopen_core.csproj", "data\\src\\AXOpen.Data.Blazor\\axopen_data_blazor.csproj", diff --git a/src/AXOpen.sln b/src/AXOpen.sln index 95b23af27..fcb87ac4c 100644 --- a/src/AXOpen.sln +++ b/src/AXOpen.sln @@ -177,6 +177,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{3CE75CCD EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnetlibs_tests", "template.axolibrary\tests\dotnetlibs.Tests\dotnetlibs_tests.csproj", "{ADAF1255-8D10-4C83-B6D2-73347D677D15}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.pneumatics", "components.pneumatics", "{1B390C59-FF6C-4721-8DBA-B8176DBA531B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{4ECC0318-29C7-4BBF-93AC-45A18934FD6C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_components_pneumatics", "components.pneumatics\src\AXOpen.Components.Pneumatics\ix_ax_axopen_components_pneumatics.csproj", "{D58C6C28-4F51-4363-8922-B5BE99861676}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Components.Pneumatics.blazor", "components.pneumatics\src\AXOpen.Components.Pneumatics.blazor\AXOpen.Components.Pneumatics.blazor.csproj", "{CCF4FC3E-CB4B-48C3-BB31-56ACA90AA72D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{3134A28E-12A5-4255-81F4-F84874CE9318}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Components.Pneumatics_tests", "components.pneumatics\tests\AXOpen.Components.Pneumatics.Tests\AXOpen.Components.Pneumatics_tests.csproj", "{0F38853D-6D5D-4156-9571-E5F3426782AF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -331,6 +343,14 @@ Global {B3B2A1D3-A1A5-443A-975F-C44F7C2648E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {B3B2A1D3-A1A5-443A-975F-C44F7C2648E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {B3B2A1D3-A1A5-443A-975F-C44F7C2648E6}.Release|Any CPU.Build.0 = Release|Any CPU + {6A796A98-F570-4F35-B46B-177B4C0178DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A796A98-F570-4F35-B46B-177B4C0178DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A796A98-F570-4F35-B46B-177B4C0178DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A796A98-F570-4F35-B46B-177B4C0178DC}.Release|Any CPU.Build.0 = Release|Any CPU + {358D781D-BE42-4298-A60F-BE0358B5B405}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {358D781D-BE42-4298-A60F-BE0358B5B405}.Debug|Any CPU.Build.0 = Debug|Any CPU + {358D781D-BE42-4298-A60F-BE0358B5B405}.Release|Any CPU.ActiveCfg = Release|Any CPU + {358D781D-BE42-4298-A60F-BE0358B5B405}.Release|Any CPU.Build.0 = Release|Any CPU {310B3968-727B-4A66-860C-42B3AA3E22E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {310B3968-727B-4A66-860C-42B3AA3E22E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {310B3968-727B-4A66-860C-42B3AA3E22E6}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -343,14 +363,18 @@ Global {ADAF1255-8D10-4C83-B6D2-73347D677D15}.Debug|Any CPU.Build.0 = Debug|Any CPU {ADAF1255-8D10-4C83-B6D2-73347D677D15}.Release|Any CPU.ActiveCfg = Release|Any CPU {ADAF1255-8D10-4C83-B6D2-73347D677D15}.Release|Any CPU.Build.0 = Release|Any CPU - {6A796A98-F570-4F35-B46B-177B4C0178DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6A796A98-F570-4F35-B46B-177B4C0178DC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6A796A98-F570-4F35-B46B-177B4C0178DC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6A796A98-F570-4F35-B46B-177B4C0178DC}.Release|Any CPU.Build.0 = Release|Any CPU - {358D781D-BE42-4298-A60F-BE0358B5B405}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {358D781D-BE42-4298-A60F-BE0358B5B405}.Debug|Any CPU.Build.0 = Debug|Any CPU - {358D781D-BE42-4298-A60F-BE0358B5B405}.Release|Any CPU.ActiveCfg = Release|Any CPU - {358D781D-BE42-4298-A60F-BE0358B5B405}.Release|Any CPU.Build.0 = Release|Any CPU + {D58C6C28-4F51-4363-8922-B5BE99861676}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D58C6C28-4F51-4363-8922-B5BE99861676}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D58C6C28-4F51-4363-8922-B5BE99861676}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D58C6C28-4F51-4363-8922-B5BE99861676}.Release|Any CPU.Build.0 = Release|Any CPU + {CCF4FC3E-CB4B-48C3-BB31-56ACA90AA72D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCF4FC3E-CB4B-48C3-BB31-56ACA90AA72D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCF4FC3E-CB4B-48C3-BB31-56ACA90AA72D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCF4FC3E-CB4B-48C3-BB31-56ACA90AA72D}.Release|Any CPU.Build.0 = Release|Any CPU + {0F38853D-6D5D-4156-9571-E5F3426782AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F38853D-6D5D-4156-9571-E5F3426782AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F38853D-6D5D-4156-9571-E5F3426782AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F38853D-6D5D-4156-9571-E5F3426782AF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -415,15 +439,20 @@ Global {4D4B57A7-55C4-4AE2-8991-250937389412} = {7A82F34B-A479-47D4-8FB6-F9A66FE6591A} {D3094A68-880C-4637-8F90-6034951E141B} = {E2BFDC17-38C1-43AD-9CB5-4FA440D2DEEA} {B3B2A1D3-A1A5-443A-975F-C44F7C2648E6} = {FEF28A3F-E141-4492-8055-3B21A1BDDAAB} + {6B847420-D488-4E16-B599-14F7558EBD66} = {E644E81B-36C4-44B3-837F-AC1DDDB609C5} + {ACDBA197-69BA-49E9-9624-DC7B912E4C3D} = {E644E81B-36C4-44B3-837F-AC1DDDB609C5} + {6A796A98-F570-4F35-B46B-177B4C0178DC} = {6B847420-D488-4E16-B599-14F7558EBD66} + {358D781D-BE42-4298-A60F-BE0358B5B405} = {6B847420-D488-4E16-B599-14F7558EBD66} {310B3968-727B-4A66-860C-42B3AA3E22E6} = {F8D7E66F-3F2B-40EC-8CBB-C42B30D3AC9C} {D58C5E03-2FFC-4C03-964B-7836A0F31538} = {F8D7E66F-3F2B-40EC-8CBB-C42B30D3AC9C} {F8D7E66F-3F2B-40EC-8CBB-C42B30D3AC9C} = {6CE1BA0C-BB5F-4105-A792-7CE352471827} {3CE75CCD-E907-49F7-8871-D9AE0E47EB8F} = {6CE1BA0C-BB5F-4105-A792-7CE352471827} {ADAF1255-8D10-4C83-B6D2-73347D677D15} = {3CE75CCD-E907-49F7-8871-D9AE0E47EB8F} - {6B847420-D488-4E16-B599-14F7558EBD66} = {E644E81B-36C4-44B3-837F-AC1DDDB609C5} - {ACDBA197-69BA-49E9-9624-DC7B912E4C3D} = {E644E81B-36C4-44B3-837F-AC1DDDB609C5} - {6A796A98-F570-4F35-B46B-177B4C0178DC} = {6B847420-D488-4E16-B599-14F7558EBD66} - {358D781D-BE42-4298-A60F-BE0358B5B405} = {6B847420-D488-4E16-B599-14F7558EBD66} + {4ECC0318-29C7-4BBF-93AC-45A18934FD6C} = {1B390C59-FF6C-4721-8DBA-B8176DBA531B} + {D58C6C28-4F51-4363-8922-B5BE99861676} = {4ECC0318-29C7-4BBF-93AC-45A18934FD6C} + {CCF4FC3E-CB4B-48C3-BB31-56ACA90AA72D} = {4ECC0318-29C7-4BBF-93AC-45A18934FD6C} + {3134A28E-12A5-4255-81F4-F84874CE9318} = {1B390C59-FF6C-4721-8DBA-B8176DBA531B} + {0F38853D-6D5D-4156-9571-E5F3426782AF} = {3134A28E-12A5-4255-81F4-F84874CE9318} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {292B45BE-E9CB-443B-979D-C0AFCD8D5675} diff --git a/src/tools/src/axo.snippetify/Properties/launchSettings.json b/src/tools/src/axo.snippetify/Properties/launchSettings.json new file mode 100644 index 000000000..fa24530ef --- /dev/null +++ b/src/tools/src/axo.snippetify/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "axo.snippetify": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:65065;http://localhost:65066" + } + } +} \ No newline at end of file From 4eb0eab86fb0f8c970d2b6eda8eb510c5233daec Mon Sep 17 00:00:00 2001 From: Peter <61538034+PTKu@users.noreply.github.com> Date: Thu, 24 Aug 2023 07:08:51 +0200 Subject: [PATCH 09/28] mend --- src/components.pneumatics/app/apax.yml | 1 + .../AXOpen.Components.Pneumatics.blazor.csproj | 4 ++-- .../ix_ax_axopen_components_pneumatics.csproj | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components.pneumatics/app/apax.yml b/src/components.pneumatics/app/apax.yml index 49d09bfa6..84d3d90ad 100644 --- a/src/components.pneumatics/app/apax.yml +++ b/src/components.pneumatics/app/apax.yml @@ -67,3 +67,4 @@ scripts: - echo "Finished in :" $(expr $(date +%s) - $START) "s" targets: - plcsim + - axunit-llvm diff --git a/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj b/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj index ea448f361..7474ca267 100644 --- a/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj +++ b/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj @@ -46,8 +46,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj b/src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj index 6872db29c..778ecc830 100644 --- a/src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj +++ b/src/components.pneumatics/src/AXOpen.Components.Pneumatics/ix_ax_axopen_components_pneumatics.csproj @@ -40,8 +40,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive From 01ab7411c2dbb0fbd80c979169b8ca8ff482f5df Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 24 Aug 2023 22:00:04 +0200 Subject: [PATCH 10/28] Static messenger-concorent access solved --- .../components/AXOPENPNEUMATICS/README.md | 29 +++ docfx/articles/components/README.md | 1 + src/components.pneumatics/app/apax.yml | 1 - .../app/ix/PneumaticComponents.csproj | 6 +- src/components.pneumatics/app/mon.mon | 2 + .../app/src/Sandbox/SandboxContext.st | 8 +- .../ctrl/src/AxoCylinder.st | 86 ++++--- .../ctrl/test/CylinderTests.st | 78 ++++-- .../src/AxoMessaging/Static/AxoMessenger.st | 224 +++++++++++++----- .../Static/AxoMessengerView.razor.cs | 68 +++++- .../AxoCoordination/AxoSequencerContainer.cs | 3 +- .../AxoMessenger/Static/AxoMessenger.cs | 97 ++++++++ .../Static/AxoMessengerTextItem.cs | 20 ++ src/integrations/ctrl/apax.yml | 2 +- .../AxoStaticMessengerExample.st | 15 +- 15 files changed, 510 insertions(+), 130 deletions(-) create mode 100644 docfx/articles/components/AXOPENPNEUMATICS/README.md create mode 100644 src/components.pneumatics/app/mon.mon create mode 100644 src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessenger.cs create mode 100644 src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessengerTextItem.cs diff --git a/docfx/articles/components/AXOPENPNEUMATICS/README.md b/docfx/articles/components/AXOPENPNEUMATICS/README.md new file mode 100644 index 000000000..4d724f734 --- /dev/null +++ b/docfx/articles/components/AXOPENPNEUMATICS/README.md @@ -0,0 +1,29 @@ +# AXOpenComponentsPneumatics + +The `AXOpenComponentsPneumatics` library controls and operates the basic pneumatic actuators. + +## AxoCylinder + +`AxoCylinder` provides the essential control and operation of basic pneumatic cylinder including two controlling output signals for both directions and two . + +### Implementation +The `AxoDataman` is designed to be used as a member of the `AxoContext` or `AxoObject`. +Therefore its instance must be initialized with the proper `AxoContext` or `AxoObject` before any use. +Also, the hardware signals must be assigned first before calling any method of this instance. +To accomplish this, call the `Run` method cyclically with the proper variables (i.e. inside the `Main` method of the relevant `AxoContext`) as in the example below: + +**Example of the initialization and hardware signal assignement** +[!code-smalltalk[](../../../../src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st?name=HWIO_Assignement)] + +There are three public methods to operate the `AxoDataman`: + +`Restore` - restores the state of the `AxoDataman` to the initial state and resets all the internal variables. + +`ClearResultData` - resets the data read and confirms the data received from the device. +**Example of using ClearResultData method** +[!code-smalltalk[](../../../../src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st?name=ClearResultData)] + +`Read` - triggers the reading sequence and waits for results. +**Example of using Read method** +[!code-smalltalk[](../../../../src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st?name=Read)] + diff --git a/docfx/articles/components/README.md b/docfx/articles/components/README.md index 10f398e3f..41eefde01 100644 --- a/docfx/articles/components/README.md +++ b/docfx/articles/components/README.md @@ -6,4 +6,5 @@ manufacturer and the function group. # General rules and conventions [!INCLUDE [Conventions](../guidelines/components.md)] [!INCLUDE [AXOPENCOGNEVISION](AXOPENCOGNEVISION/README.md)] +[!INCLUDE [AXOPENPNEUMATICS](AXOPENPNEUMATICS/README.md)] diff --git a/src/components.pneumatics/app/apax.yml b/src/components.pneumatics/app/apax.yml index 84d3d90ad..49d09bfa6 100644 --- a/src/components.pneumatics/app/apax.yml +++ b/src/components.pneumatics/app/apax.yml @@ -67,4 +67,3 @@ scripts: - echo "Finished in :" $(expr $(date +%s) - $START) "s" targets: - plcsim - - axunit-llvm diff --git a/src/components.pneumatics/app/ix/PneumaticComponents.csproj b/src/components.pneumatics/app/ix/PneumaticComponents.csproj index 310dd7039..ceaa81cad 100644 --- a/src/components.pneumatics/app/ix/PneumaticComponents.csproj +++ b/src/components.pneumatics/app/ix/PneumaticComponents.csproj @@ -7,9 +7,9 @@ - - - + + + diff --git a/src/components.pneumatics/app/mon.mon b/src/components.pneumatics/app/mon.mon new file mode 100644 index 000000000..da8109818 --- /dev/null +++ b/src/components.pneumatics/app/mon.mon @@ -0,0 +1,2 @@ +sandbox._testCyclinder._Messenger +sandbox._testCyclinder._Messenger \ No newline at end of file diff --git a/src/components.pneumatics/app/src/Sandbox/SandboxContext.st b/src/components.pneumatics/app/src/Sandbox/SandboxContext.st index ebe5d48b7..2e412edbd 100644 --- a/src/components.pneumatics/app/src/Sandbox/SandboxContext.st +++ b/src/components.pneumatics/app/src/Sandbox/SandboxContext.st @@ -13,14 +13,18 @@ CLASS SandboContext EXTENDS AXOpen.Core.AxoContext _abortMoveToWork : BOOL; {#ix-set:AttributeName = "<#Abort move to home#>"} _abortMoveToHome : BOOL; + + {#ix-attr:[Container(Layout.UniformGrid)]} + {#ix-set:AttributeName = "<#Work sensor simulation#>"} + _workSensor : BOOL; + {#ix-set:AttributeName = "<#Home sensor simulation#>"} + _homeSensor : BOOL; {#ix-attr:[Container(Layout.Stack)]} {#ix-set:AttributeName = "<#Test cylinder#>"} _testCyclinder : AXOpen.Components.Pneumatics.AxoCylinder; END_VAR VAR PRIVATE - _homeSensor : BOOL; - _workSensor : BOOL; _moveHomeSignal : BOOL; _moveWorkSignal : BOOL; END_VAR diff --git a/src/components.pneumatics/ctrl/src/AxoCylinder.st b/src/components.pneumatics/ctrl/src/AxoCylinder.st index dd2384f54..8b08abfd4 100644 --- a/src/components.pneumatics/ctrl/src/AxoCylinder.st +++ b/src/components.pneumatics/ctrl/src/AxoCylinder.st @@ -37,29 +37,32 @@ NAMESPACE AXOpen.Components.Pneumatics {#ix-set:AttributeName = "<#Move work signal#>"} _MoveWorkSignal : BOOL; - {#ix-set:MessageText = "<#Movement to work position did not succeed.#>"} - {#ix-set:Help = "<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>"} - _MoveToWorkNotReached : AXOpen.Messaging.Static.AxoMessenger; + // {#ix-set:MessageText = "<#Movement to work position did not succeed.#>"} + // {#ix-set:Help = "<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>"} + // _MoveToWorkNotReached : AXOpen.Messaging.Static.AxoMessenger; - {#ix-set:MessageText = "<#Movement to home position did not succeed.#>"} - {#ix-set:Help = "<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>"} - _MoveToHomeNotReached : AXOpen.Messaging.Static.AxoMessenger; + // {#ix-set:MessageText = "<#Movement to home position did not succeed.#>"} + // {#ix-set:Help = "<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>"} + // _MoveToHomeNotReached : AXOpen.Messaging.Static.AxoMessenger; - {#ix-set:MessageText = "<#Movement to work position is temporarily suspended.#>"} - {#ix-set:Help = "<#Check the blocking condition.#>"} - _MoveToWorkSuspended : AXOpen.Messaging.Static.AxoMessenger; + // {#ix-set:MessageText = "<#Movement to work position is temporarily suspended.#>"} + // {#ix-set:Help = "<#Check the blocking condition.#>"} + // _MoveToWorkSuspended : AXOpen.Messaging.Static.AxoMessenger; - {#ix-set:MessageText = "<#Movement to home position is temporarily suspended.#>"} - {#ix-set:Help = "<#Check the blocking condition.#>"} - _MoveToHomeSuspended : AXOpen.Messaging.Static.AxoMessenger; + // {#ix-set:MessageText = "<#Movement to home position is temporarily suspended.#>"} + // {#ix-set:Help = "<#Check the blocking condition.#>"} + // _MoveToHomeSuspended : AXOpen.Messaging.Static.AxoMessenger; - {#ix-set:MessageText = "<#Movement to work position is aborted.#>"} - {#ix-set:Help = "<#Check the blocking condition.#>"} - _MoveToWorkAborted : AXOpen.Messaging.Static.AxoMessenger; + // {#ix-set:MessageText = "<#Movement to work position is aborted.#>"} + // {#ix-set:Help = "<#Check the blocking condition.#>"} + // _MoveToWorkAborted : AXOpen.Messaging.Static.AxoMessenger; - {#ix-set:MessageText = "<#Movement to home position is aborted.#>"} - {#ix-set:Help = "<#Check the blocking condition.#>"} - _MoveToHomeAborted : AXOpen.Messaging.Static.AxoMessenger; + // {#ix-set:MessageText = "<#Movement to home position is aborted.#>"} + // {#ix-set:Help = "<#Check the blocking condition.#>"} + // _MoveToHomeAborted : AXOpen.Messaging.Static.AxoMessenger; + + {#ix-set:MessageTextList = "[1]:'<#Movement to work position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[2]:'<#Movement to home position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[3]:'<#Home and work position sensors are both active at the same time.#>':'<#Check the position of sensors.#>';[4]:'<#Movement to work position is temporarily suspended.#>':'<#Check the blocking condition.#>';[5]:'<#Movement to home position is temporarily suspended.#>':'<#Check the blocking condition.#>';[6]:'<#Movement to work position is aborted.#>':'<#Check the blocking condition.#>';[7]:'<#Movement to home position is aborted.#>':'<#Check the blocking condition.#>';"} + _Messenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR VAR PRIVATE @@ -104,12 +107,16 @@ NAMESPACE AXOpen.Components.Pneumatics THIS.Open(); - _MoveToWorkNotReached.Serve(THIS); - _MoveToHomeNotReached.Serve(THIS); - _MoveToWorkSuspended.Serve(THIS); - _MoveToHomeSuspended.Serve(THIS); - _MoveToWorkAborted.Serve(THIS); - _MoveToHomeAborted.Serve(THIS); + // _MoveToWorkNotReached.Serve(THIS); + // _MoveToHomeNotReached.Serve(THIS); + // _MoveToWorkSuspended.Serve(THIS); + // _MoveToHomeSuspended.Serve(THIS); + // _MoveToWorkAborted.Serve(THIS); + // _MoveToHomeAborted.Serve(THIS); + + _Messenger.Serve(THIS); + //IF(workSensor AND homeSensor) THEN _Messenger.Activate(3, eAxoMessageCategory#Error); END_IF; + _Messenger.ActivateOnCondition(3, workSensor AND homeSensor, eAxoMessageCategory#Error); IF(_StopTask.Execute()) THEN moveHomeSignal := FALSE; @@ -124,8 +131,9 @@ NAMESPACE AXOpen.Components.Pneumatics moveWorkSignal := TRUE; _MoveToWorkTask.DoneWhen(workSensor); _MoveToHomeTask.Restore(); - - _MoveToWorkNotReached.ActivateOnCondition(_MoveToWorkTask.Duration >= T#10S, eAxoMessageCategory#Error); + // _MoveToWorkNotReached.ActivateOnCondition(_MoveToWorkTask.Duration >= T#10S, eAxoMessageCategory#Error); + //IF(NOT _MoveToWorkIsSuspended AND _MoveToWorkTask.Duration >= T#10S) THEN _Messenger.Activate(1, eAxoMessageCategory#Error); END_IF; + _Messenger.ActivateOnCondition(1, NOT _MoveToWorkIsSuspended AND _MoveToWorkTask.Duration >= T#10S, eAxoMessageCategory#Info); END_IF; IF(_MoveToHomeTask.Execute()) THEN @@ -133,9 +141,11 @@ NAMESPACE AXOpen.Components.Pneumatics moveWorkSignal := FALSE; _MoveToHomeTask.DoneWhen(homeSensor); _MoveToWorkTask.Restore(); - _MoveToHomeNotReached.ActivateOnCondition(_MoveToHomeTask.Duration >= T#10S, eAxoMessageCategory#Error); + // _MoveToHomeNotReached.ActivateOnCondition(_MoveToHomeTask.Duration >= T#10S, eAxoMessageCategory#Error); + //IF(NOT _MoveToHomeIsSuspended AND _MoveToHomeTask.Duration >= T#10S) THEN _Messenger.Activate(2, eAxoMessageCategory#Error); END_IF; + _Messenger.ActivateOnCondition(2, NOT _MoveToHomeIsSuspended AND _MoveToHomeTask.Duration >= T#10S, eAxoMessageCategory#Info); END_IF; - + IF _MoveToWorkIsSuspended THEN moveWorkSignal := FALSE; END_IF; @@ -197,8 +207,10 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveWorkSignal := FALSE; - _MoveToWorkSuspended.Activate(eAxoMessageCategory#Info); - END_IF; + // _MoveToWorkSuspended.Activate(eAxoMessageCategory#Info); + END_IF; + //IF(Condition AND NOT _MoveToWorkTask.IsBusy()) THEN _Messenger.Activate(4, eAxoMessageCategory#Info); END_IF; + _Messenger.ActivateOnCondition(4, Condition AND NOT _MoveToWorkTask.IsBusy(), eAxoMessageCategory#Info); _MoveToWorkIsSuspended := Condition; END_METHOD @@ -212,8 +224,10 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveHomeSignal := FALSE; - _MoveToHomeSuspended.Activate(eAxoMessageCategory#Info); + // _MoveToHomeSuspended.Activate(eAxoMessageCategory#Info); END_IF; + //IF(Condition AND NOT _MoveToHomeTask.IsBusy()) THEN _Messenger.Activate(5, eAxoMessageCategory#Info); END_IF; + _Messenger.ActivateOnCondition(5, Condition AND NOT _MoveToHomeTask.IsBusy(), eAxoMessageCategory#Info); _MoveToHomeIsSuspended := Condition; END_METHOD @@ -227,9 +241,11 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveWorkSignal := FALSE; - _MoveToWorkAborted.Activate(eAxoMessageCategory#Info); + // _MoveToWorkAborted.Activate(eAxoMessageCategory#Info); END_IF; - _MoveToWorkTask.IsDisabled := Condition; + // IF(Condition) THEN _Messenger.Activate(6, eAxoMessageCategory#Info); END_IF; + _Messenger.ActivateOnCondition(6, Condition, eAxoMessageCategory#Info); + _MoveToWorkTask.IsDisabled := Condition; END_METHOD /// @@ -242,8 +258,10 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveHomeSignal := FALSE; - _MoveToHomeAborted.Activate(eAxoMessageCategory#Info); + // _MoveToHomeAborted.Activate(eAxoMessageCategory#Info); END_IF; + // IF(Condition) THEN _Messenger.Activate(7, eAxoMessageCategory#Info); END_IF; + _Messenger.ActivateOnCondition(7, Condition, eAxoMessageCategory#Info); _MoveToHomeTask.IsDisabled := Condition; END_METHOD END_CLASS diff --git a/src/components.pneumatics/ctrl/test/CylinderTests.st b/src/components.pneumatics/ctrl/test/CylinderTests.st index c99d5de81..38125ec26 100644 --- a/src/components.pneumatics/ctrl/test/CylinderTests.st +++ b/src/components.pneumatics/ctrl/test/CylinderTests.st @@ -210,8 +210,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); END_METHOD {Test} @@ -241,8 +241,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); END_METHOD {Test} @@ -272,8 +272,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); END_METHOD {Test} @@ -303,8 +303,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); END_METHOD {Test} @@ -325,8 +325,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); END_METHOD {Test} @@ -347,8 +347,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); END_METHOD {Test} @@ -378,8 +378,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); END_METHOD {Test} @@ -409,8 +409,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); END_METHOD {Test} @@ -440,8 +440,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); END_METHOD {Test} @@ -471,8 +471,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); END_METHOD {Test} @@ -493,8 +493,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); END_METHOD {Test} @@ -515,8 +515,38 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); - AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); - AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); + // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + END_METHOD + + + + {Test} + METHOD PUBLIC Messaging + VAR + dt : LDATE_AND_TIME := LDATE_AND_TIME#2021-01-11-05:41:12.123; + END_VAR + THIS.Init(dt); + context.Open(); + cylinder.SuspendMoveToHomeWhile(TRUE); + cylinder.MoveToHome(); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + context.Open(); + cylinder.SuspendMoveToHomeWhile(TRUE); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); + context.Close(); + + AxUnit.Assert.Equal(FALSE, _moveWorkSignal); + AxUnit.Assert.Equal(FALSE, _moveHomeSignal); + AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); + AxUnit.Assert.Equal(INT#5, cylinder._Messenger.MessageCode); + END_METHOD END_CLASS diff --git a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st index 3368f52cb..c5fee3958 100644 --- a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st +++ b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st @@ -3,6 +3,7 @@ USING AXOpen.Core; NAMESPACE AXOpen.Messaging.Static {#ix-prop: public string MessageText } + {#ix-prop: public string MessageTextList } {#ix-prop: public string Help } CLASS AxoMessenger EXTENDS AxoObject IMPLEMENTS AXOpen.Messaging.Static.IAxoMessageProperties VAR PUBLIC @@ -11,7 +12,7 @@ NAMESPACE AXOpen.Messaging.Static {#ix-attr:[ReadOnly()]} Category : eAxoMessageCategory; {#ix-attr:[ReadOnly()]} - MessageCode : ULINT; + MessageCode : INT; {#ix-attr:[ReadOnly()]} Risen : LDATE_AND_TIME; {#ix-attr:[ReadOnly()]} @@ -29,7 +30,7 @@ NAMESPACE AXOpen.Messaging.Static VAR PRIVATE ActiveContextCount : ULINT; - Context : IAxoContext; + Context : IAxoContext; END_VAR METHOD PUBLIC Serve @@ -42,13 +43,24 @@ NAMESPACE AXOpen.Messaging.Static END_IF; Context := _context; - - IF IsActive THEN - IF Context.OpenCycleCount() - ActiveContextCount > UINT#1 THEN - THIS.Deactivate(); + + IF MessageCode = INT#0 THEN + IF IsActive THEN + IF Context.OpenCycleCount() - ActiveContextCount > UINT#1 THEN + THIS.Deactivate(); + END_IF; + ELSIF AcknowledgedBeforeFallen THEN + AcknowledgedBeforeFallen := FALSE; END_IF; ELSE - AcknowledgedBeforeFallen := FALSE; + IF IsActive THEN + IF Context.OpenCycleCount() - ActiveContextCount > UINT#1 THEN + THIS.Deactivate(MessageCode); + END_IF; + ELSIF AcknowledgedBeforeFallen THEN + AcknowledgedBeforeFallen := FALSE; + MessageCode := INT#0; + END_IF; END_IF; IF AcknowledgeRequest THEN @@ -74,62 +86,81 @@ NAMESPACE AXOpen.Messaging.Static END_VAR Activate := THIS; + + IF AXOpen.Core.IsNullContext(Context) THEN + RETURN; + END_IF; + + IF MessageCode = INT#0 THEN + IF ActiveContextCount = ULINT#0 THEN + Risen := Context.GetRtc().NowUTC(); + Fallen := LDATE_AND_TIME#1970-01-01-00:00:00.000; + Acknowledged := LDATE_AND_TIME#1970-01-01-00:00:00.000; + WaitingForAcknowledge := FALSE; + Context.GetLogger().Log('Risen', THIS.ToLogLevel(_category), THIS); + END_IF; + + ActiveContextCount := Context.OpenCycleCount(); + + Category := _category; + + AcknowledgementRequired := Category >= eAxoMessageCategory#Error; + + IsActive := TRUE; + END_IF; + + Activate := THIS; + END_METHOD + + METHOD PUBLIC Activate : AXOpen.Messaging.Static.IAxoMessageProperties + VAR_INPUT + _messageCode : INT; + _category : eAxoMessageCategory; + END_VAR + Activate := THIS; IF AXOpen.Core.IsNullContext(Context) THEN RETURN; END_IF; - IF ActiveContextCount = ULINT#0 THEN + IF NOT IsActive AND NOT WaitingForAcknowledge AND MessageCode = INT#0 AND ActiveContextCount = ULINT#0 THEN Risen := Context.GetRtc().NowUTC(); Fallen := LDATE_AND_TIME#1970-01-01-00:00:00.000; Acknowledged := LDATE_AND_TIME#1970-01-01-00:00:00.000; WaitingForAcknowledge := FALSE; Context.GetLogger().Log('Risen', THIS.ToLogLevel(_category), THIS); + MessageCode := _messageCode; + END_IF; + IF MessageCode = _messageCode THEN + ActiveContextCount := Context.OpenCycleCount(); + Category := _category; + AcknowledgementRequired := Category >= eAxoMessageCategory#Error; + IsActive := TRUE; END_IF; - - ActiveContextCount := Context.OpenCycleCount(); - - Category := _category; - - AcknowledgementRequired := Category >= eAxoMessageCategory#Error; - - IsActive := TRUE; Activate := THIS; END_METHOD - METHOD PRIVATE ToLogLevel : eLogLevel - VAR_INPUT - _messageCategory : eAxoMessageCategory; - END_VAR - - CASE _messageCategory OF - eAxoMessageCategory#Trace : - ToLogLevel := eLogLevel#Verbose; - eAxoMessageCategory#Debug : - ToLogLevel := eLogLevel#Debug; - eAxoMessageCategory#Info : - ToLogLevel := eLogLevel#Information; - eAxoMessageCategory#TimedOut : - ToLogLevel := eLogLevel#Information; - eAxoMessageCategory#Notification : - ToLogLevel := eLogLevel#Information; - eAxoMessageCategory#Warning : - ToLogLevel := eLogLevel#Warning; - eAxoMessageCategory#Error : - ToLogLevel := eLogLevel#Error; - eAxoMessageCategory#ProgrammingError : - ToLogLevel := eLogLevel#Error; - eAxoMessageCategory#Critical : - ToLogLevel := eLogLevel#Fatal; - eAxoMessageCategory#Fatal : - ToLogLevel := eLogLevel#Fatal; - eAxoMessageCategory#Catastrophic : - ToLogLevel := eLogLevel#Fatal; - END_CASE; + + // METHOD PUBLIC Activate : AXOpen.Messaging.Static.IAxoMessageProperties + // VAR_INPUT + // _messageCode : INT; + // _category : eAxoMessageCategory; + // END_VAR - END_METHOD + // Activate := THIS; + + // IF NOT IsActive AND NOT WaitingForAcknowledge THEN + // MessageCode := _messageCode; + // END_IF; + // Activate := THIS.Activate(_category); + // END_METHOD + + // METHOD PUBLIC Activate : AXOpen.Messaging.Static.IAxoMessageProperties + // Activate := THIS; + // Activate := THIS.Activate(eAxoMessageCategory#All); + // END_METHOD METHOD PUBLIC ActivateOnCondition : AXOpen.Messaging.Static.IAxoMessageProperties VAR_INPUT @@ -144,34 +175,55 @@ NAMESPACE AXOpen.Messaging.Static ELSE THIS.Deactivate(); END_IF; - END_METHOD - METHOD PUBLIC Acknowledge - IF AXOpen.Core.IsNullContext(Context) THEN - RETURN; + METHOD PUBLIC ActivateOnCondition : AXOpen.Messaging.Static.IAxoMessageProperties + VAR_INPUT + _messageCode : INT; + _condition : BOOL; + _category : eAxoMessageCategory; + END_VAR + + ActivateOnCondition := THIS; + + IF NOT IsActive AND NOT WaitingForAcknowledge AND _condition THEN + MessageCode := _messageCode; + END_IF; + IF _condition THEN + ActivateOnCondition := THIS.Activate(_messageCode,_category); + ELSE + THIS.Deactivate(_messageCode); END_IF; + END_METHOD - IF NOT AcknowledgementRequired THEN + METHOD PRIVATE Deactivate + VAR_INPUT + _messageCode : INT; + END_VAR + + IF AXOpen.Core.IsNullContext(Context) THEN RETURN; END_IF; - IF NOT WaitingForAcknowledge THEN - AcknowledgedBeforeFallen := TRUE; - ELSE - WaitingForAcknowledge := FALSE; + IF IsActive AND MessageCode = _messageCode THEN + IsActive := FALSE; + ActiveContextCount := ULINT#0; + Fallen := Context.GetRtc().NowUTC(); + Context.GetLogger().Log('Fallen', eLogLevel#Information, THIS); + IF AcknowledgementRequired AND NOT AcknowledgedBeforeFallen THEN + WaitingForAcknowledge := TRUE; + ELSE + MessageCode := INT#0; + END_IF; END_IF; - AcknowledgeRequest := FALSE; - - Acknowledged := Context.GetRtc().NowUTC(); - END_METHOD + END_METHOD METHOD PRIVATE Deactivate IF AXOpen.Core.IsNullContext(Context) THEN RETURN; END_IF; - IF IsActive THEN + IF IsActive AND MessageCode = INT#0 THEN IsActive := FALSE; ActiveContextCount := ULINT#0; Fallen := Context.GetRtc().NowUTC(); @@ -182,6 +234,58 @@ NAMESPACE AXOpen.Messaging.Static END_IF; END_METHOD + METHOD PUBLIC Acknowledge + IF AXOpen.Core.IsNullContext(Context) THEN + RETURN; + END_IF; + + IF NOT AcknowledgementRequired THEN + RETURN; + END_IF; + + IF NOT WaitingForAcknowledge THEN + AcknowledgedBeforeFallen := TRUE; + ELSE + WaitingForAcknowledge := FALSE; + MessageCode := INT#0; + END_IF; + AcknowledgeRequest := FALSE; + + Acknowledged := Context.GetRtc().NowUTC(); + END_METHOD + + METHOD PRIVATE ToLogLevel : eLogLevel + VAR_INPUT + _messageCategory : eAxoMessageCategory; + END_VAR + + CASE _messageCategory OF + eAxoMessageCategory#Trace : + ToLogLevel := eLogLevel#Verbose; + eAxoMessageCategory#Debug : + ToLogLevel := eLogLevel#Debug; + eAxoMessageCategory#Info : + ToLogLevel := eLogLevel#Information; + eAxoMessageCategory#TimedOut : + ToLogLevel := eLogLevel#Information; + eAxoMessageCategory#Notification : + ToLogLevel := eLogLevel#Information; + eAxoMessageCategory#Warning : + ToLogLevel := eLogLevel#Warning; + eAxoMessageCategory#Error : + ToLogLevel := eLogLevel#Error; + eAxoMessageCategory#ProgrammingError : + ToLogLevel := eLogLevel#Error; + eAxoMessageCategory#Critical : + ToLogLevel := eLogLevel#Fatal; + eAxoMessageCategory#Fatal : + ToLogLevel := eLogLevel#Fatal; + eAxoMessageCategory#Catastrophic : + ToLogLevel := eLogLevel#Fatal; + END_CASE; + + END_METHOD + METHOD PUBLIC RequireAcknowledgement : AXOpen.Messaging.Static.IAxoMessageProperties AcknowledgementRequired := TRUE; RequireAcknowledgement := THIS; diff --git a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs index 78a1cde90..102d90351 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs @@ -133,8 +133,10 @@ private string Category } private string Description => string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; private string Symbol => !(string.IsNullOrEmpty(Component.Symbol)) ? Component.Symbol : "Unable to retrieve symbol!"; - private string MessageText => !(string.IsNullOrEmpty(Component.MessageText)) ? Component.MessageText : "Message text not defined!"; - private string HelpText => !(string.IsNullOrEmpty(Component.Help)) ? Component.Help : "Help not defined!"; + //private string MessageText => !(string.IsNullOrEmpty(Component.MessageText)) ? Component.MessageText : "Message text not defined!"; + private string MessageText => GetMessageText(); + //private string HelpText => !(string.IsNullOrEmpty(Component.Help)) ? Component.Help : "Help not defined!"; + private string HelpText => GetHelpText(); private string Risen => !(string.IsNullOrEmpty(Component.Risen.Cyclic.ToString())) ? Component.Risen.Cyclic.ToString() : ""; private string Fallen => !(string.IsNullOrEmpty(Component.Fallen.Cyclic.ToString())) ? Component.Fallen.Cyclic.ToString() : ""; private string Acknowledged => !(string.IsNullOrEmpty(Component.Acknowledged.Cyclic.ToString())) ? Component.Acknowledged.Cyclic.ToString() : ""; @@ -144,6 +146,68 @@ private string Category private bool AcknowledgementDoesNotRequired => !AcknowledgementRequired; private bool WaitingForAcknowledge => Component.WaitingForAcknowledge.Cyclic; private bool HideAckowledgeButton => !AcknowledgementRequired || AcknowledgedBeforeFallen || (!IsActive && !WaitingForAcknowledge); + + private string GetMessageText() + { + int messageCode = Component.MessageCode.Cyclic; + string retVal = ""; + + if (Component.MessageCode.Cyclic == 0) + retVal = string.IsNullOrEmpty(Component.MessageText) ? "Message text not defined!" : Component.MessageText; + else + { + try + { + if(Component.AxoMessengerTextList != null && Component.AxoMessengerTextList.Count > 0) + { + string _messageText = (from item in Component.AxoMessengerTextList where item.Key == messageCode select item.Value.MessageText.ToString()).FirstOrDefault(); + retVal = string.IsNullOrEmpty(_messageText) ? "Message text not defined for the message code: " + messageCode.ToString() + " !" : _messageText; + } + else + { + retVal = "Message text not defined for the message code: " + messageCode.ToString() + " !"; + } + } + catch (Exception) + { + retVal = "Message text not defined for the message code: " + messageCode.ToString() + " !"; + return retVal; + throw; + } + } + return retVal; + } + + private string GetHelpText() + { + int messageCode = Component.MessageCode.Cyclic; + string retVal = ""; + + if (Component.MessageCode.Cyclic == 0) + retVal = string.IsNullOrEmpty(Component.Help) ? "Help text not defined!" : Component.Help; + else + { + try + { + if (Component.AxoMessengerTextList != null && Component.AxoMessengerTextList.Count > 0) + { + string _helpText = (from item in Component.AxoMessengerTextList where item.Key == messageCode select item.Value.HelpText.ToString()).FirstOrDefault(); + retVal = string.IsNullOrEmpty(_helpText) ? "Help text not defined for the message code: " + messageCode.ToString() + " !" : _helpText; + } + else + { + retVal = "Help text not defined for the message code: " + messageCode.ToString() + " !"; + } + } + catch (Exception) + { + retVal = "Help text not defined for the message code: " + messageCode.ToString() + " !"; + return retVal; + throw; + } + } + return retVal; + } } public class AxoMessengerCommandView : AxoMessengerView diff --git a/src/core/src/AXOpen.Core/AxoCoordination/AxoSequencerContainer.cs b/src/core/src/AXOpen.Core/AxoCoordination/AxoSequencerContainer.cs index 002055cb4..e7df4ce42 100644 --- a/src/core/src/AXOpen.Core/AxoCoordination/AxoSequencerContainer.cs +++ b/src/core/src/AXOpen.Core/AxoCoordination/AxoSequencerContainer.cs @@ -9,5 +9,6 @@ namespace AXOpen.Core; public partial class AxoSequencerContainer { - + public string TabName { get; } + } \ No newline at end of file diff --git a/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessenger.cs b/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessenger.cs new file mode 100644 index 000000000..bec66f21f --- /dev/null +++ b/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessenger.cs @@ -0,0 +1,97 @@ +// AXOpen.Core +// Copyright (c)2022 Peter Kurhajec and Contributors All Rights Reserved. +// Contributors: https://github.com/PTKu/ix/graphs/contributors +// See the LICENSE file in the repository root for more information. +// https://github.com/PTKu/ix/blob/master/LICENSE +// Third party licenses: https://github.com/PTKu/ix/blob/master/notices.md + +using System; +using System.Collections.Generic; +using static System.Net.Mime.MediaTypeNames; + +namespace AXOpen.Messaging.Static; + +public partial class AxoMessenger +{ + + private List> axoMessengerTextList; + public List> AxoMessengerTextList + { + get + { + try + { + if (axoMessengerTextList == null) + { + axoMessengerTextList = new List>(); + if(MessageTextList != null ) + { + string[] items = MessageTextList.Split('\n'); + if (items.Length == 1 ) + { + string[] delimiters = { "[", "]:'", "':'", "';", "'" }; + string[] itemSeparated = items[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries); + try + { + if(itemSeparated.Length >= 3 && itemSeparated.Length % 3 ==0 ) + { + int itemsCount = itemSeparated.Length / 3; + for ( int i = 0; i < itemsCount; i++) + { + int messageCode = 0; + if (Int32.TryParse(itemSeparated[3*i], out messageCode)) + { + string messageText = string.IsNullOrEmpty(itemSeparated[3 * i + 1]) ? "Message text not defined for the message code: " + messageCode.ToString() + "!" : itemSeparated[3 * i + 1]; + string helpText = string.IsNullOrEmpty(itemSeparated[3 * i + 2]) ? "Help text not defined for the message code: " + messageCode.ToString() + "!" : itemSeparated[3 * i + 2]; + KeyValuePair valuePair = new KeyValuePair(messageCode, new AxoMessengerTextItem(messageText, helpText)); + axoMessengerTextList.Add(valuePair); + } + } + } + } + catch (Exception) + { + throw; + } + } + else if(items.Length > 1) + { + foreach (string item in items) + { + string[] delimiters = { "[", "]:'", "':'", "'" }; + string[] itemSeparated = item.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); + try + { + int messageCode = 0; + if (Int32.TryParse(itemSeparated[0], out messageCode)) + { + string messageText = string.IsNullOrEmpty(itemSeparated[1]) ? "Message text not defined for the message code: " + messageCode.ToString() + "!" : itemSeparated[1]; + string helpText = string.IsNullOrEmpty(itemSeparated[2]) ? "Help text not defined for the message code: " + messageCode.ToString() + "!" : itemSeparated[2]; + KeyValuePair valuePair = new KeyValuePair(messageCode, new AxoMessengerTextItem(messageText, helpText)); + axoMessengerTextList.Add(valuePair); + } + } + catch (Exception) + { + throw; + } + } + } + + } + } + return axoMessengerTextList; + } + + catch (Exception) + { + + throw; + } + + } + } + +} + + diff --git a/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessengerTextItem.cs b/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessengerTextItem.cs new file mode 100644 index 000000000..76faa665c --- /dev/null +++ b/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessengerTextItem.cs @@ -0,0 +1,20 @@ +// AXOpen.Core +// Copyright (c)2022 Peter Kurhajec and Contributors All Rights Reserved. +// Contributors: https://github.com/PTKu/ix/graphs/contributors +// See the LICENSE file in the repository root for more information. +// https://github.com/PTKu/ix/blob/master/LICENSE +// Third party licenses: https://github.com/PTKu/ix/blob/master/notices.md + +namespace AXOpen.Messaging.Static; + +public class AxoMessengerTextItem +{ + public string MessageText { get; } + public string HelpText { get; } + + public AxoMessengerTextItem(string messageText,string helpText) + { + MessageText = messageText; + HelpText = helpText; + } +} \ No newline at end of file diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index b16d42ac6..c6111da96 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -71,4 +71,4 @@ scripts: - apax do-it-all - echo "Finished in :" $(expr $(date +%s) - $START) "s" targets: - - axunit-llvm + - plcsim diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st index 4e8702cc5..b250710b2 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st @@ -8,15 +8,25 @@ NAMESPACE AxoStaticMessengerExample {#ix-set:AttributeName = "<#Messenger 1#>"} {#ix-set:MessageText = "<#Message text for messenger 1#>"} {#ix-set:Help = "<#Help text for messenger 1#>"} + {#ix-set:MessageTextList = "[1]:'<#Messenger 1: message text for message code 1#>':'<#Messenger 1: help text for message code 1#>';[2]:'<#Messenger 1: message text for message code 2#>':'<#Messenger 1: help text for message code 2#>';[3]:'<#Messenger 1: message text for message code 3#>':'<#Messenger 1: help text for message code 3#>';[4]:'<#Messenger 1: message text for message code 4#>':'<#Messenger 1: help text for message code 4#>';[5]:'<#Messenger 1: message text for message code 5#>':'<#Messenger 1: help text for message code 5#>';[6]:'<#Messenger 1: message text for message code 6#>':'<#Messenger 1: help text for message code 6#>';[7]:'<#Messenger 1: message text for message code 7#>':'<#Messenger 1: help text for message code 7#>';[8]:'<#Messenger 1: message text for message code 8#>':'<#Messenger 1: help text for message code 8#>';[9]:'<#Messenger 1: message text for message code 9#>':'<#Messenger 1: help text for message code 9#>';[10]:'<#Messenger 1: message text for message code 10#>':'<#Messenger 1: help text for message code 10#>';[11]:'<#Messenger 1: message text for message code 11#>':'<#Messenger 1: help text for message code 11#>'"} _messenger1 : AXOpen.Messaging.Static.AxoMessenger; + {#ix-attr:[Container(Layout.Wrap)]} {#ix-set:AttributeName = "<#Set to high to activate the messenger 1#>"} _messenger1condition : BOOL; + {#ix-set:AttributeName = "<#message 1 code#>"} + _messenger1code : INT; + {#ix-attr:[Container(Layout.Stack)]} {#ix-set:AttributeName = "<#Messenger 2#>"} {#ix-set:MessageText = "<#Message text for messenger 2#>"} {#ix-set:Help = "<#Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus neque eros, malesuada ac orci ut, ornare ullamcorper purus. Integer ultrices turpis vel est suscipit blandit. Mauris blandit eros augue, in mollis dui tincidunt vel. Sed placerat augue risus, eget pulvinar felis dictum quis. Aliquam ut interdum nisl. Aliquam et velit id turpis blandit laoreet nec ut ligula. Aliquam ac neque risus. Fusce porta mauris eget nulla iaculis mattis. Etiam auctor mi eget libero laoreet, sed interdum ipsum pellentesque. Maecenas vitae quam vitae velit tincidunt fringilla. Fusce sagittis elit sit amet tempor pretium. Donec elementum, ligula at laoreet mollis, est ipsum elementum lectus, et mollis nisi tellus id erat. In hac habitasse platea dictumst.#>"} + {#ix-set:MessageTextList = "[1]:'<#Messenger 2: message text for message code 1#>':'<#Messenger 2: help text for message code 1#>'[2]:'<#Messenger 2: message text for message code 2#>':'<#Messenger 2: help text for message code 2#>'"} _messenger2 : AXOpen.Messaging.Static.AxoMessenger; + {#ix-attr:[Container(Layout.Wrap)]} {#ix-set:AttributeName = "<#Set to high to activate the messenger 2#>"} _messenger2condition : BOOL; + {#ix-set:AttributeName = "<#message 2 code#>"} + _messenger2code : INT; + {#ix-attr:[Container(Layout.Stack)]} {#ix-set:AttributeName = "<#Messenger 3#>"} {#ix-set:MessageText = "<#Message text for messenger 3#>"} {#ix-set:Help = "<#Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus neque eros, malesuada ac orci ut, ornare ullamcorper purus. Integer ultrices turpis vel est suscipit blandit. Mauris blandit eros augue, in mollis dui tincidunt vel. Sed placerat augue risus, eget pulvinar felis dictum quis. Aliquam ut interdum nisl. Aliquam et velit id turpis blandit laoreet nec ut ligula. Aliquam ac neque risus. Fusce porta mauris eget nulla iaculis mattis. Etiam auctor mi eget libero laoreet, sed interdum ipsum pellentesque. Maecenas vitae quam vitae velit tincidunt fringilla. Fusce sagittis elit sit amet tempor pretium. Donec elementum, ligula at laoreet mollis, est ipsum elementum lectus, et mollis nisi tellus id erat. In hac habitasse platea dictumst.#>"} @@ -34,9 +44,10 @@ NAMESPACE AxoStaticMessengerExample METHOD PROTECTED OVERRIDE Main _messenger1.Serve(THIS); IF _messenger1condition THEN - _messenger1.Activate(eAxoMessageCategory#Error); + + _messenger1.Activate(_messenger1code,eAxoMessageCategory#Error); END_IF; - _messenger2.ActivateOnCondition(_messenger2condition,eAxoMessageCategory#Warning).RequireAcknowledgement(); + _messenger2.ActivateOnCondition(_messenger2code,_messenger2condition,eAxoMessageCategory#Warning).RequireAcknowledgement(); _messenger2.Serve(THIS); _messenger3.ActivateOnCondition(_messenger3condition,eAxoMessageCategory#Info); _messenger3.Serve(THIS); From d59857ed0b4329ba9a91562c1ae9b49aa897b34a Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 24 Aug 2023 22:26:13 +0200 Subject: [PATCH 11/28] some code cleanup + some TODO marks added for documentation --- src/components.cognex.vision/app/apax.yml | 1 - .../src/AxoMessaging/Static/AxoMessenger.st | 60 +++++++++---------- .../AxoStaticMessengerExample.st | 2 +- 3 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/components.cognex.vision/app/apax.yml b/src/components.cognex.vision/app/apax.yml index 25b10c875..65f5f27a9 100644 --- a/src/components.cognex.vision/app/apax.yml +++ b/src/components.cognex.vision/app/apax.yml @@ -68,4 +68,3 @@ scripts: - echo "Finished in :" $(expr $(date +%s) - $START) "s" targets: - plcsim - - axunit-llvm diff --git a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st index c5fee3958..c48fc9173 100644 --- a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st +++ b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st @@ -32,7 +32,9 @@ NAMESPACE AXOpen.Messaging.Static ActiveContextCount : ULINT; Context : IAxoContext; END_VAR - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC Serve VAR_INPUT _context : IAxoContext; @@ -67,7 +69,9 @@ NAMESPACE AXOpen.Messaging.Static THIS.Acknowledge(); END_IF; END_METHOD - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC Serve VAR_INPUT _object : IAxoObject; @@ -79,7 +83,9 @@ NAMESPACE AXOpen.Messaging.Static THIS.Serve(_object.GetContext()); END_METHOD - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC Activate : AXOpen.Messaging.Static.IAxoMessageProperties VAR_INPUT _category : eAxoMessageCategory; @@ -112,7 +118,7 @@ NAMESPACE AXOpen.Messaging.Static Activate := THIS; END_METHOD - METHOD PUBLIC Activate : AXOpen.Messaging.Static.IAxoMessageProperties + METHOD PRIVATE Activate : AXOpen.Messaging.Static.IAxoMessageProperties VAR_INPUT _messageCode : INT; _category : eAxoMessageCategory; @@ -132,6 +138,7 @@ NAMESPACE AXOpen.Messaging.Static Context.GetLogger().Log('Risen', THIS.ToLogLevel(_category), THIS); MessageCode := _messageCode; END_IF; + IF MessageCode = _messageCode THEN ActiveContextCount := Context.OpenCycleCount(); Category := _category; @@ -141,27 +148,9 @@ NAMESPACE AXOpen.Messaging.Static Activate := THIS; END_METHOD - - - // METHOD PUBLIC Activate : AXOpen.Messaging.Static.IAxoMessageProperties - // VAR_INPUT - // _messageCode : INT; - // _category : eAxoMessageCategory; - // END_VAR - - // Activate := THIS; - - // IF NOT IsActive AND NOT WaitingForAcknowledge THEN - // MessageCode := _messageCode; - // END_IF; - // Activate := THIS.Activate(_category); - // END_METHOD - - // METHOD PUBLIC Activate : AXOpen.Messaging.Static.IAxoMessageProperties - // Activate := THIS; - // Activate := THIS.Activate(eAxoMessageCategory#All); - // END_METHOD - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC ActivateOnCondition : AXOpen.Messaging.Static.IAxoMessageProperties VAR_INPUT _condition : BOOL; @@ -176,7 +165,9 @@ NAMESPACE AXOpen.Messaging.Static THIS.Deactivate(); END_IF; END_METHOD - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC ActivateOnCondition : AXOpen.Messaging.Static.IAxoMessageProperties VAR_INPUT _messageCode : INT; @@ -233,7 +224,9 @@ NAMESPACE AXOpen.Messaging.Static END_IF; END_IF; END_METHOD - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC Acknowledge IF AXOpen.Core.IsNullContext(Context) THEN RETURN; @@ -285,20 +278,25 @@ NAMESPACE AXOpen.Messaging.Static END_CASE; END_METHOD - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC RequireAcknowledgement : AXOpen.Messaging.Static.IAxoMessageProperties AcknowledgementRequired := TRUE; RequireAcknowledgement := THIS; END_METHOD - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC DoNotRequireAcknowledgement : AXOpen.Messaging.Static.IAxoMessageProperties AcknowledgementRequired := FALSE; DoNotRequireAcknowledgement := THIS; END_METHOD - + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// METHOD PUBLIC IsAcknowledgementRequired : BOOL IsAcknowledgementRequired := AcknowledgementRequired; END_METHOD END_CLASS - END_NAMESPACE \ No newline at end of file diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st index b250710b2..f6052b984 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st @@ -11,7 +11,7 @@ NAMESPACE AxoStaticMessengerExample {#ix-set:MessageTextList = "[1]:'<#Messenger 1: message text for message code 1#>':'<#Messenger 1: help text for message code 1#>';[2]:'<#Messenger 1: message text for message code 2#>':'<#Messenger 1: help text for message code 2#>';[3]:'<#Messenger 1: message text for message code 3#>':'<#Messenger 1: help text for message code 3#>';[4]:'<#Messenger 1: message text for message code 4#>':'<#Messenger 1: help text for message code 4#>';[5]:'<#Messenger 1: message text for message code 5#>':'<#Messenger 1: help text for message code 5#>';[6]:'<#Messenger 1: message text for message code 6#>':'<#Messenger 1: help text for message code 6#>';[7]:'<#Messenger 1: message text for message code 7#>':'<#Messenger 1: help text for message code 7#>';[8]:'<#Messenger 1: message text for message code 8#>':'<#Messenger 1: help text for message code 8#>';[9]:'<#Messenger 1: message text for message code 9#>':'<#Messenger 1: help text for message code 9#>';[10]:'<#Messenger 1: message text for message code 10#>':'<#Messenger 1: help text for message code 10#>';[11]:'<#Messenger 1: message text for message code 11#>':'<#Messenger 1: help text for message code 11#>'"} _messenger1 : AXOpen.Messaging.Static.AxoMessenger; {#ix-attr:[Container(Layout.Wrap)]} - {#ix-set:AttributeName = "<#Set to high to activate the messenger 1#>"} + {#ix-set:AttributeName = "<#Set to high to activate the messenger 1 with default value#>"} _messenger1condition : BOOL; {#ix-set:AttributeName = "<#message 1 code#>"} _messenger1code : INT; From aba7376988d8c465aeb9c8ae5d6e1933c8e23547 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 24 Aug 2023 22:34:59 +0200 Subject: [PATCH 12/28] AxoCylinder-cleanup --- src/components.pneumatics/ctrl/src/AxoCylinder.st | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/components.pneumatics/ctrl/src/AxoCylinder.st b/src/components.pneumatics/ctrl/src/AxoCylinder.st index 8b08abfd4..fc6e1c39d 100644 --- a/src/components.pneumatics/ctrl/src/AxoCylinder.st +++ b/src/components.pneumatics/ctrl/src/AxoCylinder.st @@ -207,9 +207,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveWorkSignal := FALSE; - // _MoveToWorkSuspended.Activate(eAxoMessageCategory#Info); END_IF; - //IF(Condition AND NOT _MoveToWorkTask.IsBusy()) THEN _Messenger.Activate(4, eAxoMessageCategory#Info); END_IF; _Messenger.ActivateOnCondition(4, Condition AND NOT _MoveToWorkTask.IsBusy(), eAxoMessageCategory#Info); _MoveToWorkIsSuspended := Condition; END_METHOD @@ -224,9 +222,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveHomeSignal := FALSE; - // _MoveToHomeSuspended.Activate(eAxoMessageCategory#Info); END_IF; - //IF(Condition AND NOT _MoveToHomeTask.IsBusy()) THEN _Messenger.Activate(5, eAxoMessageCategory#Info); END_IF; _Messenger.ActivateOnCondition(5, Condition AND NOT _MoveToHomeTask.IsBusy(), eAxoMessageCategory#Info); _MoveToHomeIsSuspended := Condition; END_METHOD @@ -241,9 +237,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveWorkSignal := FALSE; - // _MoveToWorkAborted.Activate(eAxoMessageCategory#Info); END_IF; - // IF(Condition) THEN _Messenger.Activate(6, eAxoMessageCategory#Info); END_IF; _Messenger.ActivateOnCondition(6, Condition, eAxoMessageCategory#Info); _MoveToWorkTask.IsDisabled := Condition; END_METHOD @@ -258,9 +252,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveHomeSignal := FALSE; - // _MoveToHomeAborted.Activate(eAxoMessageCategory#Info); END_IF; - // IF(Condition) THEN _Messenger.Activate(7, eAxoMessageCategory#Info); END_IF; _Messenger.ActivateOnCondition(7, Condition, eAxoMessageCategory#Info); _MoveToHomeTask.IsDisabled := Condition; END_METHOD From 16f339f66f076c2e4f011b99d23968e4ad10f7c9 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Thu, 24 Aug 2023 22:40:28 +0200 Subject: [PATCH 13/28] AxoCylinder-another cleanup, plus some typo fixed --- .../ctrl/src/AxoCylinder.st | 29 ++----------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/src/components.pneumatics/ctrl/src/AxoCylinder.st b/src/components.pneumatics/ctrl/src/AxoCylinder.st index fc6e1c39d..60e59c574 100644 --- a/src/components.pneumatics/ctrl/src/AxoCylinder.st +++ b/src/components.pneumatics/ctrl/src/AxoCylinder.st @@ -36,31 +36,6 @@ NAMESPACE AXOpen.Components.Pneumatics {#ix-attr:[ReadOnly()]} {#ix-set:AttributeName = "<#Move work signal#>"} _MoveWorkSignal : BOOL; - - // {#ix-set:MessageText = "<#Movement to work position did not succeed.#>"} - // {#ix-set:Help = "<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>"} - // _MoveToWorkNotReached : AXOpen.Messaging.Static.AxoMessenger; - - // {#ix-set:MessageText = "<#Movement to home position did not succeed.#>"} - // {#ix-set:Help = "<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>"} - // _MoveToHomeNotReached : AXOpen.Messaging.Static.AxoMessenger; - - // {#ix-set:MessageText = "<#Movement to work position is temporarily suspended.#>"} - // {#ix-set:Help = "<#Check the blocking condition.#>"} - // _MoveToWorkSuspended : AXOpen.Messaging.Static.AxoMessenger; - - // {#ix-set:MessageText = "<#Movement to home position is temporarily suspended.#>"} - // {#ix-set:Help = "<#Check the blocking condition.#>"} - // _MoveToHomeSuspended : AXOpen.Messaging.Static.AxoMessenger; - - // {#ix-set:MessageText = "<#Movement to work position is aborted.#>"} - // {#ix-set:Help = "<#Check the blocking condition.#>"} - // _MoveToWorkAborted : AXOpen.Messaging.Static.AxoMessenger; - - // {#ix-set:MessageText = "<#Movement to home position is aborted.#>"} - // {#ix-set:Help = "<#Check the blocking condition.#>"} - // _MoveToHomeAborted : AXOpen.Messaging.Static.AxoMessenger; - {#ix-set:MessageTextList = "[1]:'<#Movement to work position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[2]:'<#Movement to home position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[3]:'<#Home and work position sensors are both active at the same time.#>':'<#Check the position of sensors.#>';[4]:'<#Movement to work position is temporarily suspended.#>':'<#Check the blocking condition.#>';[5]:'<#Movement to home position is temporarily suspended.#>':'<#Check the blocking condition.#>';[6]:'<#Movement to work position is aborted.#>':'<#Check the blocking condition.#>';[7]:'<#Movement to home position is aborted.#>':'<#Check the blocking condition.#>';"} _Messenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR @@ -208,7 +183,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveWorkSignal := FALSE; END_IF; - _Messenger.ActivateOnCondition(4, Condition AND NOT _MoveToWorkTask.IsBusy(), eAxoMessageCategory#Info); + _Messenger.ActivateOnCondition(4, Condition AND _MoveToWorkTask.IsBusy(), eAxoMessageCategory#Info); _MoveToWorkIsSuspended := Condition; END_METHOD @@ -223,7 +198,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveHomeSignal := FALSE; END_IF; - _Messenger.ActivateOnCondition(5, Condition AND NOT _MoveToHomeTask.IsBusy(), eAxoMessageCategory#Info); + _Messenger.ActivateOnCondition(5, Condition AND _MoveToHomeTask.IsBusy(), eAxoMessageCategory#Info); _MoveToHomeIsSuspended := Condition; END_METHOD From 588ae327942bb3a76686c0245bccc8d11a7342b1 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Mon, 28 Aug 2023 17:42:27 +0200 Subject: [PATCH 14/28] wip --- src/AXOpen.sln | 33 +++++++--- .../AxoInsight/v_6_0_0/AxoInsight.cs | 7 +-- src/components.pneumatics/app/apax.yml | 1 + .../app/src/AXOpen.AxoRtc/AxoS71500Rtc.st | 7 +++ .../app/src/configuration.st | 1 + src/components.pneumatics/app/src/program.st | 2 + .../ctrl/src/AxoCylinder.st | 34 +++++----- .../ctrl/test/CylinderTests.st | 62 +++++++++++-------- .../AxoCylinder/AxoCylinder.cs | 8 +++ .../src/AxoMessaging/Static/AxoMessenger.st | 30 ++++----- .../Static/AxoMessengerView.razor.cs | 30 ++++++--- .../AxoMessenger/Static/AxoMessenger.cs | 49 ++++++++------- src/integrations/ctrl/default.mon | 7 +-- .../AxoStaticMessengerExample.st | 25 +++++--- .../AxoTextListExample.st | 0 .../AxoStaticMessengerExample.cs | 42 +++++++++++++ .../AxoTextListExample.cs} | 0 .../axopen_integrations.csproj | 6 ++ src/templates.simple/ctrl/apax.yml | 2 +- 19 files changed, 228 insertions(+), 118 deletions(-) create mode 100644 src/components.pneumatics/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st create mode 100644 src/components.pneumatics/src/AXOpen.Components.Pneumatics/AxoCylinder/AxoCylinder.cs rename src/integrations/ctrl/src/Examples/{AxoTextList => AXOpen.TextList}/AxoTextListExample.st (100%) create mode 100644 src/integrations/src/AXOpen.Integrations/AXOpen.Messaging/AxoStaticMessengerExample.cs rename src/integrations/src/AXOpen.Integrations/{AxoTextListExample/AxoTextListExampleContext.cs => AXOpen.TextList/AxoTextListExample.cs} (100%) diff --git a/src/AXOpen.sln b/src/AXOpen.sln index e6d1fd7d1..8e477048a 100644 --- a/src/AXOpen.sln +++ b/src/AXOpen.sln @@ -195,6 +195,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{3134A28E EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Components.Pneumatics_tests", "components.pneumatics\tests\AXOpen.Components.Pneumatics.Tests\AXOpen.Components.Pneumatics_tests.csproj", "{0F38853D-6D5D-4156-9571-E5F3426782AF}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{EABE6BC4-1679-46EA-A3BB-56CF63A40FE5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PneumaticComponents", "components.pneumatics\app\ix\PneumaticComponents.csproj", "{3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PneumaticComponents.blazor", "components.pneumatics\app\ix-blazor\PneumaticComponents.blazor\PneumaticComponents.blazor.csproj", "{82B49531-E587-4700-8BF3-44D97826B8C5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -369,6 +375,14 @@ Global {ADAF1255-8D10-4C83-B6D2-73347D677D15}.Debug|Any CPU.Build.0 = Debug|Any CPU {ADAF1255-8D10-4C83-B6D2-73347D677D15}.Release|Any CPU.ActiveCfg = Release|Any CPU {ADAF1255-8D10-4C83-B6D2-73347D677D15}.Release|Any CPU.Build.0 = Release|Any CPU + {B67B5F3E-4D9C-4C43-9022-D2A8C63CDDA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B67B5F3E-4D9C-4C43-9022-D2A8C63CDDA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B67B5F3E-4D9C-4C43-9022-D2A8C63CDDA2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B67B5F3E-4D9C-4C43-9022-D2A8C63CDDA2}.Release|Any CPU.Build.0 = Release|Any CPU + {AEF7D1B6-097D-42C5-A745-412F108F836D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEF7D1B6-097D-42C5-A745-412F108F836D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEF7D1B6-097D-42C5-A745-412F108F836D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEF7D1B6-097D-42C5-A745-412F108F836D}.Release|Any CPU.Build.0 = Release|Any CPU {D58C6C28-4F51-4363-8922-B5BE99861676}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D58C6C28-4F51-4363-8922-B5BE99861676}.Debug|Any CPU.Build.0 = Debug|Any CPU {D58C6C28-4F51-4363-8922-B5BE99861676}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -381,14 +395,14 @@ Global {0F38853D-6D5D-4156-9571-E5F3426782AF}.Debug|Any CPU.Build.0 = Debug|Any CPU {0F38853D-6D5D-4156-9571-E5F3426782AF}.Release|Any CPU.ActiveCfg = Release|Any CPU {0F38853D-6D5D-4156-9571-E5F3426782AF}.Release|Any CPU.Build.0 = Release|Any CPU - {B67B5F3E-4D9C-4C43-9022-D2A8C63CDDA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B67B5F3E-4D9C-4C43-9022-D2A8C63CDDA2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B67B5F3E-4D9C-4C43-9022-D2A8C63CDDA2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B67B5F3E-4D9C-4C43-9022-D2A8C63CDDA2}.Release|Any CPU.Build.0 = Release|Any CPU - {AEF7D1B6-097D-42C5-A745-412F108F836D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AEF7D1B6-097D-42C5-A745-412F108F836D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AEF7D1B6-097D-42C5-A745-412F108F836D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AEF7D1B6-097D-42C5-A745-412F108F836D}.Release|Any CPU.Build.0 = Release|Any CPU + {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}.Release|Any CPU.Build.0 = Release|Any CPU + {82B49531-E587-4700-8BF3-44D97826B8C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {82B49531-E587-4700-8BF3-44D97826B8C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82B49531-E587-4700-8BF3-44D97826B8C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {82B49531-E587-4700-8BF3-44D97826B8C5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -470,6 +484,9 @@ Global {CCF4FC3E-CB4B-48C3-BB31-56ACA90AA72D} = {4ECC0318-29C7-4BBF-93AC-45A18934FD6C} {3134A28E-12A5-4255-81F4-F84874CE9318} = {1B390C59-FF6C-4721-8DBA-B8176DBA531B} {0F38853D-6D5D-4156-9571-E5F3426782AF} = {3134A28E-12A5-4255-81F4-F84874CE9318} + {EABE6BC4-1679-46EA-A3BB-56CF63A40FE5} = {1B390C59-FF6C-4721-8DBA-B8176DBA531B} + {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804} = {EABE6BC4-1679-46EA-A3BB-56CF63A40FE5} + {82B49531-E587-4700-8BF3-44D97826B8C5} = {EABE6BC4-1679-46EA-A3BB-56CF63A40FE5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {292B45BE-E9CB-443B-979D-C0AFCD8D5675} diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs index d52297ffd..ef1e819d4 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs @@ -1,10 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using AXOpen.Components.Abstractions; -using AXOpen.Components.Abstractions; namespace AXOpen.Cognex.Vision.v_6_0_0_0 { public partial class AxoInsight diff --git a/src/components.pneumatics/app/apax.yml b/src/components.pneumatics/app/apax.yml index 49d09bfa6..63a95bcfb 100644 --- a/src/components.pneumatics/app/apax.yml +++ b/src/components.pneumatics/app/apax.yml @@ -5,6 +5,7 @@ devDependencies: "@ax/sdk": 4.0.3 dependencies: "@ix-ax/axopen_components_pneumatics": 0.1.4-alpha.79 + "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' variables: APAX_BUILD_ARGS: - "--debug" # Generate debug information for target "1500" diff --git a/src/components.pneumatics/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st b/src/components.pneumatics/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st new file mode 100644 index 000000000..3f919d692 --- /dev/null +++ b/src/components.pneumatics/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st @@ -0,0 +1,7 @@ +NAMESPACE AxoRtc + CLASS AxoS71500Rtc IMPLEMENTS AXOpen.Rtc.IAxoRtc + METHOD PUBLIC NowUTC : LDATE_AND_TIME + Siemens.Simatic.S71500.Clocks.GetSystemDateTime(value => NowUTC); + END_METHOD + END_CLASS +END_NAMESPACE diff --git a/src/components.pneumatics/app/src/configuration.st b/src/components.pneumatics/app/src/configuration.st index 4f822064b..367a04c98 100644 --- a/src/components.pneumatics/app/src/configuration.st +++ b/src/components.pneumatics/app/src/configuration.st @@ -5,6 +5,7 @@ CONFIGURATION MyConfiguration VAR_GLOBAL sandbox : SandboContext; documentation : DocumentationContext; + AxoRtc : AxoRtc.AxoS71500Rtc; END_VAR END_CONFIGURATION diff --git a/src/components.pneumatics/app/src/program.st b/src/components.pneumatics/app/src/program.st index 00f8b3447..255856876 100644 --- a/src/components.pneumatics/app/src/program.st +++ b/src/components.pneumatics/app/src/program.st @@ -2,6 +2,7 @@ PROGRAM MyProgram VAR_EXTERNAL sandbox : SandboContext; documentation : DocumentationContext; + AxoRtc : AxoRtc.AxoS71500Rtc; END_VAR VAR @@ -12,4 +13,5 @@ PROGRAM MyProgram END_VAR sandbox.Run(); + sandbox.InjectRtc(AxoRtc); END_PROGRAM diff --git a/src/components.pneumatics/ctrl/src/AxoCylinder.st b/src/components.pneumatics/ctrl/src/AxoCylinder.st index 60e59c574..466778c35 100644 --- a/src/components.pneumatics/ctrl/src/AxoCylinder.st +++ b/src/components.pneumatics/ctrl/src/AxoCylinder.st @@ -36,7 +36,7 @@ NAMESPACE AXOpen.Components.Pneumatics {#ix-attr:[ReadOnly()]} {#ix-set:AttributeName = "<#Move work signal#>"} _MoveWorkSignal : BOOL; - {#ix-set:MessageTextList = "[1]:'<#Movement to work position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[2]:'<#Movement to home position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[3]:'<#Home and work position sensors are both active at the same time.#>':'<#Check the position of sensors.#>';[4]:'<#Movement to work position is temporarily suspended.#>':'<#Check the blocking condition.#>';[5]:'<#Movement to home position is temporarily suspended.#>':'<#Check the blocking condition.#>';[6]:'<#Movement to work position is aborted.#>':'<#Check the blocking condition.#>';[7]:'<#Movement to home position is aborted.#>':'<#Check the blocking condition.#>';"} + {#ix-set:PlcTextList = "[1]:'<#Movement to work position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[2]:'<#Movement to home position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[3]:'<#Home and work position sensors are both active at the same time.#>':'<#Check the position of sensors.#>';[4]:'<#Movement to work position is temporarily suspended.#>':'<#Check the blocking condition.#>';[5]:'<#Movement to home position is temporarily suspended.#>':'<#Check the blocking condition.#>';[6]:'<#Movement to work position is aborted.#>':'<#Check the blocking condition.#>';[7]:'<#Movement to home position is aborted.#>':'<#Check the blocking condition.#>';"} _Messenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR @@ -82,16 +82,9 @@ NAMESPACE AXOpen.Components.Pneumatics THIS.Open(); - // _MoveToWorkNotReached.Serve(THIS); - // _MoveToHomeNotReached.Serve(THIS); - // _MoveToWorkSuspended.Serve(THIS); - // _MoveToHomeSuspended.Serve(THIS); - // _MoveToWorkAborted.Serve(THIS); - // _MoveToHomeAborted.Serve(THIS); - _Messenger.Serve(THIS); - //IF(workSensor AND homeSensor) THEN _Messenger.Activate(3, eAxoMessageCategory#Error); END_IF; - _Messenger.ActivateOnCondition(3, workSensor AND homeSensor, eAxoMessageCategory#Error); + + _Messenger.ActivateOnCondition(UINT#3, workSensor AND homeSensor, eAxoMessageCategory#Error); IF(_StopTask.Execute()) THEN moveHomeSignal := FALSE; @@ -106,9 +99,7 @@ NAMESPACE AXOpen.Components.Pneumatics moveWorkSignal := TRUE; _MoveToWorkTask.DoneWhen(workSensor); _MoveToHomeTask.Restore(); - // _MoveToWorkNotReached.ActivateOnCondition(_MoveToWorkTask.Duration >= T#10S, eAxoMessageCategory#Error); - //IF(NOT _MoveToWorkIsSuspended AND _MoveToWorkTask.Duration >= T#10S) THEN _Messenger.Activate(1, eAxoMessageCategory#Error); END_IF; - _Messenger.ActivateOnCondition(1, NOT _MoveToWorkIsSuspended AND _MoveToWorkTask.Duration >= T#10S, eAxoMessageCategory#Info); + _Messenger.ActivateOnCondition(UINT#1, NOT _MoveToWorkIsSuspended AND _MoveToWorkTask.Duration >= T#10S, eAxoMessageCategory#Info); END_IF; IF(_MoveToHomeTask.Execute()) THEN @@ -116,19 +107,22 @@ NAMESPACE AXOpen.Components.Pneumatics moveWorkSignal := FALSE; _MoveToHomeTask.DoneWhen(homeSensor); _MoveToWorkTask.Restore(); - // _MoveToHomeNotReached.ActivateOnCondition(_MoveToHomeTask.Duration >= T#10S, eAxoMessageCategory#Error); - //IF(NOT _MoveToHomeIsSuspended AND _MoveToHomeTask.Duration >= T#10S) THEN _Messenger.Activate(2, eAxoMessageCategory#Error); END_IF; - _Messenger.ActivateOnCondition(2, NOT _MoveToHomeIsSuspended AND _MoveToHomeTask.Duration >= T#10S, eAxoMessageCategory#Info); + _Messenger.ActivateOnCondition(UINT#2, NOT _MoveToHomeIsSuspended AND _MoveToHomeTask.Duration >= T#10S, eAxoMessageCategory#Info); END_IF; IF _MoveToWorkIsSuspended THEN moveWorkSignal := FALSE; END_IF; + + _Messenger.ActivateOnCondition(UINT#4, _MoveToWorkIsSuspended AND _MoveToWorkTask.IsBusy(), eAxoMessageCategory#Info); + IF _MoveToHomeIsSuspended THEN moveHomeSignal := FALSE; END_IF; + _Messenger.ActivateOnCondition(UINT#5, _MoveToHomeIsSuspended AND _MoveToHomeTask.IsBusy(), eAxoMessageCategory#Info); + _HomeSensor := homeSensor; _WorkSensor := workSensor; @@ -183,7 +177,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveWorkSignal := FALSE; END_IF; - _Messenger.ActivateOnCondition(4, Condition AND _MoveToWorkTask.IsBusy(), eAxoMessageCategory#Info); + _Messenger.ActivateOnCondition(UINT#4, Condition AND _MoveToWorkTask.IsBusy(), eAxoMessageCategory#Info); _MoveToWorkIsSuspended := Condition; END_METHOD @@ -198,7 +192,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveHomeSignal := FALSE; END_IF; - _Messenger.ActivateOnCondition(5, Condition AND _MoveToHomeTask.IsBusy(), eAxoMessageCategory#Info); + _Messenger.ActivateOnCondition(UINT#5, Condition AND _MoveToHomeTask.IsBusy(), eAxoMessageCategory#Info); _MoveToHomeIsSuspended := Condition; END_METHOD @@ -213,7 +207,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveWorkSignal := FALSE; END_IF; - _Messenger.ActivateOnCondition(6, Condition, eAxoMessageCategory#Info); + _Messenger.ActivateOnCondition(UINT#6, Condition, eAxoMessageCategory#Info); _MoveToWorkTask.IsDisabled := Condition; END_METHOD @@ -228,7 +222,7 @@ NAMESPACE AXOpen.Components.Pneumatics IF(Condition) THEN _moveHomeSignal := FALSE; END_IF; - _Messenger.ActivateOnCondition(7, Condition, eAxoMessageCategory#Info); + _Messenger.ActivateOnCondition(UINT#7, Condition, eAxoMessageCategory#Info); _MoveToHomeTask.IsDisabled := Condition; END_METHOD END_CLASS diff --git a/src/components.pneumatics/ctrl/test/CylinderTests.st b/src/components.pneumatics/ctrl/test/CylinderTests.st index 38125ec26..7b4d09d14 100644 --- a/src/components.pneumatics/ctrl/test/CylinderTests.st +++ b/src/components.pneumatics/ctrl/test/CylinderTests.st @@ -200,6 +200,7 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.SuspendMoveToWorkWhile(TRUE); @@ -210,8 +211,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -231,6 +232,7 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); @@ -241,8 +243,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -262,6 +264,7 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(TRUE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.SuspendMoveToHomeWhile(TRUE); @@ -272,8 +275,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -293,6 +296,7 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(TRUE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); @@ -303,8 +307,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -314,6 +318,7 @@ NAMESPACE Cylinder.Tests END_VAR THIS.Init(dt); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.SuspendMoveToWorkWhile(TRUE); @@ -325,8 +330,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkSuspended.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkSuspended.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -336,6 +341,7 @@ NAMESPACE Cylinder.Tests END_VAR THIS.Init(dt); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.SuspendMoveToHomeWhile(TRUE); @@ -347,8 +353,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeSuspended.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeSuspended.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -358,6 +364,7 @@ NAMESPACE Cylinder.Tests END_VAR THIS.Init(dt); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.MoveToWork(); @@ -378,8 +385,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -399,6 +406,7 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToWork().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); @@ -409,8 +417,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -430,6 +438,7 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(TRUE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.AbortMoveToHomeWhen(TRUE); @@ -440,8 +449,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -461,6 +470,7 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(TRUE, _moveHomeSignal); AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); @@ -471,8 +481,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, cylinder._MoveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -482,6 +492,7 @@ NAMESPACE Cylinder.Tests END_VAR THIS.Init(dt); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.AbortMoveToWorkWhen(TRUE); @@ -493,8 +504,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToWorkTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToWork().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToWorkAborted.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToWorkAborted.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD {Test} @@ -504,6 +515,7 @@ NAMESPACE Cylinder.Tests END_VAR THIS.Init(dt); + AxUnit.Assert.Equal(FALSE, cylinder._Messenger.IsActive); context.Open(); cylinder.AbortMoveToHomeWhen(TRUE); @@ -515,8 +527,8 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(FALSE, _moveHomeSignal); AxUnit.Assert.Equal(FALSE, cylinder._MoveToHomeTask.IsBusy()); AxUnit.Assert.Equal(FALSE, cylinder.MoveToHome().IsBusy()); - // AxUnit.Assert.Equal(TRUE, cylinder._MoveToHomeAborted.IsActive); - // AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._MoveToHomeAborted.Risen)); + AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); + AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); END_METHOD @@ -545,7 +557,7 @@ NAMESPACE Cylinder.Tests AxUnit.Assert.Equal(TRUE, cylinder.MoveToHome().IsBusy()); AxUnit.Assert.Equal(TRUE, cylinder._Messenger.IsActive); AxUnit.Assert.Equal(TRUE,THIS.AreEqual(dt, cylinder._Messenger.Risen)); - AxUnit.Assert.Equal(INT#5, cylinder._Messenger.MessageCode); + AxUnit.Assert.Equal(ULINT#5, cylinder._Messenger.MessageCode); END_METHOD END_CLASS diff --git a/src/components.pneumatics/src/AXOpen.Components.Pneumatics/AxoCylinder/AxoCylinder.cs b/src/components.pneumatics/src/AXOpen.Components.Pneumatics/AxoCylinder/AxoCylinder.cs new file mode 100644 index 000000000..82d3f49f4 --- /dev/null +++ b/src/components.pneumatics/src/AXOpen.Components.Pneumatics/AxoCylinder/AxoCylinder.cs @@ -0,0 +1,8 @@ +namespace AXOpen.Components.Pneumatics +{ + public partial class AxoCylinder : AXOpen.Core.AxoComponent + { + + } +} + diff --git a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st index c48fc9173..fea3941a9 100644 --- a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st +++ b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st @@ -3,8 +3,8 @@ USING AXOpen.Core; NAMESPACE AXOpen.Messaging.Static {#ix-prop: public string MessageText } - {#ix-prop: public string MessageTextList } {#ix-prop: public string Help } + {#ix-prop: public string PlcTextList } CLASS AxoMessenger EXTENDS AxoObject IMPLEMENTS AXOpen.Messaging.Static.IAxoMessageProperties VAR PUBLIC {#ix-attr:[ReadOnly()]} @@ -12,7 +12,7 @@ NAMESPACE AXOpen.Messaging.Static {#ix-attr:[ReadOnly()]} Category : eAxoMessageCategory; {#ix-attr:[ReadOnly()]} - MessageCode : INT; + MessageCode : ULINT; {#ix-attr:[ReadOnly()]} Risen : LDATE_AND_TIME; {#ix-attr:[ReadOnly()]} @@ -46,7 +46,7 @@ NAMESPACE AXOpen.Messaging.Static Context := _context; - IF MessageCode = INT#0 THEN + IF MessageCode = ULINT#0 THEN IF IsActive THEN IF Context.OpenCycleCount() - ActiveContextCount > UINT#1 THEN THIS.Deactivate(); @@ -61,7 +61,7 @@ NAMESPACE AXOpen.Messaging.Static END_IF; ELSIF AcknowledgedBeforeFallen THEN AcknowledgedBeforeFallen := FALSE; - MessageCode := INT#0; + MessageCode := ULINT#0; END_IF; END_IF; @@ -97,7 +97,7 @@ NAMESPACE AXOpen.Messaging.Static RETURN; END_IF; - IF MessageCode = INT#0 THEN + IF MessageCode = ULINT#0 THEN IF ActiveContextCount = ULINT#0 THEN Risen := Context.GetRtc().NowUTC(); Fallen := LDATE_AND_TIME#1970-01-01-00:00:00.000; @@ -120,7 +120,7 @@ NAMESPACE AXOpen.Messaging.Static METHOD PRIVATE Activate : AXOpen.Messaging.Static.IAxoMessageProperties VAR_INPUT - _messageCode : INT; + _messageCode : ULINT; _category : eAxoMessageCategory; END_VAR @@ -130,7 +130,7 @@ NAMESPACE AXOpen.Messaging.Static RETURN; END_IF; - IF NOT IsActive AND NOT WaitingForAcknowledge AND MessageCode = INT#0 AND ActiveContextCount = ULINT#0 THEN + IF NOT IsActive AND NOT WaitingForAcknowledge AND MessageCode = ULINT#0 AND ActiveContextCount = ULINT#0 THEN Risen := Context.GetRtc().NowUTC(); Fallen := LDATE_AND_TIME#1970-01-01-00:00:00.000; Acknowledged := LDATE_AND_TIME#1970-01-01-00:00:00.000; @@ -170,16 +170,16 @@ NAMESPACE AXOpen.Messaging.Static /// METHOD PUBLIC ActivateOnCondition : AXOpen.Messaging.Static.IAxoMessageProperties VAR_INPUT - _messageCode : INT; + _messageCode : ULINT; _condition : BOOL; _category : eAxoMessageCategory; END_VAR ActivateOnCondition := THIS; - IF NOT IsActive AND NOT WaitingForAcknowledge AND _condition THEN - MessageCode := _messageCode; - END_IF; + // IF NOT IsActive AND NOT WaitingForAcknowledge AND _condition THEN + // MessageCode := _messageCode; + // END_IF; IF _condition THEN ActivateOnCondition := THIS.Activate(_messageCode,_category); ELSE @@ -189,7 +189,7 @@ NAMESPACE AXOpen.Messaging.Static METHOD PRIVATE Deactivate VAR_INPUT - _messageCode : INT; + _messageCode : ULINT; END_VAR IF AXOpen.Core.IsNullContext(Context) THEN @@ -204,7 +204,7 @@ NAMESPACE AXOpen.Messaging.Static IF AcknowledgementRequired AND NOT AcknowledgedBeforeFallen THEN WaitingForAcknowledge := TRUE; ELSE - MessageCode := INT#0; + MessageCode := ULINT#0; END_IF; END_IF; END_METHOD @@ -214,7 +214,7 @@ NAMESPACE AXOpen.Messaging.Static RETURN; END_IF; - IF IsActive AND MessageCode = INT#0 THEN + IF IsActive AND MessageCode = ULINT#0 THEN IsActive := FALSE; ActiveContextCount := ULINT#0; Fallen := Context.GetRtc().NowUTC(); @@ -240,7 +240,7 @@ NAMESPACE AXOpen.Messaging.Static AcknowledgedBeforeFallen := TRUE; ELSE WaitingForAcknowledge := FALSE; - MessageCode := INT#0; + MessageCode := ULINT#0; END_IF; AcknowledgeRequest := FALSE; diff --git a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs index 102d90351..544de7068 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs @@ -133,9 +133,7 @@ private string Category } private string Description => string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; private string Symbol => !(string.IsNullOrEmpty(Component.Symbol)) ? Component.Symbol : "Unable to retrieve symbol!"; - //private string MessageText => !(string.IsNullOrEmpty(Component.MessageText)) ? Component.MessageText : "Message text not defined!"; private string MessageText => GetMessageText(); - //private string HelpText => !(string.IsNullOrEmpty(Component.Help)) ? Component.Help : "Help not defined!"; private string HelpText => GetHelpText(); private string Risen => !(string.IsNullOrEmpty(Component.Risen.Cyclic.ToString())) ? Component.Risen.Cyclic.ToString() : ""; private string Fallen => !(string.IsNullOrEmpty(Component.Fallen.Cyclic.ToString())) ? Component.Fallen.Cyclic.ToString() : ""; @@ -149,18 +147,26 @@ private string Category private string GetMessageText() { - int messageCode = Component.MessageCode.Cyclic; + ulong messageCode = Component.MessageCode.Cyclic; string retVal = ""; + //Just one static text defined inside the `MessageText` attribute in the PLC code is used if (Component.MessageCode.Cyclic == 0) retVal = string.IsNullOrEmpty(Component.MessageText) ? "Message text not defined!" : Component.MessageText; else { try { - if(Component.AxoMessengerTextList != null && Component.AxoMessengerTextList.Count > 0) + //Several static texts defined inside the `PlcTextsList` attribute in the PLC code are used + if (Component.PlcMessengerTextList != null && Component.PlcMessengerTextList.Count > 0) { - string _messageText = (from item in Component.AxoMessengerTextList where item.Key == messageCode select item.Value.MessageText.ToString()).FirstOrDefault(); + string _messageText = (from item in Component.PlcMessengerTextList where item.Key == messageCode select item.Value.MessageText.ToString()).FirstOrDefault(); + retVal = string.IsNullOrEmpty(_messageText) ? "Message text not defined for the message code: " + messageCode.ToString() + " !" : _messageText; + } + //Message texts are written in .NET and passed into the component + else if (Component.DotNetMessengerTextList != null && Component.DotNetMessengerTextList.Count > 0) + { + string _messageText = (from item in Component.DotNetMessengerTextList where item.Key == messageCode select item.Value.MessageText.ToString()).FirstOrDefault(); retVal = string.IsNullOrEmpty(_messageText) ? "Message text not defined for the message code: " + messageCode.ToString() + " !" : _messageText; } else @@ -180,18 +186,26 @@ private string GetMessageText() private string GetHelpText() { - int messageCode = Component.MessageCode.Cyclic; + ulong messageCode = Component.MessageCode.Cyclic; string retVal = ""; + //Just one static text defined inside the `Help` attribute in the PLC code is used if (Component.MessageCode.Cyclic == 0) retVal = string.IsNullOrEmpty(Component.Help) ? "Help text not defined!" : Component.Help; else { try { - if (Component.AxoMessengerTextList != null && Component.AxoMessengerTextList.Count > 0) + //Several static texts defined inside the `PlcTextsList` attribute in the PLC code are used + if (Component.PlcMessengerTextList != null && Component.PlcMessengerTextList.Count > 0) + { + string _helpText = (from item in Component.PlcMessengerTextList where item.Key == messageCode select item.Value.HelpText.ToString()).FirstOrDefault(); + retVal = string.IsNullOrEmpty(_helpText) ? "Help text not defined for the message code: " + messageCode.ToString() + " !" : _helpText; + } + //Message texts are written in .NET and passed into the component + else if (Component.DotNetMessengerTextList != null && Component.DotNetMessengerTextList.Count > 0) { - string _helpText = (from item in Component.AxoMessengerTextList where item.Key == messageCode select item.Value.HelpText.ToString()).FirstOrDefault(); + string _helpText = (from item in Component.DotNetMessengerTextList where item.Key == messageCode select item.Value.HelpText.ToString()).FirstOrDefault(); retVal = string.IsNullOrEmpty(_helpText) ? "Help text not defined for the message code: " + messageCode.ToString() + " !" : _helpText; } else diff --git a/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessenger.cs b/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessenger.cs index bec66f21f..3a52fa8f7 100644 --- a/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessenger.cs +++ b/src/core/src/AXOpen.Core/AxoMessenger/Static/AxoMessenger.cs @@ -5,6 +5,7 @@ // https://github.com/PTKu/ix/blob/master/LICENSE // Third party licenses: https://github.com/PTKu/ix/blob/master/notices.md +using AXOpen.Base.Data; using System; using System.Collections.Generic; using static System.Net.Mime.MediaTypeNames; @@ -14,37 +15,37 @@ namespace AXOpen.Messaging.Static; public partial class AxoMessenger { - private List> axoMessengerTextList; - public List> AxoMessengerTextList + private List> plcMessengerTextList; + public List> PlcMessengerTextList { get { try { - if (axoMessengerTextList == null) + if (plcMessengerTextList == null) { - axoMessengerTextList = new List>(); - if(MessageTextList != null ) + plcMessengerTextList = new List>(); + if (PlcTextList != null) { - string[] items = MessageTextList.Split('\n'); - if (items.Length == 1 ) + string[] items = PlcTextList.Split('\n'); + //All message texts and help texts are in one line + if (items.Length == 1) { string[] delimiters = { "[", "]:'", "':'", "';", "'" }; string[] itemSeparated = items[0].Split(delimiters, StringSplitOptions.RemoveEmptyEntries); try { - if(itemSeparated.Length >= 3 && itemSeparated.Length % 3 ==0 ) - { + if (itemSeparated.Length >= 3 && itemSeparated.Length % 3 == 0) + { int itemsCount = itemSeparated.Length / 3; - for ( int i = 0; i < itemsCount; i++) + for (int i = 0; i < itemsCount; i++) { - int messageCode = 0; - if (Int32.TryParse(itemSeparated[3*i], out messageCode)) + ulong messageCode = 0; + if (ulong.TryParse(itemSeparated[3 * i], out messageCode)) { string messageText = string.IsNullOrEmpty(itemSeparated[3 * i + 1]) ? "Message text not defined for the message code: " + messageCode.ToString() + "!" : itemSeparated[3 * i + 1]; string helpText = string.IsNullOrEmpty(itemSeparated[3 * i + 2]) ? "Help text not defined for the message code: " + messageCode.ToString() + "!" : itemSeparated[3 * i + 2]; - KeyValuePair valuePair = new KeyValuePair(messageCode, new AxoMessengerTextItem(messageText, helpText)); - axoMessengerTextList.Add(valuePair); + plcMessengerTextList.Add(new KeyValuePair(messageCode, new AxoMessengerTextItem(messageText, helpText))); } } } @@ -54,7 +55,8 @@ public List> AxoMessengerTextList throw; } } - else if(items.Length > 1) + //Each pair of the Id message text and help text are in the separate line (change on the compilator side needs to be implemented) + else if (items.Length > 1) { foreach (string item in items) { @@ -62,13 +64,12 @@ public List> AxoMessengerTextList string[] itemSeparated = item.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); try { - int messageCode = 0; - if (Int32.TryParse(itemSeparated[0], out messageCode)) + ulong messageCode = 0; + if (ulong.TryParse(itemSeparated[0], out messageCode)) { string messageText = string.IsNullOrEmpty(itemSeparated[1]) ? "Message text not defined for the message code: " + messageCode.ToString() + "!" : itemSeparated[1]; string helpText = string.IsNullOrEmpty(itemSeparated[2]) ? "Help text not defined for the message code: " + messageCode.ToString() + "!" : itemSeparated[2]; - KeyValuePair valuePair = new KeyValuePair(messageCode, new AxoMessengerTextItem(messageText, helpText)); - axoMessengerTextList.Add(valuePair); + plcMessengerTextList.Add(new KeyValuePair(messageCode, new AxoMessengerTextItem(messageText, helpText))); } } catch (Exception) @@ -80,7 +81,7 @@ public List> AxoMessengerTextList } } - return axoMessengerTextList; + return plcMessengerTextList; } catch (Exception) @@ -92,6 +93,10 @@ public List> AxoMessengerTextList } } + private List> dotNetMessengerTextList; + public List> DotNetMessengerTextList + { + get{return dotNetMessengerTextList != null ? dotNetMessengerTextList : new List>();} + set{dotNetMessengerTextList = value != null ? value : new List>(); } + } } - - diff --git a/src/integrations/ctrl/default.mon b/src/integrations/ctrl/default.mon index 6ff8e23af..3188ce5d1 100644 --- a/src/integrations/ctrl/default.mon +++ b/src/integrations/ctrl/default.mon @@ -5,9 +5,4 @@ #AxoMessengers._messenger2.Risen #AxoMessengers._messenger2.Fallen #AxoMessengers._messenger2.Acknowledged -AxoCognexVisionDatamanExampleContext.MyDataman._AcquisitionStatus -AxoCognexVisionDatamanExampleContext.MyDataman._ResultsStatus -AxoCognexVisionDatamanExampleContext.MyDataman._SoftEventStatus -AxoCognexVisionDatamanExampleContext.MyDataman._AcquisitionControl -AxoCognexVisionDatamanExampleContext.MyDataman._ResultsControl -AxoCognexVisionDatamanExampleContext.MyDataman._SoftEventControl +AxoMessengers._messenger5 \ No newline at end of file diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st index f6052b984..4b8677078 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st @@ -8,24 +8,26 @@ NAMESPACE AxoStaticMessengerExample {#ix-set:AttributeName = "<#Messenger 1#>"} {#ix-set:MessageText = "<#Message text for messenger 1#>"} {#ix-set:Help = "<#Help text for messenger 1#>"} - {#ix-set:MessageTextList = "[1]:'<#Messenger 1: message text for message code 1#>':'<#Messenger 1: help text for message code 1#>';[2]:'<#Messenger 1: message text for message code 2#>':'<#Messenger 1: help text for message code 2#>';[3]:'<#Messenger 1: message text for message code 3#>':'<#Messenger 1: help text for message code 3#>';[4]:'<#Messenger 1: message text for message code 4#>':'<#Messenger 1: help text for message code 4#>';[5]:'<#Messenger 1: message text for message code 5#>':'<#Messenger 1: help text for message code 5#>';[6]:'<#Messenger 1: message text for message code 6#>':'<#Messenger 1: help text for message code 6#>';[7]:'<#Messenger 1: message text for message code 7#>':'<#Messenger 1: help text for message code 7#>';[8]:'<#Messenger 1: message text for message code 8#>':'<#Messenger 1: help text for message code 8#>';[9]:'<#Messenger 1: message text for message code 9#>':'<#Messenger 1: help text for message code 9#>';[10]:'<#Messenger 1: message text for message code 10#>':'<#Messenger 1: help text for message code 10#>';[11]:'<#Messenger 1: message text for message code 11#>':'<#Messenger 1: help text for message code 11#>'"} + {#ix-set:PlcTextList = "[1]:'<#Messenger 1: message text for message code 1#>':'<#Messenger 1: help text for message code 1#>';[2]:'<#Messenger 1: message text for message code 2#>':'<#Messenger 1: help text for message code 2#>';[3]:'<#Messenger 1: message text for message code 3#>':'<#Messenger 1: help text for message code 3#>';[4]:'<#Messenger 1: message text for message code 4#>':'<#Messenger 1: help text for message code 4#>';[5]:'<#Messenger 1: message text for message code 5#>':'<#Messenger 1: help text for message code 5#>';[6]:'<#Messenger 1: message text for message code 6#>':'<#Messenger 1: help text for message code 6#>';[7]:'<#Messenger 1: message text for message code 7#>':'<#Messenger 1: help text for message code 7#>';[8]:'<#Messenger 1: message text for message code 8#>':'<#Messenger 1: help text for message code 8#>';[9]:'<#Messenger 1: message text for message code 9#>':'<#Messenger 1: help text for message code 9#>';[10]:'<#Messenger 1: message text for message code 10#>':'<#Messenger 1: help text for message code 10#>';[11]:'<#Messenger 1: message text for message code 11#>':'<#Messenger 1: help text for message code 11#>'"} _messenger1 : AXOpen.Messaging.Static.AxoMessenger; {#ix-attr:[Container(Layout.Wrap)]} {#ix-set:AttributeName = "<#Set to high to activate the messenger 1 with default value#>"} _messenger1condition : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 1 with messageCode#>"} + _messenger1conditionWithCode : BOOL; {#ix-set:AttributeName = "<#message 1 code#>"} - _messenger1code : INT; + _messenger1code : UINT; {#ix-attr:[Container(Layout.Stack)]} {#ix-set:AttributeName = "<#Messenger 2#>"} {#ix-set:MessageText = "<#Message text for messenger 2#>"} {#ix-set:Help = "<#Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus neque eros, malesuada ac orci ut, ornare ullamcorper purus. Integer ultrices turpis vel est suscipit blandit. Mauris blandit eros augue, in mollis dui tincidunt vel. Sed placerat augue risus, eget pulvinar felis dictum quis. Aliquam ut interdum nisl. Aliquam et velit id turpis blandit laoreet nec ut ligula. Aliquam ac neque risus. Fusce porta mauris eget nulla iaculis mattis. Etiam auctor mi eget libero laoreet, sed interdum ipsum pellentesque. Maecenas vitae quam vitae velit tincidunt fringilla. Fusce sagittis elit sit amet tempor pretium. Donec elementum, ligula at laoreet mollis, est ipsum elementum lectus, et mollis nisi tellus id erat. In hac habitasse platea dictumst.#>"} - {#ix-set:MessageTextList = "[1]:'<#Messenger 2: message text for message code 1#>':'<#Messenger 2: help text for message code 1#>'[2]:'<#Messenger 2: message text for message code 2#>':'<#Messenger 2: help text for message code 2#>'"} + {#ix-set:PlcTextList = "[1]:'<#Messenger 2: message text for message code 1#>':'<#Messenger 2: help text for message code 1#>'[2]:'<#Messenger 2: message text for message code 2#>':'<#Messenger 2: help text for message code 2#>'"} _messenger2 : AXOpen.Messaging.Static.AxoMessenger; {#ix-attr:[Container(Layout.Wrap)]} {#ix-set:AttributeName = "<#Set to high to activate the messenger 2#>"} _messenger2condition : BOOL; {#ix-set:AttributeName = "<#message 2 code#>"} - _messenger2code : INT; + _messenger2code : UINT; {#ix-attr:[Container(Layout.Stack)]} {#ix-set:AttributeName = "<#Messenger 3#>"} {#ix-set:MessageText = "<#Message text for messenger 3#>"} @@ -39,20 +41,29 @@ NAMESPACE AxoStaticMessengerExample _messenger4 : AXOpen.Messaging.Static.AxoMessenger; {#ix-set:AttributeName = "<#Set to high to activate the messenger 4#>"} _messenger4condition : BOOL; + {#ix-set:AttributeName = "<#Messenger 5#>"} + _messenger5 : AXOpen.Messaging.Static.AxoMessenger; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5#>"} + {#ix-attr:[Container(Layout.Wrap)]} + _messenger5condition : BOOL; + {#ix-set:AttributeName = "<#message 5 code#>"} + _messenger5code : UINT; END_VAR METHOD PROTECTED OVERRIDE Main _messenger1.Serve(THIS); - IF _messenger1condition THEN - - _messenger1.Activate(_messenger1code,eAxoMessageCategory#Error); + IF _messenger1condition AND NOT _messenger1conditionWithCode THEN + _messenger1.Activate(eAxoMessageCategory#Error); END_IF; + _messenger1.ActivateOnCondition(_messenger1code,NOT _messenger1condition AND _messenger1conditionWithCode,eAxoMessageCategory#Error); _messenger2.ActivateOnCondition(_messenger2code,_messenger2condition,eAxoMessageCategory#Warning).RequireAcknowledgement(); _messenger2.Serve(THIS); _messenger3.ActivateOnCondition(_messenger3condition,eAxoMessageCategory#Info); _messenger3.Serve(THIS); _messenger4.ActivateOnCondition(_messenger4condition,eAxoMessageCategory#Info).RequireAcknowledgement(); _messenger4.Serve(THIS); + _messenger5.ActivateOnCondition(_messenger5code,_messenger5condition,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.Serve(THIS); END_METHOD END_CLASS END_NAMESPACE diff --git a/src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st b/src/integrations/ctrl/src/Examples/AXOpen.TextList/AxoTextListExample.st similarity index 100% rename from src/integrations/ctrl/src/Examples/AxoTextList/AxoTextListExample.st rename to src/integrations/ctrl/src/Examples/AXOpen.TextList/AxoTextListExample.st diff --git a/src/integrations/src/AXOpen.Integrations/AXOpen.Messaging/AxoStaticMessengerExample.cs b/src/integrations/src/AXOpen.Integrations/AXOpen.Messaging/AxoStaticMessengerExample.cs new file mode 100644 index 000000000..6bb5c0491 --- /dev/null +++ b/src/integrations/src/AXOpen.Integrations/AXOpen.Messaging/AxoStaticMessengerExample.cs @@ -0,0 +1,42 @@ +using System; +using AXSharp.Connector; +using System.Collections.Generic; +using AXOpen.Messaging.Static; + +namespace AxoStaticMessengerExample +{ + public partial class Messengers : AXOpen.Core.AxoContext + { + partial void PostConstruct(ITwinObject parent, string readableTail, string symbolTail) + { + try + { + InitializeMessenger5(); + } + catch (Exception) + { + + throw; + } + } + private void InitializeMessenger5() + { + List> messengerTextList = new List> + { + new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), + new KeyValuePair(1, new AxoMessengerTextItem("Messenger 5: message text 1", "Messenger 5: help text 1")), + new KeyValuePair(2, new AxoMessengerTextItem("Messenger 5: message text 2", "Messenger 5: help text 2")), + new KeyValuePair(3, new AxoMessengerTextItem("Messenger 5: message text 3", "Messenger 5: help text 3")), + new KeyValuePair(4, new AxoMessengerTextItem("Messenger 5: message text 4", "Messenger 5: help text 4")), + new KeyValuePair(5, new AxoMessengerTextItem("Messenger 5: message text 5", "Messenger 5: help text 5")), + new KeyValuePair(6, new AxoMessengerTextItem("Messenger 5: message text 6", "Messenger 5: help text 6")), + new KeyValuePair(7, new AxoMessengerTextItem("Messenger 5: message text 7", "Messenger 5: help text 7")), + new KeyValuePair(8, new AxoMessengerTextItem("Messenger 5: message text 8", "Messenger 5: help text 8")), + new KeyValuePair(9, new AxoMessengerTextItem("Messenger 5: message text 9", "Messenger 5: help text 9")), + new KeyValuePair(10, new AxoMessengerTextItem("Messenger 5: message text 10", "Messenger 5: help text 10")) + }; + + _messenger5.DotNetMessengerTextList = messengerTextList; + } + } +} \ No newline at end of file diff --git a/src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs b/src/integrations/src/AXOpen.Integrations/AXOpen.TextList/AxoTextListExample.cs similarity index 100% rename from src/integrations/src/AXOpen.Integrations/AxoTextListExample/AxoTextListExampleContext.cs rename to src/integrations/src/AXOpen.Integrations/AXOpen.TextList/AxoTextListExample.cs diff --git a/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj b/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj index b6bd92f81..df6c40772 100644 --- a/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj +++ b/src/integrations/src/AXOpen.Integrations/axopen_integrations.csproj @@ -19,6 +19,12 @@ + + + + + + diff --git a/src/templates.simple/ctrl/apax.yml b/src/templates.simple/ctrl/apax.yml index 35b40ee13..6c8665c2f 100644 --- a/src/templates.simple/ctrl/apax.yml +++ b/src/templates.simple/ctrl/apax.yml @@ -68,4 +68,4 @@ scripts: - apax install - apax rr targets: - - axunit-llvm + - plcsim From f75e2c1ac83a7c6dcc6db1f53ee3ff99584997ec Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Mon, 28 Aug 2023 18:00:24 +0200 Subject: [PATCH 15/28] component.pneumatics-message list moved to the .NET side --- .../ctrl/src/AxoCylinder.st | 2 +- .../AxoCylinder/AxoCylinder.cs | 32 ++++++++++++++++++- .../AxoStaticMessengerExample.cs | 2 -- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/components.pneumatics/ctrl/src/AxoCylinder.st b/src/components.pneumatics/ctrl/src/AxoCylinder.st index 466778c35..4b3d1919f 100644 --- a/src/components.pneumatics/ctrl/src/AxoCylinder.st +++ b/src/components.pneumatics/ctrl/src/AxoCylinder.st @@ -36,7 +36,7 @@ NAMESPACE AXOpen.Components.Pneumatics {#ix-attr:[ReadOnly()]} {#ix-set:AttributeName = "<#Move work signal#>"} _MoveWorkSignal : BOOL; - {#ix-set:PlcTextList = "[1]:'<#Movement to work position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[2]:'<#Movement to home position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[3]:'<#Home and work position sensors are both active at the same time.#>':'<#Check the position of sensors.#>';[4]:'<#Movement to work position is temporarily suspended.#>':'<#Check the blocking condition.#>';[5]:'<#Movement to home position is temporarily suspended.#>':'<#Check the blocking condition.#>';[6]:'<#Movement to work position is aborted.#>':'<#Check the blocking condition.#>';[7]:'<#Movement to home position is aborted.#>':'<#Check the blocking condition.#>';"} +// {#ix-set:PlcTextList = "[1]:'<#Movement to work position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[2]:'<#Movement to home position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[3]:'<#Home and work position sensors are both active at the same time.#>':'<#Check the position of sensors.#>';[4]:'<#Movement to work position is temporarily suspended.#>':'<#Check the blocking condition.#>';[5]:'<#Movement to home position is temporarily suspended.#>':'<#Check the blocking condition.#>';[6]:'<#Movement to work position is aborted.#>':'<#Check the blocking condition.#>';[7]:'<#Movement to home position is aborted.#>':'<#Check the blocking condition.#>';"} _Messenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR diff --git a/src/components.pneumatics/src/AXOpen.Components.Pneumatics/AxoCylinder/AxoCylinder.cs b/src/components.pneumatics/src/AXOpen.Components.Pneumatics/AxoCylinder/AxoCylinder.cs index 82d3f49f4..699aee312 100644 --- a/src/components.pneumatics/src/AXOpen.Components.Pneumatics/AxoCylinder/AxoCylinder.cs +++ b/src/components.pneumatics/src/AXOpen.Components.Pneumatics/AxoCylinder/AxoCylinder.cs @@ -1,8 +1,38 @@ +using AXOpen.Messaging.Static; +using AXSharp.Connector; +using System; +using System.Collections.Generic; + namespace AXOpen.Components.Pneumatics { public partial class AxoCylinder : AXOpen.Core.AxoComponent { + partial void PostConstruct(ITwinObject parent, string readableTail, string symbolTail) + { + try + { + InitializeMessenger(); + } + catch (Exception) + { + throw; + } + } + private void InitializeMessenger() + { + List> messengerTextList = new List> + { + new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), + new KeyValuePair(1, new AxoMessengerTextItem("Movement to work position did not succeed.", "Check the cyclinder that it is free to move, air pressure input and extremity sensor.")), + new KeyValuePair(2, new AxoMessengerTextItem("Movement to home position did not succeed.", "Check the cyclinder that it is free to move, air pressure input and extremity sensor.")), + new KeyValuePair(3, new AxoMessengerTextItem("Home and work position sensors are both active at the same time.", "Check the positions of the sensors.")), + new KeyValuePair(4, new AxoMessengerTextItem("Movement to work position is temporarily suspended.", "Check the blocking condition.")), + new KeyValuePair(5, new AxoMessengerTextItem("Movement to home position is temporarily suspended.", "Check the blocking condition.")), + new KeyValuePair(6, new AxoMessengerTextItem("Movement to work position is aborted.", "Check the blocking condition.")), + new KeyValuePair(7, new AxoMessengerTextItem("Movement to home position is aborted.", "Check the blocking condition.")), + }; + _Messenger.DotNetMessengerTextList = messengerTextList; + } } } - diff --git a/src/integrations/src/AXOpen.Integrations/AXOpen.Messaging/AxoStaticMessengerExample.cs b/src/integrations/src/AXOpen.Integrations/AXOpen.Messaging/AxoStaticMessengerExample.cs index 6bb5c0491..eb3c8ef35 100644 --- a/src/integrations/src/AXOpen.Integrations/AXOpen.Messaging/AxoStaticMessengerExample.cs +++ b/src/integrations/src/AXOpen.Integrations/AXOpen.Messaging/AxoStaticMessengerExample.cs @@ -1,6 +1,4 @@ -using System; using AXSharp.Connector; -using System.Collections.Generic; using AXOpen.Messaging.Static; namespace AxoStaticMessengerExample From bd4a3cdea04d73447e095fba4d8e8f1f60f1426a Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Tue, 29 Aug 2023 17:24:26 +0200 Subject: [PATCH 16/28] Cognex insight: added messengers --- src/components.cognex.vision/app/apax.yml | 4 +- src/components.cognex.vision/app/insight.mon | 6 +- .../app/ix-blazor/App.razor | 2 +- .../app/ix-blazor/Usings.cs | 1 + .../app/ix-blazor/_Imports.razor | 5 + ...s_cognex_vision_integrations_blazor.csproj | 33 +---- .../app/src/AXOpen.AxoRtc/AxoS71500Rtc.st | 7 + .../app/src/configuration.st | 1 + .../app/src/program.st | 2 + src/components.cognex.vision/ctrl/apax.yml | 1 + .../ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st | 47 ++++++- .../Tasks/AxoInsightChangeJobByName.st | 59 +++++--- .../Tasks/AxoInsightChangeJobByNumber.st | 49 ++++--- .../Tasks/AxoInsightClearInspectionResults.st | 55 +++++--- .../v_6_0_0/Tasks/AxoInsightSoftEvent.st | 49 ++++--- .../v_6_0_0/Tasks/AxoInsightTrigger.st | 44 ++++-- .../src/AXOpen.Cognex.Vision.Blazor/Usings.cs | 1 + .../_Imports.razor | 1 + .../axopen_cognex_vision_blazor.csproj | 40 +++++- .../AxoInsight/v_6_0_0/AxoInsight.cs | 126 ++++++++++++++---- .../ctrl/src/AxoCylinder.st | 1 - ...AXOpen.Components.Pneumatics.blazor.csproj | 5 - .../src/AxoMessaging/Static/AxoMessenger.st | 29 ++++ .../AxoStaticMessengerExample.st | 12 +- 24 files changed, 410 insertions(+), 170 deletions(-) create mode 100644 src/components.cognex.vision/app/ix-blazor/Usings.cs create mode 100644 src/components.cognex.vision/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st create mode 100644 src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/Usings.cs diff --git a/src/components.cognex.vision/app/apax.yml b/src/components.cognex.vision/app/apax.yml index 65f5f27a9..750fae655 100644 --- a/src/components.cognex.vision/app/apax.yml +++ b/src/components.cognex.vision/app/apax.yml @@ -6,8 +6,10 @@ devDependencies: "@ax/sld": ^0.15.9 dependencies: "@ix-ax/axopen.cognex.vision": '0.1.4-alpha.79' + "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' variables: - APAX_BUILD_ARGS: [-d] + APAX_BUILD_ARGS: + - "--debug" # Generate debug information for target "1500" scripts: ixc: - START=$(date +%s) diff --git a/src/components.cognex.vision/app/insight.mon b/src/components.cognex.vision/app/insight.mon index 74cf8cfec..8cb973a6f 100644 --- a/src/components.cognex.vision/app/insight.mon +++ b/src/components.cognex.vision/app/insight.mon @@ -1,5 +1,5 @@ -AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask._progress -AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask._jobName +#AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask._progress +#AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask._jobName #AxoCognexVisionExampleContext.MyInsight.Status.Action.Id #AxoCognexVisionExampleContext.MyInsight.Status.Error.Id #AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask @@ -10,3 +10,5 @@ AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask._jobName #AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask.SetUserDataAsString()._maxIndex #AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask.SetUserDataAsString.inPosition #AxoCognexVisionExampleContext.MyInsight.ChangeJobByNameTask.SetUserDataAsString. +AxoCognexVisionExampleContext.MyInsight._Messenger +AxoCognexVisionExampleContext.MyInsight._TaskMessenger diff --git a/src/components.cognex.vision/app/ix-blazor/App.razor b/src/components.cognex.vision/app/ix-blazor/App.razor index 5c9add5ac..da34e6e0f 100644 --- a/src/components.cognex.vision/app/ix-blazor/App.razor +++ b/src/components.cognex.vision/app/ix-blazor/App.razor @@ -14,4 +14,4 @@ - + \ No newline at end of file diff --git a/src/components.cognex.vision/app/ix-blazor/Usings.cs b/src/components.cognex.vision/app/ix-blazor/Usings.cs new file mode 100644 index 000000000..7cd5f91b2 --- /dev/null +++ b/src/components.cognex.vision/app/ix-blazor/Usings.cs @@ -0,0 +1 @@ +global using AXOpen.Core; \ No newline at end of file diff --git a/src/components.cognex.vision/app/ix-blazor/_Imports.razor b/src/components.cognex.vision/app/ix-blazor/_Imports.razor index 49039dd26..edcab670b 100644 --- a/src/components.cognex.vision/app/ix-blazor/_Imports.razor +++ b/src/components.cognex.vision/app/ix-blazor/_Imports.razor @@ -1,4 +1,5 @@ @using System.Net.Http +@using AXOpen.Core.Resources @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.Authorization @using Microsoft.AspNetCore.Components.Forms @@ -11,3 +12,7 @@ @using AXSharp.Presentation.Blazor.Controls.RenderableContent @using axopen_components_cognex_vision_integrations @using AXOpen.Core; + + + + diff --git a/src/components.cognex.vision/app/ix-blazor/axopen_components_cognex_vision_integrations_blazor.csproj b/src/components.cognex.vision/app/ix-blazor/axopen_components_cognex_vision_integrations_blazor.csproj index 6557c0948..73a6b4047 100644 --- a/src/components.cognex.vision/app/ix-blazor/axopen_components_cognex_vision_integrations_blazor.csproj +++ b/src/components.cognex.vision/app/ix-blazor/axopen_components_cognex_vision_integrations_blazor.csproj @@ -4,16 +4,9 @@ net7.0 enable enable + false - - - - - - - - @@ -24,28 +17,4 @@ - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - diff --git a/src/components.cognex.vision/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st b/src/components.cognex.vision/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st new file mode 100644 index 000000000..3f919d692 --- /dev/null +++ b/src/components.cognex.vision/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st @@ -0,0 +1,7 @@ +NAMESPACE AxoRtc + CLASS AxoS71500Rtc IMPLEMENTS AXOpen.Rtc.IAxoRtc + METHOD PUBLIC NowUTC : LDATE_AND_TIME + Siemens.Simatic.S71500.Clocks.GetSystemDateTime(value => NowUTC); + END_METHOD + END_CLASS +END_NAMESPACE diff --git a/src/components.cognex.vision/app/src/configuration.st b/src/components.cognex.vision/app/src/configuration.st index ab55d02e7..265e920f2 100644 --- a/src/components.cognex.vision/app/src/configuration.st +++ b/src/components.cognex.vision/app/src/configuration.st @@ -8,6 +8,7 @@ CONFIGURATION MyConfiguration {#ix-set:AttributeName = "If counting PLC is alive"} I_am_alive : ULINT; AxoCognexVisionExampleContext : AxoCognexVisionExample.AxoCognexVisionExampleContext; + AxoRtc : AxoRtc.AxoS71500Rtc; END_VAR //Copy this VAR_GLOBAL section into your configuration file inside your project. diff --git a/src/components.cognex.vision/app/src/program.st b/src/components.cognex.vision/app/src/program.st index 95d141c44..2f04cc852 100644 --- a/src/components.cognex.vision/app/src/program.st +++ b/src/components.cognex.vision/app/src/program.st @@ -4,6 +4,7 @@ PROGRAM MyProgram AxoCognexVisionExampleContext : AxoCognexVisionExample.AxoCognexVisionExampleContext; PlcInputs : PlcInputs; PlcOutputs : PlcOutputs; + AxoRtc : AxoRtc.AxoS71500Rtc; END_VAR CopyInputs(); @@ -13,6 +14,7 @@ PROGRAM MyProgram AxoCognexVisionExampleContext.PlcInputs := REF(PlcInputs); AxoCognexVisionExampleContext.PlcOutputs := REF(PlcOutputs); AxoCognexVisionExampleContext.Run(); + AxoCognexVisionExampleContext.InjectRtc(AxoRtc); CopyOutputs(); END_PROGRAM diff --git a/src/components.cognex.vision/ctrl/apax.yml b/src/components.cognex.vision/ctrl/apax.yml index e3beb3846..cf7d733e5 100644 --- a/src/components.cognex.vision/ctrl/apax.yml +++ b/src/components.cognex.vision/ctrl/apax.yml @@ -14,6 +14,7 @@ scripts: - dotnet ixc dependencies: "@ix-ax/axopen.components.abstractions": '0.1.4-alpha.79' + "@ix-ax/axopen.core": '0.1.4-alpha.79' "@ix-ax/axopen.utils": '0.1.4-alpha.79' "@ax/system-timer": ^4.0.1 "@ax/system-strings": ^5.0.12 diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st index 94b598820..eefffa55b 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st @@ -1,3 +1,5 @@ +USING AXOpen.Messaging.Static; +USING AXOpen.Messaging; USING AXOpen.Core; USING AXOpen.Components.Abstractions; @@ -125,6 +127,11 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-set:AttributeName = "<#User data#>"} {#ix-attr:[ReadOnly()]} User : AxoInsight_UserData; + + {#ix-attr:[ReadOnly()]} + _Messenger : AXOpen.Messaging.Static.AxoMessenger; + {#ix-attr:[ReadOnly()]} + _TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR VAR PRIVATE @@ -141,6 +148,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.Action.Id := UINT#0; Status.Error.Id := UINT#0; Status.CurrentJobName := ''; + _Messenger.Restore(); + _TaskMessenger.Restore(); + ClearInspectionResultsTask.Restore(); TriggerTask.Restore(); @@ -271,6 +281,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.ResultDataSize := eAxoInsight_ResultDataSize#RESULT_DATA_SIZE_INVALID; END_IF; + _Messenger.ActivateOnCondition(ULINT#711,Status.ResultDataSize = eAxoInsight_ResultDataSize#RESULT_DATA_SIZE_INVALID, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#712,LOWER_BOUND(refResultData^,1) <> 0, eAxoMessageCategory#ProgrammingError); + IF(Status.ResultDataSize <> eAxoInsight_ResultDataSize#RESULT_DATA_SIZE_INVALID) THEN Results.InspectionID.%B1 := refResultData^[0]; Results.InspectionID.%B0 := refResultData^[1]; @@ -329,6 +342,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ELSIF (UPPER_BOUND(refUserData^,1) = 253) THEN Status.UserDataSize := eAxoInsight_UserDataSize#USER_DATA_254B; ELSE + Status.UserDataSize := eAxoInsight_UserDataSize#USER_DATA_SIZE_INVALID; Status.Error.Id := UINT#713; UpdateOutputs := FALSE; END_IF; @@ -336,6 +350,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.Error.Id := UINT#714; UpdateOutputs := FALSE; END_IF; + _Messenger.ActivateOnCondition(ULINT#713,Status.UserDataSize = eAxoInsight_UserDataSize#USER_DATA_SIZE_INVALID, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#714,LOWER_BOUND(refUserData^,1) <> 0, eAxoMessageCategory#ProgrammingError); + IF User.DataChanged <> UserDataChanged THEN FOR index := 0 TO Status.UserDataSize - 1 DO refUserData^[index] := User.Data[index]; @@ -381,6 +398,17 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ELSE IsValidReferences := TRUE; END_IF; + + _Messenger.ActivateOnCondition(ULINT#701,refAcquisitionControl = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#702,refAcquisitionStatus = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#703,refInspectionControl = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#704,refInspectionStatus = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#705,refCommandControl = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#706,refCommandStatus = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#707,refSoftEventControl = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#708,refSoftEventStatus = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#709,refResultData = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#710,refUserData = NULL, eAxoMessageCategory#ProgrammingError); END_METHOD METHOD PROTECTED OVERRIDE Open @@ -405,6 +433,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.Error.Id := UINT#700; RETURN; END_IF; + + _Messenger.ActivateOnCondition(ULINT#700,parent = NULL, eAxoMessageCategory#ProgrammingError); + IF NOT THIS.IsValidReferences(refAcquisitionControl,refAcquisitionStatus,refInspectionControl,refInspectionStatus,refCommandControl,refCommandStatus,refSoftEventControl,refSoftEventStatus,refResultData,refUserData) THEN RETURN; END_IF; @@ -432,6 +463,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.Error.Id := UINT#700; RETURN; END_IF; + + _Messenger.ActivateOnCondition(ULINT#700,parent = NULL, eAxoMessageCategory#ProgrammingError); + IF NOT THIS.IsValidReferences(refAcquisitionControl,refAcquisitionStatus,refInspectionControl,refInspectionStatus,refCommandControl,refCommandStatus,refSoftEventControl,refSoftEventStatus,refResultData,refUserData) THEN RETURN; END_IF; @@ -461,6 +495,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ChangeJobByNameTask.Initialize(THIS); ChangeJobByNumberTask.Initialize(THIS); SoftEventTask.Initialize(THIS); + + _Messenger.Serve(THIS); + // _TaskMessenger.Serve(THIS); THIS.UpdateInputs(refAcquisitionStatus,refInspectionStatus,refCommandStatus,refSoftEventStatus,refResultData); @@ -475,31 +512,31 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 //*************CLEAR*DATA***************** _taskDisabled := _taskDisabled OR RestoreTask.IsBusy(); ClearInspectionResultsTask.IsDisabled := _taskDisabled; - ClearInspectionResultsTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(Config),REF(Status),REF(Results),REF(InspectionResults)); + ClearInspectionResultsTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(Config),REF(Status),REF(Results),REF(InspectionResults),REF(_TaskMessenger)); //**************************************** //*************READ*********************** _taskDisabled := _taskDisabled OR ClearInspectionResultsTask.IsBusy(); TriggerTask.IsDisabled := _taskDisabled; - TriggerTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(Results),REF(InspectionResults),refResultData); + TriggerTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(Results),REF(InspectionResults),refResultData,REF(_TaskMessenger)); //**************************************** //*************CHANGE JOB BY NAME********* _taskDisabled := _taskDisabled OR TriggerTask.IsBusy(); ChangeJobByNameTask.IsDisabled := _taskDisabled; - ChangeJobByNameTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(User)); + ChangeJobByNameTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(User),REF(_TaskMessenger)); //**************************************** //*************CHANGE JOB BY NUMBER******* _taskDisabled := _taskDisabled OR ChangeJobByNameTask.IsBusy(); ChangeJobByNumberTask.IsDisabled := _taskDisabled; - ChangeJobByNumberTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status)); + ChangeJobByNumberTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(_TaskMessenger)); //**************************************** //*************Soft event***************** _taskDisabled := _taskDisabled OR ChangeJobByNameTask.IsBusy(); SoftEventTask.IsDisabled := _taskDisabled; - SoftEventTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(SoftEventControl),REF(SoftEventStatus)); + SoftEventTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(SoftEventControl),REF(SoftEventStatus),REF(_TaskMessenger)); //**************************************** THIS.UpdateOutputs(refAcquisitionControl,refInspectionControl,refCommandControl,refSoftEventControl,refUserData); diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByName.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByName.st index c6852b2ce..4d8cb5830 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByName.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByName.st @@ -1,6 +1,8 @@ USING AXOpen.Core; USING System.Strings; USING System.SerDe; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoInsightChangeJobByName EXTENDS AXOpen.Core.AxoTask @@ -11,10 +13,11 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR VAR PRIVATE - _infoTime : LTIME := LT#2S; - _errorTime : LTIME := LT#5S; - _Status : REF_TO AxoInsight_Status; - _jobName : STRING; + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + _refStatus : REF_TO AxoInsight_Status; + _refMessenger : REF_TO AxoMessenger; + _jobName : STRING; END_VAR METHOD PUBLIC Run @@ -27,17 +30,20 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refConfig : REF_TO AxoInsight_Config; refStatus : REF_TO AxoInsight_Status; refUser : REF_TO AxoInsight_UserData; - // refUser : REF_TO AxoInsight_User; + refMessenger : REF_TO AxoMessenger; END_VAR _infoTime := refConfig^.InfoTime; _errorTime := refConfig^.ErrorTime; - _Status := refStatus; + _refStatus := refStatus; + _refMessenger := refMessenger; IF THIS.Execute() THEN + _refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#311; refStatus^.Error.Id := UINT#0; + refMessenger^.Restore(); refStatus^.CurrentJobName := ''; refStatus^.CurrentJobNumber := UINT#0; THIS.CallTimers(FALSE); @@ -46,6 +52,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 1 THEN THIS.CallTimers(FALSE); + refMessenger^.ActivateOnCondition(ULINT#715, _jobName='', eAxoMessageCategory#Error); + IF _jobName='' THEN refStatus^.Error.Id := UINT#715; THIS.ThrowWhen(TRUE); @@ -55,6 +63,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 2 THEN + refMessenger^.ActivateOnCondition(ULINT#608, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#608; END_IF; @@ -69,6 +78,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 3 THEN + refMessenger^.ActivateOnCondition(ULINT#609, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#609; END_IF; @@ -81,6 +91,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 4 THEN + refMessenger^.ActivateOnCondition(ULINT#610, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#610; END_IF; @@ -95,6 +106,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 5 THEN + refMessenger^.ActivateOnCondition(ULINT#611, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#611; END_IF; @@ -107,6 +119,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 6 THEN + refMessenger^.ActivateOnCondition(ULINT#612, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#612; END_IF; @@ -120,6 +133,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 7 THEN + refMessenger^.ActivateOnCondition(ULINT#613, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#613; END_IF; @@ -133,6 +147,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 8 THEN + refMessenger^.ActivateOnCondition(ULINT#614, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#614; END_IF; @@ -150,6 +165,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 9 THEN + refMessenger^.ActivateOnCondition(ULINT#615, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#615; END_IF; @@ -164,6 +180,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 10 THEN + refMessenger^.ActivateOnCondition(ULINT#616, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#616; END_IF; @@ -189,6 +206,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 20 THEN refStatus^.Error.Id := UINT#718; + _refMessenger^.ActivateOnCondition(ULINT#718, TRUE , eAxoMessageCategory#Error); refInspectionControl^.ExecuteCommand := FALSE; refAcquisitionControl^.SetOffline := FALSE; refCommandControl^.Command := UINT#0; @@ -217,7 +235,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; END_METHOD - METHOD INTERNAL SetUserDataAsString : BOOL + METHOD INTERNAL SetUserDataAsString : BOOL VAR_INPUT inValue : STRING; inPosition : UINT; @@ -237,10 +255,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _maxIndex := UINT#254; + _refMessenger^.ActivateOnCondition(ULINT#716, (inPosition +_size) >= TO_UINT(refStatus^.UserDataSize), eAxoMessageCategory#Error); + IF (inPosition +_size) >= TO_UINT(refStatus^.UserDataSize) THEN refStatus^.Error.Id := UINT#716; RETURN; END_IF; + + _refMessenger^.ActivateOnCondition(ULINT#717, (inPosition +_size) > _maxIndex ,eAxoMessageCategory#Error); IF (inPosition +_size) > _maxIndex THEN refStatus^.Error.Id := UINT#717; @@ -270,34 +292,35 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore - _Status^.Action.Id := UINT#313; - _Status^.Error.Id := UINT#0; - _Status^.CurrentJobName := ''; + _refStatus^.Action.Id := UINT#313; + _refStatus^.Error.Id := UINT#0; + _refMessenger^.Restore(); + _refStatus^.CurrentJobName := ''; _progress := 0; THIS.CallTimers(FALSE); END_METHOD METHOD PROTECTED OVERRIDE OnAbort - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#602; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#602; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#312; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#312; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#702; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#702; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#310; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#310; END_IF; END_METHOD diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByNumber.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByNumber.st index cba04e106..862a6105b 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByNumber.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByNumber.st @@ -1,6 +1,8 @@ USING AXOpen.Core; USING System.Strings; USING System.SerDe; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoInsightChangeJobByNumber EXTENDS AXOpen.Core.AxoTask @@ -11,10 +13,11 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR VAR PRIVATE - _infoTime : LTIME := LT#2S; - _errorTime : LTIME := LT#5S; - _Status : REF_TO AxoInsight_Status; - _jobNumber : UINT; + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + _refStatus : REF_TO AxoInsight_Status; + _refMessenger : REF_TO AxoMessenger; + _jobNumber : UINT; END_VAR METHOD PUBLIC Run @@ -26,16 +29,20 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refCommandControl : REF_TO AxoInsight_CommandControl; refConfig : REF_TO AxoInsight_Config; refStatus : REF_TO AxoInsight_Status; + refMessenger : REF_TO AxoMessenger; END_VAR _infoTime := refConfig^.InfoTime; _errorTime := refConfig^.ErrorTime; - _Status := refStatus; + _refStatus := refStatus; + _refMessenger := refMessenger; IF THIS.Execute() THEN + _refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#315; refStatus^.Error.Id := UINT#0; + refMessenger^.Restore(); refStatus^.CurrentJobName := ''; refStatus^.CurrentJobNumber := UINT#0; THIS.CallTimers(FALSE); @@ -45,6 +52,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 1 THEN THIS.CallTimers(FALSE); + _refMessenger^.ActivateOnCondition(ULINT#719, _jobNumber > refConfig^.MaxJobNumber, eAxoMessageCategory#Error); + IF _jobNumber > refConfig^.MaxJobNumber THEN refStatus^.Error.Id := UINT#719; THIS.ThrowWhen(TRUE); @@ -54,6 +63,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 2 THEN + refMessenger^.ActivateOnCondition(ULINT#608, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#608; END_IF; @@ -68,6 +78,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 3 THEN + refMessenger^.ActivateOnCondition(ULINT#609, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#609; END_IF; @@ -80,6 +91,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 4 THEN + refMessenger^.ActivateOnCondition(ULINT#610, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#610; END_IF; @@ -94,6 +106,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 5 THEN + refMessenger^.ActivateOnCondition(ULINT#614, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#614; END_IF; @@ -111,6 +124,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 6 THEN + refMessenger^.ActivateOnCondition(ULINT#615, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#615; END_IF; @@ -125,6 +139,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 7 THEN + refMessenger^.ActivateOnCondition(ULINT#616, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#616; END_IF; @@ -149,6 +164,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 IF _progress = 20 THEN refStatus^.Error.Id := UINT#720; + _refMessenger^.ActivateOnCondition(ULINT#720, TRUE , eAxoMessageCategory#Error); refInspectionControl^.ExecuteCommand := FALSE; refAcquisitionControl^.SetOffline := FALSE; refCommandControl^.Command := UINT#0; @@ -172,34 +188,35 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore - _Status^.Action.Id := UINT#317; - _Status^.Error.Id := UINT#0; - _Status^.CurrentJobNumber := UINT#0; + _refStatus^.Action.Id := UINT#317; + _refStatus^.Error.Id := UINT#0; + _refMessenger^.Restore(); + _refStatus^.CurrentJobNumber := UINT#0; _progress := 0; THIS.CallTimers(FALSE); END_METHOD METHOD PROTECTED OVERRIDE OnAbort - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#603; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#603; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#316; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#316; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#703; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#703; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#314; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#314; END_IF; END_METHOD diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightClearInspectionResults.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightClearInspectionResults.st index bbafb6835..6e5ed6bce 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightClearInspectionResults.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightClearInspectionResults.st @@ -1,4 +1,6 @@ USING AXOpen.Core; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoInsightClearInspectionResults EXTENDS AXOpen.Core.AxoTask @@ -9,21 +11,23 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR VAR PRIVATE - _infoTime : LTIME := LT#2S; - _errorTime : LTIME := LT#5S; - _Status : REF_TO AxoInsight_Status; + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + _refStatus : REF_TO AxoInsight_Status; + _refMessenger : REF_TO AxoMessenger; END_VAR METHOD PUBLIC Run VAR_INPUT - refAcquisitionControl : REF_TO AxoInsight_AcquisitionControl; - refAcquisitionStatus : REF_TO AxoInsight_AcquisitionStatus; - refInspectionControl : REF_TO AxoInsight_InspectionControl; - refInspectionStatus : REF_TO AxoInsight_InspectionStatus; - refConfig : REF_TO AxoInsight_Config; - refStatus : REF_TO AxoInsight_Status; - refResults : REF_TO AxoInsight_Results; - refInspectionResults : REF_TO AxoInsight_ResultData; + refAcquisitionControl : REF_TO AxoInsight_AcquisitionControl; + refAcquisitionStatus : REF_TO AxoInsight_AcquisitionStatus; + refInspectionControl : REF_TO AxoInsight_InspectionControl; + refInspectionStatus : REF_TO AxoInsight_InspectionStatus; + refConfig : REF_TO AxoInsight_Config; + refStatus : REF_TO AxoInsight_Status; + refResults : REF_TO AxoInsight_Results; + refInspectionResults : REF_TO AxoInsight_ResultData; + refMessenger : REF_TO AxoMessenger; END_VAR VAR @@ -32,11 +36,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _infoTime := refConfig^.InfoTime; _errorTime := refConfig^.ErrorTime; - _Status := refStatus; + _refStatus := refStatus; + _refMessenger := refMessenger; + IF THIS.Execute() THEN + _refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#302; refStatus^.Error.Id := UINT#0; + refMessenger^.Restore(); THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; @@ -58,9 +66,11 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 2 THEN + refMessenger^.ActivateOnCondition(ULINT#601, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#601; END_IF; + IF NOT refInspectionStatus^.ResultsValid THEN THIS.CallTimers(FALSE); _progress := _progress + 1; @@ -91,33 +101,34 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore - _Status^.Action.Id := UINT#308; - _Status^.Error.Id := UINT#0; + _refStatus^.Action.Id := UINT#308; + _refStatus^.Error.Id := UINT#0; + _refMessenger^.Restore(); _progress := 0; THIS.CallTimers(FALSE); END_METHOD METHOD PROTECTED OVERRIDE OnAbort - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#600; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#600; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#303; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#303; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#700; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#700; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#301; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#301; END_IF; END_METHOD END_CLASS diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightSoftEvent.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightSoftEvent.st index f41d92ed5..2559ec455 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightSoftEvent.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightSoftEvent.st @@ -1,6 +1,8 @@ USING AXOpen.Core; USING System.Strings; USING System.SerDe; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoInsightSoftEvent EXTENDS AXOpen.Core.AxoTask @@ -11,10 +13,11 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR VAR PRIVATE - _infoTime : LTIME := LT#2S; - _errorTime : LTIME := LT#5S; - _Status : REF_TO AxoInsight_Status; - _softEventNumber : UINT; + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + _refStatus : REF_TO AxoInsight_Status; + _refMessenger : REF_TO AxoMessenger; + _softEventNumber : UINT; END_VAR METHOD PUBLIC Run @@ -28,25 +31,28 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refStatus : REF_TO AxoInsight_Status; refTriggerSoftEvent : REF_TO AxoInsight_SoftEventControl; refTriggerSoftEventAcknowledge : REF_TO AxoInsight_SoftEventStatus; + refMessenger : REF_TO AxoMessenger; END_VAR _infoTime := refConfig^.InfoTime; _errorTime := refConfig^.ErrorTime; - _Status := refStatus; + _refStatus := refStatus; + _refMessenger := refMessenger; IF THIS.Execute() THEN + _refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#319; refStatus^.Error.Id := UINT#0; - refStatus^.CurrentJobName := ''; - refStatus^.CurrentJobNumber := UINT#0; + refMessenger^.Restore(); THIS.CallTimers(FALSE); _progress := _progress + 1; - END_IF; IF _progress = 1 THEN THIS.CallTimers(FALSE); + _refMessenger^.ActivateOnCondition(ULINT#721, _softEventNumber > UINT#7, eAxoMessageCategory#Error); + IF _softEventNumber > UINT#7 THEN refStatus^.Error.Id := UINT#721; THIS.ThrowWhen(TRUE); @@ -61,6 +67,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 3 THEN + refMessenger^.ActivateOnCondition(ULINT#617, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN refStatus^.Error.Id := UINT#617; END_IF; @@ -75,6 +83,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 4 THEN + refMessenger^.ActivateOnCondition(ULINT#618, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN refStatus^.Error.Id := UINT#618; END_IF; @@ -110,34 +120,35 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore - _Status^.Action.Id := UINT#321; - _Status^.Error.Id := UINT#0; - _Status^.CurrentJobNumber := UINT#0; + _refStatus^.Action.Id := UINT#321; + _refStatus^.Error.Id := UINT#0; + _refMessenger^.Restore(); + _refStatus^.CurrentJobNumber := UINT#0; _progress := 0; THIS.CallTimers(FALSE); END_METHOD METHOD PROTECTED OVERRIDE OnAbort - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#604; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#604; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#320; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#320; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#704; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#704; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#318; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#318; END_IF; END_METHOD diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightTrigger.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightTrigger.st index 29cf074c1..99216fc01 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightTrigger.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightTrigger.st @@ -1,4 +1,6 @@ USING AXOpen.Core; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoInsightTrigger EXTENDS AXOpen.Core.AxoTask @@ -9,9 +11,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR VAR PRIVATE - _infoTime : LTIME := LT#2S; - _errorTime : LTIME := LT#5S; - _Status : REF_TO AxoInsight_Status; + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + _refStatus : REF_TO AxoInsight_Status; + _refMessenger : REF_TO AxoMessenger; END_VAR METHOD PUBLIC Run @@ -26,6 +29,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refResults : REF_TO AxoInsight_Results; refInspectionResults : REF_TO AxoInsight_ResultData; refResultData : REF_TO ARRAY[*] OF BYTE; + refMessenger : REF_TO AxoMessenger; END_VAR VAR @@ -35,12 +39,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _infoTime := refConfig^.InfoTime; _errorTime := refConfig^.ErrorTime; - _Status := refStatus; + _refStatus := refStatus; + _refMessenger := refMessenger; IF THIS.Execute() THEN + _refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#305; refStatus^.Error.Id := UINT#0; + refMessenger^.Restore(); THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; @@ -62,6 +69,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 2 THEN + refMessenger^.ActivateOnCondition(ULINT#600, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#600; END_IF; @@ -74,6 +82,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 3 THEN + refMessenger^.ActivateOnCondition(ULINT#601, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#601; END_IF; @@ -86,6 +95,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 4 THEN + refMessenger^.ActivateOnCondition(ULINT#602, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#602; END_IF; @@ -98,6 +108,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 5 THEN + refMessenger^.ActivateOnCondition(ULINT#603, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#603; END_IF; @@ -110,6 +121,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 6 THEN + refMessenger^.ActivateOnCondition(ULINT#604, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#604; END_IF; @@ -122,6 +134,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 7 THEN + refMessenger^.ActivateOnCondition(ULINT#605, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#605; END_IF; @@ -134,6 +147,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 8 THEN + refMessenger^.ActivateOnCondition(ULINT#606, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#606; END_IF; @@ -145,6 +159,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 9 THEN + refMessenger^.ActivateOnCondition(ULINT#607, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#607; END_IF; @@ -185,33 +200,34 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore - _Status^.Action.Id := UINT#309; - _Status^.Error.Id := UINT#0; + _refStatus^.Action.Id := UINT#309; + _refStatus^.Error.Id := UINT#0; + _refMessenger^.Restore(); _progress := 0; THIS.CallTimers(FALSE); END_METHOD METHOD PROTECTED OVERRIDE OnAbort - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#601; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#601; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#306; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#306; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#701; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#701; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#304; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#304; END_IF; END_METHOD END_CLASS diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/Usings.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/Usings.cs new file mode 100644 index 000000000..7cd5f91b2 --- /dev/null +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/Usings.cs @@ -0,0 +1 @@ +global using AXOpen.Core; \ No newline at end of file diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor index 9ec08f956..061398d16 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/_Imports.razor @@ -1,2 +1,3 @@ @using Microsoft.AspNetCore.Components.Web @using AXSharp.Presentation.Blazor.Controls.RenderableContent +@using Microsoft.AspNetCore.Components.Authorization \ No newline at end of file diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj index f35e11913..859b80a00 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision.Blazor/axopen_cognex_vision_blazor.csproj @@ -4,8 +4,32 @@ net7.0 enable enable - AXOpen.Cognex.Vision.Blazor + AXOpen.Cognex.Vision.Blazor + + + This library is part of AXOpen framework + AXOpen.Cognex.Vision.Blazor + AXOpen - cognexvision + + + https://github.com/ix-ax/ + https://github.com/ix-ax/AXOpen + true + ix-ax + (c) Peter Kurhajec and Contributors + simatix-ax, PLC, industrial automation, SCADA, HMI, Blazor + true + icon_128_128.png + git + True + snupkg + MIT + + Release notes are published here: + https://github.com/ix-ax/AXOpen/releases + + NUGET-README.md @@ -14,7 +38,6 @@ - all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -23,9 +46,22 @@ + + + + + + True + \ + + + True + \ + + diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs index ef1e819d4..71d5020ab 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs @@ -1,9 +1,98 @@ using AXOpen.Components.Abstractions; +using AXOpen.Messaging.Static; +using AXSharp.Connector; +using System; +using System.Collections.Generic; namespace AXOpen.Cognex.Vision.v_6_0_0_0 { public partial class AxoInsight { + partial void PostConstruct(ITwinObject parent, string readableTail, string symbolTail) + { + try + { + InitializeMessenger(); + InitializeTaskMessenger(); + } + catch (Exception) + { + + throw; + } + } + private void InitializeMessenger() + { + List> messengerTextList = new List> + { + new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), + new KeyValuePair(700, new AxoMessengerTextItem("Parent has NULL reference!", "Check the call of the `Run` method, if the `parent` parameter is assigned.")), + new KeyValuePair(701, new AxoMessengerTextItem("refAcquisitionControl has NULL reference!", "Check the call of the `Run` method, if the `refAcquisitionControl` parameter is assigned.")), + new KeyValuePair(702, new AxoMessengerTextItem("refAcquisitionStatus has NULL reference!", "Check the call of the `Run` method, if the `refAcquisitionStatus` parameter is assigned.")), + new KeyValuePair(703, new AxoMessengerTextItem("refInspectionControl has NULL reference!", "Check the call of the `Run` method, if the `refInspectionControl` parameter is assigned.")), + new KeyValuePair(704, new AxoMessengerTextItem("refInspectionStatus has NULL reference!", "Check the call of the `Run` method, if the `refInspectionStatus` parameter is assigned.")), + new KeyValuePair(705, new AxoMessengerTextItem("refCommandControl has NULL reference!", "Check the call of the `Run` method, if the `refCommandControl` parameter is assigned.")), + new KeyValuePair(706, new AxoMessengerTextItem("refCommandStatus has NULL reference!", "Check the call of the `Run` method, if the `refCommandStatus` parameter is assigned.")), + new KeyValuePair(707, new AxoMessengerTextItem("refSoftEventControl has NULL reference!", "Check the call of the `Run` method, if the `refSoftEventControl` parameter is assigned.")), + new KeyValuePair(708, new AxoMessengerTextItem("refSoftEventStatus has NULL reference!", "Check the call of the `Run` method, if the `refSoftEventStatus` parameter is assigned.")), + new KeyValuePair(709, new AxoMessengerTextItem("refResultData has NULL reference!", "Check the call of the `Run` method, if the `refResultData` parameter is assigned.")), + new KeyValuePair(710, new AxoMessengerTextItem("refUserData has NULL reference!", "Check the call of the `Run` method, if the `refUserData` parameter is assigned.")), + new KeyValuePair(711, new AxoMessengerTextItem("refResultData has invalid size!", "Check the size of the `refResultData`.")), + new KeyValuePair(712, new AxoMessengerTextItem("refResultData-lower bound index is not zero!", "Check if the `refResultData` parameter is zero-based.")), + new KeyValuePair(713, new AxoMessengerTextItem("refUserData has invalid size!", "Check the size of the `refUserData`.")), + new KeyValuePair(714, new AxoMessengerTextItem("refUserData-lower bound index is not zero!", "Check if the `refUsertData` parameter is zero-based.")), + + }; + + _Messenger.DotNetMessengerTextList = messengerTextList; + } + + private void InitializeTaskMessenger() + { + List> messengerTextList = new List> + { + new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), + new KeyValuePair(600, new AxoMessengerTextItem("Waiting for the signal ExposureComplete to be reseted!" ,"Check the status of the `ExposureComplete` signal.")), + new KeyValuePair(601, new AxoMessengerTextItem("Waiting for the signal ResultsValid to be reseted!" ,"Check the status of the `ResultsValid` signal.")), + new KeyValuePair(602, new AxoMessengerTextItem("Waiting for the signal Error to be reseted!" ,"Check the status of the `Error` signal.")), + new KeyValuePair(603, new AxoMessengerTextItem("Waiting for the signal TriggerReady to be set!" ,"Check the status of the `TriggerReady` signal.")), + new KeyValuePair(604, new AxoMessengerTextItem("Waiting for the signal TriggerAcknowledge to be set!" ,"Check the status of the `TriggerAcknowledge` signal.")), + new KeyValuePair(605, new AxoMessengerTextItem("Waiting for the signal InspectionCompleted to be toggled!" ,"Check the status of the `InspectionCompleted` signal.")), + new KeyValuePair(606, new AxoMessengerTextItem("Waiting for the signal ResultsValid to be set!" ,"Check the status of the `ResultsValid` signal.")), + new KeyValuePair(607, new AxoMessengerTextItem("Waiting for the InspectionResults to be copied!" ,"Check the status of the `InspectionResults` data.")), + new KeyValuePair(608, new AxoMessengerTextItem("Waiting for the signal CommandExecuting to be reseted!" ,"Check the status of the `CommandExecuting` signal.")), + new KeyValuePair(609, new AxoMessengerTextItem("Waiting for the signal Online to be reseted!" ,"Check the status of the `Online` signal.")), + new KeyValuePair(610, new AxoMessengerTextItem("Waiting for the signal Error to be reseted!" ,"Check the status of the `Error` signal.")), + new KeyValuePair(611, new AxoMessengerTextItem("Waiting for the Job name to be written to User data!" ,"Check the status of the `User` data.")), + new KeyValuePair(612, new AxoMessengerTextItem("Waiting for the signal ExtendedUserDataSetAcknowledge to be set!" ,"Check the status of the `ExtendedUserDataSetAcknowledge` signal.")), + new KeyValuePair(613, new AxoMessengerTextItem("Waiting for the signal ExtendedUserDataSetAcknowledge to be reseted!" ,"Check the status of the `ExtendedUserDataSetAcknowledge` signal.")), + new KeyValuePair(614, new AxoMessengerTextItem("Waiting for the signal CommandComplete to be set!" ,"Check the status of the `CommandComplete` signal.")), + new KeyValuePair(615, new AxoMessengerTextItem("Waiting for the signal CommandComplete to be reseted!" ,"Check the status of the `CommandComplete` signal.")), + new KeyValuePair(616, new AxoMessengerTextItem("Waiting for the signal Online to be set!" ,"Check the status of the `Online` signal.")), + new KeyValuePair(617, new AxoMessengerTextItem("Waiting for the signal TriggerSoftEvent to be set!" ,"Check the status of the `TriggerSoftEvent` signal.")), + new KeyValuePair(618, new AxoMessengerTextItem("Waiting for the signal TriggerSoftEvent to be reseted!" ,"Check the status of the `TriggerSoftEvent` signal.")), + //new KeyValuePair(619, new AxoMessengerTextItem("","")), + //new KeyValuePair(620, new AxoMessengerTextItem("","")), + //new KeyValuePair(621, new AxoMessengerTextItem("","")), + //new KeyValuePair(622, new AxoMessengerTextItem("","")), + //new KeyValuePair(623, new AxoMessengerTextItem("","")), + new KeyValuePair(715, new AxoMessengerTextItem("Empty job name inserted!","Check the required job name.")), + new KeyValuePair(716, new AxoMessengerTextItem("Index of UserData in the method SetUserDataAsString exceeds the size hardware structure mapped!","Check the size and the offset of the data written to the User data.")), + new KeyValuePair(717, new AxoMessengerTextItem("Index of UserData in the method SetUserDataAsString exceeds the defined size!","Check the size and the offset of the data written to the User data.")), + new KeyValuePair(718, new AxoMessengerTextItem("Change job by name failed. Check the value of the InspectionStatus.Error code!","Check the sensor manufacturer documentation.")), + new KeyValuePair(719, new AxoMessengerTextItem("Required job number is greater than the maximal value!","Check the sensor manufacturer documentation.")), + new KeyValuePair(720, new AxoMessengerTextItem("Change job by number failed. Check the value of the InspectionStatus.Error code!","Check the sensor manufacturer documentation.")), + new KeyValuePair(721, new AxoMessengerTextItem("Required soft event number is greater than the maximal value of 7!","Check the sensor manufacturer documentation.")), + //new KeyValuePair(722, new AxoMessengerTextItem("","")), + //new KeyValuePair(723, new AxoMessengerTextItem("","")), + //new KeyValuePair(724, new AxoMessengerTextItem("","")), + //new KeyValuePair(725, new AxoMessengerTextItem("","")), + //new KeyValuePair(726, new AxoMessengerTextItem("","")), + + }; + + _TaskMessenger.DotNetMessengerTextList = messengerTextList; + } } public partial class AxoInsight_Status : AxoComponent_Status @@ -74,16 +163,6 @@ public string ErrorDescription //errorDescriptionDict.Add(7, ""); //errorDescriptionDict.Add(7, ""); //errorDescriptionDict.Add(7, ""); - //errorDescriptionDict.Add(7, ""); - //errorDescriptionDict.Add(7, ""); - //errorDescriptionDict.Add(7, ""); - //errorDescriptionDict.Add(7, ""); - //errorDescriptionDict.Add(7, ""); - //errorDescriptionDict.Add(7, ""); - //errorDescriptionDict.Add(7, ""); - //errorDescriptionDict.Add(7, ""); - - } string errorDescription = " "; @@ -136,25 +215,13 @@ public string ActionDescription actionDescriptionDict.Add(602, "Change job by name was aborted, while not yet completed!"); actionDescriptionDict.Add(603, "Change job by number was aborted, while not yet completed!"); actionDescriptionDict.Add(604, "Soft event was aborted, while not yet completed!"); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(606, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); - //actionDescriptionDict.Add(605, ""); + //actionDescriptionDict.Add(6, ""); + //actionDescriptionDict.Add(6, ""); + //actionDescriptionDict.Add(6, ""); + //actionDescriptionDict.Add(6, ""); + //actionDescriptionDict.Add(6, ""); + //actionDescriptionDict.Add(6, ""); + actionDescriptionDict.Add(700, "Clearing of the inspection results finished with error!"); actionDescriptionDict.Add(701, "Reading finished with error!"); @@ -182,3 +249,4 @@ public string ActionDescription } } } + diff --git a/src/components.pneumatics/ctrl/src/AxoCylinder.st b/src/components.pneumatics/ctrl/src/AxoCylinder.st index 4b3d1919f..17fb552ad 100644 --- a/src/components.pneumatics/ctrl/src/AxoCylinder.st +++ b/src/components.pneumatics/ctrl/src/AxoCylinder.st @@ -36,7 +36,6 @@ NAMESPACE AXOpen.Components.Pneumatics {#ix-attr:[ReadOnly()]} {#ix-set:AttributeName = "<#Move work signal#>"} _MoveWorkSignal : BOOL; -// {#ix-set:PlcTextList = "[1]:'<#Movement to work position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[2]:'<#Movement to home position did not succeed.#>':'<#Check the cyclinder that it is free to move, air pressure input and extremity sensor.#>';[3]:'<#Home and work position sensors are both active at the same time.#>':'<#Check the position of sensors.#>';[4]:'<#Movement to work position is temporarily suspended.#>':'<#Check the blocking condition.#>';[5]:'<#Movement to home position is temporarily suspended.#>':'<#Check the blocking condition.#>';[6]:'<#Movement to work position is aborted.#>':'<#Check the blocking condition.#>';[7]:'<#Movement to home position is aborted.#>':'<#Check the blocking condition.#>';"} _Messenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR diff --git a/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj b/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj index 7474ca267..7a2476487 100644 --- a/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj +++ b/src/components.pneumatics/src/AXOpen.Components.Pneumatics.blazor/AXOpen.Components.Pneumatics.blazor.csproj @@ -32,10 +32,6 @@ NUGET-README.md - - - - @@ -51,7 +47,6 @@ - diff --git a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st index fea3941a9..2e2faa2f3 100644 --- a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st +++ b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st @@ -32,6 +32,7 @@ NAMESPACE AXOpen.Messaging.Static ActiveContextCount : ULINT; Context : IAxoContext; END_VAR + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// @@ -83,6 +84,7 @@ NAMESPACE AXOpen.Messaging.Static THIS.Serve(_object.GetContext()); END_METHOD + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// @@ -148,6 +150,7 @@ NAMESPACE AXOpen.Messaging.Static Activate := THIS; END_METHOD + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// @@ -165,6 +168,7 @@ NAMESPACE AXOpen.Messaging.Static THIS.Deactivate(); END_IF; END_METHOD + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// @@ -224,6 +228,7 @@ NAMESPACE AXOpen.Messaging.Static END_IF; END_IF; END_METHOD + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// @@ -246,6 +251,27 @@ NAMESPACE AXOpen.Messaging.Static Acknowledged := Context.GetRtc().NowUTC(); END_METHOD + + /// + /// TODO-add some docu as this is PUBLIC method (unfortunately) + /// + METHOD PUBLIC Restore + IF AXOpen.Core.IsNullContext(Context) THEN + RETURN; + END_IF; + + IsActive := FALSE; + Category := eAxoMessageCategory#All; + MessageCode := ULINT#0; + Risen := LDATE_AND_TIME#1970-01-01-00:00:00.000; + Fallen := LDATE_AND_TIME#1970-01-01-00:00:00.000; + WaitingForAcknowledge := FALSE; + AcknowledgementRequired := FALSE; + AcknowledgeRequest := FALSE; + AcknowledgedBeforeFallen := FALSE; + Acknowledged := LDATE_AND_TIME#1970-01-01-00:00:00.000;; + ActiveContextCount := ULINT#0; + END_METHOD METHOD PRIVATE ToLogLevel : eLogLevel VAR_INPUT @@ -278,6 +304,7 @@ NAMESPACE AXOpen.Messaging.Static END_CASE; END_METHOD + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// @@ -285,6 +312,7 @@ NAMESPACE AXOpen.Messaging.Static AcknowledgementRequired := TRUE; RequireAcknowledgement := THIS; END_METHOD + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// @@ -292,6 +320,7 @@ NAMESPACE AXOpen.Messaging.Static AcknowledgementRequired := FALSE; DoNotRequireAcknowledgement := THIS; END_METHOD + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st index 4b8677078..bd5cc9b57 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st @@ -43,11 +43,13 @@ NAMESPACE AxoStaticMessengerExample _messenger4condition : BOOL; {#ix-set:AttributeName = "<#Messenger 5#>"} _messenger5 : AXOpen.Messaging.Static.AxoMessenger; - {#ix-set:AttributeName = "<#Set to high to activate the messenger 5#>"} {#ix-attr:[Container(Layout.Wrap)]} + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5#>"} _messenger5condition : BOOL; {#ix-set:AttributeName = "<#message 5 code#>"} _messenger5code : UINT; + {#ix-set:AttributeName = "<#Set to high to call the messenger 5#>"} + _messenger5callcondition : BOOL; END_VAR METHOD PROTECTED OVERRIDE Main @@ -62,8 +64,12 @@ NAMESPACE AxoStaticMessengerExample _messenger3.Serve(THIS); _messenger4.ActivateOnCondition(_messenger4condition,eAxoMessageCategory#Info).RequireAcknowledgement(); _messenger4.Serve(THIS); - _messenger5.ActivateOnCondition(_messenger5code,_messenger5condition,eAxoMessageCategory#Error).RequireAcknowledgement(); - _messenger5.Serve(THIS); + IF _messenger5callcondition THEN + _messenger5.ActivateOnCondition(_messenger5code,_messenger5condition,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.Serve(THIS); + ELSE + _messenger5.Restore(); + END_IF; END_METHOD END_CLASS END_NAMESPACE From d52a80f62d5919be7d19d8f4acb6317bdfb27f43 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Tue, 29 Aug 2023 21:46:35 +0200 Subject: [PATCH 17/28] 0..249 array issue --- .../AXOpen.Components.Cognex.Vision.sln | 4 +- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 313 +++++++++++------- .../Tasks/AxoDatamanClearResultData.st | 44 ++- .../v_6_0_0/Tasks/AxoDatamanRead.st | 70 +++- .../AxoDataman_AcquisitionControl.st | 2 + .../AxoDataman_AcquisitionStatus.st | 5 + .../AxoDataman_Config.st | 3 + .../AxoDataman_ResultData.st | 7 + .../AxoDataman_Results.st | 9 +- .../AxoDataman_ResultsControl.st | 2 + .../AxoDataman_ResultsStatus.st | 5 + .../AxoDataman_SignalStates.st | 49 --- .../AxoDataman_SoftEventControl.st | 8 + .../AxoDataman_SoftEventStatus.st | 8 + .../AxoDataman_Status.st | 2 +- .../TypeStructuresAndEnums/AxoDataman_User.st | 3 +- .../AxoDataman_UserData.st | 7 + .../ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st | 25 +- .../Tasks/AxoInsightChangeJobByName.st | 2 +- .../Tasks/AxoInsightChangeJobByNumber.st | 2 +- .../Tasks/AxoInsightClearInspectionResults.st | 4 +- .../v_6_0_0/Tasks/AxoInsightSoftEvent.st | 2 +- .../v_6_0_0/Tasks/AxoInsightTrigger.st | 4 +- .../AxoInsight_ResultData.st | 2 +- .../AxoInsight_UserData.st | 2 +- .../AxoDataman/v_6_0_0/AxoDataman.cs | 70 +++- .../AxoCognexVisionDatamanExample.st | 3 +- 27 files changed, 422 insertions(+), 235 deletions(-) create mode 100644 src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultData.st delete mode 100644 src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st create mode 100644 src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_UserData.st diff --git a/src/components.cognex.vision/AXOpen.Components.Cognex.Vision.sln b/src/components.cognex.vision/AXOpen.Components.Cognex.Vision.sln index 77a0cd9b5..55300f896 100644 --- a/src/components.cognex.vision/AXOpen.Components.Cognex.Vision.sln +++ b/src/components.cognex.vision/AXOpen.Components.Cognex.Vision.sln @@ -131,12 +131,12 @@ Global {F4C377AE-74AF-4FA6-99F4-9659BDF1795F} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} {633FB178-C1F0-4D49-9B73-063C94E27585} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} {42036BB7-5212-4493-AE70-5D147A16F0EA} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} - {85E97F36-804A-4A02-A730-F9061F447137} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {85E97F36-804A-4A02-A730-F9061F447137} = {9252F8A4-6358-4B46-9227-B1F7EE9E666B} {7157EA84-FE66-4E69-854F-110DF56C1620} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} {57133CEE-1E79-4700-B2AA-CFAAF2E47E5B} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} {C9832294-A4AB-486B-B7A6-796DCDD4548C} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} {CCA0FFE1-2E72-4B6A-830B-E3CFEB9D9D9A} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} - {2E4577B2-3575-41FA-B67C-BCDBC8D8137D} = {A2D5F309-0577-4946-B4E6-7E00A26EF5F5} + {2E4577B2-3575-41FA-B67C-BCDBC8D8137D} = {9252F8A4-6358-4B46-9227-B1F7EE9E666B} {0F95FED1-8B62-4E64-8338-BD7FDABD7A4B} = {F3F99DF4-1967-489F-B6D0-2F2F31B99D08} {7688D02B-A045-4DDF-904E-90F0AEBD7E89} = {F3F99DF4-1967-489F-B6D0-2F2F31B99D08} EndGlobalSection diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 0182ebafb..0ea2b0898 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -1,3 +1,5 @@ +USING AXOpen.Messaging.Static; +USING AXOpen.Messaging; USING AXOpen.Core; USING AXOpen.Components.Abstractions; @@ -8,43 +10,95 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentHeader()]} {#ix-set:AttributeName = "<#Read#>"} - _readTask : AxoDatamanRead; + ReadTask : AxoDatamanRead; {#ix-attr:[ComponentHeader()]} {#ix-attr:[ReadOnly()]} - {#ix-set:AttributeName = "<#Results#>"} - Results : AxoDataman_Results; - + {#ix-set:AttributeName = "<#Inspection results#>"} + ResultData : AxoDataman_ResultData; {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentDetails("Tasks")]} {#ix-set:AttributeName = "<#Restore#>"} - _restoreTask : AXOpen.Core.AxoTask; + RestoreTask : AXOpen.Core.AxoTask; {#ix-attr:[ComponentDetails("Tasks")]} {#ix-set:AttributeName = "<#Clear result data#>"} - _clearResultDataTask : AxoDatamanClearResultData; - + ClearResultDataTask : AxoDatamanClearResultData; {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[ComponentDetails("Config")]} Config : AxoDataman_Config; - // {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[Container(Layout.Stack)]} {#ix-attr:[ComponentDetails("Status")]} {#ix-attr:[ReadOnly()]} Status : AxoDataman_Status; - {#ix-attr:[CompilerOmits()]} + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-attr:[ReadOnly()]} + {#ix-set:AttributeName = "<#Results#>"} + Results : AxoDataman_Results; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-set:AttributeName = "<#Acquisition control#>"} + {#ix-attr:[ReadOnly()]} + AcquisitionControl : AxoDataman_AcquisitionControl; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-set:AttributeName = "<#Acquisition status#>"} + {#ix-attr:[ReadOnly()]} + AcquisitionStatus : AxoDataman_AcquisitionStatus; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-set:AttributeName = "<#Results control#>"} + {#ix-attr:[ReadOnly()]} + ResultsControl : AxoDataman_ResultsControl; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-set:AttributeName = "<#Results status#>"} + {#ix-attr:[ReadOnly()]} + ResultsStatus : AxoDataman_ResultsStatus; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-set:AttributeName = "<#Soft-event control#>"} + {#ix-attr:[ReadOnly()]} + SoftEventControl : AxoDataman_SoftEventControl; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-set:AttributeName = "<#Soft-event status#>"} + {#ix-attr:[ReadOnly()]} + SoftEventStatus : AxoDataman_SoftEventStatus; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-set:AttributeName = "<#User data#>"} + {#ix-attr:[ReadOnly()]} User : AxoDataman_User; + {#ix-set:AttributeName = "<#User data#>"} + {#ix-attr:[ReadOnly()]} + UserData : AxoDataman_UserData; + + {#ix-attr:[ReadOnly()]} + _Messenger : AXOpen.Messaging.Static.AxoMessenger; + {#ix-attr:[ReadOnly()]} + _TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR VAR PRIVATE - _AcquisitionControl : AxoDataman_AcquisitionControl; - _AcquisitionStatus : AxoDataman_AcquisitionStatus; - _ResultsControl : AxoDataman_ResultsControl; - _ResultsStatus : AxoDataman_ResultsStatus; - _SoftEventControl : AxoDataman_SoftEventControl; - _SoftEventStatus : AxoDataman_SoftEventStatus; _taskDisabled : BOOL; END_VAR @@ -57,40 +111,47 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR Status.Action.Id := UINT#0; Status.Error.Id := UINT#0; + _Messenger.Restore(); + _TaskMessenger.Restore(); - _clearResultDataTask.Restore(); - _readTask.Restore(); + ClearResultDataTask.Restore(); + ReadTask.Restore(); Results.Code := UINT#0; Results.Extended := UINT#0; Results.Id := UINT#0; Results.Length := UINT#0; - Results.Data := ''; - - _AcquisitionControl.TriggerEnable := _ResultsStatus.ErrorDetected; - _AcquisitionControl.Trigger := FALSE; - - _ResultsControl.EnableResultBuffering := FALSE; - _ResultsControl.ResultsAcknowledge := FALSE; - - _SoftEventControl.TrainCode := FALSE; - _SoftEventControl.TrainMatchString := FALSE; - _SoftEventControl.TrainFocus := FALSE; - _SoftEventControl.TrainBrightness := FALSE; - _SoftEventControl.Untrain := FALSE; - _SoftEventControl.ExecuteDMCC := FALSE; - _SoftEventControl.Reserved06 := FALSE; - _SoftEventControl.SetMatchString := FALSE; - User.Option := UINT#0; - User.Length := UINT#0; FOR _index := 0 TO 245 DO - User.Data[_index] := BYTE#0; + ResultData.Data[_index] := BYTE#0; END_FOR; + ResultData.ToggleDataChangedFlag(); + + AcquisitionControl.TriggerEnable := ResultsStatus.ErrorDetected; + AcquisitionControl.Trigger := FALSE; + + ResultsControl.EnableResultBuffering := FALSE; + ResultsControl.ResultsAcknowledge := FALSE; + + SoftEventControl.TrainCode := FALSE; + SoftEventControl.TrainMatchString := FALSE; + SoftEventControl.TrainFocus := FALSE; + SoftEventControl.TrainBrightness := FALSE; + SoftEventControl.Untrain := FALSE; + SoftEventControl.ExecuteDMCC := FALSE; + SoftEventControl.Reserved06 := FALSE; + SoftEventControl.SetMatchString := FALSE; + + // User.Option := UINT#0; + // User.Length := UINT#0; + FOR _index := 0 TO 249 DO + UserData.Data[_index] := BYTE#0; + END_FOR; + UserData.ToggleDataChangedFlag(); - IF NOT _ResultsStatus.ErrorDetected THEN + IF NOT ResultsStatus.ErrorDetected THEN Status.Action.Id := UINT#300; - _restoreTask.DoneWhen(TRUE); + RestoreTask.DoneWhen(TRUE); END_IF; END_METHOD @@ -108,26 +169,26 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refSoftEventStatus : REF_TO BYTE; refResultData : REF_TO ARRAY[*] OF BYTE; END_VAR - _AcquisitionStatus.TriggerReady := refAcquisitionStatus^[0].%X0; - _AcquisitionStatus.TriggerAcknowledge := refAcquisitionStatus^[0].%X1; - _AcquisitionStatus.MissedAcquisition := refAcquisitionStatus^[0].%X3; - _AcquisitionStatus.TriggerID.%B1 := refAcquisitionStatus^[1]; - _AcquisitionStatus.TriggerID.%B0 := refAcquisitionStatus^[2]; - - _ResultsStatus.Decoding := refResultsStatus^.%X0; - _ResultsStatus.DecodeComplete := refResultsStatus^.%X1; - _ResultsStatus.ResultsBufferOverrun := refResultsStatus^.%X2; - _ResultsStatus.ResultsAvailable := refResultsStatus^.%X3; - _ResultsStatus.ErrorDetected := refResultsStatus^.%X7; - - _SoftEventStatus.TrainCodeAcknowledge := refSoftEventStatus^.%X0; - _SoftEventStatus.TrainMatchStringAcknowledge := refSoftEventStatus^.%X1; - _SoftEventStatus.TrainFocusAcknowledge := refSoftEventStatus^.%X2; - _SoftEventStatus.TrainBrightnessAcknowledge := refSoftEventStatus^.%X3; - _SoftEventStatus.UntrainAcknowledge := refSoftEventStatus^.%X4; - _SoftEventStatus.ExecuteDmccAcknowledge := refSoftEventStatus^.%X5; - _SoftEventStatus.Reserved06 := refSoftEventStatus^.%X6; - _SoftEventStatus.SetMatchStringAcknowledge := refSoftEventStatus^.%X7; + AcquisitionStatus.TriggerReady := refAcquisitionStatus^[0].%X0; + AcquisitionStatus.TriggerAcknowledge := refAcquisitionStatus^[0].%X1; + AcquisitionStatus.MissedAcquisition := refAcquisitionStatus^[0].%X3; + AcquisitionStatus.TriggerID.%B1 := refAcquisitionStatus^[1]; + AcquisitionStatus.TriggerID.%B0 := refAcquisitionStatus^[2]; + + ResultsStatus.Decoding := refResultsStatus^.%X0; + ResultsStatus.DecodeComplete := refResultsStatus^.%X1; + ResultsStatus.ResultsBufferOverrun := refResultsStatus^.%X2; + ResultsStatus.ResultsAvailable := refResultsStatus^.%X3; + ResultsStatus.ErrorDetected := refResultsStatus^.%X7; + + SoftEventStatus.TrainCodeAcknowledge := refSoftEventStatus^.%X0; + SoftEventStatus.TrainMatchStringAcknowledge := refSoftEventStatus^.%X1; + SoftEventStatus.TrainFocusAcknowledge := refSoftEventStatus^.%X2; + SoftEventStatus.TrainBrightnessAcknowledge := refSoftEventStatus^.%X3; + SoftEventStatus.UntrainAcknowledge := refSoftEventStatus^.%X4; + SoftEventStatus.ExecuteDmccAcknowledge := refSoftEventStatus^.%X5; + SoftEventStatus.Reserved06 := refSoftEventStatus^.%X6; + SoftEventStatus.SetMatchStringAcknowledge := refSoftEventStatus^.%X7; IF (LOWER_BOUND(refResultData^,1) = 0) THEN @@ -152,6 +213,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; END_IF; + _Messenger.ActivateOnCondition(ULINT#709,Status.ResultDataSize = eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#710,LOWER_BOUND(refResultData^,1) <> 0, eAxoMessageCategory#ProgrammingError); + IF(Status.ResultDataSize <> eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID) THEN Results.Id.%B1 := refResultData^[0]; Results.Id.%B0 := refResultData^[1]; @@ -173,21 +237,27 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refSoftEventControl : REF_TO BYTE; refUserData : REF_TO ARRAY[*] OF BYTE; END_VAR + VAR + UserDataChanged : BOOL; + index : INT; + END_VAR + + UpdateOutputs := TRUE; - refAcquisitionControl^.%X0 := _AcquisitionControl.TriggerEnable; - refAcquisitionControl^.%X1 := _AcquisitionControl.Trigger; + refAcquisitionControl^.%X0 := AcquisitionControl.TriggerEnable; + refAcquisitionControl^.%X1 := AcquisitionControl.Trigger; - refResultsControl^.%X0 := _ResultsControl.EnableResultBuffering; - refResultsControl^.%X1 := _ResultsControl.ResultsAcknowledge; + refResultsControl^.%X0 := ResultsControl.EnableResultBuffering; + refResultsControl^.%X1 := ResultsControl.ResultsAcknowledge; - refSoftEventControl^.%X0 := _SoftEventControl.TrainCode; - refSoftEventControl^.%X1 := _SoftEventControl.TrainMatchString; - refSoftEventControl^.%X2 := _SoftEventControl.TrainFocus; - refSoftEventControl^.%X3 := _SoftEventControl.TrainBrightness; - refSoftEventControl^.%X4 := _SoftEventControl.Untrain; - refSoftEventControl^.%X5 := _SoftEventControl.ExecuteDMCC; - refSoftEventControl^.%X6 := _SoftEventControl.Reserved06; - refSoftEventControl^.%X7 := _SoftEventControl.SetMatchString; + refSoftEventControl^.%X0 := SoftEventControl.TrainCode; + refSoftEventControl^.%X1 := SoftEventControl.TrainMatchString; + refSoftEventControl^.%X2 := SoftEventControl.TrainFocus; + refSoftEventControl^.%X3 := SoftEventControl.TrainBrightness; + refSoftEventControl^.%X4 := SoftEventControl.Untrain; + refSoftEventControl^.%X5 := SoftEventControl.ExecuteDMCC; + refSoftEventControl^.%X6 := SoftEventControl.Reserved06; + refSoftEventControl^.%X7 := SoftEventControl.SetMatchString; IF (LOWER_BOUND(refUserData^,1) = 0) THEN IF (UPPER_BOUND(refUserData^,1) = 19) THEN @@ -201,20 +271,29 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ELSIF (UPPER_BOUND(refUserData^,1) = 253) THEN Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_250B; ELSE + Status.UserDataSize := eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID; Status.Error.Id := UINT#711; UpdateOutputs := FALSE; END_IF; ELSE Status.Error.Id := UINT#712; UpdateOutputs := FALSE; - END_IF; + END_IF; + _Messenger.ActivateOnCondition(ULINT#711,Status.UserDataSize = eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#712,LOWER_BOUND(refUserData^,1) <> 0, eAxoMessageCategory#ProgrammingError); - IF(Status.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) THEN + IF(Status.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) AND (UserData.DataChanged <> UserDataChanged) THEN refUserData^[0] := User.Option.%B1; refUserData^[1] := User.Option.%B0; refUserData^[2] := User.Length.%B1; refUserData^[3] := User.Length.%B0; - UpdateOutputs := TRUE; + FOR index := 0 TO (TO_INT(User.Length) - INT#1) DO + refUserData^[index + 4] := UserData.Data[index]; + END_FOR; + FOR index := TO_INT(User.Length) TO 249 DO + refUserData^[index + 4] := BYTE#0; + END_FOR; + UserDataChanged := UserData.DataChanged; END_IF; END_METHOD @@ -249,6 +328,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ELSE IsValidReferences := TRUE; END_IF; + + _Messenger.ActivateOnCondition(ULINT#701,refAcquisitionControl = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#702,refAcquisitionStatus = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#703,refResultsControl = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#704,refResultsStatus = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#705,refSoftEventControl = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#706,refSoftEventStatus = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#707,refResultData = NULL, eAxoMessageCategory#ProgrammingError); + _Messenger.ActivateOnCondition(ULINT#708,refUserData = NULL, eAxoMessageCategory#ProgrammingError); END_METHOD METHOD PRIVATE ContinuousReading @@ -257,18 +345,27 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refResults : REF_TO AxoDataman_Results; refResultData : REF_TO ARRAY[*] OF BYTE; END_VAR - - IF _ResultsStatus.ResultsAvailable AND NOT _ResultsControl.ResultsAcknowledge AND Results.Code > UINT#0 AND Results.Length > UINT#0 THEN + VAR + _index : INT; + END_VAR + IF ResultsStatus.ResultsAvailable AND NOT ResultsControl.ResultsAcknowledge AND Results.Code > UINT#0 AND Results.Length > UINT#0 THEN + _Messenger.ActivateOnCondition(ULINT#713, refResults^.Length > TO_UINT(refStatus^.ResultDataSize), eAxoMessageCategory#Error); IF refResults^.Length > TO_UINT(refStatus^.ResultDataSize) THEN Status.Action.Id := UINT#701; Status.Error.Id := UINT#713; ELSE - System.SerDe.Deserialize(UINT#7, refResultData^, refResults^.Data); + FOR _index := 0 TO (TO_INT(refResults^.Length) - INT#1) DO + ResultData.Data[_index] := refResultData^[_index + 8]; + END_FOR; + FOR _index := TO_INT(refResults^.Length) TO 245 DO + ResultData.Data[_index] := BYTE#0; + END_FOR; + ResultData.DataChanged := NOT ResultData.DataChanged ; Status.Action.Id := UINT#307; END_IF; END_IF; - _ResultsControl.ResultsAcknowledge := _ResultsStatus.ResultsAvailable; + ResultsControl.ResultsAcknowledge := ResultsStatus.ResultsAvailable; END_METHOD METHOD PROTECTED OVERRIDE Open @@ -291,6 +388,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.Error.Id := UINT#700; RETURN; END_IF; + + _Messenger.ActivateOnCondition(ULINT#700,parent = NULL, eAxoMessageCategory#ProgrammingError); + IF NOT THIS.IsValidReferences(refAcquisitionControl,refAcquisitionStatus,refResultsControl,refResultsStatus,refSoftEventControl,refSoftEventStatus,refResultData,refUserData) THEN RETURN; END_IF; @@ -316,6 +416,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.Error.Id := UINT#700; RETURN; END_IF; + + _Messenger.ActivateOnCondition(ULINT#700,parent = NULL, eAxoMessageCategory#ProgrammingError); + IF NOT THIS.IsValidReferences(refAcquisitionControl,refAcquisitionStatus,refResultsControl,refResultsStatus,refSoftEventControl,refSoftEventStatus,refResultData,refUserData) THEN RETURN; END_IF; @@ -337,12 +440,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refUserData : REF_TO ARRAY[*] OF BYTE; END_VAR - _restoreTask.Initialize(THIS); - _clearResultDataTask.Initialize(THIS); - _readTask.Initialize(THIS); + RestoreTask.Initialize(THIS); + ClearResultDataTask.Initialize(THIS); + ReadTask.Initialize(THIS); + _Messenger.Serve(THIS); + THIS.UpdateInputs(refAcquisitionStatus,refResultsStatus,refSoftEventStatus,refResultData); - THIS.UpdateSignalStates(); + //THIS.UpdateSignalStates(); IF Config.ContinuousReading THEN THIS.ContinuousReading(REF(Status), REF(Results),refResultData); @@ -350,23 +455,22 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 //*************RESTORE******************** _taskDisabled := FALSE; - _restoreTask.IsDisabled := _taskDisabled; - IF _restoreTask.Execute() THEN + RestoreTask.IsDisabled := _taskDisabled; + IF RestoreTask.Execute() THEN THIS.Restore(); END_IF; //**************************************** //*************CLEAR*DATA***************** - _taskDisabled := _taskDisabled OR _restoreTask.IsBusy(); - _clearResultDataTask.IsDisabled := _taskDisabled; - _clearResultDataTask.Run(REF(_AcquisitionControl),REF(_AcquisitionStatus),REF(_ResultsControl),REF(_ResultsStatus),REF(Config),REF(Status),REF(Results)); + _taskDisabled := _taskDisabled OR RestoreTask.IsBusy(); + ClearResultDataTask.IsDisabled := _taskDisabled; + ClearResultDataTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(ResultsControl),REF(ResultsStatus),REF(Config),REF(Status),REF(Results),REF(ResultData),REF(_TaskMessenger)); //**************************************** - //*************READ*********************** - _taskDisabled := _taskDisabled OR _clearResultDataTask.IsBusy(); - _readTask.IsDisabled := _taskDisabled; - _readTask.Run(REF(_AcquisitionControl),REF(_AcquisitionStatus),REF(_ResultsControl),REF(_ResultsStatus),REF(Config),REF(Status),REF(Results),refResultData); + _taskDisabled := _taskDisabled OR ClearResultDataTask.IsBusy(); + ReadTask.IsDisabled := _taskDisabled; + ReadTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(ResultsControl),REF(ResultsStatus),REF(Config),REF(Status),REF(Results),REF(ResultData),refResultData,REF(_TaskMessenger)); //**************************************** THIS.UpdateOutputs(refAcquisitionControl,refResultsControl,refSoftEventControl,refUserData); @@ -379,40 +483,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 /// Clears the result data. /// METHOD PUBLIC ClearResultData : IAxoTaskState - ClearResultData :=_clearResultDataTask.Invoke();; + ClearResultData :=ClearResultDataTask.Invoke();; END_METHOD /// /// Triggers the reading sequence and waits for results. /// METHOD PUBLIC Read : IAxoTaskState - Read := _readTask.Invoke(); + Read := ReadTask.Invoke(); END_METHOD - - METHOD PRIVATE UpdateSignalStates - Status.SignalStatus.TriggerEnable := _AcquisitionControl.TriggerEnable; - Status.SignalStatus.Trigger := _AcquisitionControl.Trigger; - - Status.SignalStatus.EnableResultBuffering := _ResultsControl.EnableResultBuffering; - Status.SignalStatus.ResultsAcknowledge := _ResultsControl.ResultsAcknowledge; - - Status.SignalStatus.TriggerReady := _AcquisitionStatus.TriggerReady; - Status.SignalStatus.TriggerAcknowledge := _AcquisitionStatus.TriggerAcknowledge; - Status.SignalStatus.Acquiring := _AcquisitionStatus.Acquiring; - Status.SignalStatus.MissedAcquisition := _AcquisitionStatus.MissedAcquisition; - Status.SignalStatus.TriggerID := _AcquisitionStatus.TriggerID; - - Status.SignalStatus.Decoding := _ResultsStatus.Decoding; - Status.SignalStatus.DecodeComplete := _ResultsStatus.DecodeComplete; - Status.SignalStatus.ResultsBufferOverrun := _ResultsStatus.ResultsBufferOverrun; - Status.SignalStatus.ResultsAvailable := _ResultsStatus.ResultsAvailable; - Status.SignalStatus.ErrorDetected := _ResultsStatus.ErrorDetected; - - Status.SignalStatus.ResultID := Results.ID; - Status.SignalStatus.ResultCode := Results.Code; - Status.SignalStatus.ResultExtended := Results.Extended; - Status.SignalStatus.ResultLength := Results.Length; - END_METHOD END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st index 687210fd8..34ac361cb 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanClearResultData.st @@ -1,4 +1,6 @@ USING AXOpen.Core; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoDatamanClearResultData EXTENDS AXOpen.Core.AxoTask @@ -9,9 +11,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR VAR PRIVATE - _infoTime : LTIME := LT#2S; - _errorTime : LTIME := LT#5S; - _Status : REF_TO AxoDataman_Status; + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + _refStatus : REF_TO AxoDataman_Status; + _refMessenger : REF_TO AxoMessenger; END_VAR METHOD PUBLIC Run @@ -23,7 +26,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refConfig : REF_TO AxoDataman_Config; refStatus : REF_TO AxoDataman_Status; refResults : REF_TO AxoDataman_Results; - refResultData : REF_TO ARRAY[*] OF BYTE; + refResultData : REF_TO AxoDataman_ResultData; + refMessenger : REF_TO AxoMessenger; END_VAR VAR @@ -32,11 +36,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _infoTime := refConfig^.InfoTime; _errorTime := refConfig^.ErrorTime; - _Status := refStatus; + _refStatus := refStatus; + _refMessenger := refMessenger; + IF THIS.Execute() THEN + refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#302; refStatus^.Error.Id := UINT#0; + refMessenger^.Restore(); THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; @@ -50,12 +58,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refResults^.Extended := UINT#0; refResults^.Length := UINT#0; - refResults^.Data := ''; + FOR _index := 0 TO 245 DO + refResultData^.Data[_index] := BYTE#0; + END_FOR; THIS.CallTimers(FALSE); _progress := _progress + 1; END_IF; IF _progress = 2 THEN + refMessenger^.ActivateOnCondition(ULINT#600, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#600; END_IF; @@ -89,33 +100,34 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore - _Status^.Action.Id := UINT#308; - _Status^.Error.Id := UINT#0; + _refStatus^.Action.Id := UINT#308; + _refStatus^.Error.Id := UINT#0; + _refMessenger^.Restore(); _progress := 0; THIS.CallTimers(FALSE); END_METHOD METHOD PROTECTED OVERRIDE OnAbort - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#600; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#600; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#303; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#303; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#700; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#700; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#301; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#301; END_IF; END_METHOD END_CLASS diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st index 4ac3d53ec..557776e2f 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/Tasks/AxoDatamanRead.st @@ -1,4 +1,6 @@ USING AXOpen.Core; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoDatamanRead EXTENDS AXOpen.Core.AxoTask @@ -9,9 +11,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_VAR VAR PRIVATE - _infoTime : LTIME := LT#2S; - _errorTime : LTIME := LT#5S; - _Status : REF_TO AxoDataman_Status; + _infoTime : LTIME := LT#2S; + _errorTime : LTIME := LT#5S; + _refStatus : REF_TO AxoDataman_Status; + _refMessenger : REF_TO AxoMessenger; END_VAR METHOD PUBLIC Run @@ -23,7 +26,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refConfig : REF_TO AxoDataman_Config; refStatus : REF_TO AxoDataman_Status; refResults : REF_TO AxoDataman_Results; - refResultData : REF_TO ARRAY[*] OF BYTE; + refResultData : REF_TO AxoDataman_ResultData; + refResultDataHW : REF_TO ARRAY[*] OF BYTE; + refMessenger : REF_TO AxoMessenger; END_VAR VAR @@ -32,12 +37,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _infoTime := refConfig^.InfoTime; _errorTime := refConfig^.ErrorTime; - _Status := refStatus; - + _refStatus := refStatus; + _refMessenger := refMessenger; + IF THIS.Execute() THEN + refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#305; refStatus^.Error.Id := UINT#0; + refMessenger^.Restore(); THIS.CallTimers(FALSE); IF refResultsStatus^.ErrorDetected THEN _progress := 20; @@ -61,6 +69,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 2 THEN + refMessenger^.ActivateOnCondition(ULINT#601, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#601; END_IF; @@ -71,6 +80,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 3 THEN + refMessenger^.ActivateOnCondition(ULINT#602, _infoTimer.output, eAxoMessageCategory#Warning); refAcquisitionControl^.Trigger := TRUE; IF _infoTimer.output THEN refStatus^.Error.Id := UINT#602; @@ -82,6 +92,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 4 THEN + refMessenger^.ActivateOnCondition(ULINT#603, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN refStatus^.Error.Id := UINT#603; END_IF; @@ -92,6 +103,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 5 THEN + refMessenger^.ActivateOnCondition(ULINT#713, refResults^.Length > TO_UINT(refStatus^.ResultDataSize), eAxoMessageCategory#Error); IF refResults^.Code = UINT#0 OR refResults^.Length=UINT#0 OR refResults^.Length > TO_UINT(refStatus^.ResultDataSize) THEN THIS.ThrowWhen(TRUE); IF refResults^.Length > TO_UINT(refStatus^.ResultDataSize) THEN @@ -104,7 +116,22 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 6 THEN - System.SerDe.Deserialize(UINT#7, refResultData^, refResults^.Data); + refMessenger^.ActivateOnCondition(ULINT#604, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + refStatus^.Error.Id := UINT#604; + END_IF; + + FOR _index := 0 TO (TO_INT(refResults^.Length) - INT#1) DO + refResultData^.Data[_index] := refResultDataHW^[_index + 8]; + END_FOR; + FOR _index := TO_INT(refResults^.Length) TO 245 DO + refResultData^.Data[_index] := BYTE#0; + END_FOR; + refResultData^.DataChanged := NOT refResultData^.DataChanged ; + _progress := _progress + 1; + END_IF; + + IF _progress = 7 THEN refAcquisitionControl^.Trigger := FALSE; refResultsControl^.EnableResultBuffering := FALSE; refResultsControl^.ResultsAcknowledge := TRUE; @@ -113,6 +140,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 20 THEN + refMessenger^.ActivateOnCondition(ULINT#605, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + refStatus^.Error.Id := UINT#605; + END_IF; refAcquisitionControl^.TriggerEnable :=FALSE; refAcquisitionControl^.Trigger := FALSE; refResultsControl^.EnableResultBuffering := FALSE; @@ -124,6 +155,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_IF; IF _progress = 21 THEN + refMessenger^.ActivateOnCondition(ULINT#606, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + refStatus^.Error.Id := UINT#606; + END_IF; refAcquisitionControl^.TriggerEnable :=TRUE; IF NOT refResultsStatus^.ErrorDetected THEN THIS.CallTimers(FALSE); @@ -155,33 +190,34 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 END_METHOD METHOD PROTECTED OVERRIDE OnRestore - _Status^.Action.Id := UINT#309; - _Status^.Error.Id := UINT#0; + _refStatus^.Action.Id := UINT#309; + _refStatus^.Error.Id := UINT#0; + _refMessenger^.Restore(); _progress := 0; THIS.CallTimers(FALSE); END_METHOD METHOD PROTECTED OVERRIDE OnAbort - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#601; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#601; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnDone - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#306; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#306; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnError - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#701; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#701; END_IF; END_METHOD METHOD PROTECTED OVERRIDE OnStart - IF _Status <> NULL THEN - _Status^.Action.Id := UINT#304; + IF _refStatus <> NULL THEN + _refStatus^.Action.Id := UINT#304; END_IF; END_METHOD END_CLASS diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st index c7180e31b..da958e79d 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionControl.st @@ -2,7 +2,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_AcquisitionControl : STRUCT + {#ix-set:AttributeName = "<#Trigger enable#>"} TriggerEnable : BOOL; + {#ix-set:AttributeName = "<#Trigger#>"} Trigger : BOOL; END_STRUCT; END_TYPE diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st index 1ff1ae920..3275a596a 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_AcquisitionStatus.st @@ -2,10 +2,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_AcquisitionStatus : STRUCT + {#ix-set:AttributeName = "<#Trigger ready#>"} TriggerReady : BOOL; + {#ix-set:AttributeName = "<#Trigger acknowledge#>"} TriggerAcknowledge : BOOL; + {#ix-set:AttributeName = "<#Acquiring#>"} Acquiring : BOOL; + {#ix-set:AttributeName = "<#Missed acquisition#>"} MissedAcquisition : BOOL; + {#ix-set:AttributeName = "<#Trigger ID#>"} TriggerID : UINT; END_STRUCT; END_TYPE diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st index 65bdcbeea..3907290c2 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Config.st @@ -3,8 +3,11 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Stack)]} AxoDataman_Config : STRUCT + {#ix-set:AttributeName = "<#Continous reading#>"} ContinuousReading : BOOL := FALSE; + {#ix-set:AttributeName = "<#Info time#>"} InfoTime : LTIME := LT#2S; + {#ix-set:AttributeName = "<#Error time#>"} ErrorTime : LTIME := LT#5S; END_STRUCT; END_TYPE diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultData.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultData.st new file mode 100644 index 000000000..f62b14adf --- /dev/null +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultData.st @@ -0,0 +1,7 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + CLASS PUBLIC AxoDataman_ResultData EXTENDS AXOpen.Core.AxoByteArray + VAR PUBLIC + Data : ARRAY [0..245] OF BYTE; + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st index 2f0ce7ff7..10be44d39 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Results.st @@ -2,15 +2,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_Results : STRUCT - {#ix-attr:[CompilerOmits()]} + {#ix-set:AttributeName = "<#Id#>"} Id: UINT; - {#ix-attr:[CompilerOmits()]} + {#ix-set:AttributeName = "<#Code#>"} Code: UINT; - {#ix-attr:[CompilerOmits()]} + {#ix-set:AttributeName = "<#Extended#>"} Extended: UINT; - {#ix-attr:[CompilerOmits()]} + {#ix-set:AttributeName = "<#Length#>"} Length : UINT; - Data : STRING[246]; END_STRUCT; END_TYPE END_NAMESPACE \ No newline at end of file diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st index 2b80b85f2..af1d6e564 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsControl.st @@ -2,7 +2,9 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_ResultsControl : STRUCT + {#ix-set:AttributeName = "<#Enable results buffering#>"} EnableResultBuffering : BOOL; + {#ix-set:AttributeName = "<#Results acknowledge#>"} ResultsAcknowledge : BOOL; END_STRUCT; END_TYPE diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st index f31c43954..317c85e44 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_ResultsStatus.st @@ -2,10 +2,15 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_ResultsStatus : STRUCT + {#ix-set:AttributeName = "<#Decoding#>"} Decoding : BOOL; + {#ix-set:AttributeName = "<#Decode complete#>"} DecodeComplete : BOOL; + {#ix-set:AttributeName = "<#Results buffer overrun#>"} ResultsBufferOverrun : BOOL; + {#ix-set:AttributeName = "<#Results available#>"} ResultsAvailable : BOOL; + {#ix-set:AttributeName = "<#Error detected#>"} ErrorDetected : BOOL; END_STRUCT; END_TYPE diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st deleted file mode 100644 index d8da1286a..000000000 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SignalStates.st +++ /dev/null @@ -1,49 +0,0 @@ -NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 - TYPE - {#ix-set:AttributeName = "<#Signal states#>"} - {#ix-attr:[Container(Layout.Wrap)]} - AxoDataman_SignalStates : - STRUCT - {#ix-set:AttributeName = "<#Trigger enable#>"} - TriggerEnable : BOOL; - {#ix-set:AttributeName = "<#Trigger#>"} - Trigger : BOOL; - - {#ix-set:AttributeName = "<#Enable result buffering#>"} - EnableResultBuffering : BOOL; - {#ix-set:AttributeName = "<#Result acknowledge#>"} - ResultsAcknowledge : BOOL; - - {#ix-set:AttributeName = "<#Trigger ready#>"} - TriggerReady : BOOL; - {#ix-set:AttributeName = "<#Trigger acknowledge#>"} - TriggerAcknowledge : BOOL; - {#ix-set:AttributeName = "<#Acquiring#>"} - Acquiring : BOOL; - {#ix-set:AttributeName = "<#Missed acquisition#>"} - MissedAcquisition : BOOL; - {#ix-set:AttributeName = "<#Trigger ID#>"} - TriggerID : UINT; - - {#ix-set:AttributeName = "<#Decoding#>"} - Decoding : BOOL; - {#ix-set:AttributeName = "<#Decode complete#>"} - DecodeComplete : BOOL; - {#ix-set:AttributeName = "<#Result buffer overrun#>"} - ResultsBufferOverrun : BOOL; - {#ix-set:AttributeName = "<#Results available#>"} - ResultsAvailable : BOOL; - {#ix-set:AttributeName = "<#Error detected#>"} - ErrorDetected : BOOL; - - {#ix-set:AttributeName = "<#Result ID#>"} - ResultID : UINT; - {#ix-set:AttributeName = "<#Result code#>"} - ResultCode : UINT; - {#ix-set:AttributeName = "<#Result extended#>"} - ResultExtended : UINT; - {#ix-set:AttributeName = "<#Result length#>"} - ResultLength : UINT; - END_STRUCT; - END_TYPE -END_NAMESPACE \ No newline at end of file diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st index d987ac64d..32a4d1073 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventControl.st @@ -2,13 +2,21 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_SoftEventControl : STRUCT + {#ix-set:AttributeName = "<#Train code#>"} TrainCode : BOOL; + {#ix-set:AttributeName = "<#Train match string#>"} TrainMatchString : BOOL; + {#ix-set:AttributeName = "<#Train focus#>"} TrainFocus : BOOL; + {#ix-set:AttributeName = "<#Train brightness#>"} TrainBrightness : BOOL; + {#ix-set:AttributeName = "<#Untrain#>"} Untrain : BOOL; + {#ix-set:AttributeName = "<#Execute DMCC#>"} ExecuteDMCC : BOOL; + {#ix-attr:[CompilerOmits()]} Reserved06 : BOOL; + {#ix-set:AttributeName = "<#Decoding#>"} SetMatchString : BOOL; END_STRUCT; END_TYPE diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st index 2d8e3a7bd..078872e20 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_SoftEventStatus.st @@ -2,13 +2,21 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_SoftEventStatus : STRUCT + {#ix-set:AttributeName = "<#Train code acknowledge#>"} TrainCodeAcknowledge : BOOL; + {#ix-set:AttributeName = "<#Train match string acknowledge#>"} TrainMatchStringAcknowledge : BOOL; + {#ix-set:AttributeName = "<#Train focus acknowledge#>"} TrainFocusAcknowledge : BOOL; + {#ix-set:AttributeName = "<#Train brightness acknowledge#>"} TrainBrightnessAcknowledge : BOOL; + {#ix-set:AttributeName = "<#Untrain acknowledge#>"} UntrainAcknowledge : BOOL; + {#ix-set:AttributeName = "<#Execute DMCC acknowledge#>"} ExecuteDMCCAcknowledge : BOOL; + {#ix-attr:[CompilerOmits()]} Reserved06 : BOOL; + {#ix-set:AttributeName = "<#Set match string acknowledge#>"} SetMatchStringAcknowledge : BOOL; END_STRUCT; END_TYPE diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st index 01f7f39ad..9153fa0cf 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st @@ -3,7 +3,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Stack)]} CLASS AxoDataman_Status EXTENDS AXOpen.Components.Abstractions.AxoComponent_Status VAR PUBLIC - SignalStatus : AxoDataman_SignalStates; + // SignalStatus : AxoDataman_SignalStates; {#ix-attr:[Container(Layout.Wrap)]} ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; {#ix-attr:[CompilerOmits()]} diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st index 1a9480698..5ba43031a 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_User.st @@ -2,9 +2,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 TYPE AxoDataman_User : STRUCT + {#ix-set:AttributeName = "<#Option#>"} Option : UINT; + {#ix-set:AttributeName = "<#Length#>"} Length : UINT; - Data : ARRAY[0..249] OF BYTE; END_STRUCT; END_TYPE END_NAMESPACE \ No newline at end of file diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_UserData.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_UserData.st new file mode 100644 index 000000000..537d9ad1d --- /dev/null +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_UserData.st @@ -0,0 +1,7 @@ +NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 + CLASS PUBLIC AxoDataman_UserData EXTENDS AXOpen.Core.AxoByteArray + VAR PUBLIC + Data : ARRAY [0..249] OF BYTE; + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st index eefffa55b..3f84feaca 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st @@ -126,7 +126,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[ComponentDetails("Status")]} {#ix-set:AttributeName = "<#User data#>"} {#ix-attr:[ReadOnly()]} - User : AxoInsight_UserData; + UserData : AxoInsight_UserData; {#ix-attr:[ReadOnly()]} _Messenger : AXOpen.Messaging.Static.AxoMessenger; @@ -163,7 +163,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Results.InspectionID := UINT#0; Results.ResultCode := UINT#0; - FOR _index := 0 TO 250 DO + FOR _index := 0 TO 249 DO InspectionResults.Data[_index] := BYTE#0; END_FOR; InspectionResults.ToggleDataChangedFlag(); @@ -191,11 +191,10 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 SoftEventControl.TriggerSoftEvent.Data[6] := FALSE; SoftEventControl.TriggerSoftEvent.Data[7] := FALSE; - FOR _index := 0 TO 254 DO - User.Data[_index] := BYTE#0; + FOR _index := 0 TO 253 DO + UserData.Data[_index] := BYTE#0; END_FOR; - - User.ToggleDataChangedFlag(); + UserData.ToggleDataChangedFlag(); IF NOT AcquisitionStatus.ExposureComplete AND NOT InspectionStatus.Error THEN Status.Action.Id := UINT#300; @@ -353,11 +352,14 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _Messenger.ActivateOnCondition(ULINT#713,Status.UserDataSize = eAxoInsight_UserDataSize#USER_DATA_SIZE_INVALID, eAxoMessageCategory#ProgrammingError); _Messenger.ActivateOnCondition(ULINT#714,LOWER_BOUND(refUserData^,1) <> 0, eAxoMessageCategory#ProgrammingError); - IF User.DataChanged <> UserDataChanged THEN + IF(Status.UserDataSize <> eAxoDataman_UserDataSize#USER_DATA_SIZE_INVALID) AND (UserData.DataChanged <> UserDataChanged) THEN FOR index := 0 TO Status.UserDataSize - 1 DO - refUserData^[index] := User.Data[index]; + refUserData^[index] := UserData.Data[index]; + END_FOR; + FOR index := Status.UserDataSize TO 253 DO + refUserData^[index] := BYTE#0; END_FOR; - UserDataChanged := User.DataChanged; + UserDataChanged := UserData.DataChanged; END_IF; END_METHOD @@ -497,8 +499,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 SoftEventTask.Initialize(THIS); _Messenger.Serve(THIS); - // _TaskMessenger.Serve(THIS); - + THIS.UpdateInputs(refAcquisitionStatus,refInspectionStatus,refCommandStatus,refSoftEventStatus,refResultData); //*************RESTORE******************** @@ -524,7 +525,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 //*************CHANGE JOB BY NAME********* _taskDisabled := _taskDisabled OR TriggerTask.IsBusy(); ChangeJobByNameTask.IsDisabled := _taskDisabled; - ChangeJobByNameTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(User),REF(_TaskMessenger)); + ChangeJobByNameTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(UserData),REF(_TaskMessenger)); //**************************************** //*************CHANGE JOB BY NUMBER******* diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByName.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByName.st index 4d8cb5830..808169230 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByName.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByName.st @@ -39,7 +39,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _refMessenger := refMessenger; IF THIS.Execute() THEN - _refMessenger^.Serve(THIS); + refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#311; refStatus^.Error.Id := UINT#0; diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByNumber.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByNumber.st index 862a6105b..733e4fe5c 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByNumber.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightChangeJobByNumber.st @@ -38,7 +38,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _refMessenger := refMessenger; IF THIS.Execute() THEN - _refMessenger^.Serve(THIS); + refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#315; refStatus^.Error.Id := UINT#0; diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightClearInspectionResults.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightClearInspectionResults.st index 6e5ed6bce..bbfbbc4b2 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightClearInspectionResults.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightClearInspectionResults.st @@ -40,7 +40,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _refMessenger := refMessenger; IF THIS.Execute() THEN - _refMessenger^.Serve(THIS); + refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#302; refStatus^.Error.Id := UINT#0; @@ -56,7 +56,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 refResults^.InspectionID := UINT#0; refResults^.ResultCode := UINT#0; - FOR _index := 0 TO 250 DO + FOR _index := 0 TO 249 DO refInspectionResults^.Data[_index] := BYTE#0; END_FOR; refInspectionResults^.DataChanged := NOT refInspectionResults^.DataChanged ; diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightSoftEvent.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightSoftEvent.st index 2559ec455..aa9b5fdfa 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightSoftEvent.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightSoftEvent.st @@ -40,7 +40,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _refMessenger := refMessenger; IF THIS.Execute() THEN - _refMessenger^.Serve(THIS); + refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#319; refStatus^.Error.Id := UINT#0; diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightTrigger.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightTrigger.st index 99216fc01..9f63809f2 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightTrigger.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/Tasks/AxoInsightTrigger.st @@ -43,7 +43,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _refMessenger := refMessenger; IF THIS.Execute() THEN - _refMessenger^.Serve(THIS); + refMessenger^.Serve(THIS); IF _progress = 0 THEN refStatus^.Action.Id := UINT#305; refStatus^.Error.Id := UINT#0; @@ -167,7 +167,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 FOR _index := 0 TO (TO_INT(refStatus^.ResultDataSize) - INT#1) DO refInspectionResults^.Data[_index] := refResultData^[_index + 4]; END_FOR; - FOR _index := refStatus^.ResultDataSize TO 250 DO + FOR _index := refStatus^.ResultDataSize TO 249 DO refInspectionResults^.Data[_index] := BYTE#0; END_FOR; refInspectionResults^.DataChanged := NOT refInspectionResults^.DataChanged ; diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/TypeStructuresAndEnums/AxoInsight_ResultData.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/TypeStructuresAndEnums/AxoInsight_ResultData.st index d4b353c17..65748a28b 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/TypeStructuresAndEnums/AxoInsight_ResultData.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/TypeStructuresAndEnums/AxoInsight_ResultData.st @@ -1,7 +1,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoInsight_ResultData EXTENDS AXOpen.Core.AxoByteArray VAR PUBLIC - Data : ARRAY [0..250] OF BYTE; + Data : ARRAY [0..249] OF BYTE; END_VAR END_CLASS END_NAMESPACE diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/TypeStructuresAndEnums/AxoInsight_UserData.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/TypeStructuresAndEnums/AxoInsight_UserData.st index 1269ba7fa..c59a3b797 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/TypeStructuresAndEnums/AxoInsight_UserData.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/TypeStructuresAndEnums/AxoInsight_UserData.st @@ -1,7 +1,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 CLASS PUBLIC AxoInsight_UserData EXTENDS AXOpen.Core.AxoByteArray VAR PUBLIC - Data : ARRAY [0..254] OF BYTE; + Data : ARRAY [0..253] OF BYTE; END_VAR END_CLASS END_NAMESPACE diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs index 5e0f581c1..69ee2e47a 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -5,10 +5,67 @@ using System.Threading.Tasks; using AXOpen.Components.Abstractions; +using AXOpen.Messaging.Static; +using AXSharp.Connector; + namespace AXOpen.Cognex.Vision.v_6_0_0_0 { public partial class AxoDataman { + partial void PostConstruct(ITwinObject parent, string readableTail, string symbolTail) + { + try + { + InitializeMessenger(); + InitializeTaskMessenger(); + } + catch (Exception) + { + + throw; + } + } + private void InitializeMessenger() + { + List> messengerTextList = new List> + { + new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), + new KeyValuePair(700, new AxoMessengerTextItem("Parent has NULL reference!", "Check the call of the `Run` method, if the `parent` parameter is assigned.")), + new KeyValuePair(701, new AxoMessengerTextItem("refAcquisitionControl has NULL reference!", "Check the call of the `Run` method, if the `refAcquisitionControl` parameter is assigned.")), + new KeyValuePair(702, new AxoMessengerTextItem("refAcquisitionStatus has NULL reference!", "Check the call of the `Run` method, if the `refAcquisitionStatus` parameter is assigned.")), + new KeyValuePair(703, new AxoMessengerTextItem("refResultsControl has NULL reference!", "Check the call of the `Run` method, if the `refResultsControl` parameter is assigned.")), + new KeyValuePair(704, new AxoMessengerTextItem("refResultsStatus has NULL reference!", "Check the call of the `Run` method, if the `refResultsStatus` parameter is assigned.")), + new KeyValuePair(705, new AxoMessengerTextItem("refSoftEventControl has NULL reference!", "Check the call of the `Run` method, if the `refSoftEventControl` parameter is assigned.")), + new KeyValuePair(706, new AxoMessengerTextItem("refSoftEventStatus has NULL reference!", "Check the call of the `Run` method, if the `refSoftEventStatus` parameter is assigned.")), + new KeyValuePair(707, new AxoMessengerTextItem("refResultData has NULL reference!", "Check the call of the `Run` method, if the `refResultData` parameter is assigned.")), + new KeyValuePair(708, new AxoMessengerTextItem("refUserData has NULL reference!", "Check the call of the `Run` method, if the `refUserData` parameter is assigned.")), + new KeyValuePair(709, new AxoMessengerTextItem("refResultData has invalid size!", "Check the size of the `refResultData`.")), + new KeyValuePair(710, new AxoMessengerTextItem("refResultData-lower bound index is not zero!", "Check if the `refResultData` parameter is zero-based.")), + new KeyValuePair(711, new AxoMessengerTextItem("refUserData has invalid size!", "Check the size of the `refUserData`.")), + new KeyValuePair(712, new AxoMessengerTextItem("refUserData-lower bound index is not zero!", "Check if the `refUsertData` parameter is zero-based.")), + new KeyValuePair(713, new AxoMessengerTextItem("The ResultData length exceeds the configured hardware structure's length!", "Change the configured hardware structure's length!")), + }; + + _Messenger.DotNetMessengerTextList = messengerTextList; + } + + private void InitializeTaskMessenger() + { + List> messengerTextList = new List> + { + new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), + new KeyValuePair(600, new AxoMessengerTextItem("Waiting for the signal ResultsAvailable to be reseted!" ,"Check the status of the `ResultsAvailable` signal.")), + new KeyValuePair(601, new AxoMessengerTextItem("Waiting for the signal TriggerReady to be set!" ,"Check the status of the `TriggerReady` signal.")), + new KeyValuePair(602, new AxoMessengerTextItem("Waiting for the signal TriggerAcknowledge to be set!" ,"Check the status of the `TriggerAcknowledge` signal.")), + new KeyValuePair(603, new AxoMessengerTextItem("Waiting for the signal ResultsAvailable to be set!" ,"Check the status of the `ResultsAvailable` signal.")), + new KeyValuePair(604, new AxoMessengerTextItem("Waiting for the ResultData to be copied!" ,"Check the status of the `ResultData` data.")), + new KeyValuePair(605, new AxoMessengerTextItem("Waiting for the TriggerReady to be reseted!" ,"Check the status of the `TriggerReady` signal.")), + new KeyValuePair(606, new AxoMessengerTextItem("Waiting for the ErrorDetected to be reseted!" ,"Check the status of the `ErrorDetected` signal.")), + + }; + + _TaskMessenger.DotNetMessengerTextList = messengerTextList; + } } public partial class AxoDataman_Status : AxoComponent_Status @@ -23,11 +80,14 @@ public string ErrorDescription if(errorDescriptionDict == null) { errorDescriptionDict = new Dictionary(); } if(errorDescriptionDict.Count == 0) { - errorDescriptionDict.Add(0 , " "); - errorDescriptionDict.Add(600, "Waiting for the signal ResultsAvailable to be reseted!"); - errorDescriptionDict.Add(601, "Waiting for the signal TriggerReady to be set!"); - errorDescriptionDict.Add(602, "Waiting for the signal TriggerAcknowledge to be set!"); - errorDescriptionDict.Add(603, "Waiting for the signal ResultsAvailable to be set!"); + errorDescriptionDict.Add(0, " "); + errorDescriptionDict.Add(600, "Waiting for the signal ResultsAvailable to be reseted!"); + errorDescriptionDict.Add(601, "Waiting for the signal TriggerReady to be set!"); + errorDescriptionDict.Add(602, "Waiting for the signal TriggerAcknowledge to be set!"); + errorDescriptionDict.Add(603, "Waiting for the signal ResultsAvailable to be set!"); + errorDescriptionDict.Add(604, "Waiting for the ResultData to be copied!"); + errorDescriptionDict.Add(605, "Waiting for the TriggerReady to be reseted!"); + errorDescriptionDict.Add(606, "Waiting for the ErrorDetected to be reseted!"); errorDescriptionDict.Add(700, "Error: Parent has NULL reference!"); diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st index 34e264c3e..c4d5b3c4e 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionDatamanExample.st @@ -50,7 +50,8 @@ NAMESPACE AxoCognexVisionDatamanExamples // IF MyDataman1.Read().IsDone() THEN //Process the result data - myString := MyDataman1.Results.Data; + // myString := MyDataman1.ResultData.Data; + ; END_IF; // From 0795955eb5b58f946a45b56a6022595362529572 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Tue, 29 Aug 2023 22:53:33 +0200 Subject: [PATCH 18/28] Cognex Dataman-messengers added --- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 23 +++++----------- .../AxoDataman_Status.st | 1 - .../ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st | 27 +++++-------------- 3 files changed, 13 insertions(+), 38 deletions(-) diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 0ea2b0898..fecc2f505 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -98,10 +98,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR - VAR PRIVATE - _taskDisabled : BOOL; - END_VAR - /// /// Restores this instance . /// @@ -142,8 +138,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 SoftEventControl.Reserved06 := FALSE; SoftEventControl.SetMatchString := FALSE; - // User.Option := UINT#0; - // User.Length := UINT#0; + User.Option := UINT#0; + User.Length := UINT#0; FOR _index := 0 TO 249 DO UserData.Data[_index] := BYTE#0; END_FOR; @@ -290,9 +286,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 FOR index := 0 TO (TO_INT(User.Length) - INT#1) DO refUserData^[index + 4] := UserData.Data[index]; END_FOR; - FOR index := TO_INT(User.Length) TO 249 DO - refUserData^[index + 4] := BYTE#0; - END_FOR; UserDataChanged := UserData.DataChanged; END_IF; END_METHOD @@ -447,29 +440,25 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _Messenger.Serve(THIS); THIS.UpdateInputs(refAcquisitionStatus,refResultsStatus,refSoftEventStatus,refResultData); - //THIS.UpdateSignalStates(); - + IF Config.ContinuousReading THEN THIS.ContinuousReading(REF(Status), REF(Results),refResultData); END_IF; //*************RESTORE******************** - _taskDisabled := FALSE; - RestoreTask.IsDisabled := _taskDisabled; + RestoreTask.IsDisabled := FALSE; IF RestoreTask.Execute() THEN THIS.Restore(); END_IF; //**************************************** //*************CLEAR*DATA***************** - _taskDisabled := _taskDisabled OR RestoreTask.IsBusy(); - ClearResultDataTask.IsDisabled := _taskDisabled; + ClearResultDataTask.IsDisabled := RestoreTask.IsBusy() OR ReadTask.IsBusy(); ClearResultDataTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(ResultsControl),REF(ResultsStatus),REF(Config),REF(Status),REF(Results),REF(ResultData),REF(_TaskMessenger)); //**************************************** //*************READ*********************** - _taskDisabled := _taskDisabled OR ClearResultDataTask.IsBusy(); - ReadTask.IsDisabled := _taskDisabled; + ReadTask.IsDisabled := RestoreTask.IsBusy() OR ClearResultDataTask.IsBusy(); ReadTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(ResultsControl),REF(ResultsStatus),REF(Config),REF(Status),REF(Results),REF(ResultData),refResultData,REF(_TaskMessenger)); //**************************************** diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st index 9153fa0cf..4e33e52af 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/TypeStructuresAndEnums/AxoDataman_Status.st @@ -3,7 +3,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[Container(Layout.Stack)]} CLASS AxoDataman_Status EXTENDS AXOpen.Components.Abstractions.AxoComponent_Status VAR PUBLIC - // SignalStatus : AxoDataman_SignalStates; {#ix-attr:[Container(Layout.Wrap)]} ResultDataSize : eAxoDataman_ResultDataSize := eAxoDataman_ResultDataSize#RESULT_DATA_SIZE_INVALID; {#ix-attr:[CompilerOmits()]} diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st index 3f84feaca..308894d8a 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st @@ -134,10 +134,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 _TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR - VAR PRIVATE - _taskDisabled : BOOL; - END_VAR - /// /// Restores this instance . /// @@ -167,7 +163,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 InspectionResults.Data[_index] := BYTE#0; END_FOR; InspectionResults.ToggleDataChangedFlag(); - + AcquisitionControl.TriggerEnable := FALSE; AcquisitionControl.Trigger := FALSE; AcquisitionControl.ClearExposureComplete := AcquisitionStatus.ExposureComplete; @@ -356,9 +352,6 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 FOR index := 0 TO Status.UserDataSize - 1 DO refUserData^[index] := UserData.Data[index]; END_FOR; - FOR index := Status.UserDataSize TO 253 DO - refUserData^[index] := BYTE#0; - END_FOR; UserDataChanged := UserData.DataChanged; END_IF; END_METHOD @@ -503,40 +496,34 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 THIS.UpdateInputs(refAcquisitionStatus,refInspectionStatus,refCommandStatus,refSoftEventStatus,refResultData); //*************RESTORE******************** - _taskDisabled := FALSE; - RestoreTask.IsDisabled := _taskDisabled; + RestoreTask.IsDisabled := FALSE; IF RestoreTask.Execute() THEN THIS.Restore(); END_IF; //**************************************** //*************CLEAR*DATA***************** - _taskDisabled := _taskDisabled OR RestoreTask.IsBusy(); - ClearInspectionResultsTask.IsDisabled := _taskDisabled; + ClearInspectionResultsTask.IsDisabled := RestoreTask.IsBusy() OR TriggerTask.IsBusy() OR ChangeJobByNameTask.IsBusy() OR ChangeJobByNumberTask.IsBusy() OR SoftEventTask.IsBusy(); ClearInspectionResultsTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(Config),REF(Status),REF(Results),REF(InspectionResults),REF(_TaskMessenger)); //**************************************** //*************READ*********************** - _taskDisabled := _taskDisabled OR ClearInspectionResultsTask.IsBusy(); - TriggerTask.IsDisabled := _taskDisabled; + TriggerTask.IsDisabled := RestoreTask.IsBusy() OR ClearInspectionResultsTask.IsBusy() OR ChangeJobByNameTask.IsBusy() OR ChangeJobByNumberTask.IsBusy() OR SoftEventTask.IsBusy(); TriggerTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(Results),REF(InspectionResults),refResultData,REF(_TaskMessenger)); //**************************************** //*************CHANGE JOB BY NAME********* - _taskDisabled := _taskDisabled OR TriggerTask.IsBusy(); - ChangeJobByNameTask.IsDisabled := _taskDisabled; + ChangeJobByNameTask.IsDisabled := RestoreTask.IsBusy() OR ClearInspectionResultsTask.IsBusy() OR TriggerTask.IsBusy() OR ChangeJobByNumberTask.IsBusy() OR SoftEventTask.IsBusy(); ChangeJobByNameTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(UserData),REF(_TaskMessenger)); //**************************************** //*************CHANGE JOB BY NUMBER******* - _taskDisabled := _taskDisabled OR ChangeJobByNameTask.IsBusy(); - ChangeJobByNumberTask.IsDisabled := _taskDisabled; + ChangeJobByNumberTask.IsDisabled := RestoreTask.IsBusy() OR ClearInspectionResultsTask.IsBusy() OR TriggerTask.IsBusy() OR ChangeJobByNameTask.IsBusy() OR SoftEventTask.IsBusy(); ChangeJobByNumberTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(_TaskMessenger)); //**************************************** //*************Soft event***************** - _taskDisabled := _taskDisabled OR ChangeJobByNameTask.IsBusy(); - SoftEventTask.IsDisabled := _taskDisabled; + SoftEventTask.IsDisabled := RestoreTask.IsBusy() OR ClearInspectionResultsTask.IsBusy() OR TriggerTask.IsBusy() OR ChangeJobByNameTask.IsBusy() OR ChangeJobByNumberTask.IsBusy(); SoftEventTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(SoftEventControl),REF(SoftEventStatus),REF(_TaskMessenger)); //**************************************** From bcbef741ce774d906a506d3d2c1c6ea2870d5768 Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Tue, 29 Aug 2023 23:23:40 +0200 Subject: [PATCH 19/28] wip --- .../app/ix-blazor/PneumaticComponents.blazor/_Imports.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor index 2af591e8a..b23cf1cf3 100644 --- a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor @@ -8,7 +8,7 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using pneumaticcomponents.blazor -@using pneumaticcomponents.blazor.Shared +@*@using pneumaticcomponents.blazor.Shared*@ @using AXSharp.Presentation.Blazor.Controls.RenderableContent @using Microsoft.Extensions.Localization From fee87b222fa91e0849310772488d909648797510 Mon Sep 17 00:00:00 2001 From: Branko Zachemsky Date: Wed, 30 Aug 2023 15:16:34 +0200 Subject: [PATCH 20/28] Added Popover on help in AxoMessengerView --- .../Static/AxoMessengerView.razor | 7 ++---- .../Static/AxoMessengerView.razor.cs | 23 +++++++++++-------- .../Static/AxoMessengerView.razor.js | 4 ++++ 3 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.js diff --git a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor index 1db107dd7..07c92b44c 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor @@ -16,14 +16,11 @@ - +
-} \ No newline at end of file +} diff --git a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs index 544de7068..90c40f978 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs @@ -1,6 +1,7 @@ using AXSharp.Connector; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.JSInterop; using System.Security.Principal; using static System.Runtime.InteropServices.JavaScript.JSType; @@ -12,6 +13,16 @@ public partial class AxoMessengerView : IDisposable [Inject] protected AuthenticationStateProvider? AuthenticationStateProvider { get; set; } + [Inject] + protected IJSRuntime js { get; set; } + private IJSObjectReference? jsModule; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + var jsObject = await js.InvokeAsync("import", "./_content/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.js"); + await jsObject.InvokeVoidAsync("addPopovers"); + } + protected async Task GetCurrentUserName() { var authenticationState = await AuthenticationStateProvider?.GetAuthenticationStateAsync(); @@ -24,17 +35,11 @@ public partial class AxoMessengerView : IDisposable return authenticationState?.User?.Identity; } - private bool showHelp = false; - private async void AcknowledgeTask() { Component.AcknowledgeRequest.Cyclic = true; AxoApplication.Current.Logger.Information($"Message '{this.MessageText}' acknowledged.", this.Component, await GetCurrentUserIdentity()); } - private void Help() - { - showHelp = !showHelp; - } protected override void OnInitialized() { base.OnInitialized(); @@ -51,7 +56,7 @@ private string BackgroundColor get { string retval = "btn-default"; - if(IsActive) + if (IsActive) { retval = AckBtnBackgroundColor; } @@ -92,7 +97,7 @@ private string Category case 100: return "Trace"; break; - case 200: + case 200: return "Debug"; break; case 300: @@ -128,7 +133,7 @@ private string Category default: return "None"; break; - } + } } } private string Description => string.IsNullOrEmpty(Component.AttributeName) ? Component.GetSymbolTail() : Component.AttributeName; diff --git a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.js b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.js new file mode 100644 index 000000000..75fb16d24 --- /dev/null +++ b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.js @@ -0,0 +1,4 @@ +export function addPopovers() { + const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]') + const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl)) +} \ No newline at end of file From 1ad27799438d3740028a9b2c54a73a0f7566a74d Mon Sep 17 00:00:00 2001 From: Tomas Kovac Date: Wed, 30 Aug 2023 16:48:59 +0200 Subject: [PATCH 21/28] wip --- src/components.cognex.vision/app/apax.yml | 4 ++ .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 12 ++-- .../ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st | 19 +++-- .../AxoDataman/v_6_0_0/AxoDataman.cs | 32 +++++---- .../AxoInsight/v_6_0_0/AxoInsight.cs | 16 ++++- .../PneumaticComponents.blazor/_Imports.razor | 2 +- .../src/AxoMessaging/Static/AxoMessenger.st | 72 +++++++++++++------ .../AxoArrays/AxoByteArrayView.razor.cs | 10 ++- .../Static/AxoMessengerView.razor.cs | 2 +- src/integrations/ctrl/apax.yml | 8 ++- src/integrations/ctrl/messaging.mon | 3 + .../AxoStaticMessengerExample.st | 32 +++++++-- src/integrations/ctrl/src/program.st | 2 + 13 files changed, 158 insertions(+), 56 deletions(-) create mode 100644 src/integrations/ctrl/messaging.mon diff --git a/src/components.cognex.vision/app/apax.yml b/src/components.cognex.vision/app/apax.yml index 750fae655..7a198db57 100644 --- a/src/components.cognex.vision/app/apax.yml +++ b/src/components.cognex.vision/app/apax.yml @@ -7,6 +7,7 @@ devDependencies: dependencies: "@ix-ax/axopen.cognex.vision": '0.1.4-alpha.79' "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' + "@ax/plc-mode": ^1.0.0 variables: APAX_BUILD_ARGS: - "--debug" # Generate debug information for target "1500" @@ -68,5 +69,8 @@ scripts: - START=$(date +%s) - apax do-it-all - echo "Finished in :" $(expr $(date +%s) - $START) "s" + r: + - apax plc-mode set stop -t $AXTARGET -y + - apax plc-mode set run -t $AXTARGET -y targets: - plcsim diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index fecc2f505..0b4b23b19 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -92,10 +92,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[ReadOnly()]} UserData : AxoDataman_UserData; - {#ix-attr:[ReadOnly()]} - _Messenger : AXOpen.Messaging.Static.AxoMessenger; - {#ix-attr:[ReadOnly()]} - _TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; + _Messenger : AXOpen.Messaging.Static.AxoMessenger; + _TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR /// @@ -462,6 +460,12 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 ReadTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(ResultsControl),REF(ResultsStatus),REF(Config),REF(Status),REF(Results),REF(ResultData),refResultData,REF(_TaskMessenger)); //**************************************** + _Messenger.ActivateOnCondition(ULINT#714,ClearResultDataTask.HasError(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#715,ReadTask.HasError(), eAxoMessageCategory#Error); + + _Messenger.ActivateOnCondition(ULINT#716,ClearResultDataTask.IsAborted(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#717,ReadTask.IsAborted(), eAxoMessageCategory#Error); + THIS.UpdateOutputs(refAcquisitionControl,refResultsControl,refSoftEventControl,refUserData); END_METHOD diff --git a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st index 308894d8a..2b1db89c2 100644 --- a/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st +++ b/src/components.cognex.vision/ctrl/src/AxoInsight/v_6_0_0/AxoInsight.st @@ -128,10 +128,8 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[ReadOnly()]} UserData : AxoInsight_UserData; - {#ix-attr:[ReadOnly()]} - _Messenger : AXOpen.Messaging.Static.AxoMessenger; - {#ix-attr:[ReadOnly()]} - _TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; + _Messenger : AXOpen.Messaging.Static.AxoMessenger; + _TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; END_VAR /// @@ -345,6 +343,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 Status.Error.Id := UINT#714; UpdateOutputs := FALSE; END_IF; + _Messenger.ActivateOnCondition(ULINT#713,Status.UserDataSize = eAxoInsight_UserDataSize#USER_DATA_SIZE_INVALID, eAxoMessageCategory#ProgrammingError); _Messenger.ActivateOnCondition(ULINT#714,LOWER_BOUND(refUserData^,1) <> 0, eAxoMessageCategory#ProgrammingError); @@ -527,6 +526,18 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 SoftEventTask.Run(REF(AcquisitionControl),REF(AcquisitionStatus),REF(InspectionControl),REF(InspectionStatus),REF(CommandControl),REF(Config),REF(Status),REF(SoftEventControl),REF(SoftEventStatus),REF(_TaskMessenger)); //**************************************** + _Messenger.ActivateOnCondition(ULINT#717,ClearInspectionResultsTask.HasError(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#718,TriggerTask.HasError(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#719,ChangeJobByNameTask.HasError(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#720,ChangeJobByNumberTask.HasError(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#721,SoftEventTask.HasError(), eAxoMessageCategory#Error); + + _Messenger.ActivateOnCondition(ULINT#722,ClearInspectionResultsTask.IsAborted(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#723,TriggerTask.IsAborted(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#724,ChangeJobByNameTask.IsAborted(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#725,ChangeJobByNumberTask.IsAborted(), eAxoMessageCategory#Error); + _Messenger.ActivateOnCondition(ULINT#726,SoftEventTask.IsAborted(), eAxoMessageCategory#Error); + THIS.UpdateOutputs(refAcquisitionControl,refInspectionControl,refCommandControl,refSoftEventControl,refUserData); END_METHOD diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs index 69ee2e47a..e46e804fc 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoDataman/v_6_0_0/AxoDataman.cs @@ -30,20 +30,24 @@ private void InitializeMessenger() List> messengerTextList = new List> { new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), - new KeyValuePair(700, new AxoMessengerTextItem("Parent has NULL reference!", "Check the call of the `Run` method, if the `parent` parameter is assigned.")), - new KeyValuePair(701, new AxoMessengerTextItem("refAcquisitionControl has NULL reference!", "Check the call of the `Run` method, if the `refAcquisitionControl` parameter is assigned.")), - new KeyValuePair(702, new AxoMessengerTextItem("refAcquisitionStatus has NULL reference!", "Check the call of the `Run` method, if the `refAcquisitionStatus` parameter is assigned.")), - new KeyValuePair(703, new AxoMessengerTextItem("refResultsControl has NULL reference!", "Check the call of the `Run` method, if the `refResultsControl` parameter is assigned.")), - new KeyValuePair(704, new AxoMessengerTextItem("refResultsStatus has NULL reference!", "Check the call of the `Run` method, if the `refResultsStatus` parameter is assigned.")), - new KeyValuePair(705, new AxoMessengerTextItem("refSoftEventControl has NULL reference!", "Check the call of the `Run` method, if the `refSoftEventControl` parameter is assigned.")), - new KeyValuePair(706, new AxoMessengerTextItem("refSoftEventStatus has NULL reference!", "Check the call of the `Run` method, if the `refSoftEventStatus` parameter is assigned.")), - new KeyValuePair(707, new AxoMessengerTextItem("refResultData has NULL reference!", "Check the call of the `Run` method, if the `refResultData` parameter is assigned.")), - new KeyValuePair(708, new AxoMessengerTextItem("refUserData has NULL reference!", "Check the call of the `Run` method, if the `refUserData` parameter is assigned.")), - new KeyValuePair(709, new AxoMessengerTextItem("refResultData has invalid size!", "Check the size of the `refResultData`.")), - new KeyValuePair(710, new AxoMessengerTextItem("refResultData-lower bound index is not zero!", "Check if the `refResultData` parameter is zero-based.")), - new KeyValuePair(711, new AxoMessengerTextItem("refUserData has invalid size!", "Check the size of the `refUserData`.")), - new KeyValuePair(712, new AxoMessengerTextItem("refUserData-lower bound index is not zero!", "Check if the `refUsertData` parameter is zero-based.")), - new KeyValuePair(713, new AxoMessengerTextItem("The ResultData length exceeds the configured hardware structure's length!", "Change the configured hardware structure's length!")), + new KeyValuePair(700, new AxoMessengerTextItem("Parent has NULL reference!", "Check the call of the `Run` method, if the `parent` parameter is assigned.")), + new KeyValuePair(701, new AxoMessengerTextItem("refAcquisitionControl has NULL reference!", "Check the call of the `Run` method, if the `refAcquisitionControl` parameter is assigned.")), + new KeyValuePair(702, new AxoMessengerTextItem("refAcquisitionStatus has NULL reference!", "Check the call of the `Run` method, if the `refAcquisitionStatus` parameter is assigned.")), + new KeyValuePair(703, new AxoMessengerTextItem("refResultsControl has NULL reference!", "Check the call of the `Run` method, if the `refResultsControl` parameter is assigned.")), + new KeyValuePair(704, new AxoMessengerTextItem("refResultsStatus has NULL reference!", "Check the call of the `Run` method, if the `refResultsStatus` parameter is assigned.")), + new KeyValuePair(705, new AxoMessengerTextItem("refSoftEventControl has NULL reference!", "Check the call of the `Run` method, if the `refSoftEventControl` parameter is assigned.")), + new KeyValuePair(706, new AxoMessengerTextItem("refSoftEventStatus has NULL reference!", "Check the call of the `Run` method, if the `refSoftEventStatus` parameter is assigned.")), + new KeyValuePair(707, new AxoMessengerTextItem("refResultData has NULL reference!", "Check the call of the `Run` method, if the `refResultData` parameter is assigned.")), + new KeyValuePair(708, new AxoMessengerTextItem("refUserData has NULL reference!", "Check the call of the `Run` method, if the `refUserData` parameter is assigned.")), + new KeyValuePair(709, new AxoMessengerTextItem("refResultData has invalid size!", "Check the size of the `refResultData`.")), + new KeyValuePair(710, new AxoMessengerTextItem("refResultData-lower bound index is not zero!", "Check if the `refResultData` parameter is zero-based.")), + new KeyValuePair(711, new AxoMessengerTextItem("refUserData has invalid size!", "Check the size of the `refUserData`.")), + new KeyValuePair(712, new AxoMessengerTextItem("refUserData-lower bound index is not zero!", "Check if the `refUsertData` parameter is zero-based.")), + new KeyValuePair(713, new AxoMessengerTextItem("The ResultData length exceeds the configured hardware structure's length!", "Change the configured hardware structure's length!")), + new KeyValuePair(714, new AxoMessengerTextItem("Clearing of the result data finished with error!", "Check the details.")), + new KeyValuePair(715, new AxoMessengerTextItem("Reading finished with error!", "Check the details.")), + new KeyValuePair(716, new AxoMessengerTextItem("Clearing of the result data was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(717, new AxoMessengerTextItem("eading was aborted, while not yet completed!", "Check the details.")), }; _Messenger.DotNetMessengerTextList = messengerTextList; diff --git a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs index 71d5020ab..f31600d40 100644 --- a/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs +++ b/src/components.cognex.vision/src/AXOpen.Cognex.Vision/AxoInsight/v_6_0_0/AxoInsight.cs @@ -41,8 +41,20 @@ private void InitializeMessenger() new KeyValuePair(712, new AxoMessengerTextItem("refResultData-lower bound index is not zero!", "Check if the `refResultData` parameter is zero-based.")), new KeyValuePair(713, new AxoMessengerTextItem("refUserData has invalid size!", "Check the size of the `refUserData`.")), new KeyValuePair(714, new AxoMessengerTextItem("refUserData-lower bound index is not zero!", "Check if the `refUsertData` parameter is zero-based.")), + new KeyValuePair(715, new AxoMessengerTextItem("refUserData has invalid size!", "Check the size of the `refUserData`.")), + new KeyValuePair(716, new AxoMessengerTextItem("refUserData-lower bound index is not zero!", "Check if the `refUsertData` parameter is zero-based.")), - }; + new KeyValuePair(717, new AxoMessengerTextItem("Clearing of the inspection results finished with error!", "Check the details.")), + new KeyValuePair(718, new AxoMessengerTextItem("Reading finished with error!", "Check the details.")), + new KeyValuePair(719, new AxoMessengerTextItem("Change job by name finished with error!", "Check the details.")), + new KeyValuePair(720, new AxoMessengerTextItem("Change job by number finished with error!", "Check the details.")), + new KeyValuePair(721, new AxoMessengerTextItem("Soft event finished with error!", "Check the details.")), + new KeyValuePair(722, new AxoMessengerTextItem("Clearing of the inspection results was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(723, new AxoMessengerTextItem("Reading was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(724, new AxoMessengerTextItem("Change job by name was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(725, new AxoMessengerTextItem("Change job by number was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(726, new AxoMessengerTextItem("Soft event was aborted, while not yet completed!", "Check the details.")), + }; _Messenger.DotNetMessengerTextList = messengerTextList; } @@ -89,7 +101,7 @@ private void InitializeTaskMessenger() //new KeyValuePair(725, new AxoMessengerTextItem("","")), //new KeyValuePair(726, new AxoMessengerTextItem("","")), - }; + }; _TaskMessenger.DotNetMessengerTextList = messengerTextList; } diff --git a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor index b23cf1cf3..2af591e8a 100644 --- a/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor +++ b/src/components.pneumatics/app/ix-blazor/PneumaticComponents.blazor/_Imports.razor @@ -8,7 +8,7 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using pneumaticcomponents.blazor -@*@using pneumaticcomponents.blazor.Shared*@ +@using pneumaticcomponents.blazor.Shared @using AXSharp.Presentation.Blazor.Controls.RenderableContent @using Microsoft.Extensions.Localization diff --git a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st index 2e2faa2f3..3641e1530 100644 --- a/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st +++ b/src/core/ctrl/src/AxoMessaging/Static/AxoMessenger.st @@ -55,21 +55,25 @@ NAMESPACE AXOpen.Messaging.Static ELSIF AcknowledgedBeforeFallen THEN AcknowledgedBeforeFallen := FALSE; END_IF; - ELSE - IF IsActive THEN - IF Context.OpenCycleCount() - ActiveContextCount > UINT#1 THEN - THIS.Deactivate(MessageCode); - END_IF; - ELSIF AcknowledgedBeforeFallen THEN - AcknowledgedBeforeFallen := FALSE; - MessageCode := ULINT#0; + IF AcknowledgeRequest THEN + THIS.Acknowledge(); END_IF; END_IF; - - IF AcknowledgeRequest THEN - THIS.Acknowledge(); - END_IF; + // ELSE + // IF IsActive THEN + // IF Context.OpenCycleCount() - ActiveContextCount > UINT#1 THEN + // THIS.Deactivate(MessageCode); + // END_IF; + // ELSIF AcknowledgedBeforeFallen THEN + // AcknowledgedBeforeFallen := FALSE; + // MessageCode := ULINT#0; + // END_IF; + // IF AcknowledgeRequest THEN + // THIS.Acknowledge(MessageCode); + // END_IF; + // END_IF; END_METHOD + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// @@ -181,14 +185,20 @@ NAMESPACE AXOpen.Messaging.Static ActivateOnCondition := THIS; - // IF NOT IsActive AND NOT WaitingForAcknowledge AND _condition THEN - // MessageCode := _messageCode; - // END_IF; IF _condition THEN ActivateOnCondition := THIS.Activate(_messageCode,_category); ELSE THIS.Deactivate(_messageCode); END_IF; + + IF NOT IsActive AND AcknowledgedBeforeFallen THEN + AcknowledgedBeforeFallen := FALSE; + MessageCode := ULINT#0; + END_IF; + + IF AcknowledgeRequest THEN + THIS.Acknowledge(MessageCode); + END_IF; END_METHOD METHOD PRIVATE Deactivate @@ -229,10 +239,31 @@ NAMESPACE AXOpen.Messaging.Static END_IF; END_METHOD - /// - /// TODO-add some docu as this is PUBLIC method (unfortunately) - /// - METHOD PUBLIC Acknowledge + METHOD PRIVATE Acknowledge + VAR_INPUT + _messageCode : ULINT; + END_VAR + IF AXOpen.Core.IsNullContext(Context) THEN + RETURN; + END_IF; + + IF NOT AcknowledgementRequired THEN + RETURN; + END_IF; + + IF MessageCode = _messageCode THEN + IF NOT WaitingForAcknowledge THEN + AcknowledgedBeforeFallen := TRUE; + ELSE + WaitingForAcknowledge := FALSE; + MessageCode := ULINT#0; + END_IF; + AcknowledgeRequest := FALSE; + Acknowledged := Context.GetRtc().NowUTC(); + END_IF; + END_METHOD + + METHOD PRIVATE Acknowledge IF AXOpen.Core.IsNullContext(Context) THEN RETURN; END_IF; @@ -248,10 +279,9 @@ NAMESPACE AXOpen.Messaging.Static MessageCode := ULINT#0; END_IF; AcknowledgeRequest := FALSE; - Acknowledged := Context.GetRtc().NowUTC(); END_METHOD - + /// /// TODO-add some docu as this is PUBLIC method (unfortunately) /// diff --git a/src/core/src/AXOpen.Core.Blazor/AxoArrays/AxoByteArrayView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoArrays/AxoByteArrayView.razor.cs index 0d85af751..aba740cef 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoArrays/AxoByteArrayView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoArrays/AxoByteArrayView.razor.cs @@ -34,11 +34,17 @@ public override void AddToPolling(ITwinElement element, int pollingInterval = 25 protected override void OnInitialized() { UpdateValuesOnChange(Component); - base.OnInitialized(); - UpdateAndFormatData(null, null); + base.OnInitialized(); + } + + protected override async Task OnInitializedAsync() + { + await Task.Run(() => UpdateAndFormatData(null, null)); Component.DataChanged.Subscribe(UpdateAndFormatData); + await base.OnInitializedAsync(); } + private async void UpdateAndFormatData(ITwinPrimitive sender, ValueChangedEventArgs args) { try diff --git a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs index 544de7068..8cbdf81fb 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor.cs @@ -28,7 +28,7 @@ public partial class AxoMessengerView : IDisposable private async void AcknowledgeTask() { - Component.AcknowledgeRequest.Cyclic = true; + Component.AcknowledgeRequest.Cyclic = true; AxoApplication.Current.Logger.Information($"Message '{this.MessageText}' acknowledged.", this.Component, await GetCurrentUserIdentity()); } private void Help() diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index c6111da96..f88e5444b 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -10,6 +10,7 @@ dependencies: "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' "@ix-ax/axopen.cognex.vision": '0.1.4-alpha.79' "@ax/system-serde": ^2.0.2 + "@ax/plc-mode": ^1.0.0 variables: APAX_BUILD_ARGS: [-d] scripts: @@ -17,7 +18,7 @@ scripts: - START=$(date +%s) - dotnet tool restore - dotnet ixc - - echo "Builded by ixc in :" $(expr $(date +%s) - $START) "s" + - echo "Built by ixc in :" $(expr $(date +%s) - $START) "s" download: - START=$(date +%s) - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface @@ -69,6 +70,9 @@ scripts: da: - START=$(date +%s) - apax do-it-all - - echo "Finished in :" $(expr $(date +%s) - $START) "s" + - echo $(date +%D)"-"$(date +%H)":"$(date +%M)":"$(date +%S) " - Finished in :" $(expr $(date +%s) - $START) "s" + r: + - apax plc-mode set stop -t $AXTARGET -y + - apax plc-mode set run -t $AXTARGET -y targets: - plcsim diff --git a/src/integrations/ctrl/messaging.mon b/src/integrations/ctrl/messaging.mon new file mode 100644 index 000000000..a914c9a39 --- /dev/null +++ b/src/integrations/ctrl/messaging.mon @@ -0,0 +1,3 @@ +AxoMessengers._messenger5 +AxoCognexVisionInsightExampleContext.MyInsight._Messenger +AxoCognexVisionInsightExampleContext.MyInsight._TaskMessenger diff --git a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st index bd5cc9b57..e7fccf365 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.Messaging/AxoStaticMessengerExample.st @@ -44,10 +44,24 @@ NAMESPACE AxoStaticMessengerExample {#ix-set:AttributeName = "<#Messenger 5#>"} _messenger5 : AXOpen.Messaging.Static.AxoMessenger; {#ix-attr:[Container(Layout.Wrap)]} - {#ix-set:AttributeName = "<#Set to high to activate the messenger 5#>"} - _messenger5condition : BOOL; - {#ix-set:AttributeName = "<#message 5 code#>"} - _messenger5code : UINT; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 1#>"} + _messenger5condition_1 : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 2#>"} + _messenger5condition_2 : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 3#>"} + _messenger5condition_3 : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 4#>"} + _messenger5condition_4 : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 5#>"} + _messenger5condition_5 : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 6#>"} + _messenger5condition_6 : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 7#>"} + _messenger5condition_7 : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 8#>"} + _messenger5condition_8 : BOOL; + {#ix-set:AttributeName = "<#Set to high to activate the messenger 5 with code 9#>"} + _messenger5condition_9 : BOOL; {#ix-set:AttributeName = "<#Set to high to call the messenger 5#>"} _messenger5callcondition : BOOL; END_VAR @@ -65,7 +79,15 @@ NAMESPACE AxoStaticMessengerExample _messenger4.ActivateOnCondition(_messenger4condition,eAxoMessageCategory#Info).RequireAcknowledgement(); _messenger4.Serve(THIS); IF _messenger5callcondition THEN - _messenger5.ActivateOnCondition(_messenger5code,_messenger5condition,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#1,_messenger5condition_1,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#2,_messenger5condition_2,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#3,_messenger5condition_3,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#4,_messenger5condition_4,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#5,_messenger5condition_5,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#6,_messenger5condition_6,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#7,_messenger5condition_7,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#8,_messenger5condition_8,eAxoMessageCategory#Error).RequireAcknowledgement(); + _messenger5.ActivateOnCondition(ULINT#9,_messenger5condition_9,eAxoMessageCategory#Error).RequireAcknowledgement(); _messenger5.Serve(THIS); ELSE _messenger5.Restore(); diff --git a/src/integrations/ctrl/src/program.st b/src/integrations/ctrl/src/program.st index 93d0d312c..bba9ffea2 100644 --- a/src/integrations/ctrl/src/program.st +++ b/src/integrations/ctrl/src/program.st @@ -73,10 +73,12 @@ PROGRAM MyProgram AxoCognexVisionDatamanExampleContext.PlcInputs := REF(PlcInputs); AxoCognexVisionDatamanExampleContext.PlcOutputs := REF(PlcOutputs); + AxoCognexVisionDatamanExampleContext.InjectRtc(AxoRtc); AxoCognexVisionDatamanExampleContext.Run(); AxoCognexVisionInsightExampleContext.PlcInputs := REF(PlcInputs); AxoCognexVisionInsightExampleContext.PlcOutputs := REF(PlcOutputs); + AxoCognexVisionInsightExampleContext.InjectRtc(AxoRtc); AxoCognexVisionInsightExampleContext.Run(); AxoByteArrayExampleContext.Run(); AxoBoolArrayExampleContext.Run(); From b06022effc32b2e6e0ef84e0788c3cc25bf34bb0 Mon Sep 17 00:00:00 2001 From: TK <61820360+TomKovac@users.noreply.github.com> Date: Wed, 30 Aug 2023 18:27:54 +0200 Subject: [PATCH 22/28] wip --- src/AXOpen.sln | 14 -------------- src/components.cognex.vision/app/apax.yml | 12 +++++------- .../app/src/AXOpen.AxoRtc/AxoS71500Rtc.st | 5 ++++- .../AXOpen.Cognex.Vision/AxoCognexVisionExample.st | 2 +- .../app/src/configuration.st | 2 +- src/components.cognex.vision/app/src/program.st | 4 ++-- .../ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st | 2 ++ src/components.pneumatics/app/apax.yml | 4 ++-- src/core/ctrl/src/AxoArrays/AxoByteArray.st | 1 + .../AxoArrays/AxoByteArrayView.razor.cs | 10 +++++++++- src/integrations/ctrl/apax.yml | 8 +++----- .../AXOpen.AxoByteArray/AxoByteArrayExample.st | 2 ++ .../src/Examples/AXOpen.AxoRtc/AxoS71500Rtc.st | 5 ++++- src/templates.simple/ctrl/apax.yml | 6 ++---- 14 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/AXOpen.sln b/src/AXOpen.sln index 8e477048a..b8d110269 100644 --- a/src/AXOpen.sln +++ b/src/AXOpen.sln @@ -197,10 +197,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Components.Pneumatic EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{EABE6BC4-1679-46EA-A3BB-56CF63A40FE5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PneumaticComponents", "components.pneumatics\app\ix\PneumaticComponents.csproj", "{3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PneumaticComponents.blazor", "components.pneumatics\app\ix-blazor\PneumaticComponents.blazor\PneumaticComponents.blazor.csproj", "{82B49531-E587-4700-8BF3-44D97826B8C5}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -395,14 +391,6 @@ Global {0F38853D-6D5D-4156-9571-E5F3426782AF}.Debug|Any CPU.Build.0 = Debug|Any CPU {0F38853D-6D5D-4156-9571-E5F3426782AF}.Release|Any CPU.ActiveCfg = Release|Any CPU {0F38853D-6D5D-4156-9571-E5F3426782AF}.Release|Any CPU.Build.0 = Release|Any CPU - {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804}.Release|Any CPU.Build.0 = Release|Any CPU - {82B49531-E587-4700-8BF3-44D97826B8C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {82B49531-E587-4700-8BF3-44D97826B8C5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {82B49531-E587-4700-8BF3-44D97826B8C5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {82B49531-E587-4700-8BF3-44D97826B8C5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -485,8 +473,6 @@ Global {3134A28E-12A5-4255-81F4-F84874CE9318} = {1B390C59-FF6C-4721-8DBA-B8176DBA531B} {0F38853D-6D5D-4156-9571-E5F3426782AF} = {3134A28E-12A5-4255-81F4-F84874CE9318} {EABE6BC4-1679-46EA-A3BB-56CF63A40FE5} = {1B390C59-FF6C-4721-8DBA-B8176DBA531B} - {3ADCEF54-D3FC-47C7-AC0D-CB98F5D65804} = {EABE6BC4-1679-46EA-A3BB-56CF63A40FE5} - {82B49531-E587-4700-8BF3-44D97826B8C5} = {EABE6BC4-1679-46EA-A3BB-56CF63A40FE5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {292B45BE-E9CB-443B-979D-C0AFCD8D5675} diff --git a/src/components.cognex.vision/app/apax.yml b/src/components.cognex.vision/app/apax.yml index 83229452b..75bf21a79 100644 --- a/src/components.cognex.vision/app/apax.yml +++ b/src/components.cognex.vision/app/apax.yml @@ -4,10 +4,10 @@ type: app devDependencies: "@ax/sdk": ^4.0.8 "@ax/sld": 0.15.9 + #"@ax/plc-mode": ^1.0.0 dependencies: "@ix-ax/axopen.cognex.vision": '0.1.4-alpha.79' "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' - "@ax/plc-mode": ^1.0.0 variables: APAX_BUILD_ARGS: - "--debug" # Generate debug information for target "1500" @@ -16,11 +16,10 @@ scripts: - START=$(date +%s) - dotnet tool restore - dotnet ixc - - echo "Builded by ixc in :" $(expr $(date +%s) - $START) "s" + - echo "Built by ixc in :" $(expr $(date +%s) - $START) "s" download: - START=$(date +%s) - - apax sld --accept-security-disclaimer -t $AXTARGET -i - $AXTARGETPLATFORMINPUT -r --default-server-interface + - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface - echo "Downloaded in :" $(expr $(date +%s) - $START) "s" check+download: | if [ $AXTARGET ]; then @@ -57,8 +56,7 @@ scripts: postbuild: - apax ixc watch: - - dotnet watch --project - ..\\app_src\\AXOpen.Components.Cognex.Vision.Integrations.Blazor\\axopen_components_cognex_vision_integrations_blazor.csproj + - dotnet watch --project ..\\app_src\\AXOpen.Components.Cognex.Vision.Integrations.Blazor\\axopen_components_cognex_vision_integrations_blazor.csproj rr: - apax build - apax download @@ -70,7 +68,7 @@ scripts: da: - START=$(date +%s) - apax do-it-all - - echo "Finished in :" $(expr $(date +%s) - $START) "s" + - echo $(date +%D)"-"$(date +%H)":"$(date +%M)":"$(date +%S) " - Finished in :" $(expr $(date +%s) - $START) "s" r: - apax plc-mode set stop -t $AXTARGET -y - apax plc-mode set run -t $AXTARGET -y diff --git a/src/components.cognex.vision/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st b/src/components.cognex.vision/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st index 3f919d692..710b3d932 100644 --- a/src/components.cognex.vision/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st +++ b/src/components.cognex.vision/app/src/AXOpen.AxoRtc/AxoS71500Rtc.st @@ -1,7 +1,10 @@ NAMESPACE AxoRtc CLASS AxoS71500Rtc IMPLEMENTS AXOpen.Rtc.IAxoRtc + VAR + _rtc : AXOpen.S71500.Rtc; + END_VAR METHOD PUBLIC NowUTC : LDATE_AND_TIME - Siemens.Simatic.S71500.Clocks.GetSystemDateTime(value => NowUTC); + NowUTC := _rtc.NowUTC(); END_METHOD END_CLASS END_NAMESPACE diff --git a/src/components.cognex.vision/app/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionExample.st b/src/components.cognex.vision/app/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionExample.st index c65d8fdda..4fa13e230 100644 --- a/src/components.cognex.vision/app/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionExample.st +++ b/src/components.cognex.vision/app/src/Examples/AXOpen.Cognex.Vision/AxoCognexVisionExample.st @@ -14,7 +14,7 @@ NAMESPACE AxoCognexVisionExample {#ix-set:AttributeName = "<#Activate manual control#>"} ActivateManualControl : BOOL; PlcInputs : REF_TO PlcInputs; - PlcOutputs : REF_TO PlcOutputs; + PlcOutputs : REF_TO PlcOutputs; END_VAR METHOD PROTECTED OVERRIDE Main diff --git a/src/components.cognex.vision/app/src/configuration.st b/src/components.cognex.vision/app/src/configuration.st index 265e920f2..bce3ddec6 100644 --- a/src/components.cognex.vision/app/src/configuration.st +++ b/src/components.cognex.vision/app/src/configuration.st @@ -8,7 +8,7 @@ CONFIGURATION MyConfiguration {#ix-set:AttributeName = "If counting PLC is alive"} I_am_alive : ULINT; AxoCognexVisionExampleContext : AxoCognexVisionExample.AxoCognexVisionExampleContext; - AxoRtc : AxoRtc.AxoS71500Rtc; + _rtc : AXOpen.S71500.Rtc; END_VAR //Copy this VAR_GLOBAL section into your configuration file inside your project. diff --git a/src/components.cognex.vision/app/src/program.st b/src/components.cognex.vision/app/src/program.st index 2f04cc852..156a6e4d5 100644 --- a/src/components.cognex.vision/app/src/program.st +++ b/src/components.cognex.vision/app/src/program.st @@ -4,7 +4,7 @@ PROGRAM MyProgram AxoCognexVisionExampleContext : AxoCognexVisionExample.AxoCognexVisionExampleContext; PlcInputs : PlcInputs; PlcOutputs : PlcOutputs; - AxoRtc : AxoRtc.AxoS71500Rtc; + _rtc : AXOpen.S71500.Rtc; END_VAR CopyInputs(); @@ -14,7 +14,7 @@ PROGRAM MyProgram AxoCognexVisionExampleContext.PlcInputs := REF(PlcInputs); AxoCognexVisionExampleContext.PlcOutputs := REF(PlcOutputs); AxoCognexVisionExampleContext.Run(); - AxoCognexVisionExampleContext.InjectRtc(AxoRtc); + AxoCognexVisionExampleContext.InjectRtc(_rtc); CopyOutputs(); END_PROGRAM diff --git a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st index 0b4b23b19..2999af56c 100644 --- a/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st +++ b/src/components.cognex.vision/ctrl/src/AxoDataman/v_6_0_0/AxoDataman.st @@ -14,6 +14,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 {#ix-attr:[ComponentHeader()]} {#ix-attr:[ReadOnly()]} {#ix-set:AttributeName = "<#Inspection results#>"} + {#ix-set:DisplayFormat = "string"} ResultData : AxoDataman_ResultData; {#ix-attr:[Container(Layout.Wrap)]} @@ -90,6 +91,7 @@ NAMESPACE AXOpen.Cognex.Vision.v_6_0_0_0 User : AxoDataman_User; {#ix-set:AttributeName = "<#User data#>"} {#ix-attr:[ReadOnly()]} + {#ix-set:DisplayFormat = "hexadecimal"} UserData : AxoDataman_UserData; _Messenger : AXOpen.Messaging.Static.AxoMessenger; diff --git a/src/components.pneumatics/app/apax.yml b/src/components.pneumatics/app/apax.yml index 63a95bcfb..2cdb79d65 100644 --- a/src/components.pneumatics/app/apax.yml +++ b/src/components.pneumatics/app/apax.yml @@ -14,7 +14,7 @@ scripts: - START=$(date +%s) - dotnet tool restore - dotnet ixc - - echo "Builded by ixc in :" $(expr $(date +%s) - $START) "s" + - echo "Built by ixc in :" $(expr $(date +%s) - $START) "s" download: - START=$(date +%s) - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface @@ -65,6 +65,6 @@ scripts: da: - START=$(date +%s) - apax do-it-all - - echo "Finished in :" $(expr $(date +%s) - $START) "s" + - echo $(date +%D)"-"$(date +%H)":"$(date +%M)":"$(date +%S) " - Finished in :" $(expr $(date +%s) - $START) "s" targets: - plcsim diff --git a/src/core/ctrl/src/AxoArrays/AxoByteArray.st b/src/core/ctrl/src/AxoArrays/AxoByteArray.st index 6e7e8cfe8..1f6d6e4fb 100644 --- a/src/core/ctrl/src/AxoArrays/AxoByteArray.st +++ b/src/core/ctrl/src/AxoArrays/AxoByteArray.st @@ -1,4 +1,5 @@ NAMESPACE AXOpen.Core + {#ix-prop: public string DisplayFormat} CLASS PUBLIC AxoByteArray VAR PUBLIC DataChanged : BOOL; diff --git a/src/core/src/AXOpen.Core.Blazor/AxoArrays/AxoByteArrayView.razor.cs b/src/core/src/AXOpen.Core.Blazor/AxoArrays/AxoByteArrayView.razor.cs index aba740cef..00b1f8339 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoArrays/AxoByteArrayView.razor.cs +++ b/src/core/src/AXOpen.Core.Blazor/AxoArrays/AxoByteArrayView.razor.cs @@ -5,7 +5,7 @@ namespace AXOpen.Core { - public enum eDisplayFormat { Array_of_decimals, Array_of_hexdecimals, String }; + public enum eDisplayFormat { Array_of_hexdecimals , Array_of_decimals, String }; public partial class AxoByteArrayView : IDisposable { @@ -62,6 +62,14 @@ private async void UpdateAndFormatData(ITwinPrimitive sender, ValueChangedEventA { length = _data.Length; Data = new IndexedData[_data.Length]; + if (Component.DisplayFormat != null) + { + string _displayFormat = Component.DisplayFormat.ToString().ToLower(); + CurrentDisplayFormat = eDisplayFormat.Array_of_hexdecimals; + if (_displayFormat.Equals("decimal")) CurrentDisplayFormat = eDisplayFormat.Array_of_decimals; + if (_displayFormat.Equals("string")) CurrentDisplayFormat = eDisplayFormat.String; + } + initialized = true; } } diff --git a/src/integrations/ctrl/apax.yml b/src/integrations/ctrl/apax.yml index 9375c34b9..2d0017332 100644 --- a/src/integrations/ctrl/apax.yml +++ b/src/integrations/ctrl/apax.yml @@ -10,7 +10,7 @@ dependencies: "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' "@ix-ax/axopen.cognex.vision": '0.1.4-alpha.79' variables: - APAX_BUILD_ARGS: [ -d ] + APAX_BUILD_ARGS: [-d] scripts: ixc: - START=$(date +%s) @@ -19,8 +19,7 @@ scripts: - echo "Built by ixc in :" $(expr $(date +%s) - $START) "s" download: - START=$(date +%s) - - apax sld --accept-security-disclaimer -t $AXTARGET -i - $AXTARGETPLATFORMINPUT -r --default-server-interface + - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface - echo "Downloaded in :" $(expr $(date +%s) - $START) "s" check+download: | if [ $AXTARGET ]; then @@ -57,8 +56,7 @@ scripts: postbuild: - apax ixc watch: - - dotnet watch --project - ..\\src\\AXOpen.Integrations.Blazor\\axopen_integrations_blazor.csproj + - dotnet watch --project ..\\src\\AXOpen.Integrations.Blazor\\axopen_integrations_blazor.csproj rr: - apax build - apax download diff --git a/src/integrations/ctrl/src/Examples/AXOpen.AxoByteArray/AxoByteArrayExample.st b/src/integrations/ctrl/src/Examples/AXOpen.AxoByteArray/AxoByteArrayExample.st index 87b0a7583..c50eaa7dd 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.AxoByteArray/AxoByteArrayExample.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.AxoByteArray/AxoByteArrayExample.st @@ -5,6 +5,7 @@ USING AXOpen.Core; NAMESPACE AxoByteArrayExample {#ix-attr:[Container(Layout.Stack)]} {#ix-set:AttributeName = "Byte array type with 10 items"} + {#ix-set:DisplayFormat = "hexadecimal"} CLASS PUBLIC AxoByteArray10 EXTENDS AXOpen.Core.AxoByteArray VAR PUBLIC Data : ARRAY [0..9] OF BYTE; @@ -13,6 +14,7 @@ NAMESPACE AxoByteArrayExample {#ix-attr:[Container(Layout.Stack)]} {#ix-set:AttributeName = "Byte array type with 20 items"} + {#ix-set:DisplayFormat = "string"} CLASS PUBLIC AxoByteArray20 EXTENDS AXOpen.Core.AxoByteArray VAR PUBLIC Data : ARRAY [0..19] OF BYTE; diff --git a/src/integrations/ctrl/src/Examples/AXOpen.AxoRtc/AxoS71500Rtc.st b/src/integrations/ctrl/src/Examples/AXOpen.AxoRtc/AxoS71500Rtc.st index 3f919d692..397b64781 100644 --- a/src/integrations/ctrl/src/Examples/AXOpen.AxoRtc/AxoS71500Rtc.st +++ b/src/integrations/ctrl/src/Examples/AXOpen.AxoRtc/AxoS71500Rtc.st @@ -1,7 +1,10 @@ NAMESPACE AxoRtc CLASS AxoS71500Rtc IMPLEMENTS AXOpen.Rtc.IAxoRtc + VAR + _rtc : AXOpen.S71500.Rtc; + END_VAR METHOD PUBLIC NowUTC : LDATE_AND_TIME - Siemens.Simatic.S71500.Clocks.GetSystemDateTime(value => NowUTC); + NowUTC := _rtc.NowUTC(); END_METHOD END_CLASS END_NAMESPACE diff --git a/src/templates.simple/ctrl/apax.yml b/src/templates.simple/ctrl/apax.yml index 7be811286..0d25a894c 100644 --- a/src/templates.simple/ctrl/apax.yml +++ b/src/templates.simple/ctrl/apax.yml @@ -12,7 +12,7 @@ dependencies: "@ix-ax/axopen.inspectors": '0.1.4-alpha.79' "@ix-ax/axopen.simatic1500": '0.1.4-alpha.79' variables: - APAX_BUILD_ARGS: [ -d ] + APAX_BUILD_ARGS: [-d] scripts: ixc: - dotnet tool restore --no-cache @@ -27,8 +27,7 @@ scripts: # Here you will need to set the argumen -t to your plc OP and -i to platfrom you are dowloading to # --default-server-interface is a must if you are using WebAPI - - apax sld --accept-security-disclaimer -t $AXTARGET -i - $AXTARGETPLATFORMINPUT -r --default-server-interface + - apax sld --accept-security-disclaimer -t $AXTARGET -i $AXTARGETPLATFORMINPUT -r --default-server-interface watch: - dotnet watch --project ..\\axosimple.app\\axosimple.hmi.csproj da: @@ -69,5 +68,4 @@ scripts: - apax install - apax rr targets: - - axunit-llvm - plcsim From 38f9dd9c03eed7f13118ce9c5d43bb550e2cbc59 Mon Sep 17 00:00:00 2001 From: Branko Zachemsky Date: Thu, 31 Aug 2023 09:00:44 +0200 Subject: [PATCH 23/28] Added Help header in AxoMessengerView --- .../AxoMessenger/Static/AxoMessengerView.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor index 07c92b44c..460586c05 100644 --- a/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor +++ b/src/core/src/AXOpen.Core.Blazor/AxoMessenger/Static/AxoMessengerView.razor @@ -16,7 +16,7 @@ - + - - - - - - -@code { - private int currentCount = 0; - - -} diff --git a/src/components.cognex.vision/app/ix-blazor/Pages/AxoCognexVision/AxoCognexVisionExample.razor b/src/components.cognex.vision/app/ix-blazor/Pages/Testing.razor similarity index 73% rename from src/components.cognex.vision/app/ix-blazor/Pages/AxoCognexVision/AxoCognexVisionExample.razor rename to src/components.cognex.vision/app/ix-blazor/Pages/Testing.razor index c772c44ab..abb8d9ac1 100644 --- a/src/components.cognex.vision/app/ix-blazor/Pages/AxoCognexVision/AxoCognexVisionExample.razor +++ b/src/components.cognex.vision/app/ix-blazor/Pages/Testing.razor @@ -1,9 +1,10 @@ -@page "/AxoCognexVisionExample" +@page "/Testing" @using axopen_components_cognex_vision_integrations @using AXOpen.Core; @using AXOpen.Cognex.Vision.v_6_0_0_0; -

AxoCognexVisionExample

+ +Testing
@@ -34,15 +35,5 @@
- -
diff --git a/src/components.cognex.vision/app/ix-blazor/Shared/NavMenu.razor b/src/components.cognex.vision/app/ix-blazor/Shared/NavMenu.razor index eb9a05019..968e9b85b 100644 --- a/src/components.cognex.vision/app/ix-blazor/Shared/NavMenu.razor +++ b/src/components.cognex.vision/app/ix-blazor/Shared/NavMenu.razor @@ -19,18 +19,24 @@ + @code { private bool collapseNavMenu = true; @@ -41,3 +47,4 @@ collapseNavMenu = !collapseNavMenu; } } +