tecnopack docs

This commit is contained in:
Giuseppe De Franceschi 2025-08-19 12:00:15 +02:00
parent bb13707319
commit 111a3eeab9
92 changed files with 3566 additions and 18651 deletions

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Tecno Pack SPA
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,41 +1,74 @@
# Website # 🚀 TP Docs - Documentazione Tecnica
This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. Benvenuto nel progetto **TP Docs**, il sito di documentazione ufficiale per il nostro team di sviluppo!
## Installation Questo progetto è costruito con [Docusaurus](https://docusaurus.io/), uno strumento moderno per creare siti di documentazione veloci, belli e facili da mantenere.
---
## 👩‍💻 Guida per gli Sviluppatori
Se sei uno sviluppatore, questa sezione ti spiega come collaborare in modo ordinato e sicuro usando Git e GitLab.
### Requisiti
- Git installato sul tuo computer
- Accesso al repository (chiedi al maintainer)
- Account GitLab attivo
### Passaggi rapidi
1. **Clona il repository**
```bash ```bash
yarn git clone https://gitlab.tecnopackspa.it/tp-docs/tp-docs.git
cd tp-docs
``` ```
## Local Development 2. **Crea un branch per il tuo lavoro**
Non lavorare mai direttamente su `master`.
```bash ```bash
yarn start git checkout -b feature/nome-funzionalità
``` ```
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. 3. **Modifica, committa e push**
## Build Lavora sul codice, aggiungi le modifiche e crea commit chiari.
```bash 4. **Crea una Merge Request (MR)**
yarn build
```
This command generates static content into the `build` directory and can be served using any static contents hosting service. Spingi il branch su GitLab e apri una MR per la revisione.
## Deployment ---
Using SSH: ## 📚 Documentazione Completa
```bash Per approfondire, consulta le guide dettagliate:
USE_SSH=true yarn deploy
```
Not using SSH: - [Guida per gli sviluppatori](project_documentation/DEV_GUIDE.md)
- [Guida per i maintainer](project_documentation/MAINTAINER_GUIDE.md)
```bash ---
GIT_USER=<Your GitHub username> yarn deploy
```
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. ## 🔧 Come contribuire
Vuoi contribuire a migliorare la documentazione? Ottimo!
Segui la [guida per gli sviluppatori](project_documentation/DEV_GUIDE.md), apri una MR e partecipa alla crescita del progetto.
---
## 🌐 Sito Web
Il sito di documentazione è disponibile all'indirizzo:
[https://docs.gitlab.tecnopackspa.it](http://172.17.1.43/)
---
## 🤝 Contatti
Per supporto o domande, contatta il maintainer del progetto.
---
*Buona documentazione e buon lavoro! 🚀*

View File

@ -1,12 +0,0 @@
---
slug: first-blog-post
title: First Blog Post
authors: [slorber, yangshun]
tags: [hola, docusaurus]
---
Lorem ipsum dolor sit amet...
<!-- truncate -->
...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View File

@ -1,44 +0,0 @@
---
slug: long-blog-post
title: Long Blog Post
authors: yangshun
tags: [hello, docusaurus]
---
This is the summary of a very long blog post,
Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
<!-- truncate -->
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View File

@ -1,24 +0,0 @@
---
slug: mdx-blog-post
title: MDX Blog Post
authors: [slorber]
tags: [docusaurus]
---
Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).
:::tip
Use the power of React to create interactive blog posts.
:::
{/* truncate */}
For example, use JSX to create an interactive button:
```js
<button onClick={() => alert('button clicked!')}>Click me!</button>
```
<button onClick={() => alert('button clicked!')}>Click me!</button>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

View File

@ -1,29 +0,0 @@
---
slug: welcome
title: Welcome
authors: [slorber, yangshun]
tags: [facebook, hello, docusaurus]
---
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
Here are a few tips you might find useful.
<!-- truncate -->
Simply add Markdown files (or folders) to the `blog` directory.
Regular blog authors can be added to `authors.yml`.
The blog post date can be extracted from filenames, such as:
- `2019-05-30-welcome.md`
- `2019-05-30-welcome/index.md`
A blog post folder can be convenient to co-locate blog post images:
![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg)
The blog supports tags as well!
**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.

View File

@ -0,0 +1,159 @@
---
title: "Flowpack PLC - Changelog V24.x"
description: "Dettagli aggiornamenti firmware e modifiche al software Flowpack PLC"
slug: "/changelog/rockwell-fp-v24"
authors: [Rockwell]
tags: [changelog, release, rockwell, flowpack]
---
# 🛠️ FLOWPACK - PLC Changelog V24.x
<!-- truncate -->
---
## V24.00 Inizio dei tempi
```
__
/ _)
_.----._/ /
/ /
__/ ( | ( |
/__.-'|_|--|_| \|/ \|/ \|/
```
---
## V24.01 Chiudi spazio, clutch e modulazioni migliorate
### 🔧 Nuove funzionalità e Hotfix
- Nuova funzionalità su **chiudi spazio**:
- Possibilità di mantenere attiva la chiusura spazio per un certo spazio aggiuntivo (default = 0)
- HotFix cicli clutch su NpNb e VirtCr:
- Al passo 12: attesa su `Axis.PositionCamStatus` (non più `Axis.PositionCamLockStatus`)
- Al passo 20: attesa su NOT `Axis.PositionCamLockStatus` (non più NOT `Axis.PositionCamStatus`)
- Replace del numero magico:
- `360` sostituito da `stAxis.Param.ReModulo` o `stAxisMaster.Param.ReModulo` dove necessario
- `180` sostituito da `stAxis.Param.ReModulo/2` o `stAxisMaster.Param.ReModulo/2`
- HotFix programmi `P0421_AxWhChain_x2` e `P0722_AxConveyorChain_x2`:
- Corretto problema bit `.ER` di MOTION_INSTRUCTION asse left che scatenava allarme asse right
---
## V24.02 Inizializzazione AxisIndex
- Inizializzato `AxisIndex` di `RecProdCurve`
---
## V24.03 Correzioni camme e completamenti
- HotFix su `P0401_AxWheel1`, routine `R80_Reg_input1`:
- Uso corretto di `stAxisMaster.Param.ReModulo` invece di `stAxis.Param.ReModulo` (errore V24.01)
- Modifica camma carro crimper traslante:
- Velocità riferimento ora massima, non più nominale
- Rimossa riduzione automatica tempo saldatura per valori corsa fuori range
- _Nota:_ “Con buona pace di chi lo vuole come Omron…”
- Completamento condizione `Fp.BoCamCalcDone` con virtuali crimper, conveyor, fustellatore e mulinello ruote sinistro
---
## V24.04 Alias, hotfix nastri e miglioramenti conteggi
- Modifica Alias tag watchdog su nastri di carico
- HotFix su `R10_SecurityData` AvConveyor, calcolo `Cv.ReMinChkSys_Deg`
- HotFix su `FastTask/R21_Cr_VirtCrCycle/Rung 4`:
- Uso `AxVWheel.Param.ReModulo` invece di `Rec_Cv_ReStepLength` in AOI
- HotFix allarmi linea moduli integrate 03.04, 03.05, 03.06:
- OTL su bit `Align1.BoEmergency` (non `St1.BoEmergency`)
- Filtrato allarme 9.1 in caso macchina traslante
- Migliorie shift register conveyor (`FastTask/R48_Cv_Reject`):
- Scarto interno al paso catena: presenza prodotto cancellata solo se unico sensore scarto + NpNb
- Evita cancellazioni errate per sensori separati e tarature sbagliate
- _Nota: Il problema è causato da errata impostazione, ma probabilmente l'utente non se ne accorgerà_
- Migliorato conteggio scarti su catena (`FastTask/R85_CounterProd`):
- Per scarto dentro paso catena, cella 0 usata invece di `Cv.InRejProdImagePos`
- Evita perdite di conteggi dovute a shift prima della scrittura
- _Nota: non usare `Fp.CvProdImageLast` perché azzerato nello shift_
- Migliorata AOI `FB_myBoolBuffer`:
- Richiama inizializzazione se `ARRAY_SIZE == 0`, non solo su bit `S:FS`
- Utile per istanze create online
- Inserita tag `SysOption.SerialNumber` (stringa) per differenziare comportamento su matricole diverse mantenendo stesso software
---
## V24.05 Safety, giraprodotto e No Gap No Seal
- Eliminata inizializzazione in `MainTaskRds/Program 1002` che sovrascriveva `Gen.DiMainTaskTime`
- Gestione allarme safety software:
- Inserito filtro allarme `FltRds_00_12_SafeDeviceFault` su `FltRds_01_14_SafetyEnable`
- Modificata condizione di attivazione allarme (da `Safety_BoImmediateEnableGen` a `SafetyRds_BoImmediateEnableGen`)
- Gestione uscita abilitazione aria linea moduli (tipica per movimenti pneumatici separati)
- Rimosso controllo `AxTurnProduct.Sts.BoLockOK` passo 922 sequenza automatica (nastro giraprodotto gestito da MAJ)
- Bug fix fotocellula fasatore 2 inceppo
- Aggancio assi `AxMetalDetect` e `AxRecProductCurve` in routine `R31_SQAuto`
- Inserito bit `InitialScalingDone` su `stStandardAxisStatus` per decidere SSV su `ConversionConstant` e `PositionUnwind` durante calcolo camme
- Modificata velocità movimento sequenze `CamSync` o `GearSync` da `ReHomeSpeed` a `ReDefaultSpeed` (utile per assi con encoder assoluto)
- Gestione scarti giraprodotto:
- Modifiche ai programmi `P0950` e `FastTask/R85_CounterProd`
- Shift di 10 indici variabili ricetta (da 410 a 489) per coerenza dati scarto giraprodotto
- Inserita opzione `SysOption.InstantNgNs`:
- No Gap No Seal gestito con apertura allindietro asse fisico + riaggancio veloce, non con clutch asse virtuale
- Modificate/nuove routine FastTask: `R20_Cr_CheckJam`, `R21_Cr_TestMisplacedProd`, `R22_Cr_VirtCrClutchCycle`, `R23_Cr_InstantNgNs`
- Modificate routine CamLock per escludere aggancio con ciclo NgNs istantaneo attivo
- Utile per differenziare comportamento su matricole mantenendo stesso software
---
## V24.06 Bug fix e miglioramenti ciclo tacca
### 🐞 Bug fix
- `FastTask/R22_Cr_VirtCrClutchCycle/rung 6`: `Cr.Clutch.InSQCycleNext` non sovrascrive più sé stessa ma `Cr.Clutch.InSQCycle`
- `FastTask/R20_Cr_CheckJam`: reset memoria `Cr.BoStopReqProdJam` passo 98 sequenza
- `FastTask/R58_Insert90Deg_RobD2/rung 5`: custom MCT su ingresso J2 puntava a J1
- `T03_MainTaskRds/P1001_MainRowsSys/R12_FaultMc`: gestione fault `FltRds_03_01_Align1_SafetyEnable` migliorata con `SysOptionRds.SafetyIntegrated`
- `T02_MainTask/P0302_AxCrimper_x2/R171_CamSync/rung 13`: calcolo posizione `L_AxUp_ReOpenMaxPosition` corretto con offset `stAxisUp.Param.ReCamSyncOffset`
### ⚙️ Miglioramenti ciclo tacca
- `MainTask/P0401_AxWheel/R80_Reg_input1`:
- rung 6: eliminato `NOT L_BoAdjustmentRequest` su avvio ciclo lettura tacca
- rung 11: valutato `L_BoAdjustmentRequest` per proseguire o resettare ciclo lettura tacca
- Garantito corretto funzionamento misura lunghezza busta anche in caso di lettura tacca a cavallo dei semicicli virtuale crimper
- Velocità movimento CamSync/GearSync da `ReHomeSpeed` a `ReDefaultSpeed` anche su assi virtuali
- Corretta gestione variabili esclusione centraggio, es. `HMIwrT_Rds_BoStTraspCenterExcl`
- Migliorata condizione attivazione MAJ nastro distribuzione ranghi, analogamente a template Rds
---
[→ Next release](rockwell-fp-v25) | [All releases](../)

View File

@ -0,0 +1,92 @@
---
title: 'Flowpack PLC - Changelog V25.x'
description: "Dettagli aggiornamenti firmware e modifiche al software Flowpack PLC"
slug: "/changelog/rockwell-fp-v25"
authors: [Rockwell]
tags: [changelog, release, rockwell, flowpack]
---
# 🛠️ FLOWPACK - PLC Changelog V25.x
<!-- truncate -->
---
## V25.00 Nuove modalità homing, TravelMode e ottimizzazione inizializzazione
### 🔧 Modifiche principali
- **stStandardAxisParam**:
- 🔸 Rimosso: `DiMotionPolarity`
- 🔸 Aggiunto: `BoHomeModeAbs`, `DiTravelMode`
- **Struttura Gen**:
- 🔸 Rimosso: `BoEdgeMGSynced`
- 🔸 Aggiunto: `BoGroupSyncedDly`
- 🔸 Tutte le variabili contenenti tempi task: da `DINT``REAL`, per supportare multipli di 0.5ms
- **Gestione assi migliorata**:
- Uniformata `R01_Init` e `R11_Fault` su tutti gli assi reali in base a `BoHomeModeAbs`
- `R01_Init`: inizializza `stAxis.Param.ReModulo` in base a `TravelMode`
- `R00_Main`: richiamo `R01_Init` e generazione locale del fronte "motion group synced" (supporto a task lente)
- **Specifiche per configurazione iniziale**:
- `T02_MainTask/P0001_MainCaseFill/R01_McConfig`: imposta `BoHomeModeAbs` dove necessario
- **Altre modifiche**:
- `T04_ServiceTask/P9001_Service/R04_DateAndTime/Rung4`: `L_DateTime_DiMillisecondCount` incrementa con `Gen.DiServiceTaskTime_ms` (non valore fisso)
### 🐞 Bug Fixes
- `R58_Insert90Deg_RobD2/Rung 3`: aggiunta `Fp.BoWatchStopFp` tra cause sgancio trasformata
- `R115_Enable` e `R215_Enable` (Insert90DegRobD2): aggiunto check su `Insert90deg.BoMCTActive` prima del comando MAS
---
## V25.01 Rimappatura allarmi e miglioramenti sicurezza
### 🔧 Novità
- **Rimappatura globale allarmi**:
- Pulsanti di stop: separati in 7 allarmi specifici + 1 globale
- Nuovi allarmi per pulsanti di start (analoghi a quelli di stop)
- **Aggiunti allarmi dispositivi**:
- `F3.16``F3.19`: guasti dispositivi 24Vdc 14
- `F4.07``F4.08`: protezione elettrica dispositivi liquido conservante e controllo qualità
- `08.10`: allarmi per conservante, controllo qualità, errore mancato scarto
- **Ampliamento cause warning**:
- `I_BoProtCabinetCoolingFan_QGx` e `I_BoProtCabinetLight_QGx`: x5 (1 esistente + 4 nuove ciascuno)
### ✅ Improvements
- Eliminati riferimenti alla **seconda etichettarice**
- Bloccato **cambio modalità** se macchina è in marcia (`R21_Operating/Rung 21, 23, 27`)
- `R23_PasswordSafety`:
- Bit `BoByPassActive`: per cambiare sfondo HMI **solo se bypass attivo**, non solo con chiave inserita
### 🧪 Roiade
- `R23_PasswordSafety/Rung 8, 13`: disabilitato **ByPass in caso di emergenza** (richiesta da De Munari, 13/07/2023)
> _Nota: La modifica potrebbe scontentare i collaudatori, ma è stata richiesta da responsabile._
---
## V25.02 Revisione Safety Program
### 🔧 Riorganizzazione sicurezza
- **Nuove routine**:
- `R10_EmergButton`: gestione pulsanti emergenza, incluso doppio canale esterno
- `R11_SafeDoors`: gestione microinterruttori porte
- `R20_SafetyEnables`: centralizza i consensi aree → rimozione logica legacy dalle altre routine
### 🐞 Bug Fixes
- `FB_MyCvRejectProduct/Line 97`: da `>` a `>=` per evitare mancati scarti su uguaglianza
- `FB_MyRejectProduct/Line 200`: stessa correzione
---
[← Previous release](rockwell-fp-v24) | [→ Next release](rockwell-fp-v26) | [All releases](../)

View File

@ -0,0 +1,125 @@
---
title: 'Flowpack PLC - Changelog V26.x'
description: "Dettagli aggiornamenti firmware e modifiche al software Flowpack PLC"
slug: "/changelog/rockwell-fp-v26"
authors: [Rockwell]
tags: [changelog, release, rockwell, flowpack]
---
# 🛠️ FLOWPACK - PLC Changelog V26.x
<!-- truncate -->
---
## V26.00 Alcool spray e Safety I/O
### 🔧 Modifiche principali
- Impostata la funzionalità di configurazione dei safety I/O su `Configure always`.
- **Gestione spruzzo alcool** migliorata:
- Variabili globali accorpate in `stFpConveyorAlc`.
- Rinominate variabili ricetta:
- `HMIw_CvAlc_ReEvPneumaticAdv``Rec_CvAlc_ReEvPneumaticAdv`
- `HMIw_CvAlc_ReCheckDly``Rec_CvAlc_ReCheckDly`
- `HMIw_Alc_BoEnCheck``Rec_Fp_BoEnAlcoolSprayCheck`
- Aggiunta `Rec_Fp_BoEnAlcoolEvapRej` (bool)
- Modifiche logiche:
- `R50_Cv_AlcolSpray/Rung 3`: gestita contemporaneità con fase di shift.
- `R01_Shift/Line 8789`: attivazione scarto condizionata a `HMIwrOpt_Fp_BoEnAlcoolEvapRej`.
### 🐞 Bug Fixes
- `R10_SecurityData/Line 63`: sostituito `Cr.RePeriod` con `AxVCrimper.Param.ReModulo`.
---
## V26.01 Diagnostica alimentatori K5700 e miglioramenti generali
### 🔧 Modifiche principali
- **Diagnostica alimentatori K5700**:
- Creata `UDT stPowerSupply`.
- Aggiunto `P0002_PowerSupply` per gestione singolo alimentatore.
- Modificata `R08_HMIManager` su `P9001_Service`.
- **Rimappatura allarmi assi**:
- 1° DINT: assi virtuali e coordinati.
- 2° DINT: assi alimentatori K5700 (DFE).
- DINT successivi: vecchi allarmi (shiftati di 2).
- **Minor improvements**:
- Versione template inserita come commento su `McConfig`.
- Rimosso `Gen.BoRstReq`.
- Aggiornata `stStandardAxisStatus` per uniformità.
- Snellita logica `BoServiceModeActivated`.
- Visualizzazione I/O a pannello migliorata.
### 🐞 Bug Fixes
- Inserito `Rec_Fdr_DiNmbrProdPerStep` nel calcolo velocità nastri.
- **Fix su task Rds**:
- Migliorato uso `HMIwrT_Rds_BoStBfTraspCenterExcl`.
- Rimosse condizioni ridondanti per `BoLaunchCycleEnable` e `L_BoComJog*` con Powerflex527.
---
## V26.02 Homing, anticollisione e miglioramenti HMI
### 🚀 Novità
- **Velocità nastro uscita**:
- Rimossi `L_ReJogAutoAcc` e `L_ReJogAutoDec`.
- Rinnovato `R41_JogAuto`.
- **Gestione anticollisione**:
- Gestite sequenze `SQHomeMc`, `SQAutoMc` per inseritore a 90°.
- Gestione errori sincronismo in `CamSync`, `GearSync`.
- **Revisione routine homing**:
- Commenti e armonizzazione stati.
- Reset automatico comando homing.
- Homing forzabile da HMI/Studio5000.
- Controllo passo (solo mulinelli).
- **Pagina diagnostica assi** arricchita:
- Corrente attuale.
- Valori di picco (con pulsante reset).
- Creato `P9002_HmiManager` in `T04_ServiceTask` per gestione HMI.
- Gestione cambio pagina su HMI: `R40_RemoteDisplayMng`.
- Eliminati array `HMIr_` e `HMIw_` → rimosso supporto HMI Hakko.
### 🧪 Minor improvements
- `BoCalcSyncResult` rinominato in `BoCalcSyncShortMove` in `stStandardAxisStatus`.
- Ottimizzata spaziatura dati BOOL ricetta.
- Aggiunti/condizionati allarmi ed output (e.g. `O_BoLampStartButtonPS1`).
- Rimossa `HMIwrT_Gen_BoSafeServiceLogout`.
- Nuova routine `R28_SafetyOutput_Ext` per interfacce esterne.
### 🐞 Bug Fixes
- Corretto `Position Unwind` su `Av_ConveyorIn`.
- Aggiunti comandi homing in `R30_SQHomeMc` e `R31_SQAutoMc`.
- Reinserite istruzioni avanzamento ciclo in `R75_CamCalc`.
- Arrotondamento IF corretto in molte routine (`Line 4953`).
- Rifasamento direzione e `ReCamSyncOffset` gestiti in `AxConveyorIn`.
- Resetti comandi home per evitare blocchi automatici in inseritore 90°.
- Feedback errori asse aggiunto per `Insert90DegRobD2`.
- Fix `I_ReTaskInterval_mlS` → usa `Gen.ReMainTaskTime_ms`.
### 🐞 Bug Fixes Rds
- `R41_JogAuto`: velocità in valore assoluto.
- `R22_CyclePivot`:
- `GRT``GEQ`, migliorata condizione unlatch.
- Feedback nastro vuoto invece di distanza.
- `R99_Feedback`: aggiunto `ABS` su velocità.
- `R141_JogAuto`: condizioni per `JogAuto11/12` e gestione cambio direzione.
- `FB_MyRowsMemoSlaveStBuffer`: aggiunto `ABS` per velocità negativa.
---
> **Nota**: Le modifiche includono correzioni strutturate per semplificare la manutenzione, migliorare sicurezza e rendere il sistema più affidabile con i drive Powerflex527.
[← Previous release](rockwell-fp-v25) | [→ Next release](rockwell-fp-v30) | [All releases](../)

View File

@ -0,0 +1,134 @@
---
title: "Flowpack PLC - Changelog V30.x"
description: "Dettagli aggiornamenti firmware e modifiche al software Flowpack PLC"
slug: "/changelog/rockwell-fp-v30"
authors: [Rockwell]
tags: [changelog, release, rockwell, flowpack]
---
# 🛠️ FLOWPACK - PLC Changelog V30.x
<!-- truncate -->
---
## V30.00
- Conversione a firmware **V36.00**
---
## V30.01
### Nuove funzionalità
- Inserita condizione `stStation.BoLaunchCycleActive` in:
- `T02_MainTask/P1101_Station1/R23_CycleLaunch/Rung 8`
- Utilizzata anche in `R20_Enable/Rung 9` per abilitare `stStation.BoPowerStBy`
### Bug fix
- Routine di home:
- Reset `stAxis.Sts.BoHomeOK` all'inizio della sequenza
- Attivazione `MAS` finale se manca il bit cumulativo e non il comando `stAxis.Cmd.BoHome`
- `T02_MainTask/P0957_AxOrthoBt/R98_Operating/Rung 1`: Saturazione su `L_ReCountPosUnloadOK` per evitare overflow
- `T03_MainTaskRds/P1101_Station1/R20_Enable/Rung 1`: Gestione corretta delle condizioni `BoDCBusUpStatus`
---
## V30.02
### Minor improvements
- Migliorata la gestione del sensore di tensionamento catena
- Inseriti allarmi **F10.05** e **F10.06** per controllo schiacciamento crimper traslante
- Migliorata visualizzazione HMI sensori schiacciamento
### Bug fix
- `P0010_AvMaster/R20_Home/Rung 15`: Inserito passo mancante (blocco a 92)
- `AxCrimper_x2/R175_CamCalc/Line 219`: Corretto `L_ReMFactor1``L_ReMFactorWeld`
- Routine `R?21_HomeAbs`: modificato passo destinazione da 32 a 30, reset automatico a passo 100
---
## V30.03
- Eliminato ogni riferimento alla manutenzione ordinaria
### Bug fix
- Routine di home: corretta attivazione `HomeActive` per MDR con registration
- `R6168`: Usato `SmartInfeed.FdrX.BoFilterSensor` invece di `BoSensor` in input a `Feeder` e `CloseGap`
---
## V30.04
### Nuove funzionalità
- Gestione asse **contropasso catena**
- Allarmi inverter raggruppati in `HMIr_AryFaultInv` e gestiti su `R14_FaultInv`
- AOI `D2L_Direct_Kinematics`: ampliato dominio equazioni
- Gestione buffer alimentazione a gondola:
- Aggiunta `SysOption.BondolaBuffer`
- Parametri velocità modularizzati
### Minor improvements
- Riorganizzazione allarmi sicurezza
- Allarme **01.01** gestisce due canali se sicurezza integrata
- Allarme **9.16** su dati inseritore 90°
- Imposto limite a `Rec_Cv_ReRejectBlowDurat` (95% passo catena)
- Ottimizzata gestione scarti in catena
- Condizionata `Fp.BoColdStartReq` su `WhChain.BoEnable`
### Bug fix
- `R26_CrX_ProductJamAvoid`: gestito caso con `SysOption.SafetyIntegrated`
- `R42_Cv_TestProdLength`: corretto modulo asse in `FB_MyPls_V01`
- `Insert90deg/R031_SQAuto`: reset `.EN` su errore `MCLM` (firmware V36)
---
## V30.05
### Minor improvements
- Sequenza sincronizzazione **fustellatrice** anticipata
- Uniformata sync asse **ConveyorIn**
- Migliorata rilevazione prodotto in NpNb multipli
- Rimosso vincolo modifica posizione stop/rampa arresto su clutch attivo
- Rinominata `HMIwrT_Fdr_BoExcl``HMIwrT_Infeed_BoExcl`
- Sensori fasatori su **PointIO**
- Spostata `R092_FdrAspAC` in `P0911_AxFeeder1`
- Ingresso `I_BoPrinterReady` genera allarme **8.00**
- Visualizzazione sensore home crimper a pannello
- Variabili:
- `Fp.ReNominalSpeed`, `Fp.ReReelChangeSpeed` per evitare saturazione automatica
- Allarme **F7.06** per errata `ReSpeedMax` in buffer gondola
- Rimozione riferimenti a `WhAsp2`, `FdrAsp2`
- Allarmi:
- **5.17**, **5.19** per sezionatori pompe aspirazione
- **F12.08**: intasamento fotocellula fasatori
- **F02.00**: riparo pannello operatore aperto (solo FP100)
- **F02.15**: riparo metal detector aperto
- Gestione tensionamento fasatori con allarme
- Gestione dispositivo raffreddamento piani ruote
- Gestione pompa aspirazione buste vuote
- Pulizia nastro ingresso aggiuntivo
- Condizionamento `SSV` e `GSV` su motion group sincrono (evita minor fault)
- Migliorata gestione cambio bobina
- Filtri su sensori scarto giraprodotto + pannello: ultima misura prodotto/scarto
### Bug fix
- `SafetyTask/R20_SafetyEnables/Rung 9`: `L_TOF_STODelayedFp.DN` al posto di `Mc.DN`
- `MainFp/R15_Warning`: `SysOption.BondolaBuffer` al posto di `Rds`
- `R30_SQHomeMc/Rung 26`: Condizionamento `AxWheel1.Cmd.BoHome`
- `R31_SQAutoMc`: rimossa sync conveyor dallo stato 140 → mantenuto solo stato 790
- `AxCrimperX/R75_CamCalc`: `L_ReMyMsSpeed` inizializzato a `Rec_Fp_ReSpeedMax`
- `AxJaw_x2/R075_CamCalc`: usato `Rec_Fp_ReSpeedMax` per coerenza
- `AvConveyor/R74_CamCycle`: `CLR` su `stClutch.InSQCycleNext`
- `AvCarton/R74_CamCycle`: idem
---
[← Previous release](rockwell-fp-v26) | [→ Next release](rockwell-fp-v31) | [All releases](../)

View File

