tecnopack docs
|
|
@ -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.
|
||||||
85
README.md
|
|
@ -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.
|
||||||
|
|
||||||
```bash
|
---
|
||||||
yarn
|
|
||||||
```
|
|
||||||
|
|
||||||
## Local Development
|
## 👩💻 Guida per gli Sviluppatori
|
||||||
|
|
||||||
```bash
|
Se sei uno sviluppatore, questa sezione ti spiega come collaborare in modo ordinato e sicuro usando Git e GitLab.
|
||||||
yarn start
|
|
||||||
```
|
|
||||||
|
|
||||||
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
|
### Requisiti
|
||||||
|
|
||||||
## Build
|
- Git installato sul tuo computer
|
||||||
|
- Accesso al repository (chiedi al maintainer)
|
||||||
|
- Account GitLab attivo
|
||||||
|
|
||||||
```bash
|
### Passaggi rapidi
|
||||||
yarn build
|
|
||||||
```
|
|
||||||
|
|
||||||
This command generates static content into the `build` directory and can be served using any static contents hosting service.
|
1. **Clona il repository**
|
||||||
|
|
||||||
## Deployment
|
```bash
|
||||||
|
git clone https://gitlab.tecnopackspa.it/tp-docs/tp-docs.git
|
||||||
|
cd tp-docs
|
||||||
|
```
|
||||||
|
|
||||||
Using SSH:
|
2. **Crea un branch per il tuo lavoro**
|
||||||
|
|
||||||
```bash
|
Non lavorare mai direttamente su `master`.
|
||||||
USE_SSH=true yarn deploy
|
|
||||||
```
|
|
||||||
|
|
||||||
Not using SSH:
|
```bash
|
||||||
|
git checkout -b feature/nome-funzionalità
|
||||||
|
```
|
||||||
|
|
||||||
```bash
|
3. **Modifica, committa e push**
|
||||||
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.
|
Lavora sul codice, aggiungi le modifiche e crea commit chiari.
|
||||||
|
|
||||||
|
4. **Crea una Merge Request (MR)**
|
||||||
|
|
||||||
|
Spingi il branch su GitLab e apri una MR per la revisione.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📚 Documentazione Completa
|
||||||
|
|
||||||
|
Per approfondire, consulta le guide dettagliate:
|
||||||
|
|
||||||
|
- [Guida per gli sviluppatori](project_documentation/DEV_GUIDE.md)
|
||||||
|
- [Guida per i maintainer](project_documentation/MAINTAINER_GUIDE.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 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! 🚀*
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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>
|
|
||||||
|
Before Width: | Height: | Size: 94 KiB |
|
|
@ -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:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
@ -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 all’indietro 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](../)
|
||||||
|
|
@ -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 1–4
|
||||||
|
- `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](../)
|
||||||
|
|
@ -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 87–89`: 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 49–53`).
|
||||||
|
- 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](../)
|
||||||
|
|
@ -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
|
||||||
|
- `R61–68`: 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](../)
|
||||||
|
|
@ -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](../)
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
hide_table_of_contents: true
|
||||||
|
pagination_next: null
|
||||||
|
pagination_prev: null
|
||||||
|
---
|
||||||
|
|
@ -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. |
|
||||||
|
|
@ -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. |
|
||||||
|
|
@ -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. |
|
||||||
|
|
@ -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. |
|
||||||
|
|
@ -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. |
|
||||||
|
|
@ -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`.
|
||||||
|
|
@ -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 all’altra 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 d’uso 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** dell’interfaccia (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 l’ambiente 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 l’usabilità e rende l’interfaccia più intuitiva per l’operatore.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ 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, l’utente 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, l’interfaccia ti aspetta!*
|
||||||
|
|
@ -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 l’uso 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 dell’header e sulla logica di accesso. |
|
||||||
|
| `Father` | Indica la **pagina padre**, ovvero quella a cui tornare premendo "indietro" nell’header del pannello. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🧭 PageType — Elenco dei tipi disponibili
|
||||||
|
|
||||||
|
Qui sotto trovi l’elenco dei valori disponibili per `PageType`:
|
||||||
|
|
||||||
|
| **Valore** | **Display Name** |
|
||||||
|
|------------|--------------------------|
|
||||||
|
| 0 | Home |
|
||||||
|
| 1 | Menù |
|
||||||
|
| 2 | Allarmi |
|
||||||
|
| 3 | Modalità operativa |
|
||||||
|
| 4 | Ricette |
|
||||||
|
| 5 | Abilitazioni |
|
||||||
|
| 6–7 | --Reserved-- |
|
||||||
|
| 8 | Masse saldanti |
|
||||||
|
| 9 | --Reserved-- |
|
||||||
|
| 10 | Mini setup |
|
||||||
|
| 11 | Full setup |
|
||||||
|
| 12 | Diagnostica |
|
||||||
|
| 13–19 | --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 all’interno dell’ambiente Optix, con parametri ben configurati per garantire compatibilità, navigazione e coerenza visiva.
|
||||||
|
|
||||||
|
Grandi cose ti aspettano, giovane Padawan! 🧙♂️✨
|
||||||
|
|
@ -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 nell’interfaccia 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 l’aspetto della scheda nell’interfaccia 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
|
||||||
|
```
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
@ -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 dell’elemento 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.
|
||||||
|
|
||||||
|
|
@ -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)
|
||||||
|
\>
|
||||||
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
@ -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()
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
@ -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 all’interno 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.
|
||||||
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
@ -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 l’aggiornamento 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 l’esecuzione 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 d’errore molto colorito e dettagliato (con frase in dialetto veneziano).
|
||||||
|
- Le variabili di output sono i primi N figli dell’oggetto NetLogic, dove N è il numero di colonne del risultato SQL.
|
||||||
|
- L’aggiornamento 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 sull’oggetto 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 l’oggetto 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 all’avvio 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 dell’oggetto 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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
@ -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 all’interno 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 un’occhiata alla documentazione di [tpPopulateIORack](./tpPopulateIORack.md).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
@ -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 l’ordine 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, l’inizializzazione 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
|
||||||
|
|
@ -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 l’integrazione 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 all’utente di selezionare quali dizionari caricare, quindi importa i dati all’interno del progetto HMI.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Funzionamento principale
|
||||||
|
|
||||||
|
| Metodo | Descrizione |
|
||||||
|
|---------------------------|------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| `ImportTranslationsAndAlarms()` | Esegue la scansione della cartella degli allarmi, filtra i file `.xlsx`, mostra una selezione all’utente 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 un’eccezione 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 all’utente 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.
|
||||||
|
- L’utente 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.
|
||||||
|
- L’eccezione 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 l’importazione 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 l’esistenza della cartella (eccezione in caso negativo).
|
||||||
|
> - Recupera i file Excel `.xlsx`.
|
||||||
|
> - Presenta all’utente un menu di selezione.
|
||||||
|
> - Importa i dizionari selezionati.
|
||||||
|
|
||||||
|
> **Eccezione:**
|
||||||
|
> Lancia un’eccezione se la cartella degli allarmi non esiste, con messaggio in dialetto veneto.
|
||||||
|
|
||||||
|
> **Esempio d’uso:**
|
||||||
|
> ```csharp
|
||||||
|
> alarmManager.ImportTranslationsAndAlarms();
|
||||||
|
> ```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
@ -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 d’uso:**
|
||||||
|
> ```csharp
|
||||||
|
> diagnosticGenerator.GenerateALL();
|
||||||
|
> ```
|
||||||
|
|
||||||
|
> **Nota da interfaccia Optix:**
|
||||||
|
> È possibile eseguire questo metodo cliccando con il tasto destro sull’oggetto **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 l’ultima parte dopo l’ultimo 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 l’uniformità 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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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 dell’interfaccia grafica principale (GUI) adottata nei pannelli **Tecnopack**, sviluppata utilizzando **FactoryTalk Optix**.
|
||||||
|
|
||||||
|
L’interfaccia è 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 l’utente 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 dall’utente.
|
||||||
|
|
||||||
|
È il cuore operativo dell’HMI 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
|
||||||
|
|
||||||
|
L’interfaccia 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 dell’interfaccia
|
||||||
|
|
||||||
|
L’interfaccia è progettata per:
|
||||||
|
|
||||||
|
- Garantire **chiarezza visiva** e semplicità d’uso
|
||||||
|
- 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.*
|
||||||
|
|
@ -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 l’evoluzione del prototipo e l’integrazione di Optix Studio.*
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
---
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
hide_table_of_contents: true
|
||||||
|
pagination_next: null
|
||||||
|
pagination_prev: null
|
||||||
|
---
|
||||||
|
|
@ -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.
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
{
|
|
||||||
"label": "Tutorial - Basics",
|
|
||||||
"position": 2,
|
|
||||||
"link": {
|
|
||||||
"type": "generated-index",
|
|
||||||
"description": "5 minutes to learn the most important Docusaurus concepts."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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)
|
|
||||||
|
|
@ -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).
|
|
||||||
|
|
@ -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'],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
@ -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).
|
|
||||||
|
|
@ -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)**).
|
|
||||||
|
|
@ -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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
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
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
## 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> !
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
{
|
|
||||||
"label": "Tutorial - Extras",
|
|
||||||
"position": 3,
|
|
||||||
"link": {
|
|
||||||
"type": "generated-index"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
|
@ -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:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 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`
|
|
||||||
|
|
@ -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:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 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
|
|
||||||
```
|
|
||||||
12
package.json
|
|
@ -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": [
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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
|
||||||
/*
|
/*
|
||||||
|
|
@ -32,4 +30,4 @@ const sidebars = {
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
export default sidebars;
|
export default sidebars;
|
||||||
|
|
@ -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'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>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -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>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
* and scoped locally.
|
* and scoped locally.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
.heroBanner {
|
.heroBanner {
|
||||||
padding: 4rem 0;
|
padding: 4rem 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
|
||||||
|
|
@ -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 />
|
||||||
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 479 B |
|
After Width: | Height: | Size: 940 B |
|
Before Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 178 KiB |
|
After Width: | Height: | Size: 216 KiB |
|
After Width: | Height: | Size: 189 KiB |
|
After Width: | Height: | Size: 102 KiB |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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"
|
||||||
|
}
|
||||||
|
|
@ -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"]
|
||||||
|
}
|
||||||