From 6992276ac6e4487a47125440ff7a62d614620eb3 Mon Sep 17 00:00:00 2001 From: "MTS\\Tomas_K" Date: Fri, 9 Feb 2024 08:40:46 +0100 Subject: [PATCH 1/7] Rexroth press -update messages --- .../ctrl/src/AxoSmartFunctionKit_v_4_x_x.st | 2 +- .../AxoSmartFunctionKit_v_4_x_x.cs | 112 +++++++++--------- 2 files changed, 56 insertions(+), 58 deletions(-) diff --git a/src/components.rexroth.press/ctrl/src/AxoSmartFunctionKit_v_4_x_x.st b/src/components.rexroth.press/ctrl/src/AxoSmartFunctionKit_v_4_x_x.st index f9ef3e288..34cc1a250 100644 --- a/src/components.rexroth.press/ctrl/src/AxoSmartFunctionKit_v_4_x_x.st +++ b/src/components.rexroth.press/ctrl/src/AxoSmartFunctionKit_v_4_x_x.st @@ -430,7 +430,6 @@ NAMESPACE AXOpen.Components.Rexroth.Press IF _progress = 302 THEN TaskMessenger.ActivateOnCondition(ULINT#502, _infoTimer.output, eAxoMessageCategory#Warning); - TaskMessenger.ActivateOnCondition(TO_ULINT(Inputs.Status), Inputs.Status>WORD#0, eAxoMessageCategory#Error); IF _infoTimer.output THEN ComponentStatus.Error.Id := UINT#502; @@ -472,6 +471,7 @@ NAMESPACE AXOpen.Components.Rexroth.Press ComponentStatus.Action.Id := UINT#102; _progress := 0; END_IF; + TaskMessenger.ActivateOnCondition(TO_ULINT(Inputs.Status), Inputs.Status>WORD#0, eAxoMessageCategory#Error); //******************************************* //*************GetResultsTask*************** GetResultsTask.IsDisabled := Config.IpAddress = ''; diff --git a/src/components.rexroth.press/src/AXOpen.Components.Rexroth.Press/AxoSmartFunctionKit_v_4_x_x/AxoSmartFunctionKit_v_4_x_x.cs b/src/components.rexroth.press/src/AXOpen.Components.Rexroth.Press/AxoSmartFunctionKit_v_4_x_x/AxoSmartFunctionKit_v_4_x_x.cs index 9761a061c..853cb52cb 100644 --- a/src/components.rexroth.press/src/AXOpen.Components.Rexroth.Press/AxoSmartFunctionKit_v_4_x_x/AxoSmartFunctionKit_v_4_x_x.cs +++ b/src/components.rexroth.press/src/AXOpen.Components.Rexroth.Press/AxoSmartFunctionKit_v_4_x_x/AxoSmartFunctionKit_v_4_x_x.cs @@ -177,63 +177,61 @@ private void InitializeTaskMessenger() new KeyValuePair(10210,new AxoMessengerTextItem("Value too large","")), new KeyValuePair(10211, new AxoMessengerTextItem("Value is invalid", "")), new KeyValuePair(20101, new AxoMessengerTextItem("Command active, command transition not permitted","")), - // for (uint i = 30001; i <= 31901; i++) - //{ - // if (i != 31007) new KeyValuePair(i, new AxoMessengerTextItem("Internal error", "")), - //} - - new KeyValuePair(31007, new AxoMessengerTextItem("No available space left on IPC (PR21)","")), - new KeyValuePair(40101,new AxoMessengerTextItem("Clear Error Command not possible","")), - new KeyValuePair(40201,new AxoMessengerTextItem("Reading of SMC variables not possible","")), - new KeyValuePair(40301,new AxoMessengerTextItem("Positioning command cannot be started","")), - new KeyValuePair(40302,new AxoMessengerTextItem("Error in the processing of the stop command","")), - new KeyValuePair(40303,new AxoMessengerTextItem("Target position was not reached","")), - new KeyValuePair(40304,new AxoMessengerTextItem("Manual positioning command: Force limit exceeded","")), - new KeyValuePair(40401,new AxoMessengerTextItem("Reading of motor feedback memory not possible","")), - new KeyValuePair(40501,new AxoMessengerTextItem("Reboot of drive not possible","")), - new KeyValuePair(40601,new AxoMessengerTextItem("Homing could not be started","")), - new KeyValuePair(40602,new AxoMessengerTextItem("Referencing under load not possible","")), - new KeyValuePair(40701,new AxoMessengerTextItem("Could not activate program","")), - new KeyValuePair(40702,new AxoMessengerTextItem("Timeout while program will be activated","")), - new KeyValuePair(40703,new AxoMessengerTextItem("Timeout after program is activated","")), - new KeyValuePair(40801,new AxoMessengerTextItem("Could not write SMC variable","")), - new KeyValuePair(40901,new AxoMessengerTextItem("Transition Error Parameter Mode <> Operation Mode","")), - new KeyValuePair(41001,new AxoMessengerTextItem("Could not start program","")), - new KeyValuePair(41002,new AxoMessengerTextItem("Could not stop program","")), - new KeyValuePair(41003,new AxoMessengerTextItem("Program error: Max. position exceeded","")), - new KeyValuePair(41004,new AxoMessengerTextItem("Program error: Max. force exceeded","")), - new KeyValuePair(41005,new AxoMessengerTextItem("Program error: Cancelled manually","")), - new KeyValuePair(41006,new AxoMessengerTextItem("Program error: Abort due to drive error","")), - new KeyValuePair(41007,new AxoMessengerTextItem("Program error: Could not write Y-Parameter","")), - new KeyValuePair(41008,new AxoMessengerTextItem("Program error: Timeout exceeded","")), - new KeyValuePair(41009,new AxoMessengerTextItem("Program error: Safety active","")), - new KeyValuePair(41010,new AxoMessengerTextItem("Program error: Out of target window, force too low","")), - new KeyValuePair(41011,new AxoMessengerTextItem("Program error: Out of target window, force exceeded","")), - new KeyValuePair(41012,new AxoMessengerTextItem("Program error: Out of target window, invalid force evaluation","")), - new KeyValuePair(41013,new AxoMessengerTextItem("Program error: Out of target window, position too low","")), - new KeyValuePair(41014,new AxoMessengerTextItem("Program error: Out of target window, force and position too low","")), - new KeyValuePair(41015,new AxoMessengerTextItem("Program error: Out of target window, force exceeded, position too low","")), - new KeyValuePair(41016,new AxoMessengerTextItem("Program error: Out of target window, invalid force evaluation, position too low","")), - new KeyValuePair(41017,new AxoMessengerTextItem("Program error: Out of target window, position exceeded","")), - new KeyValuePair(41018,new AxoMessengerTextItem("Program error: Out of target window, force too low, position exceeded","")), - new KeyValuePair(41019,new AxoMessengerTextItem("Program error: Out of target window, force and position exceeded","")), - new KeyValuePair(41020,new AxoMessengerTextItem("Program error: Out of target window, invalid force evaluation, position exceeded","")), - new KeyValuePair(41021,new AxoMessengerTextItem("Program error: Out of target window, invalid position evaluation","")), - new KeyValuePair(41022,new AxoMessengerTextItem("Program error: Out of target window, force too low, invalid position evaluation","")), - new KeyValuePair(41023,new AxoMessengerTextItem("Program error: Out of target window, force exceeded, invalid position evaluation","")), - new KeyValuePair(41024,new AxoMessengerTextItem("Program error: Out of target window, invalid force and position evaluation","")), - new KeyValuePair(41101,new AxoMessengerTextItem("S- or P-parameter could not be read","")), - new KeyValuePair(41201,new AxoMessengerTextItem("S- or P-parameter could not be written","")), - new KeyValuePair(41301,new AxoMessengerTextItem("Could not load Y-Parameter file","")), - new KeyValuePair(41401,new AxoMessengerTextItem("Tare not possible","")), - new KeyValuePair(41501,new AxoMessengerTextItem("Basic parameter loading not possible at drive commissioning","")), - new KeyValuePair(41601,new AxoMessengerTextItem("Absolute dimension could not be set","")), - new KeyValuePair(41701,new AxoMessengerTextItem("Could not read Y-Parameter","")), - new KeyValuePair(41801,new AxoMessengerTextItem("Could not write Y-Parameter","")), - new KeyValuePair(50001,new AxoMessengerTextItem("Character string too long, error while writing","")), - - - }; + new KeyValuePair(31007, new AxoMessengerTextItem("No available space left on IPC (PR21)","")), + new KeyValuePair(40101,new AxoMessengerTextItem("Clear Error Command not possible","")), + new KeyValuePair(40201,new AxoMessengerTextItem("Reading of SMC variables not possible","")), + new KeyValuePair(40301,new AxoMessengerTextItem("Positioning command cannot be started","")), + new KeyValuePair(40302,new AxoMessengerTextItem("Error in the processing of the stop command","")), + new KeyValuePair(40303,new AxoMessengerTextItem("Target position was not reached","")), + new KeyValuePair(40304,new AxoMessengerTextItem("Manual positioning command: Force limit exceeded","")), + new KeyValuePair(40401,new AxoMessengerTextItem("Reading of motor feedback memory not possible","")), + new KeyValuePair(40501,new AxoMessengerTextItem("Reboot of drive not possible","")), + new KeyValuePair(40601,new AxoMessengerTextItem("Homing could not be started","")), + new KeyValuePair(40602,new AxoMessengerTextItem("Referencing under load not possible","")), + new KeyValuePair(40701,new AxoMessengerTextItem("Could not activate program","")), + new KeyValuePair(40702,new AxoMessengerTextItem("Timeout while program will be activated","")), + new KeyValuePair(40703,new AxoMessengerTextItem("Timeout after program is activated","")), + new KeyValuePair(40801,new AxoMessengerTextItem("Could not write SMC variable","")), + new KeyValuePair(40901,new AxoMessengerTextItem("Transition Error Parameter Mode <> Operation Mode","")), + new KeyValuePair(41001,new AxoMessengerTextItem("Could not start program","")), + new KeyValuePair(41002,new AxoMessengerTextItem("Could not stop program","")), + new KeyValuePair(41003,new AxoMessengerTextItem("Program error: Max. position exceeded","")), + new KeyValuePair(41004,new AxoMessengerTextItem("Program error: Max. force exceeded","")), + new KeyValuePair(41005,new AxoMessengerTextItem("Program error: Cancelled manually","")), + new KeyValuePair(41006,new AxoMessengerTextItem("Program error: Abort due to drive error","")), + new KeyValuePair(41007,new AxoMessengerTextItem("Program error: Could not write Y-Parameter","")), + new KeyValuePair(41008,new AxoMessengerTextItem("Program error: Timeout exceeded","")), + new KeyValuePair(41009,new AxoMessengerTextItem("Program error: Safety active","")), + new KeyValuePair(41010,new AxoMessengerTextItem("Program error: Out of target window, force too low","")), + new KeyValuePair(41011,new AxoMessengerTextItem("Program error: Out of target window, force exceeded","")), + new KeyValuePair(41012,new AxoMessengerTextItem("Program error: Out of target window, invalid force evaluation","")), + new KeyValuePair(41013,new AxoMessengerTextItem("Program error: Out of target window, position too low","")), + new KeyValuePair(41014,new AxoMessengerTextItem("Program error: Out of target window, force and position too low","")), + new KeyValuePair(41015,new AxoMessengerTextItem("Program error: Out of target window, force exceeded, position too low","")), + new KeyValuePair(41016,new AxoMessengerTextItem("Program error: Out of target window, invalid force evaluation, position too low","")), + new KeyValuePair(41017,new AxoMessengerTextItem("Program error: Out of target window, position exceeded","")), + new KeyValuePair(41018,new AxoMessengerTextItem("Program error: Out of target window, force too low, position exceeded","")), + new KeyValuePair(41019,new AxoMessengerTextItem("Program error: Out of target window, force and position exceeded","")), + new KeyValuePair(41020,new AxoMessengerTextItem("Program error: Out of target window, invalid force evaluation, position exceeded","")), + new KeyValuePair(41021,new AxoMessengerTextItem("Program error: Out of target window, invalid position evaluation","")), + new KeyValuePair(41022,new AxoMessengerTextItem("Program error: Out of target window, force too low, invalid position evaluation","")), + new KeyValuePair(41023,new AxoMessengerTextItem("Program error: Out of target window, force exceeded, invalid position evaluation","")), + new KeyValuePair(41024,new AxoMessengerTextItem("Program error: Out of target window, invalid force and position evaluation","")), + new KeyValuePair(41101,new AxoMessengerTextItem("S- or P-parameter could not be read","")), + new KeyValuePair(41201,new AxoMessengerTextItem("S- or P-parameter could not be written","")), + new KeyValuePair(41301,new AxoMessengerTextItem("Could not load Y-Parameter file","")), + new KeyValuePair(41401,new AxoMessengerTextItem("Tare not possible","")), + new KeyValuePair(41501,new AxoMessengerTextItem("Basic parameter loading not possible at drive commissioning","")), + new KeyValuePair(41601,new AxoMessengerTextItem("Absolute dimension could not be set","")), + new KeyValuePair(41701,new AxoMessengerTextItem("Could not read Y-Parameter","")), + new KeyValuePair(41801,new AxoMessengerTextItem("Could not write Y-Parameter","")), + new KeyValuePair(50001,new AxoMessengerTextItem("Character string too long, error while writing","")), + }; + + for (uint i = 30001; i <= 31901; i++) + { + if (i != 31007) messengerTextList.Add(new KeyValuePair(i, new AxoMessengerTextItem("Internal error", ""))); + } TaskMessenger.DotNetMessengerTextList = messengerTextList; } From 040dcd7db007ba57dbab507789d278a7bfef5c7a Mon Sep 17 00:00:00 2001 From: "MTS\\Tomas_K" Date: Fri, 9 Feb 2024 08:56:36 +0100 Subject: [PATCH 2/7] Rexroth press update example --- .../app/src/Documentation/Component_1.st | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components.rexroth.press/app/src/Documentation/Component_1.st b/src/components.rexroth.press/app/src/Documentation/Component_1.st index 3a09fe3b5..91b6cfd93 100644 --- a/src/components.rexroth.press/app/src/Documentation/Component_1.st +++ b/src/components.rexroth.press/app/src/Documentation/Component_1.st @@ -57,6 +57,7 @@ CLASS Component_1 EXTENDS AXOpen.Core.AxoObject IF(Steps[0].Execute(Sequencer, 'SFK RESTORE')) THEN //------------------------------------- + ActivateManualControl := FALSE; AxoSmartFunctionKit.Restore(); Sequencer.MoveNext(); //------------------------------------- From 49651d7d6bbb1d824b348d2621217502d6bf3847 Mon Sep 17 00:00:00 2001 From: TK <61820360+TomKovac@users.noreply.github.com> Date: Fri, 9 Feb 2024 09:57:53 +0100 Subject: [PATCH 3/7] kuka robotics library added --- cake/BuildContext.cs | 1 + .../.vscode/settings.json | 3 + .../CHANGES_CHECKLIST.md | 34 ++ .../CREATION_CHECKLIST.md | 53 ++ src/components.kuka.robotics/app/.gitignore | 6 + .../app/AXSharp.config.json | 1 + .../app/JSONREPOS/Groups/AdminGroup | 12 + src/components.kuka.robotics/app/apax.yml | 89 +++ .../app/axsharp.companion.json | 1 + ....Components.Kuka.Robotics.blazorapp.csproj | 19 + .../app/ix-blazor/App.razor | 15 + .../app/ix-blazor/Pages/Component_1.razor | 37 ++ .../app/ix-blazor/Pages/Component_2.razor | 38 ++ .../app/ix-blazor/Pages/Documentation.razor | 7 + .../app/ix-blazor/Pages/Error.cshtml | 42 ++ .../app/ix-blazor/Pages/Error.cshtml.cs | 27 + .../app/ix-blazor/Pages/Index.razor | 9 + .../app/ix-blazor/Pages/Security.razor | 5 + .../app/ix-blazor/Pages/Testing.razor | 6 + .../app/ix-blazor/Pages/_Host.cshtml | 34 ++ .../app/ix-blazor/Program.cs | 107 ++++ .../ix-blazor/Properties/launchSettings.json | 37 ++ .../app/ix-blazor/Shared/MainLayout.razor | 19 + .../app/ix-blazor/Shared/MainLayout.razor.css | 70 +++ .../app/ix-blazor/Shared/NavMenu.razor | 44 ++ .../app/ix-blazor/Shared/NavMenu.razor.css | 68 +++ .../app/ix-blazor/Usings.cs | 2 + .../app/ix-blazor/_Imports.razor | 16 + .../ix-blazor/appsettings.Development.json | 9 + .../app/ix-blazor/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 .../app/ix-blazor/wwwroot/css/site.css | 68 +++ .../app/ix-blazor/wwwroot/favicon.png | Bin 0 -> 1148 bytes src/components.kuka.robotics/app/ix/Entry.cs | 24 + src/components.kuka.robotics/app/ix/Usings.cs | 1 + ...app_axopen_components_kuka_robotics.csproj | 37 ++ .../app/src/Documentation/Component_1.st | 66 +++ .../app/src/Documentation/Component_2.st | 66 +++ .../src/Documentation/DocumentationContext.st | 12 + .../app/src/IO/PLC_LINE/CopyInputs.st | 10 + .../app/src/IO/PLC_LINE/CopyOutputs.st | 10 + .../app/src/IO/PLC_LINE/HwIdentifiers.st | 6 + .../app/src/IO/PLC_LINE/HwInputs.st | 8 + .../app/src/IO/PLC_LINE/HwOutputs.st | 8 + .../app/src/IO/PLC_LINE/PlcInputs.st | 8 + .../app/src/IO/PLC_LINE/PlcOutputs.st | 8 + ..._COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION | 8 + .../_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM | 12 + .../app/src/Sandbox/SandboxContext.st | 21 + .../app/src/configuration.st | 28 + .../app/src/program.st | 26 + src/components.kuka.robotics/app/test/test.st | 14 + .../components.kuka.robotics.sln | 277 +++++++++ src/components.kuka.robotics/ctrl/.gitignore | 8 + src/components.kuka.robotics/ctrl/.npmrc | 1 + .../ctrl/AXSharp.config.json | 1 + src/components.kuka.robotics/ctrl/README.md | 18 + src/components.kuka.robotics/ctrl/apax.yml | 22 + .../ctrl/axsharp.companion.json | 1 + .../ctrl/package-lock.json | 11 + .../ctrl/src/ExampleCylinder.st | 135 +++++ .../ctrl/test/CylinderTests.st | 79 +++ .../docs/CHANGELOG.md | 15 + .../docs/ComponentTemplate.md | 50 ++ .../docs/Component_1.md | 48 ++ .../docs/Component_2.md | 49 ++ src/components.kuka.robotics/docs/README.md | 5 + src/components.kuka.robotics/docs/TROUBLES.md | 5 + src/components.kuka.robotics/docs/index.md | 1 + src/components.kuka.robotics/docs/toc.yml | 22 + src/components.kuka.robotics/slngen.ps1 | 1 + ...pen.Components.Kuka.Robotics.blazor.csproj | 68 +++ .../Properties/AssemblyInfo.cs | 3 + .../README.md | 17 + .../Usings.cs | 1 + .../_Imports.razor | 3 + .../wwwroot/background.png | Bin 0 -> 378 bytes .../wwwroot/exampleJsInterop.js | 6 + .../ExampleCylinder/ExampleCylinder.cs | 19 + .../Properties/AssemblyInfo.cs | 3 + .../AXOpen.Components.Kuka.Robotics/README.md | 20 + .../AXOpen.Components.Kuka.Robotics/Usings.cs | 1 + ..._ax_axopen_components_kuka_robotics.csproj | 87 +++ ...Open.Components.Kuka.Robotics_tests.csproj | 35 ++ .../Usings.cs | 1 + .../xunit.runner.json | 4 + src/components.kuka.robotics/this.proj | 5 + src/components.kuka.robotics/this.sln | 277 +++++++++ src/traversals/apax/apax.yml | 3 + src/traversals/apax/ix/apax_traversal.csproj | 2 + 100 files changed, 3338 insertions(+) create mode 100644 src/components.kuka.robotics/.vscode/settings.json create mode 100644 src/components.kuka.robotics/CHANGES_CHECKLIST.md create mode 100644 src/components.kuka.robotics/CREATION_CHECKLIST.md create mode 100644 src/components.kuka.robotics/app/.gitignore create mode 100644 src/components.kuka.robotics/app/AXSharp.config.json create mode 100644 src/components.kuka.robotics/app/JSONREPOS/Groups/AdminGroup create mode 100644 src/components.kuka.robotics/app/apax.yml create mode 100644 src/components.kuka.robotics/app/axsharp.companion.json create mode 100644 src/components.kuka.robotics/app/ix-blazor/AXOpen.Components.Kuka.Robotics.blazorapp.csproj create mode 100644 src/components.kuka.robotics/app/ix-blazor/App.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/Component_1.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/Component_2.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/Documentation.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/Error.cshtml create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/Error.cshtml.cs create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/Index.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/Security.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/Testing.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Pages/_Host.cshtml create mode 100644 src/components.kuka.robotics/app/ix-blazor/Program.cs create mode 100644 src/components.kuka.robotics/app/ix-blazor/Properties/launchSettings.json create mode 100644 src/components.kuka.robotics/app/ix-blazor/Shared/MainLayout.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Shared/MainLayout.razor.css create mode 100644 src/components.kuka.robotics/app/ix-blazor/Shared/NavMenu.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/Shared/NavMenu.razor.css create mode 100644 src/components.kuka.robotics/app/ix-blazor/Usings.cs create mode 100644 src/components.kuka.robotics/app/ix-blazor/_Imports.razor create mode 100644 src/components.kuka.robotics/app/ix-blazor/appsettings.Development.json create mode 100644 src/components.kuka.robotics/app/ix-blazor/appsettings.json create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css.map create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/FONT-LICENSE create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/ICON-LICENSE create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/README.md create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.eot create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.otf create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.svg create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/open-iconic/font/fonts/open-iconic.woff create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/css/site.css create mode 100644 src/components.kuka.robotics/app/ix-blazor/wwwroot/favicon.png create mode 100644 src/components.kuka.robotics/app/ix/Entry.cs create mode 100644 src/components.kuka.robotics/app/ix/Usings.cs create mode 100644 src/components.kuka.robotics/app/ix/app_axopen_components_kuka_robotics.csproj create mode 100644 src/components.kuka.robotics/app/src/Documentation/Component_1.st create mode 100644 src/components.kuka.robotics/app/src/Documentation/Component_2.st create mode 100644 src/components.kuka.robotics/app/src/Documentation/DocumentationContext.st create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/CopyInputs.st create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/CopyOutputs.st create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/HwInputs.st create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/HwOutputs.st create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/PlcInputs.st create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/PlcOutputs.st create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION create mode 100644 src/components.kuka.robotics/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM create mode 100644 src/components.kuka.robotics/app/src/Sandbox/SandboxContext.st create mode 100644 src/components.kuka.robotics/app/src/configuration.st create mode 100644 src/components.kuka.robotics/app/src/program.st create mode 100644 src/components.kuka.robotics/app/test/test.st create mode 100644 src/components.kuka.robotics/components.kuka.robotics.sln create mode 100644 src/components.kuka.robotics/ctrl/.gitignore create mode 100644 src/components.kuka.robotics/ctrl/.npmrc create mode 100644 src/components.kuka.robotics/ctrl/AXSharp.config.json create mode 100644 src/components.kuka.robotics/ctrl/README.md create mode 100644 src/components.kuka.robotics/ctrl/apax.yml create mode 100644 src/components.kuka.robotics/ctrl/axsharp.companion.json create mode 100644 src/components.kuka.robotics/ctrl/package-lock.json create mode 100644 src/components.kuka.robotics/ctrl/src/ExampleCylinder.st create mode 100644 src/components.kuka.robotics/ctrl/test/CylinderTests.st create mode 100644 src/components.kuka.robotics/docs/CHANGELOG.md create mode 100644 src/components.kuka.robotics/docs/ComponentTemplate.md create mode 100644 src/components.kuka.robotics/docs/Component_1.md create mode 100644 src/components.kuka.robotics/docs/Component_2.md create mode 100644 src/components.kuka.robotics/docs/README.md create mode 100644 src/components.kuka.robotics/docs/TROUBLES.md create mode 100644 src/components.kuka.robotics/docs/index.md create mode 100644 src/components.kuka.robotics/docs/toc.yml create mode 100644 src/components.kuka.robotics/slngen.ps1 create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/AXOpen.Components.Kuka.Robotics.blazor.csproj create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/Properties/AssemblyInfo.cs create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/README.md create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/Usings.cs create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/_Imports.razor create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/wwwroot/background.png create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/wwwroot/exampleJsInterop.js create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ExampleCylinder/ExampleCylinder.cs create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/Properties/AssemblyInfo.cs create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/README.md create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/Usings.cs create mode 100644 src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ix_ax_axopen_components_kuka_robotics.csproj create mode 100644 src/components.kuka.robotics/tests/AXOpen.Components.Kuka.Robotics.Tests/AXOpen.Components.Kuka.Robotics_tests.csproj create mode 100644 src/components.kuka.robotics/tests/AXOpen.Components.Kuka.Robotics.Tests/Usings.cs create mode 100644 src/components.kuka.robotics/tests/AXOpen.Components.Kuka.Robotics.Tests/xunit.runner.json create mode 100644 src/components.kuka.robotics/this.proj create mode 100644 src/components.kuka.robotics/this.sln diff --git a/cake/BuildContext.cs b/cake/BuildContext.cs index 2415dae40..538b02faf 100644 --- a/cake/BuildContext.cs +++ b/cake/BuildContext.cs @@ -170,6 +170,7 @@ public BuildContext(ICakeContext context, BuildParameters buildParameters) ("components.abb.robotics", "axopen.components.abb.robotics", true), ("components.mitsubishi.robotics", "axopen.components.mitsubishi.robotics", true), ("components.ur.robotics", "axopen.components.ur.robotics", true), + ("components.kuka.robotics", "axopen.components.kuka.robotics", true), ("integrations", "ix.integrations", false), ("templates.simple", "templates.simple", false), ("template.axolibrary", "template.axolibrary", false) diff --git a/src/components.kuka.robotics/.vscode/settings.json b/src/components.kuka.robotics/.vscode/settings.json new file mode 100644 index 000000000..fe2c36351 --- /dev/null +++ b/src/components.kuka.robotics/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "dotnet.defaultSolution": "axopencomponentskukarobotics.sln" +} \ No newline at end of file diff --git a/src/components.kuka.robotics/CHANGES_CHECKLIST.md b/src/components.kuka.robotics/CHANGES_CHECKLIST.md new file mode 100644 index 000000000..98f49a6b1 --- /dev/null +++ b/src/components.kuka.robotics/CHANGES_CHECKLIST.md @@ -0,0 +1,34 @@ +## Code + +- [ ] Do the changes follow recomendations from [conventions](../../docfx/articles/guidelines/Conventions.md) and [component convetions](../../docfx/articles/guidelines/components.md.md)? +- [ ] Does your change introduces breaking changes? +- [ ] Did you consult with the maintainers the nature of the breaking changes (version bump)? + + +## Testing + +- [ ] Are all changes unit-tested? +- [ ] Did you change any existing test? Please describe? + +Changed tests +--- +--- + +- [ ] How did you test the changes? + +## Build + +- [ ] Did you change directory structure that may affect the pipeline? + +## Documentation + +- [ ] Did you update the documentation where relevant? + +### Changelog file updates +- [ ] Did you update the [CHANGELOG](docs/CHANGELOG.md)? +- [ ] Did you update the [CHANGELOG](docs/CHANGELOG.md) version according to value set in [GitVersion.yml](../../GitVersion.yml)? +- [ ] Did you describe breaking changes [CHANGELOG](docs/CHANGELOG.md)? +- [ ] Did you describe new features [CHANGELOG](docs/CHANGELOG.md)? +- [ ] Did you describe bug fixies [CHANGELOG](docs/CHANGELOG.md)? + +x` diff --git a/src/components.kuka.robotics/CREATION_CHECKLIST.md b/src/components.kuka.robotics/CREATION_CHECKLIST.md new file mode 100644 index 000000000..3be955c3a --- /dev/null +++ b/src/components.kuka.robotics/CREATION_CHECKLIST.md @@ -0,0 +1,53 @@ +## Code + +- [ ] Does code follow recomendations from [conventions](../../docfx/articles/guidelines/Conventions.md) and [component convetions](../../docfx/articles/guidelines/components.md.md)? + + +## Testing + +- [ ] Are all publicly exposed members unit-tested using axunit? +- [ ] Is the axunit-test coverage at min level of 60%? +- [ ] Are all extended twins tested and is the coverage at min level of 60% ? +- [ ] Are all extended twins tested and is the coverage at min level of 60% ? + +## Build + +- [ ] Did you add this library to [build list](../../cake/BuildContext.cs#Libraries)? +- [ ] Did you add place the library in the [list](../../cake/BuildContext.cs#Libraries) past its dependencies? +- [ ] Did you add this library `src` folder to [build list](../../src/AXOpen-packable-only.proj)? +- [ ] Did you remove all project from the `src` folder that should not be packed? +- [ ] Does the build with test level L2 passes locally? + +## Documentation + +- The documentation should be CONCISE delivering nessary information about the usage of the library. +- The documentation should not explain details about internals of the library limit yourself on explaing how to use, not how it is made. Should it be necessary to explain some aspects in detail write an article instead. +- Do not explain HOW the parts of the library operate but WHAT they do. +- Focus on creating usable examples +- Examples should not be hard-written into to documents, but referenced from the [documentation project](app), the [ComponentTemplate](docs/ComponentTemplate.md) scaffolds the document with example references to documenation project + +## General +- [ ] Does [README.md](./docs/README.md) contain general description of the library? +- [ ] Is the link to this documentation added to the [toc.yaml](../../docfx/components/toc.yml)? + +### CTRL README.md +- [ ] Does [README.md](./ctrl/README.md) for controller contain information about apax package installation instructions? +- [ ] Does [README.md](./ctrl/README.md) for controller contain link to API documentation? +- [ ] Are there any additional requirement regarding usage of this package listed in this [README.md](./ctrl/README.md)? + +### .NET TWIN README.md +- [ ] Does [README.md](./src/AXOpen.Components.Kuka.Robotics/README.md) for .NET TWIN contain information with installation instructions? +- [ ] Does [README.md](./src/AXOpen.Components.Kuka.Robotics/README.md) for .NET TWIN contain link to API documentation? +- [ ] Are there any additional requirement regarding usage of this nuget package listed in this [README.md](./src/AXOpen.Components.Kuka.Robotics/README.md)? + +### BLAZOR README.md +- [ ] Does [README.md](./src/AXOpen.Components.Kuka.Robotics.blazor/README.md) contain information with installation instructions? +- [ ] Does [README.md](./src/AXOpen.Components.Kuka.Robotics.blazor/README.md) contain link to API documentation? +- [ ] Are there any additional requirement regarding usage of this nuget package listed in this [README.md](./src/AXOpen.Components.Kuka.Robotics/README.md)? + + +### Components + +- [ ] Does [toc.yml](./docs/toc.yml) contain references to documenation to all components in this library? +- [ ] Does each component in this library has single md file with examples references from the code and structured according to [ComponentTemplate.md](./docs/ComponentTemplate.md)? + diff --git a/src/components.kuka.robotics/app/.gitignore b/src/components.kuka.robotics/app/.gitignore new file mode 100644 index 000000000..42d9b3c6a --- /dev/null +++ b/src/components.kuka.robotics/app/.gitignore @@ -0,0 +1,6 @@ +.apax +.env +bin + +obj +testresult diff --git a/src/components.kuka.robotics/app/AXSharp.config.json b/src/components.kuka.robotics/app/AXSharp.config.json new file mode 100644 index 000000000..78b233ba7 --- /dev/null +++ b/src/components.kuka.robotics/app/AXSharp.config.json @@ -0,0 +1 @@ +{"OutputProjectFolder":"ix","UseBase":false,"NoDependencyUpdate":false,"IgnoreS7Pragmas":false,"ProjectFile":"app_axopen_components_kuka_robotics.csproj"} \ No newline at end of file diff --git a/src/components.kuka.robotics/app/JSONREPOS/Groups/AdminGroup b/src/components.kuka.robotics/app/JSONREPOS/Groups/AdminGroup new file mode 100644 index 000000000..8fc1109b7 --- /dev/null +++ b/src/components.kuka.robotics/app/JSONREPOS/Groups/AdminGroup @@ -0,0 +1,12 @@ +{ + "Changes": [], + "RecordId": null, + "DataEntityId": "AdminGroup", + "Name": "AdminGroup", + "Roles": [ + "Administrator" + ], + "RolesHash": "AQAAAAIAAYagAAAAEFMQB6OKJ9h2absnop3/241eQ1r0ZKSeKhZ+bKAj028Jt2GjYGXLJF/j94ExpkZt1Q==", + "Created": "2023-10-03T11:15:37.5601334+02:00", + "Modified": "2023-10-03T11:15:37.7766974+02:00" +} \ No newline at end of file diff --git a/src/components.kuka.robotics/app/apax.yml b/src/components.kuka.robotics/app/apax.yml new file mode 100644 index 000000000..79753e929 --- /dev/null +++ b/src/components.kuka.robotics/app/apax.yml @@ -0,0 +1,89 @@ +name: "app_axopen.components.kuka.robotics" +version: '0.0.0-dev.0' +type: app +targets: + - plcsim + - llvm + - "1500" +variables: + APAX_BUILD_ARGS: + - "--debug" # Generate debug information for target "1500" +devDependencies: + "@ix-ax/ax-sdk": '0.0.0-dev.0' + "@ax/sld": 2.0.5 +dependencies: + "@ix-ax/axopen.core": '0.0.0-dev.0' + "@ix-ax/axopen.timers": '0.0.0-dev.0' + "@ix-ax/axopen.abstractions": '0.0.0-dev.0' + "@ix-ax/axopen.components.kuka.robotics": '0.0.0-dev.0' + "@ix-ax/axopen.simatic1500": '0.0.0-dev.0' + "@ax/simatic-1500-clocks": ^6.0.37 +scripts: + delta: + - START=$(date +%s) + - apax build --ignore-scripts + - apax sld load --accept-security-disclaimer -t $AXTARGET -i + $AXTARGETPLATFORMINPUT --mode delta + - echo $(date +%D)"-"$(date +%H)":"$(date +%M)":"$(date +%S) " - Finished in + :" $(expr $(date +%s) - $START) "s" + download: + - START=$(date +%s) + - apax build --ignore-scripts + - dotnet ixc + - apax download_only + - echo $(date +%D)"-"$(date +%H)":"$(date +%M)":"$(date +%S) " - Finished in + :" $(expr $(date +%s) - $START) "s" + ixc: + - START=$(date +%s) + - dotnet tool restore + - dotnet ixc + - echo "Built by ixc in :" $(expr $(date +%s) - $START) "s" + download_only: + - apax sld load --accept-security-disclaimer -t $AXTARGET -i + $AXTARGETPLATFORMINPUT -r + check+download: | + if [ $AXTARGET ]; then + if [ $AXTARGETPLATFORMINPUT ]; then + if ping -n 1 $AXTARGET &> /dev/null; then + echo "Downloading from:" $AXTARGETPLATFORMINPUT "=>" $AXTARGET + apax download_only + 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 + postbuild: + - apax ixc + watch: + - dotnet watch --project + ..\\app\\ix-blazor\\AXOpen.Components.Kuka.Robotics.blazorapp.csproj + fr: + - ..\\..\\integrations\\scripts\\StartPlcSimAdvCli.exe + - apax rr + frw: + - apax fr + - apax watch + rr: + - START=$(date +%s) + - apax install + - apax download + - echo $(date +%D)"-"$(date +%H)":"$(date +%M)":"$(date +%S) " - Finished in + :" $(expr $(date +%s) - $START) "s" + rrw: + - apax rr + - apax watch + r: + - apax plc-mode set stop -t $AXTARGET -y + - apax plc-mode set run -t $AXTARGET -y + d: + - apax download + do: + - apax download_only + dd: + - apax delta +installStrategy: strict +apaxVersion: 3.1.0 diff --git a/src/components.kuka.robotics/app/axsharp.companion.json b/src/components.kuka.robotics/app/axsharp.companion.json new file mode 100644 index 000000000..ed00583ce --- /dev/null +++ b/src/components.kuka.robotics/app/axsharp.companion.json @@ -0,0 +1 @@ +{"Id":"app_axopen_components_kuka_robotics","Version":"0.0.0-dev.0"} \ No newline at end of file diff --git a/src/components.kuka.robotics/app/ix-blazor/AXOpen.Components.Kuka.Robotics.blazorapp.csproj b/src/components.kuka.robotics/app/ix-blazor/AXOpen.Components.Kuka.Robotics.blazorapp.csproj new file mode 100644 index 000000000..e668d95ce --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/AXOpen.Components.Kuka.Robotics.blazorapp.csproj @@ -0,0 +1,19 @@ + + + + + enable + enable + false + + + + + + + + + + + + diff --git a/src/components.kuka.robotics/app/ix-blazor/App.razor b/src/components.kuka.robotics/app/ix-blazor/App.razor new file mode 100644 index 000000000..21b1c2e18 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/App.razor @@ -0,0 +1,15 @@ +@using AxOpen.Security.Service; + + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
+
\ No newline at end of file diff --git a/src/components.kuka.robotics/app/ix-blazor/Pages/Component_1.razor b/src/components.kuka.robotics/app/ix-blazor/Pages/Component_1.razor new file mode 100644 index 000000000..a7d21247e --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Component_1.razor @@ -0,0 +1,37 @@ +@page "/Component_1" +@using AXOpen.Core; + + + +@code +{ + #region WriteTaskDurationToConsole + private async Task WriteTaskTimesToConsole() + { + await Entry.Plc.documentation.componentOne.ExampleCylinder.WriteTaskDurationToConsole(); + } + #endregion + +} + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components.kuka.robotics/app/ix-blazor/Pages/Component_2.razor b/src/components.kuka.robotics/app/ix-blazor/Pages/Component_2.razor new file mode 100644 index 000000000..7b56b6788 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Component_2.razor @@ -0,0 +1,38 @@ +@page "/Component_2" +@using AXOpen.Core; + +Documentation + + + + +@code +{ + #region WriteTaskDurationToConsole + private async Task WriteTaskTimesToConsole() + { + await Entry.Plc.documentation.componentTwo.ExampleCylinder.WriteTaskDurationToConsole(); + } + #endregion + +} + + + + + + + + + + + + + + + + + + + + diff --git a/src/components.kuka.robotics/app/ix-blazor/Pages/Documentation.razor b/src/components.kuka.robotics/app/ix-blazor/Pages/Documentation.razor new file mode 100644 index 000000000..450f461bd --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Documentation.razor @@ -0,0 +1,7 @@ +@page "/Documentation" +@using AXOpen.Core; + + + + + diff --git a/src/components.kuka.robotics/app/ix-blazor/Pages/Error.cshtml b/src/components.kuka.robotics/app/ix-blazor/Pages/Error.cshtml new file mode 100644 index 000000000..a209af848 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Error.cshtml @@ -0,0 +1,42 @@ +@page +@model AXOpen.Components.Kuka.Robotics.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.kuka.robotics/app/ix-blazor/Pages/Error.cshtml.cs b/src/components.kuka.robotics/app/ix-blazor/Pages/Error.cshtml.cs new file mode 100644 index 000000000..5f8820ac0 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Error.cshtml.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using System.Diagnostics; + +namespace AXOpen.Components.Kuka.Robotics.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.kuka.robotics/app/ix-blazor/Pages/Index.razor b/src/components.kuka.robotics/app/ix-blazor/Pages/Index.razor new file mode 100644 index 000000000..6085c4aa9 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Index.razor @@ -0,0 +1,9 @@ +@page "/" + +Index + +

Hello, world!

+ +Welcome to your new app. + + diff --git a/src/components.kuka.robotics/app/ix-blazor/Pages/Security.razor b/src/components.kuka.robotics/app/ix-blazor/Pages/Security.razor new file mode 100644 index 000000000..67f755793 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Security.razor @@ -0,0 +1,5 @@ +@page "/Security" + +

Security

+ + \ No newline at end of file diff --git a/src/components.kuka.robotics/app/ix-blazor/Pages/Testing.razor b/src/components.kuka.robotics/app/ix-blazor/Pages/Testing.razor new file mode 100644 index 000000000..95a20c645 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Testing.razor @@ -0,0 +1,6 @@ +@page "/testing" +@using AXOpen.Components.Kuka.Robotics + +Testing + + diff --git a/src/components.kuka.robotics/app/ix-blazor/Pages/_Host.cshtml b/src/components.kuka.robotics/app/ix-blazor/Pages/_Host.cshtml new file mode 100644 index 000000000..804669b17 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/_Host.cshtml @@ -0,0 +1,34 @@ +@page "/" +@using Microsoft.AspNetCore.Components.Web +@namespace AXOpen.Components.Kuka.Robotics.blazorapp.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.kuka.robotics/app/ix-blazor/Program.cs b/src/components.kuka.robotics/app/ix-blazor/Program.cs new file mode 100644 index 000000000..d1a023d37 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Program.cs @@ -0,0 +1,107 @@ +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 AXOpen.Components.Kuka.Robotics; + +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.ConcurrentRequestMaxCount = 4; +Entry.Plc.Connector.ConcurrentRequestDelay = 100; +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.Information() + .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.kuka.robotics/app/ix-blazor/Properties/launchSettings.json b/src/components.kuka.robotics/app/ix-blazor/Properties/launchSettings.json new file mode 100644 index 000000000..ff08147fd --- /dev/null +++ b/src/components.kuka.robotics/app/ix-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.kuka.robotics/app/ix-blazor/Shared/MainLayout.razor b/src/components.kuka.robotics/app/ix-blazor/Shared/MainLayout.razor new file mode 100644 index 000000000..99d218c07 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Shared/MainLayout.razor @@ -0,0 +1,19 @@ +@inherits LayoutComponentBase + +AXOpen.Components.Kuka.Robotics.blazor + +
+ + +
+
+ +
+ +
+ @Body +
+
+
diff --git a/src/components.kuka.robotics/app/ix-blazor/Shared/MainLayout.razor.css b/src/components.kuka.robotics/app/ix-blazor/Shared/MainLayout.razor.css new file mode 100644 index 000000000..551e4b276 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-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.kuka.robotics/app/ix-blazor/Shared/NavMenu.razor b/src/components.kuka.robotics/app/ix-blazor/Shared/NavMenu.razor new file mode 100644 index 000000000..87afc368c --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Shared/NavMenu.razor @@ -0,0 +1,44 @@ + + + + +@code { + private bool collapseNavMenu = true; + + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() + { + collapseNavMenu = !collapseNavMenu; + } +} diff --git a/src/components.kuka.robotics/app/ix-blazor/Shared/NavMenu.razor.css b/src/components.kuka.robotics/app/ix-blazor/Shared/NavMenu.razor.css new file mode 100644 index 000000000..604b7a1a1 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-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.kuka.robotics/app/ix-blazor/Usings.cs b/src/components.kuka.robotics/app/ix-blazor/Usings.cs new file mode 100644 index 000000000..2ea88d3cd --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/Usings.cs @@ -0,0 +1,2 @@ +global using AXOpen.Core; +using AXOpen.Components.Kuka.Robotics.blazor.Pages; diff --git a/src/components.kuka.robotics/app/ix-blazor/_Imports.razor b/src/components.kuka.robotics/app/ix-blazor/_Imports.razor new file mode 100644 index 000000000..d5400fd72 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-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 AXOpen.Components.Kuka.Robotics.blazorapp +@using AXOpen.Components.Kuka.Robotics.blazorapp.Shared + +@using AXSharp.Presentation.Blazor.Controls.RenderableContent +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer PlcLocalizer diff --git a/src/components.kuka.robotics/app/ix-blazor/appsettings.Development.json b/src/components.kuka.robotics/app/ix-blazor/appsettings.Development.json new file mode 100644 index 000000000..770d3e931 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/components.kuka.robotics/app/ix-blazor/appsettings.json b/src/components.kuka.robotics/app/ix-blazor/appsettings.json new file mode 100644 index 000000000..10f68b8c8 --- /dev/null +++ b/src/components.kuka.robotics/app/ix-blazor/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/components.kuka.robotics/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css b/src/components.kuka.robotics/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css new file mode 100644 index 000000000..02ae65b5f --- /dev/null +++ b/src/components.kuka.robotics/app/ix-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.kuka.robotics/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css.map b/src/components.kuka.robotics/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css.map new file mode 100644 index 000000000..afcd9e33e --- /dev/null +++ b/src/components.kuka.robotics/app/ix-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-` + +@code +{ + #region WriteTaskDurationToConsole + private async Task WriteTaskTimesToConsole() + { + await Entry.Plc.documentation.componentOne.ExampleCylinder.WriteTaskDurationToConsole(); + } + #endregion + +} + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/Component_2.razor b/src/components.siemens.identification/app/ix-blazor/Pages/Component_2.razor new file mode 100644 index 000000000..7b56b6788 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Component_2.razor @@ -0,0 +1,38 @@ +@page "/Component_2" +@using AXOpen.Core; + +Documentation + + + + +@code +{ + #region WriteTaskDurationToConsole + private async Task WriteTaskTimesToConsole() + { + await Entry.Plc.documentation.componentTwo.ExampleCylinder.WriteTaskDurationToConsole(); + } + #endregion + +} + + + + + + + + + + + + + + + + + + + + diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/Documentation.razor b/src/components.siemens.identification/app/ix-blazor/Pages/Documentation.razor new file mode 100644 index 000000000..450f461bd --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Documentation.razor @@ -0,0 +1,7 @@ +@page "/Documentation" +@using AXOpen.Core; + + + + + diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/Error.cshtml b/src/components.siemens.identification/app/ix-blazor/Pages/Error.cshtml new file mode 100644 index 000000000..7ecfc944c --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Error.cshtml @@ -0,0 +1,42 @@ +@page +@model AXOpen.Components.Siemens.Identification.blazor.Pages.ErrorModel + + + + + + + + Error + + + + + +

+ + + diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/Error.cshtml.cs b/src/components.siemens.identification/app/ix-blazor/Pages/Error.cshtml.cs new file mode 100644 index 000000000..c7537ce51 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Error.cshtml.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using System.Diagnostics; + +namespace AXOpen.Components.Siemens.Identification.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.siemens.identification/app/ix-blazor/Pages/Index.razor b/src/components.siemens.identification/app/ix-blazor/Pages/Index.razor new file mode 100644 index 000000000..6085c4aa9 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Index.razor @@ -0,0 +1,9 @@ +@page "/" + +Index + +

Hello, world!

+ +Welcome to your new app. + + diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/Security.razor b/src/components.siemens.identification/app/ix-blazor/Pages/Security.razor new file mode 100644 index 000000000..67f755793 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Security.razor @@ -0,0 +1,5 @@ +@page "/Security" + +

Security

+ + \ No newline at end of file diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/Testing.razor b/src/components.siemens.identification/app/ix-blazor/Pages/Testing.razor new file mode 100644 index 000000000..d43e214a8 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Testing.razor @@ -0,0 +1,6 @@ +@page "/testing" +@using AXOpen.Components.Siemens.Identification + +Testing + + diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/_Host.cshtml b/src/components.siemens.identification/app/ix-blazor/Pages/_Host.cshtml new file mode 100644 index 000000000..a847ba057 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Pages/_Host.cshtml @@ -0,0 +1,34 @@ +@page "/" +@using Microsoft.AspNetCore.Components.Web +@namespace AXOpen.Components.Siemens.Identification.blazorapp.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/components.siemens.identification/app/ix-blazor/Program.cs b/src/components.siemens.identification/app/ix-blazor/Program.cs new file mode 100644 index 000000000..b7aadb47e --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Program.cs @@ -0,0 +1,107 @@ +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 AXOpen.Components.Siemens.Identification; + +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.ConcurrentRequestMaxCount = 4; +Entry.Plc.Connector.ConcurrentRequestDelay = 100; +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.Information() + .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.siemens.identification/app/ix-blazor/Properties/launchSettings.json b/src/components.siemens.identification/app/ix-blazor/Properties/launchSettings.json new file mode 100644 index 000000000..ff08147fd --- /dev/null +++ b/src/components.siemens.identification/app/ix-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.siemens.identification/app/ix-blazor/Shared/MainLayout.razor b/src/components.siemens.identification/app/ix-blazor/Shared/MainLayout.razor new file mode 100644 index 000000000..f5ccb8099 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Shared/MainLayout.razor @@ -0,0 +1,19 @@ +@inherits LayoutComponentBase + +AXOpen.Components.Siemens.Identification.blazor + +
+ + +
+
+ +
+ +
+ @Body +
+
+
diff --git a/src/components.siemens.identification/app/ix-blazor/Shared/MainLayout.razor.css b/src/components.siemens.identification/app/ix-blazor/Shared/MainLayout.razor.css new file mode 100644 index 000000000..551e4b276 --- /dev/null +++ b/src/components.siemens.identification/app/ix-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.siemens.identification/app/ix-blazor/Shared/NavMenu.razor b/src/components.siemens.identification/app/ix-blazor/Shared/NavMenu.razor new file mode 100644 index 000000000..4de7075ca --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Shared/NavMenu.razor @@ -0,0 +1,44 @@ + + + + +@code { + private bool collapseNavMenu = true; + + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() + { + collapseNavMenu = !collapseNavMenu; + } +} diff --git a/src/components.siemens.identification/app/ix-blazor/Shared/NavMenu.razor.css b/src/components.siemens.identification/app/ix-blazor/Shared/NavMenu.razor.css new file mode 100644 index 000000000..604b7a1a1 --- /dev/null +++ b/src/components.siemens.identification/app/ix-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.siemens.identification/app/ix-blazor/Usings.cs b/src/components.siemens.identification/app/ix-blazor/Usings.cs new file mode 100644 index 000000000..c035dc02a --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/Usings.cs @@ -0,0 +1,2 @@ +global using AXOpen.Core; +using AXOpen.Components.Siemens.Identification.blazor.Pages; diff --git a/src/components.siemens.identification/app/ix-blazor/_Imports.razor b/src/components.siemens.identification/app/ix-blazor/_Imports.razor new file mode 100644 index 000000000..ec8464c48 --- /dev/null +++ b/src/components.siemens.identification/app/ix-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 AXOpen.Components.Siemens.Identification.blazorapp +@using AXOpen.Components.Siemens.Identification.blazorapp.Shared + +@using AXSharp.Presentation.Blazor.Controls.RenderableContent +@using Microsoft.Extensions.Localization + +@inject IStringLocalizer PlcLocalizer diff --git a/src/components.siemens.identification/app/ix-blazor/appsettings.Development.json b/src/components.siemens.identification/app/ix-blazor/appsettings.Development.json new file mode 100644 index 000000000..770d3e931 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/components.siemens.identification/app/ix-blazor/appsettings.json b/src/components.siemens.identification/app/ix-blazor/appsettings.json new file mode 100644 index 000000000..10f68b8c8 --- /dev/null +++ b/src/components.siemens.identification/app/ix-blazor/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/components.siemens.identification/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css b/src/components.siemens.identification/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css new file mode 100644 index 000000000..02ae65b5f --- /dev/null +++ b/src/components.siemens.identification/app/ix-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.siemens.identification/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css.map b/src/components.siemens.identification/app/ix-blazor/wwwroot/css/bootstrap/bootstrap.min.css.map new file mode 100644 index 000000000..afcd9e33e --- /dev/null +++ b/src/components.siemens.identification/app/ix-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-` -@code -{ - #region WriteTaskDurationToConsole - private async Task WriteTaskTimesToConsole() - { - await Entry.Plc.documentation.componentOne.ExampleCylinder.WriteTaskDurationToConsole(); - } - #endregion - -} - + - + diff --git a/src/components.kuka.robotics/app/ix-blazor/Pages/Component_2.razor b/src/components.kuka.robotics/app/ix-blazor/Pages/Component_2.razor index 7b56b6788..fefe33029 100644 --- a/src/components.kuka.robotics/app/ix-blazor/Pages/Component_2.razor +++ b/src/components.kuka.robotics/app/ix-blazor/Pages/Component_2.razor @@ -4,25 +4,13 @@ Documentation - - -@code -{ - #region WriteTaskDurationToConsole - private async Task WriteTaskTimesToConsole() - { - await Entry.Plc.documentation.componentTwo.ExampleCylinder.WriteTaskDurationToConsole(); - } - #endregion - -} - + - + diff --git a/src/components.kuka.robotics/app/src/Documentation/Component_1.st b/src/components.kuka.robotics/app/src/Documentation/Component_1.st index 426c16ec6..488ff22ec 100644 --- a/src/components.kuka.robotics/app/src/Documentation/Component_1.st +++ b/src/components.kuka.robotics/app/src/Documentation/Component_1.st @@ -3,16 +3,15 @@ USING AXOpen.Core; CLASS Component_1 EXTENDS AXOpen.Core.AxoObject // VAR PUBLIC - ExampleCylinder : AXOpen.Components.Kuka.Robotics.Example.ExampleCylinder; + ExampleRobot : AXOpen.Components.Kuka.Robotics.AxoKrc4_v_5_x_x; END_VAR // // - VAR PUBLIC + VAR PUBLIC + movementParams : AXOpen.Components.Abstractions.Robotics.AxoRoboticsMovementsParams; {#ix-set:AttributeName = "<#Activate manual control#>"} ActivateManualControl : BOOL; - PlcInputs : REF_TO PlcInputs; - PlcOutputs : REF_TO PlcOutputs; END_VAR // @@ -24,15 +23,13 @@ CLASS Component_1 EXTENDS AXOpen.Core.AxoObject THIS.Initialize(parent); IF ActivateManualControl THEN - ExampleCylinder.ActivateManualControl(); + ExampleRobot.ActivateManualControl(); END_IF; // - ExampleCylinder.Run(THIS, - REF(PlcInputs^._homeSensor_1), - REF(PlcInputs^._workSensor_1), - REF(PlcOutputs^._moveHomeSignal_1), - REF(PlcOutputs^._moveWorkSignal_1)); + ExampleRobot.Run(THIS, + HwIdentifiers#KRC4, + HwIdentifiers#KRC4_512_digital_in_and_outputs_1); // THIS.UseInSequencer(); @@ -49,17 +46,23 @@ CLASS Component_1 EXTENDS AXOpen.Core.AxoObject Sequencer.Initialize(THIS); Sequencer.Open(); - IF(Steps[0].Execute(Sequencer, 'Move to home position')) THEN - IF(ExampleCylinder.MoveToHome.Invoke().IsDone()) THEN + IF(Steps[0].Execute(Sequencer, 'Start at main')) THEN + IF(ExampleRobot.StartAtMain().IsDone()) THEN Sequencer.MoveNext(); END_IF; END_IF; - IF(Steps[1].Execute(Sequencer, 'Move to work position')) THEN - IF(ExampleCylinder.MoveToWork.Invoke().IsDone()) THEN + IF(Steps[1].Execute(Sequencer, 'Move to position')) THEN + IF(ExampleRobot.StartMovements(movementParams).IsDone()) THEN Sequencer.MoveNext(); END_IF; END_IF; + + IF(Steps[1].Execute(Sequencer, 'Stop')) THEN + IF(ExampleRobot.StopMovements().IsDone()) THEN + Sequencer.CompleteSequence(); + END_IF; + END_IF; END_METHOD // diff --git a/src/components.kuka.robotics/app/src/Documentation/Component_2.st b/src/components.kuka.robotics/app/src/Documentation/Component_2.st index c754df710..ff6798111 100644 --- a/src/components.kuka.robotics/app/src/Documentation/Component_2.st +++ b/src/components.kuka.robotics/app/src/Documentation/Component_2.st @@ -3,16 +3,15 @@ USING AXOpen.Core; CLASS Component_2 EXTENDS AXOpen.Core.AxoObject // VAR PUBLIC - ExampleCylinder : AXOpen.Components.Kuka.Robotics.Example.ExampleCylinder; + ExampleRobot : AXOpen.Components.Kuka.Robotics.AxoKrc4_v_5_x_x; END_VAR // // - VAR PUBLIC + VAR PUBLIC + movementParams : AXOpen.Components.Abstractions.Robotics.AxoRoboticsMovementsParams; {#ix-set:AttributeName = "<#Activate manual control#>"} ActivateManualControl : BOOL; - PlcInputs : REF_TO PlcInputs; - PlcOutputs : REF_TO PlcOutputs; END_VAR // @@ -24,15 +23,13 @@ CLASS Component_2 EXTENDS AXOpen.Core.AxoObject THIS.Initialize(parent); IF ActivateManualControl THEN - ExampleCylinder.ActivateManualControl(); + ExampleRobot.ActivateManualControl(); END_IF; // - ExampleCylinder.Run(THIS, - REF(PlcInputs^._homeSensor_2), - REF(PlcInputs^._workSensor_2), - REF(PlcOutputs^._moveHomeSignal_2), - REF(PlcOutputs^._moveWorkSignal_2)); + ExampleRobot.Run(THIS, + HwIdentifiers#KRC4, + HwIdentifiers#KRC4_512_digital_in_and_outputs_1); // THIS.UseInSequencer(); @@ -49,17 +46,23 @@ CLASS Component_2 EXTENDS AXOpen.Core.AxoObject Sequencer.Initialize(THIS); Sequencer.Open(); - IF(Steps[0].Execute(Sequencer, 'Move to home position')) THEN - IF(ExampleCylinder.MoveToHome.Invoke().IsDone()) THEN + IF(Steps[0].Execute(Sequencer, 'Start at main')) THEN + IF(ExampleRobot.StartAtMain().IsDone()) THEN Sequencer.MoveNext(); END_IF; END_IF; - IF(Steps[1].Execute(Sequencer, 'Move to work position')) THEN - IF(ExampleCylinder.MoveToWork.Invoke().IsDone()) THEN + IF(Steps[1].Execute(Sequencer, 'Move to position')) THEN + IF(ExampleRobot.StartMovements(movementParams).IsDone()) THEN Sequencer.MoveNext(); END_IF; END_IF; + + IF(Steps[1].Execute(Sequencer, 'Stop')) THEN + IF(ExampleRobot.StopMovements().IsDone()) THEN + Sequencer.CompleteSequence(); + END_IF; + END_IF; END_METHOD // diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/CopyInputs.st b/src/components.kuka.robotics/app/src/IO/PLC_LINE/CopyInputs.st deleted file mode 100644 index 7ac004906..000000000 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/CopyInputs.st +++ /dev/null @@ -1,10 +0,0 @@ -FUNCTION CopyInputs - VAR_EXTERNAL - HwInputs : HwInputs; - PlcInputs : PlcInputs; - END_VAR - PlcInputs._homeSensor_1 := HwInputs._homeSensor_1; - PlcInputs._workSensor_1 := HwInputs._workSensor_1; - PlcInputs._homeSensor_2 := HwInputs._homeSensor_2; - PlcInputs._workSensor_2 := HwInputs._workSensor_2; -END_FUNCTION diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/CopyOutputs.st b/src/components.kuka.robotics/app/src/IO/PLC_LINE/CopyOutputs.st deleted file mode 100644 index 625ad1af9..000000000 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/CopyOutputs.st +++ /dev/null @@ -1,10 +0,0 @@ -FUNCTION CopyOutputs - VAR_EXTERNAL - HwOutputs : HwOutputs; - PlcOutputs : PlcOutputs; - END_VAR - HwOutputs._moveHomeSignal_1 := PlcOutputs._moveHomeSignal_1; - HwOutputs._moveWorkSignal_1 := PlcOutputs._moveWorkSignal_1; - HwOutputs._moveHomeSignal_2 := PlcOutputs._moveHomeSignal_2; - HwOutputs._moveWorkSignal_2 := PlcOutputs._moveWorkSignal_2; -END_FUNCTION diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st b/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st index f9d09dc28..c16d3cc61 100644 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st +++ b/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st @@ -1,6 +1,26 @@ TYPE HwIdentifiers : WORD ( + PLC_LINE_Rail_0 := WORD#256, + PLC_LINE := WORD#48, + PLC_LINE_Card_reader_writer_1 := WORD#51, + PLC_LINE_CPU_display_1 := WORD#54, + PLC_LINE_OPC_UA_1 := WORD#117, + PLC_LINE_PROFINET_interface_1 := WORD#64, + PLC_LINE_PROFINET_interface_1_Port_1 := WORD#65, + PLC_LINE_PROFINET_interface_1_Port_2 := WORD#66, + PLC_LINE_PROFINET_interface_2 := WORD#72, + PLC_LINE_PROFINET_interface_2_Port_1 := WORD#73, + PLC_LINE_DP_interface_1 := WORD#60, + PLC_LINE_PROFINET_interface_GBIT_3 := WORD#120, + PLC_LINE_PROFINET_interface_GBIT_3_Port_1 := WORD#121, + KRC4_Rack := WORD#264, + KRC4 := WORD#258, + KRC4_Interface1 := WORD#259, + KRC4_Interface1_Port1 := WORD#260, + KRC4_KRC4_ProfiNet_5_0 := WORD#261, + KRC4_64_safe_digital_in_and_outputs_2_4_1 := WORD#263, + KRC4_512_digital_in_and_outputs_1 := WORD#265, NONE:= WORD#0 ); END_TYPE diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwInputs.st b/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwInputs.st deleted file mode 100644 index 02b633636..000000000 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwInputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - HwInputs : STRUCT - _homeSensor_1 AT %X0.0 : BOOL; - _workSensor_1 AT %X0.1 : BOOL; - _homeSensor_2 AT %X0.2 : BOOL; - _workSensor_2 AT %X0.3 : BOOL; -END_STRUCT; -END_TYPE diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwOutputs.st b/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwOutputs.st deleted file mode 100644 index 2bbe92155..000000000 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwOutputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - HwOutputs : STRUCT - _moveHomeSignal_1 AT %X0.0 : BOOL; - _moveWorkSignal_1 AT %X0.1 : BOOL; - _moveHomeSignal_2 AT %X0.2 : BOOL; - _moveWorkSignal_2 AT %X0.3 : BOOL; - END_STRUCT; -END_TYPE diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/PlcInputs.st b/src/components.kuka.robotics/app/src/IO/PLC_LINE/PlcInputs.st deleted file mode 100644 index f8cc94fd1..000000000 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/PlcInputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - PlcInputs : STRUCT - _homeSensor_1 : BOOL; - _workSensor_1 : BOOL; - _homeSensor_2 : BOOL; - _workSensor_2 : BOOL; - END_STRUCT; -END_TYPE diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/PlcOutputs.st b/src/components.kuka.robotics/app/src/IO/PLC_LINE/PlcOutputs.st deleted file mode 100644 index 293ba3d87..000000000 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/PlcOutputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - PlcOutputs : STRUCT - _moveHomeSignal_1 : BOOL; - _moveWorkSignal_1 : BOOL; - _moveHomeSignal_2 : BOOL; - _moveWorkSignal_2 : BOOL; - END_STRUCT; -END_TYPE diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION b/src/components.kuka.robotics/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION deleted file mode 100644 index 0617acc51..000000000 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION +++ /dev/null @@ -1,8 +0,0 @@ - //Copy this VAR_GLOBAL section into your configuration file inside your project. - //Do not change any names, addresses or any another content. - VAR_GLOBAL - HwInputs AT %IB0 : HwInputs; - HwOutputs AT %QB0 : HwOutputs; - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM b/src/components.kuka.robotics/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM deleted file mode 100644 index 45e075f36..000000000 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM +++ /dev/null @@ -1,12 +0,0 @@ - //Copy this VAR_EXTERNAL section into the declaration part of your main program file inside your project. - //Do not change any names, addresses or any another content. - VAR_EXTERNAL - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR - //Copy this function call at the very beginning of your program. - //Do not change any names, addresses or any another content. - CopyInputs(); - //Copy this function call at the very end of your program. - //Do not change any names, addresses or any another content. - CopyOutputs(); diff --git a/src/components.kuka.robotics/app/src/Sandbox/SandboxContext.st b/src/components.kuka.robotics/app/src/Sandbox/SandboxContext.st index 444535fd8..2085e5d05 100644 --- a/src/components.kuka.robotics/app/src/Sandbox/SandboxContext.st +++ b/src/components.kuka.robotics/app/src/Sandbox/SandboxContext.st @@ -1,21 +1,17 @@ {S7.extern=ReadWrite} CLASS SandboxContext EXTENDS AXOpen.Core.AxoContext VAR PUBLIC - _manualControl : BOOL; - _testCyclinder : AXOpen.Components.Kuka.Robotics.Example.ExampleCylinder; - PlcInputs : REF_TO PlcInputs; - PlcOutputs : REF_TO PlcOutputs; + ActivateManualControl : BOOL; + ExampleRobot : AXOpen.Components.Kuka.Robotics.AxoKrc4_v_5_x_x; END_VAR METHOD PROTECTED OVERRIDE Main - _testCyclinder.Run(THIS, - REF(PlcInputs^._homeSensor_1), - REF(PlcInputs^._workSensor_1), - REF(PlcOutputs^._moveHomeSignal_1), - REF(PlcOutputs^._moveWorkSignal_1)); + ExampleRobot.Run(THIS, + HwIdentifiers#KRC4, + HwIdentifiers#KRC4_512_digital_in_and_outputs_1); - IF(_manualControl) THEN - _testCyclinder.ActivateManualControl(); - END_IF; + IF ActivateManualControl THEN + ExampleRobot.ActivateManualControl(); + END_IF; END_METHOD END_CLASS diff --git a/src/components.kuka.robotics/app/src/configuration.st b/src/components.kuka.robotics/app/src/configuration.st index 90ec05b12..12da444c8 100644 --- a/src/components.kuka.robotics/app/src/configuration.st +++ b/src/components.kuka.robotics/app/src/configuration.st @@ -10,18 +10,7 @@ CONFIGURATION MyConfiguration {S7.extern=ReadWrite} _rtc : AXOpen.S71500.Rtc; END_VAR - //Copy this VAR_GLOBAL section into your configuration file inside your project. - //Do not change any names, addresses or any another content. - VAR_GLOBAL - {S7.extern=ReadWrite} - HwInputs AT %IB0 : HwInputs; - {S7.extern=ReadWrite} - HwOutputs AT %QB0 : HwOutputs; - {S7.extern=ReadWrite} - PlcInputs : PlcInputs; - {S7.extern=ReadWrite} - PlcOutputs : PlcOutputs; - END_VAR + END_CONFIGURATION diff --git a/src/components.kuka.robotics/app/src/program.st b/src/components.kuka.robotics/app/src/program.st index beaf8904d..c0ad0faa1 100644 --- a/src/components.kuka.robotics/app/src/program.st +++ b/src/components.kuka.robotics/app/src/program.st @@ -3,24 +3,10 @@ PROGRAM MyProgram sandbox : SandboxContext; documentation : DocumentationContext; _rtc : AXOpen.S71500.Rtc; - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; END_VAR - - CopyInputs(); - - sandbox.PlcInputs := REF(PlcInputs); - sandbox.PlcOutputs := REF(PlcOutputs); sandbox.Run(); sandbox.InjectRtc(_rtc); - documentation.componentOne.PlcInputs := REF(PlcInputs); - documentation.componentOne.PlcOutputs := REF(PlcOutputs); - documentation.componentTwo.PlcInputs := REF(PlcInputs); - documentation.componentTwo.PlcOutputs := REF(PlcOutputs); documentation.Run(); documentation.InjectRtc(_rtc); - - - CopyOutputs(); END_PROGRAM diff --git a/src/components.kuka.robotics/components.kuka.robotics.sln b/src/components.kuka.robotics/components.kuka.robotics.sln index ccac985c6..3c5fb63e9 100644 --- a/src/components.kuka.robotics/components.kuka.robotics.sln +++ b/src/components.kuka.robotics/components.kuka.robotics.sln @@ -1,4 +1,8 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34316.72 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "this", "this.proj", "{1CBC2774-0939-4925-BA39-976BD8B44DFB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_abstractions", "..\abstractions\src\AXOpen.Abstractions\ix_ax_axopen_abstractions.csproj", "{45881F7D-256E-46B8-9DA6-4C1A2A206ED1}" @@ -21,12 +25,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_components_kuk EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Components.Kuka.Robotics_tests", "tests\AXOpen.Components.Kuka.Robotics.Tests\AXOpen.Components.Kuka.Robotics_tests.csproj", "{98EECD16-C803-42BF-95D1-B06FF8BDEFF8}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_components_robotics", "..\components.robotics\src\AXOpen.Components.Robotics\ix_ax_axopen_components_robotics.csproj", "{84F2A77D-8619-4D50-BA3C-7C782728BE54}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_core_blazor", "..\core\src\AXOpen.Core.Blazor\axopen_core_blazor.csproj", "{5DA2490E-53C2-4A68-81D7-822C14308D95}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_core", "..\core\src\AXOpen.Core\ix_ax_axopen_core.csproj", "{C28E5652-B41F-4345-9CE8-2F2599032EC7}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Data.Json", "..\data\src\repositories\Json\AXOpen.Data.Json.csproj", "{3301FE13-9249-44E8-9558-C265BF30E696}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_io", "..\io\src\AXOpen.Io\ix_ax_axopen_io.csproj", "{AE810333-1858-4215-92C8-0FE1738660EF}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_ax_sdk", "..\sdk-ax\ctrl\ix\ix_ax_ax_sdk.csproj", "{7089D26C-763D-4510-915F-3D3619699F88}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Security.Blazor", "..\Security\src\AXOpen.Security.Blazor\AXOpen.Security.Blazor.csproj", "{C95B396D-9A82-4132-904D-033322781664}" @@ -39,93 +47,109 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_timers", "..\t EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.ToolBox", "..\toolbox\src\AXOpen.ToolBox\AXOpen.ToolBox.csproj", "{B18FD999-065F-411A-9D85-EEC5AAB92927}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Abstractions", "..\abstractions\src\AXOpen.Abstractions", "{D7EB1169-6387-4C5E-8BB6-C59A1B43A611}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Abstractions", "AXOpen.Abstractions", "{D7EB1169-6387-4C5E-8BB6-C59A1B43A611}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\abstractions\src", "{413EB86E-8296-4F2B-A4A6-44E60E94E333}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{413EB86E-8296-4F2B-A4A6-44E60E94E333}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "abstractions", "..\abstractions", "{E8949728-0E36-4489-97A4-D460437E3FE9}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "abstractions", "abstractions", "{E8949728-0E36-4489-97A4-D460437E3FE9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Base.Abstractions", "..\base\src\AXOpen.Base.Abstractions", "{B186BFAA-AEB2-48E8-9030-F332C6400AEF}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Base.Abstractions", "AXOpen.Base.Abstractions", "{B186BFAA-AEB2-48E8-9030-F332C6400AEF}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Logging", "..\base\src\AXOpen.Logging", "{0E900021-19D6-49C6-B7C3-45C2425E609C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Logging", "AXOpen.Logging", "{0E900021-19D6-49C6-B7C3-45C2425E609C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.VisualComposer", "..\base\src\AXOpen.VisualComposer", "{F969BF01-F3EA-4A93-9A6B-CA7F47FE082E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.VisualComposer", "AXOpen.VisualComposer", "{F969BF01-F3EA-4A93-9A6B-CA7F47FE082E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\base\src", "{7D445573-4730-4764-8F65-5E59C93EFE3A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{7D445573-4730-4764-8F65-5E59C93EFE3A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "base", "..\base", "{6BEA316A-B78D-476B-BCF6-6D3A46DC811A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "base", "base", "{6BEA316A-B78D-476B-BCF6-6D3A46DC811A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Abstractions", "..\components.abstractions\src\AXOpen.Components.Abstractions", "{41B08A5A-75A3-43E2-B1D6-65C40C6FE399}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Abstractions", "AXOpen.Components.Abstractions", "{41B08A5A-75A3-43E2-B1D6-65C40C6FE399}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\components.abstractions\src", "{BEB41292-397F-4903-9F38-9D82E20B99D2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{BEB41292-397F-4903-9F38-9D82E20B99D2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.abstractions", "..\components.abstractions", "{9F1AA375-CC3C-4BFC-BD69-8331DBEA2338}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.abstractions", "components.abstractions", "{9F1AA375-CC3C-4BFC-BD69-8331DBEA2338}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix-blazor", "app\ix-blazor", "{2F7A13EB-1FFF-4062-BCC7-1D5DB8ADDD58}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix-blazor", "ix-blazor", "{2F7A13EB-1FFF-4062-BCC7-1D5DB8ADDD58}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix", "app\ix", "{07546795-AE51-4F4B-B4FD-31EA6D561332}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix", "ix", "{07546795-AE51-4F4B-B4FD-31EA6D561332}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{1F829D32-FF3F-4989-AA39-C1AEE12F7CF1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Kuka.Robotics.blazor", "src\AXOpen.Components.Kuka.Robotics.blazor", "{8948FFB5-0CCA-4CCE-A300-75CE49CD72D3}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Kuka.Robotics.blazor", "AXOpen.Components.Kuka.Robotics.blazor", "{8948FFB5-0CCA-4CCE-A300-75CE49CD72D3}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Kuka.Robotics", "src\AXOpen.Components.Kuka.Robotics", "{E8849A20-14A2-4055-BB10-E79A5E32CF9C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Kuka.Robotics", "AXOpen.Components.Kuka.Robotics", "{E8849A20-14A2-4055-BB10-E79A5E32CF9C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A6606C8B-F012-41A5-9E5B-862D8BAF2BB5}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Kuka.Robotics.Tests", "tests\AXOpen.Components.Kuka.Robotics.Tests", "{624234C6-D014-4982-A50E-662D161BB55A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Kuka.Robotics.Tests", "AXOpen.Components.Kuka.Robotics.Tests", "{624234C6-D014-4982-A50E-662D161BB55A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{79B47AE2-EB23-41A0-ACD4-22844B91DA4D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.kuka.robotics", "..\components.kuka.robotics", "{CC86294D-AE90-4A38-8D8A-10E38F1D584F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.kuka.robotics", "components.kuka.robotics", "{CC86294D-AE90-4A38-8D8A-10E38F1D584F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Robotics", "AXOpen.Components.Robotics", "{5E27889B-144C-466D-B7BA-EF065F72B043}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0D7AB827-D4A9-4C48-AAD0-CB8837B40336}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.robotics", "components.robotics", "{EC838179-D8A4-438F-9D8A-54DAA04CAE17}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Core.Blazor", "AXOpen.Core.Blazor", "{62AC1583-8F5D-4626-8EB1-CEFD8FC60358}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Core.Blazor", "..\core\src\AXOpen.Core.Blazor", "{62AC1583-8F5D-4626-8EB1-CEFD8FC60358}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Core", "AXOpen.Core", "{0A49EFB0-2CEF-4304-BF3C-C58A21606A83}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Core", "..\core\src\AXOpen.Core", "{0A49EFB0-2CEF-4304-BF3C-C58A21606A83}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{389340D0-971D-4CCD-B965-58C0AC79CFB3}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\core\src", "{389340D0-971D-4CCD-B965-58C0AC79CFB3}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "core", "core", "{D634D08E-699C-487D-8DA7-B1E3ECF3C97F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "core", "..\core", "{D634D08E-699C-487D-8DA7-B1E3ECF3C97F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Json", "Json", "{5563E1DD-45F8-4685-B983-BA9F7BF7564E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Json", "..\data\src\repositories\Json", "{5563E1DD-45F8-4685-B983-BA9F7BF7564E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "repositories", "repositories", "{B3F199D4-EBAF-43E4-9731-7B1727D2B81F}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "repositories", "..\data\src\repositories", "{B3F199D4-EBAF-43E4-9731-7B1727D2B81F}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CB32B68C-E347-42EF-B60B-7D5FE67F9FF7}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\data\src", "{CB32B68C-E347-42EF-B60B-7D5FE67F9FF7}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data", "data", "{AC11F8C3-570B-4609-AB90-F8DB480FCDD2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data", "..\data", "{AC11F8C3-570B-4609-AB90-F8DB480FCDD2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Io", "AXOpen.Io", "{0AD9AE7E-2FFB-4150-A12D-8AC1B342F491}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix", "..\sdk-ax\ctrl\ix", "{4AAF9B8B-921C-4CB8-99FE-A1954E1F7A6A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B6C978BC-BF0A-4DB5-9F0C-207B005C9309}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ctrl", "..\sdk-ax\ctrl", "{1499A70E-BC88-4723-91BD-6781CE35BA2A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "io", "io", "{71CD362E-B7B6-4401-A4B4-A98EFA8640A8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sdk-ax", "..\sdk-ax", "{9F08EA87-929C-4796-84FE-4318F30EE3B9}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix", "ix", "{4AAF9B8B-921C-4CB8-99FE-A1954E1F7A6A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Security.Blazor", "..\Security\src\AXOpen.Security.Blazor", "{4158469E-F301-4EB3-84E1-62F6B557E7FA}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ctrl", "ctrl", "{1499A70E-BC88-4723-91BD-6781CE35BA2A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Security", "..\Security\src\AXOpen.Security", "{8AD13481-0A24-432C-921B-52CF770F93D2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sdk-ax", "sdk-ax", "{9F08EA87-929C-4796-84FE-4318F30EE3B9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\Security\src", "{4BA23FD0-E319-4184-897C-CA51D50B84C1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Security.Blazor", "AXOpen.Security.Blazor", "{4158469E-F301-4EB3-84E1-62F6B557E7FA}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Security", "..\Security", "{E053BDB4-72B9-4890-8EB4-9A85C9EEA52C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Security", "AXOpen.Security", "{8AD13481-0A24-432C-921B-52CF770F93D2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix", "..\simatic1500\ctrl\ix", "{AF3B00CE-446A-4FD7-A634-9A830D11AFC4}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{4BA23FD0-E319-4184-897C-CA51D50B84C1}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ctrl", "..\simatic1500\ctrl", "{B843D464-19FC-4DB6-A10B-E361C2EEBDF9}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Security", "Security", "{E053BDB4-72B9-4890-8EB4-9A85C9EEA52C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "simatic1500", "..\simatic1500", "{E486E429-5593-4A27-9637-D47E7A4D1700}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix", "ix", "{AF3B00CE-446A-4FD7-A634-9A830D11AFC4}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Timers", "..\timers\src\AXOpen.Timers", "{7C089497-5856-4466-B965-F159C5F71A5B}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ctrl", "ctrl", "{B843D464-19FC-4DB6-A10B-E361C2EEBDF9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\timers\src", "{E2EB557C-82BE-45A9-A937-E460962235E7}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "simatic1500", "simatic1500", "{E486E429-5593-4A27-9637-D47E7A4D1700}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "timers", "..\timers", "{757CA0A2-23C7-43EE-B779-0C2CDE78DE93}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Timers", "AXOpen.Timers", "{7C089497-5856-4466-B965-F159C5F71A5B}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.ToolBox", "..\toolbox\src\AXOpen.ToolBox", "{57965F0B-29D4-4BD9-B568-3C1A1A5FCC1D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E2EB557C-82BE-45A9-A937-E460962235E7}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\toolbox\src", "{18DF4C21-8439-4C74-BE56-F59B8D9DAE4C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "timers", "timers", "{757CA0A2-23C7-43EE-B779-0C2CDE78DE93}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "toolbox", "..\toolbox", "{8164FB65-65E2-4455-A48A-8A2C799B9688}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.ToolBox", "AXOpen.ToolBox", "{57965F0B-29D4-4BD9-B568-3C1A1A5FCC1D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{18DF4C21-8439-4C74-BE56-F59B8D9DAE4C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "toolbox", "toolbox", "{8164FB65-65E2-4455-A48A-8A2C799B9688}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Io.blazor", "AXOpen.Io.blazor", "{BBAB5C54-7EE6-4152-BF93-156A840F71D6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Io.blazor", "..\io\src\AXOpen.Io.blazor\AXOpen.Io.blazor.csproj", "{AD34A17C-D193-4C28-8F4A-819CEF6A78B3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -177,6 +201,10 @@ Global {98EECD16-C803-42BF-95D1-B06FF8BDEFF8}.Debug|Any CPU.Build.0 = Debug|Any CPU {98EECD16-C803-42BF-95D1-B06FF8BDEFF8}.Release|Any CPU.ActiveCfg = Release|Any CPU {98EECD16-C803-42BF-95D1-B06FF8BDEFF8}.Release|Any CPU.Build.0 = Release|Any CPU + {84F2A77D-8619-4D50-BA3C-7C782728BE54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84F2A77D-8619-4D50-BA3C-7C782728BE54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84F2A77D-8619-4D50-BA3C-7C782728BE54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84F2A77D-8619-4D50-BA3C-7C782728BE54}.Release|Any CPU.Build.0 = Release|Any CPU {5DA2490E-53C2-4A68-81D7-822C14308D95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5DA2490E-53C2-4A68-81D7-822C14308D95}.Debug|Any CPU.Build.0 = Debug|Any CPU {5DA2490E-53C2-4A68-81D7-822C14308D95}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -189,6 +217,10 @@ Global {3301FE13-9249-44E8-9558-C265BF30E696}.Debug|Any CPU.Build.0 = Debug|Any CPU {3301FE13-9249-44E8-9558-C265BF30E696}.Release|Any CPU.ActiveCfg = Release|Any CPU {3301FE13-9249-44E8-9558-C265BF30E696}.Release|Any CPU.Build.0 = Release|Any CPU + {AE810333-1858-4215-92C8-0FE1738660EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE810333-1858-4215-92C8-0FE1738660EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE810333-1858-4215-92C8-0FE1738660EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE810333-1858-4215-92C8-0FE1738660EF}.Release|Any CPU.Build.0 = Release|Any CPU {7089D26C-763D-4510-915F-3D3619699F88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7089D26C-763D-4510-915F-3D3619699F88}.Debug|Any CPU.Build.0 = Debug|Any CPU {7089D26C-763D-4510-915F-3D3619699F88}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -213,63 +245,75 @@ Global {B18FD999-065F-411A-9D85-EEC5AAB92927}.Debug|Any CPU.Build.0 = Debug|Any CPU {B18FD999-065F-411A-9D85-EEC5AAB92927}.Release|Any CPU.ActiveCfg = Release|Any CPU {B18FD999-065F-411A-9D85-EEC5AAB92927}.Release|Any CPU.Build.0 = Release|Any CPU + {AD34A17C-D193-4C28-8F4A-819CEF6A78B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD34A17C-D193-4C28-8F4A-819CEF6A78B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD34A17C-D193-4C28-8F4A-819CEF6A78B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD34A17C-D193-4C28-8F4A-819CEF6A78B3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {45881F7D-256E-46B8-9DA6-4C1A2A206ED1} = {D7EB1169-6387-4C5E-8BB6-C59A1B43A611} + {6D7A213A-4F77-4861-BF3F-BD5323D713B4} = {B186BFAA-AEB2-48E8-9030-F332C6400AEF} + {04C4518F-73B6-41CC-A808-E5DA8F7B7A58} = {0E900021-19D6-49C6-B7C3-45C2425E609C} + {D6100474-C366-42B1-BE22-9BCA82D0980C} = {F969BF01-F3EA-4A93-9A6B-CA7F47FE082E} + {F6117AC7-03A5-490D-B51D-4F7E15F2F15A} = {41B08A5A-75A3-43E2-B1D6-65C40C6FE399} + {D7519720-374F-4006-908F-67ED16C4DB5C} = {2F7A13EB-1FFF-4062-BCC7-1D5DB8ADDD58} + {FD4FD59C-0992-4176-9D29-D8FCB116140C} = {07546795-AE51-4F4B-B4FD-31EA6D561332} + {D28FFC08-81FF-45FC-BF97-F8137A66BE13} = {8948FFB5-0CCA-4CCE-A300-75CE49CD72D3} + {6F3BD732-B390-4178-AD81-53D21D2E5281} = {E8849A20-14A2-4055-BB10-E79A5E32CF9C} + {98EECD16-C803-42BF-95D1-B06FF8BDEFF8} = {624234C6-D014-4982-A50E-662D161BB55A} + {84F2A77D-8619-4D50-BA3C-7C782728BE54} = {5E27889B-144C-466D-B7BA-EF065F72B043} + {5DA2490E-53C2-4A68-81D7-822C14308D95} = {62AC1583-8F5D-4626-8EB1-CEFD8FC60358} + {C28E5652-B41F-4345-9CE8-2F2599032EC7} = {0A49EFB0-2CEF-4304-BF3C-C58A21606A83} + {3301FE13-9249-44E8-9558-C265BF30E696} = {5563E1DD-45F8-4685-B983-BA9F7BF7564E} + {AE810333-1858-4215-92C8-0FE1738660EF} = {0AD9AE7E-2FFB-4150-A12D-8AC1B342F491} + {7089D26C-763D-4510-915F-3D3619699F88} = {4AAF9B8B-921C-4CB8-99FE-A1954E1F7A6A} + {C95B396D-9A82-4132-904D-033322781664} = {4158469E-F301-4EB3-84E1-62F6B557E7FA} + {EA70774F-AEF3-42C2-AAF5-F0019F4CE538} = {8AD13481-0A24-432C-921B-52CF770F93D2} + {D686EF18-807C-420A-9CDE-D1656598B1AF} = {AF3B00CE-446A-4FD7-A634-9A830D11AFC4} + {E4DF6E1D-9251-4116-B434-5153E70E9C43} = {7C089497-5856-4466-B965-F159C5F71A5B} + {B18FD999-065F-411A-9D85-EEC5AAB92927} = {57965F0B-29D4-4BD9-B568-3C1A1A5FCC1D} {D7EB1169-6387-4C5E-8BB6-C59A1B43A611} = {413EB86E-8296-4F2B-A4A6-44E60E94E333} {413EB86E-8296-4F2B-A4A6-44E60E94E333} = {E8949728-0E36-4489-97A4-D460437E3FE9} - {6D7A213A-4F77-4861-BF3F-BD5323D713B4} = {B186BFAA-AEB2-48E8-9030-F332C6400AEF} {B186BFAA-AEB2-48E8-9030-F332C6400AEF} = {7D445573-4730-4764-8F65-5E59C93EFE3A} - {04C4518F-73B6-41CC-A808-E5DA8F7B7A58} = {0E900021-19D6-49C6-B7C3-45C2425E609C} {0E900021-19D6-49C6-B7C3-45C2425E609C} = {7D445573-4730-4764-8F65-5E59C93EFE3A} - {D6100474-C366-42B1-BE22-9BCA82D0980C} = {F969BF01-F3EA-4A93-9A6B-CA7F47FE082E} {F969BF01-F3EA-4A93-9A6B-CA7F47FE082E} = {7D445573-4730-4764-8F65-5E59C93EFE3A} {7D445573-4730-4764-8F65-5E59C93EFE3A} = {6BEA316A-B78D-476B-BCF6-6D3A46DC811A} - {F6117AC7-03A5-490D-B51D-4F7E15F2F15A} = {41B08A5A-75A3-43E2-B1D6-65C40C6FE399} {41B08A5A-75A3-43E2-B1D6-65C40C6FE399} = {BEB41292-397F-4903-9F38-9D82E20B99D2} {BEB41292-397F-4903-9F38-9D82E20B99D2} = {9F1AA375-CC3C-4BFC-BD69-8331DBEA2338} - {D7519720-374F-4006-908F-67ED16C4DB5C} = {2F7A13EB-1FFF-4062-BCC7-1D5DB8ADDD58} {2F7A13EB-1FFF-4062-BCC7-1D5DB8ADDD58} = {1F829D32-FF3F-4989-AA39-C1AEE12F7CF1} - {FD4FD59C-0992-4176-9D29-D8FCB116140C} = {07546795-AE51-4F4B-B4FD-31EA6D561332} {07546795-AE51-4F4B-B4FD-31EA6D561332} = {1F829D32-FF3F-4989-AA39-C1AEE12F7CF1} {1F829D32-FF3F-4989-AA39-C1AEE12F7CF1} = {CC86294D-AE90-4A38-8D8A-10E38F1D584F} - {D28FFC08-81FF-45FC-BF97-F8137A66BE13} = {8948FFB5-0CCA-4CCE-A300-75CE49CD72D3} {8948FFB5-0CCA-4CCE-A300-75CE49CD72D3} = {A6606C8B-F012-41A5-9E5B-862D8BAF2BB5} - {6F3BD732-B390-4178-AD81-53D21D2E5281} = {E8849A20-14A2-4055-BB10-E79A5E32CF9C} {E8849A20-14A2-4055-BB10-E79A5E32CF9C} = {A6606C8B-F012-41A5-9E5B-862D8BAF2BB5} {A6606C8B-F012-41A5-9E5B-862D8BAF2BB5} = {CC86294D-AE90-4A38-8D8A-10E38F1D584F} - {98EECD16-C803-42BF-95D1-B06FF8BDEFF8} = {624234C6-D014-4982-A50E-662D161BB55A} {624234C6-D014-4982-A50E-662D161BB55A} = {79B47AE2-EB23-41A0-ACD4-22844B91DA4D} {79B47AE2-EB23-41A0-ACD4-22844B91DA4D} = {CC86294D-AE90-4A38-8D8A-10E38F1D584F} - {5DA2490E-53C2-4A68-81D7-822C14308D95} = {62AC1583-8F5D-4626-8EB1-CEFD8FC60358} + {5E27889B-144C-466D-B7BA-EF065F72B043} = {0D7AB827-D4A9-4C48-AAD0-CB8837B40336} + {0D7AB827-D4A9-4C48-AAD0-CB8837B40336} = {EC838179-D8A4-438F-9D8A-54DAA04CAE17} {62AC1583-8F5D-4626-8EB1-CEFD8FC60358} = {389340D0-971D-4CCD-B965-58C0AC79CFB3} - {C28E5652-B41F-4345-9CE8-2F2599032EC7} = {0A49EFB0-2CEF-4304-BF3C-C58A21606A83} {0A49EFB0-2CEF-4304-BF3C-C58A21606A83} = {389340D0-971D-4CCD-B965-58C0AC79CFB3} {389340D0-971D-4CCD-B965-58C0AC79CFB3} = {D634D08E-699C-487D-8DA7-B1E3ECF3C97F} - {3301FE13-9249-44E8-9558-C265BF30E696} = {5563E1DD-45F8-4685-B983-BA9F7BF7564E} {5563E1DD-45F8-4685-B983-BA9F7BF7564E} = {B3F199D4-EBAF-43E4-9731-7B1727D2B81F} {B3F199D4-EBAF-43E4-9731-7B1727D2B81F} = {CB32B68C-E347-42EF-B60B-7D5FE67F9FF7} {CB32B68C-E347-42EF-B60B-7D5FE67F9FF7} = {AC11F8C3-570B-4609-AB90-F8DB480FCDD2} - {7089D26C-763D-4510-915F-3D3619699F88} = {4AAF9B8B-921C-4CB8-99FE-A1954E1F7A6A} + {0AD9AE7E-2FFB-4150-A12D-8AC1B342F491} = {B6C978BC-BF0A-4DB5-9F0C-207B005C9309} + {B6C978BC-BF0A-4DB5-9F0C-207B005C9309} = {71CD362E-B7B6-4401-A4B4-A98EFA8640A8} {4AAF9B8B-921C-4CB8-99FE-A1954E1F7A6A} = {1499A70E-BC88-4723-91BD-6781CE35BA2A} {1499A70E-BC88-4723-91BD-6781CE35BA2A} = {9F08EA87-929C-4796-84FE-4318F30EE3B9} - {C95B396D-9A82-4132-904D-033322781664} = {4158469E-F301-4EB3-84E1-62F6B557E7FA} {4158469E-F301-4EB3-84E1-62F6B557E7FA} = {4BA23FD0-E319-4184-897C-CA51D50B84C1} - {EA70774F-AEF3-42C2-AAF5-F0019F4CE538} = {8AD13481-0A24-432C-921B-52CF770F93D2} {8AD13481-0A24-432C-921B-52CF770F93D2} = {4BA23FD0-E319-4184-897C-CA51D50B84C1} {4BA23FD0-E319-4184-897C-CA51D50B84C1} = {E053BDB4-72B9-4890-8EB4-9A85C9EEA52C} - {D686EF18-807C-420A-9CDE-D1656598B1AF} = {AF3B00CE-446A-4FD7-A634-9A830D11AFC4} {AF3B00CE-446A-4FD7-A634-9A830D11AFC4} = {B843D464-19FC-4DB6-A10B-E361C2EEBDF9} {B843D464-19FC-4DB6-A10B-E361C2EEBDF9} = {E486E429-5593-4A27-9637-D47E7A4D1700} - {E4DF6E1D-9251-4116-B434-5153E70E9C43} = {7C089497-5856-4466-B965-F159C5F71A5B} {7C089497-5856-4466-B965-F159C5F71A5B} = {E2EB557C-82BE-45A9-A937-E460962235E7} {E2EB557C-82BE-45A9-A937-E460962235E7} = {757CA0A2-23C7-43EE-B779-0C2CDE78DE93} - {B18FD999-065F-411A-9D85-EEC5AAB92927} = {57965F0B-29D4-4BD9-B568-3C1A1A5FCC1D} {57965F0B-29D4-4BD9-B568-3C1A1A5FCC1D} = {18DF4C21-8439-4C74-BE56-F59B8D9DAE4C} {18DF4C21-8439-4C74-BE56-F59B8D9DAE4C} = {8164FB65-65E2-4455-A48A-8A2C799B9688} + {BBAB5C54-7EE6-4152-BF93-156A840F71D6} = {B6C978BC-BF0A-4DB5-9F0C-207B005C9309} + {AD34A17C-D193-4C28-8F4A-819CEF6A78B3} = {BBAB5C54-7EE6-4152-BF93-156A840F71D6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {02234C38-FCD9-42AD-9403-561D9C250C9B} diff --git a/src/components.kuka.robotics/ctrl/apax.yml b/src/components.kuka.robotics/ctrl/apax.yml index bc6c8af66..0237ae08c 100644 --- a/src/components.kuka.robotics/ctrl/apax.yml +++ b/src/components.kuka.robotics/ctrl/apax.yml @@ -16,6 +16,9 @@ dependencies: "@ix-ax/axopen.core": '0.0.0-dev.0' "@ix-ax/axopen.timers": '0.0.0-dev.0' "@ix-ax/axopen.abstractions": '0.0.0-dev.0' + "@ix-ax/axopen.components.robotics": '0.0.0-dev.0' + "@ix-ax/axopen.io": '0.0.0-dev.0' + "@ax/simatic-1500-distributedio": ^6.0.3 publicKeys: "@ix-ax": 30c06ef7830b4dfd8f16e003508da1ac2d187714d0e1f38279a9332cbe4e4e17 installStrategy: strict diff --git a/src/components.kuka.robotics/ctrl/src/AxoKrc4_v_5_x_x.st b/src/components.kuka.robotics/ctrl/src/AxoKrc4_v_5_x_x.st new file mode 100644 index 000000000..310ee00e3 --- /dev/null +++ b/src/components.kuka.robotics/ctrl/src/AxoKrc4_v_5_x_x.st @@ -0,0 +1,1688 @@ +USING AXOpen.Core; +USING AXOpen.Messaging; +USING AXOpen.Messaging.Static; +USING AXOpen.Components.Robotics; +USING AXOpen.Components.Abstractions.Robotics; + +NAMESPACE AXOpen.Components.Kuka.Robotics + {S7.extern=ReadWrite} + CLASS AxoKrc4_v_5_x_x EXTENDS AXOpen.Core.AxoComponent IMPLEMENTS AXOpen.Components.Abstractions.Robotics.IAxoRobotics + VAR PRIVATE + _infoTimer : AXOpen.Timers.OnDelayTimer; + _infoTime : LTIME := LT#2S; + _errorTimer : AXOpen.Timers.OnDelayTimer; + _errorTime : LTIME := LT#5S; + _blink : AXOpen.Timers.AxoBlinker; + _context : IAxoContext; + _stopTasksAreActive : BOOL; + _stopType : eAxoRoboticsStopType; + _someTaskIsActive : BOOL; + _hwID : WORD; + _hwId_512_DI_DO : WORD; + END_VAR + + VAR PUBLIC //HEADER + + END_VAR + + VAR PUBLIC //Tasks + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Restore#>"} + RestoreTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Stop movements#>"} + StopMovementsTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Stop movements and program#>"} + StopMovementsAndProgramTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Stop program#>"} + StopProgramTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Stop motors#>"} + StopMotorsTask : AxoTask; + + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Start at main#>"} + StartAtMainTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Start motors and program#>"} + StartMotorsAndProgramTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Start program#>"} + StartProgramTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Start motors#>"} + StartMotorsTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Start movements#>"} + StartMovementsTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Start motors program and movements#>"} + StartMotorsProgramAndMovementsTask : AxoTask; + + {#ix-attr:[ComponentDetails("Tasks")]} + {#ix-set:AttributeName = "<#Start movements with extended parameters#>"} + MovementParameters : AXOpen.Components.Abstractions.Robotics.AxoRoboticsMovementsParams; + END_VAR + + VAR PUBLIC //CONFIG + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[ComponentDetails("Config")]} + {#ix-attr:[ReadOnly()]} + Config : AxoKukaRobotics_Config_v_5_x_x; + END_VAR + + VAR PUBLIC //STATUS + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[ComponentDetails("Status")]} + {#ix-attr:[ReadOnly()]} + RobotStatus : AxoKukaRobotics_Component_Status_v_5_x_x; + Messenger : AXOpen.Messaging.Static.AxoMessenger; + TaskMessenger : AXOpen.Messaging.Static.AxoMessenger; + _progress : INT := 0; + END_VAR + + VAR PUBLIC //Hardware signals + {#ix-attr:[ComponentDetails("Hardware signals")]} + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#Inputs#>"} + {#ix-attr:[ReadOnly()]} + Inputs : AxoKukaRobotics_State_v_5_x_x; + {#ix-attr:[ComponentDetails("Hardware signals")]} + {#ix-attr:[Container(Layout.Wrap)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#Outputs#>"} + {#ix-attr:[ReadOnly()]} + Outputs : AxoKukaRobotics_Control_v_5_x_x; + END_VAR + + VAR PUBLIC //HardwareDiagnostics + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[ComponentDetails("Hardware diagnostics")]} + {#ix-set:AttributeName = "<#Update diagnostics#>"} + HardwareDiagnosticsTask : AXOpen.Io.AxoHardwareDiagnostics; + END_VAR + + ///

+ /// Runs tasks and logic of this component. + /// >[!IMPORTANT] This method must or one of its overloads be called cyclically. + /// + METHOD PUBLIC Run + VAR_INPUT + parent : IAxoObject; + hwID : WORD; + hwId_512_DI_DO : WORD; // Hardware Id of the input data of the robot + END_VAR + + Messenger.Serve(THIS); + + Messenger.ActivateOnCondition(ULINT#700,parent = NULL, eAxoMessageCategory#ProgrammingError); + Messenger.ActivateOnCondition(ULINT#701,hwId_512_DI_DO = WORD#0, eAxoMessageCategory#ProgrammingError); + + IF parent = NULL THEN + RobotStatus.Error.Id := UINT#700; + RETURN; + ELSIF hwId_512_DI_DO = WORD#0 THEN + RobotStatus.Error.Id := UINT#701; + RETURN; + END_IF; + + _hwID := hwID ; + _hwId_512_DI_DO := hwId_512_DI_DO; + + THIS.Initialize(parent); + THIS.Execute(); + END_METHOD + + /// + /// Runs tasks and logic of this component. + /// >[!IMPORTANT] This method must or one of its overloads be called cyclically. + /// + METHOD PUBLIC Run + VAR_INPUT + parent : IAxoContext; + hwID : WORD; + hwId_512_DI_DO : WORD; // Hardware Id of the input data of the robot + END_VAR + + Messenger.Serve(THIS); + + Messenger.ActivateOnCondition(ULINT#700,parent = NULL, eAxoMessageCategory#ProgrammingError); + Messenger.ActivateOnCondition(ULINT#701,hwId_512_DI_DO = WORD#0, eAxoMessageCategory#ProgrammingError); + + IF parent = NULL THEN + RobotStatus.Error.Id := UINT#700; + RETURN; + ELSIF hwId_512_DI_DO = WORD#0 THEN + RobotStatus.Error.Id := UINT#701; + RETURN; + END_IF; + + _hwID := hwID ; + _hwId_512_DI_DO := hwId_512_DI_DO; + + THIS.Initialize(parent); + THIS.Execute(); + END_METHOD + + METHOD PRIVATE Execute + VAR + _dword: DWORD; + _data : ARRAY[0..63] OF BYTE; + returnValue : WORD; + END_VAR + + THIS.Open(); + + //***********UPDATE**INPUTS****************** + returnValue := Siemens.Simatic.S71500.DistributedIO.ReadData(_hwId_512_DI_DO ,_data); + Messenger.ActivateOnCondition(ULINT#703,returnValue > WORD#0, eAxoMessageCategory#ProgrammingError); + IF returnValue > WORD#0 THEN + RobotStatus.Error.Id := UINT#703; + RETURN; + END_IF; + + //SYSTEM INPUTS + Inputs.RcReady := _data[0].%X0; + Inputs.AlarmStopActive := _data[0].%X1; + Inputs.UserSafetySwitchClosed := _data[0].%X2; + Inputs.DrivesReady := _data[0].%X3; + Inputs.RobotCalibrated := _data[0].%X4; + Inputs.InterfaceActivated := _data[0].%X5; + Inputs.StopMess := _data[0].%X6; + Inputs.RobotStopped := _data[0].%X7; + + Inputs.InHome := _data[1].%X0; + Inputs.Manual := _data[1].%X1; + Inputs.Automatic := _data[1].%X2; + Inputs.ExternalAutomatic := _data[1].%X3; + Inputs.ProActive := _data[1].%X4; + Inputs.PpMoved := _data[1].%X5; + Inputs.Error := _data[1].%X6; + Inputs.ProgramMoveActive := _data[1].%X7; + + + //Area/positions flags this should be obsolete because Zones and InPosition is used as byte below + Inputs.InArea_1 := _data[2].%X0; + Inputs.InArea_2 := _data[2].%X1; + Inputs.InArea_3 := _data[2].%X2; + Inputs.InArea_4 := _data[2].%X3; + Inputs.InPosition_1 := _data[2].%X4; + Inputs.InPosition_2 := _data[2].%X5; + Inputs.InPosition_3 := _data[2].%X6; + Inputs.InPosition_4 := _data[2].%X7; + + //Tool signals + Inputs.Tool_1_Retract := _data[3].%X0; + Inputs.Tool_1_Extend := _data[3].%X1; + Inputs.Tool_2_Retract := _data[3].%X2; + Inputs.Tool_2_Extend := _data[3].%X3; + Inputs.Tool_3_Retract := _data[3].%X4; + Inputs.Tool_3_Extend := _data[3].%X5; + Inputs.Tool_4_Retract := _data[3].%X6; + Inputs.Tool_4_Extend := _data[3].%X7; + + Inputs.Zone := _data[5]; + Inputs.InPosition := _data[6]; + + //Movement parameters + Inputs.ActionNo := _data[7]; + Inputs.GlobalSpeed := _data[8]; + Inputs.ToolNo := _data[9]; + Inputs.WorkobjectNo := _data[10]; + Inputs.PointNo := _data[11]; + + _dword.%B3 := _data[12]; + _dword.%B2 := _data[13]; + _dword.%B1 := _data[14]; + _dword.%B0 := _data[15]; + Inputs.UserSpecSpeed1 := TO_DINT(_dword); + + _dword.%B3 := _data[16]; + _dword.%B2 := _data[17]; + _dword.%B1 := _data[18]; + _dword.%B0 := _data[19]; + Inputs.UserSpecSpeed2 := TO_DINT(_dword); + + _dword.%B3 := _data[20]; + _dword.%B2 := _data[21]; + _dword.%B1 := _data[22]; + _dword.%B0 := _data[23]; + // Inputs.Coordinates.X:= TO_REAL(_dword)/REAL#10000.0-REAL#10000.0; + Inputs.Coordinates.X:= TO_REAL(_dword)*REAL#0.0001; //Todo check negative values + + _dword.%B3 := _data[24]; + _dword.%B2 := _data[25]; + _dword.%B1 := _data[26]; + _dword.%B0 := _data[27]; + // Inputs.Coordinates.Y:= TO_REAL(_dword)/REAL#10000.0-REAL#10000.0; + Inputs.Coordinates.Y:= TO_REAL(_dword)*REAL#0.0001; //Todo check negative values + + _dword.%B3 := _data[28]; + _dword.%B2 := _data[29]; + _dword.%B1 := _data[30]; + _dword.%B0 := _data[31]; + // Inputs.Coordinates.Z:= TO_REAL(_dword)/REAL#10000.0-REAL#10000.0; + Inputs.Coordinates.Z:= TO_REAL(_dword)*REAL#0.0001; //Todo check negative values + + _dword.%B3 := _data[32]; + _dword.%B2 := _data[33]; + _dword.%B1 := _data[34]; + _dword.%B0 := _data[35]; + // Inputs.Coordinates.Rx:= TO_REAL(_dword)/REAL#10000.0-REAL#360.0; + Inputs.Coordinates.Rx:= TO_REAL(_dword)*REAL#0.0001; //Todo check negative values + + _dword.%B3 := _data[36]; + _dword.%B2 := _data[37]; + _dword.%B1 := _data[39]; + _dword.%B0 := _data[39]; + // Inputs.Coordinates.Ry:= TO_REAL(_dword)/REAL#10000.0-REAL#360.0; + Inputs.Coordinates.Ry:= TO_REAL(_dword)*REAL#0.0001; //Todo check negative values + + _dword.%B3 := _data[40]; + _dword.%B2 := _data[41]; + _dword.%B1 := _data[42]; + _dword.%B0 := _data[43]; + // Inputs.Coordinates.Rz:= TO_REAL(_dword)/REAL#10000.0-REAL#360.0; + Inputs.Coordinates.Rz:= TO_REAL(_dword)*REAL#0.0001; //Todo check negative values + + _dword.%B3 := _data[44]; + _dword.%B2 := _data[45]; + _dword.%B1 := _data[46]; + _dword.%B0 := _data[47]; + Inputs.EventId := TO_UDINT(_dword); + //******************************************* + _context := THIS.GetContext(); + + _infoTime := Config.InfoTime; + _errorTime := Config.ErrorTime; + + //*************INITIALIZATION************* + RestoreTask.Initialize(THIS); + StopMovementsTask.Initialize(THIS); + StopMovementsAndProgramTask.Initialize(THIS); + StopProgramTask.Initialize(THIS); + StopMotorsTask.Initialize(THIS); + StartAtMainTask.Initialize(THIS); + StartMotorsAndProgramTask.Initialize(THIS); + StartProgramTask.Initialize(THIS); + StartMotorsTask.Initialize(THIS); + StartMovementsTask.Initialize(THIS); + StartMotorsProgramAndMovementsTask.Initialize(THIS); + HardwareDiagnosticsTask.Initialize(THIS); + + _stopTasksAreActive := StopMovementsTask.IsBusy() OR StopMovementsAndProgramTask.IsBusy() OR StopProgramTask.IsBusy() OR StopMotorsTask.IsBusy(); + //**************************************** + //********************Diagnostics********* + HardwareDiagnosticsTask.Run(_hwID); + //**************************************** + + //*************RESTORE******************** + RestoreTask.IsDisabled := FALSE; + IF RestoreTask.Execute() THEN + THIS.Restore(); + END_IF; + //**************************************** +(* + //*************StartAtMainTask*************** + StartAtMainTask.IsDisabled := _stopTasksAreActive; + IF StartAtMainTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#100; + END_IF; + Messenger.ActivateOnCondition(ULINT#100,StartAtMainTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#101,StartAtMainTask.IsDone(), eAxoMessageCategory#Info); + IF StartAtMainTask.Execute() THEN + _blink.Blink(Context := _context, inOnTime:=T#500MS,inOffTime:=T#500MS); + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 300; + END_IF; + + IF _progress = 300 THEN + TaskMessenger.ActivateOnCondition(ULINT#600, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#600; + END_IF; + + Outputs.StartAtMain := _blink.output; + + IF Inputs.PpMoved THEN + THIS.CallTimers(FALSE); + Outputs.StartAtMain :=FALSE; + _progress:=301; + END_IF; + END_IF; + + IF _progress = 301 THEN + StartAtMainTask.DoneWhen(TRUE); + THIS.CallTimers(FALSE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + StartAtMainTask.ThrowWhen(_errorTimer.output ); + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StartAtMainTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#101; + RobotStatus.Error.Id := UINT#0; + ELSIF StartAtMainTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#800; + RobotStatus.Error.Id := UINT#800; + ELSIF StartAtMainTask.AbortTriggered()THEN + RobotStatus.Action.Id := UINT#801; + RobotStatus.Error.Id := UINT#801; + END_IF; + Messenger.ActivateOnCondition(ULINT#800,StartAtMainTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#801,StartAtMainTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#102,StartAtMainTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StartAtMainTask.RestoreTriggered() AND _progress >= 300 AND _progress <= 309 THEN + RobotStatus.Action.Id := UINT#102; + _progress := 0; + END_IF; + //******************************************* + + //***********StartMotorsAndProgramTask******* + StartMotorsAndProgramTask.IsDisabled := _stopTasksAreActive OR StartProgramTask.IsBusy() OR StartMotorsTask.IsBusy(); + IF StartMotorsAndProgramTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#110; + END_IF; + Messenger.ActivateOnCondition(ULINT#110,StartMotorsAndProgramTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#111,StartMotorsAndProgramTask.IsDone(), eAxoMessageCategory#Info); + IF StartMotorsAndProgramTask.Execute() THEN + _blink.Blink(Context := _context, inOnTime:=T#500MS,inOffTime:=T#500MS); + + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 310; + END_IF; + + IF _progress = 310 THEN //Switching to auto + TaskMessenger.ActivateOnCondition(ULINT#610, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#610; + END_IF; + + IF Inputs.AutoOn THEN + THIS.CallTimers(FALSE); + _progress := 311; + END_IF; + END_IF; + + IF _progress = 311 THEN //Reseting error + TaskMessenger.ActivateOnCondition(ULINT#611, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#611; + END_IF; + + Outputs.ResetError := Inputs.Error AND _blink.output; + + IF NOT Inputs.Error THEN + Outputs.ResetError:=FALSE; + THIS.CallTimers(FALSE); + _progress := 312; + END_IF; + END_IF; + + IF _progress = 312 THEN //Reseting emergency stop error + TaskMessenger.ActivateOnCondition(ULINT#612, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#612; + END_IF; + + Outputs.ResetEmgStop := Inputs.EmgStop AND _blink.output; + + IF NOT Inputs.EmgStop THEN + Outputs.ResetEmgStop:=FALSE; + THIS.CallTimers(FALSE); + _progress := 313; + END_IF; + END_IF; + + IF _progress = 313 THEN + TaskMessenger.ActivateOnCondition(ULINT#613, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#613; + END_IF; + + Outputs.MotorOnAndStart:=_blink.output; + + IF Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 310; + END_IF; + + IF Inputs.MotorOnState THEN + THIS.CallTimers(FALSE); + _progress := 314; + END_IF; + END_IF; + + IF _progress = 314 THEN + TaskMessenger.ActivateOnCondition(ULINT#614, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#614; + END_IF; + + Outputs.MotorOnAndStart:=_blink.output; + + IF Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 310; + END_IF; + + IF Inputs.CycleOn THEN + THIS.CallTimers(FALSE); + _progress := 315; + END_IF; + END_IF; + + IF _progress = 315 THEN + TaskMessenger.ActivateOnCondition(ULINT#615, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#615; + END_IF; + + Outputs.MotorOnAndStart:=_blink.output; + + IF NOT Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 310; + END_IF; + + IF NOT Inputs.Error THEN + THIS.CallTimers(FALSE); + Outputs.MotorOnAndStart := FALSE; + _progress := 316; + END_IF; + END_IF; + + IF _progress = 316 THEN + StartMotorsAndProgramTask.DoneWhen(TRUE); + THIS.CallTimers(FALSE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + StartMotorsAndProgramTask.ThrowWhen(_errorTimer.output); + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StartMotorsAndProgramTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#111; + RobotStatus.Error.Id := UINT#0; + ELSIF StartMotorsAndProgramTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#810; + RobotStatus.Error.Id := UINT#810; + ELSIF StartMotorsAndProgramTask.AbortTriggered() THEN + RobotStatus.Action.Id := UINT#811; + RobotStatus.Error.Id := UINT#811; + END_IF; + Messenger.ActivateOnCondition(ULINT#810,StartMotorsAndProgramTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#811,StartMotorsAndProgramTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#112,StartMotorsAndProgramTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StartMotorsAndProgramTask.RestoreTriggered() AND _progress >= 310 AND _progress <= 319 THEN + RobotStatus.Action.Id := UINT#112; + _progress := 0; + END_IF; + //******************************************* + + //***********StartMotorsProgramAndMovementsTask******* + StartMotorsProgramAndMovementsTask.IsDisabled := _stopTasksAreActive OR StartProgramTask.IsBusy() OR StartMotorsTask.IsBusy() OR StartMovementsTask.IsBusy(); + IF StartMotorsProgramAndMovementsTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#120; + END_IF; + Messenger.ActivateOnCondition(ULINT#120,StartMotorsProgramAndMovementsTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#121,StartMotorsProgramAndMovementsTask.IsDone(), eAxoMessageCategory#Info); + IF StartMotorsProgramAndMovementsTask.Execute() THEN + _blink.Blink(Context := _context, inOnTime:=T#500MS,inOffTime:=T#500MS); + + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 320; + END_IF; + + IF _progress = 320 THEN //Switching to auto + TaskMessenger.ActivateOnCondition(ULINT#620, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#620; + END_IF; + + + IF Inputs.AutoOn THEN + THIS.CallTimers(FALSE); + _progress := 321; + END_IF; + END_IF; + + IF _progress = 321 THEN //Reseting error + TaskMessenger.ActivateOnCondition(ULINT#621, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#621; + END_IF; + + Outputs.ResetError := Inputs.Error AND _blink.output; + + IF NOT Inputs.Error THEN + Outputs.ResetError:=FALSE; + THIS.CallTimers(FALSE); + _progress := 322; + END_IF; + END_IF; + + IF _progress = 322 THEN //Reseting emergency stop error + TaskMessenger.ActivateOnCondition(ULINT#622, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#622; + END_IF; + + Outputs.ResetEmgStop := Inputs.EmgStop AND _blink.output; + + IF NOT Inputs.EmgStop THEN + Outputs.ResetEmgStop:=FALSE; + THIS.CallTimers(FALSE); + _progress := 323; + END_IF; + END_IF; + + IF _progress = 323 THEN + TaskMessenger.ActivateOnCondition(ULINT#623, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#623; + END_IF; + + Outputs.MotorOnAndStart:=_blink.output; + + IF Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 320; + END_IF; + + IF Inputs.MotorOnState THEN + THIS.CallTimers(FALSE); + _progress := 324; + END_IF; + END_IF; + + IF _progress = 324 THEN + TaskMessenger.ActivateOnCondition(ULINT#624, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#624; + END_IF; + + Outputs.MotorOnAndStart:=_blink.output; + + IF Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 320; + END_IF; + + IF Inputs.CycleOn THEN + THIS.CallTimers(FALSE); + _progress := 325; + END_IF; + END_IF; + + IF _progress = 325 THEN + TaskMessenger.ActivateOnCondition(ULINT#625, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#625; + END_IF; + + Outputs.MotorOnAndStart:=_blink.output; + + IF NOT Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 320; + END_IF; + + IF NOT Inputs.Error THEN + THIS.CallTimers(FALSE); + Outputs.MotorOnAndStart := FALSE; + _progress := 326; + END_IF; + END_IF; + + IF _progress = 326 THEN + TaskMessenger.ActivateOnCondition(ULINT#626, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#626; + END_IF; + + Outputs.GlobalSpeed := RobotStatus.CurrentMovementParameters.GlobalSpeed; + Outputs.ToolNo := RobotStatus.CurrentMovementParameters.ToolNo; + Outputs.WorkobjectNo := RobotStatus.CurrentMovementParameters.WorkobjectNo; + Outputs.PointNo := RobotStatus.CurrentMovementParameters.PointNo; + Outputs.UserSpecSpeed1 := RobotStatus.CurrentMovementParameters.UserSpecSpeed1; + Outputs.UserSpecSpeed2 := RobotStatus.CurrentMovementParameters.UserSpecSpeed2; + Outputs.Coordinates := RobotStatus.CurrentMovementParameters.Coordinates; + + Outputs.ActionNo := BYTE#254; + + IF Outputs.ActionNo = Inputs.ActionNo THEN + THIS.CallTimers(FALSE); + _progress := 327; + END_IF; + END_IF; + + IF _progress = 327 THEN + IF _infoTimer.output THEN + IF Inputs.GlobalSpeed <> RobotStatus.CurrentMovementParameters.GlobalSpeed THEN + RobotStatus.Error.Id := UINT#627;//<#Waiting for Inputs.GlobalSpeed to be equal to MovementParameters.GlobalSpeed! + END_IF; + IF Inputs.ToolNo <> RobotStatus.CurrentMovementParameters.ToolNo THEN + RobotStatus.Error.Id := UINT#628;//<#Waiting for Inputs.ToolNo to be equal to MovementParameters.ToolNo! + END_IF; + IF Inputs.WorkobjectNo <> RobotStatus.CurrentMovementParameters.WorkobjectNo THEN + RobotStatus.Error.Id := UINT#629;//<#Waiting for Inputs.WorkobjectNo to be equal to MovementParameters.WorkobjectNo! + END_IF; + IF Inputs.PointNo <> RobotStatus.CurrentMovementParameters.PointNo THEN + RobotStatus.Error.Id := UINT#630;//<#Waiting for Inputs.PointNo to be equal to MovementParameters.PointNo! + END_IF; + IF Inputs.UserSpecSpeed1 <> RobotStatus.CurrentMovementParameters.UserSpecSpeed1 THEN + RobotStatus.Error.Id := UINT#631;//<#Waiting for Inputs.UserSpecSpeed1 to be equal to MovementParameters.UserSpecSpeed1! + END_IF; + IF Inputs.UserSpecSpeed2 <> RobotStatus.CurrentMovementParameters.UserSpecSpeed2 THEN + RobotStatus.Error.Id := UINT#632;//<#Waiting for Inputs.UserSpecSpeed2 to be equal to MovementParameters.UserSpecSpeed2! + END_IF; + END_IF; + + IF Inputs.GlobalSpeed = RobotStatus.CurrentMovementParameters.GlobalSpeed AND + Inputs.ToolNo = RobotStatus.CurrentMovementParameters.ToolNo AND + Inputs.WorkobjectNo = RobotStatus.CurrentMovementParameters.WorkobjectNo AND + Inputs.PointNo = RobotStatus.CurrentMovementParameters.PointNo AND + Inputs.UserSpecSpeed1 = RobotStatus.CurrentMovementParameters.UserSpecSpeed1 AND + Inputs.UserSpecSpeed2 = RobotStatus.CurrentMovementParameters.UserSpecSpeed2 AND + AXOpen.Components.Robotics.CoordinatesAreNearlyEqual(Inputs.Coordinates,RobotStatus.CurrentMovementParameters.Coordinates,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01) THEN + THIS.CallTimers(FALSE); + _progress:=333; + END_IF; + END_IF; + + IF _progress = 333 THEN + TaskMessenger.ActivateOnCondition(ULINT#633, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#633; + END_IF; + + Outputs.ActionNo := BYTE#255; + + IF Outputs.ActionNo = Inputs.ActionNo THEN + THIS.CallTimers(FALSE); + _progress:=334; + END_IF; + END_IF; + + IF _progress = 334 THEN + TaskMessenger.ActivateOnCondition(ULINT#634, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#634; + END_IF; + + Outputs.ActionNo := RobotStatus.CurrentMovementParameters.ActionNo; + + IF Outputs.ActionNo = Inputs.ActionNo THEN + THIS.CallTimers(FALSE); + _progress:=335; + END_IF; + END_IF; + + IF _progress = 335 THEN + TaskMessenger.ActivateOnCondition(ULINT#635, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#635; + END_IF; + + Outputs.ActionNo := BYTE#255; + + IF Outputs.ActionNo = Inputs.ActionNo THEN + _progress := 0; + StartMotorsProgramAndMovementsTask.DoneWhen(TRUE); + END_IF; + END_IF; + + THIS.CallTimers(TRUE); + StartMotorsProgramAndMovementsTask.ThrowWhen(_errorTimer.output); + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StartMotorsProgramAndMovementsTask.IsFirstExecutionCycle() THEN + MovementParameters := RobotStatus.CurrentMovementParameters; + END_IF; + IF StartMotorsProgramAndMovementsTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#121; + RobotStatus.Error.Id := UINT#0; + ELSIF StartMotorsProgramAndMovementsTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#820; + RobotStatus.Error.Id := UINT#820; + ELSIF StartMotorsProgramAndMovementsTask.AbortTriggered() THEN + RobotStatus.Action.Id := UINT#821; + RobotStatus.Error.Id := UINT#821; + END_IF; + Messenger.ActivateOnCondition(ULINT#820,StartMotorsProgramAndMovementsTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#821,StartMotorsProgramAndMovementsTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#122,StartMotorsProgramAndMovementsTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StartMotorsProgramAndMovementsTask.RestoreTriggered() AND _progress >= 320 AND _progress <= 339 THEN + RobotStatus.Action.Id := UINT#122; + _progress := 0; + END_IF; + //******************************************* + + //***********StartMotorsTask***************** + StartMotorsTask.IsDisabled := _stopTasksAreActive OR StartMotorsProgramAndMovementsTask.IsBusy() OR StartMotorsAndProgramTask.IsBusy(); + IF StartMotorsTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#140; + END_IF; + Messenger.ActivateOnCondition(ULINT#140,StartMotorsTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#141,StartMotorsTask.IsDone(), eAxoMessageCategory#Info); + IF StartMotorsTask.Execute() THEN + _blink.Blink(Context := _context, inOnTime:=T#500MS,inOffTime:=T#500MS); + + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 340; + END_IF; + + IF _progress = 340 THEN //Switching to auto + TaskMessenger.ActivateOnCondition(ULINT#640, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#640; + END_IF; + + IF Inputs.AutoOn THEN + THIS.CallTimers(FALSE); + _progress := 341; + END_IF; + END_IF; + + IF _progress = 341 THEN //Reseting error + TaskMessenger.ActivateOnCondition(ULINT#641, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#641; + END_IF; + + Outputs.ResetError := Inputs.Error AND _blink.output; + + IF NOT Inputs.Error THEN + Outputs.ResetError:=FALSE; + THIS.CallTimers(FALSE); + _progress := 342; + END_IF; + END_IF; + + IF _progress = 342 THEN //Reseting emergency stop error + TaskMessenger.ActivateOnCondition(ULINT#642, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#642; + END_IF; + + Outputs.ResetEmgStop := Inputs.EmgStop AND _blink.output; + + IF NOT Inputs.EmgStop THEN + Outputs.ResetEmgStop:=FALSE; + THIS.CallTimers(FALSE); + _progress := 343; + END_IF; + END_IF; + + IF _progress = 343 THEN + TaskMessenger.ActivateOnCondition(ULINT#643, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#643; + END_IF; + + IF Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 340; + END_IF; + + Outputs.MotorOn:=_blink.output; + + IF Inputs.MotorOnState THEN + THIS.CallTimers(FALSE); + _progress := 344; + END_IF; + END_IF; + + IF _progress = 344 THEN + TaskMessenger.ActivateOnCondition(ULINT#644, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#644; + END_IF; + + IF Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 340; + END_IF; + + Outputs.MotorOn:=_blink.output; + + IF NOT Inputs.Error THEN + Outputs.MotorOn:=FALSE; + THIS.CallTimers(FALSE); + _progress := 345; + END_IF; + END_IF; + + IF _progress = 345 THEN + StartMotorsTask.DoneWhen(TRUE); + THIS.CallTimers(FALSE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + StartMotorsTask.ThrowWhen(_errorTimer.output); + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StartMotorsTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#141; + RobotStatus.Error.Id := UINT#0; + ELSIF StartMotorsTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#840; + RobotStatus.Error.Id := UINT#840; + ELSIF StartMotorsTask.AbortTriggered() THEN + RobotStatus.Action.Id := UINT#841; + RobotStatus.Error.Id := UINT#841; + END_IF; + Messenger.ActivateOnCondition(ULINT#840,StartMotorsTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#841,StartMotorsTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#142,StartMotorsTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StartMotorsTask.RestoreTriggered() AND _progress >= 340 AND _progress <= 349 THEN + RobotStatus.Action.Id := UINT#142; + _progress := 0; + END_IF; + //******************************************* + + //***********StartMovementsTask************** + StartMovementsTask.IsDisabled := _stopTasksAreActive OR StartMotorsProgramAndMovementsTask.IsBusy(); + IF StartMovementsTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#150; + END_IF; + Messenger.ActivateOnCondition(ULINT#150,StartMovementsTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#151,StartMovementsTask.IsDone(), eAxoMessageCategory#Info); + IF StartMovementsTask.Execute() THEN + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 350; + END_IF; + + IF _progress = 350 THEN + TaskMessenger.ActivateOnCondition(ULINT#650, _infoTimer.output, eAxoMessageCategory#Warning); + + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#650; + END_IF; + + IF Inputs.CycleOn THEN + THIS.CallTimers(FALSE); + _progress := 351; + END_IF; + END_IF; + + IF _progress = 351 THEN + TaskMessenger.ActivateOnCondition(ULINT#651, _infoTimer.output, eAxoMessageCategory#Warning); + + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#651; + END_IF; + + IF Inputs.MotorOnState THEN + THIS.CallTimers(FALSE); + _progress := 352; + END_IF; + END_IF; + + IF _progress = 352 THEN + TaskMessenger.ActivateOnCondition(ULINT#652, _infoTimer.output, eAxoMessageCategory#Warning); + + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#652; + END_IF; + + IF NOT Inputs.Error THEN + THIS.CallTimers(FALSE); + _progress := 353; + END_IF; + END_IF; + + IF _progress = 353 THEN + TaskMessenger.ActivateOnCondition(ULINT#653, _infoTimer.output, eAxoMessageCategory#Warning); + + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#653; + END_IF; + + Outputs.GlobalSpeed := RobotStatus.CurrentMovementParameters.GlobalSpeed; + Outputs.ToolNo := RobotStatus.CurrentMovementParameters.ToolNo; + Outputs.WorkobjectNo := RobotStatus.CurrentMovementParameters.WorkobjectNo; + Outputs.PointNo := RobotStatus.CurrentMovementParameters.PointNo; + Outputs.UserSpecSpeed1 := RobotStatus.CurrentMovementParameters.UserSpecSpeed1; + Outputs.UserSpecSpeed2 := RobotStatus.CurrentMovementParameters.UserSpecSpeed2; + Outputs.Coordinates := RobotStatus.CurrentMovementParameters.Coordinates; + + Outputs.ActionNo := BYTE#254; + + IF Outputs.ActionNo = Inputs.ActionNo THEN + THIS.CallTimers(FALSE); + _progress := 354; + END_IF; + END_IF; + + IF _progress = 354 THEN + IF _infoTimer.output THEN + IF Inputs.GlobalSpeed <> RobotStatus.CurrentMovementParameters.GlobalSpeed THEN + RobotStatus.Error.Id := UINT#654;//<#Waiting for Inputs.GlobalSpeed to be equal to MovementParameters.GlobalSpeed! + END_IF; + IF Inputs.ToolNo <> RobotStatus.CurrentMovementParameters.ToolNo THEN + RobotStatus.Error.Id := UINT#655;//<#Waiting for Inputs.ToolNo to be equal to MovementParameters.ToolNo! + END_IF; + IF Inputs.WorkobjectNo <> RobotStatus.CurrentMovementParameters.WorkobjectNo THEN + RobotStatus.Error.Id := UINT#656;//<#Waiting for Inputs.WorkobjectNo to be equal to MovementParameters.WorkobjectNo! + END_IF; + IF Inputs.PointNo <> RobotStatus.CurrentMovementParameters.PointNo THEN + RobotStatus.Error.Id := UINT#657;//<#Waiting for Inputs.PointNo to be equal to MovementParameters.PointNo! + END_IF; + IF Inputs.UserSpecSpeed1 <> RobotStatus.CurrentMovementParameters.UserSpecSpeed1 THEN + RobotStatus.Error.Id := UINT#658;//<#Waiting for Inputs.UserSpecSpeed1 to be equal to MovementParameters.UserSpecSpeed1! + END_IF; + IF Inputs.UserSpecSpeed2 <> RobotStatus.CurrentMovementParameters.UserSpecSpeed2 THEN + RobotStatus.Error.Id := UINT#659;//<#Waiting for Inputs.UserSpecSpeed2 to be equal to MovementParameters.UserSpecSpeed2! + END_IF; + END_IF; + + IF Inputs.GlobalSpeed = RobotStatus.CurrentMovementParameters.GlobalSpeed AND + Inputs.ToolNo = RobotStatus.CurrentMovementParameters.ToolNo AND + Inputs.WorkobjectNo = RobotStatus.CurrentMovementParameters.WorkobjectNo AND + Inputs.PointNo = RobotStatus.CurrentMovementParameters.PointNo AND + Inputs.UserSpecSpeed1 = RobotStatus.CurrentMovementParameters.UserSpecSpeed1 AND + Inputs.UserSpecSpeed2 = RobotStatus.CurrentMovementParameters.UserSpecSpeed2 AND + AXOpen.Components.Robotics.CoordinatesAreNearlyEqual(Inputs.Coordinates,RobotStatus.CurrentMovementParameters.Coordinates,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01) THEN + THIS.CallTimers(FALSE); + _progress:=360; + END_IF; + END_IF; + + IF _progress = 360 THEN + TaskMessenger.ActivateOnCondition(ULINT#660, _infoTimer.output, eAxoMessageCategory#Warning); + + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#660; + END_IF; + + Outputs.ActionNo := BYTE#255; + + IF Outputs.ActionNo = Inputs.ActionNo THEN + THIS.CallTimers(FALSE); + _progress:=361; + END_IF; + END_IF; + + IF _progress = 361 THEN + TaskMessenger.ActivateOnCondition(ULINT#661, _infoTimer.output, eAxoMessageCategory#Warning); + + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#661; + END_IF; + + Outputs.ActionNo := RobotStatus.CurrentMovementParameters.ActionNo; + + IF Outputs.ActionNo = Inputs.ActionNo THEN + THIS.CallTimers(FALSE); + _progress:=662; + END_IF; + END_IF; + + IF _progress = 662 THEN + TaskMessenger.ActivateOnCondition(ULINT#662, _infoTimer.output, eAxoMessageCategory#Warning); + + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#662; + END_IF; + + Outputs.ActionNo := BYTE#255; + + IF Outputs.ActionNo = Inputs.ActionNo THEN + _progress := 663; + StartMovementsTask.DoneWhen(TRUE); + END_IF; + END_IF; + + IF _progress = 663 THEN + _progress := 663; + StartMovementsTask.DoneWhen(TRUE); + END_IF; + THIS.CallTimers(TRUE); + + StartMovementsTask.ThrowWhen(_errorTimer.output); + + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StartMovementsTask.IsFirstExecutionCycle() THEN + MovementParameters := RobotStatus.CurrentMovementParameters; + END_IF; + IF StartMovementsTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#151; + RobotStatus.Error.Id := UINT#0; + ELSIF StartMovementsTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#850; + RobotStatus.Error.Id := UINT#850; + ELSIF StartMovementsTask.AbortTriggered() THEN + RobotStatus.Action.Id := UINT#851; + RobotStatus.Error.Id := UINT#851; + END_IF; + Messenger.ActivateOnCondition(ULINT#850,StartMovementsTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#851,StartMovementsTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#152,StartMovementsTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StartMovementsTask.RestoreTriggered() AND _progress >= 350 AND _progress <= 369 THEN + RobotStatus.Action.Id := UINT#152; + _progress := 0; + END_IF; + //******************************************* + + //***********StartProgramTask******* + StartProgramTask.IsDisabled := _stopTasksAreActive; + IF StartAtMainTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#170; + END_IF; + Messenger.ActivateOnCondition(ULINT#170,StartAtMainTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#171,StartAtMainTask.IsDone(), eAxoMessageCategory#Info); + IF StartProgramTask.Execute() THEN + _blink.Blink(Context := _context, inOnTime:=T#500MS,inOffTime:=T#500MS); + + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 370; + END_IF; + + IF _progress = 370 THEN + TaskMessenger.ActivateOnCondition(ULINT#670, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#670; + END_IF; + + Outputs.StartProgram:=_blink.output; + + IF Inputs.CycleOn THEN + THIS.CallTimers(FALSE); + _progress := 371; + END_IF; + END_IF; + + IF _progress = 371 THEN + TaskMessenger.ActivateOnCondition(ULINT#671, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#671; + END_IF; + + Outputs.StartProgram:=_blink.output; + + IF NOT Inputs.SystemInputBusy THEN + Outputs.StartProgram:=FALSE; + THIS.CallTimers(FALSE); + _progress := 372; + END_IF; + END_IF; + + IF _progress = 372 THEN + StartProgramTask.DoneWhen(TRUE); + THIS.CallTimers(FALSE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + StartProgramTask.ThrowWhen(_errorTimer.output); + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StartProgramTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#171; + RobotStatus.Error.Id := UINT#0; + ELSIF StartProgramTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#870; + RobotStatus.Error.Id := UINT#870; + ELSIF StartProgramTask.AbortTriggered()THEN + RobotStatus.Action.Id := UINT#871; + RobotStatus.Error.Id := UINT#871; + END_IF; + Messenger.ActivateOnCondition(ULINT#870,StartProgramTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#871,StartProgramTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#172,StartProgramTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StartProgramTask.RestoreTriggered() AND _progress >= 370 AND _progress <= 379 THEN + RobotStatus.Action.Id := UINT#172; + _progress := 0; + END_IF; + //******************************************* + + //***********StopMotorsTask*************** + StopMotorsTask.IsDisabled := FALSE; + IF StartAtMainTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#180; + END_IF; + Messenger.ActivateOnCondition(ULINT#180,StartAtMainTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#181,StartAtMainTask.IsDone(), eAxoMessageCategory#Info); + IF StopMotorsTask.Execute() THEN + _blink.Blink(Context := _context, inOnTime:=T#500MS,inOffTime:=T#500MS); + + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 380; + END_IF; + + IF _progress = 380 THEN + TaskMessenger.ActivateOnCondition(ULINT#680, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#680; + END_IF; + + Outputs.MotorOff := TRUE; + + IF Inputs.MotorOffState THEN + THIS.CallTimers(FALSE); + _progress := 381; + END_IF; + END_IF; + + IF _progress = 381 THEN + TaskMessenger.ActivateOnCondition(ULINT#681, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#681; + END_IF; + + Outputs.MotorOff := TRUE; + + IF NOT Inputs.SystemInputBusy THEN + Outputs.MotorOff:=FALSE; + THIS.CallTimers(FALSE); + _progress := 382; + END_IF; + END_IF; + + IF _progress = 381 THEN + StopMotorsTask.DoneWhen(TRUE); + THIS.CallTimers(FALSE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + StopMotorsTask.ThrowWhen(_errorTimer.output); + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StopMotorsTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#181; + RobotStatus.Error.Id := UINT#0; + ELSIF StopMotorsTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#880; + RobotStatus.Error.Id := UINT#880; + ELSIF StopMotorsTask.AbortTriggered()THEN + RobotStatus.Action.Id := UINT#881; + RobotStatus.Error.Id := UINT#881; + END_IF; + Messenger.ActivateOnCondition(ULINT#880,StopMotorsTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#881,StopMotorsTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#182,StopMotorsTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StopMotorsTask.RestoreTriggered() AND _progress >= 380 AND _progress <= 389 THEN + RobotStatus.Action.Id := UINT#182; + _progress := 0; + END_IF; + //******************************************* + + //***********StopMovementsAndProgramTask***** + StopMovementsAndProgramTask.IsDisabled := FALSE; + IF StopMovementsAndProgramTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#190; + END_IF; + Messenger.ActivateOnCondition(ULINT#190,StopMovementsAndProgramTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#191,StopMovementsAndProgramTask.IsDone(), eAxoMessageCategory#Info); + IF StopMovementsAndProgramTask.Execute() THEN + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 390; + END_IF; + + IF _progress = 390 THEN + TaskMessenger.ActivateOnCondition(ULINT#690, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#690; + END_IF; + + Outputs.SoftStop := TRUE; + Outputs.QuickStop := FALSE; + + IF _stopType = eAxoRoboticsStopType#Quick THEN + Outputs.SoftStop := FALSE; + Outputs.QuickStop := TRUE; + END_IF; + + IF Inputs.MoveInactive THEN + THIS.CallTimers(FALSE); + _progress := 391; + END_IF; + END_IF; + + IF _progress = 391 THEN + TaskMessenger.ActivateOnCondition(ULINT#691, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#691; + END_IF; + + Outputs.StopProgram:=TRUE; + + IF NOT Inputs.CycleOn THEN + THIS.CallTimers(FALSE); + _progress := 392; + END_IF; + END_IF; + + IF _progress = 392 THEN + Outputs.SoftStop := FALSE; + Outputs.QuickStop := FALSE; + Outputs.StopProgram:=FALSE; + StopMovementsAndProgramTask.DoneWhen(TRUE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + + StopMovementsAndProgramTask.ThrowWhen(_errorTimer.output); + + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StopMovementsAndProgramTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#191; + RobotStatus.Error.Id := UINT#0; + ELSIF StopMovementsAndProgramTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#890; + RobotStatus.Error.Id := UINT#890; + ELSIF StopMovementsAndProgramTask.AbortTriggered()THEN + RobotStatus.Action.Id := UINT#891; + RobotStatus.Error.Id := UINT#891; + END_IF; + Messenger.ActivateOnCondition(ULINT#890,StopMovementsAndProgramTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#891,StopMovementsAndProgramTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#192,StopMovementsAndProgramTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StopMovementsAndProgramTask.RestoreTriggered() AND _progress >= 390 AND _progress <= 399 THEN + RobotStatus.Action.Id := UINT#192; + _progress := 0; + END_IF; + //******************************************* + + //***********StopMovementsTask*************** + StopMovementsTask.IsDisabled := FALSE; + IF StopMovementsTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#400; + END_IF; + Messenger.ActivateOnCondition(ULINT#200,StopMovementsTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#201,StopMovementsTask.IsDone(), eAxoMessageCategory#Info); + IF StopMovementsTask.Execute() THEN + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 400; + END_IF; + + IF _progress = 400 THEN + TaskMessenger.ActivateOnCondition(ULINT#692, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#692; + END_IF; + + Outputs.SoftStop := TRUE; + Outputs.QuickStop := FALSE; + + IF _stopType = eAxoRoboticsStopType#Quick THEN + Outputs.SoftStop := FALSE; + Outputs.QuickStop := TRUE; + END_IF; + + + IF Inputs.MoveInactive THEN + THIS.CallTimers(FALSE); + _progress := 401; + END_IF; + END_IF; + + IF _progress = 401 THEN + Outputs.SoftStop := FALSE; + Outputs.QuickStop := FALSE; + _progress := 0; + StopMovementsTask.DoneWhen(TRUE); + END_IF; + + + THIS.CallTimers(TRUE); + + StopMovementsTask.ThrowWhen(_errorTimer.output); + + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StopMovementsTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#201; + RobotStatus.Error.Id := UINT#0; + ELSIF StopMovementsTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#900; + RobotStatus.Error.Id := UINT#900; + ELSIF StopMovementsTask.AbortTriggered()THEN + RobotStatus.Action.Id := UINT#901; + RobotStatus.Error.Id := UINT#901; + END_IF; + Messenger.ActivateOnCondition(ULINT#900,StopMovementsTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#901,StopMovementsTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#202,StopMovementsTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StopMovementsTask.RestoreTriggered() AND _progress >= 400 AND _progress <= 409 THEN + RobotStatus.Action.Id := UINT#202; + _progress := 0; + END_IF; + //******************************************* + + //***********StopProgramTask***************** + StopProgramTask.IsDisabled := FALSE; + IF StopProgramTask.StartTriggered() THEN + RobotStatus.Action.Id := UINT#210; + END_IF; + Messenger.ActivateOnCondition(ULINT#210,StopProgramTask.IsBusy(), eAxoMessageCategory#Info); + Messenger.ActivateOnCondition(ULINT#211,StopProgramTask.IsDone(), eAxoMessageCategory#Info); + IF StopProgramTask.Execute() THEN + IF _progress = 0 THEN + RobotStatus.Error.Id := UINT#0; + TaskMessenger.Restore(); + THIS.CallTimers(FALSE); + _progress := 410; + END_IF; + + IF _progress = 410 THEN + TaskMessenger.ActivateOnCondition(ULINT#693, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#693; + END_IF; + + Outputs.StopProgram:=TRUE; + + IF NOT Inputs.CycleOn THEN + THIS.CallTimers(FALSE); + _progress := 411; + END_IF; + END_IF; + + IF _progress = 411 THEN + Outputs.StopProgram:=FALSE; + StopProgramTask.DoneWhen(TRUE); + _progress := 0; + END_IF; + + THIS.CallTimers(TRUE); + + StopProgramTask.ThrowWhen(_errorTimer.output); + + RobotStatus.Action.Id := TO_UINT(_progress); + END_IF; + IF StopProgramTask.DoneReached() THEN + RobotStatus.Action.Id := UINT#911; + RobotStatus.Error.Id := UINT#0; + ELSIF StopProgramTask.ErrorOccured() THEN + RobotStatus.Action.Id := UINT#910; + RobotStatus.Error.Id := UINT#910; + ELSIF StopProgramTask.AbortTriggered()THEN + RobotStatus.Action.Id := UINT#911; + RobotStatus.Error.Id := UINT#911; + END_IF; + Messenger.ActivateOnCondition(ULINT#910,StopProgramTask.HasError(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#911,StopProgramTask.IsAborted(), eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#212,StopProgramTask.RestoreTriggered() , eAxoMessageCategory#Error); + IF StopProgramTask.RestoreTriggered() AND _progress >= 410 AND _progress <= 419 THEN + RobotStatus.Action.Id := UINT#912; + _progress := 0; + END_IF; + //******************************************* + + _someTaskIsActive := StartAtMainTask.IsBusy() + OR StartMotorsAndProgramTask.IsBusy() + OR StartMovementsTask.IsBusy() + OR StartMovementsTask.IsBusy() + OR StopMovementsTask.IsBusy() + OR StopMovementsAndProgramTask.IsBusy() + OR StopProgramTask.IsBusy(); + + Messenger.ActivateOnCondition(ULINT#705,_someTaskIsActive AND Inputs.EmgStop, eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#706,_someTaskIsActive AND NOT Inputs.SafetyOk, eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#707,_someTaskIsActive AND Inputs.ProgExecError, eAxoMessageCategory#Error); + + IF _someTaskIsActive THEN + IF(Inputs.EmgStop) THEN + RobotStatus.Error.Id := UINT#705; + END_IF; + IF(NOT Inputs.SafetyOk) THEN + RobotStatus.Error.Id := UINT#706; + END_IF; + IF(Inputs.ProgExecError) THEN + RobotStatus.Error.Id := UINT#707; + END_IF; + END_IF; +*) + //***********UPDATE**OUTPUTS***************** + //SYSTEM OUTPUTS + _data[0].%X0 := Outputs.ExternalStart; + _data[0].%X1 := Outputs.MoveEnable; + _data[0].%X2 := Outputs.ErrorConfirmation; + _data[0].%X3 := Outputs.DrivesOff; + _data[0].%X4 := Outputs.DrivesOn; + _data[0].%X5 := Outputs.ActivateInterface; + _data[0].%X6 := Outputs.StartAtMain; + + // _data[1].%X0 := Outputs.StartProgram; + // _data[1].%X1 := Outputs.StartAtMain; + // _data[1].%X2 := Outputs.StopProgram; + // _data[1].%X3 := Outputs.QuickStop; + // _data[1].%X4 := Outputs.SoftStop; + // _data[1].%X5 := Outputs.StopCycle; + // _data[1].%X6 := Outputs.StopInstruction; + // _data[1].%X7 := Outputs.LimitSpeed; + + //Tool signals + _data[2].%X0 := Outputs.Tool_1_Retract; + _data[2].%X1 := Outputs.Tool_1_Extend; + _data[2].%X2 := Outputs.Tool_2_Retract; + _data[2].%X3 := Outputs.Tool_2_Extend; + _data[2].%X4 := Outputs.Tool_3_Retract; + _data[2].%X5 := Outputs.Tool_3_Extend; + _data[2].%X6 := Outputs.Tool_4_Retract; + _data[2].%X7 := Outputs.Tool_4_Extend; + + //master mode such as manual/auto .. + _data[3] := Outputs.MasterMode; + + //zone + _data[5] := Outputs.Zone; + + //position + _data[6] := Outputs.InPosition; + + //Movement parameters + _data[7] := Outputs.ActionNo; + _data[8] := Outputs.GlobalSpeed; + _data[9] := Outputs.ToolNo; + _data[10] := Outputs.WorkobjectNo; + _data[11] := Outputs.PointNo; + + _dword := TO_DWORD(Outputs.UserSpecSpeed1); + _data[12] := _dword.%B3; + _data[13] := _dword.%B2; + _data[14] := _dword.%B1; + _data[15] := _dword.%B0; + + _dword := TO_DWORD(Outputs.UserSpecSpeed2); + _data[16] := _dword.%B3; + _data[17] := _dword.%B2; + _data[18] := _dword.%B1; + _data[19] := _dword.%B0; + + ////Coordinates + // _dword := TO_DWORD((Outputs.Coordinates.X +REAL#10000.0)*REAL#10000.0); + _dword := TO_DWORD(Outputs.Coordinates.X * REAL#10000.0); // Todo check negative values + _data[20] := _dword.%B3; + _data[21] := _dword.%B2; + _data[22] := _dword.%B1; + _data[23] := _dword.%B0; + + // _dword := TO_DWORD((Outputs.Coordinates.Y +REAL#10000.0)*REAL#10000.0); + _dword := TO_DWORD(Outputs.Coordinates.Y * REAL#10000.0); // Todo check negative values + _data[24] := _dword.%B3; + _data[25] := _dword.%B2; + _data[26] := _dword.%B1; + _data[27] := _dword.%B0; + + // _dword := TO_DWORD((Outputs.Coordinates.Z +REAL#10000.0)*REAL#10000.0); + _dword := TO_DWORD(Outputs.Coordinates.Z * REAL#10000.0); // Todo check negative values + _data[28] := _dword.%B3; + _data[29] := _dword.%B2; + _data[30] := _dword.%B1; + _data[31] := _dword.%B0; + + // _dword := TO_DWORD((Outputs.Coordinates.Rx +REAL#360.0)*REAL#10000.0); + _dword := TO_DWORD(Outputs.Coordinates.Rx * REAL#10000.0); // Todo check negative values + _data[32] := _dword.%B3; + _data[33] := _dword.%B2; + _data[34] := _dword.%B1; + _data[35] := _dword.%B0; + + // _dword := TO_DWORD((Outputs.Coordinates.Ry +REAL#360.0)*REAL#10000.0); + _dword := TO_DWORD(Outputs.Coordinates.Ry * REAL#10000.0); // Todo check negative values + _data[36] := _dword.%B3; + _data[37] := _dword.%B2; + _data[38] := _dword.%B1; + _data[39] := _dword.%B0; + + // _dword := TO_DWORD((Outputs.Coordinates.Rz +REAL#360.0)*REAL#10000.0); + _dword := TO_DWORD(Outputs.Coordinates.Rz * REAL#10000.0); // Todo check negative values + _data[40] := _dword.%B3; + _data[41] := _dword.%B2; + _data[42] := _dword.%B1; + _data[43] := _dword.%B0; + + returnValue := Siemens.Simatic.S71500.DistributedIO.WriteData(_hwId_512_DI_DO,_data); + Messenger.ActivateOnCondition(ULINT#704,returnValue > WORD#0, eAxoMessageCategory#ProgrammingError); + IF returnValue > WORD#0 THEN + RobotStatus.Error.Id := UINT#704; + RETURN; + END_IF; + //******************************************* + THIS.Close(); + END_METHOD + + METHOD PROTECTED OVERRIDE ManualControl + RobotStatus.CurrentMovementParameters := MovementParameters; + END_METHOD + + /// + /// Restores this component into intial state. + /// + METHOD PUBLIC OVERRIDE Restore + StopMovementsTask.Restore(); + StopMovementsAndProgramTask.Restore(); + StopProgramTask.Restore(); + StopMotorsTask.Restore(); + StartAtMainTask.Restore(); + StartMotorsAndProgramTask.Restore(); + StartProgramTask.Restore(); + StartMotorsTask.Restore(); + StartMovementsTask.Restore(); + StartMotorsProgramAndMovementsTask.Restore(); + RobotStatus.Action.Id := UINT#50; + RestoreTask.DoneWhen(TRUE); + END_METHOD + + METHOD PUBLIC StartAtMain : IAxoTaskState + StartAtMain := StartAtMainTask.Invoke(); + END_METHOD + + METHOD PUBLIC StartMotorsAndProgram : IAxoTaskState + StartMotorsAndProgram := StartMotorsAndProgramTask.Invoke(); + END_METHOD + + METHOD PUBLIC StartMotorsProgramAndMovements : IAxoTaskState + VAR_IN_OUT + inData : AxoRoboticsMovementsParams; + END_VAR + RobotStatus.CurrentMovementParameters := inData; + + StartMotorsProgramAndMovements := StartMotorsProgramAndMovementsTask.Invoke(); + END_METHOD + + METHOD PUBLIC StartMotors : IAxoTaskState + StartMotors := StartMotorsTask.Invoke(); + END_METHOD + + METHOD PUBLIC StartMovements : IAxoTaskState + VAR_IN_OUT + inData : AxoRoboticsMovementsParams; + END_VAR + RobotStatus.CurrentMovementParameters := inData; + + StartMovements := StartMovementsTask.Invoke(); + END_METHOD + + METHOD PUBLIC StartProgram : IAxoTaskState + StartProgram := StartProgramTask.Invoke(); + END_METHOD + + METHOD PUBLIC StopMotors : IAxoTaskState + StopMotors := StopMotorsTask.Invoke(); + END_METHOD + + METHOD PUBLIC StopMovementsAndProgram : IAxoTaskState + VAR_INPUT + inStopType : eAxoRoboticsStopType; + END_VAR + _stopType := inStopType; + StopMovementsAndProgram := StopMovementsAndProgramTask.Invoke(); + END_METHOD + + METHOD PUBLIC StopMovements : IAxoTaskState + VAR_INPUT + inStopType : eAxoRoboticsStopType; + END_VAR + _stopType := inStopType; + StopMovements := StopMovementsTask.Invoke(); + END_METHOD + + METHOD PUBLIC StopProgram : IAxoTaskState + StopProgram := StopProgramTask.Invoke(); + END_METHOD + + + METHOD PRIVATE CallTimers + VAR_INPUT + signal : BOOL; + END_VAR + + _infoTimer.OnDelay(THIS, signal , _infoTime); + _errorTimer.OnDelay(THIS, signal , _errorTime ); + END_METHOD + END_CLASS +END_NAMESPACE diff --git a/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.st b/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.st new file mode 100644 index 000000000..786d6b2f8 --- /dev/null +++ b/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.st @@ -0,0 +1,13 @@ +NAMESPACE AXOpen.Components.Kuka.Robotics + {S7.extern=ReadWrite} + {#ix-attr:[Container(Layout.Stack)]} + CLASS PUBLIC AxoKukaRobotics_Component_Status_v_5_x_x EXTENDS AXOpen.Components.Robotics.AxoRobot_Status + VAR PUBLIC + END_VAR + END_CLASS +END_NAMESPACE + + + + + diff --git a/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Config_v_5_x_x.st b/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Config_v_5_x_x.st new file mode 100644 index 000000000..aceac3792 --- /dev/null +++ b/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Config_v_5_x_x.st @@ -0,0 +1,12 @@ +NAMESPACE AXOpen.Components.Kuka.Robotics + {#ix-attr:[Container(Layout.Stack)]} + {S7.extern=ReadWrite} + CLASS PUBLIC AxoKukaRobotics_Config_v_5_x_x + VAR PUBLIC + {#ix-set:AttributeName = "<#Info time#>"} + InfoTime : LTIME := LT#2S; + {#ix-set:AttributeName = "<#Error time#>"} + ErrorTime : LTIME := LT#5S; + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Control_v_5_x_x.st b/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Control_v_5_x_x.st new file mode 100644 index 000000000..35d457cd3 --- /dev/null +++ b/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_Control_v_5_x_x.st @@ -0,0 +1,73 @@ +NAMESPACE AXOpen.Components.Kuka.Robotics + {S7.extern=ReadWrite} + {#ix-attr:[Container(Layout.Wrap)]} + CLASS AxoKukaRobotics_Control_v_5_x_x + VAR PUBLIC + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#Program Start [EXT_START]#>"} + ExternalStart : BOOL; + {#ix-set:AttributeName = "<#Move Enable [MOVE_ENABLE]#>"} + MoveEnable : BOOL; + {#ix-set:AttributeName = "<#Error Confirmation [CONF_MESS]#>"} + ErrorConfirmation : BOOL; + {#ix-set:AttributeName = "<#Drives Off [DRIVES_OFF]#>"} + DrivesOff : BOOL; + {#ix-set:AttributeName = "<#Drives On [DRIVES_ON]#>"} + DrivesOn : BOOL; + {#ix-set:AttributeName = "<#Activate Interface [I_O_ACT]#>"} + ActivateInterface : BOOL; + {#ix-set:AttributeName = "<#Start At Main [START_AT_MAIN]#>"} + StartAtMain : BOOL; + {#ix-set:AttributeName = "<#Master mode#>"} + MasterMode : BYTE; + + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#Tool 1 retract#>"} + Tool_1_Retract : BOOL; + {#ix-set:AttributeName = "<#Tool 1 extend#>"} + Tool_1_Extend : BOOL; + {#ix-set:AttributeName = "<#Tool 2 retract#>"} + Tool_2_Retract : BOOL; + {#ix-set:AttributeName = "<#Tool 2 extend#>"} + Tool_2_Extend : BOOL; + {#ix-set:AttributeName = "<#Tool 3 retract#>"} + Tool_3_Retract : BOOL; + {#ix-set:AttributeName = "<#Tool 3 extend#>"} + Tool_3_Extend : BOOL; + {#ix-set:AttributeName = "<#Tool 4 retract#>"} + Tool_4_Retract : BOOL; + {#ix-set:AttributeName = "<#Tool 4 extend#>"} + Tool_4_Extend : BOOL; + + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#Tool 1 retract#>"} + {#ix-set:AttributeName = "<#Zones#>"} + Zone : BYTE; + {#ix-set:AttributeName = "<#In position#>"} + InPosition : BYTE; + {#ix-set:AttributeName = "<#Action number#>"} + ActionNo : BYTE; + {#ix-set:AttributeName = "<#Global robot speed#>"} + GlobalSpeed : BYTE; + {#ix-set:AttributeName = "<#Tool number#>"} + ToolNo : BYTE; + {#ix-set:AttributeName = "<#Workobject number#>"} + WorkobjectNo : BYTE; + {#ix-set:AttributeName = "<#Point number#>"} + PointNo : BYTE; + {#ix-set:AttributeName = "<#User specific speed 1#>"} + UserSpecSpeed1 : REAL; + {#ix-set:AttributeName = "<#User specific speed 2#>"} + UserSpecSpeed2 : REAL; + + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {attribute addProperty Name "<#Coordinates#>"} + Coordinates : AXOpen.Components.Abstractions.Robotics.AxoRoboticsCoordinates; + END_VAR + END_CLASS +END_NAMESPACE + \ No newline at end of file diff --git a/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_State_v_5_x_x.st b/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_State_v_5_x_x.st new file mode 100644 index 000000000..6f36f5b65 --- /dev/null +++ b/src/components.kuka.robotics/ctrl/src/AxoKukaRobotics_Datatypes_v_5_x_x/AxoKukaRobotics_State_v_5_x_x.st @@ -0,0 +1,115 @@ +NAMESPACE AXOpen.Components.Kuka.Robotics + {S7.extern=ReadWrite} + {#ix-attr:[Container(Layout.Wrap)]} + CLASS AxoKukaRobotics_State_v_5_x_x + VAR PUBLIC + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#ControlReady [RC_RDY1]#>"} + RcReady : BOOL; + {#ix-set:AttributeName = "<#AlarmStopActive [ALARM_STOP]#>"} + AlarmStopActive : BOOL; + {#ix-set:AttributeName = "<#UserSafetySwitchClosed [USER_SAF]#>"} + UserSafetySwitchClosed : BOOL; + {#ix-set:AttributeName = "<#DrivesReady [PERI_RDY]#>"} + DrivesReady : BOOL; + {#ix-set:AttributeName = "<#RobotCalibrated [ROB_CAL]#>"} + RobotCalibrated : BOOL; + {#ix-set:AttributeName = "<#InterfaceActivated [I_O_ACTCONF]#>"} + InterfaceActivated : BOOL; + {#ix-set:AttributeName = "<#ErrorCollection [STOPMESS]#>"} + StopMess : BOOL; + {#ix-set:AttributeName = "<#RobotStopped [ROB_STOPPED]#>"} + RobotStopped : BOOL; + + + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#InHome [IN_HOME]#>"} + InHome : BOOL; + {#ix-set:AttributeName = "<#Manual [T1]#>"} + Manual : BOOL; + {#ix-set:AttributeName = "<#Automatic [AUT]#>"} + Automatic : BOOL; + {#ix-set:AttributeName = "<#ExternalAutomatic [EXT]#>"} + ExternalAutomatic : BOOL; + {#ix-set:AttributeName = "<#ProcesActive [PRO_ACT]#>"} + ProActive : BOOL; + {#ix-set:AttributeName = "<#ProgramMoveActive [PROGRAM MOVEMENT ACTIVE]#>"} + ProgramMoveActive : BOOL; + {#ix-set:AttributeName = "<#Event ID#>"} + EventId : UDINT; + {#ix-set:AttributeName = "<#PpMoved#>"} + PpMoved : BOOL; + {#ix-set:AttributeName = "<#StartAtMain#>"} + StartAtMain : BOOL; + {#ix-set:AttributeName = "<#Error#>"} + Error : BOOL; + + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#In area 1#>"} + InArea_1 : BOOL; + {#ix-set:AttributeName = "<#In area 2#>"} + InArea_2 : BOOL; + {#ix-set:AttributeName = "<#In area 3#>"} + InArea_3 : BOOL; + {#ix-set:AttributeName = "<#In area 4#>"} + InArea_4 : BOOL; + {#ix-set:AttributeName = "<#In position 1#>"} + InPosition_1 : BOOL; + {#ix-set:AttributeName = "<#In position 2#>"} + InPosition_2 : BOOL; + {#ix-set:AttributeName = "<#In position 3#>"} + InPosition_3 : BOOL; + {#ix-set:AttributeName = "<#In position 4#>"} + InPosition_4 : BOOL; + {#ix-set:AttributeName = "<#Zones#>"} + Zone : BYTE; + {#ix-set:AttributeName = "<#In position#>"} + InPosition : BYTE; + + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#Tool 1 retract#>"} + Tool_1_Retract : BOOL; + {#ix-set:AttributeName = "<#Tool 1 extend#>"} + Tool_1_Extend : BOOL; + {#ix-set:AttributeName = "<#Tool 2 retract#>"} + Tool_2_Retract : BOOL; + {#ix-set:AttributeName = "<#Tool 2 extend#>"} + Tool_2_Extend : BOOL; + {#ix-set:AttributeName = "<#Tool 3 retract#>"} + Tool_3_Retract : BOOL; + {#ix-set:AttributeName = "<#Tool 3 extend#>"} + Tool_3_Extend : BOOL; + {#ix-set:AttributeName = "<#Tool 4 retract#>"} + Tool_4_Retract : BOOL; + {#ix-set:AttributeName = "<#Tool 4 extend#>"} + Tool_4_Extend : BOOL; + + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {#ix-set:AttributeName = "<#Action number#>"} + ActionNo : BYTE; + {#ix-set:AttributeName = "<#Global speed#>"} + GlobalSpeed : BYTE; + {#ix-set:AttributeName = "<#Tool number#>"} + ToolNo : BYTE; + {#ix-set:AttributeName = "<#Workobject number#>"} + WorkobjectNo : BYTE; + {#ix-set:AttributeName = "<#PointNumber#>"} + PointNo : BYTE; + {#ix-set:AttributeName = "<#User specific speed 1#>"} + UserSpecSpeed1 : DINT; + {#ix-set:AttributeName = "<#User specific speed 2#>"} + UserSpecSpeed2 : DINT; + + {#ix-attr:[Container(Layout.Stack)]} + {#ix-attr:[Group(GroupLayout.GroupBox)]} + {attribute addProperty Name "<#Coordinates#>"} + Coordinates : AXOpen.Components.Abstractions.Robotics.AxoRoboticsCoordinates; + END_VAR + END_CLASS +END_NAMESPACE + \ No newline at end of file diff --git a/src/components.kuka.robotics/ctrl/src/ExampleCylinder.st b/src/components.kuka.robotics/ctrl/src/ExampleCylinder.st deleted file mode 100644 index 62135bee2..000000000 --- a/src/components.kuka.robotics/ctrl/src/ExampleCylinder.st +++ /dev/null @@ -1,135 +0,0 @@ -USING AXOpen.Core; -USING AXOpen.Messaging; -USING AXOpen.Messaging.Static; - - -NAMESPACE AXOpen.Components.Kuka.Robotics.Example - {S7.extern=ReadWrite} - CLASS ExampleCylinder EXTENDS AXOpen.Core.AxoComponent - VAR PUBLIC - {#ix-attr:[Container(Layout.Wrap)]} - {#ix-attr:[ComponentHeader()]} - MoveToWork : AxoTask; - {#ix-attr:[ComponentHeader()]} - MoveToHome : AxoTask; - - {#ix-attr:[ComponentDetails("Tasks")]} - Stop : AxoTask; - - {#ix-attr:[Container(Layout.Stack)]} - {#ix-attr:[ComponentDetails("Signals")]} - {#ix-attr:[ReadOnly()]} - {#ix-set:AttributeName = "<#Home sensor#>"} - _HomeSensor : BOOL; - {#ix-attr:[ComponentDetails("Signals")]} - {#ix-attr:[ReadOnly()]} - {#ix-set:AttributeName = "<#Work sensor#>"} - _WorkSensor : BOOL; - {#ix-attr:[Container(Layout.Stack)]} - {#ix-attr:[ComponentDetails("Signals")]} - {#ix-attr:[ReadOnly()]} - {#ix-set:AttributeName = "<#Move home signal#>"} - _MoveHomeSignal : BOOL; - {#ix-attr:[ComponentDetails("Signals")]} - {#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; - END_VAR - - /// - /// Runs tasks and logic of this component. - /// >[!IMPORTANT] This method must or one of its overloads be called cyclically. - /// - METHOD PUBLIC Run - VAR_INPUT - parent : IAxoObject; - homeSensor : REF_TO BOOL; - workSensor : REF_TO BOOL; - moveHomeSignal : REF_TO BOOL; - moveWorkSignal : REF_TO BOOL; - END_VAR - IF (parent = NULL) THEN RETURN; END_IF; - THIS.Initialize(parent); - THIS.Run(parent.GetContext(), homeSensor, workSensor, moveHomeSignal, moveWorkSignal); - END_METHOD - - /// - /// Runs tasks and logic of this component. - /// >[!IMPORTANT] This method must or one of its overloads be called cyclically. - /// - METHOD PUBLIC Run - VAR_INPUT - context : IAxoContext; - homeSensor : REF_TO BOOL; - workSensor : REF_TO BOOL; - moveHomeSignal : REF_TO BOOL; - moveWorkSignal : REF_TO BOOL; - END_VAR - - THIS.Open(); - - THIS.Initialize(context); - MoveToWork.Initialize(THIS); - MoveToHome.Initialize(THIS); - Stop.Initialize(THIS); - - _MoveToWorkNotReached.Serve(THIS); - _MoveToHomeNotReached.Serve(THIS); - - IF(Stop.Execute()) THEN - moveHomeSignal^ := FALSE; - moveWorkSignal^ := FALSE; - MoveToHome.Restore(); - MoveToWork.Restore(); - Stop.DoneWhen(TRUE); - Stop.Restore(); - END_IF; - - IF(MoveToWork.Execute()) THEN - moveHomeSignal^ := FALSE; - moveWorkSignal^ := TRUE; - MoveToWork.DoneWhen(workSensor^); - MoveToHome.Restore(); - - _MoveToWorkNotReached.ActivateOnCondition(MoveToWork.Duration >= T#10S, eAxoMessageCategory#Error); - END_IF; - - IF(MoveToHome.Execute()) THEN - moveHomeSignal^ := TRUE; - moveWorkSignal^ := FALSE; - MoveToHome.DoneWhen(homeSensor^); - MoveToWork.Restore(); - _MoveToHomeNotReached.ActivateOnCondition(MoveToHome.Duration >= T#10S, eAxoMessageCategory#Error); - END_IF; - - _HomeSensor := homeSensor^; - _WorkSensor := workSensor^; - - _MoveHomeSignal := moveHomeSignal^; - _MoveWorkSignal := moveWorkSignal^; - - THIS.Close(); - END_METHOD - - METHOD PROTECTED OVERRIDE ManualControl - THIS._isManuallyControllable := true; - END_METHOD - - /// - /// Restores this component into intial state. - /// - METHOD PUBLIC OVERRIDE Restore - MoveToWork.Restore(); - MoveToWork.Restore(); - Stop.Restore(); - END_METHOD - END_CLASS -END_NAMESPACE diff --git a/src/components.kuka.robotics/ctrl/test/CylinderTests.st b/src/components.kuka.robotics/ctrl/test/KukaRoboticsTests.st similarity index 65% rename from src/components.kuka.robotics/ctrl/test/CylinderTests.st rename to src/components.kuka.robotics/ctrl/test/KukaRoboticsTests.st index f1c84dd15..a44220a78 100644 --- a/src/components.kuka.robotics/ctrl/test/CylinderTests.st +++ b/src/components.kuka.robotics/ctrl/test/KukaRoboticsTests.st @@ -1,9 +1,8 @@ -USING AXOpen.Components.Example; USING AXOpen.Core; USING AXOpen.Rtc; USING AXOpen.Logging; -NAMESPACE Cylinder.Tests +NAMESPACE AXOpen.Components.Kuka.Robotics.Tests {S7.extern=ReadWrite} CLASS TestContext IMPLEMENTS AXOpen.Core.IAxoContext VAR @@ -53,27 +52,13 @@ NAMESPACE Cylinder.Tests END_CLASS {TestFixture} {S7.extern=ReadWrite} - CLASS CylinderTests + CLASS MyTestFixture VAR context : TestContext; - cylinder : ExampleCylinder; - _homeSensor : BOOL; - _workSensor : BOOL; - _moveHomeSignal : BOOL; - _moveWorkSignal : BOOL; - _done : BOOL; END_VAR {Test} - METHOD PUBLIC MoveHome - WHILE _done DO - context.Open(); - _done := Cylinder.MoveToHome.Invoke().IsDone(); - cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); - AxUnit.Assert.Equal(_moveHomeSignal, _moveHomeSignal); - context.Close(); - END_WHILE; - - + METHOD PUBLIC Test1 + AxUnit.Assert.Equal(TRUE, TRUE); END_METHOD END_CLASS END_NAMESPACE diff --git a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/AXOpen.Components.Kuka.Robotics.blazor.csproj b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/AXOpen.Components.Kuka.Robotics.blazor.csproj index 53cd48e51..8547e69bb 100644 --- a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/AXOpen.Components.Kuka.Robotics.blazor.csproj +++ b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics.blazor/AXOpen.Components.Kuka.Robotics.blazor.csproj @@ -42,11 +42,11 @@ - - - - - + + + + + @@ -63,6 +63,7 @@ + diff --git a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKrc4_v_5_x_x/AxoKrc4_v_5_x_x.cs b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKrc4_v_5_x_x/AxoKrc4_v_5_x_x.cs new file mode 100644 index 000000000..693d620aa --- /dev/null +++ b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKrc4_v_5_x_x/AxoKrc4_v_5_x_x.cs @@ -0,0 +1,179 @@ +using AXOpen.Messaging.Static; +using AXSharp.Connector; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AXOpen.Components.Kuka.Robotics +{ + public partial class AxoKrc4_v_5_x_x : AXOpen.Core.AxoComponent, AXOpen.Components.Abstractions.Robotics.IAxoRobotics + { + 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(50, new AxoMessengerTextItem("Restore has been executed.", "")), + + new KeyValuePair(100, new AxoMessengerTextItem("Start at main started.", "")), + new KeyValuePair(101, new AxoMessengerTextItem("Start at main finished succesfully.", "")), + new KeyValuePair(102, new AxoMessengerTextItem("Start at main restored.", "")), + + new KeyValuePair(110, new AxoMessengerTextItem("Start motors and program started.", "")), + new KeyValuePair(111, new AxoMessengerTextItem("Start motors and program finished succesfully.", "")), + new KeyValuePair(112, new AxoMessengerTextItem("Start motors and program restored.", "")), + + new KeyValuePair(120, new AxoMessengerTextItem("Start motors program and movements started.", "")), + new KeyValuePair(121, new AxoMessengerTextItem("Start motors program and movements finished succesfully.", "")), + new KeyValuePair(122, new AxoMessengerTextItem("Start motors program and movements restored.", "")), + + new KeyValuePair(140, new AxoMessengerTextItem("Start motors started.", "")), + new KeyValuePair(141, new AxoMessengerTextItem("Start motors finished succesfully.", "")), + new KeyValuePair(142, new AxoMessengerTextItem("Start motors restored.", "")), + + new KeyValuePair(150, new AxoMessengerTextItem("Start movements started.", "")), + new KeyValuePair(151, new AxoMessengerTextItem("Start movements finished succesfully.", "")), + new KeyValuePair(152, new AxoMessengerTextItem("Start movements restored.", "")), + + new KeyValuePair(170, new AxoMessengerTextItem("Start program started.", "")), + new KeyValuePair(171, new AxoMessengerTextItem("Start program finished succesfully.", "")), + new KeyValuePair(172, new AxoMessengerTextItem("Start program restored.", "")), + + new KeyValuePair(180, new AxoMessengerTextItem("Stop motors started.", "")), + new KeyValuePair(181, new AxoMessengerTextItem("Stop motors finished succesfully.", "")), + new KeyValuePair(182, new AxoMessengerTextItem("Stop motors restored.", "")), + + new KeyValuePair(190, new AxoMessengerTextItem("Stop movements and program started.", "")), + new KeyValuePair(191, new AxoMessengerTextItem("Stop movements and program finished succesfully.", "")), + new KeyValuePair(192, new AxoMessengerTextItem("Stop movements and program restored.", "")), + + new KeyValuePair(200, new AxoMessengerTextItem("Stop movements started.", "")), + new KeyValuePair(201, new AxoMessengerTextItem("Stop movements finished succesfully.", "")), + new KeyValuePair(202, new AxoMessengerTextItem("Stop movements restored.", "")), + + new KeyValuePair(210, new AxoMessengerTextItem("Stop program started.", "")), + new KeyValuePair(211, new AxoMessengerTextItem("Stop program finished succesfully.", "")), + new KeyValuePair(212, new AxoMessengerTextItem("Stop program restored.", "")), + + + new KeyValuePair(700, new AxoMessengerTextItem("Input variable `parent` has NULL reference in `Run` method!", "Check the call of the `Run` method, if the `parent` parameter is assigned.")), + new KeyValuePair(701, new AxoMessengerTextItem("Input variable `hwId_512_DI_DO` has invalid value in `Run` method!", "Check the call of the `Run` method, if the `hwId_512_DI_DO` parameter is assigned.")), + + new KeyValuePair(703, new AxoMessengerTextItem("Error reading the hwId_512_DI_DO in the UpdateInputs method!", "Check the value of the hwId_512_DI_DO and reacheability of the device!")), + + new KeyValuePair(704, new AxoMessengerTextItem("Error writing the hwId_512_DI_DO in the UpdateOutputs method!", "Check the value of the hwId_512_DI_DO and reacheability of the device!")), + + new KeyValuePair(800, new AxoMessengerTextItem("Start at main finished with error!", "Check the details.")), + new KeyValuePair(801, new AxoMessengerTextItem("Start at main was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(810, new AxoMessengerTextItem("Start motors and program finished with error!", "Check the details.")), + new KeyValuePair(811, new AxoMessengerTextItem("Start motors and program was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(820, new AxoMessengerTextItem("Start motors program and movements finished with error!", "Check the details.")), + new KeyValuePair(821, new AxoMessengerTextItem("Start motors program and movements was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(840, new AxoMessengerTextItem("Start motors finished with error!", "Check the details.")), + new KeyValuePair(841, new AxoMessengerTextItem("Start motors was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(850, new AxoMessengerTextItem("Start movements finished with error!", "Check the details.")), + new KeyValuePair(851, new AxoMessengerTextItem("Start movements was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(870, new AxoMessengerTextItem("Start program finished with error!", "Check the details.")), + new KeyValuePair(871, new AxoMessengerTextItem("Start program was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(880, new AxoMessengerTextItem("Stop motors finished with error!", "Check the details.")), + new KeyValuePair(881, new AxoMessengerTextItem("Stop motors was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(890, new AxoMessengerTextItem("Stop movements and program finished with error!", "Check the details.")), + new KeyValuePair(891, new AxoMessengerTextItem("Stop movements and program was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(900, new AxoMessengerTextItem("Stop movements finished with error!", "Check the details.")), + new KeyValuePair(901, new AxoMessengerTextItem("Stop movements was aborted, while not yet completed!", "Check the details.")), + new KeyValuePair(910, new AxoMessengerTextItem("Stop program finished with error!", "Check the details.")), + new KeyValuePair(911, new AxoMessengerTextItem("Stop program was aborted, while not yet completed!", "Check the details.")), + + + }; + + Messenger.DotNetMessengerTextList = messengerTextList; + } + + private void InitializeTaskMessenger() + { + List> messengerTextList = new List> + { + new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), + new KeyValuePair(600, new AxoMessengerTextItem("Waiting for the signal Inputs.PpMoved to be set!", "Check the status of the `Inputs.PpMoved` signal.")), + + + new KeyValuePair(610, new AxoMessengerTextItem("Waiting for the signal Inputs.AutoOn to be set!", "Check the status of the `Inputs.PpMoved` signal.")), + new KeyValuePair(611, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), + new KeyValuePair(612, new AxoMessengerTextItem("Waiting for the signal Inputs.EmgStop to be reseted!", "Check the status of the `Error` signal.")), + new KeyValuePair(613, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOnState to be set!", "Check the status of the `Inputs.MotorOnState` signal.")), + new KeyValuePair(614, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be set!", "Check the status of the `Inputs.CycleOn` signal.")), + new KeyValuePair(615, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), + + new KeyValuePair(620, new AxoMessengerTextItem("Waiting for the signal Inputs.AutoOn to be set!", "Check the status of the `Inputs.PpMoved` signal.")), + new KeyValuePair(621, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), + new KeyValuePair(622, new AxoMessengerTextItem("Waiting for the signal Inputs.EmgStop to be reseted!", "Check the status of the `Error` signal.")), + new KeyValuePair(623, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOnState to be set!", "Check the status of the `Inputs.MotorOnState` signal.")), + new KeyValuePair(624, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be set!", "Check the status of the `Inputs.CycleOn` signal.")), + new KeyValuePair(625, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), + new KeyValuePair(626, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + new KeyValuePair(627, new AxoMessengerTextItem("Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `.", "Check the value of the Inputs.GlobalSpeedsignal")), + new KeyValuePair(628, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `.", "Check the value of the Inputs.ToolNosignal")), + new KeyValuePair(629, new AxoMessengerTextItem("Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `.", "Check the value of the Inputs.WorkobjectNosignal")), + new KeyValuePair(630, new AxoMessengerTextItem("Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `.", "Check the value of the Inputs.PointNosignal")), + new KeyValuePair(631, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `.", "Check the value of the Inputs.UserSpecSpeed1signal")), + new KeyValuePair(632, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `.", "Check the value of the Inputs.UserSpecSpeed2signal")), + new KeyValuePair(633, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNosignal")), + new KeyValuePair(634, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + new KeyValuePair(635, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + + new KeyValuePair(640, new AxoMessengerTextItem("Waiting for the signal Inputs.AutoOn to be set!", "Check the status of the `Inputs.PpMoved` signal.")), + new KeyValuePair(641, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), + new KeyValuePair(642, new AxoMessengerTextItem("Waiting for the signal Inputs.EmgStop to be reseted!", "Check the status of the `Error` signal.")), + new KeyValuePair(643, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOnState to be set!", "Check the status of the `Inputs.MotorOnState` signal.")), + new KeyValuePair(644, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), + + new KeyValuePair(650, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be set!", "Check the status of the `Inputs.CycleOn` signal.")), + new KeyValuePair(651, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOnState to be set!", "Check the status of the `Inputs.MotorOnState` signal.")), + new KeyValuePair(652, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), + new KeyValuePair(653, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + new KeyValuePair(654, new AxoMessengerTextItem("Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `.", "Check the value of the Inputs.GlobalSpeedsignal")), + new KeyValuePair(655, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `.", "Check the value of the Inputs.ToolNosignal")), + new KeyValuePair(656, new AxoMessengerTextItem("Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `.", "Check the value of the Inputs.WorkobjectNosignal")), + new KeyValuePair(657, new AxoMessengerTextItem("Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `.", "Check the value of the Inputs.PointNosignal")), + new KeyValuePair(658, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `.", "Check the value of the Inputs.UserSpecSpeed1signal")), + new KeyValuePair(659, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `.", "Check the value of the Inputs.UserSpecSpeed2signal")), + new KeyValuePair(660, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNosignal")), + new KeyValuePair(661, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + new KeyValuePair(662, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + + new KeyValuePair(670, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be set!", "Check the status of the `Inputs.CycleOn` signal.")), + new KeyValuePair(671, new AxoMessengerTextItem("Waiting for the signal Inputs.SystemInputBusy to be reseted!", "Check the status of the `SystemInputBusy` signal.")), + + new KeyValuePair(680, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOffState to be set!", "Check the status of the `Inputs.MotorOffState` signal.")), + new KeyValuePair(681, new AxoMessengerTextItem("Waiting for the signal Inputs.SystemInputBusy to be reseted!", "Check the status of the `SystemInputBusy` signal.")), + + new KeyValuePair(690, new AxoMessengerTextItem("Waiting for the signal Inputs.MoveInactive to be set!", "Check the status of the `Inputs.MoveInactive` signal.")), + new KeyValuePair(691, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be reseted!", "Check the status of the `CycleOn` signal.")), + + new KeyValuePair(692, new AxoMessengerTextItem("Waiting for the signal Inputs.MoveInactive to be set!", "Check the status of the `Inputs.MoveInactive` signal.")), + + new KeyValuePair(693, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be reseted!", "Check the status of the `CycleOn` signal.")), + + }; + + TaskMessenger.DotNetMessengerTextList = messengerTextList; + } + } +} diff --git a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKukaRobotics_Component_Status_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.cs b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKukaRobotics_Component_Status_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.cs new file mode 100644 index 000000000..4eaf5fc24 --- /dev/null +++ b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKukaRobotics_Component_Status_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.cs @@ -0,0 +1,314 @@ +using AXOpen.Messaging.Static; +using AXSharp.Connector; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static System.Runtime.InteropServices.JavaScript.JSType; + +namespace AXOpen.Components.Kuka.Robotics +{ + public partial class AxoKukaRobotics_Component_Status_v_5_x_x : AXOpen.Components.Robotics.AxoRobot_Status + { + Dictionary errorDescriptionDict = new Dictionary(); + Dictionary actionDescriptionDict = new Dictionary(); + + public string ErrorDescription + { + get + { + if (errorDescriptionDict == null) { errorDescriptionDict = new Dictionary(); } + if (errorDescriptionDict.Count == 0) + { + errorDescriptionDict.Add(0, " "); + errorDescriptionDict.Add(600, "Waiting for the signal Inputs.PpMoved to be set!"); + errorDescriptionDict.Add(610, "Waiting for the signal Inputs.AutoOn to be set!"); + errorDescriptionDict.Add(611, "Waiting for the signal Inputs.Error to be reseted!"); + errorDescriptionDict.Add(612, "Waiting for the signal Inputs.EmgStop to be reseted!"); + errorDescriptionDict.Add(613, "Waiting for the signal Inputs.MotorOnState to be set!"); + errorDescriptionDict.Add(614, "Waiting for the signal Inputs.CycleOn to be set!"); + errorDescriptionDict.Add(615, "Waiting for the signal Inputs.Error to be reseted!"); + errorDescriptionDict.Add(620, "Waiting for the signal Inputs.AutoOn to be set!"); + errorDescriptionDict.Add(621, "Waiting for the signal Inputs.Error to be reseted!"); + errorDescriptionDict.Add(622, "Waiting for the signal Inputs.EmgStop to be reseted!"); + errorDescriptionDict.Add(623, "Waiting for the signal Inputs.MotorOnState to be set!"); + errorDescriptionDict.Add(624, "Waiting for the signal Inputs.CycleOn to be set!"); + errorDescriptionDict.Add(625, "Waiting for the signal Inputs.Error to be reseted!"); + errorDescriptionDict.Add(626, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(627, "Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `."); + errorDescriptionDict.Add(628, "Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `."); + errorDescriptionDict.Add(629, "Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `."); + errorDescriptionDict.Add(630, "Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `."); + errorDescriptionDict.Add(631, "Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `."); + errorDescriptionDict.Add(632, "Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `."); + errorDescriptionDict.Add(633, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(634, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(635, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(640, "Waiting for the signal Inputs.AutoOn to be set!"); + errorDescriptionDict.Add(641, "Waiting for the signal Inputs.Error to be reseted!"); + errorDescriptionDict.Add(642, "Waiting for the signal Inputs.EmgStop to be reseted!"); + errorDescriptionDict.Add(643, "Waiting for the signal Inputs.MotorOnState to be set!"); + errorDescriptionDict.Add(644, "Waiting for the signal Inputs.Error to be reseted!"); + errorDescriptionDict.Add(650, "Waiting for the signal Inputs.CycleOn to be set!"); + errorDescriptionDict.Add(651, "Waiting for the signal Inputs.MotorOnState to be set!"); + errorDescriptionDict.Add(652, "Waiting for the signal Inputs.Error to be reseted!"); + errorDescriptionDict.Add(653, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(654, "Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `."); + errorDescriptionDict.Add(655, "Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `."); + errorDescriptionDict.Add(656, "Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `."); + errorDescriptionDict.Add(657, "Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `."); + errorDescriptionDict.Add(658, "Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `."); + errorDescriptionDict.Add(659, "Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `."); + errorDescriptionDict.Add(660, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(661, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(662, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(670, "Waiting for the signal Inputs.CycleOn to be set!"); + errorDescriptionDict.Add(671, "Waiting for the signal Inputs.SystemInputBusy to be reseted!"); + errorDescriptionDict.Add(680, "Waiting for the signal Inputs.MotorOffState to be set!"); + errorDescriptionDict.Add(681, "Waiting for the signal Inputs.SystemInputBusy to be reseted!"); + errorDescriptionDict.Add(690, "Waiting for the signal Inputs.MoveInactive to be set!"); + errorDescriptionDict.Add(691, "Waiting for the signal Inputs.CycleOn to be reseted!"); + errorDescriptionDict.Add(692, "Waiting for the signal Inputs.MoveInactive to be set!"); + errorDescriptionDict.Add(693, "Waiting for the signal Inputs.CycleOn to be reseted!"); + + errorDescriptionDict.Add(700, "Error: Parent has NULL reference!"); + errorDescriptionDict.Add(701, "Input variable `hwId_512_DI_DO` has invalid value in `Run` method!"); + + errorDescriptionDict.Add(703, "Error reading the hwId_512_DI_DO in the UpdateInputs method!"); + errorDescriptionDict.Add(704, "Error writing the hwId_512_DI_DO in the UpdateOutputs method!"); + errorDescriptionDict.Add(705, "Emergency stop active!"); + errorDescriptionDict.Add(706, "Safety Error !"); + errorDescriptionDict.Add(707, "Program execution error!"); + + } + string errorDescription = " "; + + if (Error == null || Error.Id == null) + return errorDescription; + + if (errorDescriptionDict.TryGetValue(Error.Id.Cyclic, out errorDescription)) + { + return errorDescription; + } + else + + { + return " "; + } + } + } + + public string ActionDescription + { + get + { + if (actionDescriptionDict == null) { actionDescriptionDict = new Dictionary(); } + if (actionDescriptionDict.Count == 0) + { + actionDescriptionDict.Add(0, " "); + actionDescriptionDict.Add(50, "Restore has been executed."); + + actionDescriptionDict.Add(100, "Start at main started."); + actionDescriptionDict.Add(300, "Start at main running."); + actionDescriptionDict.Add(301, "Start at main running."); + actionDescriptionDict.Add(302, "Start at main running."); + actionDescriptionDict.Add(303, "Start at main running."); + actionDescriptionDict.Add(304, "Start at main running."); + actionDescriptionDict.Add(305, "Start at main running."); + actionDescriptionDict.Add(306, "Start at main running."); + actionDescriptionDict.Add(307, "Start at main running."); + actionDescriptionDict.Add(308, "Start at main running."); + actionDescriptionDict.Add(309, "Start at main running."); + actionDescriptionDict.Add(101, "Start at main finished succesfully."); + actionDescriptionDict.Add(102, "Start at main restored."); + + actionDescriptionDict.Add(110, "Start motors and program started."); + actionDescriptionDict.Add(310, "Start motors and program running."); + actionDescriptionDict.Add(311, "Start motors and program running."); + actionDescriptionDict.Add(312, "Start motors and program running."); + actionDescriptionDict.Add(313, "Start motors and program running."); + actionDescriptionDict.Add(314, "Start motors and program running."); + actionDescriptionDict.Add(315, "Start motors and program running."); + actionDescriptionDict.Add(316, "Start motors and program running."); + actionDescriptionDict.Add(317, "Start motors and program running."); + actionDescriptionDict.Add(318, "Start motors and program running."); + actionDescriptionDict.Add(319, "Start motors and program running."); + actionDescriptionDict.Add(111, "Start motors and program finished succesfully."); + actionDescriptionDict.Add(112, "Start motors and program restored."); + + actionDescriptionDict.Add(120, "Start motors program and movements started."); + actionDescriptionDict.Add(320, "Start motors program and movements running."); + actionDescriptionDict.Add(321, "Start motors program and movements running."); + actionDescriptionDict.Add(322, "Start motors program and movements running."); + actionDescriptionDict.Add(323, "Start motors program and movements running."); + actionDescriptionDict.Add(324, "Start motors program and movements running."); + actionDescriptionDict.Add(325, "Start motors program and movements running."); + actionDescriptionDict.Add(326, "Start motors program and movements running."); + actionDescriptionDict.Add(327, "Start motors program and movements running."); + actionDescriptionDict.Add(328, "Start motors program and movements running."); + actionDescriptionDict.Add(329, "Start motors program and movements running."); + actionDescriptionDict.Add(330, "Start motors program and movements running."); + actionDescriptionDict.Add(331, "Start motors program and movements running."); + actionDescriptionDict.Add(332, "Start motors program and movements running."); + actionDescriptionDict.Add(333, "Start motors program and movements running."); + actionDescriptionDict.Add(334, "Start motors program and movements running."); + actionDescriptionDict.Add(335, "Start motors program and movements running."); + actionDescriptionDict.Add(336, "Start motors program and movements running."); + actionDescriptionDict.Add(337, "Start motors program and movements running."); + actionDescriptionDict.Add(338, "Start motors program and movements running."); + actionDescriptionDict.Add(339, "Start motors program and movements running."); + actionDescriptionDict.Add(121, "Start motors program and movements finished succesfully."); + actionDescriptionDict.Add(122, "Start motors program and movements restored."); + + actionDescriptionDict.Add(140, "Start motors started."); + actionDescriptionDict.Add(340, "Start motors running."); + actionDescriptionDict.Add(341, "Start motors running."); + actionDescriptionDict.Add(342, "Start motors running."); + actionDescriptionDict.Add(343, "Start motors running."); + actionDescriptionDict.Add(344, "Start motors running."); + actionDescriptionDict.Add(345, "Start motors running."); + actionDescriptionDict.Add(346, "Start motors running."); + actionDescriptionDict.Add(347, "Start motors running."); + actionDescriptionDict.Add(348, "Start motors running."); + actionDescriptionDict.Add(349, "Start motors running."); + actionDescriptionDict.Add(141, "Start motors finished succesfully."); + actionDescriptionDict.Add(142, "Start motors restored."); + + actionDescriptionDict.Add(150, "Start movements started."); + actionDescriptionDict.Add(350, "Start movements running."); + actionDescriptionDict.Add(351, "Start movements running."); + actionDescriptionDict.Add(352, "Start movements running."); + actionDescriptionDict.Add(353, "Start movements running."); + actionDescriptionDict.Add(354, "Start movements running."); + actionDescriptionDict.Add(355, "Start movements running."); + actionDescriptionDict.Add(356, "Start movements running."); + actionDescriptionDict.Add(357, "Start movements running."); + actionDescriptionDict.Add(358, "Start movements running."); + actionDescriptionDict.Add(359, "Start movements running."); + actionDescriptionDict.Add(360, "Start movements running."); + actionDescriptionDict.Add(361, "Start movements running."); + actionDescriptionDict.Add(362, "Start movements running."); + actionDescriptionDict.Add(363, "Start movements running."); + actionDescriptionDict.Add(364, "Start movements running."); + actionDescriptionDict.Add(365, "Start movements running."); + actionDescriptionDict.Add(366, "Start movements running."); + actionDescriptionDict.Add(367, "Start movements running."); + actionDescriptionDict.Add(368, "Start movements running."); + actionDescriptionDict.Add(369, "Start movements running."); + actionDescriptionDict.Add(151, "Start movements finished succesfully."); + actionDescriptionDict.Add(152, "Start movements restored."); + + actionDescriptionDict.Add(170, "Start program started."); + actionDescriptionDict.Add(370, "Start program running."); + actionDescriptionDict.Add(371, "Start program running."); + actionDescriptionDict.Add(372, "Start program running."); + actionDescriptionDict.Add(373, "Start program running."); + actionDescriptionDict.Add(374, "Start program running."); + actionDescriptionDict.Add(375, "Start program running."); + actionDescriptionDict.Add(376, "Start program running."); + actionDescriptionDict.Add(377, "Start program running."); + actionDescriptionDict.Add(378, "Start program running."); + actionDescriptionDict.Add(379, "Start program running."); + actionDescriptionDict.Add(171, "Start program finished succesfully."); + actionDescriptionDict.Add(172, "Start program restored."); + + actionDescriptionDict.Add(180, "Stop motors started."); + actionDescriptionDict.Add(380, "Stop motors running."); + actionDescriptionDict.Add(381, "Stop motors running."); + actionDescriptionDict.Add(382, "Stop motors running."); + actionDescriptionDict.Add(383, "Stop motors running."); + actionDescriptionDict.Add(384, "Stop motors running."); + actionDescriptionDict.Add(385, "Stop motors running."); + actionDescriptionDict.Add(386, "Stop motors running."); + actionDescriptionDict.Add(387, "Stop motors running."); + actionDescriptionDict.Add(388, "Stop motors running."); + actionDescriptionDict.Add(389, "Stop motors running."); + actionDescriptionDict.Add(181, "Stop motors finished succesfully."); + actionDescriptionDict.Add(182, "Stop motors restored."); + + actionDescriptionDict.Add(190, "Stop movements and program started."); + actionDescriptionDict.Add(390, "Stop movements and program running."); + actionDescriptionDict.Add(391, "Stop movements and program running."); + actionDescriptionDict.Add(392, "Stop movements and program running."); + actionDescriptionDict.Add(393, "Stop movements and program running."); + actionDescriptionDict.Add(394, "Stop movements and program running."); + actionDescriptionDict.Add(395, "Stop movements and program running."); + actionDescriptionDict.Add(396, "Stop movements and program running."); + actionDescriptionDict.Add(397, "Stop movements and program running."); + actionDescriptionDict.Add(398, "Stop movements and program running."); + actionDescriptionDict.Add(399, "Stop movements and program running."); + actionDescriptionDict.Add(191, "Stop movements and program finished succesfully."); + actionDescriptionDict.Add(192, "Stop movements and program restored."); + + actionDescriptionDict.Add(200, "Stop movements started."); + actionDescriptionDict.Add(400, "Stop movements running."); + actionDescriptionDict.Add(401, "Stop movements running."); + actionDescriptionDict.Add(402, "Stop movements running."); + actionDescriptionDict.Add(403, "Stop movements running."); + actionDescriptionDict.Add(404, "Stop movements running."); + actionDescriptionDict.Add(405, "Stop movements running."); + actionDescriptionDict.Add(406, "Stop movements running."); + actionDescriptionDict.Add(407, "Stop movements running."); + actionDescriptionDict.Add(408, "Stop movements running."); + actionDescriptionDict.Add(409, "Stop movements running."); + actionDescriptionDict.Add(201, "Stop movements finished succesfully."); + actionDescriptionDict.Add(202, "Stop movements restored."); + + actionDescriptionDict.Add(210, "Stop program started."); + actionDescriptionDict.Add(410, "Stop program running."); + actionDescriptionDict.Add(411, "Stop program running."); + actionDescriptionDict.Add(412, "Stop program running."); + actionDescriptionDict.Add(413, "Stop program running."); + actionDescriptionDict.Add(414, "Stop program running."); + actionDescriptionDict.Add(415, "Stop program running."); + actionDescriptionDict.Add(416, "Stop program running."); + actionDescriptionDict.Add(417, "Stop program running."); + actionDescriptionDict.Add(418, "Stop program running."); + actionDescriptionDict.Add(419, "Stop program running."); + actionDescriptionDict.Add(211, "Stop program finished succesfully"); + actionDescriptionDict.Add(212, "Stop program restored."); + + actionDescriptionDict.Add(800, "Start at main finished with error!"); + actionDescriptionDict.Add(801, "Start at main was aborted, while not yet completed!"); + actionDescriptionDict.Add(810, "Start motors and program finished with error!"); + actionDescriptionDict.Add(811, "Start motors and program was aborted, while not yet completed!"); + actionDescriptionDict.Add(820, "Start motors program and movements finished with error!"); + actionDescriptionDict.Add(821, "Start motors program and movements was aborted, while not yet completed!"); + actionDescriptionDict.Add(840, "Start motors finished with error!"); + actionDescriptionDict.Add(841, "Start motors was aborted, while not yet completed!"); + actionDescriptionDict.Add(850, "Start movements finished with error!"); + actionDescriptionDict.Add(851, "Start movements was aborted, while not yet completed!"); + actionDescriptionDict.Add(870, "Start program finished with error!"); + actionDescriptionDict.Add(871, "Start program was aborted, while not yet completed!"); + actionDescriptionDict.Add(880, "Stop motors finished with error!"); + actionDescriptionDict.Add(881, "Stop motors was aborted, while not yet completed!"); + actionDescriptionDict.Add(890, "Stop movements and program finished with error!"); + actionDescriptionDict.Add(891, "Stop movements and program was aborted, while not yet completed!"); + actionDescriptionDict.Add(900, "Stop movements finished with error!"); + actionDescriptionDict.Add(901, "Stop movements was aborted, while not yet completed!"); + actionDescriptionDict.Add(910, "Stop program finished with error!"); + actionDescriptionDict.Add(911, "Stop program was aborted, while not yet completed!"); + + + } + + string actionDescription = " "; + + if (Action == null || Action.Id == null) + return actionDescription; + + if (actionDescriptionDict.TryGetValue(Action.Id.Cyclic, out actionDescription)) + { + return actionDescription; + } + else + { + return " "; + } + + } + } + } +} + diff --git a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ExampleCylinder/ExampleCylinder.cs b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ExampleCylinder/ExampleCylinder.cs deleted file mode 100644 index c85b9c3f9..000000000 --- a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ExampleCylinder/ExampleCylinder.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AXOpen.Components.Kuka.Robotics.Example -{ - public partial class ExampleCylinder - { - public async Task WriteTaskDurationToConsole() - { - foreach (var task in this.GetChildren().OfType()) - { - Console.WriteLine($"{task.Symbol} : {await task.Duration.GetAsync()}"); - } - } - } -} diff --git a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ix_ax_axopen_components_kuka_robotics.csproj b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ix_ax_axopen_components_kuka_robotics.csproj index 4d9396a24..599ae8589 100644 --- a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ix_ax_axopen_components_kuka_robotics.csproj +++ b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/ix_ax_axopen_components_kuka_robotics.csproj @@ -83,5 +83,7 @@ + + \ No newline at end of file diff --git a/src/components.kuka.robotics/this.sln b/src/components.kuka.robotics/this.sln index ccac985c6..78de6f59a 100644 --- a/src/components.kuka.robotics/this.sln +++ b/src/components.kuka.robotics/this.sln @@ -21,12 +21,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_components_kuk EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Components.Kuka.Robotics_tests", "tests\AXOpen.Components.Kuka.Robotics.Tests\AXOpen.Components.Kuka.Robotics_tests.csproj", "{98EECD16-C803-42BF-95D1-B06FF8BDEFF8}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_components_robotics", "..\components.robotics\src\AXOpen.Components.Robotics\ix_ax_axopen_components_robotics.csproj", "{84F2A77D-8619-4D50-BA3C-7C782728BE54}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "axopen_core_blazor", "..\core\src\AXOpen.Core.Blazor\axopen_core_blazor.csproj", "{5DA2490E-53C2-4A68-81D7-822C14308D95}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_core", "..\core\src\AXOpen.Core\ix_ax_axopen_core.csproj", "{C28E5652-B41F-4345-9CE8-2F2599032EC7}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Data.Json", "..\data\src\repositories\Json\AXOpen.Data.Json.csproj", "{3301FE13-9249-44E8-9558-C265BF30E696}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_axopen_io", "..\io\src\AXOpen.Io\ix_ax_axopen_io.csproj", "{AE810333-1858-4215-92C8-0FE1738660EF}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ix_ax_ax_sdk", "..\sdk-ax\ctrl\ix\ix_ax_ax_sdk.csproj", "{7089D26C-763D-4510-915F-3D3619699F88}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AXOpen.Security.Blazor", "..\Security\src\AXOpen.Security.Blazor\AXOpen.Security.Blazor.csproj", "{C95B396D-9A82-4132-904D-033322781664}" @@ -79,6 +83,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{79B47AE2 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.kuka.robotics", "..\components.kuka.robotics", "{CC86294D-AE90-4A38-8D8A-10E38F1D584F}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Components.Robotics", "..\components.robotics\src\AXOpen.Components.Robotics", "{5E27889B-144C-466D-B7BA-EF065F72B043}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\components.robotics\src", "{0D7AB827-D4A9-4C48-AAD0-CB8837B40336}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "components.robotics", "..\components.robotics", "{EC838179-D8A4-438F-9D8A-54DAA04CAE17}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Core.Blazor", "..\core\src\AXOpen.Core.Blazor", "{62AC1583-8F5D-4626-8EB1-CEFD8FC60358}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Core", "..\core\src\AXOpen.Core", "{0A49EFB0-2CEF-4304-BF3C-C58A21606A83}" @@ -95,6 +105,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\data\src", "{CB32 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data", "..\data", "{AC11F8C3-570B-4609-AB90-F8DB480FCDD2}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AXOpen.Io", "..\io\src\AXOpen.Io", "{0AD9AE7E-2FFB-4150-A12D-8AC1B342F491}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "..\io\src", "{B6C978BC-BF0A-4DB5-9F0C-207B005C9309}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "io", "..\io", "{71CD362E-B7B6-4401-A4B4-A98EFA8640A8}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ix", "..\sdk-ax\ctrl\ix", "{4AAF9B8B-921C-4CB8-99FE-A1954E1F7A6A}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ctrl", "..\sdk-ax\ctrl", "{1499A70E-BC88-4723-91BD-6781CE35BA2A}" @@ -177,6 +193,10 @@ Global {98EECD16-C803-42BF-95D1-B06FF8BDEFF8}.Debug|Any CPU.Build.0 = Debug|Any CPU {98EECD16-C803-42BF-95D1-B06FF8BDEFF8}.Release|Any CPU.ActiveCfg = Release|Any CPU {98EECD16-C803-42BF-95D1-B06FF8BDEFF8}.Release|Any CPU.Build.0 = Release|Any CPU + {84F2A77D-8619-4D50-BA3C-7C782728BE54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84F2A77D-8619-4D50-BA3C-7C782728BE54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84F2A77D-8619-4D50-BA3C-7C782728BE54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84F2A77D-8619-4D50-BA3C-7C782728BE54}.Release|Any CPU.Build.0 = Release|Any CPU {5DA2490E-53C2-4A68-81D7-822C14308D95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5DA2490E-53C2-4A68-81D7-822C14308D95}.Debug|Any CPU.Build.0 = Debug|Any CPU {5DA2490E-53C2-4A68-81D7-822C14308D95}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -189,6 +209,10 @@ Global {3301FE13-9249-44E8-9558-C265BF30E696}.Debug|Any CPU.Build.0 = Debug|Any CPU {3301FE13-9249-44E8-9558-C265BF30E696}.Release|Any CPU.ActiveCfg = Release|Any CPU {3301FE13-9249-44E8-9558-C265BF30E696}.Release|Any CPU.Build.0 = Release|Any CPU + {AE810333-1858-4215-92C8-0FE1738660EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE810333-1858-4215-92C8-0FE1738660EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE810333-1858-4215-92C8-0FE1738660EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE810333-1858-4215-92C8-0FE1738660EF}.Release|Any CPU.Build.0 = Release|Any CPU {7089D26C-763D-4510-915F-3D3619699F88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7089D26C-763D-4510-915F-3D3619699F88}.Debug|Any CPU.Build.0 = Debug|Any CPU {7089D26C-763D-4510-915F-3D3619699F88}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -244,6 +268,9 @@ Global {98EECD16-C803-42BF-95D1-B06FF8BDEFF8} = {624234C6-D014-4982-A50E-662D161BB55A} {624234C6-D014-4982-A50E-662D161BB55A} = {79B47AE2-EB23-41A0-ACD4-22844B91DA4D} {79B47AE2-EB23-41A0-ACD4-22844B91DA4D} = {CC86294D-AE90-4A38-8D8A-10E38F1D584F} + {84F2A77D-8619-4D50-BA3C-7C782728BE54} = {5E27889B-144C-466D-B7BA-EF065F72B043} + {5E27889B-144C-466D-B7BA-EF065F72B043} = {0D7AB827-D4A9-4C48-AAD0-CB8837B40336} + {0D7AB827-D4A9-4C48-AAD0-CB8837B40336} = {EC838179-D8A4-438F-9D8A-54DAA04CAE17} {5DA2490E-53C2-4A68-81D7-822C14308D95} = {62AC1583-8F5D-4626-8EB1-CEFD8FC60358} {62AC1583-8F5D-4626-8EB1-CEFD8FC60358} = {389340D0-971D-4CCD-B965-58C0AC79CFB3} {C28E5652-B41F-4345-9CE8-2F2599032EC7} = {0A49EFB0-2CEF-4304-BF3C-C58A21606A83} @@ -253,6 +280,9 @@ Global {5563E1DD-45F8-4685-B983-BA9F7BF7564E} = {B3F199D4-EBAF-43E4-9731-7B1727D2B81F} {B3F199D4-EBAF-43E4-9731-7B1727D2B81F} = {CB32B68C-E347-42EF-B60B-7D5FE67F9FF7} {CB32B68C-E347-42EF-B60B-7D5FE67F9FF7} = {AC11F8C3-570B-4609-AB90-F8DB480FCDD2} + {AE810333-1858-4215-92C8-0FE1738660EF} = {0AD9AE7E-2FFB-4150-A12D-8AC1B342F491} + {0AD9AE7E-2FFB-4150-A12D-8AC1B342F491} = {B6C978BC-BF0A-4DB5-9F0C-207B005C9309} + {B6C978BC-BF0A-4DB5-9F0C-207B005C9309} = {71CD362E-B7B6-4401-A4B4-A98EFA8640A8} {7089D26C-763D-4510-915F-3D3619699F88} = {4AAF9B8B-921C-4CB8-99FE-A1954E1F7A6A} {4AAF9B8B-921C-4CB8-99FE-A1954E1F7A6A} = {1499A70E-BC88-4723-91BD-6781CE35BA2A} {1499A70E-BC88-4723-91BD-6781CE35BA2A} = {9F08EA87-929C-4796-84FE-4318F30EE3B9} diff --git a/src/components.siemens.identification/ctrl/apax.yml b/src/components.siemens.identification/ctrl/apax.yml index d88e658ef..3b8c2da53 100644 --- a/src/components.siemens.identification/ctrl/apax.yml +++ b/src/components.siemens.identification/ctrl/apax.yml @@ -1,5 +1,5 @@ name: "@ix-ax/axopen.components.siemens.identification" -version : '0.0.0-dev.0' +version: '0.0.0-dev.0' type: lib targets: - llvm @@ -7,15 +7,17 @@ files: - src - axsharp.companion.json devDependencies: - "@ix-ax/ax-sdk" : '0.0.0-dev.0' + "@ix-ax/ax-sdk": '0.0.0-dev.0' scripts: postbuild: - dotnet ixc dependencies: - "@ix-ax/axopen.components.abstractions" : '0.0.0-dev.0' - "@ix-ax/axopen.core" : '0.0.0-dev.0' - "@ix-ax/axopen.timers" : '0.0.0-dev.0' - "@ix-ax/axopen.abstractions" : '0.0.0-dev.0' + "@ix-ax/axopen.components.abstractions": '0.0.0-dev.0' + "@ix-ax/axopen.core": '0.0.0-dev.0' + "@ix-ax/axopen.timers": '0.0.0-dev.0' + "@ix-ax/axopen.abstractions": '0.0.0-dev.0' + "@ax/simatic-1500-distributedio": ^6.0.3 + "@ax/system-timer": ^6.0.94 publicKeys: "@ix-ax": 30c06ef7830b4dfd8f16e003508da1ac2d187714d0e1f38279a9332cbe4e4e17 installStrategy: strict diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_CMD_STRUCT.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_CMD_STRUCT.st new file mode 100644 index 000000000..6d25ad561 --- /dev/null +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_CMD_STRUCT.st @@ -0,0 +1,20 @@ +NAMESPACE AXOpen.Components.Siemens.Identification + +// TYPE ST_IID_CMD_STRUCT : +// STRUCT + CLASS Axo_IID_CMD_STRUCT + VAR PUBLIC + CMD : eAxo_IID_COMMANDS; //Command ID + ATTRIBUTES : BYTE := BYTE#16#0; //Subcommands + OFFSETBUFFER : UINT := UINT#0; //Offset for receive buffer + EPCID_UID : ARRAY[1..62] OF BYTE; + LEN_DATA : WORD :=WORD#16#0; //Length of data + ADDR_TAG : DWORD :=DWORD#16#0; //physical address on tag + CONFIG : BYTE :=BYTE#16#0; //Config Mode for Init + CHAINED : BOOL :=FALSE; //Chained Bit: 1= chained; 0=unchained + EXT_UHF : Axo_IID_IN_EXT_UHF; //further Atrributes for extended UHF commands +// END_STRUCT +// END_TYPE + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_HW_CONNECT.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_HW_CONNECT.st new file mode 100644 index 000000000..0ce5704ca --- /dev/null +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_HW_CONNECT.st @@ -0,0 +1,39 @@ +NAMESPACE AXOpen.Components.Siemens.Identification + +(* ++-----------+-------------------------------------------+------------------------------------------------------+---------------------+ +| | RF61xR/RF68xR | RF1xxC/RF360R | RF180C/RF170C/MV | +| Parameter +----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| | CH01 | CH02 | CH03 | CH04 | CH01 | CH02 | CH03 | CH04 |CM_CONFIG | CH01 | CH02 | ++===========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+ +| API | 16#5B00 | 16#5B00 | 16#5B00 | 16#5B00 | 16#5B00 | 16#5B00 | 16#5B00 | 16#5B00 | 16#5B00 | 16#00 | 16#00 | ++-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| SLOT | 1 | 1 | 1 | 1 | 2 | 3 | 4 | 5 | 1 | 1 | 1 | ++-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +| SUB_SLOT | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ++-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +|CM_CHANNEL | 1 | 2 | 3 | 4 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | ++-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ +*) + +// TYPE ST_IID_HW_CONNECT : +// STRUCT + CLASS Axo_IID_HW_CONNECT + VAR PUBLIC + // AMS_NET_ID : T_AmsNetID; //ams net id of profinet controller + // PORT : T_AmsPort; //port of profinet device + AMS_NET_ID : STRING; //ams net id of profinet controller + PORT : STRING; //port of profinet device + AR_NUMBER : WORD := WORD#16#0; //Number of AR + API : DWORD := DWORD#16#0000_5B00; //API number + SLOT : WORD := WORD#16#02; //Slot number + SUB_SLOT : WORD := WORD#16#01; //Subslot number + CM_CHANNEL : UINT := UINT#1; //channel of communication module + STATUS_WORD : WORD; //status word cyclic data -> link to input word of device + CONTROL_WORD : WORD; //control word cyclic data -> link to output word of device + Static : Axo_IID_IN_SYNC; +// END_STRUCT +// END_TYPE + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_EXT_UHF.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_EXT_UHF.st new file mode 100644 index 000000000..9e465ca54 --- /dev/null +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_EXT_UHF.st @@ -0,0 +1,19 @@ +NAMESPACE AXOpen.Components.Siemens.Identification + +// TYPE ST_IID_IN_EXT_UHF : +// STRUCT + CLASS Axo_IID_IN_EXT_UHF + VAR PUBLIC + LEN_ID : BYTE := BYTE#16#0; //Length of EPC-ID (0-62) + MEM_BANK : BYTE := BYTE#16#3; //Memory bank address + PSWD : DWORD := DWORD#16#0; //Password + EDIT_BLACKLIST_MODE : BYTE := BYTE#16#0; //Mode for command "edit blacklist" + INVENTORY_DURATION : WORD := WORD#16#0; //Duration for command "inventory" + INVENTORY_DUR_UNIT : WORD := WORD#16#0; //Duration unit for command "inventory" + LOCK_TAG_BANK_ACTION : WORD := WORD#16#0; //Lock-Action for command "lock-tag-bank" + LOCK_TAG_BANK_MASK : WORD := WORD#16#0; //Lock Mask for command "lock-tag-bank" +// END_STRUCT +// END_TYPE + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_CONFIGRECORD.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_CONFIGRECORD.st new file mode 100644 index 000000000..0697e9e02 --- /dev/null +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_CONFIGRECORD.st @@ -0,0 +1,17 @@ +NAMESPACE AXOpen.Components.Siemens.Identification + +// TYPE ST_IID_IN_PN_CONFIGRECORD : +// STRUCT + CLASS Axo_IID_IN_PN_CONFIGRECORD + VAR PUBLIC + nRW : WORD; + nNrAr : WORD; + nApi : DWORD; + nSlot : WORD; + nSubslot : WORD; + record : Axo_IID_IN_PN_RECORDDATA ; +// END_STRUCT +// END_TYPE + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_RECORDDATA.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_RECORDDATA.st new file mode 100644 index 000000000..35cc87f54 --- /dev/null +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_RECORDDATA.st @@ -0,0 +1,16 @@ +NAMESPACE AXOpen.Components.Siemens.Identification + +// TYPE ST_IID_IN_PN_RECORDDATA : +// STRUCT + CLASS Axo_IID_IN_PN_RECORDDATA + VAR PUBLIC + nIndex : WORD; + nLen : WORD; + nTrans : WORD; + nReserve : WORD; + buf : ARRAY[0..1034] OF BYTE; +// END_STRUCT +// END_TYPE + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_SYNC.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_SYNC.st new file mode 100644 index 000000000..0ddfc4988 --- /dev/null +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_SYNC.st @@ -0,0 +1,48 @@ +NAMESPACE AXOpen.Components.Siemens.Identification + +// TYPE ST_IID_IN_SYNC : +// STRUCT + CLASS Axo_IID_IN_SYNC + VAR PUBLIC + STATUS_IN_WORK : BOOL := FALSE; //command is in work + STATUS_INITIALISATION : BOOL := FALSE; //initialisation is in work + STATUS_LAST_CMD_INIT : BOOL := FALSE; //flag for initialisation + sreset_request : BOOL := FALSE; //show that one app is in sreset + acyc_active : BOOL := FALSE; //acyc service is running + reset_request : BOOL := FALSE; //shows that one reset-instruction is wait for ends of acyclic commands + AC_H : BOOL := FALSE; //ack counter high + AC_L : BOOL := FALSE; //ack counter low + CC_H : BOOL := FALSE; //cmd counter high + CC_L : BOOL := FALSE; //cmd counter low + old_CC_H : BOOL := FALSE; //previous ack counter high + old_CC_L : BOOL := FALSE; //previous ack counter low + old_AC_H : BOOL := FALSE; //previous cmd counter high + old_AC_L : BOOL := FALSE; //previous cmd counter low + cyc_control : WORD := WORD#16#0; //cyclic control word + cyc_status : WORD := WORD#16#0; //cyclic status word + SRESET_active : BOOL := FALSE; //sreset active bit (cyc status word) + SRESET_cyc : BOOL := FALSE; //sreset control bit (cyc control word) + RPTCMD_cyc : BOOL := FALSE; //repeat control bit (cyc control word) + RPTCMD_active : BOOL := FALSE; //repeat active bit (cyc status word) + INIT_cyc : BOOL := FALSE; //init control bit (cyc control word) + init_active : BOOL := FALSE; //init status bit (cyc status word) + presence : BOOL := FALSE; //presence-bit + buf_header : UINT := UINT#11; //length pib-header + sequence_number : UINT := UINT#0; //sequence number (pib-header) + config_value : BYTE := BYTE#16#4; //config mode for pdu-detection + offset : UINT := UINT#0; //offset for cyclic status/control word + index : UINT := UINT#0; //index for WRREC/RDREC + buf_max : UINT := UINT#240; //acyclic datagram buffer size + instruction_set : BOOL := FALSE; //state for instruction set (1=RF68xR; 0=old CMs) + index_set : BOOL := TRUE; //state for DS-index (1=PROFINET; 0=PROFIBUS) + timeout_repeat : TIME := T#5S; //timeout for repeat + timeout_reset : TIME := T#1M; //timeout for init + state : UINT := UINT#0; //variable for statemachine + buf_maxdata : UINT := UINT#229; //user data size + //buf:ARRAY[0..1034] OF BYTE; + pnConfigRecord : Axo_IID_IN_PN_CONFIGRECORD; + // END_STRUCT + // END_TYPE + END_VAR + END_CLASS +END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IdentProfile.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IdentProfile.st new file mode 100644 index 000000000..e9376965e --- /dev/null +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IdentProfile.st @@ -0,0 +1,1602 @@ +(* +USING Siemens.Simatic.S71500.DistributedIO; + +NAMESPACE AXOpen.Components.Siemens.Identification + CLASS Axo_IdentProfile + VAR + statLastErrorStatus : DWORD := DWORD#16#0; // last error status + statLastMoveError : INT; // error of last MOV_BLK + statChainedStatus : DWORD := DWORD#16#0; // first error status in chain + statIntStatus : DWORD := DWORD#16#0; // internal status of WRREC and RDREC + statSaveError : BOOL; // save error of WRREC and RDREC + statCI : BYTE := BYTE#16#0; // command index + statDataTodo : UDINT; // rest of data + statDataOffset : UDINT; // offset for send data + statRecvOffset : UDINT; // offset for recv data + statBufLen : UINT; // length of buffer + statAdb : UINT := UINT#1; // tdb: total number of data blocks + statDbn : UINT := UINT#1; // dbn: current data block number + statTxbuflen : UDINT := UDINT#0; // length of send-buffer + statRxbuflen : UDINT := UDINT#0; // length of receive-buffer + statPrevExecute : BOOL; // old flag for execute + statPrevInit : BOOL; // old flag for init + statPrevSReset : BOOL; // old flag for sreset + statFurtherTelegram : BOOL; // helper for fragmented telegrams + statPduRepeat : BOOL; // flag for repeat of pdu detection + statEmptyCycle : BOOL; + statSize : UINT; // length of cmd-header + statPduDetection : BOOL; // pdu-detection (supported telegram length) + statCmdSelCounter : UINT := UINT#1; // internal cmd selector (for chained cmds) + statChainedCounter : UINT := UINT#1; // counter for chained commands + statFixChainedCounter : UINT := UINT#1; // fix mem counter of chained commands (memory for repeat) + statSqModified : BOOL; // sequenznumber modified for repeat command + // statAdsRdWrt : ADSRDWRT; // instance of RDREC + statWRREC : WriteRecord; // instance of WriteRecord + statRDREC : ReadRecord; // instance of WriteRecord + // statTimeout : TON; // instance of timer + statTimeout : System.Timer.OnDelay; // instance of timer + statCmd : Axo_IID_CMD_STRUCT; // actual cmd + statSaveAdsError : BOOL; + statIntAdsErrId : UDINT; + statLowerBoundTxref : DINT; + statUpperBoundTxref : DINT; + statLowerBoundRxref : DINT; + statUpperBoundRxref : DINT; + statErrorCounter : DINT; + END_VAR + + VAR CONSTANT + STATE0 : UINT := UINT#0; //Initialisation 1 + STATE1 : UINT := UINT#1; //Initialisation 2: wait for init_active of device + STATE2 : UINT := UINT#2; //Initialisation 3: wait until init_active is dropped and start ADS WRITE + STATE3 : UINT := UINT#3; + STATE4 : UINT := UINT#4; //build command telegram and start ADS WRITE + STATE5 : UINT := UINT#5; //finish ADS WRITE + STATE6 : UINT := UINT#6; //wait for acknowledgement (CommandCounter) and start ADS READ + STATE7 : UINT := UINT#7; //finish ADS READ and receive data + STATE8 : UINT := UINT#8; //Soft reset + PN_CONFIGRECORD_HEADER_LEN: UINT := UINT#20; + ADS_TIMEOUT : TIME := T#1S; + ADS_READ : WORD := WORD#16#0; + ADS_WRITE : WORD := WORD#16#1; + ERRID_DEVICE_BUSY : WORD := WORD#16#0000_0708; + END_VAR + + METHOD Run + VAR_INPUT + bExecute : BOOL; // rising edge: start command + bRepeatCommand : BOOL; // repeat command + bSoftReset : BOOL; // soft reset + bInit : BOOL; // init-run + nCmdsel : UINT := UINT#1; // selector for executive command + END_VAR + VAR_OUTPUT + bDone : BOOL; // command is done + bBusy : BOOL; // command is in work + bError : BOOL; // command ended with error + bWarning : BOOL; // command ended with warning + nStatus : DWORD := DWORD#0; // status of warning and error + bRepeatActive : BOOL; // repeat command is active + bErrIreq : BOOL; // error at communication module + bTpc : BOOL; // number of tags has changed + bTp : BOOL; // tag presence + bUin0 : BOOL; // user-input 0 of the Ident-Unit + bUin1 : BOOL; // user-input 1 of the Ident-Unit + bUin2 : BOOL; // user-input 2 of the Ident-Unit + bUin3 : BOOL; // user-input 3 of the Ident-Unit + nTrlen : DINT; // length of send/receive data + END_VAR + VAR_IN_OUT + stHwConnect : Axo_IID_HW_CONNECT; + aCmdref : ARRAY[1..10] OF Axo_IID_CMD_STRUCT; // command-buffer + aTxref : ARRAY[*] OF BYTE; // send-buffer + aRxref : ARRAY[*] OF BYTE; // receive-buffer + END_VAR + + VAR_TEMP + tempRaisedExecute : BOOL; // flag for rising edge of execute + tempRaisedInit : BOOL; // flag for rising edge of init + tempRaisedSreset : BOOL; // flag for rising edge of sreset + tempIntError : BOOL; // helper: internal error + tempAdress : UDINT; // helper: i/o address + tempB : BYTE; // helper: error flag in acknowledge + tempLi : UDINT; // helper_ length + tempBufoffset : UINT; // helper: buffer offset + tempW : WORD; // helper: interpret single bytes of telegram + tempI : UINT; // helper: offset + tempFinished : BOOL; // helper: command is finished + tempTmp : UINT; // helper: loop variable + tempMax : UINT; // helper: pdu size + tempStatus : WORD; // helper: mask status + tempL1 : UDINT; // helper: array_length + tempL2 : UDINT; // helper: array_length + tempRetval : UINT; // helper: return value of timestamp + tempShift : BOOL; // helper: shift flag for datatypes + tempZeroValue : BYTE; // helper: variable for value zero + tempWord : WORD; + tempDword : DWORD; + tempAdb : UINT; + tempDbn : UINT; + tempCntDiag : UINT; + tempChar : WSTRING; + tempByte : BYTE; + tempLoop : UINT; + END_VAR + + + //============================================================================= + // SIEMENS AG + // (c)Copyright 2021 All Rights Reserved + //----------------------------------------------------------------------------- + // Library: LIID + // Engineering: TwinCat3 + // Functionality: Manage the connection and the data transfer between IID + // Reader and PLC + // + //----------------------------------------------------------------------------- + // Change log table: + // Version Date Expert Changes applied + // 01.00.00 29.03.2021 Manuel Nagel First released version + //============================================================================= + + // IF __ISVALIDREF(stHWConnect) THEN + + IF TRUE THEN // TODO Solve Null ref + + IF statPrevExecute <> bExecute THEN + tempRaisedExecute := bExecute; + END_IF; + IF statPrevInit <> bInit THEN + tempRaisedInit := bInit; + END_IF; + IF statPrevSReset <> bSoftReset THEN + tempRaisedSreset := bSoftReset; + END_IF; + + // Save Inputs + statPrevExecute := bExecute; + statPrevInit := bInit; + statPrevSReset := bSoftReset; + + // reset outputs, if no init or execute or sreset is set + IF (NOT bExecute AND NOT bInit AND NOT bSoftReset) AND NOT stHwConnect.STATIC.STATUS_IN_WORK THEN + bDone := FALSE; + bBusy := FALSE; + bError := FALSE; + nStatus := DWORD#0; + END_IF; + + // start SRESET + IF tempRaisedSreset THEN + stHwConnect.STATIC.SRESET_cyc := true; + stHwConnect.STATIC.STATUS_IN_WORK := true; + // Set Outputs + bDone := FALSE; + bBusy := TRUE; + bError := FALSE; + bWarning := FALSE; + nStatus := DWORD#0; + END_IF; + + // Init or Execute is set; Init can start everytime. Execute (command) only if nothing is working + IF (tempRaisedInit AND NOT stHwConnect.STATIC.STATUS_INITIALISATION) OR (tempRaisedExecute AND NOT stHwConnect.STATIC.STATUS_IN_WORK) THEN + // Set Outputs + bDone := FALSE; + bBusy := TRUE; + bError := FALSE; + bWarning := FALSE; + nStatus := DWORD#0; + + //reset move_blk_error + statLastMoveError := 0; + + // reset flag for executed initialisation + stHwConnect.STATIC.STATUS_LAST_CMD_INIT := FALSE; + + // check send and receive buffer and save buffer length + statLowerBoundTxref := LOWER_BOUND(aTxref,1); + statUpperBoundTxref := UPPER_BOUND(aTxref,1); + + statLowerBoundRxref := LOWER_BOUND(aRxref,1); + statUpperBoundRxref := UPPER_BOUND(aRxref,1); + + statTxbuflen := TO_UDINT(statUpperBoundTxref - statLowerBoundTxref + 1); + statRxbuflen := TO_UDINT(statUpperBoundRxref - statLowerBoundRxref + 1); + + // check cmd_sel + IF nCmdsel > UINT#10 OR nCmdsel < UINT#1 THEN + tempIntError := TRUE; + statIntStatus := DWORD#16#E7FE0200; + END_IF; + + IF NOT tempIntError THEN + // steps for init procedure + IF tempRaisedInit THEN + // set status-variables + stHwConnect.STATIC.STATUS_INITIALISATION := true; + stHwConnect.STATIC.STATUS_IN_WORK := true; + // set flag for executed initialisation + stHwConnect.STATIC.STATUS_LAST_CMD_INIT := true; + // raise INIT in cyclic control word + stHwConnect.STATIC.INIT_cyc := tempRaisedInit; + // INIT starts in step 0 + stHwConnect.STATIC.state := STATE0; + // reset index and instruction-set + stHwConnect.STATIC.instruction_set := FALSE; + stHwConnect.STATIC.index_set := TRUE; + stHwConnect.STATIC.config_value := BYTE#16#4; + // reset chain infos + statChainedStatus := DWORD#16#0; + // drop SRESET + stHwConnect.STATIC.SRESET_active := FALSE; + stHwConnect.STATIC.SRESET_cyc := FALSE; + // drop internal rpt + stHwConnect.STATIC.RPTCMD_cyc := FALSE; + // //Reset ads request + // statAdsRdWrt.WRTRD := FALSE; + + //Reset WriteRecord request + statWRREC(request := TRUE, + id := TO_UINT(stHwConnect.HW_ID), + index := stHwConnect.STATIC.index, + length := statBufLen, + record := stHwConnect.STATIC.pnConfigRecord.record.buf); + statWRREC.request := FALSE; + //Reset ReadRecord request + statRDREC.request := FALSE; + + // calculate INDEX for old modules and RF68xR + IF stHwConnect.STATIC.index_set THEN + stHwConnect.STATIC.index := TO_UINT(16#B050) - stHwConnect.CM_CHANNEL; + ELSE + stHwConnect.STATIC.index := stHwConnect.CM_CHANNEL + UINT#100; + END_IF; + END_IF; + + // steps for command procedure + IF tempRaisedExecute AND NOT stHwConnect.STATIC.STATUS_IN_WORK THEN + // set status-variables + stHwConnect.STATIC.STATUS_INITIALISATION := FALSE; + stHwConnect.STATIC.STATUS_IN_WORK := TRUE; + + // //Reset ads request + // statAdsRdWrt.WRTRD := FALSE; + + //Reset WriteRecord request + statWRREC.request := FALSE; + //Reset ReadRecord request + statRDREC.request := FALSE; + + // calculate INDEX for old modules and RF68xR + IF stHwConnect.STATIC.index_set THEN + stHwConnect.STATIC.index := TO_UINT(16#B046) - stHwConnect.CM_CHANNEL; + ELSE + stHwConnect.STATIC.index := stHwConnect.CM_CHANNEL + UINT#110; + END_IF; + END_IF; + + // set variables for repeat command. only if rpt_active of reader is set + IF (stHwConnect.STATIC.RPTCMD_cyc OR stHwConnect.STATIC.RPTCMD_active) AND NOT tempRaisedInit THEN + // setup things to receive next acknowledgement sequence + statAdb := UINT#0; + // reset timer + statTimeout(signal := FALSE, + duration := stHwConnect.STATIC.timeout_repeat); + // start timer + statTimeout(signal := TRUE, + duration := stHwConnect.STATIC.timeout_repeat); + // remind chained counter + statChainedCounter := statFixChainedCounter; + statSqModified := FALSE; + // jump to state 6 => wait for acknowledge and read result + stHwConnect.STATIC.state := STATE6; + ELSE + // reset chained memory if no repeat is started + statFixChainedCounter := UINT#1; + statChainedCounter := UINT#1; + statSqModified := FALSE; + statCmdSelCounter := nCmdsel; + statCmd := aCmdref[statCmdSelCounter]; + + END_IF; + + // check index + IF stHwConnect.STATIC.index < UINT#101 OR stHwConnect.STATIC.index > UINT#118 OR stHwConnect.STATIC.index = UINT#109 OR stHwConnect.STATIC.index = UINT#110 THEN + IF stHwConnect.STATIC.index > TO_UINT(16#B04F) OR stHwConnect.STATIC.index < TO_UINT(16#B03E) THEN + tempIntError := true; + statIntStatus := DWORD#16#E7FE0600; + END_IF; + END_IF; + + ELSE + //clear command code und attribute for to error buffer + statCmd.CMD := eAxo_IID_COMMANDS#eNoCommand; + statCmd.ATTRIBUTES := BYTE#16#0; + END_IF; + END_IF; + + stHwConnect.STATIC.cyc_status := stHwConnect.STATUS_WORD; + + // decode input word + bUin0 := stHwConnect.STATIC.cyc_status.%X0; + bUin1 := stHwConnect.STATIC.cyc_status.%X1; + bUin2 := stHwConnect.STATIC.cyc_status.%X2; + bUin3 := stHwConnect.STATIC.cyc_status.%X3; + bErrIreq := stHwConnect.STATIC.cyc_status.%X4; + //busy := hw_connect.Static.cyc_status.%X5; // optional, not used + stHwConnect.STATIC.RPTCMD_active := stHwConnect.STATIC.cyc_status.%X6; + stHwConnect.STATIC.SRESET_active := stHwConnect.STATIC.cyc_status.%X7; + bTp := stHwConnect.STATIC.cyc_status.%X8; + stHwConnect.STATIC.presence := stHwConnect.STATIC.cyc_status.%X8; + bTpc := stHwConnect.STATIC.cyc_status.%X9; + // bit 11 reserved := hw_connect.Static.cyc_status.%X10; + stHwConnect.STATIC.CC_L := stHwConnect.STATIC.cyc_status.%X11; + stHwConnect.STATIC.CC_H := stHwConnect.STATIC.cyc_status.%X12; + stHwConnect.STATIC.AC_L := stHwConnect.STATIC.cyc_status.%X13; + stHwConnect.STATIC.AC_H := stHwConnect.STATIC.cyc_status.%X14; + stHwConnect.STATIC.init_active := stHwConnect.STATIC.cyc_status.%X15; + + // set output for repeat + bRepeatActive := stHwConnect.STATIC.RPTCMD_active; + + // map RPTCMD if Ident_FB is not in_work + IF NOT stHwConnect.STATIC.STATUS_IN_WORK THEN + stHwConnect.STATIC.RPTCMD_cyc := bRepeatCommand; + END_IF; + + // build cyclic control word + stHwConnect.STATIC.cyc_control := WORD#0; + // 4/5 reserved + stHwConnect.STATIC.cyc_control.%X6 := stHwConnect.STATIC.RPTCMD_cyc; + stHwConnect.STATIC.cyc_control.%X7 := stHwConnect.STATIC.SRESET_cyc; + // 9-14 reserved + stHwConnect.STATIC.cyc_control.%X15 := stHwConnect.STATIC.INIT_cyc; + + stHwConnect.CONTROL_WORD := stHwConnect.STATIC.cyc_control; + + // SRESET is set + IF stHwConnect.STATIC.SRESET_cyc THEN + // wait till acycl. communication is done + // IF statAdsRdWrt.BUSY THEN + // statAdsRdWrt(wrtrd:=FALSE); + // statAdsRdWrt.WRTRD := FALSE; + // RETURN; + // END_IF; + IF statWRREC.BUSY THEN + THIS.statWRREC(); + statWRREC.request := FALSE; + RETURN; + END_IF; + + + + // if reader/CM has ack the SRESET with active-bit, reset cyclic SRESET and jump to step 8 + IF stHwConnect.STATIC.SRESET_active THEN + stHwConnect.STATIC.state := STATE8; + stHwConnect.STATIC.SRESET_cyc := false; + ELSE + // if reader/cm is not finished got out + RETURN; + END_IF; + END_IF; + + + // go in statemachine only if Ident_FB is in_work and have no error + IF stHwConnect.STATIC.STATUS_IN_WORK AND NOT tempIntError THEN + // The loop will only use to jump out at every place if an error occurs + FOR tempTmp := 1 TO UINT#1 DO + CASE stHwConnect.STATIC.state OF + STATE0: //----------------------Initialisation 1---------------------------- + // wait if WRREC and RDREC are done + IF statAdsRdWrt.BUSY THEN + statAdsRdWrt(wrtrd:=FALSE); + statAdsRdWrt.WRTRD := FALSE; + EXIT; + END_IF; + + // reset internal variable + statFurtherTelegram := FALSE; + + // check CMD validity and command codex + IF (nCmdsel <> UINT#1) OR (statCmd.CMD <> eAxo_IID_COMMANDS#eWriteConfig) THEN + // CMDSEL must be 1 as defined by the IEC standard + // only WRITE_CONFIG is here allowed + tempIntError := TRUE; + statIntStatus := DWORD#16#E7FE0100; + EXIT; + END_IF; + + // reset sequence_number + stHwConnect.STATIC.sequence_number := UINT#0; + + // reset timer + statTimeout(signal := FALSE, + duration := stHwConnect.STATIC.timeout_reset); + // start timer + statTimeout(signal := TRUE, + duration := stHwConnect.STATIC.timeout_reset); + + // set buflen of telegram + stHwConnect.STATIC.buf_max := UINT#240; + stHwConnect.STATIC.buf_maxdata := stHwConnect.STATIC.buf_max - stHwConnect.STATIC.buf_header; + // first check PDU size + statPduDetection := TRUE; + + // go to next step + stHwConnect.STATIC.state := STATE1; + + STATE1: //------------Initialisation 2: wait for init_active of device--------------- + IF stHwConnect.STATIC.init_active = TRUE THEN + // initialize CC variables + stHwConnect.STATIC.old_CC_H := FALSE; + stHwConnect.STATIC.old_CC_L := FALSE; + + // remember AC_H/AC_L + stHwConnect.STATIC.old_AC_H := stHwConnect.STATIC.AC_H; + stHwConnect.STATIC.old_AC_L := stHwConnect.STATIC.AC_L; + + // drop INIT + stHwConnect.STATIC.INIT_cyc := FALSE; + + // go to next step + stHwConnect.STATIC.state := STATE2; + END_IF; + STATE2: // --------------Initialisation 3: wait until init_active is dropped ---------- + IF stHwConnect.STATIC.init_active = FALSE THEN + // and start command processing + IF (stHwConnect.STATIC.old_CC_H <> stHwConnect.STATIC.CC_H OR stHwConnect.STATIC.old_CC_L <> stHwConnect.STATIC.CC_L) OR statPduRepeat THEN + + // remember command counter + stHwConnect.STATIC.old_CC_H := stHwConnect.STATIC.CC_H; + stHwConnect.STATIC.old_CC_L := stHwConnect.STATIC.CC_L; + + // Built Telegram + // 0 - DBL/reserved + stHwConnect.Static.pnConfigRecord.record.buf[0] := BYTE#0; + + // 2/3 - SN + stHwConnect.Static.sequence_number := stHwConnect.Static.sequence_number + UINT#1; + // stHwConnect.Static.pnConfigRecord.record.buf[2] := TO_BYTE(SHR(TO_WORD(stHwConnect.Static.sequence_number),8)); + // stHwConnect.Static.pnConfigRecord.record.buf[3] := TO_BYTE(stHwConnect.Static.sequence_number); + tempW := TO_WORD(stHwConnect.Static.sequence_number); + stHwConnect.Static.pnConfigRecord.record.buf[2] := tempW.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[3] := tempW.%B0; + + // 4/5 - CC/CI + stHwConnect.Static.pnConfigRecord.record.buf[4] := TO_BYTE(statCmd.CMD); + stHwConnect.Static.pnConfigRecord.record.buf[5] := BYTE#65; // A -> PIB to device + + // 6/7 - ADB + stHwConnect.Static.pnConfigRecord.record.buf[6] := BYTE#0; + stHwConnect.Static.pnConfigRecord.record.buf[7] := TO_BYTE(1); + + // 8/9 - DBN + stHwConnect.Static.pnConfigRecord.record.buf[8] := BYTE#0; + stHwConnect.Static.pnConfigRecord.record.buf[9] := TO_BYTE(1); + + // 10 - DBL + // in PIB version > 1.20 the DBL value must be in Byte 1 and 10 at Config = 4 + stHwConnect.Static.pnConfigRecord.record.buf[10] := BYTE#35; + IF stHwConnect.STATIC.config_value = BYTE#4 THEN + stHwConnect.Static.pnConfigRecord.record.buf[1] := BYTE#35; + ELSE + stHwConnect.Static.pnConfigRecord.record.buf[1] := BYTE#0; + END_IF; + + // 11 - Config + stHwConnect.Static.pnConfigRecord.record.buf[11] := stHwConnect.STATIC.config_value; + + // zero out telegram buffer + // FILL_BLK(IN := TO_BYTE(16#00), + // COUNT := INT_TO_UINT(34), + // OUT => hw_connect.Static.pnConfigRecord.record.buf[12]); + + MEMSET(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[12]) , fillByte:=16#00 , n:=SIZEOF(stHwConnect.STATIC.pnConfigRecord.record.buf)-12); + + // set offsets for data-buffer + statBufLen := UINT#46; + statDataTodo := UDINT#0; + statDataOffset := UDINT#0; + statRecvOffset := UDINT#0; + + nTrlen := 0; + + // write packet to the client + stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(statBufLen); + stHwConnect.Static.pnConfigRecord.nRW := ADS_WRITE; + statAdsRdWrt.WRTRD := TRUE; + // go to next step + stHwConnect.STATIC.state := STATE5; + END_IF; + END_IF; + + STATE4: //--------------------------------------build command telegram---------------------------------- + + // check command-counter if is a long term telegram + IF statFurtherTelegram OR statChainedCounter > UINT#1 THEN + IF NOT (stHwConnect.STATIC.old_CC_H <> stHwConnect.STATIC.CC_H OR stHwConnect.STATIC.old_CC_L <> stHwConnect.STATIC.CC_L) THEN + EXIT; + END_IF; + END_IF; + + // remember command counter + stHwConnect.STATIC.old_CC_H := stHwConnect.STATIC.CC_H; + stHwConnect.STATIC.old_CC_L := stHwConnect.STATIC.CC_L; + + // steps for first telegram + IF NOT statFurtherTelegram THEN + // initialize TX variables + statDataTodo := UDINT#0; + statDataOffset := UDINT#0; + // initialize RX variables + statRecvOffset := UDINT#0; + // simple_read-bit not used because of chained commands + //simple_read := TRUE; + + // set parameters for all write-commands + IF statCmd.CMD = eAxo_IID_COMMANDS#eFormat OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite OR statCmd.CMD = eAxo_IID_COMMANDS#ePut OR statCmd.CMD = eAxo_IID_COMMANDS#eWriteConfig OR statCmd.CMD = eAxo_IID_COMMANDS#eWriteID THEN + IF TO_UDINT(statCmd.LEN_DATA) > statTxbuflen OR TO_UDINT(statCmd.LEN_DATA) < UDINT#0 THEN + tempIntError := TRUE; + statIntStatus := DWORD#16#E7FE0400; + EXIT; + END_IF; + statDataTodo := TO_UDINT(statCmd.LEN_DATA); + statDataOffset := statCmd.OFFSETBUFFER; + END_IF; + + // check length for read-commands which knows the length before + IF statCmd.CMD = eAxo_IID_COMMANDS#eRead THEN + //simple_read-bit NOT used because OF chained commands + //simple_read := FALSE; + IF TO_UDINT(statCmd.LEN_DATA) > statRxbuflen OR TO_UDINT(statCmd.LEN_DATA) < UDINT#0 THEN + tempIntError := true; + statIntStatus := DWORD#16#E7FE0400; + EXIT; + END_IF; + END_IF; + + // check send buffer + IF statDataTodo <> UDINT#0 THEN + tempLi := statTxbuflen - statDataOffset; + IF statDataTodo > tempLi THEN + tempIntError := true; + statIntStatus := DWORD#16#E7FE0300; + EXIT; + END_IF; + END_IF; + END_IF; + + // set length of cmd_buffer for ext_uhf an normal command + IF stHwConnect.STATIC.instruction_set AND statCmd.CMD <> eAxo_IID_COMMANDS#eInventory AND statCmd.CMD <> eAxo_IID_COMMANDS#eReaderStatus + AND statCmd.CMD <> eAxo_IID_COMMANDS#eWriteConfig AND statCmd.CMD <> eAxo_IID_COMMANDS#eReadConfig THEN + // EXT_UHF + statCI := BYTE#16#55; + statSize := UINT#78; + ELSE + // normal + statCI := BYTE#16#41; + statSize := UINT#35; + END_IF; + + // build PIB-Header + // 0 - reserved + stHwConnect.Static.pnConfigRecord.record.buf[0] := BYTE#0; + + // 2/3 - SN + IF NOT statFurtherTelegram THEN + stHwConnect.STATIC.sequence_number := stHwConnect.STATIC.sequence_number + UINT#1; + END_IF; + + // stHwConnect.Static.pnConfigRecord.record.buf[2] := WORD_TO_BYTE(SHR(UINT_TO_WORD(stHwConnect.Static.sequence_number),8)); + // stHwConnect.Static.pnConfigRecord.record.buf[3] := TO_BYTE(stHwConnect.Static.sequence_number); + + tempW := TO_WORD(stHwConnect.Static.sequence_number); + stHwConnect.Static.pnConfigRecord.record.buf[2] := tempW.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[3] := tempW.%B0; + + // 4/5 - CC/CI + // set CI for chained commands + IF statCmd.CHAINED AND statCmdSelCounter < UINT#10 THEN + statCI := TO_BYTE(TO_UINT(statCI) + UINT#16#20); + END_IF; + stHwConnect.Static.pnConfigRecord.record.buf[4] := TO_BYTE(statCmd.CMD); + stHwConnect.Static.pnConfigRecord.record.buf[5] := statCI; + + // 6/7 - ADB + IF NOT statFurtherTelegram THEN + statAdb := UINT#1; + IF statDataTodo > (stHwConnect.STATIC.buf_maxdata - statSize) THEN + tempLi := statDataTodo - (stHwConnect.STATIC.buf_maxdata - statSize); + statAdb := statAdb + TO_UINT(tempLi / stHwConnect.STATIC.buf_maxdata); + IF (tempLi MOD stHwConnect.STATIC.buf_maxdata) <> UINT#0 THEN + statAdb := statAdb + UINT#1; + END_IF; + END_IF; + ELSE + statSize := UINT#0; + END_IF; + // stHwConnect.Static.pnConfigRecord.record.buf[6] := WORD_TO_BYTE(SHR( UINT_TO_WORD(statAdb),8)); + // stHwConnect.Static.pnConfigRecord.record.buf[7] := TO_BYTE(statAdb); + tempW := TO_WORD(statAdb); + stHwConnect.Static.pnConfigRecord.record.buf[6] := tempW.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[7] := tempW.%B0; + // 8/9 - DBN + IF NOT statFurtherTelegram THEN + statDbn := UINT#0; + END_IF; + statDbn := statDbn + UINT#1; + // stHwConnect.Static.pnConfigRecord.record.buf[8] := WORD_TO_BYTE(SHR(UINT_TO_WORD(statDbn),8)); + // stHwConnect.Static.pnConfigRecord.record.buf[9] := TO_BYTE(statDbn); + + tempW := TO_WORD(statDbn); + stHwConnect.Static.pnConfigRecord.record.buf[8] := tempW.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[9] := tempW.%B0; + + // 10 - DBL + IF statDataTodo > (stHwConnect.STATIC.buf_maxdata - statSize) THEN + tempI := stHwConnect.STATIC.buf_maxdata - statSize; + ELSE + tempI := TO_UINT(statDataTodo); + END_IF; + statBufLen := tempI + statSize; + // PIB-Spec > 1.20 dbl must be in byte 1 and 0 if pdu > 240 + IF stHwConnect.STATIC.buf_max <= UINT#240 THEN + stHwConnect.Static.pnConfigRecord.record.buf[10] := TO_BYTE(statBufLen); + IF stHwConnect.STATIC.config_value = BYTE#4 THEN + stHwConnect.Static.pnConfigRecord.record.buf[1] := TO_BYTE(statBufLen); + ELSE + stHwConnect.Static.pnConfigRecord.record.buf[1] := BYTE#0; + END_IF; + ELSIF stHwConnect.STATIC.buf_max > UINT#240 THEN + tempWord := TO_WORD(statBufLen); + stHwConnect.Static.pnConfigRecord.record.buf[0] := tempWord.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[1] := tempWord.%B0; + stHwConnect.Static.pnConfigRecord.record.buf[10] := BYTE#0; + END_IF; + statBufLen := statBufLen + stHwConnect.STATIC.buf_header; + + // zero out telegram buffer + // FILL_BLK(IN := TO_BYTE(16#00), + // COUNT := INT_TO_UINT(statSize), + // OUT => hw_connect.Static.pnConfigRecord.record.buf[11]); + + MEMSET(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[11]) , fillByte:=16#00 , n:=statSize); + // build CMD-Header in first telegram + IF NOT statFurtherTelegram THEN + // save chained counter + statFixChainedCounter := statChainedCounter; + + // 11 Config + IF statCmd.CMD = eAxo_IID_COMMANDS#eWriteConfig THEN + stHwConnect.Static.pnConfigRecord.record.buf[11] := statCmd.CONFIG; + END_IF; + + // parameters for ext_uhf + IF stHwConnect.STATIC.instruction_set AND statCmd.CMD <> eAxo_IID_COMMANDS#eInventory AND statCmd.CMD <> eAxo_IID_COMMANDS#eReadConfig AND statCmd.CMD <> eAxo_IID_COMMANDS#eWriteConfig THEN + // 11 Mode + IF statCmd.CMD = eAxo_IID_COMMANDS#eEditBlacklist THEN + stHwConnect.Static.pnConfigRecord.record.buf[11] := statCmd.EXT_UHF.EDIT_BLACKLIST_MODE; + END_IF; + + // 12 Source + IF statCmd.CMD <> eAxo_IID_COMMANDS#eEditBlacklist AND statCmd.CMD <> eAxo_IID_COMMANDS#eGetBlacklist THEN + stHwConnect.Static.pnConfigRecord.record.buf[12] := TO_BYTE(stHwConnect.CM_CHANNEL); + END_IF; + + // 13 Bank + IF statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite THEN + stHwConnect.Static.pnConfigRecord.record.buf[13] := statCmd.EXT_UHF.MEM_BANK; + END_IF; + + // 14-15 address + IF statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite THEN + // stHwConnect.Static.pnConfigRecord.record.buf[14] := DWORD_TO_BYTE(SHR(statCmd.ADDR_TAG,8)); + // stHwConnect.Static.pnConfigRecord.record.buf[15] := DWORD_TO_BYTE(statCmd.ADDR_TAG); + stHwConnect.Static.pnConfigRecord.record.buf[14] := statCmd.ADDR_TAG.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[15] := statCmd.ADDR_TAG.%B0; + END_IF; + + // 16#-17 Length + IF statCmd.CMD = eAxo_IID_COMMANDS#eWriteID OR statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite THEN + // stHwConnect.Static.pnConfigRecord.record.buf[16] := WORD_TO_BYTE(SHR(statCmd.LEN_DATA,8)); + // stHwConnect.Static.pnConfigRecord.record.buf[17] := WORD_TO_BYTE(statCmd.LEN_DATA); + stHwConnect.Static.pnConfigRecord.record.buf[16] := statCmd.LEN_DATA.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[17] := statCmd.LEN_DATA.%B0; + END_IF; + + // 18-19 pswd + IF statCmd.CMD = eAxo_IID_COMMANDS#eWriteID OR statCmd.CMD = eAxo_IID_COMMANDS#eKillTag OR statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite OR statCmd.CMD = eAxo_IID_COMMANDS#eLockTagBank THEN + // stHwConnect.Static.pnConfigRecord.record.buf[18] := DWORD_TO_BYTE(SHR(statCmd.EXT_UHF.PSWD,24)); + // stHwConnect.Static.pnConfigRecord.record.buf[19] := DWORD_TO_BYTE(SHR(statCmd.EXT_UHF.PSWD,16)); + // stHwConnect.Static.pnConfigRecord.record.buf[20] := DWORD_TO_BYTE(SHR(statCmd.EXT_UHF.PSWD,8)); + // stHwConnect.Static.pnConfigRecord.record.buf[21] := DWORD_TO_BYTE(statCmd.EXT_UHF.PSWD); + stHwConnect.Static.pnConfigRecord.record.buf[18] := statCmd.EXT_UHF.PSWD.%B3; + stHwConnect.Static.pnConfigRecord.record.buf[19] := statCmd.EXT_UHF.PSWD.%B2; + stHwConnect.Static.pnConfigRecord.record.buf[20] := statCmd.EXT_UHF.PSWD.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[21] := statCmd.EXT_UHF.PSWD.%B0; + END_IF; + + // action & mask + IF statCmd.CMD = eAxo_IID_COMMANDS#eLockTagBank THEN + // stHwConnect.Static.pnConfigRecord.record.buf[22] := WORD_TO_BYTE(SHR(statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION,8)); + // stHwConnect.Static.pnConfigRecord.record.buf[23] := WORD_TO_BYTE(statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION); + // stHwConnect.Static.pnConfigRecord.record.buf[24] := WORD_TO_BYTE(SHR(statCmd.EXT_UHF.LOCK_TAG_BANK_MASK,8)); + // stHwConnect.Static.pnConfigRecord.record.buf[25] := WORD_TO_BYTE(statCmd.EXT_UHF.LOCK_TAG_BANK_MASK); + stHwConnect.Static.pnConfigRecord.record.buf[22] := statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[23] := statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION.%B0; + stHwConnect.Static.pnConfigRecord.record.buf[24] := statCmd.EXT_UHF.LOCK_TAG_BANK_MASK.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[25] := statCmd.EXT_UHF.LOCK_TAG_BANK_MASK.%B0; + END_IF; + + // 20 idlength + IF statCmd.CMD = eAxo_IID_COMMANDS#eWriteID OR statCmd.CMD = eAxo_IID_COMMANDS#eKillTag OR statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite OR statCmd.CMD = eAxo_IID_COMMANDS#eLockTagBank OR statCmd.CMD = eAxo_IID_COMMANDS#eEditBlacklist THEN + stHwConnect.Static.pnConfigRecord.record.buf[26] := statCmd.EXT_UHF.LEN_ID; + END_IF; + + // 21 - 83 EPC-ID + IF statCmd.CMD <> eAxo_IID_COMMANDS#eGetBlacklist AND statCmd.CMD <> eAxo_IID_COMMANDS#eReaderStatus THEN //T0300_04 + // MOVE_BLK(IN := statCmd.EPCID_UID[1], + // COUNT := BYTE_TO_UDINT(statCmd.EXT_UHF.LEN_ID), + // OUT => hw_connect.Static.pnConfigRecord.record.buf[27]); + + MEMCPY(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[27]) , srcAddr:=ADR(statCmd.EPCID_UID[1]) , n:=statCmd.EXT_UHF.LEN_ID ); + END_IF; + ELSE + // 12-19 UID + IF statCmd.CMD = eAxo_IID_COMMANDS#eFormat OR statCmd.CMD = eAxo_IID_COMMANDS#eTagStatus OR statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite THEN + // MOVE_BLK(IN := statCmd.EPCID_UID[1], + // COUNT := 8, + // OUT => hw_connect.Static.pnConfigRecord.record.buf[12]); + + MEMCPY(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[12]) , srcAddr:=ADR(statCmd.EPCID_UID[1]) , n:=8 ); + END_IF; + + // 32-33 Length + IF (statCmd.CMD = eAxo_IID_COMMANDS#ePut OR statCmd.CMD = eAxo_IID_COMMANDS#eFormat OR statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite OR statCmd.CMD = eAxo_IID_COMMANDS#eWriteConfig) THEN + // stHwConnect.Static.pnConfigRecord.record.buf[32] := WORD_TO_BYTE(SHR(statCmd.LEN_DATA,8)); + // stHwConnect.Static.pnConfigRecord.record.buf[33] := WORD_TO_BYTE(statCmd.LEN_DATA); + stHwConnect.Static.pnConfigRecord.record.buf[32] := statCmd.LEN_DATA.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[33] := statCmd.LEN_DATA.%B0; + END_IF; + + // 34-37 StartAddress + IF (statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite ) THEN + stHwConnect.Static.pnConfigRecord.record.buf[34] := statCmd.ADDR_TAG.%B3; + stHwConnect.Static.pnConfigRecord.record.buf[35] := statCmd.ADDR_TAG.%B2; + stHwConnect.Static.pnConfigRecord.record.buf[36] := statCmd.ADDR_TAG.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[37] := statCmd.ADDR_TAG.%B0; + END_IF; + END_IF; + + // 38 Attributes + IF statCmd.CMD = eAxo_IID_COMMANDS#eInventory OR statCmd.CMD = eAxo_IID_COMMANDS#eTagStatus OR statCmd.CMD = eAxo_IID_COMMANDS#eReaderStatus THEN + stHwConnect.Static.pnConfigRecord.record.buf[38] := statCmd.ATTRIBUTES; + END_IF; + + // duration and unit + IF statCmd.CMD = eAxo_IID_COMMANDS#eInventory AND stHwConnect.STATIC.instruction_set THEN + stHwConnect.Static.pnConfigRecord.record.buf[12] := TO_BYTE(stHwConnect.CM_CHANNEL); + + stHwConnect.Static.pnConfigRecord.record.buf[40] := statCmd.EXT_UHF.INVENTORY_DURATION.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[41] := statCmd.EXT_UHF.INVENTORY_DURATION.%B0; + stHwConnect.Static.pnConfigRecord.record.buf[42] := statCmd.EXT_UHF.INVENTORY_DUR_UNIT.%B1; + stHwConnect.Static.pnConfigRecord.record.buf[43] := statCmd.EXT_UHF.INVENTORY_DUR_UNIT.%B0; + END_IF; + + nTrlen := 0; + END_IF; + + // copy Data in buffer + IF statFurtherTelegram THEN + tempBufoffset := stHwConnect.STATIC.buf_header; + ELSE + tempBufoffset := stHwConnect.STATIC.buf_header + statSize; + END_IF; + IF tempI <> UINT#0 THEN + // IF NOT hw_connect.STATIC.STATUS_INITIALISATION THEN + + // IF TypeOfElements(txref) = Char THEN + + // FOR tempLoop := 0 TO tempI - 1 DO + // statLastMoveError := MOVE_BLK_VARIANT(SRC := txref, + // COUNT := 1, + // SRC_INDEX := statDataOffset + tempLoop, + // DEST_INDEX := 0, + // DEST => tempChar); + // hw_connect.Static.pnConfigRecord.record.buf[tempBufoffset + tempLoop] := CHAR_TO_BYTE(tempChar); + // END_FOR; + + // ELSE + + // statLastMoveError := MOVE_BLK_VARIANT(SRC := txref, + // COUNT := INT_TO_UDINT(tempI), + // SRC_INDEX := statDataOffset, + // DEST_INDEX := tempBufoffset, + // DEST => hw_connect.STATIC.buf); + // END_IF; + // ELSE + // statLastMoveError := MOVE_BLK_VARIANT(SRC := hw_connect.CONFIGURATION.param_buffer, + // COUNT := INT_TO_UDINT(tempI), + // SRC_INDEX := 0, + // DEST_INDEX := tempBufoffset, + // DEST => hw_connect.STATIC.buf); + // END_IF; + // // error at mov_blk + // IF statLastMoveError <> 0 THEN + // tempIntError := true; + // statIntStatus := 16#E7FE0400; + // EXIT; + // END_IF; + + MEMCPY( + destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[tempBufoffset]) , + srcAddr:=ADR(aTxref[statLowerBoundTxref + TO_DINT(statDataOffset)]) , + n:=TO_UDINT(tempI) ); + + END_IF; + + // save offset for further telegrams + statDataOffset := statDataOffset + tempI; + statDataTodo := statDataTodo - tempI; + nTrlen := nTrlen + tempI; + + statFurtherTelegram := false; + stHwConnect.STATIC.acyc_active := true; + // first call of wrrec + + stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(statBufLen); + stHwConnect.Static.pnConfigRecord.nRW := ADS_WRITE; + statAdsRdWrt.WRTRD := TRUE; + // statWRREC(REQ := TRUE, + // ID := WORD_TO_UINT(hw_connect.HW_ID), + // INDEX := hw_connect.STATIC.index, + // LEN := INT_TO_UINT(statBufLen), + // RECORD := hw_connect.STATIC.buf); + // // save error till next plc-cycle + // statSaveError := statWRREC.ERROR; + // statIntStatus := statWRREC.STATUS; + + stHwConnect.STATIC.state := STATE5; + + STATE5: //------------------------------------finish ADS WRITE-------------------------------------- + + // reset start request + statAdsRdWrt.WRTRD := FALSE; + + // error at WRREC + IF statAdsRdWrt.ERR OR statSaveAdsError THEN + + stHwConnect.STATIC.acyc_active := false; + + IF NOT statSaveAdsError THEN + tempStatus := TO_WORD(statAdsRdWrt.ERRID); + ELSE + tempStatus := TO_WORD(statIntAdsErrId); + END_IF; + // repeat if ressources are busy + IF tempStatus = ERRID_DEVICE_BUSY THEN + stHwConnect.STATIC.acyc_active := TRUE; + + stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(statBufLen); + stHwConnect.Static.pnConfigRecord.nRW := ADS_WRITE; + statAdsRdWrt.WRTRD := TRUE; + // statWRREC(REQ := TRUE, + // ID := WORD_TO_UINT(hw_connect.HW_ID), + // INDEX := hw_connect.STATIC.index, + // LEN := INT_TO_UINT(statBufLen), + // RECORD := hw_connect.STATIC.buf); + // statSaveError := statWRREC.ERROR; + // statIntStatus := statWRREC.STATUS; + + EXIT; + END_IF; + IF statPduDetection AND stHwConnect.STATIC.index_set THEN + // first pdu-detection with PROFINET-index was failed. try again with PROFIBUS-index + stHwConnect.STATIC.state := STATE2; + stHwConnect.STATIC.index := stHwConnect.CM_CHANNEL + UINT#100; + stHwConnect.STATIC.index_set := false; + statPduRepeat := true; + statSaveError := false; + ELSE + // any other error is occured => go to error_routine + tempIntError := true; + IF NOT statSaveError THEN + statIntStatus := statAdsRdWrt.ERRID; + ELSE + statSaveError := false; + END_IF; + EXIT; + END_IF; + // WRREC was finished wothout errors + ELSIF statAdsRdWrt.BUSY = FALSE AND NOT statAdsRdWrt.ERR = TRUE THEN + stHwConnect.STATIC.acyc_active := false; + IF statDataTodo > UDINT#0 THEN + // write next packet of command + stHwConnect.STATIC.state := STATE4; + statFurtherTelegram := true; + ELSE + // if chained comands => increase internal cmd_selektor and get next command //MN++++ + IF statCmd.CHAINED AND statCmdSelCounter < UINT#100 AND NOT stHwConnect.STATIC.STATUS_INITIALISATION THEN + statCmdSelCounter := statCmdSelCounter + UINT#1; + + statCmd := aCmdref[statCmdSelCounter]; + // statLastMoveError := MOVE_BLK_VARIANT(SRC := cmdref, + // COUNT := 1, + // SRC_INDEX := (statCmdSelCounter - 1), + // DEST_INDEX := 0, + // DEST => statCmd); + + + // IF statLastMoveError <> 0 THEN + // tempIntError := true; + // statIntStatus := 16#E7FE0B00; + // EXIT; + // END_IF; + + statChainedCounter := statChainedCounter + UINT#1; + stHwConnect.STATIC.state := STATE4; + statFurtherTelegram := false; + ELSE + // setup things to receive acknowledgement + statAdb := UINT#0; + stHwConnect.STATIC.state := STATE6; + END_IF; + END_IF; + END_IF; + + STATE6://---------------------wait for acknowledgement (CommandCounter) and start ADS READ--------------------------- + IF stHwConnect.STATIC.old_AC_H <> stHwConnect.STATIC.AC_H OR stHwConnect.STATIC.old_AC_L <> stHwConnect.STATIC.AC_L THEN + // remember acknowledge counter + stHwConnect.STATIC.old_AC_H := stHwConnect.STATIC.AC_H; + stHwConnect.STATIC.old_AC_L := stHwConnect.STATIC.AC_L; + // set sequence number for repeat command + IF stHwConnect.STATIC.RPTCMD_active THEN + IF (statChainedCounter = statFixChainedCounter) AND NOT statSqModified THEN //T0300_04 go in only once + stHwConnect.STATIC.sequence_number := stHwConnect.STATIC.sequence_number + statFixChainedCounter; + statSqModified := true; + END_IF; + END_IF; + + // copy over actual command + statCmd := aCmdref[(statCmdSelCounter - statChainedCounter) + UINT#1]; + // IF NOT hw_connect.STATIC.STATUS_INITIALISATION THEN + // // copy over actual command + // statCmd := CMDREF[(statCmdSelCounter - statChainedCounter) + 1]; + + // statLastMoveError := MOVE_BLK_VARIANT(SRC := cmdref, + // COUNT := 1, + // SRC_INDEX := (((statCmdSelCounter - statChainedCounter) + 1) - 1), + // DEST_INDEX := 0, + // DEST => statCmd); + + // ELSE + + // // build Reset command + // statCmd.CMD := eAxo_IID_COMMANDS#eWriteConfig; + // statCmd.CONFIG := hw_connect.CONFIGURATION.config_mode; + // IF hw_connect.CONFIGURATION.config_mode = 3 THEN + // statCmd.LEN_DATA := 16; + // ELSE + // statCmd.LEN_DATA := 0; + // END_IF; + // statCmd.ADDR_TAG := 0; + // statCmd.ATTRIBUTES := 0; + // statCmd.CHAINED := false; + // statCmd.EXT_UHF.EDIT_BLACKLIST_MODE := 0; + // statCmd.EXT_UHF.INVENTORY_DUR_UNIT := 0; + // statCmd.EXT_UHF.INVENTORY_DURATION := 0; + // statCmd.EXT_UHF.LEN_ID := 0; + // statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION := 0; + // statCmd.EXT_UHF.LOCK_TAG_BANK_MASK := 0; + // statCmd.EXT_UHF.MEM_BANK := 16#3; + // statCmd.EXT_UHF.PSWD := 0; + + // FILL_BLK(IN := TO_BYTE(16#00), + // COUNT := INT_TO_UINT(62), + // OUT => statCmd.EPCID_UID[1]); + + // END_IF; + + + + // IF statLastMoveError <> 0 THEN + // tempIntError := true; + // statIntStatus := 16#E7FE0B00; + // EXIT; + // END_IF; + + // got to next step => read answer + stHwConnect.STATIC.state := STATE7; + + // first call of rdrec + stHwConnect.STATIC.acyc_active := TRUE; + + stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(stHwConnect.STATIC.buf_max); + stHwConnect.Static.pnConfigRecord.nRW := ADS_READ; + statAdsRdWrt.WRTRD := TRUE; + + // statRDREC(REQ := TRUE, + // ID := WORD_TO_UINT(hw_connect.HW_ID), + // INDEX := hw_connect.STATIC.index, + // MLEN := INT_TO_UINT(hw_connect.STATIC.buf_max), + // RECORD := hw_connect.STATIC.buf); + // // save error till next plc-cycle + // statSaveError := statRDREC.ERROR; + // statIntStatus := statRDREC.STATUS; + + ELSIF stHwConnect.STATIC.RPTCMD_cyc AND NOT stHwConnect.STATIC.RPTCMD_active THEN + // check timeout for repeat support + // Change 03.00.02 + statTimeout(signal := FALSE, + duration := stHwConnect.STATIC.timeout_repeat); + + statTimeout(signal := TRUE, + duration := stHwConnect.STATIC.timeout_repeat); + IF statTimeout.output = TRUE THEN + // timeout of repeat + stHwConnect.STATIC.state := STATE4; + tempIntError := true; + statIntStatus := DWORD#16#E7FE0900; + END_IF; + END_IF; + + STATE7: //---------------------finish RDREC and receive data---------------------------- + // reset start request + statAdsRdWrt.WRTRD := FALSE; + statEmptyCycle := TRUE; + + + // error at RDREC + IF statAdsRdWrt.ERR OR statSaveAdsError THEN + + stHwConnect.STATIC.acyc_active := false; + + IF NOT statSaveAdsError THEN + tempStatus := TO_WORD(statAdsRdWrt.ERRID); + ELSE + tempStatus := TO_WORD(statIntAdsErrId); + END_IF; + // repeat if ressources are busy + IF tempStatus = ERRID_DEVICE_BUSY AND NOT statEmptyCycle THEN + stHwConnect.STATIC.acyc_active := TRUE; + + stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(stHwConnect.STATIC.buf_max); + stHwConnect.Static.pnConfigRecord.nRW := ADS_READ; + statAdsRdWrt.WRTRD := TRUE; + // statWRREC(REQ := TRUE, + // ID := WORD_TO_UINT(hw_connect.HW_ID), + // INDEX := hw_connect.STATIC.index, + // LEN := INT_TO_UINT(statBufLen), + // RECORD := hw_connect.STATIC.buf); + // statSaveError := statWRREC.ERROR; + // statIntStatus := statWRREC.STATUS; + + EXIT; + END_IF; + + + IF statPduDetection = TRUE THEN + // error, PDU detection not supported; + // DO normal write-config + statPduDetection := FALSE; + statPduRepeat := false; + stHwConnect.STATIC.state := STATE4; + statSaveError := FALSE; + statSaveAdsError := FALSE; + ELSE + // any other error is occured => go to error_routine + tempIntError := true; + IF NOT statSaveError THEN + statIntStatus := statAdsRdWrt.ERRID; + ELSE + statSaveError := FALSE; + statSaveAdsError := FALSE; + END_IF; + EXIT; + END_IF; + // RDREC was finished without errors + ELSIF NOT statAdsRdWrt.BUSY AND NOT statAdsRdWrt.ERR THEN + stHwConnect.STATIC.acyc_active := false; + + // check error byte + tempB := stHwConnect.Static.pnConfigRecord.record.buf[5]; + + // Read ADB to check at error MN++++ + // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[7]); + // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[6]),8); + // tempAdb := WORD_TO_UINT(tempW); + tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[7]; + tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[6]; + tempAdb := TO_UINT(tempW); + + // Read DBN to check at error MN++++ + // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[9]); + // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[8]),8); + // tempDbn := WORD_TO_UINT(tempW); + + tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[9]; + tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[8]; + tempDbn := TO_UINT(tempW); + + IF tempB = BYTE#1 THEN + // pib unit response with error + IF statPduDetection = TRUE THEN + IF stHwConnect.STATIC.config_value = BYTE#4 THEN + // new index will suppport, but not config=4. try again with same index and config=0 + stHwConnect.STATIC.state := STATE0; + stHwConnect.STATIC.config_value := BYTE#0; + stHwConnect.STATIC.INIT_cyc := TRUE; + statPduRepeat := TRUE; + EXIT; + ELSE + // error, PDU detection not supported or PDU detection is finished; + // DO normal write-config + statPduDetection := FALSE; + statPduRepeat := false; + stHwConnect.STATIC.state := STATE4; + stHwConnect.STATIC.buf_max := UINT#240; + stHwConnect.STATIC.buf_maxdata := stHwConnect.STATIC.buf_max - stHwConnect.STATIC.buf_header; + EXIT; + END_IF; + ELSE + // any other error is occured => go to error_routine + tempIntError := true; + // save PIB-Status + // statIntStatus := TO_DWORD(stHwConnect.Static.pnConfigRecord.record.buf[11 + 3]); + // statIntStatus := statIntStatus OR SHL(TO_DWORD(stHwConnect.Static.pnConfigRecord.record.buf[11 + 2]),8); + // statIntStatus := statIntStatus OR SHL(TO_DWORD(stHwConnect.Static.pnConfigRecord.record.buf[11 + 1]),16); + // statIntStatus := statIntStatus OR SHL(TO_DWORD(stHwConnect.Static.pnConfigRecord.record.buf[11]),24); + + tempDword.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[14]; + tempDword.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[13]; + tempDword.%B2 := stHwConnect.Static.pnConfigRecord.record.buf[12]; + tempDword.%B3 := stHwConnect.Static.pnConfigRecord.record.buf[11]; + statIntStatus := tempDword; + + EXIT; + END_IF; + ELSE + // yeah, anything ok + IF tempB <> BYTE#0 THEN + // except a tiny warning + bWarning := TRUE; + statIntStatus := DWORD#16#F0FE0000; + nStatus := statIntStatus OR tempB; + END_IF; + + // check sequence number + // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[3]); + // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[2]),8); + // tempI := WORD_TO_UINT(tempW); + + tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[3]; + tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[2]; + tempI := TO_UINT(tempW); + + IF tempI <> ((stHwConnect.STATIC.sequence_number - statChainedCounter) + UINT#1) THEN + // sequenz number don't match + tempIntError := TRUE; + statIntStatus := DWORD#16#E5FE0200; + EXIT; + END_IF; + + // check command codex + IF stHwConnect.Static.pnConfigRecord.record.buf[4] <> TO_BYTE(statCmd.CMD) THEN + // command codex dont match + tempIntError := TRUE; + statIntStatus := DWORD#16#E5FE0A00; + EXIT; + END_IF; + + // PDU-detection: first telegramm of write-config. + IF statPduDetection = TRUE THEN + // look for supported PDU size + IF TO_INT(stHwConnect.Static.pnConfigRecord.record.buf[10]) >= 1 AND TO_INT(stHwConnect.Static.pnConfigRecord.record.buf[10]) <= 3 THEN + + aRxref[statLowerBoundRxref + TO_DINT(statRecvOffset)] := stHwConnect.Static.pnConfigRecord.record.buf[11]; + + // statLastMoveError := MOVE_BLK_VARIANT(SRC := hw_connect.STATIC.buf, + // COUNT := 1, + // SRC_INDEX := 11, + // DEST_INDEX := statRecvOffset, + // DEST => rxref); + + // // error at mov_blk + // IF statLastMoveError <> 0 THEN + // tempIntError := true; + // statIntStatus := 16#E7FE0400; + // EXIT; + // END_IF; + + // Config = 0 + IF stHwConnect.STATIC.config_value = BYTE#0 THEN + nTrlen := 1; + tempI := TO_UINT(stHwConnect.Static.pnConfigRecord.record.buf[11]); + tempMax := UINT#240; + // Config = 4 + ELSIF stHwConnect.STATIC.config_value = BYTE#4 THEN + aRxref[statLowerBoundRxref + TO_DINT(statRecvOffset) + 1] := stHwConnect.Static.pnConfigRecord.record.buf[12]; //aufpassen++++ + + // statLastMoveError := MOVE_BLK_VARIANT(SRC := hw_connect.STATIC.buf, + // COUNT := 1, + // SRC_INDEX := 12, + // DEST_INDEX := statRecvOffset + 1, + // DEST => rxref); + // // error at mov_blk + // IF statLastMoveError <> 0 THEN + // tempIntError := true; + // statIntStatus := 16#E7FE0400; + // EXIT; + // END_IF; + + + nTrlen := 2; + // tempI := WORD_TO_UINT(stHwConnect.Static.pnConfigRecord.record.buf[12]); + // tempI := WORD_TO_UINT(UINT_TO_WORD(tempI) OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[11]),8)); + tempW.%B0:= stHwConnect.Static.pnConfigRecord.record.buf[12]; + tempW.%B1:= stHwConnect.Static.pnConfigRecord.record.buf[11]; + tempI := TO_UINT(tempW); + + tempMax := UINT#1035; + END_IF; + // check if PDU-size is valid + IF tempI < UINT#64 OR tempI > tempMax THEN + IF tempI <> UINT#0 THEN + tempIntError := TRUE; + statIntStatus := DWORD#16#E7FE0A00; + EXIT; + ELSE + stHwConnect.STATIC.buf_max := UINT#240; + END_IF; + ELSE + stHwConnect.STATIC.buf_max := tempI; + END_IF; + END_IF; + // set user data size + stHwConnect.STATIC.buf_maxdata := stHwConnect.STATIC.buf_max - stHwConnect.STATIC.buf_header; + + // instruction set detection + // IF stHwConnect.Static.pnConfigRecord.record.buf[10] = 3 AND ((stHwConnect.Static.pnConfigRecord.record.buf[13] AND 20000_0001) = 1) THEN + IF stHwConnect.Static.pnConfigRecord.record.buf[10] = BYTE#3 AND stHwConnect.Static.pnConfigRecord.record.buf[13].%X0 THEN + // ext_uhf insrtuctions + stHwConnect.STATIC.instruction_set := TRUE; + + aRxref[statLowerBoundRxref + TO_DINT(statRecvOffset) + 2] := stHwConnect.Static.pnConfigRecord.record.buf[13]; + // statLastMoveError := MOVE_BLK_VARIANT(SRC := hw_connect.STATIC.buf, + // COUNT := 1, + // SRC_INDEX := 13, + // DEST_INDEX := statRecvOffset + 2, + // DEST => rxref); + // // error at mov_blk + // IF statLastMoveError <> 0 THEN + // tempIntError := true; + // statIntStatus := 16#E7FE0400; + // EXIT; + // END_IF; + + nTrlen := 3; + ELSE + // normal instructions + stHwConnect.STATIC.instruction_set := false; + END_IF; + // do normal write-config + statDbn := UINT#0; + statPduDetection := FALSE; + stHwConnect.STATIC.state := STATE4; + EXIT; + END_IF; + + // check/process adb + // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[7]); + // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[6]),8); + tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[7]; + tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[6]; + + IF statAdb = UINT#0 THEN + statAdb := TO_UINT(tempW); + // simple_read-bit not used because of chained commands + // IF simple_read THEN + // IF adb <> 1 THEN + // int_error := true; + // int_status := 16#E5FE0A00; + // EXIT; + // END_IF; + // END_IF; + ELSE + tempI := TO_UINT(tempW); + IF statAdb <> tempI THEN + tempIntError := true; + statIntStatus := DWORD#16#E5FE0A00; + EXIT; + END_IF; + END_IF; + + // check dbn, determining next state + // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[9]); + // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[8]),8); + // statDbn := WORD_TO_UINT(tempW); + tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[9]; + tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[8]; + statDbn := TO_UINT(tempW); + + IF statDbn < statAdb THEN + // read next + tempFinished := false; + ELSIF statDbn = statAdb THEN + // command completed + tempFinished := true; + ELSE + tempIntError := true; + statIntStatus := DWORD#16#E5FE0500; + EXIT; + END_IF; + + IF statDbn = UINT#1 THEN + // set offset of receive_buffer for first telegram of command + statRecvOffset := statCmd.OFFSETBUFFER; + IF statCmd.CMD = eAxo_IID_COMMANDS#eInventory THEN + IF statCmd.ATTRIBUTES = BYTE#16#82 OR statCmd.ATTRIBUTES = BYTE#16#83 OR statCmd.ATTRIBUTES = BYTE#16#85 OR statCmd.ATTRIBUTES = BYTE#16#90 OR statCmd.ATTRIBUTES = BYTE#16#91 + OR statCmd.ATTRIBUTES = BYTE#16#92 OR statCmd.ATTRIBUTES = BYTE#16#A0 OR statCmd.ATTRIBUTES = BYTE#16#A1 THEN + tempShift := true; + END_IF; + END_IF; + IF statCmd.CMD = eAxo_IID_COMMANDS#eReaderStatus THEN + IF statCmd.ATTRIBUTES = BYTE#16#A0 OR statCmd.ATTRIBUTES = BYTE#16#A1 THEN + tempShift := true; + END_IF; + END_IF; + IF statCmd.CMD = eAxo_IID_COMMANDS#eTagStatus THEN + IF statCmd.ATTRIBUTES = BYTE#16#04 OR statCmd.ATTRIBUTES = BYTE#16#82 OR statCmd.ATTRIBUTES = BYTE#16#83 OR statCmd.ATTRIBUTES = BYTE#16#84 OR statCmd.ATTRIBUTES = BYTE#16#85 THEN + tempShift := true; + END_IF; + END_IF; + IF tempShift THEN + statRecvOffset := statRecvOffset + UDINT#1; + tempZeroValue := BYTE#0; + // IF TypeOfElements(rxref) = Char THEN + // statLastMoveError := MOVE_BLK_VARIANT(SRC := BYTE_TO_CHAR(tempZeroValue), COUNT := 1, SRC_INDEX := 0, DEST_INDEX := (statRecvOffset - 1), DEST => rxref); + // ELSE + // statLastMoveError := MOVE_BLK_VARIANT(SRC := tempZeroValue, COUNT := 1, SRC_INDEX := 0, DEST_INDEX := (statRecvOffset - 1), DEST => rxref); + // END_IF; + + aRxref[statLowerBoundRxref + TO_DINT(statRecvOffset) - 1] := tempZeroValue; + + IF statLastMoveError <> 0 THEN + tempIntError := true; + statIntStatus := DWORD#16#E7FE0400; + EXIT; + END_IF; + END_IF; + END_IF; + + // check dbl // if PDU > 240, length is only in byte 0 and 1 + IF stHwConnect.STATIC.buf_max > UINT#240 THEN + // statSize := TO_UINT(stHwConnect.Static.pnConfigRecord.record.buf[1]); + // statSize := TO_UINT(TO_WORD(statSize) OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[0]),8)); + tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[1]; + tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[0]; + statSize := TO_UINT(tempW); + ELSE + statSize := TO_UINT(stHwConnect.Static.pnConfigRecord.record.buf[10]); + END_IF; + IF statSize > stHwConnect.STATIC.buf_maxdata THEN + // invalid data block length + tempIntError := true; + statIntStatus := DWORD#16#E5FE0700; + EXIT; + ELSIF statSize > UINT#0 AND statDbn = UINT#1 THEN + // data arrived, first packet -> reset TRLEN + nTrlen := 0; + END_IF; + + IF statSize > UINT#0 THEN + // recv_offset was adjusted by RXSTART + tempLi := statRxbuflen - statRecvOffset; + IF statSize > tempLi THEN + // not enough space in buffer + tempIntError := true; + statIntStatus := DWORD#16#E7FE0400; + EXIT; + ELSE + // anything ok, copy over data + + MEMCPY( + destAddr:=ADR(aRxref[statLowerBoundRxref + UDINT_TO_DINT(statRecvOffset)]) , + srcAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[stHwConnect.STATIC.buf_header]) , + n:=UINT_TO_UDINT(statSize)); + // IF TypeOfElements(txref) = Char THEN + // FOR tempLoop := 0 TO statSize - 1 DO + + // tempChar := BYTE_TO_CHAR(hw_connect.Static.pnConfigRecord.record.buf[hw_connect.STATIC.buf_header + tempLoop]); + + // statLastMoveError := MOVE_BLK_VARIANT(SRC := tempChar, + // COUNT := 1, + // SRC_INDEX := 0, + // DEST_INDEX := statRecvOffset + tempLoop, + // DEST => rxref); + // END_FOR; + // ELSE + + // statLastMoveError := MOVE_BLK_VARIANT(SRC := hw_connect.STATIC.buf, + // COUNT := INT_TO_UDINT(statSize), + // SRC_INDEX := hw_connect.STATIC.buf_header, + // DEST_INDEX := statRecvOffset, + // DEST => rxref); + + // END_IF; + // // error at mov_blk + // IF statLastMoveError <> 0 THEN + // tempIntError := true; + // statIntStatus := 16#E7FE0400; + // EXIT; + // END_IF; + + statRecvOffset := statRecvOffset + statSize; + nTrlen := nTrlen + statSize; + // add one to length if a zero-byte was added in buffer + IF tempShift THEN + nTrlen := nTrlen + 1; + tempShift := false; + END_IF; + END_IF; + END_IF; + + // read next telegram + IF NOT tempFinished THEN + stHwConnect.STATIC.state := STATE6; + ELSE + // -command- complete + //Change 03.00.02 + + // if chained commands => decrease chained counter + IF statChainedCounter > UINT#1 THEN + statChainedCounter := statChainedCounter - UINT#1; + stHwConnect.STATIC.state := STATE6; + statAdb := UINT#0; + EXIT; + ELSE + stHwConnect.STATIC.state := STATE4; + + // map input RPTCMD to RPTCMD_cyc + stHwConnect.STATIC.RPTCMD_cyc := bRepeatCommand; + + IF statChainedStatus <> DWORD#0 THEN + tempIntError := true; + EXIT; + END_IF; + END_IF; + + // set outputs + bDone := TRUE; + bBusy := FALSE; + bError := FALSE; + // reset pib-status-variables + stHwConnect.STATIC.STATUS_IN_WORK := false; + stHwConnect.STATIC.STATUS_INITIALISATION := false; + END_IF; + END_IF; + END_IF; + STATE8: //---------------------end of soft reset---------------------------- + IF NOT stHwConnect.STATIC.SRESET_active THEN + // reset command counter + stHwConnect.STATIC.old_CC_H := FALSE; + stHwConnect.STATIC.old_CC_L := FALSE; + // remember acknowledge counter + stHwConnect.STATIC.old_AC_H := stHwConnect.STATIC.AC_H; + stHwConnect.STATIC.old_AC_L := stHwConnect.STATIC.AC_L; + // reset chained counter + statChainedCounter := UINT#1; + statFixChainedCounter := UINT#1; + + // reset status-variables + stHwConnect.STATIC.STATUS_IN_WORK := FALSE; + stHwConnect.STATIC.STATUS_INITIALISATION := FALSE; + // reset state-variable + stHwConnect.STATIC.state := STATE4; + + // drop repeat + stHwConnect.STATIC.RPTCMD_cyc := FALSE; + bRepeatActive := FALSE; + // set outputs + bDone := TRUE; + bBusy := FALSE; + bError := FALSE; + nStatus := DWORD#0; + END_IF; + + ELSE + tempIntError := true; + statIntStatus := DWORD#16#E7FE0801; + END_CASE; + END_FOR; + END_IF; + + // check for timeout of pdu_detection + IF statPduDetection THEN + statTimeout(signal := TRUE, + duration := stHwConnect.STATIC.timeout_reset); + IF statTimeout.output = TRUE THEN + tempIntError := TRUE; + statIntStatus := DWORD#16#E7FE0800; + END_IF; + END_IF; + + + //set pn information + stHwConnect.Static.pnConfigRecord.nApi := stHwConnect.API; + stHwConnect.Static.pnConfigRecord.nSlot := stHwConnect.SLOT; + stHwConnect.Static.pnConfigRecord.nSubslot := stHwConnect.SUB_SLOT; + stHwConnect.Static.pnConfigRecord.nNrAr := stHwConnect.AR_NUMBER; + stHwConnect.Static.pnConfigRecord.record.nIndex := TO_WORD(stHwConnect.Static.index); + + statAdsRdWrt( + NETID:= stHwConnect.AMS_NET_ID, + PORT:= stHwConnect.PORT, + IDXGRP:= 16#0000_F823, + IDXOFFS:= 16#0000_0000, + WRITELEN:= stHwConnect.Static.pnConfigRecord.record.nLen + PN_CONFIGRECORD_HEADER_LEN, + READLEN:= stHwConnect.Static.pnConfigRecord.record.nLen, + SRCADDR:= ADR(stHwConnect.Static.pnConfigRecord), + DESTADDR:= ADR(stHwConnect.Static.pnConfigRecord.record.buf), + // WRTRD:= , + TMOUT:= ADS_TIMEOUT//, + // BUSY=> , + // ERR=> , + // ERRID=> + ); + + statEmptyCycle := FALSE; + + // save istantly rising errors for statemachine + statSaveAdsError := statAdsRdWrt.ERR; + statIntAdsErrId := statAdsRdWrt.ERRID; + + + + // error handling + IF tempIntError THEN + // if chain is not at the end don't finish the block + IF (statChainedCounter > UINT#16#01) AND (stHwConnect.STATIC.state > UINT#16#05) THEN + statChainedCounter := statChainedCounter - UINT#1; + stHwConnect.STATIC.state := STATE6; + statAdb := UINT#0; + // save only first error-status in a chain + IF statChainedStatus = DWORD#16#0 THEN + statChainedStatus := statIntStatus; + END_IF; + //Send all telegrams of one Command //Change 03.00.01 + //ELSIF tempDbn < tempAdb AND hw_connect.Static.state = STATE7 THEN //Change 03.00.05 + // hw_connect.Static.state := STATE6; + ELSE + // reset pib-status-variables + stHwConnect.STATIC.STATUS_IN_WORK := false; + stHwConnect.STATIC.STATUS_INITIALISATION := false; + tempIntError := false; + stHwConnect.STATIC.state := STATE4; + statPduDetection := false; + + // if error occured at chain, put the first error-status out + IF statChainedStatus <> DWORD#16#0 THEN + statIntStatus := statChainedStatus; + statChainedStatus := DWORD#16#0; + END_IF; + + // set output variables + bDone := FALSE; + bBusy := FALSE; + bError := TRUE; + nStatus := statIntStatus; + + // save last status + timestamp + statLastErrorStatus := statIntStatus; + + END_IF; + END_IF; + ELSE + statErrorCounter := statErrorCounter + 1; + END_IF; + + END_METHOD + END_CLASS +END_NAMESPACE +*) \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/eAxo_IID_COMMANDS.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/eAxo_IID_COMMANDS.st new file mode 100644 index 000000000..1954962b5 --- /dev/null +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/eAxo_IID_COMMANDS.st @@ -0,0 +1,22 @@ +NAMESPACE AXOpen.Components.Siemens.Identification + TYPE PUBLIC + eAxo_IID_COMMANDS : WORD + ( + eNoCommand := WORD#16#00, + eRead := WORD#16#70, + eWrite := WORD#16#71, + eReaderStatus := WORD#16#74, + eTagStatus := WORD#16#73, + eInventory := WORD#16#69, + eFormat := WORD#16#66, + ePut := WORD#16#65, + eWriteID := WORD#16#67, + eKillTag := WORD#16#6A, + eLockTagBank := WORD#16#79, + eEditBlacklist := WORD#16#7A, + eGetBlacklist := WORD#16#6C, + eReadConfig := WORD#16#61, + eWriteConfig := WORD#16#78 + ); + END_TYPE +END_NAMESPACE \ No newline at end of file From 4d6a6b951d06e0b05b508cea31f0ae8fd5e1dae8 Mon Sep 17 00:00:00 2001 From: TK <61820360+TomKovac@users.noreply.github.com> Date: Wed, 14 Feb 2024 17:03:47 +0100 Subject: [PATCH 6/7] kuka krc4 --- .../ctrl/src/AxoIrc5_v_1_x_x.st | 5 +- .../ctrl/src/AxoOmnicore_v_1_x_x.st | 5 +- .../app/src/IO/PLC_LINE/HwIdentifiers.st | 1 - .../ctrl/assets/GSDML-019B-0300-KRC.bmp | Bin 0 -> 1558 bytes ...-V2.33-KUKA-KRC4-ProfiNet_5.0-20181102.xml | 2664 +++++++++++++++++ .../ctrl/src/AxoKrc4_v_5_x_x.st | 569 ++-- .../AxoKrc4_v_5_x_x/AxoKrc4_v_5_x_x.cs | 122 +- ...xoKukaRobotics_Component_Status_v_5_x_x.cs | 102 +- .../ctrl/src/AxoCr800_v_1_x_x.st | 1 + 9 files changed, 3068 insertions(+), 401 deletions(-) create mode 100644 src/components.kuka.robotics/ctrl/assets/GSDML-019B-0300-KRC.bmp create mode 100644 src/components.kuka.robotics/ctrl/assets/GSDML-V2.33-KUKA-KRC4-ProfiNet_5.0-20181102.xml diff --git a/src/components.abb.robotics/ctrl/src/AxoIrc5_v_1_x_x.st b/src/components.abb.robotics/ctrl/src/AxoIrc5_v_1_x_x.st index e91970a2c..a38446548 100644 --- a/src/components.abb.robotics/ctrl/src/AxoIrc5_v_1_x_x.st +++ b/src/components.abb.robotics/ctrl/src/AxoIrc5_v_1_x_x.st @@ -1082,12 +1082,11 @@ NAMESPACE AXOpen.Components.Abb.Robotics IF Outputs.ActionNo = Inputs.ActionNo THEN _progress := 663; - StartMovementsTask.DoneWhen(TRUE); END_IF; END_IF; IF _progress = 663 THEN - _progress := 663; + _progress := 0; StartMovementsTask.DoneWhen(TRUE); END_IF; THIS.CallTimers(TRUE); @@ -1239,7 +1238,7 @@ NAMESPACE AXOpen.Components.Abb.Robotics END_IF; END_IF; - IF _progress = 381 THEN + IF _progress = 382 THEN StopMotorsTask.DoneWhen(TRUE); THIS.CallTimers(FALSE); _progress := 0; diff --git a/src/components.abb.robotics/ctrl/src/AxoOmnicore_v_1_x_x.st b/src/components.abb.robotics/ctrl/src/AxoOmnicore_v_1_x_x.st index 5c48c5087..2796e09cc 100644 --- a/src/components.abb.robotics/ctrl/src/AxoOmnicore_v_1_x_x.st +++ b/src/components.abb.robotics/ctrl/src/AxoOmnicore_v_1_x_x.st @@ -1082,12 +1082,11 @@ NAMESPACE AXOpen.Components.Abb.Robotics IF Outputs.ActionNo = Inputs.ActionNo THEN _progress := 663; - StartMovementsTask.DoneWhen(TRUE); END_IF; END_IF; IF _progress = 663 THEN - _progress := 663; + _progress := 0; StartMovementsTask.DoneWhen(TRUE); END_IF; THIS.CallTimers(TRUE); @@ -1239,7 +1238,7 @@ NAMESPACE AXOpen.Components.Abb.Robotics END_IF; END_IF; - IF _progress = 381 THEN + IF _progress = 382 THEN StopMotorsTask.DoneWhen(TRUE); THIS.CallTimers(FALSE); _progress := 0; diff --git a/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st b/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st index c16d3cc61..feaab441c 100644 --- a/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st +++ b/src/components.kuka.robotics/app/src/IO/PLC_LINE/HwIdentifiers.st @@ -19,7 +19,6 @@ TYPE KRC4_Interface1 := WORD#259, KRC4_Interface1_Port1 := WORD#260, KRC4_KRC4_ProfiNet_5_0 := WORD#261, - KRC4_64_safe_digital_in_and_outputs_2_4_1 := WORD#263, KRC4_512_digital_in_and_outputs_1 := WORD#265, NONE:= WORD#0 ); diff --git a/src/components.kuka.robotics/ctrl/assets/GSDML-019B-0300-KRC.bmp b/src/components.kuka.robotics/ctrl/assets/GSDML-019B-0300-KRC.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f123dd9b8b5a3f0dd72c735bd12c7a0343ef5b7 GIT binary patch literal 1558 zcmeHFu};J=3=I-6GV%@Vx6lcRfsNl`uEdf|85k~Bhw=|BjXKbQf1;-w%zJi$W4U8J z>C!rWNuKTaDff@pm%+vp<{Q|<;?Kgl?Y~}x@Nwm48$VMU0{+mp?l1$w+AvKM4%Ggj zN(95lEv^rb6KB6h$EnX8vuYf&&Tp&L3-BD#W{i2D2f*9d3XTO+6^^WFt@ + + + PROFINET Device Profile + 1.00 + Device Profile for PROFINET Devices + PROFIBUS Nutzerorganisation e. V. (PNO) + Device + + 4 + 1 + GSDML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components.kuka.robotics/ctrl/src/AxoKrc4_v_5_x_x.st b/src/components.kuka.robotics/ctrl/src/AxoKrc4_v_5_x_x.st index 310ee00e3..584c60d09 100644 --- a/src/components.kuka.robotics/ctrl/src/AxoKrc4_v_5_x_x.st +++ b/src/components.kuka.robotics/ctrl/src/AxoKrc4_v_5_x_x.st @@ -336,8 +336,8 @@ NAMESPACE AXOpen.Components.Kuka.Robotics THIS.Restore(); END_IF; //**************************************** -(* - //*************StartAtMainTask*************** + + //*************StartAtMainTask************ StartAtMainTask.IsDisabled := _stopTasksAreActive; IF StartAtMainTask.StartTriggered() THEN RobotStatus.Action.Id := UINT#100; @@ -354,12 +354,12 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 300 THEN - TaskMessenger.ActivateOnCondition(ULINT#600, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#500, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#600; + RobotStatus.Error.Id := UINT#500; END_IF; - Outputs.StartAtMain := _blink.output; + Outputs.StartAtMain := NOT Inputs.PpMoved AND _blink.output; IF Inputs.PpMoved THEN THIS.CallTimers(FALSE); @@ -397,6 +397,7 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; //******************************************* + //***********StartMotorsAndProgramTask******* StartMotorsAndProgramTask.IsDisabled := _stopTasksAreActive OR StartProgramTask.IsBusy() OR StartMotorsTask.IsBusy(); IF StartMotorsAndProgramTask.StartTriggered() THEN @@ -414,107 +415,108 @@ NAMESPACE AXOpen.Components.Kuka.Robotics _progress := 310; END_IF; - IF _progress = 310 THEN //Switching to auto - TaskMessenger.ActivateOnCondition(ULINT#610, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 310 THEN + TaskMessenger.ActivateOnCondition(ULINT#510, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#610; + RobotStatus.Error.Id := UINT#510; END_IF; - IF Inputs.AutoOn THEN + IF Inputs.UserSafetySwitchClosed THEN THIS.CallTimers(FALSE); _progress := 311; END_IF; END_IF; - IF _progress = 311 THEN //Reseting error - TaskMessenger.ActivateOnCondition(ULINT#611, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 311 THEN + TaskMessenger.ActivateOnCondition(ULINT#511, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#611; + RobotStatus.Error.Id := UINT#511; END_IF; - Outputs.ResetError := Inputs.Error AND _blink.output; - - IF NOT Inputs.Error THEN - Outputs.ResetError:=FALSE; + IF Inputs.AlarmStopActive THEN THIS.CallTimers(FALSE); _progress := 312; END_IF; END_IF; - IF _progress = 312 THEN //Reseting emergency stop error - TaskMessenger.ActivateOnCondition(ULINT#612, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 312 THEN + TaskMessenger.ActivateOnCondition(ULINT#512, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#612; + RobotStatus.Error.Id := UINT#512; END_IF; - Outputs.ResetEmgStop := Inputs.EmgStop AND _blink.output; + Outputs.DrivesOff:=TRUE; + Outputs.DrivesOn:=_blink.output; - IF NOT Inputs.EmgStop THEN - Outputs.ResetEmgStop:=FALSE; + IF Inputs.DrivesReady THEN + Outputs.DrivesOn:=FALSE; THIS.CallTimers(FALSE); _progress := 313; END_IF; END_IF; IF _progress = 313 THEN - TaskMessenger.ActivateOnCondition(ULINT#613, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#513, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#613; + RobotStatus.Error.Id := UINT#513; END_IF; - Outputs.MotorOnAndStart:=_blink.output; - - IF Inputs.Error THEN - THIS.CallTimers(FALSE); - _progress := 310; - END_IF; + Outputs.ErrorConfirmation := Inputs.StopMess AND _blink.output; - IF Inputs.MotorOnState THEN + IF NOT Inputs.StopMess THEN THIS.CallTimers(FALSE); _progress := 314; END_IF; END_IF; IF _progress = 314 THEN - TaskMessenger.ActivateOnCondition(ULINT#614, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#514, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#614; + RobotStatus.Error.Id := UINT#514; END_IF; - Outputs.MotorOnAndStart:=_blink.output; - - IF Inputs.Error THEN - THIS.CallTimers(FALSE); - _progress := 310; - END_IF; + Outputs.MoveEnable:=TRUE; - IF Inputs.CycleOn THEN + IF Inputs.RcReady THEN THIS.CallTimers(FALSE); _progress := 315; END_IF; END_IF; IF _progress = 315 THEN - TaskMessenger.ActivateOnCondition(ULINT#615, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#515, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#615; + RobotStatus.Error.Id := UINT#515; END_IF; - Outputs.MotorOnAndStart:=_blink.output; + Outputs.ActivateInterface:=TRUE; - IF NOT Inputs.Error THEN - THIS.CallTimers(FALSE); - _progress := 310; - END_IF; - - IF NOT Inputs.Error THEN + IF Inputs.InterfaceActivated THEN THIS.CallTimers(FALSE); - Outputs.MotorOnAndStart := FALSE; _progress := 316; END_IF; END_IF; IF _progress = 316 THEN + TaskMessenger.ActivateOnCondition(ULINT#516, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#516; + END_IF; + + IF Inputs.StopMess OR Inputs.AlarmStopActive OR NOT Inputs.RcReady THEN + _progress := 310; + END_IF; + + Outputs.ExternalStart:=_blink.output; + + IF Inputs.ProActive THEN + Outputs.ExternalStart:=FALSE; + THIS.CallTimers(FALSE); + _progress := 317; + END_IF; + END_IF; + + IF _progress = 317 THEN StartMotorsAndProgramTask.DoneWhen(TRUE); THIS.CallTimers(FALSE); _progress := 0; @@ -543,7 +545,7 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; //******************************************* - //***********StartMotorsProgramAndMovementsTask******* + //****StartMotorsProgramAndMovementsTask***** StartMotorsProgramAndMovementsTask.IsDisabled := _stopTasksAreActive OR StartProgramTask.IsBusy() OR StartMotorsTask.IsBusy() OR StartMovementsTask.IsBusy(); IF StartMotorsProgramAndMovementsTask.StartTriggered() THEN RobotStatus.Action.Id := UINT#120; @@ -554,117 +556,117 @@ NAMESPACE AXOpen.Components.Kuka.Robotics _blink.Blink(Context := _context, inOnTime:=T#500MS,inOffTime:=T#500MS); IF _progress = 0 THEN - RobotStatus.Error.Id := UINT#0; + RobotStatus.Error.Id := UINT#0; TaskMessenger.Restore(); THIS.CallTimers(FALSE); _progress := 320; END_IF; - IF _progress = 320 THEN //Switching to auto - TaskMessenger.ActivateOnCondition(ULINT#620, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 320 THEN + TaskMessenger.ActivateOnCondition(ULINT#520, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#620; + RobotStatus.Error.Id := UINT#520; END_IF; - - IF Inputs.AutoOn THEN + IF Inputs.UserSafetySwitchClosed THEN THIS.CallTimers(FALSE); _progress := 321; END_IF; END_IF; - IF _progress = 321 THEN //Reseting error - TaskMessenger.ActivateOnCondition(ULINT#621, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 321 THEN + TaskMessenger.ActivateOnCondition(ULINT#521, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#621; + RobotStatus.Error.Id := UINT#521; END_IF; - Outputs.ResetError := Inputs.Error AND _blink.output; - - IF NOT Inputs.Error THEN - Outputs.ResetError:=FALSE; + IF Inputs.AlarmStopActive THEN THIS.CallTimers(FALSE); _progress := 322; END_IF; END_IF; - IF _progress = 322 THEN //Reseting emergency stop error - TaskMessenger.ActivateOnCondition(ULINT#622, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 322 THEN + TaskMessenger.ActivateOnCondition(ULINT#522, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#622; + RobotStatus.Error.Id := UINT#522; END_IF; - Outputs.ResetEmgStop := Inputs.EmgStop AND _blink.output; + Outputs.DrivesOff:=TRUE; + Outputs.DrivesOn:=_blink.output; - IF NOT Inputs.EmgStop THEN - Outputs.ResetEmgStop:=FALSE; + IF Inputs.DrivesReady THEN + Outputs.DrivesOn:=FALSE; THIS.CallTimers(FALSE); _progress := 323; END_IF; END_IF; IF _progress = 323 THEN - TaskMessenger.ActivateOnCondition(ULINT#623, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#523, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#623; + RobotStatus.Error.Id := UINT#523; END_IF; - Outputs.MotorOnAndStart:=_blink.output; - - IF Inputs.Error THEN - THIS.CallTimers(FALSE); - _progress := 320; - END_IF; + Outputs.ErrorConfirmation := Inputs.StopMess AND _blink.output; - IF Inputs.MotorOnState THEN + IF NOT Inputs.StopMess THEN THIS.CallTimers(FALSE); _progress := 324; END_IF; END_IF; IF _progress = 324 THEN - TaskMessenger.ActivateOnCondition(ULINT#624, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#524, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#624; + RobotStatus.Error.Id := UINT#524; END_IF; - Outputs.MotorOnAndStart:=_blink.output; - - IF Inputs.Error THEN - THIS.CallTimers(FALSE); - _progress := 320; - END_IF; + Outputs.MoveEnable:=TRUE; - IF Inputs.CycleOn THEN + IF Inputs.RcReady THEN THIS.CallTimers(FALSE); _progress := 325; END_IF; END_IF; IF _progress = 325 THEN - TaskMessenger.ActivateOnCondition(ULINT#625, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#525, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#625; + RobotStatus.Error.Id := UINT#525; END_IF; - Outputs.MotorOnAndStart:=_blink.output; + Outputs.ActivateInterface:=TRUE; - IF NOT Inputs.Error THEN - THIS.CallTimers(FALSE); + IF Inputs.InterfaceActivated THEN + THIS.CallTimers(FALSE); + _progress := 326; + END_IF; + END_IF; + + IF _progress = 326 THEN + TaskMessenger.ActivateOnCondition(ULINT#526, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#526; + END_IF; + + IF Inputs.StopMess OR Inputs.AlarmStopActive OR NOT Inputs.RcReady THEN _progress := 320; END_IF; - IF NOT Inputs.Error THEN - THIS.CallTimers(FALSE); - Outputs.MotorOnAndStart := FALSE; - _progress := 326; + Outputs.ExternalStart:=_blink.output; + + IF Inputs.ProActive THEN + Outputs.ExternalStart:=FALSE; + THIS.CallTimers(FALSE); + _progress := 327; END_IF; END_IF; - IF _progress = 326 THEN - TaskMessenger.ActivateOnCondition(ULINT#626, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 327 THEN + TaskMessenger.ActivateOnCondition(ULINT#527, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#626; + RobotStatus.Error.Id := UINT#527; END_IF; Outputs.GlobalSpeed := RobotStatus.CurrentMovementParameters.GlobalSpeed; @@ -679,29 +681,29 @@ NAMESPACE AXOpen.Components.Kuka.Robotics IF Outputs.ActionNo = Inputs.ActionNo THEN THIS.CallTimers(FALSE); - _progress := 327; + _progress := 328; END_IF; END_IF; - IF _progress = 327 THEN + IF _progress = 328 THEN IF _infoTimer.output THEN IF Inputs.GlobalSpeed <> RobotStatus.CurrentMovementParameters.GlobalSpeed THEN - RobotStatus.Error.Id := UINT#627;//<#Waiting for Inputs.GlobalSpeed to be equal to MovementParameters.GlobalSpeed! + RobotStatus.Error.Id := UINT#528;//<#Waiting for Inputs.GlobalSpeed to be equal to MovementParameters.GlobalSpeed! END_IF; IF Inputs.ToolNo <> RobotStatus.CurrentMovementParameters.ToolNo THEN - RobotStatus.Error.Id := UINT#628;//<#Waiting for Inputs.ToolNo to be equal to MovementParameters.ToolNo! + RobotStatus.Error.Id := UINT#529;//<#Waiting for Inputs.ToolNo to be equal to MovementParameters.ToolNo! END_IF; IF Inputs.WorkobjectNo <> RobotStatus.CurrentMovementParameters.WorkobjectNo THEN - RobotStatus.Error.Id := UINT#629;//<#Waiting for Inputs.WorkobjectNo to be equal to MovementParameters.WorkobjectNo! + RobotStatus.Error.Id := UINT#530;//<#Waiting for Inputs.WorkobjectNo to be equal to MovementParameters.WorkobjectNo! END_IF; IF Inputs.PointNo <> RobotStatus.CurrentMovementParameters.PointNo THEN - RobotStatus.Error.Id := UINT#630;//<#Waiting for Inputs.PointNo to be equal to MovementParameters.PointNo! + RobotStatus.Error.Id := UINT#531;//<#Waiting for Inputs.PointNo to be equal to MovementParameters.PointNo! END_IF; IF Inputs.UserSpecSpeed1 <> RobotStatus.CurrentMovementParameters.UserSpecSpeed1 THEN - RobotStatus.Error.Id := UINT#631;//<#Waiting for Inputs.UserSpecSpeed1 to be equal to MovementParameters.UserSpecSpeed1! + RobotStatus.Error.Id := UINT#532;//<#Waiting for Inputs.UserSpecSpeed1 to be equal to MovementParameters.UserSpecSpeed1! END_IF; IF Inputs.UserSpecSpeed2 <> RobotStatus.CurrentMovementParameters.UserSpecSpeed2 THEN - RobotStatus.Error.Id := UINT#632;//<#Waiting for Inputs.UserSpecSpeed2 to be equal to MovementParameters.UserSpecSpeed2! + RobotStatus.Error.Id := UINT#533;//<#Waiting for Inputs.UserSpecSpeed2 to be equal to MovementParameters.UserSpecSpeed2! END_IF; END_IF; @@ -713,42 +715,42 @@ NAMESPACE AXOpen.Components.Kuka.Robotics Inputs.UserSpecSpeed2 = RobotStatus.CurrentMovementParameters.UserSpecSpeed2 AND AXOpen.Components.Robotics.CoordinatesAreNearlyEqual(Inputs.Coordinates,RobotStatus.CurrentMovementParameters.Coordinates,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01,REAL#0.01) THEN THIS.CallTimers(FALSE); - _progress:=333; + _progress:=334; END_IF; END_IF; - IF _progress = 333 THEN - TaskMessenger.ActivateOnCondition(ULINT#633, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 334 THEN + TaskMessenger.ActivateOnCondition(ULINT#534, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#633; + RobotStatus.Error.Id := UINT#534; END_IF; - Outputs.ActionNo := BYTE#255; + Outputs.ActionNo := BYTE#253; IF Outputs.ActionNo = Inputs.ActionNo THEN THIS.CallTimers(FALSE); - _progress:=334; + _progress:=335; END_IF; END_IF; - IF _progress = 334 THEN - TaskMessenger.ActivateOnCondition(ULINT#634, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 335 THEN + TaskMessenger.ActivateOnCondition(ULINT#535, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#634; + RobotStatus.Error.Id := UINT#535; END_IF; Outputs.ActionNo := RobotStatus.CurrentMovementParameters.ActionNo; IF Outputs.ActionNo = Inputs.ActionNo THEN THIS.CallTimers(FALSE); - _progress:=335; + _progress:=336; END_IF; END_IF; - IF _progress = 335 THEN - TaskMessenger.ActivateOnCondition(ULINT#635, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 336 THEN + TaskMessenger.ActivateOnCondition(ULINT#536, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#635; + RobotStatus.Error.Id := UINT#536; END_IF; Outputs.ActionNo := BYTE#255; @@ -784,7 +786,7 @@ NAMESPACE AXOpen.Components.Kuka.Robotics _progress := 0; END_IF; //******************************************* - + //***********StartMotorsTask***************** StartMotorsTask.IsDisabled := _stopTasksAreActive OR StartMotorsProgramAndMovementsTask.IsBusy() OR StartMotorsAndProgramTask.IsBusy(); IF StartMotorsTask.StartTriggered() THEN @@ -802,88 +804,47 @@ NAMESPACE AXOpen.Components.Kuka.Robotics _progress := 340; END_IF; - IF _progress = 340 THEN //Switching to auto - TaskMessenger.ActivateOnCondition(ULINT#640, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 340 THEN + TaskMessenger.ActivateOnCondition(ULINT#540, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#640; + RobotStatus.Error.Id := UINT#540; END_IF; - IF Inputs.AutoOn THEN + IF Inputs.UserSafetySwitchClosed THEN THIS.CallTimers(FALSE); _progress := 341; END_IF; END_IF; - IF _progress = 341 THEN //Reseting error - TaskMessenger.ActivateOnCondition(ULINT#641, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 341 THEN + TaskMessenger.ActivateOnCondition(ULINT#541, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#641; + RobotStatus.Error.Id := UINT#541; END_IF; - Outputs.ResetError := Inputs.Error AND _blink.output; - - IF NOT Inputs.Error THEN - Outputs.ResetError:=FALSE; + IF Inputs.AlarmStopActive THEN THIS.CallTimers(FALSE); _progress := 342; END_IF; END_IF; - IF _progress = 342 THEN //Reseting emergency stop error - TaskMessenger.ActivateOnCondition(ULINT#642, _infoTimer.output, eAxoMessageCategory#Warning); + IF _progress = 342 THEN + TaskMessenger.ActivateOnCondition(ULINT#542, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#642; + RobotStatus.Error.Id := UINT#542; END_IF; - Outputs.ResetEmgStop := Inputs.EmgStop AND _blink.output; + Outputs.DrivesOff:=TRUE; + Outputs.DrivesOn:=_blink.output; - IF NOT Inputs.EmgStop THEN - Outputs.ResetEmgStop:=FALSE; + IF Inputs.DrivesReady THEN + Outputs.DrivesOn:=FALSE; THIS.CallTimers(FALSE); _progress := 343; END_IF; END_IF; IF _progress = 343 THEN - TaskMessenger.ActivateOnCondition(ULINT#643, _infoTimer.output, eAxoMessageCategory#Warning); - IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#643; - END_IF; - - IF Inputs.Error THEN - THIS.CallTimers(FALSE); - _progress := 340; - END_IF; - - Outputs.MotorOn:=_blink.output; - - IF Inputs.MotorOnState THEN - THIS.CallTimers(FALSE); - _progress := 344; - END_IF; - END_IF; - - IF _progress = 344 THEN - TaskMessenger.ActivateOnCondition(ULINT#644, _infoTimer.output, eAxoMessageCategory#Warning); - IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#644; - END_IF; - - IF Inputs.Error THEN - THIS.CallTimers(FALSE); - _progress := 340; - END_IF; - - Outputs.MotorOn:=_blink.output; - - IF NOT Inputs.Error THEN - Outputs.MotorOn:=FALSE; - THIS.CallTimers(FALSE); - _progress := 345; - END_IF; - END_IF; - - IF _progress = 345 THEN StartMotorsTask.DoneWhen(TRUE); THIS.CallTimers(FALSE); _progress := 0; @@ -911,7 +872,7 @@ NAMESPACE AXOpen.Components.Kuka.Robotics _progress := 0; END_IF; //******************************************* - + //***********StartMovementsTask************** StartMovementsTask.IsDisabled := _stopTasksAreActive OR StartMotorsProgramAndMovementsTask.IsBusy(); IF StartMovementsTask.StartTriggered() THEN @@ -928,49 +889,48 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 350 THEN - TaskMessenger.ActivateOnCondition(ULINT#650, _infoTimer.output, eAxoMessageCategory#Warning); - + TaskMessenger.ActivateOnCondition(ULINT#550, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#650; + RobotStatus.Error.Id := UINT#550; END_IF; - IF Inputs.CycleOn THEN + IF Inputs.ProActive THEN THIS.CallTimers(FALSE); _progress := 351; END_IF; END_IF; IF _progress = 351 THEN - TaskMessenger.ActivateOnCondition(ULINT#651, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#551, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#651; + RobotStatus.Error.Id := UINT#551; END_IF; - IF Inputs.MotorOnState THEN + IF Inputs.DrivesReady THEN THIS.CallTimers(FALSE); _progress := 352; END_IF; END_IF; IF _progress = 352 THEN - TaskMessenger.ActivateOnCondition(ULINT#652, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#552, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#652; + RobotStatus.Error.Id := UINT#552; END_IF; - IF NOT Inputs.Error THEN + IF NOT Inputs.StopMess THEN THIS.CallTimers(FALSE); _progress := 353; END_IF; END_IF; IF _progress = 353 THEN - TaskMessenger.ActivateOnCondition(ULINT#653, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#553, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#653; + RobotStatus.Error.Id := UINT#553; END_IF; Outputs.GlobalSpeed := RobotStatus.CurrentMovementParameters.GlobalSpeed; @@ -992,22 +952,22 @@ NAMESPACE AXOpen.Components.Kuka.Robotics IF _progress = 354 THEN IF _infoTimer.output THEN IF Inputs.GlobalSpeed <> RobotStatus.CurrentMovementParameters.GlobalSpeed THEN - RobotStatus.Error.Id := UINT#654;//<#Waiting for Inputs.GlobalSpeed to be equal to MovementParameters.GlobalSpeed! + RobotStatus.Error.Id := UINT#554;//<#Waiting for Inputs.GlobalSpeed to be equal to MovementParameters.GlobalSpeed! END_IF; IF Inputs.ToolNo <> RobotStatus.CurrentMovementParameters.ToolNo THEN - RobotStatus.Error.Id := UINT#655;//<#Waiting for Inputs.ToolNo to be equal to MovementParameters.ToolNo! + RobotStatus.Error.Id := UINT#555;//<#Waiting for Inputs.ToolNo to be equal to MovementParameters.ToolNo! END_IF; IF Inputs.WorkobjectNo <> RobotStatus.CurrentMovementParameters.WorkobjectNo THEN - RobotStatus.Error.Id := UINT#656;//<#Waiting for Inputs.WorkobjectNo to be equal to MovementParameters.WorkobjectNo! + RobotStatus.Error.Id := UINT#556;//<#Waiting for Inputs.WorkobjectNo to be equal to MovementParameters.WorkobjectNo! END_IF; IF Inputs.PointNo <> RobotStatus.CurrentMovementParameters.PointNo THEN - RobotStatus.Error.Id := UINT#657;//<#Waiting for Inputs.PointNo to be equal to MovementParameters.PointNo! + RobotStatus.Error.Id := UINT#557;//<#Waiting for Inputs.PointNo to be equal to MovementParameters.PointNo! END_IF; IF Inputs.UserSpecSpeed1 <> RobotStatus.CurrentMovementParameters.UserSpecSpeed1 THEN - RobotStatus.Error.Id := UINT#658;//<#Waiting for Inputs.UserSpecSpeed1 to be equal to MovementParameters.UserSpecSpeed1! + RobotStatus.Error.Id := UINT#558;//<#Waiting for Inputs.UserSpecSpeed1 to be equal to MovementParameters.UserSpecSpeed1! END_IF; IF Inputs.UserSpecSpeed2 <> RobotStatus.CurrentMovementParameters.UserSpecSpeed2 THEN - RobotStatus.Error.Id := UINT#659;//<#Waiting for Inputs.UserSpecSpeed2 to be equal to MovementParameters.UserSpecSpeed2! + RobotStatus.Error.Id := UINT#559;//<#Waiting for Inputs.UserSpecSpeed2 to be equal to MovementParameters.UserSpecSpeed2! END_IF; END_IF; @@ -1024,13 +984,13 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 360 THEN - TaskMessenger.ActivateOnCondition(ULINT#660, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#560, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#660; + RobotStatus.Error.Id := UINT#560; END_IF; - Outputs.ActionNo := BYTE#255; + Outputs.ActionNo := BYTE#253; IF Outputs.ActionNo = Inputs.ActionNo THEN THIS.CallTimers(FALSE); @@ -1039,10 +999,10 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 361 THEN - TaskMessenger.ActivateOnCondition(ULINT#661, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#561, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#661; + RobotStatus.Error.Id := UINT#561; END_IF; Outputs.ActionNo := RobotStatus.CurrentMovementParameters.ActionNo; @@ -1054,24 +1014,24 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 662 THEN - TaskMessenger.ActivateOnCondition(ULINT#662, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#562, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#662; + RobotStatus.Error.Id := UINT#562; END_IF; Outputs.ActionNo := BYTE#255; IF Outputs.ActionNo = Inputs.ActionNo THEN _progress := 663; - StartMovementsTask.DoneWhen(TRUE); END_IF; END_IF; IF _progress = 663 THEN - _progress := 663; + _progress := 0; StartMovementsTask.DoneWhen(TRUE); END_IF; + THIS.CallTimers(TRUE); StartMovementsTask.ThrowWhen(_errorTimer.output); @@ -1099,8 +1059,8 @@ NAMESPACE AXOpen.Components.Kuka.Robotics _progress := 0; END_IF; //******************************************* - - //***********StartProgramTask******* + + //***********StartProgramTask**************** StartProgramTask.IsDisabled := _stopTasksAreActive; IF StartAtMainTask.StartTriggered() THEN RobotStatus.Action.Id := UINT#170; @@ -1118,35 +1078,107 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 370 THEN - TaskMessenger.ActivateOnCondition(ULINT#670, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#570, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#670; + RobotStatus.Error.Id := UINT#570; END_IF; - - Outputs.StartProgram:=_blink.output; - IF Inputs.CycleOn THEN + IF Inputs.UserSafetySwitchClosed THEN THIS.CallTimers(FALSE); _progress := 371; END_IF; END_IF; IF _progress = 371 THEN - TaskMessenger.ActivateOnCondition(ULINT#671, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#571, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#671; + RobotStatus.Error.Id := UINT#571; END_IF; - Outputs.StartProgram:=_blink.output; - - IF NOT Inputs.SystemInputBusy THEN - Outputs.StartProgram:=FALSE; + IF Inputs.AlarmStopActive THEN THIS.CallTimers(FALSE); _progress := 372; END_IF; END_IF; - IF _progress = 372 THEN + IF _progress = 372 THEN + TaskMessenger.ActivateOnCondition(ULINT#572, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#572; + END_IF; + + Outputs.DrivesOff:=TRUE; + Outputs.DrivesOn:=_blink.output; + IF Inputs.DrivesReady THEN + Outputs.DrivesOn:=FALSE; + THIS.CallTimers(FALSE); + _progress := 373; + END_IF; + END_IF; + + IF _progress = 373 THEN + TaskMessenger.ActivateOnCondition(ULINT#573, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#573; + END_IF; + + Outputs.ErrorConfirmation := Inputs.StopMess AND _blink.output; + + IF NOT Inputs.StopMess THEN + Outputs.ErrorConfirmation:=FALSE; + THIS.CallTimers(FALSE); + _progress := 374; + END_IF; + END_IF; + + IF _progress = 374 THEN + TaskMessenger.ActivateOnCondition(ULINT#574, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#574; + END_IF; + + Outputs.MoveEnable:=TRUE; + + IF Inputs.RcReady THEN + THIS.CallTimers(FALSE); + _progress := 375; + END_IF; + END_IF; + + IF _progress = 375 THEN + TaskMessenger.ActivateOnCondition(ULINT#575, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#575; + END_IF; + + Outputs.ActivateInterface:=TRUE; + + IF Inputs.InterfaceActivated THEN + THIS.CallTimers(FALSE); + _progress := 376; + END_IF; + END_IF; + + IF _progress = 376 THEN + TaskMessenger.ActivateOnCondition(ULINT#576, _infoTimer.output, eAxoMessageCategory#Warning); + IF _infoTimer.output THEN + RobotStatus.Error.Id := UINT#576; + END_IF; + + IF Inputs.StopMess OR Inputs.AlarmStopActive OR NOT Inputs.RcReady THEN + _progress := 370; + END_IF; + + Outputs.ExternalStart:=_blink.output; + + IF Inputs.ProActive THEN + Outputs.ExternalStart:= FALSE; + THIS.CallTimers(FALSE); + _progress := 377; + END_IF; + END_IF; + + IF _progress = 377 THEN StartProgramTask.DoneWhen(TRUE); THIS.CallTimers(FALSE); _progress := 0; @@ -1174,8 +1206,8 @@ NAMESPACE AXOpen.Components.Kuka.Robotics _progress := 0; END_IF; //******************************************* - - //***********StopMotorsTask*************** + + //***********StopMotorsTask****************** StopMotorsTask.IsDisabled := FALSE; IF StartAtMainTask.StartTriggered() THEN RobotStatus.Action.Id := UINT#180; @@ -1193,33 +1225,20 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 380 THEN - TaskMessenger.ActivateOnCondition(ULINT#680, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#580, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#680; + RobotStatus.Error.Id := UINT#580; END_IF; - Outputs.MotorOff := TRUE; - - IF Inputs.MotorOffState THEN + Outputs.DrivesOn :=TRUE; + Outputs.DrivesOff := _blink.output; + + IF NOT Inputs.DrivesReady THEN + Outputs.DrivesOff :=FALSE; THIS.CallTimers(FALSE); _progress := 381; END_IF; END_IF; - - IF _progress = 381 THEN - TaskMessenger.ActivateOnCondition(ULINT#681, _infoTimer.output, eAxoMessageCategory#Warning); - IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#681; - END_IF; - - Outputs.MotorOff := TRUE; - - IF NOT Inputs.SystemInputBusy THEN - Outputs.MotorOff:=FALSE; - THIS.CallTimers(FALSE); - _progress := 382; - END_IF; - END_IF; IF _progress = 381 THEN StopMotorsTask.DoneWhen(TRUE); @@ -1266,43 +1285,32 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 390 THEN - TaskMessenger.ActivateOnCondition(ULINT#690, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#590, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#690; + RobotStatus.Error.Id := UINT#590; END_IF; - Outputs.SoftStop := TRUE; - Outputs.QuickStop := FALSE; - - IF _stopType = eAxoRoboticsStopType#Quick THEN - Outputs.SoftStop := FALSE; - Outputs.QuickStop := TRUE; - END_IF; + Outputs.MoveEnable := FALSE; - IF Inputs.MoveInactive THEN + IF Inputs.RobotStopped THEN THIS.CallTimers(FALSE); _progress := 391; END_IF; END_IF; IF _progress = 391 THEN - TaskMessenger.ActivateOnCondition(ULINT#691, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#591, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#691; + RobotStatus.Error.Id := UINT#591; END_IF; - Outputs.StopProgram:=TRUE; - - IF NOT Inputs.CycleOn THEN + IF NOT Inputs.ProActive THEN THIS.CallTimers(FALSE); _progress := 392; END_IF; END_IF; IF _progress = 392 THEN - Outputs.SoftStop := FALSE; - Outputs.QuickStop := FALSE; - Outputs.StopProgram:=FALSE; StopMovementsAndProgramTask.DoneWhen(TRUE); _progress := 0; END_IF; @@ -1348,29 +1356,20 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 400 THEN - TaskMessenger.ActivateOnCondition(ULINT#692, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#600, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#692; - END_IF; - - Outputs.SoftStop := TRUE; - Outputs.QuickStop := FALSE; - - IF _stopType = eAxoRoboticsStopType#Quick THEN - Outputs.SoftStop := FALSE; - Outputs.QuickStop := TRUE; + RobotStatus.Error.Id := UINT#600; END_IF; + Outputs.MoveEnable := FALSE; - IF Inputs.MoveInactive THEN + IF Inputs.RobotStopped THEN THIS.CallTimers(FALSE); _progress := 401; END_IF; END_IF; IF _progress = 401 THEN - Outputs.SoftStop := FALSE; - Outputs.QuickStop := FALSE; _progress := 0; StopMovementsTask.DoneWhen(TRUE); END_IF; @@ -1417,21 +1416,20 @@ NAMESPACE AXOpen.Components.Kuka.Robotics END_IF; IF _progress = 410 THEN - TaskMessenger.ActivateOnCondition(ULINT#693, _infoTimer.output, eAxoMessageCategory#Warning); + TaskMessenger.ActivateOnCondition(ULINT#610, _infoTimer.output, eAxoMessageCategory#Warning); IF _infoTimer.output THEN - RobotStatus.Error.Id := UINT#693; + RobotStatus.Error.Id := UINT#610; END_IF; - Outputs.StopProgram:=TRUE; + Outputs.MoveEnable:=FALSE; - IF NOT Inputs.CycleOn THEN + IF NOT Inputs.ProActive THEN THIS.CallTimers(FALSE); _progress := 411; END_IF; END_IF; IF _progress = 411 THEN - Outputs.StopProgram:=FALSE; StopProgramTask.DoneWhen(TRUE); _progress := 0; END_IF; @@ -1469,22 +1467,22 @@ NAMESPACE AXOpen.Components.Kuka.Robotics OR StopMovementsAndProgramTask.IsBusy() OR StopProgramTask.IsBusy(); - Messenger.ActivateOnCondition(ULINT#705,_someTaskIsActive AND Inputs.EmgStop, eAxoMessageCategory#Error); - Messenger.ActivateOnCondition(ULINT#706,_someTaskIsActive AND NOT Inputs.SafetyOk, eAxoMessageCategory#Error); - Messenger.ActivateOnCondition(ULINT#707,_someTaskIsActive AND Inputs.ProgExecError, eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#705,_someTaskIsActive AND NOT Inputs.AlarmStopActive, eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#706,_someTaskIsActive AND NOT Inputs.UserSafetySwitchClosed, eAxoMessageCategory#Error); + Messenger.ActivateOnCondition(ULINT#707,_someTaskIsActive AND Inputs.Error, eAxoMessageCategory#Error); IF _someTaskIsActive THEN - IF(Inputs.EmgStop) THEN + IF(NOT Inputs.AlarmStopActive) THEN RobotStatus.Error.Id := UINT#705; END_IF; - IF(NOT Inputs.SafetyOk) THEN + IF(NOT Inputs.UserSafetySwitchClosed) THEN RobotStatus.Error.Id := UINT#706; END_IF; - IF(Inputs.ProgExecError) THEN + IF(Inputs.Error) THEN RobotStatus.Error.Id := UINT#707; END_IF; END_IF; -*) + //***********UPDATE**OUTPUTS***************** //SYSTEM OUTPUTS _data[0].%X0 := Outputs.ExternalStart; @@ -1675,7 +1673,6 @@ NAMESPACE AXOpen.Components.Kuka.Robotics StopProgram := StopProgramTask.Invoke(); END_METHOD - METHOD PRIVATE CallTimers VAR_INPUT signal : BOOL; diff --git a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKrc4_v_5_x_x/AxoKrc4_v_5_x_x.cs b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKrc4_v_5_x_x/AxoKrc4_v_5_x_x.cs index 693d620aa..3064c55a1 100644 --- a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKrc4_v_5_x_x/AxoKrc4_v_5_x_x.cs +++ b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKrc4_v_5_x_x/AxoKrc4_v_5_x_x.cs @@ -111,65 +111,69 @@ private void InitializeTaskMessenger() List> messengerTextList = new List> { new KeyValuePair(0, new AxoMessengerTextItem(" ", " ")), - new KeyValuePair(600, new AxoMessengerTextItem("Waiting for the signal Inputs.PpMoved to be set!", "Check the status of the `Inputs.PpMoved` signal.")), - - - new KeyValuePair(610, new AxoMessengerTextItem("Waiting for the signal Inputs.AutoOn to be set!", "Check the status of the `Inputs.PpMoved` signal.")), - new KeyValuePair(611, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), - new KeyValuePair(612, new AxoMessengerTextItem("Waiting for the signal Inputs.EmgStop to be reseted!", "Check the status of the `Error` signal.")), - new KeyValuePair(613, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOnState to be set!", "Check the status of the `Inputs.MotorOnState` signal.")), - new KeyValuePair(614, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be set!", "Check the status of the `Inputs.CycleOn` signal.")), - new KeyValuePair(615, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), - - new KeyValuePair(620, new AxoMessengerTextItem("Waiting for the signal Inputs.AutoOn to be set!", "Check the status of the `Inputs.PpMoved` signal.")), - new KeyValuePair(621, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), - new KeyValuePair(622, new AxoMessengerTextItem("Waiting for the signal Inputs.EmgStop to be reseted!", "Check the status of the `Error` signal.")), - new KeyValuePair(623, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOnState to be set!", "Check the status of the `Inputs.MotorOnState` signal.")), - new KeyValuePair(624, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be set!", "Check the status of the `Inputs.CycleOn` signal.")), - new KeyValuePair(625, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), - new KeyValuePair(626, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), - new KeyValuePair(627, new AxoMessengerTextItem("Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `.", "Check the value of the Inputs.GlobalSpeedsignal")), - new KeyValuePair(628, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `.", "Check the value of the Inputs.ToolNosignal")), - new KeyValuePair(629, new AxoMessengerTextItem("Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `.", "Check the value of the Inputs.WorkobjectNosignal")), - new KeyValuePair(630, new AxoMessengerTextItem("Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `.", "Check the value of the Inputs.PointNosignal")), - new KeyValuePair(631, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `.", "Check the value of the Inputs.UserSpecSpeed1signal")), - new KeyValuePair(632, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `.", "Check the value of the Inputs.UserSpecSpeed2signal")), - new KeyValuePair(633, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNosignal")), - new KeyValuePair(634, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), - new KeyValuePair(635, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), - - new KeyValuePair(640, new AxoMessengerTextItem("Waiting for the signal Inputs.AutoOn to be set!", "Check the status of the `Inputs.PpMoved` signal.")), - new KeyValuePair(641, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), - new KeyValuePair(642, new AxoMessengerTextItem("Waiting for the signal Inputs.EmgStop to be reseted!", "Check the status of the `Error` signal.")), - new KeyValuePair(643, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOnState to be set!", "Check the status of the `Inputs.MotorOnState` signal.")), - new KeyValuePair(644, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), - - new KeyValuePair(650, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be set!", "Check the status of the `Inputs.CycleOn` signal.")), - new KeyValuePair(651, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOnState to be set!", "Check the status of the `Inputs.MotorOnState` signal.")), - new KeyValuePair(652, new AxoMessengerTextItem("Waiting for the signal Inputs.Error to be reseted!", "Check the status of the `Error` signal.")), - new KeyValuePair(653, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), - new KeyValuePair(654, new AxoMessengerTextItem("Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `.", "Check the value of the Inputs.GlobalSpeedsignal")), - new KeyValuePair(655, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `.", "Check the value of the Inputs.ToolNosignal")), - new KeyValuePair(656, new AxoMessengerTextItem("Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `.", "Check the value of the Inputs.WorkobjectNosignal")), - new KeyValuePair(657, new AxoMessengerTextItem("Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `.", "Check the value of the Inputs.PointNosignal")), - new KeyValuePair(658, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `.", "Check the value of the Inputs.UserSpecSpeed1signal")), - new KeyValuePair(659, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `.", "Check the value of the Inputs.UserSpecSpeed2signal")), - new KeyValuePair(660, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNosignal")), - new KeyValuePair(661, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), - new KeyValuePair(662, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), - - new KeyValuePair(670, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be set!", "Check the status of the `Inputs.CycleOn` signal.")), - new KeyValuePair(671, new AxoMessengerTextItem("Waiting for the signal Inputs.SystemInputBusy to be reseted!", "Check the status of the `SystemInputBusy` signal.")), - - new KeyValuePair(680, new AxoMessengerTextItem("Waiting for the signal Inputs.MotorOffState to be set!", "Check the status of the `Inputs.MotorOffState` signal.")), - new KeyValuePair(681, new AxoMessengerTextItem("Waiting for the signal Inputs.SystemInputBusy to be reseted!", "Check the status of the `SystemInputBusy` signal.")), - - new KeyValuePair(690, new AxoMessengerTextItem("Waiting for the signal Inputs.MoveInactive to be set!", "Check the status of the `Inputs.MoveInactive` signal.")), - new KeyValuePair(691, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be reseted!", "Check the status of the `CycleOn` signal.")), - - new KeyValuePair(692, new AxoMessengerTextItem("Waiting for the signal Inputs.MoveInactive to be set!", "Check the status of the `Inputs.MoveInactive` signal.")), - - new KeyValuePair(693, new AxoMessengerTextItem("Waiting for the signal Inputs.CycleOn to be reseted!", "Check the status of the `CycleOn` signal.")), + new KeyValuePair(500, new AxoMessengerTextItem("Waiting for the signal Inputs.PpMoved to be set!", "Check the status of the `Inputs.PpMoved` signal.")), + + + new KeyValuePair(510, new AxoMessengerTextItem("Waiting for the signal Inputs.UserSafetySwitchClosed to be set!", "Check the status of the `Inputs.UserSafetySwitchClosed` signal.")), + new KeyValuePair(511, new AxoMessengerTextItem("Waiting for the signal Inputs.AlarmStopActive to be set!", "Check the status of the `AlarmStopActive` signal.")), + new KeyValuePair(512, new AxoMessengerTextItem("Waiting for the signal Inputs.DrivesReady to be set!", "Check the status of the `DrivesReady` signal.")), + new KeyValuePair(513, new AxoMessengerTextItem("Waiting for the signal Inputs.StopMess to be reseted!", "Check the status of the `Inputs.StopMess` signal.")), + new KeyValuePair(514, new AxoMessengerTextItem("Waiting for the signal Inputs.RcReady to be set!", "Check the status of the `Inputs.RcReady` signal.")), + new KeyValuePair(515, new AxoMessengerTextItem("Waiting for the signal Inputs.InterfaceActivated to be set!", "Check the status of the `InterfaceActivated` signal.")), + new KeyValuePair(516, new AxoMessengerTextItem("Waiting for the signal Inputs.ProActive to be set!", "Check the status of the `ProActive` signal.")), + + new KeyValuePair(520, new AxoMessengerTextItem("Waiting for the signal Inputs.UserSafetySwitchClosed to be set!", "Check the status of the `Inputs.UserSafetySwitchClosed` signal.")), + new KeyValuePair(521, new AxoMessengerTextItem("Waiting for the signal Inputs.AlarmStopActive to be set!", "Check the status of the `AlarmStopActive` signal.")), + new KeyValuePair(522, new AxoMessengerTextItem("Waiting for the signal Inputs.DrivesReady to be set!", "Check the status of the `DrivesReady` signal.")), + new KeyValuePair(523, new AxoMessengerTextItem("Waiting for the signal Inputs.StopMess to be reseted!", "Check the status of the `Inputs.StopMess` signal.")), + new KeyValuePair(524, new AxoMessengerTextItem("Waiting for the signal Inputs.RcReady to be set!", "Check the status of the `Inputs.RcReady` signal.")), + new KeyValuePair(525, new AxoMessengerTextItem("Waiting for the signal Inputs.InterfaceActivated to be set!", "Check the status of the `InterfaceActivated` signal.")), + new KeyValuePair(526, new AxoMessengerTextItem("Waiting for the signal Inputs.ProActive to be set!", "Check the status of the `ProActive` signal.")), + new KeyValuePair(527, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + new KeyValuePair(528, new AxoMessengerTextItem("Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `.", "Check the value of the Inputs.GlobalSpeedsignal")), + new KeyValuePair(529, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `.", "Check the value of the Inputs.ToolNosignal")), + new KeyValuePair(530, new AxoMessengerTextItem("Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `.", "Check the value of the Inputs.WorkobjectNosignal")), + new KeyValuePair(531, new AxoMessengerTextItem("Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `.", "Check the value of the Inputs.PointNosignal")), + new KeyValuePair(532, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `.", "Check the value of the Inputs.UserSpecSpeed1signal")), + new KeyValuePair(533, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `.", "Check the value of the Inputs.UserSpecSpeed2signal")), + new KeyValuePair(534, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNosignal")), + new KeyValuePair(535, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + new KeyValuePair(536, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + + new KeyValuePair(540, new AxoMessengerTextItem("Waiting for the signal Inputs.UserSafetySwitchClosed to be set!", "Check the status of the `Inputs.UserSafetySwitchClosed` signal.")), + new KeyValuePair(541, new AxoMessengerTextItem("Waiting for the signal Inputs.AlarmStopActive to be set!", "Check the status of the `AlarmStopActive` signal.")), + new KeyValuePair(542, new AxoMessengerTextItem("Waiting for the signal Inputs.DrivesReady to be set!", "Check the status of the `DrivesReady` signal.")), + + new KeyValuePair(550, new AxoMessengerTextItem("Waiting for the signal Inputs.ProActive to be set!", "Check the status of the `Inputs.ProActive` signal.")), + new KeyValuePair(551, new AxoMessengerTextItem("Waiting for the signal Inputs.DrivesReady to be set!", "Check the status of the `Inputs.DrivesReady` signal.")), + new KeyValuePair(552, new AxoMessengerTextItem("Waiting for the signal Inputs.StopMess to be reseted!", "Check the status of the `StopMess` signal.")), + new KeyValuePair(553, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + new KeyValuePair(554, new AxoMessengerTextItem("Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `.", "Check the value of the Inputs.GlobalSpeedsignal")), + new KeyValuePair(555, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `.", "Check the value of the Inputs.ToolNosignal")), + new KeyValuePair(556, new AxoMessengerTextItem("Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `.", "Check the value of the Inputs.WorkobjectNosignal")), + new KeyValuePair(557, new AxoMessengerTextItem("Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `.", "Check the value of the Inputs.PointNosignal")), + new KeyValuePair(558, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `.", "Check the value of the Inputs.UserSpecSpeed1signal")), + new KeyValuePair(559, new AxoMessengerTextItem("Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `.", "Check the value of the Inputs.UserSpecSpeed2signal")), + new KeyValuePair(560, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNosignal")), + new KeyValuePair(561, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + new KeyValuePair(562, new AxoMessengerTextItem("Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`.", "Check the value of the Inputs.ActionNo signal")), + + new KeyValuePair(570, new AxoMessengerTextItem("Waiting for the signal Inputs.UserSafetySwitchClosed to be set!", "Check the status of the `Inputs.UserSafetySwitchClosed` signal.")), + new KeyValuePair(571, new AxoMessengerTextItem("Waiting for the signal Inputs.AlarmStopActive to be set!", "Check the status of the `AlarmStopActive` signal.")), + new KeyValuePair(572, new AxoMessengerTextItem("Waiting for the signal Inputs.DrivesReady to be set!", "Check the status of the `Inputs.DrivesReady` signal.")), + new KeyValuePair(573, new AxoMessengerTextItem("Waiting for the signal Inputs.StopMess to be reseted!", "Check the status of the `StopMess` signal.")), + new KeyValuePair(574, new AxoMessengerTextItem("Waiting for the signal Inputs.RcReady to be set!", "Check the status of the `Inputs.RcReady` signal.")), + new KeyValuePair(575, new AxoMessengerTextItem("Waiting for the signal Inputs.InterfaceActivated to be set!", "Check the status of the `Inputs.InterfaceActivated` signal.")), + new KeyValuePair(576, new AxoMessengerTextItem("Waiting for the signal Inputs.ProActive to be set!", "Check the status of the `Inputs.ProActive` signal.")), + + new KeyValuePair(580, new AxoMessengerTextItem("Waiting for the signal Inputs.DrivesReady to be reseted!", "Check the status of the `DrivesReady` signal.")), + + new KeyValuePair(590, new AxoMessengerTextItem("Waiting for the signal Inputs.RobotStopped to be set!", "Check the status of the `Inputs.RobotStopped` signal.")), + new KeyValuePair(591, new AxoMessengerTextItem("Waiting for the signal Inputs.ProActive to be reseted!", "Check the status of the `ProActive` signal.")), + + new KeyValuePair(600, new AxoMessengerTextItem("Waiting for the signal Inputs.RobotStopped to be set!", "Check the status of the `Inputs.RobotStopped` signal.")), + + new KeyValuePair(610, new AxoMessengerTextItem("Waiting for the signal Inputs.ProActive to be reseted!", "Check the status of the `ProActive` signal.")), }; diff --git a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKukaRobotics_Component_Status_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.cs b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKukaRobotics_Component_Status_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.cs index 4eaf5fc24..35153d9c2 100644 --- a/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKukaRobotics_Component_Status_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.cs +++ b/src/components.kuka.robotics/src/AXOpen.Components.Kuka.Robotics/AxoKukaRobotics_Component_Status_v_5_x_x/AxoKukaRobotics_Component_Status_v_5_x_x.cs @@ -22,55 +22,59 @@ public string ErrorDescription if (errorDescriptionDict.Count == 0) { errorDescriptionDict.Add(0, " "); - errorDescriptionDict.Add(600, "Waiting for the signal Inputs.PpMoved to be set!"); - errorDescriptionDict.Add(610, "Waiting for the signal Inputs.AutoOn to be set!"); - errorDescriptionDict.Add(611, "Waiting for the signal Inputs.Error to be reseted!"); - errorDescriptionDict.Add(612, "Waiting for the signal Inputs.EmgStop to be reseted!"); - errorDescriptionDict.Add(613, "Waiting for the signal Inputs.MotorOnState to be set!"); - errorDescriptionDict.Add(614, "Waiting for the signal Inputs.CycleOn to be set!"); - errorDescriptionDict.Add(615, "Waiting for the signal Inputs.Error to be reseted!"); - errorDescriptionDict.Add(620, "Waiting for the signal Inputs.AutoOn to be set!"); - errorDescriptionDict.Add(621, "Waiting for the signal Inputs.Error to be reseted!"); - errorDescriptionDict.Add(622, "Waiting for the signal Inputs.EmgStop to be reseted!"); - errorDescriptionDict.Add(623, "Waiting for the signal Inputs.MotorOnState to be set!"); - errorDescriptionDict.Add(624, "Waiting for the signal Inputs.CycleOn to be set!"); - errorDescriptionDict.Add(625, "Waiting for the signal Inputs.Error to be reseted!"); - errorDescriptionDict.Add(626, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); - errorDescriptionDict.Add(627, "Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `."); - errorDescriptionDict.Add(628, "Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `."); - errorDescriptionDict.Add(629, "Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `."); - errorDescriptionDict.Add(630, "Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `."); - errorDescriptionDict.Add(631, "Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `."); - errorDescriptionDict.Add(632, "Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `."); - errorDescriptionDict.Add(633, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); - errorDescriptionDict.Add(634, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); - errorDescriptionDict.Add(635, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); - errorDescriptionDict.Add(640, "Waiting for the signal Inputs.AutoOn to be set!"); - errorDescriptionDict.Add(641, "Waiting for the signal Inputs.Error to be reseted!"); - errorDescriptionDict.Add(642, "Waiting for the signal Inputs.EmgStop to be reseted!"); - errorDescriptionDict.Add(643, "Waiting for the signal Inputs.MotorOnState to be set!"); - errorDescriptionDict.Add(644, "Waiting for the signal Inputs.Error to be reseted!"); - errorDescriptionDict.Add(650, "Waiting for the signal Inputs.CycleOn to be set!"); - errorDescriptionDict.Add(651, "Waiting for the signal Inputs.MotorOnState to be set!"); - errorDescriptionDict.Add(652, "Waiting for the signal Inputs.Error to be reseted!"); - errorDescriptionDict.Add(653, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); - errorDescriptionDict.Add(654, "Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `."); - errorDescriptionDict.Add(655, "Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `."); - errorDescriptionDict.Add(656, "Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `."); - errorDescriptionDict.Add(657, "Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `."); - errorDescriptionDict.Add(658, "Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `."); - errorDescriptionDict.Add(659, "Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `."); - errorDescriptionDict.Add(660, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); - errorDescriptionDict.Add(661, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); - errorDescriptionDict.Add(662, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); - errorDescriptionDict.Add(670, "Waiting for the signal Inputs.CycleOn to be set!"); - errorDescriptionDict.Add(671, "Waiting for the signal Inputs.SystemInputBusy to be reseted!"); - errorDescriptionDict.Add(680, "Waiting for the signal Inputs.MotorOffState to be set!"); - errorDescriptionDict.Add(681, "Waiting for the signal Inputs.SystemInputBusy to be reseted!"); - errorDescriptionDict.Add(690, "Waiting for the signal Inputs.MoveInactive to be set!"); - errorDescriptionDict.Add(691, "Waiting for the signal Inputs.CycleOn to be reseted!"); - errorDescriptionDict.Add(692, "Waiting for the signal Inputs.MoveInactive to be set!"); - errorDescriptionDict.Add(693, "Waiting for the signal Inputs.CycleOn to be reseted!"); + errorDescriptionDict.Add(500, "Waiting for the signal Inputs.PpMoved to be set!"); + errorDescriptionDict.Add(510, "Waiting for the signal Inputs.UserSafetySwitchClosed to be set!"); + errorDescriptionDict.Add(511, "Waiting for the signal Inputs.AlarmStopActive to be set!"); + errorDescriptionDict.Add(512, "Waiting for the signal Inputs.DrivesReady to be set!"); + errorDescriptionDict.Add(513, "Waiting for the signal Inputs.StopMess to be reseted!"); + errorDescriptionDict.Add(514, "Waiting for the signal Inputs.RcReady to be set!"); + errorDescriptionDict.Add(515, "Waiting for the signal Inputs.InterfaceActivated to be set!"); + errorDescriptionDict.Add(516, "Waiting for the signal Inputs.ProActive to be set!"); + errorDescriptionDict.Add(520, "Waiting for the signal Inputs.UserSafetySwitchClosed to be set!"); + errorDescriptionDict.Add(521, "Waiting for the signal Inputs.AlarmStopActive to be set!"); + errorDescriptionDict.Add(522, "Waiting for the signal Inputs.DrivesReady to be set!"); + errorDescriptionDict.Add(523, "Waiting for the signal Inputs.StopMess to be reseted!"); + errorDescriptionDict.Add(524, "Waiting for the signal Inputs.RcReady to be set!"); + errorDescriptionDict.Add(525, "Waiting for the signal Inputs.InterfaceActivated to be set!"); + errorDescriptionDict.Add(526, "Waiting for the signal Inputs.ProActive to be set!"); + errorDescriptionDict.Add(527, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(528, "Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `."); + errorDescriptionDict.Add(529, "Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `."); + errorDescriptionDict.Add(530, "Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `."); + errorDescriptionDict.Add(531, "Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `."); + errorDescriptionDict.Add(532, "Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `."); + errorDescriptionDict.Add(533, "Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `."); + errorDescriptionDict.Add(534, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(535, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(536, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(540, "Waiting for the signal Inputs.UserSafetySwitchClosed to be set!"); + errorDescriptionDict.Add(541, "Waiting for the signal Inputs.AlarmStopActive to be set!"); + errorDescriptionDict.Add(542, "Waiting for the signal Inputs.DrivesReady to be set!"); + errorDescriptionDict.Add(550, "Waiting for the signal Inputs.ProActive to be set!"); + errorDescriptionDict.Add(551, "Waiting for the signal Inputs.DrivesReady to be set!"); + errorDescriptionDict.Add(552, "Waiting for the signal Inputs.StopMess to be reseted!"); + errorDescriptionDict.Add(553, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(554, "Waiting for the value of the `Inputs.GlobalSpeed` to be the same as the value of the `CurrentMovementParameters.GlobalSpeed `."); + errorDescriptionDict.Add(555, "Waiting for the value of the `Inputs.ToolNo` to be the same as the value of the `CurrentMovementParameters.ToolNo `."); + errorDescriptionDict.Add(556, "Waiting for the value of the `Inputs.WorkobjectNo` to be the same as the value of the `CurrentMovementParameters.WorkobjectNo `."); + errorDescriptionDict.Add(557, "Waiting for the value of the `Inputs.PointNo` to be the same as the value of the `CurrentMovementParameters.PointNo `."); + errorDescriptionDict.Add(558, "Waiting for the value of the `Inputs.UserSpecSpeed1` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed1 `."); + errorDescriptionDict.Add(559, "Waiting for the value of the `Inputs.UserSpecSpeed2` to be the same as the value of the `CurrentMovementParameters.UserSpecSpeed2 `."); + errorDescriptionDict.Add(560, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(561, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(562, "Waiting for the value of the `Inputs.ActionNo` to be the same as the value of the `Outputs.ActionNo`."); + errorDescriptionDict.Add(570, "Waiting for the signal Inputs.UserSafetySwitchClosed to be set!"); + errorDescriptionDict.Add(571, "Waiting for the signal Inputs.AlarmStopActive to be set!"); + errorDescriptionDict.Add(572, "Waiting for the signal Inputs.DrivesReady to be set!"); + errorDescriptionDict.Add(573, "Waiting for the signal Inputs.StopMess to be reseted!"); + errorDescriptionDict.Add(574, "Waiting for the signal Inputs.RcReady to be set!"); + errorDescriptionDict.Add(575, "Waiting for the signal Inputs.InterfaceActivated to be set!"); + errorDescriptionDict.Add(576, "Waiting for the signal Inputs.ProActive to be set!"); + errorDescriptionDict.Add(580, "Waiting for the signal Inputs.DrivesReady to be reseted!"); + errorDescriptionDict.Add(590, "Waiting for the signal Inputs.RobotStopped to be set!"); + errorDescriptionDict.Add(591, "Waiting for the signal Inputs.ProActive to be reseted!"); + errorDescriptionDict.Add(600, "Waiting for the signal Inputs.RobotStopped to be set!"); + errorDescriptionDict.Add(610, "Waiting for the signal Inputs.ProActive to be reseted!"); errorDescriptionDict.Add(700, "Error: Parent has NULL reference!"); errorDescriptionDict.Add(701, "Input variable `hwId_512_DI_DO` has invalid value in `Run` method!"); diff --git a/src/components.mitsubishi.robotics/ctrl/src/AxoCr800_v_1_x_x.st b/src/components.mitsubishi.robotics/ctrl/src/AxoCr800_v_1_x_x.st index 649c63d5c..a62d8313d 100644 --- a/src/components.mitsubishi.robotics/ctrl/src/AxoCr800_v_1_x_x.st +++ b/src/components.mitsubishi.robotics/ctrl/src/AxoCr800_v_1_x_x.st @@ -933,6 +933,7 @@ NAMESPACE AXOpen.Components.Mitsubishi.Robotics END_IF; IF _progress = 354 THEN + _progress := 0; StartMovementsTask.DoneWhen(TRUE); END_IF; From b68e5e157aee1004dc13806cda6bf0be8fa2d49d Mon Sep 17 00:00:00 2001 From: TK <61820360+TomKovac@users.noreply.github.com> Date: Fri, 16 Feb 2024 17:35:36 +0100 Subject: [PATCH 7/7] rfid --- .../app/ix-blazor/Pages/Component_1.razor | 21 +- .../app/ix-blazor/Pages/Component_2.razor | 16 +- .../app/src/Documentation/Component_1.st | 38 ++- .../app/src/Documentation/Component_2.st | 36 +-- .../app/src/IO/PLC_LINE/CopyInputs.st | 10 - .../app/src/IO/PLC_LINE/CopyOutputs.st | 10 - .../app/src/IO/PLC_LINE/HwIdentifiers.st | 29 ++ .../app/src/IO/PLC_LINE/HwInputs.st | 8 - .../app/src/IO/PLC_LINE/HwOutputs.st | 8 - .../app/src/IO/PLC_LINE/PlcInputs.st | 8 - .../app/src/IO/PLC_LINE/PlcOutputs.st | 8 - ..._COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION | 8 - .../_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM | 12 - .../app/src/Sandbox/SandboxContext.st | 135 +++++++- .../app/src/configuration.st | 13 +- .../app/src/program.st | 13 - .../Axo_IID_CMD_STRUCT.st | 8 +- .../Axo_IID_HW_CONNECT.st | 13 +- .../Axo_IID_IN_EXT_UHF.st | 8 +- .../Axo_IID_IN_PN_CONFIGRECORD.st | 8 +- .../Axo_IID_IN_PN_RECORDDATA.st | 8 +- .../Axo_IID_IN_SYNC.st | 6 +- .../Axo_IdentProfile.st | 299 ++++++++---------- .../ctrl/src/ExampleCylinder.st | 135 -------- .../ctrl/test/{CylinderTests.st => test.st} | 24 +- .../ExampleCylinder/ExampleCylinder.cs | 19 -- 26 files changed, 353 insertions(+), 548 deletions(-) delete mode 100644 src/components.siemens.identification/app/src/IO/PLC_LINE/CopyInputs.st delete mode 100644 src/components.siemens.identification/app/src/IO/PLC_LINE/CopyOutputs.st delete mode 100644 src/components.siemens.identification/app/src/IO/PLC_LINE/HwInputs.st delete mode 100644 src/components.siemens.identification/app/src/IO/PLC_LINE/HwOutputs.st delete mode 100644 src/components.siemens.identification/app/src/IO/PLC_LINE/PlcInputs.st delete mode 100644 src/components.siemens.identification/app/src/IO/PLC_LINE/PlcOutputs.st delete mode 100644 src/components.siemens.identification/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION delete mode 100644 src/components.siemens.identification/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM delete mode 100644 src/components.siemens.identification/ctrl/src/ExampleCylinder.st rename src/components.siemens.identification/ctrl/test/{CylinderTests.st => test.st} (64%) delete mode 100644 src/components.siemens.identification/src/AXOpen.Components.Siemens.Identification/ExampleCylinder/ExampleCylinder.cs diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/Component_1.razor b/src/components.siemens.identification/app/ix-blazor/Pages/Component_1.razor index a7d21247e..fa28db390 100644 --- a/src/components.siemens.identification/app/ix-blazor/Pages/Component_1.razor +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Component_1.razor @@ -1,26 +1,13 @@ @page "/Component_1" @using AXOpen.Core; - - -@code -{ - #region WriteTaskDurationToConsole - private async Task WriteTaskTimesToConsole() - { - await Entry.Plc.documentation.componentOne.ExampleCylinder.WriteTaskDurationToConsole(); - } - #endregion - -} - - - +@* + - - + + *@ diff --git a/src/components.siemens.identification/app/ix-blazor/Pages/Component_2.razor b/src/components.siemens.identification/app/ix-blazor/Pages/Component_2.razor index 7b56b6788..5a2c11589 100644 --- a/src/components.siemens.identification/app/ix-blazor/Pages/Component_2.razor +++ b/src/components.siemens.identification/app/ix-blazor/Pages/Component_2.razor @@ -4,19 +4,7 @@ Documentation - - -@code -{ - #region WriteTaskDurationToConsole - private async Task WriteTaskTimesToConsole() - { - await Entry.Plc.documentation.componentTwo.ExampleCylinder.WriteTaskDurationToConsole(); - } - #endregion - -} - +@* @@ -24,7 +12,7 @@ - + *@ diff --git a/src/components.siemens.identification/app/src/Documentation/Component_1.st b/src/components.siemens.identification/app/src/Documentation/Component_1.st index b15c3e5c0..74ccbf3e4 100644 --- a/src/components.siemens.identification/app/src/Documentation/Component_1.st +++ b/src/components.siemens.identification/app/src/Documentation/Component_1.st @@ -1,18 +1,19 @@ USING AXOpen.Core; +USING AXOpen.Components.Siemens.Identification; + {S7.extern=ReadWrite} CLASS Component_1 EXTENDS AXOpen.Core.AxoObject // VAR PUBLIC - ExampleCylinder : AXOpen.Components.Siemens.Identification.Example.ExampleCylinder; + END_VAR // // - VAR PUBLIC + VAR PUBLIC {#ix-set:AttributeName = "<#Activate manual control#>"} ActivateManualControl : BOOL; - PlcInputs : REF_TO PlcInputs; - PlcOutputs : REF_TO PlcOutputs; + END_VAR // @@ -24,15 +25,12 @@ CLASS Component_1 EXTENDS AXOpen.Core.AxoObject THIS.Initialize(parent); IF ActivateManualControl THEN - ExampleCylinder.ActivateManualControl(); + ; END_IF; // - ExampleCylinder.Run(THIS, - REF(PlcInputs^._homeSensor_1), - REF(PlcInputs^._workSensor_1), - REF(PlcOutputs^._moveHomeSignal_1), - REF(PlcOutputs^._moveWorkSignal_1)); + + // THIS.UseInSequencer(); @@ -49,17 +47,17 @@ CLASS Component_1 EXTENDS AXOpen.Core.AxoObject Sequencer.Initialize(THIS); Sequencer.Open(); - IF(Steps[0].Execute(Sequencer, 'Move to home position')) THEN - IF(ExampleCylinder.MoveToHome.Invoke().IsDone()) THEN - Sequencer.MoveNext(); - END_IF; - END_IF; + // IF(Steps[0].Execute(Sequencer, 'Move to home position')) THEN + // IF(ExampleCylinder.MoveToHome.Invoke().IsDone()) THEN + // Sequencer.MoveNext(); + // END_IF; + // END_IF; - IF(Steps[1].Execute(Sequencer, 'Move to work position')) THEN - IF(ExampleCylinder.MoveToWork.Invoke().IsDone()) THEN - Sequencer.MoveNext(); - END_IF; - END_IF; + // IF(Steps[1].Execute(Sequencer, 'Move to work position')) THEN + // IF(ExampleCylinder.MoveToWork.Invoke().IsDone()) THEN + // Sequencer.MoveNext(); + // END_IF; + // END_IF; END_METHOD // diff --git a/src/components.siemens.identification/app/src/Documentation/Component_2.st b/src/components.siemens.identification/app/src/Documentation/Component_2.st index b34dcb9c3..12d6a65d9 100644 --- a/src/components.siemens.identification/app/src/Documentation/Component_2.st +++ b/src/components.siemens.identification/app/src/Documentation/Component_2.st @@ -3,7 +3,7 @@ USING AXOpen.Core; CLASS Component_2 EXTENDS AXOpen.Core.AxoObject // VAR PUBLIC - ExampleCylinder :AXOpen.Components.Siemens.Identification.Example.ExampleCylinder; + END_VAR // @@ -11,8 +11,7 @@ CLASS Component_2 EXTENDS AXOpen.Core.AxoObject VAR PUBLIC {#ix-set:AttributeName = "<#Activate manual control#>"} ActivateManualControl : BOOL; - PlcInputs : REF_TO PlcInputs; - PlcOutputs : REF_TO PlcOutputs; + END_VAR // @@ -24,15 +23,12 @@ CLASS Component_2 EXTENDS AXOpen.Core.AxoObject THIS.Initialize(parent); IF ActivateManualControl THEN - ExampleCylinder.ActivateManualControl(); + ; END_IF; // - ExampleCylinder.Run(THIS, - REF(PlcInputs^._homeSensor_2), - REF(PlcInputs^._workSensor_2), - REF(PlcOutputs^._moveHomeSignal_2), - REF(PlcOutputs^._moveWorkSignal_2)); + + // THIS.UseInSequencer(); @@ -49,17 +45,17 @@ CLASS Component_2 EXTENDS AXOpen.Core.AxoObject Sequencer.Initialize(THIS); Sequencer.Open(); - IF(Steps[0].Execute(Sequencer, 'Move to home position')) THEN - IF(ExampleCylinder.MoveToHome.Invoke().IsDone()) THEN - Sequencer.MoveNext(); - END_IF; - END_IF; - - IF(Steps[1].Execute(Sequencer, 'Move to work position')) THEN - IF(ExampleCylinder.MoveToWork.Invoke().IsDone()) THEN - Sequencer.MoveNext(); - END_IF; - END_IF; + // IF(Steps[0].Execute(Sequencer, 'Move to home position')) THEN + // IF(ExampleCylinder.MoveToHome.Invoke().IsDone()) THEN + // Sequencer.MoveNext(); + // END_IF; + // END_IF; + + // IF(Steps[1].Execute(Sequencer, 'Move to work position')) THEN + // IF(ExampleCylinder.MoveToWork.Invoke().IsDone()) THEN + // Sequencer.MoveNext(); + // END_IF; + // END_IF; END_METHOD // diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/CopyInputs.st b/src/components.siemens.identification/app/src/IO/PLC_LINE/CopyInputs.st deleted file mode 100644 index 7ac004906..000000000 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/CopyInputs.st +++ /dev/null @@ -1,10 +0,0 @@ -FUNCTION CopyInputs - VAR_EXTERNAL - HwInputs : HwInputs; - PlcInputs : PlcInputs; - END_VAR - PlcInputs._homeSensor_1 := HwInputs._homeSensor_1; - PlcInputs._workSensor_1 := HwInputs._workSensor_1; - PlcInputs._homeSensor_2 := HwInputs._homeSensor_2; - PlcInputs._workSensor_2 := HwInputs._workSensor_2; -END_FUNCTION diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/CopyOutputs.st b/src/components.siemens.identification/app/src/IO/PLC_LINE/CopyOutputs.st deleted file mode 100644 index 625ad1af9..000000000 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/CopyOutputs.st +++ /dev/null @@ -1,10 +0,0 @@ -FUNCTION CopyOutputs - VAR_EXTERNAL - HwOutputs : HwOutputs; - PlcOutputs : PlcOutputs; - END_VAR - HwOutputs._moveHomeSignal_1 := PlcOutputs._moveHomeSignal_1; - HwOutputs._moveWorkSignal_1 := PlcOutputs._moveWorkSignal_1; - HwOutputs._moveHomeSignal_2 := PlcOutputs._moveHomeSignal_2; - HwOutputs._moveWorkSignal_2 := PlcOutputs._moveWorkSignal_2; -END_FUNCTION diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/HwIdentifiers.st b/src/components.siemens.identification/app/src/IO/PLC_LINE/HwIdentifiers.st index f9d09dc28..d9a20ce5c 100644 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/HwIdentifiers.st +++ b/src/components.siemens.identification/app/src/IO/PLC_LINE/HwIdentifiers.st @@ -1,6 +1,35 @@ TYPE HwIdentifiers : WORD ( + PLC_LINE_Rail_0 := WORD#256, + PLC_LINE := WORD#48, + PLC_LINE_Card_reader_writer_1 := WORD#51, + PLC_LINE_CPU_display_1 := WORD#54, + PLC_LINE_OPC_UA_1 := WORD#117, + PLC_LINE_PROFINET_interface_1 := WORD#64, + PLC_LINE_PROFINET_interface_1_Port_1 := WORD#65, + PLC_LINE_PROFINET_interface_1_Port_2 := WORD#66, + PLC_LINE_PROFINET_interface_2 := WORD#72, + PLC_LINE_PROFINET_interface_2_Port_1 := WORD#73, + PLC_LINE_DP_interface_1 := WORD#60, + PLC_LINE_PROFINET_interface_GBIT_3 := WORD#120, + PLC_LINE_PROFINET_interface_GBIT_3_Port_1 := WORD#121, + rf186c_Rack := WORD#265, + rf186c := WORD#258, + rf186c_PN_IO := WORD#259, + rf186c_PN_IO_Port_1 := WORD#260, + rf186c_PN_IO_Port_2 := WORD#261, + rf186c_RF186C_V2_x := WORD#262, + rf186c_CM_1_Communication := WORD#264, + rf186c_Reader_1 := WORD#266, + rf188c_Rack := WORD#268, + rf188c := WORD#269, + rf188c_PN_IO := WORD#270, + rf188c_PN_IO_Port_1 := WORD#271, + rf188c_PN_IO_Port_2 := WORD#272, + rf188c_RF188C_V2_x := WORD#273, + rf188c_CM_1_Communication := WORD#275, + rf188c_Reader_1 := WORD#274, NONE:= WORD#0 ); END_TYPE diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/HwInputs.st b/src/components.siemens.identification/app/src/IO/PLC_LINE/HwInputs.st deleted file mode 100644 index 02b633636..000000000 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/HwInputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - HwInputs : STRUCT - _homeSensor_1 AT %X0.0 : BOOL; - _workSensor_1 AT %X0.1 : BOOL; - _homeSensor_2 AT %X0.2 : BOOL; - _workSensor_2 AT %X0.3 : BOOL; -END_STRUCT; -END_TYPE diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/HwOutputs.st b/src/components.siemens.identification/app/src/IO/PLC_LINE/HwOutputs.st deleted file mode 100644 index 2bbe92155..000000000 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/HwOutputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - HwOutputs : STRUCT - _moveHomeSignal_1 AT %X0.0 : BOOL; - _moveWorkSignal_1 AT %X0.1 : BOOL; - _moveHomeSignal_2 AT %X0.2 : BOOL; - _moveWorkSignal_2 AT %X0.3 : BOOL; - END_STRUCT; -END_TYPE diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/PlcInputs.st b/src/components.siemens.identification/app/src/IO/PLC_LINE/PlcInputs.st deleted file mode 100644 index f8cc94fd1..000000000 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/PlcInputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - PlcInputs : STRUCT - _homeSensor_1 : BOOL; - _workSensor_1 : BOOL; - _homeSensor_2 : BOOL; - _workSensor_2 : BOOL; - END_STRUCT; -END_TYPE diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/PlcOutputs.st b/src/components.siemens.identification/app/src/IO/PLC_LINE/PlcOutputs.st deleted file mode 100644 index 293ba3d87..000000000 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/PlcOutputs.st +++ /dev/null @@ -1,8 +0,0 @@ -TYPE - PlcOutputs : STRUCT - _moveHomeSignal_1 : BOOL; - _moveWorkSignal_1 : BOOL; - _moveHomeSignal_2 : BOOL; - _moveWorkSignal_2 : BOOL; - END_STRUCT; -END_TYPE diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION b/src/components.siemens.identification/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION deleted file mode 100644 index 0617acc51..000000000 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_CONFIGURATION +++ /dev/null @@ -1,8 +0,0 @@ - //Copy this VAR_GLOBAL section into your configuration file inside your project. - //Do not change any names, addresses or any another content. - VAR_GLOBAL - HwInputs AT %IB0 : HwInputs; - HwOutputs AT %QB0 : HwOutputs; - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR diff --git a/src/components.siemens.identification/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM b/src/components.siemens.identification/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM deleted file mode 100644 index 45e075f36..000000000 --- a/src/components.siemens.identification/app/src/IO/PLC_LINE/_COPY_THIS_CONTENT_INTO_YOUR_PROGRAM +++ /dev/null @@ -1,12 +0,0 @@ - //Copy this VAR_EXTERNAL section into the declaration part of your main program file inside your project. - //Do not change any names, addresses or any another content. - VAR_EXTERNAL - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; - END_VAR - //Copy this function call at the very beginning of your program. - //Do not change any names, addresses or any another content. - CopyInputs(); - //Copy this function call at the very end of your program. - //Do not change any names, addresses or any another content. - CopyOutputs(); diff --git a/src/components.siemens.identification/app/src/Sandbox/SandboxContext.st b/src/components.siemens.identification/app/src/Sandbox/SandboxContext.st index 9d91c22c9..6bc0349d2 100644 --- a/src/components.siemens.identification/app/src/Sandbox/SandboxContext.st +++ b/src/components.siemens.identification/app/src/Sandbox/SandboxContext.st @@ -1,21 +1,138 @@ +USING AXOpen.Components.Siemens.Identification; + {S7.extern=ReadWrite} CLASS SandboxContext EXTENDS AXOpen.Core.AxoContext VAR PUBLIC _manualControl : BOOL; - _testCyclinder : AXOpen.Components.Siemens.Identification.Example.ExampleCylinder; - PlcInputs : REF_TO PlcInputs; - PlcOutputs : REF_TO PlcOutputs; + bInit : BOOL; + rf186_1_init : BOOL; + rf186_1_init_PV : BOOL; + rf186_1_execute : BOOL; + rf186_1_execute_PV : BOOL; + rf186_1_nCmdsel : UINT; + + rf186_1 : AXOpen.Components.Siemens.Identification.Axo_IdentProfile; + Connect_RF188C_CH01: Axo_IID_HW_CONNECT; + {#ix-attr:[CompilerOmits()]} + aCommands: ARRAY[1..10] OF Axo_IID_CMD_STRUCT; + {#ix-attr:[CompilerOmits()]} + aDataReset: ARRAY[1..16] OF BYTE; + {#ix-attr:[CompilerOmits()]} + aDataRx: ARRAY[1..2000] OF BYTE; + {#ix-attr:[CompilerOmits()]} + aDataTx: ARRAY[1..2000] OF BYTE; + END_VAR METHOD PROTECTED OVERRIDE Main - _testCyclinder.Run(THIS, - REF(PlcInputs^._homeSensor_1), - REF(PlcInputs^._workSensor_1), - REF(PlcOutputs^._moveHomeSignal_1), - REF(PlcOutputs^._moveWorkSignal_1)); + VAR + i : INT; + END_VAR + + //===================================================================== + //Define profinet parameters + //===================================================================== + Connect_RF188C_CH01.CM_CHANNEL := UINT#1; + // Connect_RF188C_CH01.AMS_NET_ID := '5.95.59.37.2.1'; + // Connect_RF188C_CH01.Port := 4099; + Connect_RF188C_CH01.HW_ID := HwIdentifiers#rf188c_Reader_1; + Connect_RF188C_CH01.API := DWORD#16#5B00; + Connect_RF188C_CH01.SLOT := WORD#2; + Connect_RF188C_CH01.SUB_SLOT := WORD#1; + + //===================================================================== + //Define iid aCommands + //===================================================================== + // Command 1 - Reset Reader + aCommands[1].CMD := eAxo_IID_COMMANDS#eWriteConfig; + aCommands[1].CONFIG := BYTE#16#03; + aCommands[1].LEN_DATA := WORD#16#10; + + // Command 2 - Readerstatus RF300 + aCommands[2].CMD := eAxo_IID_COMMANDS#eReaderStatus; + aCommands[2].ATTRIBUTES := BYTE#16#81; + + // Command 3 - Transponderstatus RF300 + aCommands[3].CMD := eAxo_IID_COMMANDS#eTagStatus; + aCommands[3].ATTRIBUTES := BYTE#16#04; + + // Command 4 - Read 10 Byte + aCommands[4].CMD := eAxo_IID_COMMANDS#eRead; + aCommands[4].LEN_DATA := WORD#16#A; + aCommands[4].ADDR_TAG := DWORD#16#0; + aCommands[4].OFFSETBUFFER := UINT#0; + + // Command 5 - Write 10 Byte + aCommands[5].CMD := eAxo_IID_COMMANDS#eWrite; + aCommands[5].LEN_DATA := WORD#16#A; + aCommands[5].ADDR_TAG := DWORD#16#0; + aCommands[5].OFFSETBUFFER := UINT#0; + + // Command 6 - Read UID + aCommands[6].CMD := eAxo_IID_COMMANDS#eRead; + aCommands[6].LEN_DATA := WORD#16#8; + aCommands[6].ADDR_TAG := DWORD#16#FFF0; + aCommands[6].OFFSETBUFFER := UINT#0; + + //===================================================================== + //Define reset data for RF300 Reader and RF300 transponder + //===================================================================== + aDataReset[1] := BYTE#16#4; + aDataReset[2] := BYTE#16#0; + aDataReset[3] := BYTE#16#0; + aDataReset[4] := BYTE#16#0; + aDataReset[5] := BYTE#16#0; + aDataReset[6] := BYTE#16#A; + aDataReset[7] := BYTE#16#0; + aDataReset[8] := BYTE#16#0; + aDataReset[9] := BYTE#16#0; + aDataReset[10] := BYTE#16#25; + aDataReset[11] := BYTE#16#2; + aDataReset[12] := BYTE#16#0; + aDataReset[13] := BYTE#16#0; + aDataReset[14] := BYTE#16#1; + aDataReset[15] := BYTE#16#0; + aDataReset[16] := BYTE#16#0; + + //===================================================================== + //copy reset data when a reset command is executed + //===================================================================== + + + IF rf186_1_init AND NOT rf186_1_init_PV AND rf186_1_nCmdsel = UINT#1 THEN + // MEMCPY(destAddr := ADR(aDataTX[1]), srcAddr := ADR(aDataReset[1]), n := 16); + FOR i := 1 TO 16 DO + aDataTX[i] := aDataReset[i]; + END_FOR; + END_IF; + + //===================================================================== + //clear receiveData buffer before executing command) + //===================================================================== + IF rf186_1_execute AND NOT rf186_1_execute_PV THEN + // MEMSET(destAddr := ADR(aDataTx[1]),fillByte := 16#00,n := 2000); + FOR i := 1 TO 2000 DO + aDataTX[i] := BYTE#0; + END_FOR; + END_IF; + + //===================================================================== + //call Ident_Profile + //===================================================================== + rf186_1.Run(bExecute := rf186_1_execute, + bInit := rf186_1_init, + nCmdsel := rf186_1_nCmdsel, + stHwConnect := Connect_RF188C_CH01, + aCmdRef := aCommands, + aTxRef := aDataTx, + aRxRef := aDataRx); + + rf186_1_execute_PV := rf186_1_execute; + rf186_1_init_PV := rf186_1_init; + IF(_manualControl) THEN - _testCyclinder.ActivateManualControl(); + ; END_IF; END_METHOD END_CLASS diff --git a/src/components.siemens.identification/app/src/configuration.st b/src/components.siemens.identification/app/src/configuration.st index 90ec05b12..12da444c8 100644 --- a/src/components.siemens.identification/app/src/configuration.st +++ b/src/components.siemens.identification/app/src/configuration.st @@ -10,18 +10,7 @@ CONFIGURATION MyConfiguration {S7.extern=ReadWrite} _rtc : AXOpen.S71500.Rtc; END_VAR - //Copy this VAR_GLOBAL section into your configuration file inside your project. - //Do not change any names, addresses or any another content. - VAR_GLOBAL - {S7.extern=ReadWrite} - HwInputs AT %IB0 : HwInputs; - {S7.extern=ReadWrite} - HwOutputs AT %QB0 : HwOutputs; - {S7.extern=ReadWrite} - PlcInputs : PlcInputs; - {S7.extern=ReadWrite} - PlcOutputs : PlcOutputs; - END_VAR + END_CONFIGURATION diff --git a/src/components.siemens.identification/app/src/program.st b/src/components.siemens.identification/app/src/program.st index beaf8904d..d96de38d9 100644 --- a/src/components.siemens.identification/app/src/program.st +++ b/src/components.siemens.identification/app/src/program.st @@ -3,24 +3,11 @@ PROGRAM MyProgram sandbox : SandboxContext; documentation : DocumentationContext; _rtc : AXOpen.S71500.Rtc; - PlcInputs : PlcInputs; - PlcOutputs : PlcOutputs; END_VAR - CopyInputs(); - - sandbox.PlcInputs := REF(PlcInputs); - sandbox.PlcOutputs := REF(PlcOutputs); sandbox.Run(); sandbox.InjectRtc(_rtc); - - documentation.componentOne.PlcInputs := REF(PlcInputs); - documentation.componentOne.PlcOutputs := REF(PlcOutputs); - documentation.componentTwo.PlcInputs := REF(PlcInputs); - documentation.componentTwo.PlcOutputs := REF(PlcOutputs); documentation.Run(); documentation.InjectRtc(_rtc); - - CopyOutputs(); END_PROGRAM diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_CMD_STRUCT.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_CMD_STRUCT.st index 6d25ad561..a9d20a44d 100644 --- a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_CMD_STRUCT.st +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_CMD_STRUCT.st @@ -1,7 +1,5 @@ NAMESPACE AXOpen.Components.Siemens.Identification - -// TYPE ST_IID_CMD_STRUCT : -// STRUCT + {S7.extern=ReadWrite} CLASS Axo_IID_CMD_STRUCT VAR PUBLIC CMD : eAxo_IID_COMMANDS; //Command ID @@ -13,8 +11,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification CONFIG : BYTE :=BYTE#16#0; //Config Mode for Init CHAINED : BOOL :=FALSE; //Chained Bit: 1= chained; 0=unchained EXT_UHF : Axo_IID_IN_EXT_UHF; //further Atrributes for extended UHF commands -// END_STRUCT -// END_TYPE - END_VAR + END_VAR END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_HW_CONNECT.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_HW_CONNECT.st index 0ce5704ca..b2656fb52 100644 --- a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_HW_CONNECT.st +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_HW_CONNECT.st @@ -15,15 +15,10 @@ NAMESPACE AXOpen.Components.Siemens.Identification |CM_CHANNEL | 1 | 2 | 3 | 4 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | +-----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+ *) - -// TYPE ST_IID_HW_CONNECT : -// STRUCT + {S7.extern=ReadWrite} CLASS Axo_IID_HW_CONNECT VAR PUBLIC - // AMS_NET_ID : T_AmsNetID; //ams net id of profinet controller - // PORT : T_AmsPort; //port of profinet device - AMS_NET_ID : STRING; //ams net id of profinet controller - PORT : STRING; //port of profinet device + HW_ID : WORD := WORD#16#0; //Hardware identifier AR_NUMBER : WORD := WORD#16#0; //Number of AR API : DWORD := DWORD#16#0000_5B00; //API number SLOT : WORD := WORD#16#02; //Slot number @@ -32,8 +27,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification STATUS_WORD : WORD; //status word cyclic data -> link to input word of device CONTROL_WORD : WORD; //control word cyclic data -> link to output word of device Static : Axo_IID_IN_SYNC; -// END_STRUCT -// END_TYPE - END_VAR + END_VAR END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_EXT_UHF.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_EXT_UHF.st index 9e465ca54..c04c21e67 100644 --- a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_EXT_UHF.st +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_EXT_UHF.st @@ -1,7 +1,5 @@ NAMESPACE AXOpen.Components.Siemens.Identification - -// TYPE ST_IID_IN_EXT_UHF : -// STRUCT + {S7.extern=ReadWrite} CLASS Axo_IID_IN_EXT_UHF VAR PUBLIC LEN_ID : BYTE := BYTE#16#0; //Length of EPC-ID (0-62) @@ -12,8 +10,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification INVENTORY_DUR_UNIT : WORD := WORD#16#0; //Duration unit for command "inventory" LOCK_TAG_BANK_ACTION : WORD := WORD#16#0; //Lock-Action for command "lock-tag-bank" LOCK_TAG_BANK_MASK : WORD := WORD#16#0; //Lock Mask for command "lock-tag-bank" -// END_STRUCT -// END_TYPE - END_VAR + END_VAR END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_CONFIGRECORD.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_CONFIGRECORD.st index 0697e9e02..dbd34e779 100644 --- a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_CONFIGRECORD.st +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_CONFIGRECORD.st @@ -1,7 +1,5 @@ NAMESPACE AXOpen.Components.Siemens.Identification - -// TYPE ST_IID_IN_PN_CONFIGRECORD : -// STRUCT + {S7.extern=ReadWrite} CLASS Axo_IID_IN_PN_CONFIGRECORD VAR PUBLIC nRW : WORD; @@ -10,8 +8,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification nSlot : WORD; nSubslot : WORD; record : Axo_IID_IN_PN_RECORDDATA ; -// END_STRUCT -// END_TYPE - END_VAR + END_VAR END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_RECORDDATA.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_RECORDDATA.st index 35cc87f54..37722f5ca 100644 --- a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_RECORDDATA.st +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_PN_RECORDDATA.st @@ -1,7 +1,5 @@ NAMESPACE AXOpen.Components.Siemens.Identification - -// TYPE ST_IID_IN_PN_RECORDDATA : -// STRUCT + {S7.extern=ReadWrite} CLASS Axo_IID_IN_PN_RECORDDATA VAR PUBLIC nIndex : WORD; @@ -9,8 +7,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification nTrans : WORD; nReserve : WORD; buf : ARRAY[0..1034] OF BYTE; -// END_STRUCT -// END_TYPE - END_VAR + END_VAR END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_SYNC.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_SYNC.st index 0ddfc4988..767204141 100644 --- a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_SYNC.st +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IID_IN_SYNC.st @@ -1,7 +1,5 @@ NAMESPACE AXOpen.Components.Siemens.Identification - -// TYPE ST_IID_IN_SYNC : -// STRUCT + {S7.extern=ReadWrite} CLASS Axo_IID_IN_SYNC VAR PUBLIC STATUS_IN_WORK : BOOL := FALSE; //command is in work @@ -41,8 +39,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification buf_maxdata : UINT := UINT#229; //user data size //buf:ARRAY[0..1034] OF BYTE; pnConfigRecord : Axo_IID_IN_PN_CONFIGRECORD; - // END_STRUCT - // END_TYPE END_VAR END_CLASS END_NAMESPACE \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IdentProfile.st b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IdentProfile.st index e9376965e..645b1c6a5 100644 --- a/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IdentProfile.st +++ b/src/components.siemens.identification/ctrl/src/AxoIdentificationDataTypes/Axo_IdentProfile.st @@ -1,7 +1,8 @@ -(* +USING AXOpen.Components.Abstractions.Drives; USING Siemens.Simatic.S71500.DistributedIO; NAMESPACE AXOpen.Components.Siemens.Identification + {S7.extern=ReadWrite} CLASS Axo_IdentProfile VAR statLastErrorStatus : DWORD := DWORD#16#0; // last error status @@ -62,7 +63,7 @@ NAMESPACE AXOpen.Components.Siemens.Identification ERRID_DEVICE_BUSY : WORD := WORD#16#0000_0708; END_VAR - METHOD Run + METHOD PUBLIC Run VAR_INPUT bExecute : BOOL; // rising edge: start command bRepeatCommand : BOOL; // repeat command @@ -121,6 +122,7 @@ NAMESPACE AXOpen.Components.Siemens.Identification tempChar : WSTRING; tempByte : BYTE; tempLoop : UINT; + i : INT; END_VAR @@ -232,18 +234,11 @@ NAMESPACE AXOpen.Components.Siemens.Identification stHwConnect.STATIC.SRESET_cyc := FALSE; // drop internal rpt stHwConnect.STATIC.RPTCMD_cyc := FALSE; - // //Reset ads request - // statAdsRdWrt.WRTRD := FALSE; //Reset WriteRecord request - statWRREC(request := TRUE, - id := TO_UINT(stHwConnect.HW_ID), - index := stHwConnect.STATIC.index, - length := statBufLen, - record := stHwConnect.STATIC.pnConfigRecord.record.buf); - statWRREC.request := FALSE; + statWRREC(request := FALSE, record := stHwConnect.STATIC.pnConfigRecord.record.buf); //Reset ReadRecord request - statRDREC.request := FALSE; + statRDREC(request := FALSE, record := stHwConnect.STATIC.pnConfigRecord.record.buf); // calculate INDEX for old modules and RF68xR IF stHwConnect.STATIC.index_set THEN @@ -259,13 +254,10 @@ NAMESPACE AXOpen.Components.Siemens.Identification stHwConnect.STATIC.STATUS_INITIALISATION := FALSE; stHwConnect.STATIC.STATUS_IN_WORK := TRUE; - // //Reset ads request - // statAdsRdWrt.WRTRD := FALSE; - //Reset WriteRecord request - statWRREC.request := FALSE; + statWRREC(request := FALSE, record := stHwConnect.STATIC.pnConfigRecord.record.buf); //Reset ReadRecord request - statRDREC.request := FALSE; + statRDREC(request := FALSE, record := stHwConnect.STATIC.pnConfigRecord.record.buf); // calculate INDEX for old modules and RF68xR IF stHwConnect.STATIC.index_set THEN @@ -356,19 +348,16 @@ NAMESPACE AXOpen.Components.Siemens.Identification // SRESET is set IF stHwConnect.STATIC.SRESET_cyc THEN - // wait till acycl. communication is done - // IF statAdsRdWrt.BUSY THEN - // statAdsRdWrt(wrtrd:=FALSE); - // statAdsRdWrt.WRTRD := FALSE; - // RETURN; - // END_IF; IF statWRREC.BUSY THEN - THIS.statWRREC(); - statWRREC.request := FALSE; + //Reset WriteRecord request + statWRREC(request := FALSE, record := stHwConnect.STATIC.pnConfigRecord.record.buf); + RETURN; + END_IF; + IF statRDREC.BUSY THEN + //Reset ReadRecord request + statRDREC(request := FALSE, record := stHwConnect.STATIC.pnConfigRecord.record.buf); RETURN; END_IF; - - // if reader/CM has ack the SRESET with active-bit, reset cyclic SRESET and jump to step 8 IF stHwConnect.STATIC.SRESET_active THEN @@ -379,18 +368,20 @@ NAMESPACE AXOpen.Components.Siemens.Identification RETURN; END_IF; END_IF; - // go in statemachine only if Ident_FB is in_work and have no error IF stHwConnect.STATIC.STATUS_IN_WORK AND NOT tempIntError THEN // The loop will only use to jump out at every place if an error occurs - FOR tempTmp := 1 TO UINT#1 DO + FOR tempTmp := UINT#1 TO UINT#1 DO CASE stHwConnect.STATIC.state OF STATE0: //----------------------Initialisation 1---------------------------- // wait if WRREC and RDREC are done - IF statAdsRdWrt.BUSY THEN - statAdsRdWrt(wrtrd:=FALSE); - statAdsRdWrt.WRTRD := FALSE; + IF statWRREC.BUSY THEN + statWRREC(request := FALSE, record := stHwConnect.STATIC.pnConfigRecord.record.buf); + EXIT; + END_IF; + IF statRDREC.BUSY THEN + statRDREC(request := FALSE, record := stHwConnect.STATIC.pnConfigRecord.record.buf); EXIT; END_IF; @@ -456,8 +447,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification // 2/3 - SN stHwConnect.Static.sequence_number := stHwConnect.Static.sequence_number + UINT#1; - // stHwConnect.Static.pnConfigRecord.record.buf[2] := TO_BYTE(SHR(TO_WORD(stHwConnect.Static.sequence_number),8)); - // stHwConnect.Static.pnConfigRecord.record.buf[3] := TO_BYTE(stHwConnect.Static.sequence_number); tempW := TO_WORD(stHwConnect.Static.sequence_number); stHwConnect.Static.pnConfigRecord.record.buf[2] := tempW.%B1; stHwConnect.Static.pnConfigRecord.record.buf[3] := tempW.%B0; @@ -487,12 +476,10 @@ NAMESPACE AXOpen.Components.Siemens.Identification stHwConnect.Static.pnConfigRecord.record.buf[11] := stHwConnect.STATIC.config_value; // zero out telegram buffer - // FILL_BLK(IN := TO_BYTE(16#00), - // COUNT := INT_TO_UINT(34), - // OUT => hw_connect.Static.pnConfigRecord.record.buf[12]); - - MEMSET(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[12]) , fillByte:=16#00 , n:=SIZEOF(stHwConnect.STATIC.pnConfigRecord.record.buf)-12); - + FOR i := 12 TO 1034 DO + stHwConnect.STATIC.pnConfigRecord.record.buf[i] := BYTE#16#00; + END_FOR; + // set offsets for data-buffer statBufLen := UINT#46; statDataTodo := UDINT#0; @@ -503,8 +490,7 @@ NAMESPACE AXOpen.Components.Siemens.Identification // write packet to the client stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(statBufLen); - stHwConnect.Static.pnConfigRecord.nRW := ADS_WRITE; - statAdsRdWrt.WRTRD := TRUE; + statWRREC.request := TRUE; // go to next step stHwConnect.STATIC.state := STATE5; END_IF; @@ -587,9 +573,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification stHwConnect.STATIC.sequence_number := stHwConnect.STATIC.sequence_number + UINT#1; END_IF; - // stHwConnect.Static.pnConfigRecord.record.buf[2] := WORD_TO_BYTE(SHR(UINT_TO_WORD(stHwConnect.Static.sequence_number),8)); - // stHwConnect.Static.pnConfigRecord.record.buf[3] := TO_BYTE(stHwConnect.Static.sequence_number); - tempW := TO_WORD(stHwConnect.Static.sequence_number); stHwConnect.Static.pnConfigRecord.record.buf[2] := tempW.%B1; stHwConnect.Static.pnConfigRecord.record.buf[3] := tempW.%B0; @@ -615,8 +598,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification ELSE statSize := UINT#0; END_IF; - // stHwConnect.Static.pnConfigRecord.record.buf[6] := WORD_TO_BYTE(SHR( UINT_TO_WORD(statAdb),8)); - // stHwConnect.Static.pnConfigRecord.record.buf[7] := TO_BYTE(statAdb); tempW := TO_WORD(statAdb); stHwConnect.Static.pnConfigRecord.record.buf[6] := tempW.%B1; stHwConnect.Static.pnConfigRecord.record.buf[7] := tempW.%B0; @@ -625,9 +606,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification statDbn := UINT#0; END_IF; statDbn := statDbn + UINT#1; - // stHwConnect.Static.pnConfigRecord.record.buf[8] := WORD_TO_BYTE(SHR(UINT_TO_WORD(statDbn),8)); - // stHwConnect.Static.pnConfigRecord.record.buf[9] := TO_BYTE(statDbn); - tempW := TO_WORD(statDbn); stHwConnect.Static.pnConfigRecord.record.buf[8] := tempW.%B1; stHwConnect.Static.pnConfigRecord.record.buf[9] := tempW.%B0; @@ -656,11 +634,10 @@ NAMESPACE AXOpen.Components.Siemens.Identification statBufLen := statBufLen + stHwConnect.STATIC.buf_header; // zero out telegram buffer - // FILL_BLK(IN := TO_BYTE(16#00), - // COUNT := INT_TO_UINT(statSize), - // OUT => hw_connect.Static.pnConfigRecord.record.buf[11]); - - MEMSET(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[11]) , fillByte:=16#00 , n:=statSize); + FOR i := 11 TO TO_INT(UINT#11 + statSize) DO + stHwConnect.Static.pnConfigRecord.record.buf[i] := BYTE#16#0; + END_FOR; + // build CMD-Header in first telegram IF NOT statFurtherTelegram THEN // save chained counter @@ -690,26 +667,18 @@ NAMESPACE AXOpen.Components.Siemens.Identification // 14-15 address IF statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite THEN - // stHwConnect.Static.pnConfigRecord.record.buf[14] := DWORD_TO_BYTE(SHR(statCmd.ADDR_TAG,8)); - // stHwConnect.Static.pnConfigRecord.record.buf[15] := DWORD_TO_BYTE(statCmd.ADDR_TAG); stHwConnect.Static.pnConfigRecord.record.buf[14] := statCmd.ADDR_TAG.%B1; stHwConnect.Static.pnConfigRecord.record.buf[15] := statCmd.ADDR_TAG.%B0; END_IF; // 16#-17 Length IF statCmd.CMD = eAxo_IID_COMMANDS#eWriteID OR statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite THEN - // stHwConnect.Static.pnConfigRecord.record.buf[16] := WORD_TO_BYTE(SHR(statCmd.LEN_DATA,8)); - // stHwConnect.Static.pnConfigRecord.record.buf[17] := WORD_TO_BYTE(statCmd.LEN_DATA); stHwConnect.Static.pnConfigRecord.record.buf[16] := statCmd.LEN_DATA.%B1; stHwConnect.Static.pnConfigRecord.record.buf[17] := statCmd.LEN_DATA.%B0; END_IF; // 18-19 pswd IF statCmd.CMD = eAxo_IID_COMMANDS#eWriteID OR statCmd.CMD = eAxo_IID_COMMANDS#eKillTag OR statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite OR statCmd.CMD = eAxo_IID_COMMANDS#eLockTagBank THEN - // stHwConnect.Static.pnConfigRecord.record.buf[18] := DWORD_TO_BYTE(SHR(statCmd.EXT_UHF.PSWD,24)); - // stHwConnect.Static.pnConfigRecord.record.buf[19] := DWORD_TO_BYTE(SHR(statCmd.EXT_UHF.PSWD,16)); - // stHwConnect.Static.pnConfigRecord.record.buf[20] := DWORD_TO_BYTE(SHR(statCmd.EXT_UHF.PSWD,8)); - // stHwConnect.Static.pnConfigRecord.record.buf[21] := DWORD_TO_BYTE(statCmd.EXT_UHF.PSWD); stHwConnect.Static.pnConfigRecord.record.buf[18] := statCmd.EXT_UHF.PSWD.%B3; stHwConnect.Static.pnConfigRecord.record.buf[19] := statCmd.EXT_UHF.PSWD.%B2; stHwConnect.Static.pnConfigRecord.record.buf[20] := statCmd.EXT_UHF.PSWD.%B1; @@ -718,10 +687,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification // action & mask IF statCmd.CMD = eAxo_IID_COMMANDS#eLockTagBank THEN - // stHwConnect.Static.pnConfigRecord.record.buf[22] := WORD_TO_BYTE(SHR(statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION,8)); - // stHwConnect.Static.pnConfigRecord.record.buf[23] := WORD_TO_BYTE(statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION); - // stHwConnect.Static.pnConfigRecord.record.buf[24] := WORD_TO_BYTE(SHR(statCmd.EXT_UHF.LOCK_TAG_BANK_MASK,8)); - // stHwConnect.Static.pnConfigRecord.record.buf[25] := WORD_TO_BYTE(statCmd.EXT_UHF.LOCK_TAG_BANK_MASK); stHwConnect.Static.pnConfigRecord.record.buf[22] := statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION.%B1; stHwConnect.Static.pnConfigRecord.record.buf[23] := statCmd.EXT_UHF.LOCK_TAG_BANK_ACTION.%B0; stHwConnect.Static.pnConfigRecord.record.buf[24] := statCmd.EXT_UHF.LOCK_TAG_BANK_MASK.%B1; @@ -739,7 +704,10 @@ NAMESPACE AXOpen.Components.Siemens.Identification // COUNT := BYTE_TO_UDINT(statCmd.EXT_UHF.LEN_ID), // OUT => hw_connect.Static.pnConfigRecord.record.buf[27]); - MEMCPY(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[27]) , srcAddr:=ADR(statCmd.EPCID_UID[1]) , n:=statCmd.EXT_UHF.LEN_ID ); + // MEMCPY(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[27]) , srcAddr:=ADR(statCmd.EPCID_UID[1]) , n:=statCmd.EXT_UHF.LEN_ID ); + FOR i := 1 TO TO_INT(statCmd.EXT_UHF.LEN_ID) DO + stHwConnect.Static.pnConfigRecord.record.buf[26+i] := statCmd.EPCID_UID[i]; + END_FOR; END_IF; ELSE // 12-19 UID @@ -748,13 +716,14 @@ NAMESPACE AXOpen.Components.Siemens.Identification // COUNT := 8, // OUT => hw_connect.Static.pnConfigRecord.record.buf[12]); - MEMCPY(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[12]) , srcAddr:=ADR(statCmd.EPCID_UID[1]) , n:=8 ); + // MEMCPY(destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[12]) , srcAddr:=ADR(statCmd.EPCID_UID[1]) , n:=8 ); + FOR i := 1 TO 8 DO + stHwConnect.Static.pnConfigRecord.record.buf[11+i] := statCmd.EPCID_UID[i]; + END_FOR; END_IF; // 32-33 Length IF (statCmd.CMD = eAxo_IID_COMMANDS#ePut OR statCmd.CMD = eAxo_IID_COMMANDS#eFormat OR statCmd.CMD = eAxo_IID_COMMANDS#eRead OR statCmd.CMD = eAxo_IID_COMMANDS#eWrite OR statCmd.CMD = eAxo_IID_COMMANDS#eWriteConfig) THEN - // stHwConnect.Static.pnConfigRecord.record.buf[32] := WORD_TO_BYTE(SHR(statCmd.LEN_DATA,8)); - // stHwConnect.Static.pnConfigRecord.record.buf[33] := WORD_TO_BYTE(statCmd.LEN_DATA); stHwConnect.Static.pnConfigRecord.record.buf[32] := statCmd.LEN_DATA.%B1; stHwConnect.Static.pnConfigRecord.record.buf[33] := statCmd.LEN_DATA.%B0; END_IF; @@ -828,10 +797,15 @@ NAMESPACE AXOpen.Components.Siemens.Identification // EXIT; // END_IF; - MEMCPY( - destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[tempBufoffset]) , - srcAddr:=ADR(aTxref[statLowerBoundTxref + TO_DINT(statDataOffset)]) , - n:=TO_UDINT(tempI) ); + // MEMCPY( + // destAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[tempBufoffset]) , + // srcAddr:=ADR(aTxref[statLowerBoundTxref + TO_DINT(statDataOffset)]) , + // n:=TO_UDINT(tempI) ); + + FOR i := 1 TO TO_INT(tempI) DO + stHwConnect.Static.pnConfigRecord.record.buf[TO_INT(tempBufoffset)+i-INT#1] := aTxref[statLowerBoundTxref + TO_DINT(statDataOffset) + i - 1]; + END_FOR; + END_IF; @@ -845,31 +819,32 @@ NAMESPACE AXOpen.Components.Siemens.Identification // first call of wrrec stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(statBufLen); - stHwConnect.Static.pnConfigRecord.nRW := ADS_WRITE; - statAdsRdWrt.WRTRD := TRUE; - // statWRREC(REQ := TRUE, - // ID := WORD_TO_UINT(hw_connect.HW_ID), - // INDEX := hw_connect.STATIC.index, - // LEN := INT_TO_UINT(statBufLen), - // RECORD := hw_connect.STATIC.buf); - // // save error till next plc-cycle - // statSaveError := statWRREC.ERROR; - // statIntStatus := statWRREC.STATUS; + // stHwConnect.Static.pnConfigRecord.nRW := ADS_WRITE; + // statAdsRdWrt.WRTRD := TRUE; + statWRREC.request := TRUE; + statWRREC(request := TRUE, + id := stHwConnect.HW_ID, + index := stHwConnect.STATIC.index, + length := statBufLen, + record := stHwConnect.Static.pnConfigRecord.record.buf); + + // save error till next plc-cycle + statSaveError := statWRREC.ERROR; + statIntStatus := statWRREC.STATUS; stHwConnect.STATIC.state := STATE5; STATE5: //------------------------------------finish ADS WRITE-------------------------------------- // reset start request - statAdsRdWrt.WRTRD := FALSE; + statWRREC.request := FALSE; // error at WRREC - IF statAdsRdWrt.ERR OR statSaveAdsError THEN - + IF statWRREC.error OR statSaveAdsError THEN stHwConnect.STATIC.acyc_active := false; - IF NOT statSaveAdsError THEN - tempStatus := TO_WORD(statAdsRdWrt.ERRID); + // tempStatus := TO_WORD(statAdsRdWrt.ERRID); + tempStatus := TO_WORD(statWRREC.status); //TODO:from DWORD to WORD ??? ELSE tempStatus := TO_WORD(statIntAdsErrId); END_IF; @@ -879,41 +854,43 @@ NAMESPACE AXOpen.Components.Siemens.Identification stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(statBufLen); stHwConnect.Static.pnConfigRecord.nRW := ADS_WRITE; - statAdsRdWrt.WRTRD := TRUE; + statWRREC.request := TRUE; + // statAdsRdWrt.WRTRD := TRUE; // statWRREC(REQ := TRUE, // ID := WORD_TO_UINT(hw_connect.HW_ID), // INDEX := hw_connect.STATIC.index, // LEN := INT_TO_UINT(statBufLen), // RECORD := hw_connect.STATIC.buf); - // statSaveError := statWRREC.ERROR; - // statIntStatus := statWRREC.STATUS; - + statSaveError := statWRREC.error; + statIntStatus := statWRREC.status; EXIT; END_IF; IF statPduDetection AND stHwConnect.STATIC.index_set THEN // first pdu-detection with PROFINET-index was failed. try again with PROFIBUS-index stHwConnect.STATIC.state := STATE2; stHwConnect.STATIC.index := stHwConnect.CM_CHANNEL + UINT#100; - stHwConnect.STATIC.index_set := false; - statPduRepeat := true; - statSaveError := false; + stHwConnect.STATIC.index_set := FALSE; + statPduRepeat := TRUE; + statSaveError := FALSE; ELSE // any other error is occured => go to error_routine - tempIntError := true; + tempIntError := TRUE; IF NOT statSaveError THEN - statIntStatus := statAdsRdWrt.ERRID; + // statIntStatus := statAdsRdWrt.ERRID; + statIntStatus := statWRREC.status; ELSE - statSaveError := false; + statSaveError := FALSE; END_IF; EXIT; END_IF; // WRREC was finished wothout errors - ELSIF statAdsRdWrt.BUSY = FALSE AND NOT statAdsRdWrt.ERR = TRUE THEN - stHwConnect.STATIC.acyc_active := false; + // ELSIF statAdsRdWrt.BUSY = FALSE AND NOT statAdsRdWrt.ERR = TRUE THEN + ELSIF statWRREC.done AND NOT statWRREC.busy AND NOT statWRREC.error THEN + stHwConnect.STATIC.acyc_active := FALSE; IF statDataTodo > UDINT#0 THEN // write next packet of command stHwConnect.STATIC.state := STATE4; - statFurtherTelegram := true; + statFurtherTelegram := TRUE; ELSE // if chained comands => increase internal cmd_selektor and get next command //MN++++ IF statCmd.CHAINED AND statCmdSelCounter < UINT#100 AND NOT stHwConnect.STATIC.STATUS_INITIALISATION THEN @@ -1013,8 +990,9 @@ NAMESPACE AXOpen.Components.Siemens.Identification stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(stHwConnect.STATIC.buf_max); stHwConnect.Static.pnConfigRecord.nRW := ADS_READ; - statAdsRdWrt.WRTRD := TRUE; + statRDREC.request := TRUE; + // statAdsRdWrt.WRTRD := TRUE; // statRDREC(REQ := TRUE, // ID := WORD_TO_UINT(hw_connect.HW_ID), // INDEX := hw_connect.STATIC.index, @@ -1023,6 +1001,9 @@ NAMESPACE AXOpen.Components.Siemens.Identification // // save error till next plc-cycle // statSaveError := statRDREC.ERROR; // statIntStatus := statRDREC.STATUS; + + statSaveError := statRDREC.error; + statIntStatus := statRDREC.status; ELSIF stHwConnect.STATIC.RPTCMD_cyc AND NOT stHwConnect.STATIC.RPTCMD_active THEN // check timeout for repeat support @@ -1042,17 +1023,18 @@ NAMESPACE AXOpen.Components.Siemens.Identification STATE7: //---------------------finish RDREC and receive data---------------------------- // reset start request - statAdsRdWrt.WRTRD := FALSE; + statRDREC.request := FALSE; + // statAdsRdWrt.WRTRD := FALSE; statEmptyCycle := TRUE; // error at RDREC - IF statAdsRdWrt.ERR OR statSaveAdsError THEN + IF statRDREC.error OR statSaveAdsError THEN stHwConnect.STATIC.acyc_active := false; IF NOT statSaveAdsError THEN - tempStatus := TO_WORD(statAdsRdWrt.ERRID); + tempStatus := TO_WORD(statRDREC.status); // Todo: from DWORD to Word ??? ELSE tempStatus := TO_WORD(statIntAdsErrId); END_IF; @@ -1062,7 +1044,8 @@ NAMESPACE AXOpen.Components.Siemens.Identification stHwConnect.Static.pnConfigRecord.record.nLen := TO_WORD(stHwConnect.STATIC.buf_max); stHwConnect.Static.pnConfigRecord.nRW := ADS_READ; - statAdsRdWrt.WRTRD := TRUE; + statRDREC.request := TRUE; + // statAdsRdWrt.WRTRD := TRUE; // statWRREC(REQ := TRUE, // ID := WORD_TO_UINT(hw_connect.HW_ID), // INDEX := hw_connect.STATIC.index, @@ -1070,7 +1053,8 @@ NAMESPACE AXOpen.Components.Siemens.Identification // RECORD := hw_connect.STATIC.buf); // statSaveError := statWRREC.ERROR; // statIntStatus := statWRREC.STATUS; - + statSaveError := statRDREC.ERROR; + statIntStatus := statRDREC.STATUS; EXIT; END_IF; @@ -1087,7 +1071,8 @@ NAMESPACE AXOpen.Components.Siemens.Identification // any other error is occured => go to error_routine tempIntError := true; IF NOT statSaveError THEN - statIntStatus := statAdsRdWrt.ERRID; + statIntStatus := statRDREC.status; + // statIntStatus := statAdsRdWrt.ERRID; ELSE statSaveError := FALSE; statSaveAdsError := FALSE; @@ -1095,25 +1080,19 @@ NAMESPACE AXOpen.Components.Siemens.Identification EXIT; END_IF; // RDREC was finished without errors - ELSIF NOT statAdsRdWrt.BUSY AND NOT statAdsRdWrt.ERR THEN + // ELSIF NOT statAdsRdWrt.BUSY AND NOT statAdsRdWrt.ERR THEN + ELSIF statRDREC.valid AND NOT statRDREC.busy AND NOT statRDREC.error THEN stHwConnect.STATIC.acyc_active := false; // check error byte tempB := stHwConnect.Static.pnConfigRecord.record.buf[5]; // Read ADB to check at error MN++++ - // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[7]); - // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[6]),8); - // tempAdb := WORD_TO_UINT(tempW); tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[7]; tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[6]; tempAdb := TO_UINT(tempW); // Read DBN to check at error MN++++ - // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[9]); - // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[8]),8); - // tempDbn := WORD_TO_UINT(tempW); - tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[9]; tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[8]; tempDbn := TO_UINT(tempW); @@ -1142,11 +1121,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification // any other error is occured => go to error_routine tempIntError := true; // save PIB-Status - // statIntStatus := TO_DWORD(stHwConnect.Static.pnConfigRecord.record.buf[11 + 3]); - // statIntStatus := statIntStatus OR SHL(TO_DWORD(stHwConnect.Static.pnConfigRecord.record.buf[11 + 2]),8); - // statIntStatus := statIntStatus OR SHL(TO_DWORD(stHwConnect.Static.pnConfigRecord.record.buf[11 + 1]),16); - // statIntStatus := statIntStatus OR SHL(TO_DWORD(stHwConnect.Static.pnConfigRecord.record.buf[11]),24); - tempDword.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[14]; tempDword.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[13]; tempDword.%B2 := stHwConnect.Static.pnConfigRecord.record.buf[12]; @@ -1165,10 +1139,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification END_IF; // check sequence number - // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[3]); - // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[2]),8); - // tempI := WORD_TO_UINT(tempW); - tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[3]; tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[2]; tempI := TO_UINT(tempW); @@ -1231,8 +1201,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification nTrlen := 2; - // tempI := WORD_TO_UINT(stHwConnect.Static.pnConfigRecord.record.buf[12]); - // tempI := WORD_TO_UINT(UINT_TO_WORD(tempI) OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[11]),8)); tempW.%B0:= stHwConnect.Static.pnConfigRecord.record.buf[12]; tempW.%B1:= stHwConnect.Static.pnConfigRecord.record.buf[11]; tempI := TO_UINT(tempW); @@ -1287,8 +1255,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification END_IF; // check/process adb - // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[7]); - // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[6]),8); tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[7]; tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[6]; @@ -1312,9 +1278,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification END_IF; // check dbn, determining next state - // tempW := TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[9]); - // tempW := tempW OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[8]),8); - // statDbn := WORD_TO_UINT(tempW); tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[9]; tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[8]; statDbn := TO_UINT(tempW); @@ -1371,8 +1334,6 @@ NAMESPACE AXOpen.Components.Siemens.Identification // check dbl // if PDU > 240, length is only in byte 0 and 1 IF stHwConnect.STATIC.buf_max > UINT#240 THEN - // statSize := TO_UINT(stHwConnect.Static.pnConfigRecord.record.buf[1]); - // statSize := TO_UINT(TO_WORD(statSize) OR SHL(TO_WORD(stHwConnect.Static.pnConfigRecord.record.buf[0]),8)); tempW.%B0 := stHwConnect.Static.pnConfigRecord.record.buf[1]; tempW.%B1 := stHwConnect.Static.pnConfigRecord.record.buf[0]; statSize := TO_UINT(tempW); @@ -1399,11 +1360,15 @@ NAMESPACE AXOpen.Components.Siemens.Identification EXIT; ELSE // anything ok, copy over data - - MEMCPY( - destAddr:=ADR(aRxref[statLowerBoundRxref + UDINT_TO_DINT(statRecvOffset)]) , - srcAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[stHwConnect.STATIC.buf_header]) , - n:=UINT_TO_UDINT(statSize)); + // MEMCPY( + // destAddr:=ADR(aRxref[statLowerBoundRxref + UDINT_TO_DINT(statRecvOffset)]) , + // srcAddr:=ADR(stHwConnect.Static.pnConfigRecord.record.buf[stHwConnect.STATIC.buf_header]) , + // n:=UINT_TO_UDINT(statSize)); + + FOR i := 1 TO TO_INT(statSize) DO + aRxref[statLowerBoundRxref + TO_DINT(statRecvOffset) + TO_DINT(i) - DINT#1] := stHwConnect.Static.pnConfigRecord.record.buf[stHwConnect.STATIC.buf_header + TO_UINT(i) - UINT#1]; + END_FOR; + // IF TypeOfElements(txref) = Char THEN // FOR tempLoop := 0 TO statSize - 1 DO @@ -1529,28 +1494,45 @@ NAMESPACE AXOpen.Components.Siemens.Identification stHwConnect.Static.pnConfigRecord.nNrAr := stHwConnect.AR_NUMBER; stHwConnect.Static.pnConfigRecord.record.nIndex := TO_WORD(stHwConnect.Static.index); - statAdsRdWrt( - NETID:= stHwConnect.AMS_NET_ID, - PORT:= stHwConnect.PORT, - IDXGRP:= 16#0000_F823, - IDXOFFS:= 16#0000_0000, - WRITELEN:= stHwConnect.Static.pnConfigRecord.record.nLen + PN_CONFIGRECORD_HEADER_LEN, - READLEN:= stHwConnect.Static.pnConfigRecord.record.nLen, - SRCADDR:= ADR(stHwConnect.Static.pnConfigRecord), - DESTADDR:= ADR(stHwConnect.Static.pnConfigRecord.record.buf), - // WRTRD:= , - TMOUT:= ADS_TIMEOUT//, - // BUSY=> , - // ERR=> , - // ERRID=> - ); + statWRREC( id := stHwConnect.HW_ID, + index := stHwConnect.STATIC.index, + length := TO_UINT(stHwConnect.Static.pnConfigRecord.record.nLen) + PN_CONFIGRECORD_HEADER_LEN, + record := stHwConnect.Static.pnConfigRecord.record.buf); + + statRDREC( id := stHwConnect.HW_ID, + index := stHwConnect.STATIC.index, + maxLength := stHwConnect.Static.buf_max, + record := stHwConnect.Static.pnConfigRecord.record.buf); + + // statAdsRdWrt( + // NETID:= stHwConnect.AMS_NET_ID, + // PORT:= stHwConnect.PORT, + // IDXGRP:= 16#0000_F823, + // IDXOFFS:= 16#0000_0000, + // WRITELEN:= stHwConnect.Static.pnConfigRecord.record.nLen + PN_CONFIGRECORD_HEADER_LEN, + // READLEN:= stHwConnect.Static.pnConfigRecord.record.nLen, + // SRCADDR:= ADR(stHwConnect.Static.pnConfigRecord), + // DESTADDR:= ADR(stHwConnect.Static.pnConfigRecord.record.buf), + // // WRTRD:= , + // TMOUT:= ADS_TIMEOUT//, + // // BUSY=> , + // // ERR=> , + // // ERRID=> + // ); statEmptyCycle := FALSE; // save istantly rising errors for statemachine - statSaveAdsError := statAdsRdWrt.ERR; - statIntAdsErrId := statAdsRdWrt.ERRID; - + // statSaveAdsError := statAdsRdWrt.ERR; + // statIntAdsErrId := statAdsRdWrt.ERRID; + statSaveAdsError := statWRREC.error OR statRDREC.error; + IF statWRREC.error THEN + statIntAdsErrId := TO_UDINT(statWRREC.status); + ELSIF statRDREC.error THEN + statIntAdsErrId := TO_UDINT(statRDREC.status); + ELSE + statIntAdsErrId := UDINT#0; + END_IF; // error handling @@ -1599,4 +1581,3 @@ NAMESPACE AXOpen.Components.Siemens.Identification END_METHOD END_CLASS END_NAMESPACE -*) \ No newline at end of file diff --git a/src/components.siemens.identification/ctrl/src/ExampleCylinder.st b/src/components.siemens.identification/ctrl/src/ExampleCylinder.st deleted file mode 100644 index fef1ecf8b..000000000 --- a/src/components.siemens.identification/ctrl/src/ExampleCylinder.st +++ /dev/null @@ -1,135 +0,0 @@ -USING AXOpen.Core; -USING AXOpen.Messaging; -USING AXOpen.Messaging.Static; - - -NAMESPACE AXOpen.Components.Siemens.Identification.Example - {S7.extern=ReadWrite} - CLASS ExampleCylinder EXTENDS AXOpen.Core.AxoComponent - VAR PUBLIC - {#ix-attr:[Container(Layout.Wrap)]} - {#ix-attr:[ComponentHeader()]} - MoveToWork : AxoTask; - {#ix-attr:[ComponentHeader()]} - MoveToHome : AxoTask; - - {#ix-attr:[ComponentDetails("Tasks")]} - Stop : AxoTask; - - {#ix-attr:[Container(Layout.Stack)]} - {#ix-attr:[ComponentDetails("Signals")]} - {#ix-attr:[ReadOnly()]} - {#ix-set:AttributeName = "<#Home sensor#>"} - _HomeSensor : BOOL; - {#ix-attr:[ComponentDetails("Signals")]} - {#ix-attr:[ReadOnly()]} - {#ix-set:AttributeName = "<#Work sensor#>"} - _WorkSensor : BOOL; - {#ix-attr:[Container(Layout.Stack)]} - {#ix-attr:[ComponentDetails("Signals")]} - {#ix-attr:[ReadOnly()]} - {#ix-set:AttributeName = "<#Move home signal#>"} - _MoveHomeSignal : BOOL; - {#ix-attr:[ComponentDetails("Signals")]} - {#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; - END_VAR - - /// - /// Runs tasks and logic of this component. - /// >[!IMPORTANT] This method must or one of its overloads be called cyclically. - /// - METHOD PUBLIC Run - VAR_INPUT - parent : IAxoObject; - homeSensor : REF_TO BOOL; - workSensor : REF_TO BOOL; - moveHomeSignal : REF_TO BOOL; - moveWorkSignal : REF_TO BOOL; - END_VAR - IF (parent = NULL) THEN RETURN; END_IF; - THIS.Initialize(parent); - THIS.Run(parent.GetContext(), homeSensor, workSensor, moveHomeSignal, moveWorkSignal); - END_METHOD - - /// - /// Runs tasks and logic of this component. - /// >[!IMPORTANT] This method must or one of its overloads be called cyclically. - /// - METHOD PUBLIC Run - VAR_INPUT - context : IAxoContext; - homeSensor : REF_TO BOOL; - workSensor : REF_TO BOOL; - moveHomeSignal : REF_TO BOOL; - moveWorkSignal : REF_TO BOOL; - END_VAR - - THIS.Open(); - - THIS.Initialize(context); - MoveToWork.Initialize(THIS); - MoveToHome.Initialize(THIS); - Stop.Initialize(THIS); - - _MoveToWorkNotReached.Serve(THIS); - _MoveToHomeNotReached.Serve(THIS); - - IF(Stop.Execute()) THEN - moveHomeSignal^ := FALSE; - moveWorkSignal^ := FALSE; - MoveToHome.Restore(); - MoveToWork.Restore(); - Stop.DoneWhen(TRUE); - Stop.Restore(); - END_IF; - - IF(MoveToWork.Execute()) THEN - moveHomeSignal^ := FALSE; - moveWorkSignal^ := TRUE; - MoveToWork.DoneWhen(workSensor^); - MoveToHome.Restore(); - - _MoveToWorkNotReached.ActivateOnCondition(MoveToWork.Duration >= T#10S, eAxoMessageCategory#Error); - END_IF; - - IF(MoveToHome.Execute()) THEN - moveHomeSignal^ := TRUE; - moveWorkSignal^ := FALSE; - MoveToHome.DoneWhen(homeSensor^); - MoveToWork.Restore(); - _MoveToHomeNotReached.ActivateOnCondition(MoveToHome.Duration >= T#10S, eAxoMessageCategory#Error); - END_IF; - - _HomeSensor := homeSensor^; - _WorkSensor := workSensor^; - - _MoveHomeSignal := moveHomeSignal^; - _MoveWorkSignal := moveWorkSignal^; - - THIS.Close(); - END_METHOD - - METHOD PROTECTED OVERRIDE ManualControl - THIS._isManuallyControllable := true; - END_METHOD - - /// - /// Restores this component into intial state. - /// - METHOD PUBLIC OVERRIDE Restore - MoveToWork.Restore(); - MoveToWork.Restore(); - Stop.Restore(); - END_METHOD - END_CLASS -END_NAMESPACE diff --git a/src/components.siemens.identification/ctrl/test/CylinderTests.st b/src/components.siemens.identification/ctrl/test/test.st similarity index 64% rename from src/components.siemens.identification/ctrl/test/CylinderTests.st rename to src/components.siemens.identification/ctrl/test/test.st index f2f3582cf..f60e52e46 100644 --- a/src/components.siemens.identification/ctrl/test/CylinderTests.st +++ b/src/components.siemens.identification/ctrl/test/test.st @@ -1,9 +1,8 @@ -USING AXOpen.Components.Siemens.Identification.Example; USING AXOpen.Core; USING AXOpen.Rtc; USING AXOpen.Logging; -NAMESPACE Cylinder.Tests +NAMESPACE Tests {S7.extern=ReadWrite} CLASS TestContext IMPLEMENTS AXOpen.Core.IAxoContext VAR @@ -53,27 +52,14 @@ NAMESPACE Cylinder.Tests END_CLASS {TestFixture} {S7.extern=ReadWrite} - CLASS CylinderTests + CLASS MyTests VAR context : TestContext; - cylinder : ExampleCylinder; - _homeSensor : BOOL; - _workSensor : BOOL; - _moveHomeSignal : BOOL; - _moveWorkSignal : BOOL; - _done : BOOL; + END_VAR {Test} - METHOD PUBLIC MoveHome - WHILE _done DO - context.Open(); - _done := Cylinder.MoveToHome.Invoke().IsDone(); - cylinder.Run(context, _homeSensor, _workSensor, _moveHomeSignal, _moveWorkSignal); - AxUnit.Assert.Equal(_moveHomeSignal, _moveHomeSignal); - context.Close(); - END_WHILE; - - + METHOD PUBLIC MyTest + AxUnit.Assert.Equal(TRUE,TRUE); END_METHOD END_CLASS END_NAMESPACE diff --git a/src/components.siemens.identification/src/AXOpen.Components.Siemens.Identification/ExampleCylinder/ExampleCylinder.cs b/src/components.siemens.identification/src/AXOpen.Components.Siemens.Identification/ExampleCylinder/ExampleCylinder.cs deleted file mode 100644 index 8dec6bef2..000000000 --- a/src/components.siemens.identification/src/AXOpen.Components.Siemens.Identification/ExampleCylinder/ExampleCylinder.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AXOpen.Components.Siemens.Identification.Example -{ - public partial class ExampleCylinder - { - public async Task WriteTaskDurationToConsole() - { - foreach (var task in this.GetChildren().OfType()) - { - Console.WriteLine($"{task.Symbol} : {await task.Duration.GetAsync()}"); - } - } - } -}