@ -0,0 +1,156 @@
---
title: 'Flowpack PLC - Changelog V31.x'
description: "Dettagli aggiornamenti firmware e modifiche al software Flowpack PLC"
slug: "/changelog/rockwell-fp-v31"
authors: [Rockwell]
tags: [changelog, release, rockwell, flowpack]
---
# 🛠️ FLOWPACK - PLC Changelog V31.x
<!-- truncate -->
---
## V31.00 Conversione a firmware V37.00
<!-- truncate -->
- **Nuova funzionalità**: Abilitata la funzionalità OPC UA sulla porta A1.
---
## V31.01 Espansione funzionalità e miglioramenti
### 🔧 Modifiche principali
- **Rimappati allarmi assi** per includere nuovi innesti e garantire coerenza con la Network Map.
- **Gestione Equilaser**:
- `Program P5002_EquilaserSensorInfeed` su `T01_FastTask`
- `P0920_AxEquilaserCarriage`, `P0921_AxEquilaserBeltIn`, `P0922_AxEquilaserBeltOut` su `T02_MainTask`
- **Nuovi assi gestiti**:
- Nastro a rullini: `P0940_AxBtAccumulation`
- Nastro puntale: `P0704_AxCvNoseBelt` (calcoli spostati da `P0701_AxConveyor` a `P0700_AvConveyor`)
- Ruota carico catena: `P0708_AxCvWheel`
- Cinghioli catena: `P0703_AxCvLateralBelt`
- Nastro controllo qualità: `P0932_AxBtQualityCheck`
- **Saldatura flowpack traslante**:
- Ristrutturata `R25_CrX_SealCycle_Servo` → ora `R25_CrX_SealCycleDoubleJaws`
- Camme migliorate per semplicità e sincronia
- Rifasamento pinze più affidabile
- Rimozione opzione non utilizzata: `SysOption.JawAir`
### 🧪 Minor improvements
- Watchdog `T01_FastTask`: 20ms
- Struttura `stRecipe` divisa tra Flowpack e moduli
- Sequenze `AxisClutch`: aggiunti flag accelerazione/decelerazione
- Rimozioni/ottimizzazioni varie nei programmi `P0001_MainFp`, `P0010_AvMaster`, ecc.
- Aumento array `HMIr_DiCvProdImage`, `HMIr_DiWhProdImage`
- Separati i parametri incremento/decremento per velocità automatiche
### 🐞 Bug Fixes
> **Esempi**:
- Protezione da dati incoerenti (`Rec_Mc_DiHomingRejNmbr`)
- Controlli di coerenza su varie tag (e.g. `L_Unw_DiReelChangeRejDist`)
- `Feeder7`/`Feeder8` correttamente lockati (`Rung 115`)
- Evitati loop e limitazioni da ricette precedenti
---
## V31.02 Estensioni, sicurezza e semplificazioni
### 🚀 Novità
- Rinominato `FB_MyPls_V03``FB_MyPlsImmediate`
- Svuotamento piani con arresto catena in:
- `R01_Shift`, `R31_SQAutoMc`, `R32_SQWhAutoEmpty`
- AOI `FB_MyTemperatureControlPID` migliorato con controllo integrale timeout
- Sicurezza aria fustellatrice (Sabadin, 27/02/2025)
- `O_BoCrXBagCoolingBlow``O_BoCrXEdgeFoldBlow`, spostato in `R98_Operating`
- Logica reset sicurezza migliorata per impianti condivisi
- Doppio canale emergenza migliorato
- Nastro uscita 2 ora in `Jog`, non `Gear`
- Rimozione condizione `L_BoEnableServoON` su `L_BoComJogMan`
- Miglioramenti in `FB_MyFeederProd`, `FB_MyCloseGap`
### 🔄 Revisione routine homing
| Routine | Tipo |
|--------|------|
| `R20_HomeFake` | Fake homing |
| `R21_HomeVirtual` | Virtual axis |
| `R22_HomeSensor` | Incrementale con sensore |
| `R23_HomeTorque` | Incrementale con battuta |
| `R25_HomeAbsImmediate` | Assoluto immediato |
| `R26_HomeAbsSensor` | Assoluto con sensore |
| `R27_HomeAbsTorque` | Assoluto con battuta |
### 🧪 Minor improvements
- Alias di sicurezza rimossi
- Parametri `TorqueLimit*` SSV condizionati
- Equilaser migliorato (post TCO2212)
- Controllo coppia pinza superiore semplificato
### 🐞 Bug Fixes
- Sincronismo `Ax_CvLateralBelt`
- Rifasamento condizionato `AxConveyorContrast`
- Sincronizzazione `AxCarton` corretta
- Fix parametri su `AxCartonKnife`, `AxBtAccumulation`
---
## V31.03 Ottimizzazioni cybersecurity e gestione assi
### 🔐 Cybersecurity
- **Tag "External Access"** sistemati:
- Solo ciò che serve è `Read Only`/`ReadWrite`, tutto il resto `None`.
### 🔄 Revisione routine sync
- `R61_GearSync`, `R62_GearSyncOnFly`, `R71_CamSync`, `R72_CamSyncOnFly`:
- Parametrizzazione errori
- Commenti migliorati
- `stStandardAxisParam`: nuovo parametro soglia errore
- `stStandardAxisStatus`: nuovi bit
- `R99_Feedback`: OTU `SyncOK` spostato
- `R75_CamCalc`: valorizzato `stAxis.Sts.BoCamComputeDone`
### 🔧 Refactoring
- 1:1 tra `Program` e `Asse`
- Struttura `stSmartInfeed` rivista
- Fasatori raggruppati in `FastTask`
- Scarti gestiti in `FastTask`, con warning `3.00`, `3.01`, `3.02`
- `Version` su strutture → compatibilità Optix
- Eliminata `SysOption.Cv`
### 🧪 Minor improvements
- `R15_Warning` disabilita warning 00.28 se linea integrata
- `AxBtQualityCheck` gestisce comando illuminatore
### 🐞 Bug Fixes
- `R48_Cv_Reject` ora riconosce corretta cella (`SysOption.CvRejSensorNpNb`)
- `AxPivot`: ripristino `ReHomeOffset`
- `DateAndTime`: sostituzione `CLR` con `SUB` per precisione temporale
---
## V31.04 Compatibilità Optix
- `R21_Operating`:
- Svuotamento ora gestito come modalità operativa
---
> **Note**: Per una migliore leggibilità, ogni programma, routine o struttura è indicata con il nome originale in codice e formattata per evidenziare l'associazione tra modifiche tecniche e impatto funzionale.
...
[← Previous release](rockwell-fp-v30) | [All releases](../)

View File

@ -1,25 +1,5 @@
yangshun: Rockwell:
name: Yangshun Tay name: Rockwell
title: Ex-Meta Staff Engineer, Co-founder GreatFrontEnd
url: https://linkedin.com/in/yangshun
image_url: https://github.com/yangshun.png
page: true page: true
socials: image_url: /img/logos/rockwellautomationsmall.jpg
x: yangshunz title: Ufficio sviluppo rockwell
linkedin: yangshun
github: yangshun
newsletter: https://www.greatfrontend.com
slorber:
name: Sébastien Lorber
title: Docusaurus maintainer
url: https://sebastienlorber.com
image_url: https://github.com/slorber.png
page:
# customize the url of the author page at /blog/authors/<permalink>
permalink: '/all-sebastien-lorber-articles'
socials:
x: sebastienlorber
linkedin: sebastienlorber
github: slorber
newsletter: https://thisweekinreact.com

View File

@ -1,19 +1,19 @@
facebook: changelog:
label: Facebook label: Changelog
permalink: /facebook permalink: /changelog
description: Facebook tag description description: Software update changelog
hello: release:
label: Hello label: Release
permalink: /hello permalink: /release
description: Hello tag description description: New software release
rockwell:
label: Rockwell
permalink: /rockwell
flowpack:
label: Flowpack
permalink: /flowpack
docusaurus:
label: Docusaurus
permalink: /docusaurus
description: Docusaurus tag description
hola:
label: Hola
permalink: /hola
description: Hola tag description

5
docs/Omron/Omron.md Normal file
View File

@ -0,0 +1,5 @@
---
hide_table_of_contents: true
pagination_next: null
pagination_prev: null
---

View File

@ -0,0 +1,126 @@
---
id: ScadaInterfaceMasterStructure
sidebar_position: 0
title: Architettura ScadaInterface
sidebar_label: Scada Interface
pagination_prev: null
---
# 🛠️ Architettura ScadaInterface
## ⚙️ Scopo
Per garantire una comunicazione robusta e manutenibile tra il PLC e il sistema SCADA, è stata creata una struttura dati dedicata e unificata.
Questa struttura, un'istanza di `ST_ScadaInterface`, funge da unica _fonte di verità_ per tutti i dati scambiati tramite OPC UA.
È una struttura di tipo **NJ**, progettata per sfruttare la comunicazione basata su "tag", ed è suddivisa in due parti logiche:
- **Egress**: Dati che fluiscono **DAL PLC ALLO SCADA** (sola lettura per lo SCADA).
- **Ingress**: Dati e comandi che fluiscono **DALLO SCADA AL PLC** (scrivibili dallo SCADA).
---
## ⚙️ Struttura Master
Per prima cosa, definiamo la struttura principale che conterrà i due flussi di dati.
```iecst
(* Struttura master per l'interfaccia SCADA *)
TYPE ST_ScadaInterface :
STRUCT NJ
Ingress : ST_Ingress; // Dati IN ENTRATA dallo SCADA
Egress : ST_Egress; // Dati IN USCITA verso lo SCADA
END_STRUCT
END_TYPE
```
---
## ⚙️ Struttura `ST_Egress` (PLC → SCADA)
Questa struttura contiene tutte le informazioni di stato, le analisi di produzione e i dati macchina che il PLC rende disponibili al sistema SCADA.
### ⚙️ Flag di Stato Macchina
| Nome Variabile | Tipo Dati | Descrizione |
|-----------------------|-----------|------------------------------------------------------------|
| IsRunning | `BOOL` | Flag VERO quando la macchina è in uno stato di marcia. |
| IsStopped | `BOOL` | Flag VERO quando la macchina è ferma. |
| IsInEmergency | `BOOL` | Flag VERO quando un'emergenza è attiva. |
| IsWaitingDownstream | `BOOL` | Flag VERO quando in attesa di un segnale dalla macchina a valle. |
| IsWaitingUpstream | `BOOL` | Flag VERO quando in attesa di un prodotto dalla macchina a monte. |
| IsAlarmActive | `BOOL` | Flag VERO quando un qualsiasi allarme macchina è attivo. |
### ⚙️ Flag di Handshake e Controllo
| Nome Variabile | Tipo Dati | Descrizione |
|-------------------------|-----------|-------------|
| AckChangeRecipe | `BOOL` | Conferma (Ack) del PLC a un comando di cambio ricetta. |
| RemoteControlEnable | `BOOL` | Flag che indica se il controllo remoto da SCADA è abilitato. |
| ProductionChangeOK | `BOOL` | Conferma del PLC che il cambio produzione è avvenuto con successo. |
| RecipeChangeOK | `BOOL` | Conferma del PLC che il cambio ricetta è avvenuto con successo. |
| RecipeChangeReject | `BOOL` | Flag che indica che il cambio ricetta è stato rifiutato dall'Operatore. |
| RecipeChangePostpone | `BOOL` | Flag che indica che il cambio ricetta è stato rimandato dall'Operatore. |
| MesCommunicationFault | `BOOL` | Flag VERO se c'è un errore di comunicazione con il MES. |
### ⚙️ Informazioni Ricetta e Produzione
| Nome Variabile | Tipo Dati | Descrizione |
|--------------------------|---------------|-------------|
| ActualRecipeIndex | `DINT` | Indice della ricetta attualmente attiva. |
| ActualRecipeName | `STRING[38]` | Nome della ricetta attualmente attiva. |
| ActualProductionInfo | `STRING[38]` | Descrizione del lotto/ordine di produzione attuale. |
| ActualProductionCode | `DINT` | Codice del lotto/ordine di produzione attuale. |
| MachineStatus | `DINT` | Codice di stato generale della macchina (come da visualizzazione HMI). |
### ⚙️ Watchdog di Comunicazione
| Nome Variabile | Tipo Dati | Descrizione |
|----------------|-----------|-------------|
| PlcWatchdog | `DINT` | Contatore di watchdog del PLC inviato allo SCADA. |
### ⚙️ Strutture Dati di Analisi
| Nome Variabile | Tipo Dati | Descrizione |
|------------------------|-------------------------------|-------------|
| TimeAnalytics | `ST_MachineTimers` | Statistiche dettagliate basate sul tempo. |
| ProductionAnalytics | `ST_ProductionAnalytics` | Statistiche dettagliate basate sulla produzione. |
### ⚙️ Dati Allarmi
| Nome Variabile | Tipo Dati | Descrizione |
|----------------------------|-------------------------------------|-------------|
| AlarmAnalytics | `ARRAY[0..1399] OF ST_AlarmAnalytics` | Dati analitici per ogni singolo allarme. |
| TopAlarms_ByFrequency | `ARRAY[0..99] OF ST_TopAlarmEntry` | Classifica degli allarmi più frequenti. |
| TopAlarms_ByDowntime | `ARRAY[0..99] OF ST_TopAlarmEntry` | Classifica degli allarmi che causano più downtime. |
| Alarms_Packed | `ARRAY[0..80] OF WORD` | Array compatto per visualizzazione rapida degli allarmi. |
---
## ⚙️ Struttura `ST_Ingress` (SCADA → PLC)
Questa struttura contiene tutti i comandi e i setpoint che il sistema SCADA può inviare al PLC.
### ⚙️ Comandi di Controllo Produzione
| Nome Variabile | Tipo Dati | Descrizione |
|------------------------|-----------|-------------|
| ProductionChangeRequest| `BOOL` | Comando da SCADA per richiedere un cambio produzione/lotto. |
| RecipeChangeRequest | `BOOL` | Comando da SCADA per richiedere un cambio ricetta. |
| ResetCounters | `BOOL` | Comando da SCADA per resettare le statistiche. |
| RemoteStopMachine | `BOOL` | Comando da SCADA per arrestare la macchina da remoto. |
### ⚙️ Richieste Dati Ricetta e Produzione
| Nome Variabile | Tipo Dati | Descrizione |
|---------------------------|--------------|-------------|
| RequestRecipeIndex | `DINT` | Indice della ricetta richiesta. |
| RequestProductionQuantity | `DINT` | Quantità di produzione richiesta. |
| RequestProductionCode | `DINT` | Codice del lotto/ordine di produzione richiesto. |
| RequestProductionInfo | `STRING[38]` | Descrizione del lotto/ordine richiesta. |
### ⚙️ Watchdog di Comunicazione
| Nome Variabile | Tipo Dati | Descrizione |
|------------------|-----------|-------------|
| ScadaWatchdog | `DINT` | Contatore di watchdog dello SCADA ricevuto dal PLC. |

View File

@ -0,0 +1,34 @@
---
id: SottoStrutture
sidebar_position: 1
title: Sotto Struttura ScadaInterface
sidebar_label: Scada Interface Sotto Strutture
pagination_prev: null
---
## Sotto-Strutture di `ScadaInterface`
Questa sezione descrive in dettaglio le strutture dati "mattoncino" utilizzate all'interno dell'interfaccia SCADA.
### Struttura `ST_StateStatistics`
Questa è la struttura base per l'analisi dei tempi. Contiene i dati calcolati per un **singolo stato macchina** (es. Marcia, Arresto, etc.). Viene riutilizzata per ogni stato che si desidera monitorare.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `Hours` | `DINT` | Le ore totali accumulate per lo stato. |
| `Minutes` | `DINT` | I minuti totali accumulati per lo stato (0-59). |
| `Percentage` | `DINT` | La percentuale del tempo totale in cui lo stato è stato attivo. Il valore è un intero con due decimali fissi (es. `1234` rappresenta `12.34%`). |
### Struttura `ST_MachineTimers`
Questa struttura raggruppa tutte le analisi dei tempi in un unico blocco, rendendo i dati facili da navigare per lo SCADA. Ogni membro di questa struttura è del tipo `ST_StateStatistics` definito sopra.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `TotalTime` | `ST_StateStatistics` | Contiene il tempo totale di monitoraggio. La percentuale di questo stato è sempre 100%. |
| `RunTime` | `ST_StateStatistics` | Contiene i dati relativi al tempo in cui la macchina è stata in marcia (`Running`). |
| `StopTime` | `ST_StateStatistics` | Contiene i dati relativi al tempo in cui la macchina è stata in arresto (`Stopped`). |
| `EmergencyTime` | `ST_StateStatistics` | Contiene i dati relativi al tempo in cui la macchina è stata in emergenza (`Emergency`). |
| `DownstreamTime` | `ST_StateStatistics` | Contiene i dati relativi al tempo passato in attesa di un segnale dalla macchina a valle. |
| `UpstreamTime` | `ST_StateStatistics` | Contiene i dati relativi al tempo passato in attesa di un prodotto dalla macchina a monte. |

View File

@ -0,0 +1,49 @@
---
id: scada-interface-stat-allarmi
sidebar_position: 2
title: Statistiche Allarmi
sidebar_label: Scada Interface Allarmi Statistiche
pagination_prev: null
---
# Strutture per le Statistiche degli Allarmi
Questa sezione descrive l'architettura dei dati utilizzati per l'analisi avanzata degli allarmi, che include il calcolo di KPI come MTTR (Tempo Medio di Riparazione) e MTBF (Tempo Medio tra i Guasti), e la gestione di classifiche ("Top Alarms") per identificare i problemi più critici.
---
### Struttura `ST_AlarmAnalytics`
Questa è la struttura "mattoncino" che contiene tutte le analisi calcolate per un **singolo allarme**.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `State` | `BOOL` | Stato attuale dell'allarme (`VERO` = Attivo). |
| `Count` | `DINT` | Conteggio totale delle occorrenze (Frequenza) di questo allarme. |
| `TotalActiveTime_ms` | `LINT` | Tempo totale, in millisecondi, in cui questo allarme è rimasto attivo. |
| `MTTR_sec` | `LREAL` | **Tempo Medio di Riparazione** (Mean Time To Repair), in secondi. Indica il tempo medio necessario per risolvere l'allarme. |
| `MTBF_h` | `LREAL` | **Tempo Medio tra i Guasti** (Mean Time Between Failures), in ore. Indica il tempo medio di buon funzionamento tra un'occorrenza e l'altra di questo allarme. |
---
### Struttura `ST_TopAlarmEntry`
Questa struttura rappresenta una singola riga all'interno di una classifica di allarmi ("Top Alarms"). Viene usata per le due classifiche principali: quella per frequenza e quella per tempo di fermo.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `AlarmId` | `DINT` | L'ID numerico dell'allarme. Un valore di `-1` indica uno slot vuoto nella classifica. |
| `Value` | `LREAL`| Il valore utilizzato per ordinare la classifica (può essere la frequenza o il tempo totale di attività in millisecondi). |
---
### Dati Allarmi nella Struttura `ST_Egress`
Infine, la struttura `ST_Egress` (dati in uscita verso lo SCADA) contiene gli array che rendono disponibili tutte queste informazioni.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `AlarmAnalytics` | `ARRAY[0..1399] OF ST_AlarmAnalytics` | Un array che contiene i dati analitici dettagliati per ogni singolo allarme. |
| `TopAlarms_ByFrequency`| `ARRAY[0..99] OF ST_TopAlarmEntry` | La classifica dei 100 allarmi più frequenti. |
| `TopAlarms_ByDowntime`| `ARRAY[0..99] OF ST_TopAlarmEntry` | La classifica dei 100 allarmi che hanno causato il maggior tempo di fermo. |
| `Alarms_Packed` | `ARRAY[0..80] OF WORD` | Un array compatto di word per una rappresentazione rapida e a basso livello dello stato di tutti gli allarmi. |

View File

@ -0,0 +1,66 @@
---
id: scada-interface-stat-flowpack
sidebar_position: 3
title: Statistiche Flowpack
sidebar_label: Scada Interface Flowpack Statistiche
pagination_prev: null
---
# Strutture per le Statistiche della Flowpack
Questa sezione descrive l'architettura dei dati utilizzati per raccogliere e analizzare i conteggi di produzione, specifici per la macchina **Flowpack**.
---
### Struttura `ST_Flowpack_ProductionCounts`
Questa è la struttura che contiene i conteggi di produzione principali (ingresso e uscita) per la Flowpack.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `Products_In_Total` | `DINT` | Contatore totale dei prodotti in ingresso alla macchina. |
| `Products_Out_Good` | `DINT` | Contatore totale dei prodotti in uscita conformi (buoni). |
| `Products_Out_Rejected` | `DINT` | Contatore totale dei prodotti in uscita scartati (somma di tutte le cause). |
---
### Struttura `ST_Flowpack_RejectReasons`
Questa struttura raggruppa i contatori per ogni singola causa di scarto specifica della Flowpack.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `Reject_EmptyPackets` | `DINT` | Scarto per buste vuote. |
| `Reject_DoublePackets` | `DINT` | Scarto per buste doppie. |
| `Reject_CrushedByCrimper`| `DINT` | Scarto per prodotto schiacciato dalle ganasce saldanti. |
| `Reject_ChainPackets` | `DINT` | Scarto per problemi legati alla catena di trasporto. |
| `Reject_PictureCardMissPackets`| `DINT` | Scarto per mancata inserzione della figurina/card. |
| `Reject_CameraNoGoodPPackets`| `DINT` | Scarto rilevato dal sistema di visione (telecamera). |
---
### Struttura `ST_Flowpack_Percentages`
Questa struttura contiene tutte le percentuali calcolate per la Flowpack, pronte per la visualizzazione.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `Perc_Good_vs_In` | `DINT` | % di prodotti buoni rispetto al totale entrato. |
| `Perc_RejectedEmptyPackets` | `DINT` | Ripartizione % degli scarti per "Buste Vuote". |
| `Perc_RejectedDoublePackets` | `DINT` | Ripartizione % degli scarti per "Buste Doppie". |
| `Perc_RejectedCrushedByCrimper`| `DINT` | Ripartizione % degli scarti per "Schiacciamento Ganasce". |
| `Perc_RejectedChainPackets` | `DINT` | Ripartizione % degli scarti per "Problemi Catena". |
| `Perc_RejectedPictureCardMissPackets`| `DINT` | Ripartizione % degli scarti per "Mancata Figurina". |
| `Perc_RejectedCameraNoGoodPPackets`| `DINT` | Ripartizione % degli scarti per "Telecamera". |
---
### Struttura `DT_Flowpack_Analytics`
Infine, questa è la struttura "contenitore" che unisce tutti i dati della Flowpack in un unico blocco logico.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `Production` | `ST_Flowpack_ProductionCounts` | La struttura che contiene i conteggi di produzione IN/OUT. |
| `Rejects` | `ST_Flowpack_RejectReasons` | La struttura che contiene i dettagli delle cause di scarto. |
| `Percentages` | `ST_Flowpack_Percentages` | La struttura che contiene tutte le percentuali calcolate. |

View File

@ -0,0 +1,69 @@
---
id: Statistiche-Row-Distribution
sidebar_position: 4
title: Statistiche Row Distribution
sidebar_label: Scada Interface RowDistribution Statistiche
pagination_prev: null
---
# Strutture per le Statistiche di Produzione
Questa sezione descrive l'architettura dei dati utilizzati per raccogliere e analizzare i conteggi di produzione, specifici per la macchina **Row Distribution**.
---
### Struttura `ST_ChannelData`
Questa è la struttura "mattoncino" che contiene tutti i conteggi grezzi e le percentuali calcolate per un **singolo canale** o impilatore.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| **--- Conteggi Grezzi ---** | | |
| `PiecesEntered` | `DINT` | Pezzi totali entrati sull'impilatore del canale. |
| `Pieces_Stacked` | `DINT` | Prodotti totali impilati da questo canale. |
| `Stacks_Sent` | `DINT` | Pile totali inviate con successo da questo canale. |
| `StacksRejected` | `DINT` | Pile totali scartate da questo canale. |
| `Rejects_Trapdoor` | `DINT` | Pezzi scartati alla botola per questo canale (è il totale degli scarti). |
| `Rejects_RecipeMismatch` | `DINT` | Pezzi scartati a causa di ricetta non conforme. |
| `Rejects_Jam` | `DINT` | Pezzi scartati a causa di un inceppo nell'impilatore. |
| `Rejects_Clump` | `DINT` | Pezzi scartati a causa di ammassi o accumuli. |
| **--- Percentuali Calcolate (per canale) ---** | | |
| `Perc_Rejected_Trapdoor`| `DINT` | % di pezzi scartati alla botola rispetto al totale entrato. |
| `Perc_Pieces_Stacked` | `DINT` | % di pezzi impilati rispetto al totale entrato. |
| `Perc_Stacks_Sent` | `DINT` | % di pile inviate rispetto al totale pile gestite (inviate + scartate). |
| `Perc_Stacks_Rejected` | `DINT` | % di pile scartate rispetto al totale pile gestite. |
| `Perc_Reject_RecipeMismatch` | `DINT` | Ripartizione % degli scarti per "Ricetta non conforme". |
| `Perc_Reject_Clump` | `DINT` | Ripartizione % degli scarti per "Ammassi". |
| `Perc_Reject_Jam` | `DINT` | Ripartizione % degli scarti per "Inceppo". |
---
### Struttura `ST_ProductionTotals`
Questa struttura raggruppa tutti i **conteggi globali** della macchina, ottenuti sommando i dati dei singoli canali o da contatori generali.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `IncomingRanks` | `DINT` | Ranghi totali inseriti sulla linea di distribuzione. |
| `RanksDischarged_Module1`| `DINT` | Ranghi totali scaricati verso la Flowpack 1. |
| `RanksDischarged_Module2`| `DINT` | Ranghi totali scaricati verso la Flowpack 2. |
| `RanksDischarged_Module3`| `DINT` | Ranghi totali scaricati verso la Flowpack 3. |
| `RanksDischarged_Buffer` | `DINT` | Ranghi totali scaricati verso il nastro buffer. |
| `TotalStacksSent` | `DINT` | Pile totali inviate ai moduli a valle. |
| `StacksOnLastRank` | `DINT` | Numero di pile presenti sull'ultimo rango caricato. |
| `TotalStacksOnStackers` | `DINT` | Numero istantaneo di pile fisicamente presenti su tutti gli impilatori. |
| `TotalStacksRejected` | `DINT` | Numero totale di pile scartate. |
| `TotalProductsEntered` | `DINT` | Prodotti totali "equivalenti" entrati nella linea. |
| `TotalRejectedProducts_Trapdoor`| `DINT`| Prodotti totali scartati alla botola. |
| `GrandTotalProductsHandled` | `DINT` | Somma totale di tutti i prodotti gestiti (Entrati + Scartati). |
---
### Struttura `ST_ProductionAnalytics`
Infine, questa è la struttura "contenitore" che unisce i dati dei canali e i totali in un unico blocco logico per la **Row Distribution**.
| Nome Variabile | Tipo Dati | Descrizione |
| :--- | :--- | :--- |
| `Channels` | `ARRAY[0..4] OF ST_ChannelData` | Un array che contiene i dati dettagliati per ognuno dei 5 canali. |
| `Totals` | `ST_ProductionTotals` | La struttura che contiene tutti i conteggi globali della macchina. |

View File

@ -0,0 +1,55 @@
---
id: flusso-comunicazione
sidebar_position: 5
title: Flusso di Scambio Dati (PLC-HMI-SCADA)
sidebar_label: Flusso di Comunicazione
pagination_prev: null
---
# Flusso di Scambio Dati (PLC-HMI-SCADA)
## Panoramica
Questo documento descrive la logica e la sequenza dinamica di "handshake" utilizzate per la comunicazione tra il PLC, l'interfaccia operatore (HMI) e il sistema di supervisione (SCADA). L'obiettivo è garantire uno scambio dati robusto e a prova di errore per le operazioni critiche come il cambio produzione e il monitoraggio della connessione.
## Processo Principale: Cambio Ricetta/Produzione
Il processo di cambio ricetta è l'interazione più complessa e viene gestito da una macchina a stati (`S60_RecipeManagement`) nel PLC per garantire che ogni passo venga eseguito nella sequenza corretta.
### Sequenza di Scambio Dati
Il "dialogo" tra i tre sistemi segue questi passaggi:
1. **Abilitazione (HMI):** L'operatore abilita il controllo remoto sull'HMI.
* `HMI -> PLC`: Imposta `MachineAnalytics.HMI_Interface.RemoteControlEn = TRUE`.
2. **Richiesta (SCADA):** Lo SCADA invia i dati per la nuova produzione (Indice Ricetta, Codice Lotto, etc.) e imposta il bit di richiesta.
* `SCADA -> PLC`: Imposta `ScadaInterface.Ingress.ProductionChangeRequest = TRUE`.
3. **Ack a SCADA (PLC):** Il PLC valida la richiesta. Se è corretta, risponde immediatamente:
* `PLC -> SCADA`: Invia la conferma di ricezione (`Egress.AckChangeRecipe = TRUE`).
4. **Completamento Handshake (SCADA):** Lo SCADA, non appena riceve l'Ack, sa che il PLC ha preso in carico la richiesta e **abbassa subito** il suo bit di richiesta.
* `SCADA -> PLC`: Imposta `Ingress.ProductionChangeRequest = FALSE`.
5. **Completamento Handshake (PLC):** Il PLC, vedendo che la richiesta è stata abbassata, abbassa a sua volta il suo `AckChangeRecipe`. L'handshake iniziale è concluso e il PLC procede autonomamente.
6. **Attivazione Pop-up (PLC):** Il PLC attiva il flag per l'apertura del pop-up sull'HMI.
* `PLC -> HMI`: Imposta `HMI_Interface.AckChangeRecipeToHMI = TRUE`.
7. **Visualizzazione (HMI):** L'HMI mostra il pop-up di conferma all'operatore con i dati della ricetta richiesta.
8. **Risposta (Operatore):** L'operatore sceglie una delle opzioni sul pop-up:
* **ACCETTA:** L'HMI imposta `HMI_Interface.RecipeChangeOk = TRUE`. Il PLC esegue l'azione (carica la ricetta, aggiorna i dati) e invia l'esito positivo allo SCADA (`Egress.RecipeChangeOK = TRUE` per 2 secondi).
* **RIFIUTA (o preme X):** L'HMI imposta `HMI_Interface.RejectRecipeChange = TRUE` (o `CloseMESWindow`). Il PLC invia l'esito negativo allo SCADA (`Egress.RecipeChangeReject = TRUE` per 2 secondi).
* **POSTICIPA:** L'HMI imposta `HMI_Interface.BatchChangePopupDismiss = TRUE`. Il PLC invia lo stato di attesa allo SCADA (`Egress.RecipeChangePostpone = TRUE`), avvia un timer (30 secondi) e, alla scadenza, torna al **Passo 6** per far riapparire il pop-up.
---
## Handshake di Base: Watchdog (Heartbeat)
Per garantire che la comunicazione sia sempre attiva, è implementato un meccanismo di "heartbeat" a bit alternato.
- **Dal PLC allo SCADA:** Il PLC inverte il valore del bit `ScadaInterface.Egress.PlcHeartbeat_Toggle` ogni secondo.
- **Dallo SCADA al PLC:** Lo SCADA deve leggere `PlcHeartbeat_Toggle` e ricopiarne il valore nel bit `ScadaInterface.Ingress.ScadaHeartbeat_Echo`.
- **Controllo del PLC:** Se `PlcHeartbeat_Toggle` e `ScadaHeartbeat_Echo` rimangono diversi per più di un tempo di timeout (es. 3 secondi), il PLC imposta a `VERO` il flag `ScadaInterface.Egress.MesCommunicationFault`.

View File

@ -0,0 +1,86 @@
---
sidebar_position: 3
hide_table_of_contents: true
title: Creare un pulsante di navigazione
---
import useBaseUrl from '@docusaurus/useBaseUrl';
# 🔘 Creare un Pulsante di Navigazione
Hai creato la tua nuova pagina (bravo! 👏), ma ora serve un modo per arrivarci, no? È il momento di aggiungere un **pulsante di navigazione**.
In questa guida vedremo come creare un pulsante per navigare da una schermata allaltra utilizzando i **componenti custom** messi a disposizione nel progetto Optix.
---
## 🧭 Principio di funzionamento
I pulsanti di navigazione disponibili sono diversi, ma condividono **lo stesso principio base**:
> 🎯 A ogni pulsante viene associata una **pagina di destinazione** tramite il parametro `Panel`.
---
## 🧮 Tipi di pulsanti di navigazione
A seconda del contesto in cui ti trovi, scegli il **template più adatto** tra quelli disponibili. Ogni pulsante è pensato per uno scenario duso specifico.
| Template | Descrizione |
|-----------------------------|-------------|
| `tpAxHomeButton` | 🔁 Pulsante per il comando di **azzeramento di un singolo asse** |
| `tpDualAxHomeButton` | 🔀 Variante del precedente, consente l'**azzeramento simultaneo di più assi**. Utile quando gli azzeramenti devono essere coordinati tra più assi. |
| `tpButtNavigationLateral` | 🧭 Pulsante da utilizzare nel **menù laterale principale** dellinterfaccia (quello sempre visibile sulla sinistra). Garantisce coerenza visiva e funzionale. |
| `tpButtNavigationSetup` | ⚙️ Pulsante standard per la **navigazione nelle pagine di setup**. Ha uno stile neutro e coerente con lambiente di configurazione. |
| `tpButtNavigationAdvMenu` | 🧩 Pulsante progettato per i **menù a griglia** come il menù avzato o vari sottomenù o con layout esplorativi. Ideale per strutture ad accesso rapido o dinamico. |
| `tpButtNavigationDiagnostic`| 🧯 Pulsante per la **navigazione alle pagine di diagnostica**. Include un **badge di stato** che può mostrare la presenza di un fault o anomalia. |
> 💡 **Suggerimento**: usa il pulsante giusto per ogni contesto. Non è solo una questione estetica: migliora lusabilità e rende linterfaccia più intuitiva per loperatore.
---
## 🛠️ Come crearne uno
Per inserire un nuovo pulsante di navigazione:
1. **Fai clic destro** sul contenitore in cui desideri aggiungerlo (può essere una `Panel`, una `GroupBox`, ecc.).
2. Seleziona:
`New > tpTemplates > tpButtons > Navigation > <tipo desiderato>`
📷 *Esempio:*
<img src={useBaseUrl('/img/screenshots/optix/create-navigation-button.jpg')} alt="Creazione pulsante di navigazione" style={{ maxWidth: '100%', borderRadius: '8px', marginTop: '1rem' }} />
---
## ⚙️ Parametrizzazione del pulsante
Dopo aver creato il pulsante, selezionalo e imposta la **pagina di destinazione**:
1. Vai nel menu delle **proprietà a sinistra**
2. Trova il parametro `Panel`
3. Seleziona la pagina a cui vuoi che il pulsante navighi
📷 *Esempio:*
<img src={useBaseUrl('/img/screenshots/optix/parametrize-navigation-button.jpg')} alt="Parametri del pulsante di navigazione" style={{ maxWidth: '100%', borderRadius: '8px', marginTop: '1rem' }} />
---
## 🚀 E ora?
Fatto! A questo punto, il tuo pulsante è operativo: durante il runtime, cliccandoci sopra, lutente verrà portato direttamente alla pagina che hai configurato.
---
> 🧙‍♂️ **Pro tip**: dai un nome chiaro al tuo pulsante e alla pagina di destinazione. Ti ringrazierai tra qualche progetto, fidati.
---
## ✅ Conclusione
Creare pulsanti di navigazione è semplice e potente. Ti permette di costruire un'esperienza utente fluida, organizzata e professionale, mantenendo la coerenza con il resto dell'interfaccia.
E poi... vuoi mettere la soddisfazione di cliccare su un bottone che *funziona davvero*?
🚪➡️ *Vai e clicca, linterfaccia ti aspetta!*

View File

@ -0,0 +1,69 @@
---
sidebar_position: 2
hide_table_of_contents: true
title: Creare una nuova pagina
---
import useBaseUrl from '@docusaurus/useBaseUrl';
## 🛠️ Creare una nuova pagina in Optix
Creare una nuova pagina nel progetto **Optix** è molto semplice, ma richiede luso di un tipo derivato, non della pagina base standard. Questo perché la nostra struttura adotta proprietà estese per funzionalità avanzate.
---
### 📁 Dove creare la pagina
Per iniziare:
1. Fai **clic destro** sulla cartella `Screens` o su una delle sue sottocartelle.
2. Seleziona:
`New > All > User interface > tpTemplates > tpScreens > tpBaseScreen`
<img src={useBaseUrl('img/screenshots/optix/createBasePage.jpg')} alt="Creazione pagina base in Optix" style={{ maxWidth: '100%', marginTop: '1rem', borderRadius: '8px' }} />
---
### ⚙️ Parametri fondamentali
Una volta creata la pagina, selezionala dal menu laterale e configura i seguenti parametri nel pannello di sinistra:
| **Parametro** | **Descrizione** |
|---------------|-----------------|
| `PageNumber` | Il numero identificativo univoco della pagina. Serve sia alla documentazione che alla navigazione gestita da PLC. **Deve essere univoco!** |
| `PageName` | Il nome della pagina. È un campo di tipo **Localized Text**, quindi può essere collegato al dizionario delle traduzioni. Verrà visualizzato insieme al `PageNumber` nell**Header** del pannello. |
| `PageType` | Definisce il tipo di pagina tramite un **enumeratore**. Questo valore influisce sul colore dellheader e sulla logica di accesso. |
| `Father` | Indica la **pagina padre**, ovvero quella a cui tornare premendo "indietro" nellheader del pannello. |
---
### 🧭 PageType — Elenco dei tipi disponibili
Qui sotto trovi lelenco dei valori disponibili per `PageType`:
| **Valore** | **Display Name** |
|------------|--------------------------|
| 0 | Home |
| 1 | Menù |
| 2 | Allarmi |
| 3 | Modalità operativa |
| 4 | Ricette |
| 5 | Abilitazioni |
| 67 | --Reserved-- |
| 8 | Masse saldanti |
| 9 | --Reserved-- |
| 10 | Mini setup |
| 11 | Full setup |
| 12 | Diagnostica |
| 1319 | --Reserved-- |
| 20 | Altro |
> ⚠️ Attenzione: I valori "Reserved" non devono essere utilizzati a meno di indicazioni specifiche da parte del team di sviluppo.
---
### ✅ Conclusione
Seguendo questi semplici passaggi, sarai in grado di creare una pagina completamente funzionale allinterno dellambiente Optix, con parametri ben configurati per garantire compatibilità, navigazione e coerenza visiva.
Grandi cose ti aspettano, giovane Padawan! 🧙‍♂️✨

View File

@ -0,0 +1,82 @@
---
title: IOCardConfig
---
# 📦 Configurazione delle Schede IO (IOCardConfig)
La configurazione delle schede IO è un elemento fondamentale per il corretto funzionamento del sistema.
Questa configurazione descrive tutte le caratteristiche delle schede Input/Output (IO) che possono essere sia normali sia di sicurezza (safety), e viene fornita in un file YAML che viene poi letto e interpretato dal software.
---
## 🧩 Struttura generale della configurazione
La configurazione è organizzata in due sezioni principali:
- **NormalIoCards**: contiene la definizione delle schede IO normali.
- **SafetyIoCards**: contiene la definizione delle schede IO di sicurezza.
Ogni sezione è composta da un insieme di schede, ognuna identificata da un nome univoco (ad esempio `AB:1734_DI8:C:0:`). Per ogni scheda sono definiti i seguenti elementi:
| Proprietà | Descrizione |
|---------------|-------------------------------------------------------------------------------------------------|
| **type** | Tipo generico della scheda (es. IB8, OB8, IT2I) che indica la funzione o famiglia della scheda.|
| **nodeType** | Nome del template grafico usato per rappresentare la scheda nellinterfaccia utente. |
| **iODirection** | Direzione IO, indica se la scheda è di tipo input ("I") o output ("O"). |
| **colors** | Definizione dei colori usati nella UI per la scheda e i suoi LED (acceso/spento). |
---
## ⚠️ Specifiche per le schede di sicurezza (SafetyIoCards)
Le schede di sicurezza hanno una proprietà in più rispetto a quelle normali:
- **outputType**: indica il tipo di output associato alla scheda di sicurezza (es. `AB:1734_IB8S:O:0`).
Serve a collegare la scheda di input safety con il suo corrispettivo output, necessario per la logica di sicurezza.
---
## 🎨 Dettaglio sui colori
La sezione `colors` permette di personalizzare laspetto della scheda nellinterfaccia grafica, con valori numerici che rappresentano i colori:
- **card**: colore principale della scheda.
- **led_on**: colore del LED quando è acceso (es. LED verde acceso).
- **led_off**: colore del LED quando è spento (es. LED rosso spento).
---
## 📝 Esempio pratico di configurazione YAML
```yaml
normalIoCards:
AB:1734_DI8:C:0:
type: IB8
nodeType: IOCard_8B
iODirection: I
colors:
card: 0xff1b83df
led_on: 0xff00fa7e
led_off: 0xff0f4d29
AB:1734_DOB8:C:0:
type: OB8
nodeType: IOCard_8B
iODirection: O
colors:
card: 0xff40aa84
led_on: 0xffea2e2e
led_off: 0xff500f0f
safetyIoCards:
AB:1734_IB8S_Safety2:I:0:
outputType: AB:1734_IB8S:O:0
type: IB8S
nodeType: IOCard_8BS
iODirection: I
colors:
card: 0xffe4564b
led_on: 0xff00fa7e
led_off: 0xff0f4d29
```

View File

@ -0,0 +1,56 @@
---
title: AlarmImporter
---
# <a id="TecnoPack_AlarmImporter"></a> Class AlarmImporter
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Classe statica per l'importazione di allarmi da file Excel (.xlsx)
nella struttura del progetto FTOptix, inclusi dizionari e traduzioni.
```csharp
public static class AlarmImporter
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[AlarmImporter](TecnoPack.AlarmImporter.md)
#### Inherited Members
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Methods
### <a id="TecnoPack_AlarmImporter_ImportAlarmsInsideOwner_UAManagedCore_IUANode_System_String_System_String_"></a> ImportAlarmsInsideOwner\(IUANode, string, string\)
Importa allarmi da un file Excel nella struttura del progetto,
collegandoli al nodo logico specificato.
```csharp
public static void ImportAlarmsInsideOwner(this IUANode owner, string alrmFilePath, string fileName)
```
#### Parameters
`owner` IUANode
Nodo logico a cui verranno aggiunti dizionari e allarmi.
`alrmFilePath` [string](https://learn.microsoft.com/dotnet/api/system.string)
Percorso completo del file Excel contenente gli allarmi.
`fileName` [string](https://learn.microsoft.com/dotnet/api/system.string)
Nome utilizzato per creare le sottocartelle nel progetto.

View File

@ -0,0 +1,98 @@
---
title: BaseIOCardDefinition
---
# <a id="TecnoPack_BaseIOCardDefinition"></a> Class BaseIOCardDefinition
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Classe base astratta per le definizioni di schede IO, contenente proprietà condivise tra le varie tipologie.
```csharp
public abstract class BaseIOCardDefinition
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[BaseIOCardDefinition](TecnoPack.BaseIOCardDefinition.md)
#### Derived
[NormalIOCardDefinition](TecnoPack.NormalIOCardDefinition.md),
[SafetyIOCardDefinition](TecnoPack.SafetyIOCardDefinition.md)
#### Inherited Members
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Constructors
### <a id="TecnoPack_BaseIOCardDefinition__ctor"></a> BaseIOCardDefinition\(\)
```csharp
protected BaseIOCardDefinition()
```
## Properties
### <a id="TecnoPack_BaseIOCardDefinition_Colors"></a> Colors
Mappa tra nomi di colori e valori interi non negativi.
Può essere utilizzata per rappresentazioni grafiche o codifiche di stato.
```csharp
public Dictionary<string, uint> Colors { get; set; }
```
#### Property Value
[Dictionary](https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary\-2)
<
[string](https://learn.microsoft.com/dotnet/api/system.string),
[uint](https://learn.microsoft.com/dotnet/api/system.uint32)
\>
### <a id="TecnoPack_BaseIOCardDefinition_IODirection"></a> IODirection
Direzione del segnale IO: tipicamente "I" (Input) o "O" (Output).
```csharp
public string IODirection { get; set; }
```
#### Property Value
[string](https://learn.microsoft.com/dotnet/api/system.string)
### <a id="TecnoPack_BaseIOCardDefinition_NodeType"></a> NodeType
Indica il tipo di nodo associato alla scheda, utile per raggruppamenti logici o di rete.
```csharp
public string NodeType { get; set; }
```
#### Property Value
[string](https://learn.microsoft.com/dotnet/api/system.string)
### <a id="TecnoPack_BaseIOCardDefinition_Type"></a> Type
Specifica il tipo generale della scheda IO (ad esempio, "input" o "output").
```csharp
public string Type { get; set; }
```
#### Property Value
[string](https://learn.microsoft.com/dotnet/api/system.string)

View File

@ -0,0 +1,70 @@
---
title: ConsoleLauncher
---
# <a id="TecnoPack_ConsoleLauncher"></a> Class ConsoleLauncher
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Classe statica responsabile dell'esecuzione di uno script batch da console
e della lettura dell'input prodotto dallo script stesso.
```csharp
public static class ConsoleLauncher
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[ConsoleLauncher](TecnoPack.ConsoleLauncher.md)
#### Inherited Members
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Methods
### <a id="TecnoPack_ConsoleLauncher_Launch_System_String_System_String_"></a> Launch\(string, string\)
Crea ed esegue uno script batch all'interno di una cartella temporanea,
attende la fine dell'esecuzione e restituisce l'input dell'utente letto da file.
```csharp
public static string Launch(string tempFolder, string script)
```
#### Parameters
`tempFolder` [string](https://learn.microsoft.com/dotnet/api/system.string)
Percorso della cartella temporanea dove verrà salvato ed eseguito lo script.
`script` [string](https://learn.microsoft.com/dotnet/api/system.string)
Contenuto dello script batch da eseguire. Deve contenere il placeholder <code>#outputFilePath#</code>
che verrà sostituito con il percorso reale del file di output.
#### Returns
[string](https://learn.microsoft.com/dotnet/api/system.string)
Valore immesso dall'utente nello script batch, oppure <code>null</code> in caso di errore.
#### Remarks
Il metodo crea un file .bat e un file .txt temporanei, li elimina al termine dell'esecuzione.
Il valore inserito dall'utente viene letto dal file .txt generato dallo script batch.
#### Exceptions
[Exception](https://learn.microsoft.com/dotnet/api/system.exception)
Eventuali eccezioni vengono intercettate internamente; viene restituito <code>null</code> in caso di errore.

View File

@ -0,0 +1,101 @@
---
title: DynamicLinkExtensions
---
# <a id="TecnoPack_DynamicLinkExtensions"></a> Class DynamicLinkExtensions
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Classe di estensione per la creazione e gestione dei Dynamic Link su variabili UA in FTOptix.
```csharp
public static class DynamicLinkExtensions
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[DynamicLinkExtensions](TecnoPack.DynamicLinkExtensions.md)
#### Inherited Members
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Methods
### <a id="TecnoPack_DynamicLinkExtensions_GetElementSize_System_Object_"></a> GetElementSize\(object\)
Restituisce la dimensione in byte dell'elemento di un array.
```csharp
public static int GetElementSize(object obj)
```
#### Parameters
`obj` [object](https://learn.microsoft.com/dotnet/api/system.object)
Oggetto che deve essere un array di tipi valore.
#### Returns
[int](https://learn.microsoft.com/dotnet/api/system.int32)
Dimensione in byte dell'elemento dell'array.
#### Exceptions
[ArgumentException](https://learn.microsoft.com/dotnet/api/system.argumentexception)
Se l'oggetto non è un array.
[InvalidOperationException](https://learn.microsoft.com/dotnet/api/system.invalidoperationexception)
Se il tipo dellelemento non può essere determinato o non è un tipo valore.
### <a id="TecnoPack_DynamicLinkExtensions_SetDynamicLink_UAManagedCore_IUAVariable_UAManagedCore_IUAVariable_FTOptix_CoreBase_DynamicLinkMode_System_Nullable_System_UInt32__System_Nullable_System_UInt32__"></a> SetDynamicLink\(IUAVariable, IUAVariable, DynamicLinkMode, uint?, uint?\)
Imposta un collegamento dinamico (Dynamic Link) su una variabile, anche in presenza di array complessi o con bit specifici.
```csharp
public static void SetDynamicLink(this IUAVariable variable, IUAVariable source, DynamicLinkMode mode, uint? sourceArrayIndex = null, uint? sourceSubArrayIndex = null)
```
#### Parameters
`variable` IUAVariable
La variabile di destinazione su cui verrà applicato il Dynamic Link.
`source` IUAVariable
La variabile sorgente da cui leggere il valore.
`mode` DynamicLinkMode
La modalità del Dynamic Link (lettura, scrittura, ecc.).
`sourceArrayIndex` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)?
Indice dell'elemento da collegare in caso di array monodimensionale.
`sourceSubArrayIndex` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)?
Indice del bit specifico da collegare, se applicabile.
#### Exceptions
[ArgumentException](https://learn.microsoft.com/dotnet/api/system.argumentexception)
Viene sollevata se:
- L'indice specificato è fuori dai limiti dell'array.
- La sorgente è null.
- Il sotto-indice è maggiore della dimensione in bit dell'elemento.

View File

@ -0,0 +1,78 @@
---
title: IOCardConfig
---
# <a id="TecnoPack_IOCardConfig"></a> Class IOCardConfig
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Rappresenta la configurazione delle schede IO (Input/Output) del sistema.
Include la mappatura delle schede IO normali e di sicurezza.
```csharp
public class IOCardConfig
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[IOCardConfig](TecnoPack.IOCardConfig.md)
#### Inherited Members
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Remarks
Le chiavi dei dizionari rappresentano identificativi univoci delle schede.
Ogni voce contiene la definizione completa di una scheda.
## Constructors
### <a id="TecnoPack_IOCardConfig__ctor"></a> IOCardConfig\(\)
```csharp
public IOCardConfig()
```
## Properties
### <a id="TecnoPack_IOCardConfig_NormalIoCards"></a> NormalIoCards
Dizionario contenente le definizioni delle schede IO normali, indicizzate per identificatore.
```csharp
public Dictionary<string, NormalIOCardDefinition> NormalIoCards { get; set; }
```
#### Property Value
[Dictionary](https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary\-2)
<
[string](https://learn.microsoft.com/dotnet/api/system.string),
[NormalIOCardDefinition](TecnoPack.NormalIOCardDefinition.md)
\>
### <a id="TecnoPack_IOCardConfig_SafetyIoCards"></a> SafetyIoCards
Dizionario contenente le definizioni delle schede IO di sicurezza, indicizzate per identificatore.
```csharp
public Dictionary<string, SafetyIOCardDefinition> SafetyIoCards { get; set; }
```
#### Property Value
[Dictionary](https://learn.microsoft.com/dotnet/api/system.collections.generic.dictionary\-2)
<
[string](https://learn.microsoft.com/dotnet/api/system.string),
[SafetyIOCardDefinition](TecnoPack.SafetyIOCardDefinition.md)
\>

View File

@ -0,0 +1,106 @@
---
title: InformationModelExtensions
---
# <a id="TecnoPack_InformationModelExtensions"></a> Class InformationModelExtensions
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Contiene metodi di estensione per la gestione del modello informativo OPC UA all'interno del progetto FTOptix.
```csharp
public static class InformationModelExtensions
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[InformationModelExtensions](TecnoPack.InformationModelExtensions.md)
#### Inherited Members
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Remarks
Questa classe fornisce utility per la creazione di dizionari di localizzazione, accesso ai namespace e generazione di riferimenti localizzati.
È definita come <code>partial</code> per consentire estensioni modulari in altri file.
## Methods
### <a id="TecnoPack_InformationModelExtensions_CreateDictionary_System_String_"></a> CreateDictionary\(string\)
Crea una variabile UA che funge da dizionario di localizzazione, con intestazione precompilata.
```csharp
public static IUAVariable CreateDictionary(string dictionaryName)
```
#### Parameters
`dictionaryName` [string](https://learn.microsoft.com/dotnet/api/system.string)
Nome della variabile che rappresenterà il dizionario nel modello. Questo nome sarà utilizzato anche in OPC UA.
#### Returns
IUAVariable
Una variabile UA (<code>IUAVariable</code>) con tipo <code>LocalizationDictionary</code>, inizializzata con una riga contenente l'intestazione:
la prima colonna è "Key", le successive sono i codici delle lingue configurate nel progetto.
#### Remarks
Il dizionario è pronto per essere popolato con chiavi di traduzione e valori per ciascuna lingua.
### <a id="TecnoPack_InformationModelExtensions_GetDefaultNamespaceIndex_UAManagedCore_IContext_"></a> GetDefaultNamespaceIndex\(IContext\)
Restituisce l'indice del namespace predefinito per un determinato contesto.
```csharp
public static int GetDefaultNamespaceIndex(IContext context)
```
#### Parameters
`context` IContext
Il contesto corrente da cui ottenere l'indice del namespace.
#### Returns
[int](https://learn.microsoft.com/dotnet/api/system.int32)
L'indice del namespace predefinito. Se non è valido, restituisce quello del progetto corrente.
### <a id="TecnoPack_InformationModelExtensions_GetLocalizedTextFromKey_System_String_"></a> GetLocalizedTextFromKey\(string\)
Restituisce un oggetto <code>LocalizedText</code> a partire da una chiave di traduzione.
```csharp
public static LocalizedText GetLocalizedTextFromKey(string key)
```
#### Parameters
`key` [string](https://learn.microsoft.com/dotnet/api/system.string)
La chiave della traduzione da cercare nel dizionario di localizzazione.
#### Returns
LocalizedText
Un oggetto <code>LocalizedText</code> che punta alla chiave specificata nel namespace del progetto corrente.
#### Remarks
Questo metodo non esegue il lookup della traduzione, ma crea un riferimento che può essere utilizzato nelle proprietà localizzabili.

View File

@ -0,0 +1,44 @@
---
title: NormalIOCardDefinition
---
# <a id="TecnoPack_NormalIOCardDefinition"></a> Class NormalIOCardDefinition
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Definizione di una scheda IO normale.
Eredita le proprietà comuni dalla classe <xref href="TecnoPack.BaseIOCardDefinition" data-throw-if-not-resolved="false"></xref>.
```csharp
public class NormalIOCardDefinition : BaseIOCardDefinition
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[BaseIOCardDefinition](TecnoPack.BaseIOCardDefinition.md) ←
[NormalIOCardDefinition](TecnoPack.NormalIOCardDefinition.md)
#### Inherited Members
[BaseIOCardDefinition.Type](TecnoPack.BaseIOCardDefinition.md\#TecnoPack\_BaseIOCardDefinition\_Type),
[BaseIOCardDefinition.NodeType](TecnoPack.BaseIOCardDefinition.md\#TecnoPack\_BaseIOCardDefinition\_NodeType),
[BaseIOCardDefinition.IODirection](TecnoPack.BaseIOCardDefinition.md\#TecnoPack\_BaseIOCardDefinition\_IODirection),
[BaseIOCardDefinition.Colors](TecnoPack.BaseIOCardDefinition.md\#TecnoPack\_BaseIOCardDefinition\_Colors),
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Constructors
### <a id="TecnoPack_NormalIOCardDefinition__ctor"></a> NormalIOCardDefinition\(\)
```csharp
public NormalIOCardDefinition()
```

View File

@ -0,0 +1,58 @@
---
title: SafetyIOCardDefinition
---
# <a id="TecnoPack_SafetyIOCardDefinition"></a> Class SafetyIOCardDefinition
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Definizione di una scheda IO di sicurezza.
Estende <xref href="TecnoPack.BaseIOCardDefinition" data-throw-if-not-resolved="false"></xref> aggiungendo il tipo di uscita.
```csharp
public class SafetyIOCardDefinition : BaseIOCardDefinition
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[BaseIOCardDefinition](TecnoPack.BaseIOCardDefinition.md) ←
[SafetyIOCardDefinition](TecnoPack.SafetyIOCardDefinition.md)
#### Inherited Members
[BaseIOCardDefinition.Type](TecnoPack.BaseIOCardDefinition.md\#TecnoPack\_BaseIOCardDefinition\_Type),
[BaseIOCardDefinition.NodeType](TecnoPack.BaseIOCardDefinition.md\#TecnoPack\_BaseIOCardDefinition\_NodeType),
[BaseIOCardDefinition.IODirection](TecnoPack.BaseIOCardDefinition.md\#TecnoPack\_BaseIOCardDefinition\_IODirection),
[BaseIOCardDefinition.Colors](TecnoPack.BaseIOCardDefinition.md\#TecnoPack\_BaseIOCardDefinition\_Colors),
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Constructors
### <a id="TecnoPack_SafetyIOCardDefinition__ctor"></a> SafetyIOCardDefinition\(\)
```csharp
public SafetyIOCardDefinition()
```
## Properties
### <a id="TecnoPack_SafetyIOCardDefinition_OutputType"></a> OutputType
Specifica il tipo di uscita associato alla scheda di sicurezza.
```csharp
public string OutputType { get; set; }
```
#### Property Value
[string](https://learn.microsoft.com/dotnet/api/system.string)

View File

@ -0,0 +1,97 @@
---
title: ScriptBuilder
---
# <a id="TecnoPack_ScriptBuilder"></a> Class ScriptBuilder
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Classe statica responsabile della generazione di script batch dinamici
utilizzati per presentare opzioni all'utente e gestire l'input.
```csharp
public static class ScriptBuilder
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[ScriptBuilder](TecnoPack.ScriptBuilder.md)
#### Inherited Members
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Methods
### <a id="TecnoPack_ScriptBuilder_FilterOptionsByLetters_System_String_System_String___"></a> FilterOptionsByLetters\(string, string\[\]\)
Filtra l'elenco delle opzioni in base alle lettere selezionate dall'utente.
Ogni lettera corrisponde a un indice nell'array delle opzioni.
```csharp
public static string[] FilterOptionsByLetters(string inputLetters, string[] options)
```
#### Parameters
`inputLetters` [string](https://learn.microsoft.com/dotnet/api/system.string)
Lettere immesse dall'utente, ad esempio "AC".
`options` [string](https://learn.microsoft.com/dotnet/api/system.string)\[\]
Array di stringhe con tutte le opzioni disponibili.
#### Returns
[string](https://learn.microsoft.com/dotnet/api/system.string)\[\]
Array di opzioni selezionate, senza duplicati.
#### Examples
```csharp
var options = new[] { "Flowpack", "RDS", "Shrinkwrapper", "Packer" };
var selected = ScriptBuilder.FilterOptionsByLetters("AC", options);
// selected = [ "Flowpack", "Shrinkwrapper" ]
```
### <a id="TecnoPack_ScriptBuilder_GenerateOptionScript_System_String_System_String___"></a> GenerateOptionScript\(string, string\[\]\)
Genera uno script batch che presenta un messaggio e una lista di opzioni numerate all'utente.
L'utente può selezionare una o più opzioni utilizzando lettere corrispondenti.
```csharp
public static string GenerateOptionScript(string message, string[] options)
```
#### Parameters
`message` [string](https://learn.microsoft.com/dotnet/api/system.string)
Messaggio da visualizzare prima delle opzioni.
`options` [string](https://learn.microsoft.com/dotnet/api/system.string)\[\]
Array di stringhe contenente le opzioni disponibili.
#### Returns
[string](https://learn.microsoft.com/dotnet/api/system.string)
Script batch sotto forma di stringa.
#### Exceptions
[ArgumentException](https://learn.microsoft.com/dotnet/api/system.argumentexception)
Sollevata se l'array delle opzioni è nullo o vuoto.

View File

@ -0,0 +1,108 @@
---
title: Utils
---
# <a id="TecnoPack_Utils"></a> Class Utils
Namespace: [TecnoPack](TecnoPack.md)
Assembly: CO0002\_Templ\_FlowpackHMI\_V00\_9\_3.dll
Classe di utilità che fornisce metodi e costanti per la gestione di percorsi file e cartelle temporanee.
```csharp
public static class Utils
```
#### Inheritance
[object](https://learn.microsoft.com/dotnet/api/system.object) ←
[Utils](TecnoPack.Utils.md)
#### Inherited Members
[object.GetType\(\)](https://learn.microsoft.com/dotnet/api/system.object.gettype),
[object.MemberwiseClone\(\)](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone),
[object.ToString\(\)](https://learn.microsoft.com/dotnet/api/system.object.tostring),
[object.Equals\(object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\)),
[object.Equals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.equals\#system\-object\-equals\(system\-object\-system\-object\)),
[object.ReferenceEquals\(object?, object?\)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals),
[object.GetHashCode\(\)](https://learn.microsoft.com/dotnet/api/system.object.gethashcode)
## Fields
### <a id="TecnoPack_Utils_TEMP_FOLDER_RESOURCE_URI"></a> TEMP\_FOLDER\_RESOURCE\_URI
Percorso fisso della cartella temporanea del progetto.
Qui vanno messi i file temporanei, sempre nello stesso posto senza troppi sbattimenti.
```csharp
public const string TEMP_FOLDER_RESOURCE_URI = "%PROJECTDIR%/.temp"
```
#### Field Value
[string](https://learn.microsoft.com/dotnet/api/system.string)
## Methods
### <a id="TecnoPack_Utils_GetFullPath_System_String_"></a> GetFullPath\(string\)
Risolve un percorso relativo e ne restituisce il percorso assoluto allinterno del progetto.
Così non ti sbagli più a indicare i percorsi.
```csharp
public static string GetFullPath(string relativePath)
```
#### Parameters
`relativePath` [string](https://learn.microsoft.com/dotnet/api/system.string)
Il percorso relativo da risolvere (inserisci un valore valido).
#### Returns
[string](https://learn.microsoft.com/dotnet/api/system.string)
Il percorso completo e assoluto corrispondente.
### <a id="TecnoPack_Utils_GetRelativeFileapathFromCaller_System_String_System_String_"></a> GetRelativeFileapathFromCaller\(string, string\)
Restituisce il percorso completo di un file, partendo dal percorso del file sorgente che ha chiamato questo metodo.
```csharp
public static string GetRelativeFileapathFromCaller(string relativeFileName, string callerFilePath = "")
```
#### Parameters
`relativeFileName` [string](https://learn.microsoft.com/dotnet/api/system.string)
Il nome o percorso relativo del file da risolvere.
`callerFilePath` [string](https://learn.microsoft.com/dotnet/api/system.string)
Il percorso completo del file sorgente chiamante, fornito automaticamente dal compilatore.
Non va passato manualmente.
#### Returns
[string](https://learn.microsoft.com/dotnet/api/system.string)
Il percorso assoluto calcolato a partire dalla posizione del file chiamante e dal nome relativo.
### <a id="TecnoPack_Utils_GetTempFolder"></a> GetTempFolder\(\)
Restituisce il percorso completo della cartella temporanea, pronta per essere usata.
Senza doverci pensare troppo.
```csharp
public static string GetTempFolder()
```
#### Returns
[string](https://learn.microsoft.com/dotnet/api/system.string)
Il percorso assoluto della cartella temporanea del progetto.

View File

@ -0,0 +1,54 @@
---
title: TecnoPack
---
# <a id="TecnoPack"></a> Namespace TecnoPack
### Classes
[AlarmImporter](TecnoPack.AlarmImporter.md)
Classe statica per l'importazione di allarmi da file Excel (.xlsx)
nella struttura del progetto FTOptix, inclusi dizionari e traduzioni.
[BaseIOCardDefinition](TecnoPack.BaseIOCardDefinition.md)
Classe base astratta per le definizioni di schede IO, contenente proprietà condivise tra le varie tipologie.
[ConsoleLauncher](TecnoPack.ConsoleLauncher.md)
Classe statica responsabile dell'esecuzione di uno script batch da console
e della lettura dell'input prodotto dallo script stesso.
[DynamicLinkExtensions](TecnoPack.DynamicLinkExtensions.md)
Classe di estensione per la creazione e gestione dei Dynamic Link su variabili UA in FTOptix.
[IOCardConfig](TecnoPack.IOCardConfig.md)
Rappresenta la configurazione delle schede IO (Input/Output) del sistema.
Include la mappatura delle schede IO normali e di sicurezza.
[InformationModelExtensions](TecnoPack.InformationModelExtensions.md)
Contiene metodi di estensione per la gestione del modello informativo OPC UA all'interno del progetto FTOptix.
[NormalIOCardDefinition](TecnoPack.NormalIOCardDefinition.md)
Definizione di una scheda IO normale.
Eredita le proprietà comuni dalla classe <xref href="TecnoPack.BaseIOCardDefinition" data-throw-if-not-resolved="false"></xref>.
[SafetyIOCardDefinition](TecnoPack.SafetyIOCardDefinition.md)
Definizione di una scheda IO di sicurezza.
Estende <xref href="TecnoPack.BaseIOCardDefinition" data-throw-if-not-resolved="false"></xref> aggiungendo il tipo di uscita.
[ScriptBuilder](TecnoPack.ScriptBuilder.md)
Classe statica responsabile della generazione di script batch dinamici
utilizzati per presentare opzioni all'utente e gestire l'input.
[Utils](TecnoPack.Utils.md)
Classe di utilità che fornisce metodi e costanti per la gestione di percorsi file e cartelle temporanee.

View File

@ -0,0 +1,148 @@
---
title: tpDiagnosticQueryInterface
---
# ⚙️ tpDiagnosticQueryInterface
La classe **tpDiagnosticQueryInterface** è una NetLogic che permette di eseguire query su un database SQLite e aggiornare variabili di output con i risultati in tempo reale.
È pensata per interfacciarsi con un database di diagnostica e fornire dinamicamente dati a variabili HMI, abilitando laggiornamento automatico dei valori tramite query configurabili.
---
## 🚦 Panoramica generale
La logica si basa su:
- Una variabile `Query` che contiene la stringa SQL da eseguire.
- Una variabile `Enabled` che abilita o disabilita lesecuzione della query.
- Una lista di variabili `OutVariables` che ricevono i valori dal primo record risultato della query.
- Un database SQLite a cui si accede tramite percorso predefinito.
---
## 🛠️ Funzionamento principale
| Elemento | Descrizione |
|--------------------|-----------------------------------------------------------------------------------------------------|
| `Start()` | Inizializza riferimenti alle variabili, al database e si iscrive agli eventi di cambio variabile. |
| `UpdateStatus()` | Esegue la query SQL se abilitato, aggiorna le variabili di output con i risultati. |
| `Stop()` | Pulisce le liste e rimuove gli handler eventi per evitare memory leak. |
---
## 🔄 Flusso di lavoro
1. Alla partenza, recupera le variabili `Query` e `Enabled`, e il riferimento al database SQLite.
2. Si iscrive agli eventi di cambio delle variabili `Query` e `Enabled`.
3. Quando `Query` o `Enabled` cambiano, viene eseguita la query SQL se `Enabled` è true.
4. Il primo record risultato viene scritto sulle variabili di output, fino a un massimo di variabili disponibili.
---
## 💡 Dettagli importanti
- Se la query SQL fallisce, viene loggato un messaggio derrore molto colorito e dettagliato (con frase in dialetto veneziano).
- Le variabili di output sono i primi N figli delloggetto NetLogic, dove N è il numero di colonne del risultato SQL.
- Laggiornamento supporta solo il primo record del risultato (riga zero).
---
## 🛠️ Come configurare le variabili di output su NetLogic in Factory Talk Optix
La classe si aspetta che sulloggetto NetLogic siano create variabili aggiuntive per mappare i valori restituiti dalla query SQL.
### 1. Creazione delle variabili di output
- **Nome variabile:** Devono avere nomi sequenziali nel formato `[0]`, `[1]`, `[2]`, ecc.
- **Come crearle:**
- Apri Factory Talk Optix e seleziona loggetto NetLogic in design time.
- Aggiungi variabili figlie di tipo `IUAVariable` o equivalente, con i nomi indicati sopra.
- **Tipo variabile:** Può essere arbitrario (es. `String`, `Int32`, `Float`, ecc.) in base al tipo di dato atteso dalla colonna SQL.
### 2. Gestione delle variabili in runtime
- Il codice legge dinamicamente queste variabili usando la numerazione `[0]`, `[1]`, ecc., e le usa come destinazione per i valori estratti dal primo record della query.
- Se non esistono variabili per tutte le colonne, il ciclo si interrompe al primo nome mancante.
- È possibile aggiungere tutte le variabili necessarie in modo sequenziale, in base al numero di colonne della query.
### 3. Tipo arbitrario e flessibilità
- Le variabili possono avere qualsiasi tipo supportato da Factory Talk Optix e compatibile con i tipi di dato SQL.
- Il codice scrive valori tramite `RemoteWrite` e usa `UAValue` che gestisce diversi tipi.
- È importante che il tipo della variabile corrisponda al tipo del dato restituito per evitare errori.
---
### 🔧 Esempio di configurazione variabili
| Nome variabile | Tipo suggerito | Descrizione |
|----------------|----------------|----------------------------------|
| `[0]` | `String` | Prima colonna risultato query |
| `[1]` | `Int32` | Seconda colonna risultato query |
| `[2]` | `Float` | Terza colonna risultato query |
| ... | ... | ... |
---
### ⚠️ Nota importante
- La classe attualmente supporta solo il primo record della query (riga zero).
- Per gestire più righe servirebbe implementare una logica di iterazione e mapping aggiuntiva.
---
## 🧰 Metodi principali
| Metodo | Descrizione |
|----------------|---------------------------------------------------------------------------------------------------|
| `Start()` | Setup iniziale: recupera variabili e database, iscrive eventi, prepara lista variabili output. |
| `UpdateStatus()`| Esegue la query e aggiorna le variabili se abilitato. |
| `UpdateStatus(object, VariableChangeEventArgs)`| Overload che risponde agli eventi di cambio variabile, invocando il metodo senza parametri. |
| `Stop()` | Pulizia delle risorse e rimozione degli eventi. |
---
# 🔍 In Depth: Funzioni di tpDiagnosticQueryInterface
---
### `Start()`
> **Descrizione:**
> Metodo di inizializzazione chiamato allavvio della NetLogic.
> Recupera le variabili `Query` e `Enabled` e il database SQLite.
> Registra gli eventi di cambio variabile per aggiornare lo stato.
> Costruisce la lista `OutVariables` basandosi sui figli delloggetto NetLogic.
> **Eccezioni:**
> Lancia eccezioni se le variabili o il database non vengono trovati, con messaggi personalizzati in dialetto veneziano.
---
### `UpdateStatus()`
> **Descrizione:**
> Controlla se la logica è abilitata leggendo la variabile `Enabled`.
> Se abilitata, esegue la query SQL contenuta in `Query`.
> Scrive il primo record dei risultati sulle variabili `OutVariables`.
> **Error Handling:**
> In caso di errore nella query, logga un messaggio di errore molto colorito contenente dettagli tecnici.
---
### `UpdateStatus(object sender, VariableChangeEventArgs e)`
> **Descrizione:**
> Handler evento che richiama semplicemente `UpdateStatus()` senza parametri per aggiornare lo stato quando `Query` o `Enabled` cambiano.
---
### `Stop()`
> **Descrizione:**
> Pulizia e rimozione dei riferimenti alle variabili e agli eventi.
> Serve a prevenire perdite di memoria quando la NetLogic viene fermata o distrutta.
---

View File

@ -0,0 +1,80 @@
---
title: tpPopulateIONetworkDisplay
---
# 🖥️ tpPopulateIONetworkDisplay
La classe **tpPopulateIONetworkDisplay** è una NetLogic che si occupa di comporre e mostrare nella UI la diagnostica completa di tutti gli IO rack remoti presenti nel sistema.
Questa classe raccoglie i dati dai dispositivi remoti configurati e crea dinamicamente i pannelli di visualizzazione per ciascun rack IO.
---
## 🚦 Panoramica generale
La logica si basa su:
- Un folder `CommDrivers` contenente i `TagStructure` relativi agli IO rack remoti.
- Un layout UI (`IONodesDisplay` di tipo `ColumnLayout`) dove vengono aggiunti dinamicamente i pannelli rappresentanti ogni IO rack.
- La comunicazione con ogni pannello remoto, che a sua volta usa la logica **tpPopulateIORack** per popolare i dettagli dello rack.
---
## 🛠️ Funzionamento principale
| Elemento | Descrizione |
|------------------|-------------------------------------------------------------------------------------------------|
| `Populate()` | Metodo pubblico esportato che avvia un task asincrono per la composizione dinamica della UI. |
| `populateTask()` | Metodo che esegue la scansione dei tag di tipo `TagStructure` e costruisce i pannelli remoti. |
| `getRemoteIONodes(UAReference r)` | Metodo helper che crea un pannello remoto per ogni rack IO e ne avvia il popolamento UI. |
---
## 🔍 In Depth: Funzioni di tpPopulateIONetworkDisplay
---
### `Populate()`
> **Descrizione:**
> Metodo esportato per avviare la composizione della diagnostica IO in modo asincrono, evitando il blocco del thread UI.
---
### `populateTask()`
> **Descrizione:**
>
> 1. Recupera il folder `CommDrivers` contenente i tag strutturati degli IO rack.
> 2. Pulisce il layout UI `IONodesDisplay` per prepararlo a contenere i nuovi pannelli.
> 3. Costruisce un array con i nomi dei tag attesi (`AB:1734_{slot}SLOT:I:0` da 1 a 64).
> 4. Filtra i nodi di tipo `TagStructureType` corrispondenti ai nomi attesi.
> 5. Per ciascun nodo valido, richiama il metodo `getRemoteIONodes` per creare il pannello remoto.
---
### `getRemoteIONodes(UAReference r)`
> **Descrizione:**
>
> 1. Ottiene il nodo `TagStructure` di destinazione dal riferimento passato.
> 2. Estrae il nome del dispositivo remoto (`remoteIOName`).
> 3. Crea un pannello (`PanelType`) figlio del pannello `RemoteIO`, con nome uguale al dispositivo remoto.
> 4. Imposta la variabile `RemoteIOName` del pannello appena creato con il nome del dispositivo remoto.
> 5. Aggiunge il pannello al layout `IONodesDisplay`.
> 6. Effettua una pausa di 250ms (necessaria per problemi di sincronizzazione con dispositivi Rockwell).
> 7. Invoca il metodo `Populate()` della NetLogic [`PopulateIORack`](./tpPopulateIORack.md) contenuta allinterno del pannello per popolare i dettagli.
---
## ⚠️ Note importanti
- La classe presuppone che i dispositivi remoti e i relativi tag strutturati siano correttamente configurati nel folder `CommDrivers`.
- La sincronizzazione e il caricamento dei pannelli sono gestiti con una breve pausa, necessaria per garantire la corretta inizializzazione su dispositivi Rockwell.
- Ogni pannello remoto utilizza la logica [**tpPopulateIORack**](./tpPopulateIORack.md) per il popolamento dei dettagli del rack.
---
Se vuoi vedere come funziona il popolamento di ogni singolo rack IO, dai unocchiata alla documentazione di [tpPopulateIORack](./tpPopulateIORack.md).
---

View File

@ -0,0 +1,128 @@
---
title: tpPopulateIORack
---
# ⚙️ tpPopulateIORack
La classe **tpPopulateIORack** è una NetLogic che si occupa di popolare dinamicamente la UI con le schede IO (Input/Output) di un rack remoto, basandosi su una configurazione YAML e strutture dati presenti nel progetto Factory Talk Optix.
> ⚠️ **Nota:** La configurazione YAML viene deserializzata in oggetti C# di tipo **IOCardConfig** (definiti in un file dedicato, [IOCardConfig.md](./IOCardConfig.md)).
> Questa classe rappresenta la struttura dei dati usata per leggere la configurazione e differenziare schede normali e safety.
---
## 🚦 Panoramica generale
La logica si basa su:
- Un file di configurazione YAML (`io_card_config.yaml`) che descrive le caratteristiche e tipologie delle schede IO, corrispondente alla classe `IOCardConfig`.
- Folder di progetto contenenti i template grafici (di tipo `RectangleType`) per le schede IO da istanziare.
- Un folder `CommDrivers` che contiene le variabili remote corrispondenti ai dispositivi IO fisici.
- Un layout UI (`RemoteIOBackplane`) dove vengono aggiunte dinamicamente le schede.
---
## 🛠️ Funzionamento principale
| Elemento | Descrizione |
|-------------------------|----------------------------------------------------------------------------------------------------|
| `Populate()` | Metodo pubblico esportato per avviare il popolamento tramite task asincrono a lunga durata. |
| `LoadConfiguration()` | Legge e deserializza il file YAML con la configurazione delle schede IO in oggetti `IOCardConfig`. |
| `InitializeNodeTypes()` | Recupera i template grafici (RectangleType) per ogni tipo di scheda configurata. |
| `PopulateIOCards()` | Crea e aggiunge i nodi scheda nel layout UI, sincronizzando lordine con un meccanismo di semafori. |
# 🔍 In Depth: Funzioni di tpPopulateIORack
---
### `Populate()`
> **Descrizione:**
> Avvia il processo di popolamento della UI.
> Esegue in background la lettura della configurazione, linizializzazione dei template e la creazione dinamica delle schede IO.
---
### `LoadConfiguration()`
> **Descrizione:**
> Legge il file YAML di configurazione (`io_card_config.yaml`) e lo deserializza in oggetti [IOCardConfig](./IOCardConfig.md) per uso interno.
---
### `InitializeNodeTypes()`
> **Descrizione:**
> Carica i template grafici (`RectangleType`) associati a ciascun tipo di scheda definito nella configurazione YAML.
---
### `PopulateIOCards()`
> **Descrizione:**
> Per ogni slot del rack (da 1 a 64), verifica la presenza di dispositivi remoti e crea le schede IO normali o di sicurezza corrispondenti, aggiungendole al layout UI.
---
### `TryCreateAndAddNormalCard()`
> **Descrizione:**
> Tenta di creare e aggiungere una scheda IO normale basata sulla configurazione e i dati trovati nel folder `CommDrivers`.
---
### `TryCreateAndAddSafetyCard()`
> **Descrizione:**
> Tenta di creare e aggiungere una scheda IO di sicurezza, gestendo input e output associati.
---
### `MakeCardAndAddToLayout()`
> **Descrizione:**
> Metodo interno che istanzia la scheda IO, imposta le proprietà comuni e la inserisce ordinatamente nel layout UI, rispettando la sincronizzazione con i semafori.
---
### `SetCardCommonProperties()`
> **Descrizione:**
> Imposta variabili comuni della scheda (come indice, nome, colori LED) per assicurare la corretta rappresentazione grafica e funzionale.
---
## 🗂️ Esempio di configurazione YAML (`io_card_config.yaml`)
```yaml
normalIoCards:
AB:1734_DI8:C:0:
type: IB8
nodeType: IOCard_8B
iODirection: I
colors:
card: 0xff1b83df
led_on: 0xff00fa7e
led_off: 0xff0f4d29
AB:1734_DOB8:C:0:
type: OB8
nodeType: IOCard_8B
iODirection: O
colors:
card: 0xff40aa84
led_on: 0xffea2e2e
led_off: 0xff500f0f
safetyIoCards:
AB:1734_IB8S_Safety2:I:0:
outputType: AB:1734_IB8S:O:0
type: IB8S
nodeType: IOCard_8BS
iODirection: I
colors:
card: 0xffe4564b
led_on: 0xff00fa7e
led_off: 0xff0f4d29

View File

@ -0,0 +1,84 @@
---
title: tpdAlarmManager
---
# ⚙️ tpdAlarmManager
La classe **tpdAlarmManager** è una NetLogic che si occupa di importare traduzioni e allarmi da file Excel (`.xlsx`) presenti in una cartella specificata.
Questo componente automatizza il caricamento di dizionari di allarmi, facilitando lintegrazione e la gestione centralizzata dei dati di allarme nel progetto.
---
## 🚦 Panoramica generale
Il metodo principale della classe è:
- `ImportTranslationsAndAlarms()`: Importa i file Excel di allarmi e traduzioni dalla cartella configurata, permette allutente di selezionare quali dizionari caricare, quindi importa i dati allinterno del progetto HMI.
---
## 🛠️ Funzionamento principale
| Metodo | Descrizione |
|---------------------------|------------------------------------------------------------------------------------------------------------------------|
| `ImportTranslationsAndAlarms()` | Esegue la scansione della cartella degli allarmi, filtra i file `.xlsx`, mostra una selezione allutente e importa i dizionari scelti. |
---
## 🔄 Flusso di lavoro del metodo ImportTranslationsAndAlarms
1. Recupera il percorso completo della cartella allarmi tramite la variabile `AlarmFolder`.
2. Controlla che la cartella esista; altrimenti lancia uneccezione con messaggio in dialetto veneto.
3. Cerca tutti i file `.xlsx` nella cartella specificata.
4. Crea un dizionario che mappa il nome del file (senza estensione) al percorso completo.
5. Invoca uno script che presenta una lista di opzioni allutente per selezionare i dizionari da importare.
6. Per ogni dizionario selezionato, richiama `Owner.ImportAlarmsInsideOwner` per importare i dati nel progetto.
---
## 💡 Dettagli importanti
- La funzione utilizza un metodo di utilità `Utils.GetFullPath()` per risolvere il percorso della cartella allarmi.
- Viene utilizzata una cartella temporanea tramite `Utils.GetTempFolder()` per eventuali operazioni intermedie.
- Lutente interagisce con uno script generato dinamicamente per scegliere i file da importare, tramite `ConsoleLauncher.Launch`.
- I nomi dei file senza estensione sono usati come chiavi per la selezione.
- Leccezione lanciata in caso di cartella inesistente ha un tono molto colloquiale e colorito (dialetto veneto).
- È presente un codice commentato per una versione parallela di importazione (con `Parallel.ForEach`) che potrebbe essere abilitata per migliorare performance.
---
## 🧰 Metodi principali
| Metodo | Descrizione |
|------------------------------|---------------------------------------------------------------------------------------------------|
| `ImportTranslationsAndAlarms()` | Metodo esportato che gestisce il processo completo di importazione degli allarmi e traduzioni da file Excel. |
---
# 🔍 In Depth: Funzioni di tpdAlarmManager
---
### `ImportTranslationsAndAlarms()`
> **Descrizione:**
> Metodo che esegue limportazione di dizionari di allarmi e traduzioni da file `.xlsx` presenti in una cartella specificata nel progetto.
> Permette la selezione interattiva dei file da importare e li carica nel progetto tramite chiamata a `Owner.ImportAlarmsInsideOwner`.
> **Dettagli tecnici:**
> - Risolve il percorso della cartella allarmi.
> - Controlla lesistenza della cartella (eccezione in caso negativo).
> - Recupera i file Excel `.xlsx`.
> - Presenta allutente un menu di selezione.
> - Importa i dizionari selezionati.
> **Eccezione:**
> Lancia uneccezione se la cartella degli allarmi non esiste, con messaggio in dialetto veneto.
> **Esempio duso:**
> ```csharp
> alarmManager.ImportTranslationsAndAlarms();
> ```
---

View File

@ -0,0 +1,211 @@
---
title: tpdDiangosticGenerator
---
# ⚙️ tpdDiangosticGenerator
La classe **tpdDiangosticGenerator** è il cuore pulsante del sistema diagnostico. Si occupa di **generare automaticamente** i modelli diagnostici e i pulsanti di navigazione per diverse componenti hardware e di sicurezza del progetto.
Con questa classe, la configurazione e la gestione della diagnostica diventano semplici, rapide e centralizzate.
---
## 🚦 Panoramica generale
Il generatore lavora su due fronti principali:
- **Modelli diagnostici**: rappresentazioni strutturate di assi, alimentatori, sicurezza, ecc.
- **Pulsanti di navigazione**: bottoni che permettono di accedere rapidamente alle schermate diagnostiche relative ai modelli.
---
## 🛠️ Metodi principali
| Metodo | Descrizione | Note |
|-----------------------|-------------------------------------------------------------------------------------------------------|----------------------------------|
| `GenerateALL()` | Genera **tutti** i modelli e i pulsanti, invocando i metodi specifici sottostanti. | Metodo “one-shot” |
| `GenerateAllModels()` | Invoca la generazione di tutti i modelli specifici (assi, PSU, sicurezza, ecc.) | |
| `GenerateAllButtons()`| Invoca la generazione di tutti i pulsanti specifici per ogni modello diagnostico | |
| `GenerateAxisModel()` | Genera i modelli degli assi sulla base dei tag `stStandardAxis`. | Usa `AxisType` |
| `GenerateAxisButtons()`| Crea i pulsanti di navigazione collegati agli assi, puntando alla pagina diagnostica asse `_810_DiagAxis`| |
| `GeneratePSUModel()` | Genera i modelli per le unità di alimentazione (`PSUType`). | |
| `GeneratePSUButtons()`| Pulsanti per le PSU, con link alla pagina `_814_DiagPSU`. | |
| `GenerateDCSModel()` | Genera modelli per i componenti di sicurezza `SafetyDCSType` basati su tag `DCI_STOP`. | |
| `GenerateCROUTModel()`| Modelli sicurezza `SafetyCROUTType` basati su tag `CONFIGURABLE_ROUT`. | |
| `GenerateFPMSModel()` | Modelli sicurezza `SafetyFPMSType` basati su tag `FIVE_POS_MODE_SELECTOR`. | |
| `GenerateSafetyButtons()`| Pulsanti per la sicurezza, puntano a `_830_DiagSafety`. | |
---
## 🧰 Come funziona “sotto il cofano”
Il fulcro del generatore è il metodo privato `GenerateModels`, che:
1. Cerca nelle cartelle di comunicazione i **tag** corrispondenti al tipo specificato (es. `stStandardAxis`).
2. Per ogni tag, crea (o trova) un **modello** corrispondente nella cartella modelli.
3. Imposta un nome leggibile e associa un puntatore al tag originale.
Analogamente, `GenerateButtons` crea per ogni modello un pulsante di navigazione nella pagina diagnostica dedicata, utilizzando un template di pulsante personalizzato.
---
## 💡 Funzioni di supporto utili
- `ExtractReadableName(string variableName)`: estrae un nome utente-friendly da un nome di variabile tecnica, inserendo spazi e capitalizzando correttamente.
_Es.:_ `"Axis_X1"``"X 1"`
---
# 🔍 In Depth: Funzioni di tpdDiangosticGenerator
---
### `GenerateALL()`
> **Descrizione:**
> Metodo principale “one-shot” che rigenera **tutti i modelli diagnostici** e **tutti i pulsanti di navigazione** in un solo colpo.
> È pensato per un uso “a caldo” dopo modifiche estese ai tag o alla struttura del progetto.
> **Dettagli tecnici:**
> Invoca internamente `GenerateAllModels()` e `GenerateAllButtons()`, orchestrando così la generazione completa della diagnostica.
> **Esempio duso:**
> ```csharp
> diagnosticGenerator.GenerateALL();
> ```
> **Nota da interfaccia Optix:**
> È possibile eseguire questo metodo cliccando con il tasto destro sulloggetto **design time NetLogic** o sul suo genitore e selezionando **Execute GenerateALL**.
---
### `GenerateAllModels()`
> **Descrizione:**
> Chiama i generatori specifici per ogni categoria di modello diagnostico (assi, PSU, sicurezza), in modo ordinato e modulare.
> **Modelli generati:**
> - Assi (Axis)
> - Alimentatori (PSU)
> - Componenti di sicurezza (DCS, CROUT, FPMS)
---
### `GenerateAllButtons()`
> **Descrizione:**
> Genera i pulsanti di navigazione associati ai modelli diagnostici appena creati, suddivisi per categoria (assi, PSU, sicurezza).
---
### `GenerateAxisModel()`
> **Descrizione:**
> Scansiona i tag di tipo `stStandardAxis` presenti nei driver di comunicazione e genera i modelli `AxisType` corrispondenti.
> **Dettagli:**
> Imposta la proprietà `AxisPointer` del modello con il riferimento al tag originale.
---
### `GenerateAxisButtons()`
> **Descrizione:**
> Per ogni modello asse generato, crea un pulsante di navigazione che punta alla schermata diagnostica asse `_810_DiagAxis`.
---
### `GeneratePSUModel()`
> **Descrizione:**
> Genera i modelli `PSUType` per tutti i tag di tipo `stPowerSupply` trovati, collegandoli opportunamente.
---
### `GeneratePSUButtons()`
> **Descrizione:**
> Crea i pulsanti di navigazione per ogni modello PSU, collegati alla pagina `_814_DiagPSU`.
---
### `GenerateDCSModel()`
> **Descrizione:**
> Genera modelli diagnostici per i componenti di sicurezza `SafetyDCSType` basandosi sui tag `DCI_STOP`.
---
### `GenerateCROUTModel()`
> **Descrizione:**
> Genera modelli `SafetyCROUTType` per tag `CONFIGURABLE_ROUT` correlati ai sistemi di sicurezza configurabili.
---
### `GenerateFPMSModel()`
> **Descrizione:**
> Genera modelli `SafetyFPMSType` basati sui tag `FIVE_POS_MODE_SELECTOR`, tipici di selettori modalità a 5 posizioni.
---
### `GenerateSafetyButtons()`
> **Descrizione:**
> Crea i pulsanti di navigazione per tutti i modelli di sicurezza, puntando alla schermata `_830_DiagSafety`.
---
### `ExtractReadableName(string variableName)`
> **Descrizione:**
> Estrae un nome leggibile e “user-friendly” da un nome tecnico di variabile.
> Ad esempio: `"Axis_X1"` diventa `"X 1"`.
> **Come funziona:**
> - Prende lultima parte dopo lultimo underscore
> - Inserisce spazi prima di lettere maiuscole o cifre
> - Formattta la stringa con la prima lettera maiuscola, il resto minuscolo
---
### `GenerateModels(string modelFolderPath, string tagTypeName, Type modelType, string pointerVariableName)`
> **Descrizione:**
> Metodo generico interno per creare i modelli diagnostici.
> - Cerca nelle cartelle di comunicazione i tag con il tipo specificato.
> - Per ciascun tag, crea o recupera un modello corrispondente nella cartella modelli.
> - Imposta il nome leggibile e il puntatore al tag originale.
---
### `GenerateButtons(string modelFolderPath, string diagnosticPagePath)`
> **Descrizione:**
> Per ogni modello nella cartella indicata, crea (o riusa) un pulsante di navigazione nella pagina diagnostica specificata.
> Usa un template di pulsante predefinito per mantenere luniformità grafica e funzionale.
---
### `CreateModel(TagStructure tag, Type modelType, Folder modelsFolder)`
> **Descrizione:**
> Crea un nuovo oggetto modello con il nome del tag e del tipo specificato, e lo inserisce nella cartella dei modelli.
---
### `PopulateModel(IUAObject model, TagStructure tag, string pointerVariableName)`
> **Descrizione:**
> Riempie il modello con un nome leggibile e imposta la variabile puntatore con il NodeId del tag originale.
---
### `CreateButton(string browseName, ScreenType diagnosticScreen)`
> **Descrizione:**
> Crea un nuovo pulsante di navigazione utilizzando il template `tpButtNavigationDiagnostic`, lo aggiunge al layout della schermata diagnostica e lo restituisce per ulteriori configurazioni.
---

View File

@ -0,0 +1,29 @@
---
sidebar_position: 0
hide_table_of_contents: true
pagination_next: null
pagination_prev: null
title: Introduzione ad Optix
---
import useBaseUrl from '@docusaurus/useBaseUrl';
<div style={{ textAlign: 'center', padding: '3rem 1rem' }}>
<img
src={useBaseUrl('/img/logos/optix-logo.png')}
alt="Logo Optix"
style={{ maxWidth: '220px', marginBottom: '2rem' }}
/>
<h1>🌟Benvenuto su Optix🌟</h1>
<p style={{ fontSize: '1.2rem', maxWidth: '800px', margin: '1rem auto' ,marginBottom: '2rem'}}>
Questa guida ti spiegherà come usare al meglio il nuovo prototipo del pannello <strong>Optix</strong>.<br />
Grandi cose ti aspettano, giovane Padawan!
</p>
<a className='pagination-nav__link' style={{width: '300px', margin: '0 auto'}} href={useBaseUrl('/docs/Rockwell/Optix/OverviewDelPannello')}>🚀 Inizia Ora</a>
</div>

View File

@ -0,0 +1,92 @@
---
sidebar_position: 1
title: Struttura dell'interfaccia HMI
hide_table_of_contents: false
---
import useBaseUrl from '@docusaurus/useBaseUrl';
# 🧭 Struttura Principale della GUI Tecnopack su FactoryTalk Optix
Questa sezione descrive la struttura dellinterfaccia grafica principale (GUI) adottata nei pannelli **Tecnopack**, sviluppata utilizzando **FactoryTalk Optix**.
Linterfaccia è suddivisa in **aree funzionali** ben definite, ciascuna dedicata a una specifica categoria di interazione o informazione.
---
## 🖼️ Panoramica generale
<img src={useBaseUrl('/img/screenshots/optix/main-gui-overview.jpg')} alt="Panoramica GUI Tecnopack" style={{ maxWidth: '100%', borderRadius: '8px', marginTop: '1rem' }} />
---
## 🧩 Composizione dell'interfaccia
### 🔝 Header superiore
- **Logo aziendale**: posizionato in alto a sinistra, identifica il marchio (TECNOPACK GROUP).
- **Informazioni di pagina**: accanto al logo si trovano due etichette:
- Il **numero pagina**, utilizzato per riferimenti interni e logiche PLC.
- Il **nome pagina**, visualizzato come **Localized Text**, derivato dal dizionario traduzioni.
- **Utente attivo**: un pulsante mostra lutente attualmente connesso. Cliccandoci, si accede alla gestione utenti/login.
---
### 📚 Menù laterale sinistro (navigazione principale)
Il pannello laterale sinistro ospita il **menù di navigazione principale**, sempre visibile, composto da pulsanti con **icona + etichetta**.
| Etichetta | Funzione |
|----------------------|----------------------------------------------------------------------------|
| 🏠 Home | Dashboard principale |
| ⚠️ Allarmi | Visualizzazione e gestione degli allarmi |
| ⚙️ Modalità operativa | Selezione delle modalità macchina (es. manuale, automatico) |
| ♨️ Masse saldanti | Configurazione delle temperature |
| 🔑 Abilitazioni | Gestione delle abilitazioni dei dispositivi collegati |
| 🛠️ Mini-Setup | Accesso ai parametri di ricetta della macchina |
| 🧩 Menù avanzato | Accesso all**explorer** contenente funzionalità e sezioni avanzate |
> 📌 **Nota**: Il menù laterale è sempre accessibile, garantendo una navigazione rapida e coerente.
---
### 🧾 Area centrale (contenuti dinamici)
La zona centrale dello schermo contiene un **Panel Loader**, ovvero un contenitore dinamico in cui vengono caricate tutte le schermate in base alla navigazione effettuata dallutente.
È il cuore operativo dellHMI e varia in base al contesto selezionato nel menù laterale.
---
### 🔚 Footer inferiore
La barra inferiore include informazioni in tempo reale:
- **Stato macchina**
- **Ricetta attiva**: con codice identificativo e nome
- **Data e ora**: visualizzate in basso a destra in formato persistente
---
## 📐 Struttura e layout
Linterfaccia adotta un **layout a griglia rigida**, conforme agli standard delle HMI industriali:
- **Colonna sinistra**: fissa, destinata alla navigazione
- **Area centrale**: strutturata a griglia (es. 3×2 o 3×3) per i contenuti dinamici
- **Header e footer**: sempre visibili, garantendo continuità informativa
---
## ✅ Obiettivi dellinterfaccia
Linterfaccia è progettata per:
- Garantire **chiarezza visiva** e semplicità duso
- Offrire un **accesso rapido** alle funzioni principali
- Visualizzare dati **in tempo reale** in modo affidabile
- Mantenere una **struttura coerente** tra le diverse schermate
---
🎯 *Questo layout rappresenta lo standard base per le HMI Tecnopack su piattaforma Optix. Tutte le pagine sviluppate dovrebbero mantenere coerenza con questa struttura per garantire un'esperienza utente uniforme e professionale.*

View File

@ -0,0 +1,129 @@
---
sidebar_position: 0
title: Introduzione al Prototipo Flowpack
hide_table_of_contents: false
---
# 🧩 Prototipo Flowpack
Benvenuto nel prototipo **Flowpack** per la piattaforma Rockwell.
Questo progetto rappresenta un **template modulare e riutilizzabile** per la realizzazione di macchine confezionatrici a film continuo.
Il prototipo è pensato per essere **scalabile** e **configurabile**, con supporto a diverse varianti hardware e HMI.
Tutti i file sono organizzati in modo strutturato per facilitare manutenzione, personalizzazione e deployment.
---
## 📦 Repository GitLab
👉 [Vai alla repository del prototipo Flowpack](https://gitlab.tecnopackspa.it/prototipi/rockwell/flowpack)
> Assicurati di avere accesso alla rete interna o VPN aziendale per poter consultare il repository.
---
## 🧱 Struttura del Progetto
La repository è suddivisa in **due sezioni principali**:
### `Docs/` Documentazione tecnica
Contiene materiali utili allo studio e alla configurazione della macchina:
- **001 - Report**: documenti Word con analisi e report
- **002 - Commenti al software**: fogli Excel per gerarchie, mappe di rete
- **003 - Schemi elettrici**: wiring e connessioni (con `readme.md`)
- **004 - Pagine HMI**: screenshot e layout dell'interfaccia operatore (con `readme.md`)
- **005 - Immagini**: risorse grafiche di supporto (con `readme.md`)
- **006 - Dati tecnici**: parametri e specifiche tecniche (con `readme.md`)
---
### `Software/` Codice e template modulari
Organizzato per supportare **diversi pannelli HMI**, configurazioni PLC e soluzioni di sicurezza.
#### 🔹 HMI (FactoryTalk View ME)
- File progetto `.apa` per pannelli PanelView
- `ChangeLog - V30.txt`: registro modifiche
- Supporto a layout multipli e componenti riutilizzabili
> ⚠️ **Nota**: Il prototipo FactoryTalk View è in fase di **deprecazione**. Si consiglia di migrare a Optix Studio.
#### 🔹 OrientalMotor
- File di configurazione `.mx2` per motori OrientalMotor
#### 🔹 PLC (Rockwell Studio 5000)
- File progetto `.ACD` con template aggiornati
- `ChangeLog - V30.txt`: cronologia modifiche
- Progetti compatibili con CPU Allen-Bradley CompactLogix/ControlLogix
#### 🔹 Safety Unit (Pilz)
- File `.mpnoz` per configurazione moduli sicurezza Pilz
- Supporto a due topologie principali:
- Flowpack **Longitudinale (LTS)**
- Flowpack **Rotativa (ROT)**
> ⚠️ **DEPRECATO**: Questa soluzione Safety non è più mantenuta. Si consiglia di adottare le nuove CPU con safety integrata.
---
## 🛠 Modularità del Prototipo
Il progetto è costruito per essere **modulare e adattabile**.
Le principali varianti gestite includono:
| Componente | Descrizione |
|----------------|--------------------------------------------------------|
| 🧠 PLC | Configurazioni differenziate per taglia macchina |
| 🖥 HMI | Supporto a più pannelli (PanelView, OptixPanel, ecc.) |
| 🦺 Sicurezza | Pilz Safety con modelli rotativi o longitudinali |
| 📋 Ricette | Gestione centralizzata tramite file `Recipes.yaml` |
| 🔐 Accessi | Sistema utenti, ruoli e sicurezza multilivello |
---
## 🧭 Come iniziare
1. **Clona la repository**
```bash
git clone https://gitlab.tecnopackspa.it/prototipi/rockwell/flowpack.git
```
2. **Apri il progetto desiderato**
- **HMI**
- *FactoryTalk View*: utilizza i file `.apa` in `Software/HMI`
> ⚠️ In fase di deprecazione: preferire Optix Studio.
- *Optix Studio*: ancora da integrare, struttura basata su file `.optix`, `.yaml` e `.cs` (citato per futura disponibilità)
- **PLC**
- Usa i file `.ACD` in `Software/PLC`
- **Safety Unit**
- Progetti Pilz nella cartella `Software/Safety Unit`
> ⚠️ **DEPRECATO**: progetto non più mantenuto. Valutare nuova soluzione safety integrata.
3. **Consulta la documentazione in `Docs/`**
- `001 - Report`: analisi e documentazione generale, report modifiche e changelog della commessa
- `002 - Commenti al software`: gerarchie assi e mappature rete
- `003 - Schemi elettrici`: dettagli wiring e connessioni
- `004 - Pagine HMI`: screenshot e dettagli UI
- `005 - Immagini`: immagini della macchina utili per il pannello o la manualistica
- `006 - Dati tecnici`: parametri macchina
---
## 📚 Documentazione correlata
- [Introduzione Rockwell](../../)
- [Introduzione Optix](../../Optix/OptixIntroduzione)
---
*Questo documento sarà aggiornato con levoluzione del prototipo e lintegrazione di Optix Studio.*

60
docs/Rockwell/Rockwell.md Normal file
View File

@ -0,0 +1,60 @@
---
title: Rockwell
hide_table_of_contents: true
pagination_next: null
pagination_prev: null
---
# 👋 Benvenuto nella sezione Rockwell
Questa sezione raccoglie la documentazione tecnica e funzionale legata alle soluzioni sviluppate con **tecnologie Rockwell Automation**.
Il nostro obiettivo?
🔧 **Accelerare lo sviluppo delle applicazioni e degli impianti per macchine da packaging**, fornendo componenti riutilizzabili, templates e best practices.
---
## 🧪 **Prototipi**
Raccolta di **template di macchina** per diverse tipologie di impianti.
Ogni prototipo rappresenta una base solida per lo sviluppo di applicazioni su piattaforma Rockwell.
### 📦 Prototipi disponibili:
| Categoria | Stato | Link |
|----------------------|---------------|---------------------------------|
| 🌀 Flowpack | 🚧 In sviluppo | [Vai ](<./Prototipi/Flowpack>)|
| 🧩 Linea a Moduli | 🚧 In sviluppo | [Vai ](<./Prototipi/Linea a moduli>)|
| 🤖 Isola Robotizzata | 🚧 In sviluppo | *(in arrivo)* |
| 🏗️ Formatrice | 🚧 In sviluppo | *(in arrivo)* |
| 🤏 Pick and Place | 🚧 In sviluppo | *(in arrivo)* |
Ogni template include:
- Struttura software
- Layout HMI
- Logiche base
- Integrazione con I/O e diagnostica
---
## 🔧 [**Optix**](./Optix/OptixIntroduzione)
La piattaforma Rockwell per la creazione di interfacce HMI moderne, scalabili e completamente personalizzabili.
**In questa sezione troverai:**
- [Come creare una nuova pagina](./Optix/CreareUnaNuovaPagina)
- [Gestione della navigazione](./Optix/CreareUnPulsanteDiNavigazione)
- [Panoramica del pannello](./Optix/OverviewDelPannello)
---
## 🚀 Perché questa documentazione
> **Standardizzare, riutilizzare, innovare.**
> Questa documentazione serve come punto di partenza per sviluppatori, tecnici e integratori che lavorano su impianti con tecnologia Rockwell.
📘 Documentazione chiara
♻️ Componenti riutilizzabili
🤝 Condivisione tra team
---

View File

@ -0,0 +1,5 @@
---
hide_table_of_contents: true
pagination_next: null
pagination_prev: null
---

View File

@ -1,47 +1,35 @@
--- ---
sidebar_position: 1 id: intro
title: Benvenuto
slug: /
sidebar_position: 0
hide_table_of_contents: true
pagination_next: null
pagination_prev: null
--- ---
# Tutorial Intro import useBaseUrl from '@docusaurus/useBaseUrl';
import styles from './intro.module.css';
Let's discover **Docusaurus in less than 5 minutes**. <div className={styles.landingContainer}>
## Getting Started <h1>🤖 Benvenuto nel Portale Automazione</h1>
Get started by **creating a new site**. <p style={{ fontSize: '1.2rem' }}>
Scopri la documentazione tecnica per tre delle principali piattaforme di automazione:
<strong> Omron</strong>, <strong>Rockwell</strong> e <strong>Schneider Electric</strong>.
</p>
Or **try Docusaurus immediately** with **[docusaurus.new](https://docusaurus.new)**. <div className={styles.buttonGrid}>
<a className='pagination-nav__link' href={useBaseUrl('/docs/Omron')}>
<img src={useBaseUrl('/img/logos/omron.png')} alt="omron logo" style={{ width: '200px', height: '60px', objectFit: 'contain' }} />
</a>
<a className='pagination-nav__link' href={useBaseUrl('/docs/Rockwell')}>
<img src={useBaseUrl('/img/logos/rockwellautomation.png')} alt="omron logo" style={{ width: '200px', height: '60px', objectFit: 'contain'}} />
</a>
<a className='pagination-nav__link' href={useBaseUrl('/docs/Schneider')}>
<img src={useBaseUrl('img/logos/schneider.png')} alt="omron logo" style={{ width: '200px', height: '60px', objectFit: 'contain'}} />
</a>
</div>
### What you'll need </div>
- [Node.js](https://nodejs.org/en/download/) version 18.0 or above:
- When installing Node.js, you are recommended to check all checkboxes related to dependencies.
## Generate a new site
Generate a new Docusaurus site using the **classic template**.
The classic template will automatically be added to your project after you run the command:
```bash
npm init docusaurus@latest my-website classic
```
You can type this command into Command Prompt, Powershell, Terminal, or any other integrated terminal of your code editor.
The command also installs all necessary dependencies you need to run Docusaurus.
## Start your site
Run the development server:
```bash
cd my-website
npm run start
```
The `cd` command changes the directory you're working with. In order to work with your newly created Docusaurus site, you'll need to navigate the terminal there.
The `npm run start` command builds your website locally and serves it through a development server, ready for you to view at http://localhost:3000/.
Open `docs/intro.md` (this page) and edit some lines: the site **reloads automatically** and displays your changes.

14
docs/intro.module.css Normal file
View File

@ -0,0 +1,14 @@
.landingContainer {
text-align: center;
padding: 2rem;
}
.buttonGrid {
display: flex;
justify-content: center;
gap: 1.5rem;
margin-top: 2rem;
flex-wrap: wrap;
}

View File

@ -1,8 +0,0 @@
{
"label": "Tutorial - Basics",
"position": 2,
"link": {
"type": "generated-index",
"description": "5 minutes to learn the most important Docusaurus concepts."
}
}

View File

@ -1,23 +0,0 @@
---
sidebar_position: 6
---
# Congratulations!
You have just learned the **basics of Docusaurus** and made some changes to the **initial template**.
Docusaurus has **much more to offer**!
Have **5 more minutes**? Take a look at **[versioning](../tutorial-extras/manage-docs-versions.md)** and **[i18n](../tutorial-extras/translate-your-site.md)**.
Anything **unclear** or **buggy** in this tutorial? [Please report it!](https://github.com/facebook/docusaurus/discussions/4610)
## What's next?
- Read the [official documentation](https://docusaurus.io/)
- Modify your site configuration with [`docusaurus.config.js`](https://docusaurus.io/docs/api/docusaurus-config)
- Add navbar and footer items with [`themeConfig`](https://docusaurus.io/docs/api/themes/configuration)
- Add a custom [Design and Layout](https://docusaurus.io/docs/styling-layout)
- Add a [search bar](https://docusaurus.io/docs/search)
- Find inspirations in the [Docusaurus showcase](https://docusaurus.io/showcase)
- Get involved in the [Docusaurus Community](https://docusaurus.io/community/support)

View File

@ -1,34 +0,0 @@
---
sidebar_position: 3
---
# Create a Blog Post
Docusaurus creates a **page for each blog post**, but also a **blog index page**, a **tag system**, an **RSS** feed...
## Create your first Post
Create a file at `blog/2021-02-28-greetings.md`:
```md title="blog/2021-02-28-greetings.md"
---
slug: greetings
title: Greetings!
authors:
- name: Joel Marcey
title: Co-creator of Docusaurus 1
url: https://github.com/JoelMarcey
image_url: https://github.com/JoelMarcey.png
- name: Sébastien Lorber
title: Docusaurus maintainer
url: https://sebastienlorber.com
image_url: https://github.com/slorber.png
tags: [greetings]
---
Congratulations, you have made your first post!
Feel free to play around and edit this post as much as you like.
```
A new blog post is now available at [http://localhost:3000/blog/greetings](http://localhost:3000/blog/greetings).

View File

@ -1,57 +0,0 @@
---
sidebar_position: 2
---
# Create a Document
Documents are **groups of pages** connected through:
- a **sidebar**
- **previous/next navigation**
- **versioning**
## Create your first Doc
Create a Markdown file at `docs/hello.md`:
```md title="docs/hello.md"
# Hello
This is my **first Docusaurus document**!
```
A new document is now available at [http://localhost:3000/docs/hello](http://localhost:3000/docs/hello).
## Configure the Sidebar
Docusaurus automatically **creates a sidebar** from the `docs` folder.
Add metadata to customize the sidebar label and position:
```md title="docs/hello.md" {1-4}
---
sidebar_label: 'Hi!'
sidebar_position: 3
---
# Hello
This is my **first Docusaurus document**!
```
It is also possible to create your sidebar explicitly in `sidebars.js`:
```js title="sidebars.js"
export default {
tutorialSidebar: [
'intro',
// highlight-next-line
'hello',
{
type: 'category',
label: 'Tutorial',
items: ['tutorial-basics/create-a-document'],
},
],
};
```

View File

@ -1,43 +0,0 @@
---
sidebar_position: 1
---
# Create a Page
Add **Markdown or React** files to `src/pages` to create a **standalone page**:
- `src/pages/index.js``localhost:3000/`
- `src/pages/foo.md``localhost:3000/foo`
- `src/pages/foo/bar.js``localhost:3000/foo/bar`
## Create your first React Page
Create a file at `src/pages/my-react-page.js`:
```jsx title="src/pages/my-react-page.js"
import React from 'react';
import Layout from '@theme/Layout';
export default function MyReactPage() {
return (
<Layout>
<h1>My React page</h1>
<p>This is a React page</p>
</Layout>
);
}
```
A new page is now available at [http://localhost:3000/my-react-page](http://localhost:3000/my-react-page).
## Create your first Markdown Page
Create a file at `src/pages/my-markdown-page.md`:
```mdx title="src/pages/my-markdown-page.md"
# My Markdown page
This is a Markdown page
```
A new page is now available at [http://localhost:3000/my-markdown-page](http://localhost:3000/my-markdown-page).

View File

@ -1,31 +0,0 @@
---
sidebar_position: 5
---
# Deploy your site
Docusaurus is a **static-site-generator** (also called **[Jamstack](https://jamstack.org/)**).
It builds your site as simple **static HTML, JavaScript and CSS files**.
## Build your site
Build your site **for production**:
```bash
npm run build
```
The static files are generated in the `build` folder.
## Deploy your site
Test your production build locally:
```bash
npm run serve
```
The `build` folder is now served at [http://localhost:3000/](http://localhost:3000/).
You can now deploy the `build` folder **almost anywhere** easily, **for free** or very small cost (read the **[Deployment Guide](https://docusaurus.io/docs/deployment)**).

View File

@ -1,152 +0,0 @@
---
sidebar_position: 4
---
# Markdown Features
Docusaurus supports **[Markdown](https://daringfireball.net/projects/markdown/syntax)** and a few **additional features**.
## Front Matter
Markdown documents have metadata at the top called [Front Matter](https://jekyllrb.com/docs/front-matter/):
```text title="my-doc.md"
// highlight-start
---
id: my-doc-id
title: My document title
description: My document description
slug: /my-custom-url
---
// highlight-end
## Markdown heading
Markdown text with [links](./hello.md)
```
## Links
Regular Markdown links are supported, using url paths or relative file paths.
```md
Let's see how to [Create a page](/create-a-page).
```
```md
Let's see how to [Create a page](./create-a-page.md).
```
**Result:** Let's see how to [Create a page](./create-a-page.md).
## Images
Regular Markdown images are supported.
You can use absolute paths to reference images in the static directory (`static/img/docusaurus.png`):
```md
![Docusaurus logo](/img/docusaurus.png)
```
![Docusaurus logo](/img/docusaurus.png)
You can reference images relative to the current file as well. This is particularly useful to colocate images close to the Markdown files using them:
```md
![Docusaurus logo](./img/docusaurus.png)
```
## Code Blocks
Markdown code blocks are supported with Syntax highlighting.
````md
```jsx title="src/components/HelloDocusaurus.js"
function HelloDocusaurus() {
return <h1>Hello, Docusaurus!</h1>;
}
```
````
```jsx title="src/components/HelloDocusaurus.js"
function HelloDocusaurus() {
return <h1>Hello, Docusaurus!</h1>;
}
```
## Admonitions
Docusaurus has a special syntax to create admonitions and callouts:
```md
:::tip My tip
Use this awesome feature option
:::
:::danger Take care
This action is dangerous
:::
```
:::tip My tip
Use this awesome feature option
:::
:::danger Take care
This action is dangerous
:::
## MDX and React Components
[MDX](https://mdxjs.com/) can make your documentation more **interactive** and allows using any **React components inside Markdown**:
```jsx
export const Highlight = ({children, color}) => (
<span
style={{
backgroundColor: color,
borderRadius: '20px',
color: '#fff',
padding: '10px',
cursor: 'pointer',
}}
onClick={() => {
alert(`You clicked the color ${color} with label ${children}`)
}}>
{children}
</span>
);
This is <Highlight color="#25c2a0">Docusaurus green</Highlight> !
This is <Highlight color="#1877F2">Facebook blue</Highlight> !
```
export const Highlight = ({children, color}) => (
<span
style={{
backgroundColor: color,
borderRadius: '20px',
color: '#fff',
padding: '10px',
cursor: 'pointer',
}}
onClick={() => {
alert(`You clicked the color ${color} with label ${children}`);
}}>
{children}
</span>
);
This is <Highlight color="#25c2a0">Docusaurus green</Highlight> !
This is <Highlight color="#1877F2">Facebook blue</Highlight> !

View File

@ -1,7 +0,0 @@
{
"label": "Tutorial - Extras",
"position": 3,
"link": {
"type": "generated-index"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

View File

@ -1,55 +0,0 @@
---
sidebar_position: 1
---
# Manage Docs Versions
Docusaurus can manage multiple versions of your docs.
## Create a docs version
Release a version 1.0 of your project:
```bash
npm run docusaurus docs:version 1.0
```
The `docs` folder is copied into `versioned_docs/version-1.0` and `versions.json` is created.
Your docs now have 2 versions:
- `1.0` at `http://localhost:3000/docs/` for the version 1.0 docs
- `current` at `http://localhost:3000/docs/next/` for the **upcoming, unreleased docs**
## Add a Version Dropdown
To navigate seamlessly across versions, add a version dropdown.
Modify the `docusaurus.config.js` file:
```js title="docusaurus.config.js"
export default {
themeConfig: {
navbar: {
items: [
// highlight-start
{
type: 'docsVersionDropdown',
},
// highlight-end
],
},
},
};
```
The docs version dropdown appears in your navbar:
![Docs Version Dropdown](./img/docsVersionDropdown.png)
## Update an existing version
It is possible to edit versioned docs in their respective folder:
- `versioned_docs/version-1.0/hello.md` updates `http://localhost:3000/docs/hello`
- `docs/hello.md` updates `http://localhost:3000/docs/next/hello`

View File

@ -1,88 +0,0 @@
---
sidebar_position: 2
---
# Translate your site
Let's translate `docs/intro.md` to French.
## Configure i18n
Modify `docusaurus.config.js` to add support for the `fr` locale:
```js title="docusaurus.config.js"
export default {
i18n: {
defaultLocale: 'en',
locales: ['en', 'fr'],
},
};
```
## Translate a doc
Copy the `docs/intro.md` file to the `i18n/fr` folder:
```bash
mkdir -p i18n/fr/docusaurus-plugin-content-docs/current/
cp docs/intro.md i18n/fr/docusaurus-plugin-content-docs/current/intro.md
```
Translate `i18n/fr/docusaurus-plugin-content-docs/current/intro.md` in French.
## Start your localized site
Start your site on the French locale:
```bash
npm run start -- --locale fr
```
Your localized site is accessible at [http://localhost:3000/fr/](http://localhost:3000/fr/) and the `Getting Started` page is translated.
:::caution
In development, you can only use one locale at a time.
:::
## Add a Locale Dropdown
To navigate seamlessly across languages, add a locale dropdown.
Modify the `docusaurus.config.js` file:
```js title="docusaurus.config.js"
export default {
themeConfig: {
navbar: {
items: [
// highlight-start
{
type: 'localeDropdown',
},
// highlight-end
],
},
},
};
```
The locale dropdown now appears in your navbar:
![Locale Dropdown](./img/localeDropdown.png)
## Build your localized site
Build your site for a specific locale:
```bash
npm run build -- --locale fr
```
Or build your site to include all the locales at once:
```bash
npm run build
```

17470
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
{ {
"name": "docs-temp", "name": "tecnopack-documentation",
"version": "0.0.0", "version": "0.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
@ -11,11 +11,15 @@
"clear": "docusaurus clear", "clear": "docusaurus clear",
"serve": "docusaurus serve", "serve": "docusaurus serve",
"write-translations": "docusaurus write-translations", "write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids" "write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
}, },
"dependencies": { "dependencies": {
"@docusaurus/core": "3.8.1", "@docusaurus/core": "3.8.1",
"@docusaurus/plugin-pwa": "^3.8.1",
"@docusaurus/preset-classic": "3.8.1", "@docusaurus/preset-classic": "3.8.1",
"@docusaurus/theme-classic": "^3.8.1",
"@easyops-cn/docusaurus-search-local": "^0.52.1",
"@mdx-js/react": "^3.0.0", "@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0", "clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0", "prism-react-renderer": "^2.3.0",
@ -24,7 +28,9 @@
}, },
"devDependencies": { "devDependencies": {
"@docusaurus/module-type-aliases": "3.8.1", "@docusaurus/module-type-aliases": "3.8.1",
"@docusaurus/types": "3.8.1" "@docusaurus/tsconfig": "3.8.1",
"@docusaurus/types": "3.8.1",
"typescript": "~5.6.2"
}, },
"browserslist": { "browserslist": {
"production": [ "production": [

View File

@ -0,0 +1,103 @@
# 👩‍💻 Guida per gli Sviluppatori
Benvenuto nel progetto! Questa guida ti spiega come collaborare in modo ordinato e sicuro usando Git e GitHub.
---
## 🧰 Requisiti
- Avere Git installato
- Avere Nodejs installato
- Accesso al repository (richiedilo al mantainer)
- Account GitLab
---
## 🚀 Passaggi per lavorare sul progetto
### 1. Clona il repository e avvia il server di sviluppo
```bash
git clone https://gitlab.tecnopackspa.it/tp-docs/tp-docs.git
cd tp-docs
npm install
npm start
```
---
### 2. Crea un nuovo branch per il tuo lavoro
Non lavorare mai direttamente su `master`.
```bash
git checkout -b feature/nome-funzionalità
```
#### Esempi:
- feature/login-page
- bugfix/correzione-header
- hotfix/errore-build
---
### 3. Lavora sul codice
Aggiungi/modifica i file come necessario. Quando sei pronto per salvare i tuoi cambiamenti:
```bash
git add .
git commit -m "Descrizione chiara delle modifiche"
```
---
### 4. Sincronizzati con `master` (facoltativo ma consigliato)
Prima di pushare, puoi aggiornare il tuo branch con le ultime modifiche da `master`:
```bash
git checkout master
git pull origin master
git checkout feature/nome-funzionalità
git merge master
```
---
### 5. Push del branch remoto
```bash
git push origin feature/nome-funzionalità
```
---
### 6. Crea una Merge Request (MR)
#### Vai su GitLab:
1. Apri il repository
2. GitLab ti proporrà automaticamente di creare una MR
3. Assicurati che la base sia `master`
4. aggiungi titolo, descrizione e tagga un revisore (es: @nomeutente)
---
### 7. Rispondi ai commenti e correggi
- Se il mantainer lascia dei commenti, aggiorna il codice e fai nuovi commit.
- La MR si aggiornerà automaticamente.
---
### 8. Una volta approvata…
- Il mantainer eseguirà il merge della MR nel branch `master`.
- Dopo il merge, puoi cancellare il branch:
```bash
git branch -d feature/nome-funzionalità
```
---
### ✅ Buone pratiche
- Commits chiari e frequenti.
- Branch con nomi espliciti.
+ MR brevi e mirate.
+ Segui gli standard di codice del team (linting, formattazione).
---
### 📌 In caso di dubbi
Contatta il mantainer del progetto o consulta la documentazione interna.

View File

@ -0,0 +1,73 @@
# 🛠️ Guida per il Maintainer / Owner del Progetto
Questa guida serve per organizzare e mantenere ordinato il flusso di lavoro Git in un progetto condiviso.
---
## 📁 Struttura base del repository
- `master`: codice stabile, **protetto**.
- `feature/...`: branch per nuove funzionalità.
- `bugfix/...`, `hotfix/...`: per correzioni.
---
## 🧑‍💼 Compiti principali del maintainer
### ✅ 1. Impostazioni del repo
- Aggiungi i collaboratori.
- Imposta le protezioni sul branch `master`:
- Solo Merge Request (MR).
- Almeno una review richiesta.
- Blocca il push diretto a `master`.
- (Opzionale) Check automatici (lint/test).
---
### 🔀 2. Revisione delle Merge Request
- Leggi il codice, lascia commenti.
- Richiedi modifiche se necessario.
- Approva e fai il merge.
```bash
# facoltativo: merge da terminale
git checkout master
git pull
git merge feature/xyz
git push origin master
```
- Elimina i branch obsoleti (dopo merge).
---
### 📈 3. Organizza e guida il team
- Spiega il flusso ai nuovi sviluppatori.
- Mantieni una documentazione aggiornata.
- Eventualmente: crea delle issue da assegnare.
---
### 🧱 4. Convenzioni consigliate
| Tipo di branch | Prefisso | Esempio |
|----------------|---------------|---------------------------|
| Feature | `feature/` | `feature/nuova-api` |
| Bugfix | `bugfix/` | `bugfix/errore-login` |
| Hotfix | `hotfix/` | `hotfix/build-fallita` |
---
### 🧠 Suggerimenti
- Evita MR troppo grandi.
- Richiedi descrizioni dettagliate.
- Non fare merge se i test falliscono.
- Fai da esempio: anche tu lavora su branch separati.
---
### 📌 In caso di domande
Coinvolgi il team o aggiorna la documentazione man mano che emergono dubbi o problemi comuni.

View File

@ -1,4 +1,4 @@
// @ts-check import type { SidebarsConfig } from '@docusaurus/plugin-content-docs';
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
@ -11,12 +11,10 @@
The sidebars can be generated from the filesystem, or explicitly defined here. The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want. Create as many sidebars as you want.
@type {import('@docusaurus/plugin-content-docs').SidebarsConfig}
*/ */
const sidebars = { const sidebars: SidebarsConfig = {
// By default, Docusaurus generates a sidebar from the docs folder structure // By default, Docusaurus generates a sidebar from the docs folder structure
tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], docSidebar: [{ type: 'autogenerated', dirName: '.' }],
// But you can create a sidebar manually // But you can create a sidebar manually
/* /*

View File

@ -1,64 +0,0 @@
import clsx from 'clsx';
import Heading from '@theme/Heading';
import styles from './styles.module.css';
const FeatureList = [
{
title: 'Easy to Use',
Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
description: (
<>
Docusaurus was designed from the ground up to be easily installed and
used to get your website up and running quickly.
</>
),
},
{
title: 'Focus on What Matters',
Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
description: (
<>
Docusaurus lets you focus on your docs, and we&apos;ll do the chores. Go
ahead and move your docs into the <code>docs</code> directory.
</>
),
},
{
title: 'Powered by React',
Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
description: (
<>
Extend or customize your website layout by reusing React. Docusaurus can
be extended while reusing the same header and footer.
</>
),
},
];
function Feature({Svg, title, description}) {
return (
<div className={clsx('col col--4')}>
<div className="text--center">
<Svg className={styles.featureSvg} role="img" />
</div>
<div className="text--center padding-horiz--md">
<Heading as="h3">{title}</Heading>
<p>{description}</p>
</div>
</div>
);
}
export default function HomepageFeatures() {
return (
<section className={styles.features}>
<div className="container">
<div className="row">
{FeatureList.map((props, idx) => (
<Feature key={idx} {...props} />
))}
</div>
</div>
</section>
);
}

View File

@ -0,0 +1,24 @@
import type {ReactNode} from 'react';
import styles from './styles.module.css';
// Rimuoviamo le importazioni inutilizzate
// import clsx from 'clsx';
// import Heading from '@theme/Heading';
export default function HomepageFeatures(): ReactNode {
return (
<section className={styles.flexGrowSection}>
<video
className={styles.introVideo}
src="vid/videointro.mp4"
autoPlay
muted
//playsInline
loop
disablePictureInPicture
>
Il tuo browser non supporta il tag video.
</video>
</section>
);
}

View File

@ -1,3 +1,4 @@
.features { .features {
display: flex; display: flex;
align-items: center; align-items: center;
@ -9,3 +10,17 @@
height: 200px; height: 200px;
width: 200px; width: 200px;
} }
.flexGrowSection {
flex: 1 1 auto;
display: flex;
flex-direction: column;
overflow: hidden;
}
.introVideo {
flex: 1 1 auto;
width: 100%;
height: 100px;
object-fit: cover;
}

View File

@ -5,6 +5,19 @@
*/ */
/* You can override the default Infima variables here. */ /* You can override the default Infima variables here. */
html, body {
height: 100%;
margin: 0;
}
main {
display: flex;
flex-direction: column;
flex: 1 1 auto;
min-height: 0; /* prevents flex child overflow */
}
:root { :root {
--ifm-color-primary: #2e8555; --ifm-color-primary: #2e8555;
--ifm-color-primary-dark: #29784c; --ifm-color-primary-dark: #29784c;

View File

@ -3,6 +3,7 @@
* and scoped locally. * and scoped locally.
*/ */
.heroBanner { .heroBanner {
padding: 4rem 0; padding: 4rem 0;
text-align: center; text-align: center;

View File

@ -1,16 +1,17 @@
import clsx from 'clsx'; import type { ReactNode } from "react";
import Link from '@docusaurus/Link'; import clsx from "clsx";
import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import Link from "@docusaurus/Link";
import Layout from '@theme/Layout'; import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import HomepageFeatures from '@site/src/components/HomepageFeatures'; import Layout from "@theme/Layout";
import HomepageFeatures from "@site/src/components/HomepageFeatures";
import Heading from "@theme/Heading";
import Heading from '@theme/Heading'; import styles from "./index.module.css";
import styles from './index.module.css';
function HomepageHeader() { function HomepageHeader() {
const { siteConfig } = useDocusaurusContext(); const { siteConfig } = useDocusaurusContext();
return ( return (
<header className={clsx('hero hero--primary', styles.heroBanner)}> <header className={clsx("hero hero--primary", styles.heroBanner)}>
<div className="container"> <div className="container">
<Heading as="h1" className="hero__title"> <Heading as="h1" className="hero__title">
{siteConfig.title} {siteConfig.title}
@ -19,8 +20,9 @@ function HomepageHeader() {
<div className={styles.buttons}> <div className={styles.buttons}>
<Link <Link
className="button button--secondary button--lg" className="button button--secondary button--lg"
to="/docs/intro"> to="/docs/"
Docusaurus Tutorial - 5min >
Documentazione
</Link> </Link>
</div> </div>
</div> </div>
@ -28,12 +30,13 @@ function HomepageHeader() {
); );
} }
export default function Home() { export default function Home(): ReactNode {
const { siteConfig } = useDocusaurusContext(); const { siteConfig } = useDocusaurusContext();
return ( return (
<Layout <Layout
title={`Hello from ${siteConfig.title}`} title={`Hello from ${siteConfig.title}`}
description="Description will go into a meta tag in <head />"> description="Description will go into a meta tag in <head />"
>
<HomepageHeader /> <HomepageHeader />
<main> <main>
<HomepageFeatures /> <HomepageFeatures />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

BIN
static/img/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 479 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 6.3 KiB

BIN
static/img/logos/omron.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

View File

@ -1,171 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1088" height="687.962" viewBox="0 0 1088 687.962">
<title>Easy to Use</title>
<g id="Group_12" data-name="Group 12" transform="translate(-57 -56)">
<g id="Group_11" data-name="Group 11" transform="translate(57 56)">
<path id="Path_83" data-name="Path 83" d="M1017.81,560.461c-5.27,45.15-16.22,81.4-31.25,110.31-20,38.52-54.21,54.04-84.77,70.28a193.275,193.275,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.282,657.282,0,0,0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07,5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12,52.29-235.46,134.74-296.47,155.97-115.41,369.76-110.57,523.43,7.88C941.15,276.621,1036.99,396.031,1017.81,560.461Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_84" data-name="Path 84" d="M986.56,670.771c-20,38.52-47.21,64.04-77.77,80.28a193.272,193.272,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.3,657.3,0,0,0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25,1.72c-100.17,7.36-253.82-6.43-321.42-143.29L382,283.981,444.95,445.6l20.09,51.59,55.37-75.98L549,381.981l130.2,149.27,36.8-81.27L970.78,657.9l14.21,11.59Z" transform="translate(-56 -106.019)" fill="#f2f2f2"/>
<path id="Path_85" data-name="Path 85" d="M302,282.962l26-57,36,83-31-60Z" opacity="0.1"/>
<path id="Path_86" data-name="Path 86" d="M610.5,753.821q-14.97-.675-29.97-.67L465.04,497.191Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<path id="Path_87" data-name="Path 87" d="M464.411,315.191,493,292.962l130,150-132-128Z" opacity="0.1"/>
<path id="Path_88" data-name="Path 88" d="M908.79,751.051a193.265,193.265,0,0,1-27.46,11.94L679.2,531.251Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<circle id="Ellipse_11" data-name="Ellipse 11" cx="3" cy="3" r="3" transform="translate(479 98.962)" fill="#f2f2f2"/>
<circle id="Ellipse_12" data-name="Ellipse 12" cx="3" cy="3" r="3" transform="translate(396 201.962)" fill="#f2f2f2"/>
<circle id="Ellipse_13" data-name="Ellipse 13" cx="2" cy="2" r="2" transform="translate(600 220.962)" fill="#f2f2f2"/>
<circle id="Ellipse_14" data-name="Ellipse 14" cx="2" cy="2" r="2" transform="translate(180 265.962)" fill="#f2f2f2"/>
<circle id="Ellipse_15" data-name="Ellipse 15" cx="2" cy="2" r="2" transform="translate(612 96.962)" fill="#f2f2f2"/>
<circle id="Ellipse_16" data-name="Ellipse 16" cx="2" cy="2" r="2" transform="translate(736 192.962)" fill="#f2f2f2"/>
<circle id="Ellipse_17" data-name="Ellipse 17" cx="2" cy="2" r="2" transform="translate(858 344.962)" fill="#f2f2f2"/>
<path id="Path_89" data-name="Path 89" d="M306,121.222h-2.76v-2.76h-1.48v2.76H299V122.7h2.76v2.759h1.48V122.7H306Z" fill="#f2f2f2"/>
<path id="Path_90" data-name="Path 90" d="M848,424.222h-2.76v-2.76h-1.48v2.76H841V425.7h2.76v2.759h1.48V425.7H848Z" fill="#f2f2f2"/>
<path id="Path_91" data-name="Path 91" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_92" data-name="Path 92" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<ellipse id="Ellipse_18" data-name="Ellipse 18" cx="544" cy="30" rx="544" ry="30" transform="translate(0 583.962)" fill="#3f3d56"/>
<path id="Path_93" data-name="Path 93" d="M624,677.981c0,33.137-14.775,24-33,24s-33,9.137-33-24,33-96,33-96S624,644.844,624,677.981Z" transform="translate(-56 -106.019)" fill="#ff6584"/>
<path id="Path_94" data-name="Path 94" d="M606,690.66c0,15.062-6.716,10.909-15,10.909s-15,4.153-15-10.909,15-43.636,15-43.636S606,675.6,606,690.66Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<rect id="Rectangle_97" data-name="Rectangle 97" width="92" height="18" rx="9" transform="translate(489 604.962)" fill="#2f2e41"/>
<rect id="Rectangle_98" data-name="Rectangle 98" width="92" height="18" rx="9" transform="translate(489 586.962)" fill="#2f2e41"/>
<path id="Path_95" data-name="Path 95" d="M193,596.547c0,55.343,34.719,100.126,77.626,100.126" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_96" data-name="Path 96" d="M270.626,696.673c0-55.965,38.745-101.251,86.626-101.251" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_97" data-name="Path 97" d="M221.125,601.564c0,52.57,22.14,95.109,49.5,95.109" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_98" data-name="Path 98" d="M270.626,696.673c0-71.511,44.783-129.377,100.126-129.377" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_99" data-name="Path 99" d="M254.3,697.379s11.009-.339,14.326-2.7,16.934-5.183,17.757-1.395,16.544,18.844,4.115,18.945-28.879-1.936-32.19-3.953S254.3,697.379,254.3,697.379Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_100" data-name="Path 100" d="M290.716,710.909c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7,8.879,4.009,10.9,19.761,4.053,32.19,3.953c3.588-.029,4.827-1.305,4.759-3.2C294.755,710.174,293.386,710.887,290.716,710.909Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_101" data-name="Path 101" d="M777.429,633.081c0,38.029,23.857,68.8,53.341,68.8" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_102" data-name="Path 102" d="M830.769,701.882c0-38.456,26.623-69.575,59.525-69.575" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_103" data-name="Path 103" d="M796.755,636.528c0,36.124,15.213,65.354,34.014,65.354" transform="translate(-56 -106.019)" fill="#6c63ff"/>
<path id="Path_104" data-name="Path 104" d="M830.769,701.882c0-49.139,30.773-88.9,68.8-88.9" transform="translate(-56 -106.019)" fill="#3f3d56"/>
<path id="Path_105" data-name="Path 105" d="M819.548,702.367s7.565-.233,9.844-1.856,11.636-3.562,12.2-.958,11.368,12.949,2.828,13.018-19.844-1.33-22.119-2.716S819.548,702.367,819.548,702.367Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_106" data-name="Path 106" d="M844.574,711.664c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479,6.1,2.755,7.487,13.579,2.785,22.119,2.716c2.465-.02,3.317-.9,3.27-2.2C847.349,711.159,846.409,711.649,844.574,711.664Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_107" data-name="Path 107" d="M949.813,724.718s11.36-1.729,14.5-4.591,16.89-7.488,18.217-3.667,19.494,17.447,6.633,19.107-30.153,1.609-33.835-.065S949.813,724.718,949.813,724.718Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_108" data-name="Path 108" d="M989.228,734.173c-12.86,1.659-30.153,1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833,9.109,5.516,10.783,20.975,1.725,33.835.065c3.712-.479,4.836-1.956,4.529-3.906C993.319,732.907,991.991,733.817,989.228,734.173Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_109" data-name="Path 109" d="M670.26,723.9s9.587-1.459,12.237-3.875,14.255-6.32,15.374-3.095,16.452,14.725,5.6,16.125-25.448,1.358-28.555-.055S670.26,723.9,670.26,723.9Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_110" data-name="Path 110" d="M703.524,731.875c-10.853,1.4-25.448,1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547,7.687,4.655,9.1,17.7,1.456,28.555.055c3.133-.4,4.081-1.651,3.822-3.3C706.977,730.807,705.856,731.575,703.524,731.875Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_111" data-name="Path 111" d="M178.389,719.109s7.463-1.136,9.527-3.016,11.1-4.92,11.969-2.409,12.808,11.463,4.358,12.553-19.811,1.057-22.23-.043S178.389,719.109,178.389,719.109Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
<path id="Path_112" data-name="Path 112" d="M204.285,725.321c-8.449,1.09-19.811,1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2,5.984,3.624,7.085,13.781,1.133,22.23.043c2.439-.315,3.177-1.285,2.976-2.566C206.973,724.489,206.1,725.087,204.285,725.321Z" transform="translate(-56 -106.019)" opacity="0.2"/>
<path id="Path_113" data-name="Path 113" d="M439.7,707.337c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873,42.118-36.793,93.694-36.793S439.7,677.117,439.7,707.337Z" transform="translate(-56 -106.019)" opacity="0.1"/>
<path id="Path_114" data-name="Path 114" d="M439.7,699.9c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873S295.04,663.1,346.616,663.1,439.7,669.676,439.7,699.9Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
</g>
<g id="docusaurus_keytar" transform="translate(312.271 493.733)">
<path id="Path_40" data-name="Path 40" d="M99,52h91.791V89.153H99Z" transform="translate(5.904 -14.001)" fill="#fff" fill-rule="evenodd"/>
<path id="Path_41" data-name="Path 41" d="M24.855,163.927A21.828,21.828,0,0,1,5.947,153a21.829,21.829,0,0,0,18.908,32.782H46.71V163.927Z" transform="translate(-3 -4.634)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_42" data-name="Path 42" d="M121.861,61.1l76.514-4.782V45.39A21.854,21.854,0,0,0,176.52,23.535H78.173L75.441,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L64.513,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L53.586,18.8a3.154,3.154,0,0,0-5.464,0L45.39,23.535c-.024,0-.046,0-.071,0l-4.526-4.525a3.153,3.153,0,0,0-5.276,1.414l-1.5,5.577-5.674-1.521a3.154,3.154,0,0,0-3.863,3.864L26,34.023l-5.575,1.494a3.155,3.155,0,0,0-1.416,5.278l4.526,4.526c0,.023,0,.046,0,.07L18.8,48.122a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,59.05a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,69.977a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,80.9a3.154,3.154,0,0,0,0,5.464L23.535,89.1,18.8,91.832a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,102.76a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,113.687a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,124.615a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,135.542a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,146.469a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,157.4a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,168.324a3.154,3.154,0,0,0,0,5.464l4.732,2.732A21.854,21.854,0,0,0,45.39,198.375H176.52a21.854,21.854,0,0,0,21.855-21.855V89.1l-76.514-4.782a11.632,11.632,0,0,1,0-23.219" transform="translate(-1.681 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_43" data-name="Path 43" d="M143,186.71h32.782V143H143Z" transform="translate(9.984 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_44" data-name="Path 44" d="M196.71,159.855a5.438,5.438,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(10.912 -6.025)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_45" data-name="Path 45" d="M153,124.855h32.782V103H153Z" transform="translate(10.912 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_46" data-name="Path 46" d="M194.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.814,2.814,0,0,0,.349.035" transform="translate(12.767 -9.377)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_47" data-name="Path 47" d="M65.087,56.891a2.732,2.732,0,0,1-2.732-2.732,8.2,8.2,0,0,0-16.391,0,2.732,2.732,0,0,1-5.464,0,13.659,13.659,0,0,1,27.319,0,2.732,2.732,0,0,1-2.732,2.732" transform="translate(0.478 -15.068)" fill-rule="evenodd"/>
<path id="Path_48" data-name="Path 48" d="M103,191.347h65.565a21.854,21.854,0,0,0,21.855-21.855V93H124.855A21.854,21.854,0,0,0,103,114.855Z" transform="translate(6.275 -10.199)" fill="#ffff50" fill-rule="evenodd"/>
<path id="Path_49" data-name="Path 49" d="M173.216,129.787H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0-54.434H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.652H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186M189.585,61.611c-.013,0-.024-.007-.037-.005-3.377.115-4.974,3.492-6.384,6.472-1.471,3.114-2.608,5.139-4.473,5.078-2.064-.074-3.244-2.406-4.494-4.874-1.436-2.835-3.075-6.049-6.516-5.929-3.329.114-4.932,3.053-6.346,5.646-1.5,2.762-2.529,4.442-4.5,4.364-2.106-.076-3.225-1.972-4.52-4.167-1.444-2.443-3.112-5.191-6.487-5.1-3.272.113-4.879,2.606-6.3,4.808-1.5,2.328-2.552,3.746-4.551,3.662-2.156-.076-3.27-1.65-4.558-3.472-1.447-2.047-3.077-4.363-6.442-4.251-3.2.109-4.807,2.153-6.224,3.954-1.346,1.709-2.4,3.062-4.621,2.977a1.093,1.093,0,0,0-.079,2.186c3.3.11,4.967-1.967,6.417-3.81,1.286-1.635,2.4-3.045,4.582-3.12,2.1-.09,3.091,1.218,4.584,3.327,1.417,2,3.026,4.277,6.263,4.394,3.391.114,5.022-2.42,6.467-4.663,1.292-2,2.406-3.734,4.535-3.807,1.959-.073,3.026,1.475,4.529,4.022,1.417,2.4,3.023,5.121,6.324,5.241,3.415.118,5.064-2.863,6.5-5.5,1.245-2.282,2.419-4.437,4.5-4.509,1.959-.046,2.981,1.743,4.492,4.732,1.412,2.79,3.013,5.95,6.365,6.071l.185,0c3.348,0,4.937-3.36,6.343-6.331,1.245-2.634,2.423-5.114,4.444-5.216Z" transform="translate(7.109 -13.11)" fill-rule="evenodd"/>
<path id="Path_50" data-name="Path 50" d="M83,186.71h43.71V143H83Z" transform="translate(4.42 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 109.327, 91.085)">
<rect id="Rectangle_3" data-name="Rectangle 3" width="92.361" height="36.462" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
<g id="Group_2" data-name="Group 2" transform="translate(1.531 23.03)">
<rect id="Rectangle_4" data-name="Rectangle 4" width="5.336" height="5.336" rx="1" transform="translate(16.797 0)" fill="#4a4a4a"/>
<rect id="Rectangle_5" data-name="Rectangle 5" width="5.336" height="5.336" rx="1" transform="translate(23.12 0)" fill="#4a4a4a"/>
<rect id="Rectangle_6" data-name="Rectangle 6" width="5.336" height="5.336" rx="1" transform="translate(29.444 0)" fill="#4a4a4a"/>
<rect id="Rectangle_7" data-name="Rectangle 7" width="5.336" height="5.336" rx="1" transform="translate(35.768 0)" fill="#4a4a4a"/>
<rect id="Rectangle_8" data-name="Rectangle 8" width="5.336" height="5.336" rx="1" transform="translate(42.091 0)" fill="#4a4a4a"/>
<rect id="Rectangle_9" data-name="Rectangle 9" width="5.336" height="5.336" rx="1" transform="translate(48.415 0)" fill="#4a4a4a"/>
<rect id="Rectangle_10" data-name="Rectangle 10" width="5.336" height="5.336" rx="1" transform="translate(54.739 0)" fill="#4a4a4a"/>
<rect id="Rectangle_11" data-name="Rectangle 11" width="5.336" height="5.336" rx="1" transform="translate(61.063 0)" fill="#4a4a4a"/>
<rect id="Rectangle_12" data-name="Rectangle 12" width="5.336" height="5.336" rx="1" transform="translate(67.386 0)" fill="#4a4a4a"/>
<path id="Path_51" data-name="Path 51" d="M1.093,0H14.518a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0ZM75,0H88.426a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H75a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,75,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_3" data-name="Group 3" transform="translate(1.531 10.261)">
<path id="Path_52" data-name="Path 52" d="M1.093,0H6.218A1.093,1.093,0,0,1,7.31,1.093V4.242A1.093,1.093,0,0,1,6.218,5.335H1.093A1.093,1.093,0,0,1,0,4.242V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_13" data-name="Rectangle 13" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_14" data-name="Rectangle 14" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_15" data-name="Rectangle 15" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_16" data-name="Rectangle 16" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_17" data-name="Rectangle 17" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_18" data-name="Rectangle 18" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_19" data-name="Rectangle 19" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_20" data-name="Rectangle 20" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_21" data-name="Rectangle 21" width="5.336" height="5.336" rx="1" transform="translate(58.888 0)" fill="#4a4a4a"/>
<rect id="Rectangle_22" data-name="Rectangle 22" width="5.336" height="5.336" rx="1" transform="translate(65.212 0)" fill="#4a4a4a"/>
<rect id="Rectangle_23" data-name="Rectangle 23" width="5.336" height="5.336" rx="1" transform="translate(71.536 0)" fill="#4a4a4a"/>
<rect id="Rectangle_24" data-name="Rectangle 24" width="5.336" height="5.336" rx="1" transform="translate(77.859 0)" fill="#4a4a4a"/>
<rect id="Rectangle_25" data-name="Rectangle 25" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
</g>
<g id="Group_4" data-name="Group 4" transform="translate(91.05 9.546) rotate(180)">
<path id="Path_53" data-name="Path 53" d="M1.093,0H6.219A1.093,1.093,0,0,1,7.312,1.093v3.15A1.093,1.093,0,0,1,6.219,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_26" data-name="Rectangle 26" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_27" data-name="Rectangle 27" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_28" data-name="Rectangle 28" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_29" data-name="Rectangle 29" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_30" data-name="Rectangle 30" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_31" data-name="Rectangle 31" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_32" data-name="Rectangle 32" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_33" data-name="Rectangle 33" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_34" data-name="Rectangle 34" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
<rect id="Rectangle_35" data-name="Rectangle 35" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
<rect id="Rectangle_36" data-name="Rectangle 36" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
<rect id="Rectangle_37" data-name="Rectangle 37" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
<rect id="Rectangle_38" data-name="Rectangle 38" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
<rect id="Rectangle_39" data-name="Rectangle 39" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
<rect id="Rectangle_40" data-name="Rectangle 40" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
<rect id="Rectangle_41" data-name="Rectangle 41" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
<rect id="Rectangle_42" data-name="Rectangle 42" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
<rect id="Rectangle_43" data-name="Rectangle 43" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
<rect id="Rectangle_44" data-name="Rectangle 44" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
<rect id="Rectangle_45" data-name="Rectangle 45" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
<rect id="Rectangle_46" data-name="Rectangle 46" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
<rect id="Rectangle_47" data-name="Rectangle 47" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
<rect id="Rectangle_48" data-name="Rectangle 48" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
<rect id="Rectangle_49" data-name="Rectangle 49" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
<rect id="Rectangle_50" data-name="Rectangle 50" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
<rect id="Rectangle_51" data-name="Rectangle 51" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
</g>
<g id="Group_6" data-name="Group 6" transform="translate(1.531 16.584)">
<path id="Path_54" data-name="Path 54" d="M1.093,0h7.3A1.093,1.093,0,0,1,9.485,1.093v3.15A1.093,1.093,0,0,1,8.392,5.336h-7.3A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<g id="Group_5" data-name="Group 5" transform="translate(10.671 0)">
<rect id="Rectangle_52" data-name="Rectangle 52" width="5.336" height="5.336" rx="1" fill="#4a4a4a"/>
<rect id="Rectangle_53" data-name="Rectangle 53" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
<rect id="Rectangle_54" data-name="Rectangle 54" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
<rect id="Rectangle_55" data-name="Rectangle 55" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
<rect id="Rectangle_56" data-name="Rectangle 56" width="5.336" height="5.336" rx="1" transform="translate(25.295 0)" fill="#4a4a4a"/>
<rect id="Rectangle_57" data-name="Rectangle 57" width="5.336" height="5.336" rx="1" transform="translate(31.619 0)" fill="#4a4a4a"/>
<rect id="Rectangle_58" data-name="Rectangle 58" width="5.336" height="5.336" rx="1" transform="translate(37.942 0)" fill="#4a4a4a"/>
<rect id="Rectangle_59" data-name="Rectangle 59" width="5.336" height="5.336" rx="1" transform="translate(44.265 0)" fill="#4a4a4a"/>
<rect id="Rectangle_60" data-name="Rectangle 60" width="5.336" height="5.336" rx="1" transform="translate(50.589 0)" fill="#4a4a4a"/>
<rect id="Rectangle_61" data-name="Rectangle 61" width="5.336" height="5.336" rx="1" transform="translate(56.912 0)" fill="#4a4a4a"/>
<rect id="Rectangle_62" data-name="Rectangle 62" width="5.336" height="5.336" rx="1" transform="translate(63.236 0)" fill="#4a4a4a"/>
</g>
<path id="Path_55" data-name="Path 55" d="M1.094,0H8A1.093,1.093,0,0,1,9.091,1.093v3.15A1.093,1.093,0,0,1,8,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(80.428 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_7" data-name="Group 7" transform="translate(1.531 29.627)">
<rect id="Rectangle_63" data-name="Rectangle 63" width="5.336" height="5.336" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_64" data-name="Rectangle 64" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
<rect id="Rectangle_65" data-name="Rectangle 65" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
<rect id="Rectangle_66" data-name="Rectangle 66" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
<path id="Path_56" data-name="Path 56" d="M1.093,0H31.515a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.244V1.093A1.093,1.093,0,0,1,1.093,0ZM34.687,0h3.942a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H34.687a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,34.687,0Z" transform="translate(25.294 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_67" data-name="Rectangle 67" width="5.336" height="5.336" rx="1" transform="translate(66.003 0)" fill="#4a4a4a"/>
<rect id="Rectangle_68" data-name="Rectangle 68" width="5.336" height="5.336" rx="1" transform="translate(72.327 0)" fill="#4a4a4a"/>
<rect id="Rectangle_69" data-name="Rectangle 69" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
<path id="Path_57" data-name="Path 57" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(83.59 2.273) rotate(180)" fill="#4a4a4a"/>
<path id="Path_58" data-name="Path 58" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(78.255 3.063)" fill="#4a4a4a"/>
</g>
<rect id="Rectangle_70" data-name="Rectangle 70" width="88.927" height="2.371" rx="1.085" transform="translate(1.925 1.17)" fill="#4a4a4a"/>
<rect id="Rectangle_71" data-name="Rectangle 71" width="4.986" height="1.581" rx="0.723" transform="translate(4.1 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_72" data-name="Rectangle 72" width="4.986" height="1.581" rx="0.723" transform="translate(10.923 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_73" data-name="Rectangle 73" width="4.986" height="1.581" rx="0.723" transform="translate(16.173 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_74" data-name="Rectangle 74" width="4.986" height="1.581" rx="0.723" transform="translate(21.421 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_75" data-name="Rectangle 75" width="4.986" height="1.581" rx="0.723" transform="translate(26.671 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_76" data-name="Rectangle 76" width="4.986" height="1.581" rx="0.723" transform="translate(33.232 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_77" data-name="Rectangle 77" width="4.986" height="1.581" rx="0.723" transform="translate(38.48 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_78" data-name="Rectangle 78" width="4.986" height="1.581" rx="0.723" transform="translate(43.73 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_79" data-name="Rectangle 79" width="4.986" height="1.581" rx="0.723" transform="translate(48.978 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_80" data-name="Rectangle 80" width="4.986" height="1.581" rx="0.723" transform="translate(55.54 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_81" data-name="Rectangle 81" width="4.986" height="1.581" rx="0.723" transform="translate(60.788 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_82" data-name="Rectangle 82" width="4.986" height="1.581" rx="0.723" transform="translate(66.038 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_83" data-name="Rectangle 83" width="4.986" height="1.581" rx="0.723" transform="translate(72.599 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_84" data-name="Rectangle 84" width="4.986" height="1.581" rx="0.723" transform="translate(77.847 1.566)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_85" data-name="Rectangle 85" width="4.986" height="1.581" rx="0.723" transform="translate(83.097 1.566)" fill="#d8d8d8" opacity="0.136"/>
</g>
<path id="Path_59" data-name="Path 59" d="M146.71,159.855a5.439,5.439,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(6.275 -6.025)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_60" data-name="Path 60" d="M83,124.855h43.71V103H83Z" transform="translate(4.42 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_61" data-name="Path 61" d="M134.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.811,2.811,0,0,0,.349.035" transform="translate(7.202 -9.377)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_62" data-name="Path 62" d="M143.232,42.33a2.967,2.967,0,0,1-.535-.055,2.754,2.754,0,0,1-.514-.153,2.838,2.838,0,0,1-.471-.251,4.139,4.139,0,0,1-.415-.339,3.2,3.2,0,0,1-.338-.415A2.7,2.7,0,0,1,140.5,39.6a2.968,2.968,0,0,1,.055-.535,3.152,3.152,0,0,1,.152-.514,2.874,2.874,0,0,1,.252-.47,2.633,2.633,0,0,1,.753-.754,2.837,2.837,0,0,1,.471-.251,2.753,2.753,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,4.019,4.019,0,0,1,.339.415,2.786,2.786,0,0,1,.251.47,2.864,2.864,0,0,1,.208,1.049,2.77,2.77,0,0,1-.8,1.934,4.139,4.139,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459m21.855-1.366a2.789,2.789,0,0,1-1.935-.8,4.162,4.162,0,0,1-.338-.415,2.7,2.7,0,0,1-.459-1.519,2.789,2.789,0,0,1,.8-1.934,4.139,4.139,0,0,1,.415-.339,2.838,2.838,0,0,1,.471-.251,2.752,2.752,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,2.79,2.79,0,0,1,.8,1.934,3.069,3.069,0,0,1-.055.535,2.779,2.779,0,0,1-.153.514,3.885,3.885,0,0,1-.251.47,4.02,4.02,0,0,1-.339.415,4.138,4.138,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459" transform="translate(9.753 -15.532)" fill-rule="evenodd"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

View File

@ -1,170 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1041.277" height="554.141" viewBox="0 0 1041.277 554.141">
<title>Powered by React</title>
<g id="Group_24" data-name="Group 24" transform="translate(-440 -263)">
<g id="Group_23" data-name="Group 23" transform="translate(439.989 262.965)">
<path id="Path_299" data-name="Path 299" d="M1040.82,611.12q-1.74,3.75-3.47,7.4-2.7,5.67-5.33,11.12c-.78,1.61-1.56,3.19-2.32,4.77-8.6,17.57-16.63,33.11-23.45,45.89A73.21,73.21,0,0,1,942.44,719l-151.65,1.65h-1.6l-13,.14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107,1.16-95.51,1-11.11.12-69,.75H429l-44.75.48h-.48l-141.5,1.53-42.33.46a87.991,87.991,0,0,1-10.79-.54h0c-1.22-.14-2.44-.3-3.65-.49a87.38,87.38,0,0,1-51.29-27.54C116,678.37,102.75,655,93.85,629.64q-1.93-5.49-3.6-11.12C59.44,514.37,97,380,164.6,290.08q4.25-5.64,8.64-11l.07-.08c20.79-25.52,44.1-46.84,68.93-62,44-26.91,92.75-34.49,140.7-11.9,40.57,19.12,78.45,28.11,115.17,30.55,3.71.24,7.42.42,11.11.53,84.23,2.65,163.17-27.7,255.87-47.29,3.69-.78,7.39-1.55,11.12-2.28,66.13-13.16,139.49-20.1,226.73-5.51a189.089,189.089,0,0,1,26.76,6.4q5.77,1.86,11.12,4c41.64,16.94,64.35,48.24,74,87.46q1.37,5.46,2.37,11.11C1134.3,384.41,1084.19,518.23,1040.82,611.12Z" transform="translate(-79.34 -172.91)" fill="#f2f2f2"/>
<path id="Path_300" data-name="Path 300" d="M576.36,618.52a95.21,95.21,0,0,1-1.87,11.12h93.7V618.52Zm-78.25,62.81,11.11-.09V653.77c-3.81-.17-7.52-.34-11.11-.52ZM265.19,618.52v11.12h198.5V618.52ZM1114.87,279h-74V191.51q-5.35-2.17-11.12-4V279H776.21V186.58c-3.73.73-7.43,1.5-11.12,2.28V279H509.22V236.15c-3.69-.11-7.4-.29-11.11-.53V279H242.24V217c-24.83,15.16-48.14,36.48-68.93,62h-.07v.08q-4.4,5.4-8.64,11h8.64V618.52h-83q1.66,5.63,3.6,11.12h79.39v93.62a87,87,0,0,0,12.2,2.79c1.21.19,2.43.35,3.65.49h0a87.991,87.991,0,0,0,10.79.54l42.33-.46v-97H498.11v94.21l11.11-.12V629.64H765.09V721l11.12-.12V629.64H1029.7v4.77c.76-1.58,1.54-3.16,2.32-4.77q2.63-5.45,5.33-11.12,1.73-3.64,3.47-7.4v-321h76.42Q1116.23,284.43,1114.87,279ZM242.24,618.52V290.08H498.11V618.52Zm267,0V290.08H765.09V618.52Zm520.48,0H776.21V290.08H1029.7Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_301" data-name="Path 301" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" fill="#65617d"/>
<path id="Path_302" data-name="Path 302" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" opacity="0.2"/>
<path id="Path_303" data-name="Path 303" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<path id="Path_304" data-name="Path 304" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_305" data-name="Path 305" d="M377.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<rect id="Rectangle_137" data-name="Rectangle 137" width="47.17" height="31.5" transform="translate(680.92 483.65)" fill="#3f3d56"/>
<rect id="Rectangle_138" data-name="Rectangle 138" width="47.17" height="31.5" transform="translate(680.92 483.65)" opacity="0.1"/>
<rect id="Rectangle_139" data-name="Rectangle 139" width="47.17" height="31.5" transform="translate(678.92 483.65)" fill="#3f3d56"/>
<path id="Path_306" data-name="Path 306" d="M298.09,483.65v4.97l-47.17,1.26v-6.23Z" opacity="0.1"/>
<path id="Path_307" data-name="Path 307" d="M460.69,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6a4,4,0,0,1,3.95,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_308" data-name="Path 308" d="M265.19,481.32v181.2h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_309" data-name="Path 309" d="M194.59,319.15h177.5V467.4l-177.5,4Z" fill="#39374d"/>
<path id="Path_310" data-name="Path 310" d="M726.09,483.65v6.41l-47.17-1.26v-5.15Z" opacity="0.1"/>
<path id="Path_311" data-name="Path 311" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0L672,657.42a4,4,0,0,1-3.85-3.95V485.27a4,4,0,0,1,3.95-3.95H863.7a4,4,0,0,1,3.99,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_312" data-name="Path 312" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0V481.32h0a4,4,0,0,1,4,3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_313" data-name="Path 313" d="M775.59,319.15H598.09V467.4l177.5,4Z" fill="#39374d"/>
<path id="Path_314" data-name="Path 314" d="M663.19,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h0a4,4,0,0,1-4-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6A4,4,0,0,1,663.19,485.27Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
<path id="Path_315" data-name="Path 315" d="M397.09,319.15h177.5V467.4l-177.5,4Z" fill="#4267b2"/>
<path id="Path_316" data-name="Path 316" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5,4.4-.02.98-.01Z" opacity="0.1"/>
<circle id="Ellipse_111" data-name="Ellipse 111" cx="51.33" cy="51.33" r="51.33" transform="translate(435.93 246.82)" fill="#fbbebe"/>
<path id="Path_317" data-name="Path 317" d="M617.94,550.07s-99.5,12-90,0c3.44-4.34,4.39-17.2,4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41,77-8.5c-4,13.13-2.69,31.57.35,48.88.89,5.05,1.92,10,3,14.7a344.66,344.66,0,0,0,9.65,33.92Z" transform="translate(-79.34 -172.91)" fill="#fbbebe"/>
<path id="Path_318" data-name="Path 318" d="M585.47,546c11.51-2.13,23.7-6,34.53-1.54,2.85,1.17,5.47,2.88,8.39,3.86s6.12,1.22,9.16,1.91c10.68,2.42,19.34,10.55,24.9,20s8.44,20.14,11.26,30.72l6.9,25.83c6,22.45,12,45.09,13.39,68.3a2437.506,2437.506,0,0,1-250.84,1.43c5.44-10.34,11-21.31,10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34,6.57-13.39,9.64-20.22,8.75-19.52,1.94-45.79,17.32-60.65,6.92-6.68,17-9.21,26.63-8.89,12.28.41,24.85,4.24,37,6.11C555.09,547.48,569.79,548.88,585.47,546Z" transform="translate(-79.34 -172.91)" fill="#ff6584"/>
<path id="Path_319" data-name="Path 319" d="M716.37,657.17l-.1,1.43v.1l-.17,2.3-1.33,18.51-1.61,22.3-.46,6.28-1,13.44v.17l-107,1-175.59,1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53,10.53,0,0,1,11.42-10.17c4.72.4,10.85.89,18.18,1.41l3,.22c42.33,2.94,120.56,6.74,199.5,2,1.66-.09,3.33-.19,5-.31,12.24-.77,24.47-1.76,36.58-3a10.53,10.53,0,0,1,11.6,11.23Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_320" data-name="Path 320" d="M429.08,725.44v-.84l175.62-1.91,107-1h.3v-.17l1-13.44.43-6,1.64-22.61,1.29-17.9v-.44a10.617,10.617,0,0,0-.11-2.47.3.3,0,0,0,0-.1,10.391,10.391,0,0,0-2-4.64,10.54,10.54,0,0,0-9.42-4c-12.11,1.24-24.34,2.23-36.58,3-1.67.12-3.34.22-5,.31-78.94,4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54,10.54,0,0,0-11.24,8.53,11,11,0,0,0-.18,1.64l-.68,22.16L429.54,710l-.44,14.36v1.12Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
<path id="Path_321" data-name="Path 321" d="M716.67,664.18l-1.23,15.33-1.83,22.85-.46,5.72-1,12.81-.06.64v.17h0l-.15,1.48.11-1.48h-.29l-107,1-175.65,1.9v-.28l.49-14.36,1-28.06.64-18.65A6.36,6.36,0,0,1,434.3,658a6.25,6.25,0,0,1,3.78-.9c2.1.17,4.68.37,7.69.59,4.89.36,10.92.78,17.94,1.22,13,.82,29.31,1.7,48,2.42,52,2,122.2,2.67,188.88-3.17,3-.26,6.1-.55,9.13-.84a6.26,6.26,0,0,1,3.48.66,5.159,5.159,0,0,1,.86.54,6.14,6.14,0,0,1,2,2.46,3.564,3.564,0,0,1,.25.61A6.279,6.279,0,0,1,716.67,664.18Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_322" data-name="Path 322" d="M377.44,677.87v3.19a6.13,6.13,0,0,1-3.5,5.54l-40.1.77a6.12,6.12,0,0,1-3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_323" data-name="Path 323" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
<path id="Path_324" data-name="Path 324" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" opacity="0.1"/>
<path id="Path_325" data-name="Path 325" d="M300.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
<path id="Path_326" data-name="Path 326" d="M758.56,679.87v3.19a6.13,6.13,0,0,0,3.5,5.54l40.1.77a6.12,6.12,0,0,0,3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
<path id="Path_327" data-name="Path 327" d="M678.72,517.57l52.25,1V509.9l-52.25-1Z" opacity="0.1"/>
<path id="Path_328" data-name="Path 328" d="M676.72,517.57l52.25,1V509.9l-52.25-1Z" fill="#3f3d56"/>
<path id="Path_329" data-name="Path 329" d="M534.13,486.79c.08,7-3.16,13.6-5.91,20.07a163.491,163.491,0,0,0-12.66,74.71c.73,11,2.58,22,.73,32.9s-8.43,21.77-19,24.9c17.53,10.45,41.26,9.35,57.76-2.66,8.79-6.4,15.34-15.33,21.75-24.11a97.86,97.86,0,0,1-13.31,44.75A103.43,103.43,0,0,0,637,616.53c4.31-5.81,8.06-12.19,9.72-19.23,3.09-13-1.22-26.51-4.51-39.5a266.055,266.055,0,0,1-6.17-33c-.43-3.56-.78-7.22.1-10.7,1-4.07,3.67-7.51,5.64-11.22,5.6-10.54,5.73-23.3,2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47,1.48-16.14,8.32-22,15.34-4.59,5.46-15.81,15.71-16.6,22.86-.72,6.59,5.1,17.63,6.09,24.58,1.3,9,2.22,6,7.3,11.52C532,478.05,534.07,482,534.13,486.79Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
</g>
<g id="docusaurus_keytar" transform="translate(670.271 615.768)">
<path id="Path_40" data-name="Path 40" d="M99,52h43.635V69.662H99Z" transform="translate(-49.132 -33.936)" fill="#fff" fill-rule="evenodd"/>
<path id="Path_41" data-name="Path 41" d="M13.389,158.195A10.377,10.377,0,0,1,4.4,153a10.377,10.377,0,0,0,8.988,15.584H23.779V158.195Z" transform="translate(-3 -82.47)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_42" data-name="Path 42" d="M66.967,38.083l36.373-2.273V30.615A10.389,10.389,0,0,0,92.95,20.226H46.2l-1.3-2.249a1.5,1.5,0,0,0-2.6,0L41,20.226l-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-.034,0-2.152-2.151a1.5,1.5,0,0,0-2.508.672L25.21,21.4l-2.7-.723a1.5,1.5,0,0,0-1.836,1.837l.722,2.7-2.65.71a1.5,1.5,0,0,0-.673,2.509l2.152,2.152c0,.011,0,.022,0,.033l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6L20.226,41l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3A10.389,10.389,0,0,0,30.615,103.34H92.95A10.389,10.389,0,0,0,103.34,92.95V51.393L66.967,49.12a5.53,5.53,0,0,1,0-11.038" transform="translate(-9.836 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_43" data-name="Path 43" d="M143,163.779h15.584V143H143Z" transform="translate(-70.275 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_44" data-name="Path 44" d="M173.779,148.389a2.582,2.582,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-75.08 -75.262)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_45" data-name="Path 45" d="M153,113.389h15.584V103H153Z" transform="translate(-75.08 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_46" data-name="Path 46" d="M183.389,108.944a1.3,1.3,0,1,0,0-2.6,1.336,1.336,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.337,1.337,0,0,0,.166.017" transform="translate(-84.691 -57.894)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_47" data-name="Path 47" d="M52.188,48.292a1.3,1.3,0,0,1-1.3-1.3,3.9,3.9,0,0,0-7.792,0,1.3,1.3,0,1,1-2.6,0,6.493,6.493,0,0,1,12.987,0,1.3,1.3,0,0,1-1.3,1.3" transform="translate(-21.02 -28.41)" fill-rule="evenodd"/>
<path id="Path_48" data-name="Path 48" d="M103,139.752h31.168a10.389,10.389,0,0,0,10.389-10.389V93H113.389A10.389,10.389,0,0,0,103,103.389Z" transform="translate(-51.054 -53.638)" fill="#ffff50" fill-rule="evenodd"/>
<path id="Path_49" data-name="Path 49" d="M141.1,94.017H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0-25.877H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.293H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m7.782-47.993c-.006,0-.011,0-.018,0-1.605.055-2.365,1.66-3.035,3.077-.7,1.48-1.24,2.443-2.126,2.414-.981-.035-1.542-1.144-2.137-2.317-.683-1.347-1.462-2.876-3.1-2.819-1.582.054-2.344,1.451-3.017,2.684-.715,1.313-1.2,2.112-2.141,2.075-1-.036-1.533-.938-2.149-1.981-.686-1.162-1.479-2.467-3.084-2.423-1.555.053-2.319,1.239-2.994,2.286-.713,1.106-1.213,1.781-2.164,1.741-1.025-.036-1.554-.784-2.167-1.65-.688-.973-1.463-2.074-3.062-2.021a3.815,3.815,0,0,0-2.959,1.879c-.64.812-1.14,1.456-2.2,1.415a.52.52,0,0,0-.037,1.039,3.588,3.588,0,0,0,3.05-1.811c.611-.777,1.139-1.448,2.178-1.483,1-.043,1.47.579,2.179,1.582.674.953,1.438,2.033,2.977,2.089,1.612.054,2.387-1.151,3.074-2.217.614-.953,1.144-1.775,2.156-1.81.931-.035,1.438.7,2.153,1.912.674,1.141,1.437,2.434,3.006,2.491,1.623.056,2.407-1.361,3.09-2.616.592-1.085,1.15-2.109,2.14-2.143.931-.022,1.417.829,2.135,2.249.671,1.326,1.432,2.828,3.026,2.886l.088,0c1.592,0,2.347-1.6,3.015-3.01.592-1.252,1.152-2.431,2.113-2.479Z" transform="translate(-55.378 -38.552)" fill-rule="evenodd"/>
<path id="Path_50" data-name="Path 50" d="M83,163.779h20.779V143H83Z" transform="translate(-41.443 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 51.971, 43.3)">
<rect id="Rectangle_3" data-name="Rectangle 3" width="43.906" height="17.333" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
<g id="Group_2" data-name="Group 2" transform="translate(0.728 10.948)">
<rect id="Rectangle_4" data-name="Rectangle 4" width="2.537" height="2.537" rx="1" transform="translate(7.985 0)" fill="#4a4a4a"/>
<rect id="Rectangle_5" data-name="Rectangle 5" width="2.537" height="2.537" rx="1" transform="translate(10.991 0)" fill="#4a4a4a"/>
<rect id="Rectangle_6" data-name="Rectangle 6" width="2.537" height="2.537" rx="1" transform="translate(13.997 0)" fill="#4a4a4a"/>
<rect id="Rectangle_7" data-name="Rectangle 7" width="2.537" height="2.537" rx="1" transform="translate(17.003 0)" fill="#4a4a4a"/>
<rect id="Rectangle_8" data-name="Rectangle 8" width="2.537" height="2.537" rx="1" transform="translate(20.009 0)" fill="#4a4a4a"/>
<rect id="Rectangle_9" data-name="Rectangle 9" width="2.537" height="2.537" rx="1" transform="translate(23.015 0)" fill="#4a4a4a"/>
<rect id="Rectangle_10" data-name="Rectangle 10" width="2.537" height="2.537" rx="1" transform="translate(26.021 0)" fill="#4a4a4a"/>
<rect id="Rectangle_11" data-name="Rectangle 11" width="2.537" height="2.537" rx="1" transform="translate(29.028 0)" fill="#4a4a4a"/>
<rect id="Rectangle_12" data-name="Rectangle 12" width="2.537" height="2.537" rx="1" transform="translate(32.034 0)" fill="#4a4a4a"/>
<path id="Path_51" data-name="Path 51" d="M.519,0H6.9A.519.519,0,0,1,7.421.52v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0ZM35.653,0h6.383a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H35.652a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,35.652,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_3" data-name="Group 3" transform="translate(0.728 4.878)">
<path id="Path_52" data-name="Path 52" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_13" data-name="Rectangle 13" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_14" data-name="Rectangle 14" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_15" data-name="Rectangle 15" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_16" data-name="Rectangle 16" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_17" data-name="Rectangle 17" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_18" data-name="Rectangle 18" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_19" data-name="Rectangle 19" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_20" data-name="Rectangle 20" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_21" data-name="Rectangle 21" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_22" data-name="Rectangle 22" width="2.537" height="2.537" rx="1" transform="translate(31 0)" fill="#4a4a4a"/>
<rect id="Rectangle_23" data-name="Rectangle 23" width="2.537" height="2.537" rx="1" transform="translate(34.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_24" data-name="Rectangle 24" width="2.537" height="2.537" rx="1" transform="translate(37.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_25" data-name="Rectangle 25" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
</g>
<g id="Group_4" data-name="Group 4" transform="translate(43.283 4.538) rotate(180)">
<path id="Path_53" data-name="Path 53" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_26" data-name="Rectangle 26" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_27" data-name="Rectangle 27" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_28" data-name="Rectangle 28" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_29" data-name="Rectangle 29" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_30" data-name="Rectangle 30" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_31" data-name="Rectangle 31" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_32" data-name="Rectangle 32" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_33" data-name="Rectangle 33" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_34" data-name="Rectangle 34" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_35" data-name="Rectangle 35" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
<rect id="Rectangle_36" data-name="Rectangle 36" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
<rect id="Rectangle_37" data-name="Rectangle 37" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
<rect id="Rectangle_38" data-name="Rectangle 38" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
<rect id="Rectangle_39" data-name="Rectangle 39" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
<rect id="Rectangle_40" data-name="Rectangle 40" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
<rect id="Rectangle_41" data-name="Rectangle 41" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
<rect id="Rectangle_42" data-name="Rectangle 42" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
<rect id="Rectangle_43" data-name="Rectangle 43" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
<rect id="Rectangle_44" data-name="Rectangle 44" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
<rect id="Rectangle_45" data-name="Rectangle 45" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
<rect id="Rectangle_46" data-name="Rectangle 46" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
<rect id="Rectangle_47" data-name="Rectangle 47" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
<rect id="Rectangle_48" data-name="Rectangle 48" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
<rect id="Rectangle_49" data-name="Rectangle 49" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
<rect id="Rectangle_50" data-name="Rectangle 50" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
<rect id="Rectangle_51" data-name="Rectangle 51" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
</g>
<g id="Group_6" data-name="Group 6" transform="translate(0.728 7.883)">
<path id="Path_54" data-name="Path 54" d="M.519,0h3.47a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<g id="Group_5" data-name="Group 5" transform="translate(5.073 0)">
<rect id="Rectangle_52" data-name="Rectangle 52" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_53" data-name="Rectangle 53" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_54" data-name="Rectangle 54" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_55" data-name="Rectangle 55" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
<rect id="Rectangle_56" data-name="Rectangle 56" width="2.537" height="2.537" rx="1" transform="translate(12.025 0)" fill="#4a4a4a"/>
<rect id="Rectangle_57" data-name="Rectangle 57" width="2.537" height="2.537" rx="1" transform="translate(15.031 0)" fill="#4a4a4a"/>
<rect id="Rectangle_58" data-name="Rectangle 58" width="2.537" height="2.537" rx="1" transform="translate(18.037 0)" fill="#4a4a4a"/>
<rect id="Rectangle_59" data-name="Rectangle 59" width="2.537" height="2.537" rx="1" transform="translate(21.042 0)" fill="#4a4a4a"/>
<rect id="Rectangle_60" data-name="Rectangle 60" width="2.537" height="2.537" rx="1" transform="translate(24.049 0)" fill="#4a4a4a"/>
<rect id="Rectangle_61" data-name="Rectangle 61" width="2.537" height="2.537" rx="1" transform="translate(27.055 0)" fill="#4a4a4a"/>
<rect id="Rectangle_62" data-name="Rectangle 62" width="2.537" height="2.537" rx="1" transform="translate(30.061 0)" fill="#4a4a4a"/>
</g>
<path id="Path_55" data-name="Path 55" d="M.52,0H3.8a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(38.234 0)" fill="#4a4a4a" fill-rule="evenodd"/>
</g>
<g id="Group_7" data-name="Group 7" transform="translate(0.728 14.084)">
<rect id="Rectangle_63" data-name="Rectangle 63" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
<rect id="Rectangle_64" data-name="Rectangle 64" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
<rect id="Rectangle_65" data-name="Rectangle 65" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
<rect id="Rectangle_66" data-name="Rectangle 66" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
<path id="Path_56" data-name="Path 56" d="M.519,0H14.981A.519.519,0,0,1,15.5.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.018V.519A.519.519,0,0,1,.519,0Zm15.97,0h1.874a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H16.489a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,16.489,0Z" transform="translate(12.024 0)" fill="#4a4a4a" fill-rule="evenodd"/>
<rect id="Rectangle_67" data-name="Rectangle 67" width="2.537" height="2.537" rx="1" transform="translate(31.376 0)" fill="#4a4a4a"/>
<rect id="Rectangle_68" data-name="Rectangle 68" width="2.537" height="2.537" rx="1" transform="translate(34.382 0)" fill="#4a4a4a"/>
<rect id="Rectangle_69" data-name="Rectangle 69" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
<path id="Path_57" data-name="Path 57" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(39.736 1.08) rotate(180)" fill="#4a4a4a"/>
<path id="Path_58" data-name="Path 58" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(37.2 1.456)" fill="#4a4a4a"/>
</g>
<rect id="Rectangle_70" data-name="Rectangle 70" width="42.273" height="1.127" rx="0.564" transform="translate(0.915 0.556)" fill="#4a4a4a"/>
<rect id="Rectangle_71" data-name="Rectangle 71" width="2.37" height="0.752" rx="0.376" transform="translate(1.949 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_72" data-name="Rectangle 72" width="2.37" height="0.752" rx="0.376" transform="translate(5.193 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_73" data-name="Rectangle 73" width="2.37" height="0.752" rx="0.376" transform="translate(7.688 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_74" data-name="Rectangle 74" width="2.37" height="0.752" rx="0.376" transform="translate(10.183 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_75" data-name="Rectangle 75" width="2.37" height="0.752" rx="0.376" transform="translate(12.679 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_76" data-name="Rectangle 76" width="2.37" height="0.752" rx="0.376" transform="translate(15.797 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_77" data-name="Rectangle 77" width="2.37" height="0.752" rx="0.376" transform="translate(18.292 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_78" data-name="Rectangle 78" width="2.37" height="0.752" rx="0.376" transform="translate(20.788 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_79" data-name="Rectangle 79" width="2.37" height="0.752" rx="0.376" transform="translate(23.283 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_80" data-name="Rectangle 80" width="2.37" height="0.752" rx="0.376" transform="translate(26.402 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_81" data-name="Rectangle 81" width="2.37" height="0.752" rx="0.376" transform="translate(28.897 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_82" data-name="Rectangle 82" width="2.37" height="0.752" rx="0.376" transform="translate(31.393 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_83" data-name="Rectangle 83" width="2.37" height="0.752" rx="0.376" transform="translate(34.512 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_84" data-name="Rectangle 84" width="2.37" height="0.752" rx="0.376" transform="translate(37.007 0.744)" fill="#d8d8d8" opacity="0.136"/>
<rect id="Rectangle_85" data-name="Rectangle 85" width="2.37" height="0.752" rx="0.376" transform="translate(39.502 0.744)" fill="#d8d8d8" opacity="0.136"/>
</g>
<path id="Path_59" data-name="Path 59" d="M123.779,148.389a2.583,2.583,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-51.054 -75.262)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_60" data-name="Path 60" d="M83,113.389h20.779V103H83Z" transform="translate(-41.443 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
<path id="Path_61" data-name="Path 61" d="M123.389,108.944a1.3,1.3,0,1,0,0-2.6,1.338,1.338,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.335,1.335,0,0,0,.166.017" transform="translate(-55.859 -57.894)" fill="#44d860" fill-rule="evenodd"/>
<path id="Path_62" data-name="Path 62" d="M141.8,38.745a1.41,1.41,0,0,1-.255-.026,1.309,1.309,0,0,1-.244-.073,1.349,1.349,0,0,1-.224-.119,1.967,1.967,0,0,1-.2-.161,1.52,1.52,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.41,1.41,0,0,1,.026-.255,1.5,1.5,0,0,1,.072-.244,1.364,1.364,0,0,1,.12-.223,1.252,1.252,0,0,1,.358-.358,1.349,1.349,0,0,1,.224-.119,1.309,1.309,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.968,1.968,0,0,1,.2.161,1.908,1.908,0,0,1,.161.2,1.322,1.322,0,0,1,.12.223,1.361,1.361,0,0,1,.1.5,1.317,1.317,0,0,1-.379.919,1.968,1.968,0,0,1-.2.161,1.346,1.346,0,0,1-.223.119,1.332,1.332,0,0,1-.5.1m10.389-.649a1.326,1.326,0,0,1-.92-.379,1.979,1.979,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.326,1.326,0,0,1,.379-.919,1.967,1.967,0,0,1,.2-.161,1.351,1.351,0,0,1,.224-.119,1.308,1.308,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.967,1.967,0,0,1,.2.161,1.326,1.326,0,0,1,.379.919,1.461,1.461,0,0,1-.026.255,1.323,1.323,0,0,1-.073.244,1.847,1.847,0,0,1-.119.223,1.911,1.911,0,0,1-.161.2,1.967,1.967,0,0,1-.2.161,1.294,1.294,0,0,1-.722.218" transform="translate(-69.074 -26.006)" fill-rule="evenodd"/>
</g>
<g id="React-icon" transform="translate(906.3 541.56)">
<path id="Path_330" data-name="Path 330" d="M263.668,117.179c0-5.827-7.3-11.35-18.487-14.775,2.582-11.4,1.434-20.477-3.622-23.382a7.861,7.861,0,0,0-4.016-1v4a4.152,4.152,0,0,1,2.044.466c2.439,1.4,3.5,6.724,2.672,13.574-.2,1.685-.52,3.461-.914,5.272a86.9,86.9,0,0,0-11.386-1.954,87.469,87.469,0,0,0-7.459-8.965c5.845-5.433,11.332-8.41,15.062-8.41V78h0c-4.931,0-11.386,3.514-17.913,9.611-6.527-6.061-12.982-9.539-17.913-9.539v4c3.712,0,9.216,2.959,15.062,8.356a84.687,84.687,0,0,0-7.405,8.947,83.732,83.732,0,0,0-11.4,1.972c-.412-1.793-.717-3.532-.932-5.2-.843-6.85.2-12.175,2.618-13.592a3.991,3.991,0,0,1,2.062-.466v-4h0a8,8,0,0,0-4.052,1c-5.039,2.9-6.168,11.96-3.568,23.328-11.153,3.443-18.415,8.947-18.415,14.757,0,5.828,7.3,11.35,18.487,14.775-2.582,11.4-1.434,20.477,3.622,23.382a7.882,7.882,0,0,0,4.034,1c4.931,0,11.386-3.514,17.913-9.611,6.527,6.061,12.982,9.539,17.913,9.539a8,8,0,0,0,4.052-1c5.039-2.9,6.168-11.96,3.568-23.328C256.406,128.511,263.668,122.988,263.668,117.179Zm-23.346-11.96c-.663,2.313-1.488,4.7-2.421,7.083-.735-1.434-1.506-2.869-2.349-4.3-.825-1.434-1.7-2.833-2.582-4.2C235.517,104.179,237.974,104.645,240.323,105.219Zm-8.212,19.1c-1.4,2.421-2.833,4.716-4.321,6.85-2.672.233-5.379.359-8.1.359-2.708,0-5.415-.126-8.069-.341q-2.232-3.2-4.339-6.814-2.044-3.523-3.73-7.136c1.112-2.4,2.367-4.805,3.712-7.154,1.4-2.421,2.833-4.716,4.321-6.85,2.672-.233,5.379-.359,8.1-.359,2.708,0,5.415.126,8.069.341q2.232,3.2,4.339,6.814,2.044,3.523,3.73,7.136C234.692,119.564,233.455,121.966,232.11,124.315Zm5.792-2.331c.968,2.4,1.793,4.805,2.474,7.136-2.349.574-4.823,1.058-7.387,1.434.879-1.381,1.757-2.8,2.582-4.25C236.4,124.871,237.167,123.419,237.9,121.984ZM219.72,141.116a73.921,73.921,0,0,1-4.985-5.738c1.614.072,3.263.126,4.931.126,1.685,0,3.353-.036,4.985-.126A69.993,69.993,0,0,1,219.72,141.116ZM206.38,130.555c-2.546-.377-5-.843-7.352-1.417.663-2.313,1.488-4.7,2.421-7.083.735,1.434,1.506,2.869,2.349,4.3S205.5,129.192,206.38,130.555ZM219.63,93.241a73.924,73.924,0,0,1,4.985,5.738c-1.614-.072-3.263-.126-4.931-.126-1.686,0-3.353.036-4.985.126A69.993,69.993,0,0,1,219.63,93.241ZM206.362,103.8c-.879,1.381-1.757,2.8-2.582,4.25-.825,1.434-1.6,2.869-2.331,4.3-.968-2.4-1.793-4.805-2.474-7.136C201.323,104.663,203.8,104.179,206.362,103.8Zm-16.227,22.449c-6.348-2.708-10.454-6.258-10.454-9.073s4.106-6.383,10.454-9.073c1.542-.663,3.228-1.255,4.967-1.811a86.122,86.122,0,0,0,4.034,10.92,84.9,84.9,0,0,0-3.981,10.866C193.38,127.525,191.694,126.915,190.134,126.252Zm9.647,25.623c-2.439-1.4-3.5-6.724-2.672-13.574.2-1.686.52-3.461.914-5.272a86.9,86.9,0,0,0,11.386,1.954,87.465,87.465,0,0,0,7.459,8.965c-5.845,5.433-11.332,8.41-15.062,8.41A4.279,4.279,0,0,1,199.781,151.875Zm42.532-13.663c.843,6.85-.2,12.175-2.618,13.592a3.99,3.99,0,0,1-2.062.466c-3.712,0-9.216-2.959-15.062-8.356a84.689,84.689,0,0,0,7.405-8.947,83.731,83.731,0,0,0,11.4-1.972A50.194,50.194,0,0,1,242.313,138.212Zm6.9-11.96c-1.542.663-3.228,1.255-4.967,1.811a86.12,86.12,0,0,0-4.034-10.92,84.9,84.9,0,0,0,3.981-10.866c1.775.556,3.461,1.165,5.039,1.829,6.348,2.708,10.454,6.258,10.454,9.073C259.67,119.994,255.564,123.562,249.216,126.252Z" fill="#61dafb"/>
<path id="Path_331" data-name="Path 331" d="M320.8,78.4Z" transform="translate(-119.082 -0.328)" fill="#61dafb"/>
<circle id="Ellipse_112" data-name="Ellipse 112" cx="8.194" cy="8.194" r="8.194" transform="translate(211.472 108.984)" fill="#61dafb"/>
<path id="Path_332" data-name="Path 332" d="M520.5,78.1Z" transform="translate(-282.975 -0.082)" fill="#61dafb"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 35 KiB

View File

@ -1,40 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1129" height="663" viewBox="0 0 1129 663">
<title>Focus on What Matters</title>
<circle cx="321" cy="321" r="321" fill="#f2f2f2" />
<ellipse cx="559" cy="635.49998" rx="514" ry="27.50002" fill="#3f3d56" />
<ellipse cx="558" cy="627" rx="460" ry="22" opacity="0.2" />
<rect x="131" y="152.5" width="840" height="50" fill="#3f3d56" />
<path d="M166.5,727.3299A21.67009,21.67009,0,0,0,188.1701,749H984.8299A21.67009,21.67009,0,0,0,1006.5,727.3299V296h-840Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" opacity="0.2" />
<circle cx="181" cy="147.5" r="13" fill="#3f3d56" />
<circle cx="217" cy="147.5" r="13" fill="#3f3d56" />
<circle cx="253" cy="147.5" r="13" fill="#3f3d56" />
<rect x="168" y="213.5" width="337" height="386" rx="5.33505" fill="#606060" />
<rect x="603" y="272.5" width="284" height="22" rx="5.47638" fill="#2e8555" />
<rect x="537" y="352.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="396.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="440.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="537" y="484.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
<rect x="865" y="552.5" width="88" height="26" rx="7.02756" fill="#3ecc5f" />
<path d="M1088.60287,624.61594a30.11371,30.11371,0,0,0,3.98291-15.266c0-13.79652-8.54358-24.98081-19.08256-24.98081s-19.08256,11.18429-19.08256,24.98081a30.11411,30.11411,0,0,0,3.98291,15.266,31.248,31.248,0,0,0,0,30.53213,31.248,31.248,0,0,0,0,30.53208,31.248,31.248,0,0,0,0,30.53208,30.11408,30.11408,0,0,0-3.98291,15.266c0,13.79652,8.54353,24.98081,19.08256,24.98081s19.08256-11.18429,19.08256-24.98081a30.11368,30.11368,0,0,0-3.98291-15.266,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53213Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
<ellipse cx="1038.00321" cy="460.31783" rx="19.08256" ry="24.9808" fill="#3f3d56" />
<ellipse cx="1038.00321" cy="429.78574" rx="19.08256" ry="24.9808" fill="#3f3d56" />
<path d="M1144.93871,339.34489a91.61081,91.61081,0,0,0,7.10658-10.46092l-50.141-8.23491,54.22885.4033a91.566,91.566,0,0,0,1.74556-72.42605l-72.75449,37.74139,67.09658-49.32086a91.41255,91.41255,0,1,0-150.971,102.29805,91.45842,91.45842,0,0,0-10.42451,16.66946l65.0866,33.81447-69.40046-23.292a91.46011,91.46011,0,0,0,14.73837,85.83669,91.40575,91.40575,0,1,0,143.68892,0,91.41808,91.41808,0,0,0,0-113.02862Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M981.6885,395.8592a91.01343,91.01343,0,0,0,19.56129,56.51431,91.40575,91.40575,0,1,0,143.68892,0C1157.18982,436.82067,981.6885,385.60008,981.6885,395.8592Z" transform="translate(-35.5 -118.5)" opacity="0.1" />
<path d="M365.62,461.43628H477.094v45.12043H365.62Z" transform="translate(-35.5 -118.5)" fill="#fff" fill-rule="evenodd" />
<path d="M264.76252,608.74122a26.50931,26.50931,0,0,1-22.96231-13.27072,26.50976,26.50976,0,0,0,22.96231,39.81215H291.304V608.74122Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M384.17242,468.57061l92.92155-5.80726V449.49263a26.54091,26.54091,0,0,0-26.54143-26.54143H331.1161l-3.31768-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622-3.31767-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622L301.257,417.205a3.83043,3.83043,0,0,0-6.63536,0L291.304,422.9512c-.02919,0-.05573.004-.08625.004l-5.49674-5.49541a3.8293,3.8293,0,0,0-6.4071,1.71723l-1.81676,6.77338L270.607,424.1031a3.82993,3.82993,0,0,0-4.6912,4.69253l1.84463,6.89148-6.77072,1.81411a3.8315,3.8315,0,0,0-1.71988,6.40975l5.49673,5.49673c0,.02787-.004.05574-.004.08493l-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74621,3.31768L259.0163,466.081a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768L259.0163,558.976a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768A26.54091,26.54091,0,0,0,291.304,635.28265H450.55254A26.5409,26.5409,0,0,0,477.094,608.74122V502.5755l-92.92155-5.80727a14.12639,14.12639,0,0,1,0-28.19762" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M424.01111,635.28265h39.81214V582.19979H424.01111Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M490.36468,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15393-.59852A6.62668,6.62668,0,1,0,482.80568,590.21q-.2203-.22491-.44457-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39414-.10218-.59056-.15262a6.63957,6.63957,0,1,0-13.10086,0c-.1964.05042-.39414.09687-.59056.15262a6.62767,6.62767,0,1,0-11.39688,6.56369,26.52754,26.52754,0,1,0,44.23127,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M437.28182,555.65836H477.094V529.11693H437.28182Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M490.36468,545.70532a3.31768,3.31768,0,0,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M317.84538,466.081a3.31768,3.31768,0,0,1-3.31767-3.31768,9.953,9.953,0,1,0-19.90608,0,3.31768,3.31768,0,1,1-6.63535,0,16.58839,16.58839,0,1,1,33.17678,0,3.31768,3.31768,0,0,1-3.31768,3.31768" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
<path d="M370.92825,635.28265h79.62429A26.5409,26.5409,0,0,0,477.094,608.74122v-92.895H397.46968a26.54091,26.54091,0,0,0-26.54143,26.54143Z" transform="translate(-35.5 -118.5)" fill="#ffff50" fill-rule="evenodd" />
<path d="M457.21444,556.98543H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0-66.10674H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.29459H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414M477.094,474.19076c-.01592,0-.0292-.008-.04512-.00663-4.10064.13934-6.04083,4.24132-7.75274,7.86024-1.78623,3.78215-3.16771,6.24122-5.43171,6.16691-2.50685-.09024-3.94007-2.92222-5.45825-5.91874-1.74377-3.44243-3.73438-7.34667-7.91333-7.20069-4.04227.138-5.98907,3.70784-7.70631,6.857-1.82738,3.35484-3.07084,5.39455-5.46887,5.30033-2.55727-.09289-3.91619-2.39536-5.48877-5.06013-1.75306-2.96733-3.77951-6.30359-7.8775-6.18946-3.97326.13669-5.92537,3.16507-7.64791,5.83912-1.82207,2.82666-3.09872,4.5492-5.52725,4.447-2.61832-.09289-3.9706-2.00388-5.53522-4.21611-1.757-2.4856-3.737-5.299-7.82308-5.16231-3.88567.13271-5.83779,2.61434-7.559,4.80135-1.635,2.07555-2.9116,3.71846-5.61218,3.615a1.32793,1.32793,0,1,0-.09555,2.65414c4.00377.134,6.03154-2.38873,7.79257-4.6275,1.562-1.9853,2.91027-3.69855,5.56441-3.78879,2.55594-.10882,3.75429,1.47968,5.56707,4.04093,1.7212,2.43385,3.67465,5.19416,7.60545,5.33616,4.11789.138,6.09921-2.93946,7.8536-5.66261,1.56861-2.43385,2.92221-4.53461,5.50734-4.62352,2.37944-.08892,3.67466,1.79154,5.50072,4.885,1.72121,2.91557,3.67069,6.21865,7.67977,6.36463,4.14709.14332,6.14965-3.47693,7.89475-6.68181,1.51155-2.77092,2.93814-5.38791,5.46621-5.4755,2.37944-.05573,3.62025,2.11668,5.45558,5.74622,1.71459,3.388,3.65875,7.22591,7.73019,7.37321l.22429.004c4.06614,0,5.99571-4.08074,7.70364-7.68905,1.51154-3.19825,2.94211-6.21069,5.3972-6.33411Z" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
<path d="M344.38682,635.28265h53.08286V582.19979H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M424.01111,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15394-.59852A6.62667,6.62667,0,1,0,416.45211,590.21q-.2203-.22491-.44458-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39413-.10218-.59054-.15262a6.63957,6.63957,0,1,0-13.10084,0c-.19641.05042-.39414.09687-.59055.15262a6.62767,6.62767,0,1,0-11.39689,6.56369,26.52755,26.52755,0,1,0,44.2313,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M344.38682,555.65836h53.08286V529.11693H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
<path d="M410.74039,545.70532a3.31768,3.31768,0,1,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
<path d="M424.01111,447.8338a3.60349,3.60349,0,0,1-.65028-.06636,3.34415,3.34415,0,0,1-.62372-.18579,3.44679,3.44679,0,0,1-.572-.30522,5.02708,5.02708,0,0,1-.50429-.4114,3.88726,3.88726,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.60248,3.60248,0,0,1,.06636-.65027,3.82638,3.82638,0,0,1,.18447-.62373,3.48858,3.48858,0,0,1,.30656-.57064,3.197,3.197,0,0,1,.91436-.91568,3.44685,3.44685,0,0,1,.572-.30523,3.344,3.344,0,0,1,.62372-.18578,3.06907,3.06907,0,0,1,1.30053,0,3.22332,3.22332,0,0,1,1.19436.491,5.02835,5.02835,0,0,1,.50429.41139,4.8801,4.8801,0,0,1,.41139.50429,3.38246,3.38246,0,0,1,.30522.57064,3.47806,3.47806,0,0,1,.25215,1.274A3.36394,3.36394,0,0,1,426.36,446.865a5.02708,5.02708,0,0,1-.50429.4114,3.3057,3.3057,0,0,1-1.84463.55737m26.54143-1.65884a3.38754,3.38754,0,0,1-2.35024-.96877,5.04185,5.04185,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.38659,3.38659,0,0,1,.96744-2.34892,5.02559,5.02559,0,0,1,.50429-.41139,3.44685,3.44685,0,0,1,.572-.30523,3.3432,3.3432,0,0,1,.62373-.18579,3.06952,3.06952,0,0,1,1.30052,0,3.22356,3.22356,0,0,1,1.19436.491,5.02559,5.02559,0,0,1,.50429.41139,3.38792,3.38792,0,0,1,.96876,2.34892,3.72635,3.72635,0,0,1-.06636.65026,3.37387,3.37387,0,0,1-.18579.62373,4.71469,4.71469,0,0,1-.30522.57064,4.8801,4.8801,0,0,1-.41139.50429,5.02559,5.02559,0,0,1-.50429.41139,3.30547,3.30547,0,0,1-1.84463.55737" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

15
static/manifest.json Normal file
View File

@ -0,0 +1,15 @@
{
"short_name": "TP-Docs",
"name": "Tecnopack documentation",
"icons": [
{
"src": "/dc/img/favicon192x192.png",
"sizes": "192x192",
"type": "image/png"
}
],
"start_url": "/dc/",
"display": "standalone",
"theme_color": "rgb(37, 194, 160)",
"background_color": "#ffffff"
}

BIN
static/vid/videointro.mp4 Normal file

Binary file not shown.

8
tsconfig.json Normal file
View File

@ -0,0 +1,8 @@
{
// This file is not used in compilation. It is here just for a nice editor experience.
"extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": "."
},
"exclude": [".docusaurus", "build"]
}