vault backup: 2025-07-08 16:52:37

This commit is contained in:
Miguel 2025-07-08 16:52:37 +02:00
parent fea7ac8281
commit 9ad8c8167f
28 changed files with 294 additions and 1215 deletions

View File

@ -6,11 +6,11 @@
"emojiStyle": "native", "emojiStyle": "native",
"iconColor": null, "iconColor": null,
"recentlyUsedIcons": [ "recentlyUsedIcons": [
"LiExcalidrawIcon",
"LiClipboardList", "LiClipboardList",
"🪛", "🪛",
"LiScriptEngine", "LiScriptEngine",
"👉", "👉"
"LiCheckSquare2"
], ],
"recentlyUsedIconsSize": 5, "recentlyUsedIconsSize": 5,
"rules": [], "rules": [],
@ -38,5 +38,6 @@
"04-SIDEL/SIDEL - Upgrades - Promemoria.md": "👉", "04-SIDEL/SIDEL - Upgrades - Promemoria.md": "👉",
"04-SIDEL/CheckList": "LiCheckSquare2", "04-SIDEL/CheckList": "LiCheckSquare2",
"01-Documentation/AI - IA - LLM - Artificial Intelligence": "🪛", "01-Documentation/AI - IA - LLM - Artificial Intelligence": "🪛",
"04-SIDEL/Projects Description.md": "LiClipboardList" "04-SIDEL/Projects Description.md": "LiClipboardList",
"03-VM/44 - 98050 - Fiera/Especifica/excal - Layout - Anello-Ring.md": "LiExcalidrawIcon"
} }

View File

@ -1,6 +1,10 @@
{ {
"version": "2.0", "version": "2.0",
"layout": [ "layout": [
null,
null,
null,
null,
null null
], ],
"settings": { "settings": {

View File

@ -1,16 +1,72 @@
{ {
"recentFiles": [ "recentFiles": [
{ {
"basename": "Especifica General", "basename": "Conda - Anaconda - miniconda",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Especifica General.md" "path": "01-Documentation/Python/Scripts Python/Conda - Anaconda - miniconda.md"
}, },
{ {
"basename": "Layout - Anello-Ring", "basename": "Cursor Notes",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Layout - Anello-Ring.md" "path": "07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Cursor Notes.md"
},
{
"basename": "Visual Studio Notes",
"path": "07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Visual Studio Notes.md"
},
{
"basename": "cronologia",
"path": "03-VM/40 - 93040 - HENKEL - NEXT + 1 Problem/cronologia.md"
},
{
"basename": "MCP",
"path": "01-Documentation/AI - IA - LLM - Artificial Intelligence/MCP.md"
},
{
"basename": "Projects Description",
"path": "04-SIDEL/Projects Description.md"
},
{
"basename": "excal - Layout - Anello-Ring",
"path": "03-VM/44 - 98050 - Fiera/Especifica/excal - Layout - Anello-Ring.md"
},
{
"basename": "Descripción y Especifica - en",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Descripción y Especifica - en.md"
},
{
"basename": "IO - IP Nodes & PLC IO Tags",
"path": "03-VM/44 - 98050 - Fiera/Especifica/IO - IP Nodes & PLC IO Tags.md"
},
{
"basename": "98050_Hardware PEW - PAW",
"path": "03-VM/44 - 98050 - Fiera/IO/98050_Hardware PEW - PAW.md"
},
{
"basename": "PLC IO Tags",
"path": "03-VM/44 - 98050 - Fiera/IO/PLC IO Tags.md"
},
{
"basename": "Device IO Tags",
"path": "03-VM/44 - 98050 - Fiera/IO/Device IO Tags.md"
}, },
{ {
"basename": "Motor_Framework_Insight", "basename": "Motor_Framework_Insight",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Motor_Framework_Insight.md" "path": "03-VM/44 - 98050 - Fiera/Especifica/Enviar/Motor_Framework_Insight.md"
},
{
"basename": "Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.0 - Ita",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Enviar/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.0 - Ita.md"
},
{
"basename": "Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Enviar/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp.md"
},
{
"basename": "Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Ita",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Enviar/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Ita.md"
},
{
"basename": "AccumulationTable - It",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Enviar/AccumulationTable - It.md"
}, },
{ {
"basename": "MIGRATION OF AUTOMATION FROM SOFTPLC TWINCAT TO SIEMENS PHYSICAL PLC (Tia Portal)", "basename": "MIGRATION OF AUTOMATION FROM SOFTPLC TWINCAT TO SIEMENS PHYSICAL PLC (Tia Portal)",
@ -18,20 +74,16 @@
}, },
{ {
"basename": "Como usar PublicApiGenerator - Nuget - Documentator", "basename": "Como usar PublicApiGenerator - Nuget - Documentator",
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Como usar PublicApiGenerator - Nuget - Documentator.md" "path": "07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Proyectos Visual Studio/Como usar PublicApiGenerator - Nuget - Documentator.md"
}, },
{ {
"basename": "Notas para crear nuevas aplicaciones", "basename": "Notas para crear nuevas aplicaciones",
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Notas para crear nuevas aplicaciones.md" "path": "07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Proyectos Visual Studio/Notas para crear nuevas aplicaciones.md"
}, },
{ {
"basename": "Backups - Mikrotik", "basename": "Backups - Mikrotik",
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md" "path": "01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md"
}, },
{
"basename": "MCP",
"path": "01-Documentation/AI - IA - LLM - Artificial Intelligence/MCP.md"
},
{ {
"basename": "Zerotier VPN con VPS en Buenos Aires", "basename": "Zerotier VPN con VPS en Buenos Aires",
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Zerotier VPN con VPS en Buenos Aires.md" "path": "01-Documentation/Routers/Mikrotik - Network Redes/Zerotier VPN con VPS en Buenos Aires.md"
@ -52,58 +104,18 @@
"basename": "Shortcuts", "basename": "Shortcuts",
"path": "DB/Shortcuts/Shortcuts.md" "path": "DB/Shortcuts/Shortcuts.md"
}, },
{
"basename": "AccumulationTable - It",
"path": "03-VM/44 - 98050 - Fiera/Especifica/AccumulationTable - It.md"
},
{ {
"basename": "Aplicaciones y Librerias", "basename": "Aplicaciones y Librerias",
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Aplicaciones y Librerias.md" "path": "07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Proyectos Visual Studio/Aplicaciones y Librerias.md"
}, },
{ {
"basename": "FB_BottleFallen", "basename": "FB_BottleFallen",
"path": "01-Documentation/Vetromeccanica/FBs/FB_BottleFallen.md" "path": "01-Documentation/Vetromeccanica/FBs/FB_BottleFallen.md"
}, },
{
"basename": "Untitled",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Untitled.canvas"
},
{
"basename": "Conda - Anaconda - miniconda",
"path": "01-Documentation/Python/Scripts Python/Conda - Anaconda - miniconda.md"
},
{
"basename": "AccumulationTable - En",
"path": "03-VM/44 - 98050 - Fiera/Especifica/AccumulationTable - En.md"
},
{ {
"basename": "SIDEL - Master - IPs", "basename": "SIDEL - Master - IPs",
"path": "04-SIDEL/00 - MASTER/SIDEL - Master - IPs.md" "path": "04-SIDEL/00 - MASTER/SIDEL - Master - IPs.md"
}, },
{
"basename": "Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp.md"
},
{
"basename": "Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Ita",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Ita.md"
},
{
"basename": "Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.2 - en",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.2 - en.md"
},
{
"basename": "Drawing 2025-06-24 15.30.35.excalidraw",
"path": "03-VM/44 - 98050 - Fiera/Especifica/Drawing 2025-06-24 15.30.35.excalidraw.md"
},
{
"basename": "IO - Ips Nodes",
"path": "03-VM/44 - 98050 - Fiera/Especifica/IO - Ips Nodes.md"
},
{
"basename": "98050_Hardware PEW - PAW",
"path": "03-VM/44 - 98050 - Fiera/Especifica/98050_Hardware PEW - PAW.md"
},
{ {
"basename": "SIDEL - Passwords", "basename": "SIDEL - Passwords",
"path": "01-Documentation/SIDEL/SIDEL - Passwords.md" "path": "01-Documentation/SIDEL/SIDEL - Passwords.md"
@ -160,10 +172,6 @@
"basename": "Hardware", "basename": "Hardware",
"path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/IO/Hardware.md" "path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/IO/Hardware.md"
}, },
{
"basename": "Projects Description",
"path": "04-SIDEL/Projects Description.md"
},
{ {
"basename": "ISOonTCP_or_TCP_Protocol", "basename": "ISOonTCP_or_TCP_Protocol",
"path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/Source/source/ISOonTCP_or_TCP_Protocol.md" "path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/Source/source/ISOonTCP_or_TCP_Protocol.md"
@ -191,14 +199,6 @@
{ {
"basename": "AWL - STL Types", "basename": "AWL - STL Types",
"path": "01-Documentation/Python/Scripts Python/XML to SCL Siemens/AWL - STL Types.md" "path": "01-Documentation/Python/Scripts Python/XML to SCL Siemens/AWL - STL Types.md"
},
{
"basename": "DAR Description - DIET AS REGULAR - SAE452 San Giorgio in Bosco",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/DAR Description - DIET AS REGULAR - SAE452 San Giorgio in Bosco.md"
},
{
"basename": "Excel - VBA - AdjustOffset",
"path": "01-Documentation/Scripts Excel - VBA/Excel - VBA - AdjustOffset.md"
} }
], ],
"omittedPaths": [], "omittedPaths": [],

View File

@ -13,16 +13,77 @@
"state": { "state": {
"type": "markdown", "type": "markdown",
"state": { "state": {
"file": "03-VM/44 - 98050 - Fiera/Especifica/Especifica General.md", "file": "04-SIDEL/Projects Description.md",
"mode": "source", "mode": "source",
"source": false, "source": false,
"backlinks": false "backlinks": false
}, },
"icon": "lucide-file", "icon": "lucide-file",
"title": "Especifica General" "title": "Projects Description"
}
},
{
"id": "cf0f2818b939a588",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "01-Documentation/AI - IA - LLM - Artificial Intelligence/MCP.md",
"mode": "source",
"source": false,
"backlinks": false
},
"icon": "lucide-file",
"title": "MCP"
}
},
{
"id": "0f5e4fedf1d275d5",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "03-VM/40 - 93040 - HENKEL - NEXT + 1 Problem/cronologia.md",
"mode": "source",
"source": false,
"backlinks": false
},
"icon": "lucide-file",
"title": "cronologia"
}
},
{
"id": "5c315b1b5f0b8901",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Cursor Notes.md",
"mode": "source",
"source": false,
"backlinks": false
},
"icon": "lucide-file",
"title": "Cursor Notes"
}
},
{
"id": "f15536f72bf96ad9",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "01-Documentation/Python/Scripts Python/Conda - Anaconda - miniconda.md",
"mode": "source",
"source": false,
"backlinks": false
},
"icon": "lucide-file",
"title": "Conda - Anaconda - miniconda"
} }
} }
] ],
"currentTab": 4
} }
], ],
"direction": "vertical" "direction": "vertical"
@ -42,7 +103,7 @@
"type": "file-explorer", "type": "file-explorer",
"state": { "state": {
"sortOrder": "alphabetical", "sortOrder": "alphabetical",
"autoReveal": false "autoReveal": true
}, },
"icon": "lucide-folder-closed", "icon": "lucide-folder-closed",
"title": "Files" "title": "Files"
@ -192,7 +253,8 @@
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 369.5 "width": 369.5,
"collapsed": true
}, },
"left-ribbon": { "left-ribbon": {
"hiddenItems": { "hiddenItems": {
@ -216,35 +278,36 @@
"obsidian-importer:Open Importer": false "obsidian-importer:Open Importer": false
} }
}, },
"active": "cc1f4181c7f7c260", "active": "f15536f72bf96ad9",
"lastOpenFiles": [ "lastOpenFiles": [
"03-VM/44 - 98050 - Fiera/Especifica/Layout - Anello-Ring.md", "07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Cursor Notes.md",
"03-VM/44 - 98050 - Fiera/Especifica/Motor_Framework_Insight.md", "07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Visual Studio Notes.md",
"04-SIDEL/13 - E5.007560 - Modifica O&U - SAE235/MIGRATION OF AUTOMATION FROM SOFTPLC TWINCAT TO SIEMENS PHYSICAL PLC (Tia Portal).md", "03-VM/40 - 93040 - HENKEL - NEXT + 1 Problem/cronologia.md",
"07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Como usar PublicApiGenerator - Nuget - Documentator.md",
"07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Notas para crear nuevas aplicaciones.md",
"01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md",
"01-Documentation/AI - IA - LLM - Artificial Intelligence/MCP.md", "01-Documentation/AI - IA - LLM - Artificial Intelligence/MCP.md",
"04-SIDEL/Projects Description.md",
"03-VM/44 - 98050 - Fiera/Especifica/excal - Layout - Anello-Ring.md",
"03-VM/44 - 98050 - Fiera/Especifica/Descripción y Especifica - en.md",
"03-VM/44 - 98050 - Fiera/Especifica/IO - IP Nodes & PLC IO Tags.md",
"03-VM/44 - 98050 - Fiera/IO/98050_Hardware PEW - PAW.md",
"03-VM/44 - 98050 - Fiera/IO/PLC IO Tags.md",
"03-VM/44 - 98050 - Fiera/IO/Device IO Tags.md",
"03-VM/44 - 98050 - Fiera/Especifica/Drawing 2025-06-24 15.30.35.excalidraw.md",
"03-VM/44 - 98050 - Fiera/Especifica/Enviar/Motor_Framework_Insight.md",
"03-VM/44 - 98050 - Fiera/Especifica/Untitled.canvas",
"03-VM/44 - 98050 - Fiera/Especifica/Enviar/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.0 - Ita.md",
"03-VM/44 - 98050 - Fiera/Especifica/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.2 - en.md",
"03-VM/44 - 98050 - Fiera/Especifica/Enviar/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp.md",
"03-VM/44 - 98050 - Fiera/Especifica/Enviar/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Ita.md",
"03-VM/44 - 98050 - Fiera/Especifica/Enviar/AccumulationTable - It.md",
"03-VM/44 - 98050 - Fiera/Especifica/Enviar",
"03-VM/44 - 98050 - Fiera/Especifica/Especifica General.md",
"04-SIDEL/13 - E5.007560 - Modifica O&U - SAE235/MIGRATION OF AUTOMATION FROM SOFTPLC TWINCAT TO SIEMENS PHYSICAL PLC (Tia Portal).md",
"07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Proyectos Visual Studio/Como usar PublicApiGenerator - Nuget - Documentator.md",
"07 - Desarrolo de Proyectos - Scripts - Cursor - Visual Studio/Proyectos Visual Studio/Notas para crear nuevas aplicaciones.md",
"01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md",
"01-Documentation/Routers/Mikrotik - Network Redes/Zerotier VPN con VPS en Buenos Aires.md", "01-Documentation/Routers/Mikrotik - Network Redes/Zerotier VPN con VPS en Buenos Aires.md",
"01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik - Zerotier - zero_work network.md", "01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik - Zerotier - zero_work network.md",
"TEMP/Resumo geral.md", "TEMP/Resumo geral.md",
"01-Documentation/AI - IA - LLM - Artificial Intelligence/AI Prompts useful.md",
"DB/Shortcuts/Shortcuts.md",
"03-VM/44 - 98050 - Fiera/Especifica/AccumulationTable - It.md",
"07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Aplicaciones y Librerias.md",
"01-Documentation/Vetromeccanica/FBs/FB_BottleFallen.md",
"03-VM/44 - 98050 - Fiera/Especifica/Untitled.canvas",
"01-Documentation/Python/Scripts Python/Conda - Anaconda - miniconda.md",
"03-VM/44 - 98050 - Fiera/Especifica/AccumulationTable - En.md",
"04-SIDEL/00 - MASTER/SIDEL - Master - IPs.md",
"03-VM/44 - 98050 - Fiera/Especifica/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp.md",
"03-VM/44 - 98050 - Fiera/Especifica/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Ita.md",
"03-VM/44 - 98050 - Fiera/Especifica/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.2 - en.md",
"03-VM/44 - 98050 - Fiera/Especifica/Drawing 2025-06-24 15.30.35.excalidraw.md",
"03-VM/44 - 98050 - Fiera/Especifica/IO - Ips Nodes.md",
"03-VM/44 - 98050 - Fiera/Especifica/98050_Hardware PEW - PAW.md",
"03-VM/44 - 98050 - Fiera/Especifica/Especifica General.md",
"01-Documentation/SIDEL/SIDEL - Passwords.md",
"TEMP", "TEMP",
"04-SIDEL/13 - E5.007560 - Modifica O&U - SAE235/adjuntos/Pasted image 20250619173806.png", "04-SIDEL/13 - E5.007560 - Modifica O&U - SAE235/adjuntos/Pasted image 20250619173806.png",
"04-SIDEL/13 - E5.007560 - Modifica O&U - SAE235/adjuntos/Pasted image 20250619165534.png", "04-SIDEL/13 - E5.007560 - Modifica O&U - SAE235/adjuntos/Pasted image 20250619165534.png",
@ -264,7 +327,6 @@
"01-Documentation/Dispositivos - Manuales/4-20ma Analog setup wiring/adjuntos/Pasted image 20250610121656.png", "01-Documentation/Dispositivos - Manuales/4-20ma Analog setup wiring/adjuntos/Pasted image 20250610121656.png",
"01-Documentation/Dispositivos - Manuales/4-20ma Analog setup wiring/adjuntos/Pasted image 20250610121639.png", "01-Documentation/Dispositivos - Manuales/4-20ma Analog setup wiring/adjuntos/Pasted image 20250610121639.png",
"01-Documentation/Dispositivos - Manuales/4-20ma Analog setup wiring/adjuntos", "01-Documentation/Dispositivos - Manuales/4-20ma Analog setup wiring/adjuntos",
"01-Documentation/Dispositivos - Manuales/4-20ma Analog setup wiring",
"03-Revised/93789 Sipa Italia - Tinny - HSCounters - Piattaforma/Divider/Untitled.canvas", "03-Revised/93789 Sipa Italia - Tinny - HSCounters - Piattaforma/Divider/Untitled.canvas",
"04-InLavoro/9..... MASTER Transport/Standard Transport/FB500 Logic.canvas", "04-InLavoro/9..... MASTER Transport/Standard Transport/FB500 Logic.canvas",
"04-InLavoro/HENKEL/93040 - HENKEL - BowlingGreen/TL22-L25/Synoptic Change/Q3.canvas", "04-InLavoro/HENKEL/93040 - HENKEL - BowlingGreen/TL22-L25/Synoptic Change/Q3.canvas",

View File

@ -1,56 +0,0 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
%%
## Drawing
```compressed-json
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
```
%%

View File

@ -1,781 +0,0 @@
## 1. System Architecture
### 1.1 Call Structure
```
OB1
├── FC_Ttop_Run
│ ├── FC_Table_Motor_M316() → "DB Motor M316"(FB_Motors_Manage)
│ ├── FC_Table_Motor_M317() → "DB Motor M317"(FB_Motors_Manage)
│ ├── FC_Table_Motor_M318() → "DB Motor M318"(FB_Motors_Manage)
│ ├── FC_Table_Motor_M319() → "DB Motor M319"(FB_Motors_Manage)
│ ├── FC_Table_Motor_M328() → "DB Motor M328"(FB_Motors_Manage) // Channel 1
│ ├── FC_Table_Motor_M329() → "DB Motor M329"(FB_Motors_Manage) // Channel 2
│ ├── FC_Table_Motor_M330() → "DB Motor M330"(FB_Motors_Manage) // Channel 3
│ ├── FC_Table_Motor_M331() → "DB Motor M331"(FB_Motors_Manage) // Channel 4
│ ├── FC_Table_Motor_M332() → "DB Motor M332"(FB_Motors_Manage) // Channel 5 (center)
│ ├── FC_Table_Motor_M333() → "DB Motor M333"(FB_Motors_Manage) // Channel 6
│ ├── FC_Table_Motor_M334() → "DB Motor M334"(FB_Motors_Manage) // Channel 7
│ ├── FC_Table_Motor_M335() → "DB Motor M335"(FB_Motors_Manage) // Channel 8
│ ├── FC_Table_Motor_M336() → "DB Motor M336"(FB_Motors_Manage) // Channel 9
│ ├── FC_Table_Motor_M340() → "DB Motor M340"(FB_Motors_Manage)
│ ├── FC_Table_Motor_M341() → "DB Motor M341"(FB_Motors_Manage)
│ ├── FC_Table_Motor_M342() → "DB Motor M342"(FB_Motors_Manage)
│ └── FC_Table_Motor_M343() → "DB Motor M343"(FB_Motors_Manage)
└── FC_Table_Devices
└── "DB Table"(FB_Table)
```
### 1.2 Component Mapping
- **M316, M317**: Input feeders (left, right)
- **M318**: Format change input feeders
- **M319**: Input selector
- **M328-M336**: Channels 1-9 (1=leftmost, 5=center/bypass, 9=rightmost)
- **M340**: Output selector
- **M341, M342**: Output feeders (left, right)
- **M343**: Format change output feeders
## 2. Data Structures
### 2.1 Format Data Structure
```pascal
TYPE T_Format_Data:
STRUCT
Format_Number : Int; // Format number (1 or 2)
Accumulation_Side : Int; // 1=Left (channels 1-4), 2=Right (channels 6-9)
Bottle_Dimension_mm : Real; // Bottle dimension in mm
Max_Speed_mm_min : Real; // Maximum speed in mm/min
Target_Channels : Array[1..4] of Int; // Channels to use for this format
END_STRUCT;
```
### 2.2 External Exchange Database
```pascal
DB_ATable_Exchange:
STRUCT
// === INPUT SIGNALS (from external systems) ===
IN : STRUCT
// From Ring/Divider
Ring_Input_Product_Available : Bool; // Product available at input
Ring_Output_Request : Bool; // Ring requests product output
Ring_Empty_And_Auto : Bool; // Ring empty and divider in auto
Ring_Bypass_Speed_Request : Real; // Requested bypass speed
// Commands
Load_Request : Bool; // Request to start loading
Format_Change_Command : Bool; // Format change command from HMI
Unload_Enable : Bool; // Enable automatic unload after format change
// System status
System_Auto_Mode : Bool; // System in automatic mode
Emergency_Stop : Bool; // Emergency stop signal
END_STRUCT;
// === OUTPUT SIGNALS (to external systems) ===
OUT : STRUCT
// To Ring/Divider
Input_Request_Product : Bool; // Table ready and requesting input
Format_Change_Allowed : Bool; // Loading complete and ring empty
Output_Speed_Reference : Real; // Speed reference for output motor
Table_In_Bypass : Bool; // Table in bypass mode
// Status
Table_State : Int; // Current table state
Current_Format : Int; // Currently stored format
Table_Ready : Bool; // Table ready for operation
Loading_Complete : Bool; // Loading sequence complete
Unloading_Complete : Bool; // Unloading sequence complete
END_STRUCT;
END_STRUCT;
```
### 2.3 Table States
```pascal
CONST
TABLE_STATE_STOPPED : Int := 0;
TABLE_STATE_LOADING : Int := 1;
TABLE_STATE_BYPASS : Int := 2;
TABLE_STATE_UNLOADING : Int := 3;
TABLE_STATE_ERROR : Int := 4;
END_CONST;
```
## 3. Main Function Block - FB_Table
### 3.1 Interface
```pascal
FB_Table:
VAR_INPUT
Enable : Bool; // Table enable
Target_Format : Int; // Target format (1 or 2)
Manual_Mode : Bool; // Manual operation mode
END_VAR
VAR_IN_OUT
// Motor structure references (pointers)
Motor_M316 : UDT_Motor_Manage; // Input feeder left
Motor_M317 : UDT_Motor_Manage; // Input feeder right
Motor_M318 : UDT_Motor_Manage; // Format change input
Motor_M319 : UDT_Motor_Manage; // Input selector
Motor_M328 : UDT_Motor_Manage; // Channel 1
Motor_M329 : UDT_Motor_Manage; // Channel 2
Motor_M330 : UDT_Motor_Manage; // Channel 3
Motor_M331 : UDT_Motor_Manage; // Channel 4
Motor_M332 : UDT_Motor_Manage; // Channel 5 (center)
Motor_M333 : UDT_Motor_Manage; // Channel 6
Motor_M334 : UDT_Motor_Manage; // Channel 7
Motor_M335 : UDT_Motor_Manage; // Channel 8
Motor_M336 : UDT_Motor_Manage; // Channel 9
Motor_M340 : UDT_Motor_Manage; // Output selector
Motor_M341 : UDT_Motor_Manage; // Output feeder left
Motor_M342 : UDT_Motor_Manage; // Output feeder right
Motor_M343 : UDT_Motor_Manage; // Format change output
Exchange : DB_ATable_Exchange; // External communication
END_VAR
VAR_OUTPUT
Table_State : Int; // Current state
Error_Code : Word; // Error code
Diagnostics : T_Table_Diagnostics; // Diagnostic information
END_VAR
VAR_STAT
// === COMMAND STRUCTURE (Read by FC motors) ===
Status : STRUCT
// Input feeders
Input_Feeders_Enable : Bool;
Input_Feeders_Speed_mm_min : Real;
Input_Feeders_Stop_After_Bottle : Bool;
// Output feeders
Output_Feeders_Enable : Bool;
Output_Feeders_Speed_mm_min : Real;
Output_Feeders_Stop_After_Bottle : Bool;
// Input selector
Input_Selector_Enable : Bool;
Input_Selector_Target_Channel : Int;
Input_Selector_Positioning_Mode : Bool;
// Output selector
Output_Selector_Enable : Bool;
Output_Selector_Target_Channel : Int;
Output_Selector_Positioning_Mode : Bool;
// Channels
Channel_Enable : Array[1..9] of Bool;
Channel_Speed_mm_min : Array[1..9] of Real;
// Format change motors
Format_Change_Input_Enable : Bool;
Format_Change_Input_Target_mm : Real;
Format_Change_Output_Enable : Bool;
Format_Change_Output_Target_mm : Real;
END_STRUCT;
// === INTERNAL LOGIC VARIABLES ===
Current_State : Int;
Previous_State : Int;
Loading_Step : Int;
Unloading_Step : Int;
Current_Loading_Channel : Int;
Current_Unloading_Channel : Int;
// Format configuration
Format_Data : Array[1..2] of T_Format_Data;
Current_Format_Stored : Int;
// Timers
State_Timer : TON;
Operation_Timeout : TON;
// Area management instances
Area_Input_Selector : FB_Area_Management;
Area_Channel : Array[1..9] of FB_Area_Management;
Area_Output_Selector : FB_Area_Management;
// Virtual encoders for position tracking
Encoder_M332 : FB_Virtual_Encoder; // Center channel for bypass tracking
Encoder_Input_Selector : FB_Virtual_Encoder;
Encoder_Output_Selector : FB_Virtual_Encoder;
END_VAR
```
### 3.2 Main Logic (Pseudocode)
```pascal
// === STATE MACHINE MANAGEMENT ===
CASE Current_State OF
TABLE_STATE_STOPPED:
IF Enable AND Exchange.IN.System_Auto_Mode THEN
IF Exchange.IN.Load_Request THEN
Current_State := TABLE_STATE_LOADING;
Loading_Step := 1;
ELSIF Exchange.IN.Ring_Output_Request AND (Current_Format_Stored > 0) THEN
Current_State := TABLE_STATE_UNLOADING;
Unloading_Step := 1;
END_IF;
END_IF;
TABLE_STATE_LOADING:
Execute_Loading_Sequence();
IF Loading_Complete THEN
Current_State := TABLE_STATE_BYPASS;
Exchange.OUT.Loading_Complete := TRUE;
END_IF;
TABLE_STATE_BYPASS:
Execute_Bypass_Mode();
IF Exchange.IN.Format_Change_Command AND Exchange.IN.Ring_Empty_And_Auto THEN
Current_State := TABLE_STATE_UNLOADING;
Unloading_Step := 1;
END_IF;
TABLE_STATE_UNLOADING:
Execute_Unloading_Sequence();
IF Unloading_Complete THEN
Current_State := TABLE_STATE_BYPASS;
Exchange.OUT.Unloading_Complete := TRUE;
Current_Format_Stored := 0;
END_IF;
TABLE_STATE_ERROR:
Execute_Error_Recovery();
END_CASE;
// === UPDATE EXTERNAL SIGNALS ===
Exchange.OUT.Table_State := Current_State;
Exchange.OUT.Current_Format := Current_Format_Stored;
Exchange.OUT.Table_Ready := (Current_State <> TABLE_STATE_ERROR);
Exchange.OUT.Format_Change_Allowed := (Current_State = TABLE_STATE_BYPASS) AND
(Current_Format_Stored > 0) AND
Exchange.IN.Ring_Empty_And_Auto;
// === AREA MANAGEMENT UPDATES ===
FOR i := 1 TO 9 DO
Area_Channel[i](
Motor := Get_Channel_Motor_Reference(i),
Enable := Status.Channel_Enable[i],
Area_Length_mm := Get_Channel_Length(i),
Bottle_Length_mm := Format_Data[Target_Format].Bottle_Dimension_mm
);
END_FOR;
```
## 4. Loading Sequence Logic
### 4.1 Loading Sequence Steps
```pascal
PROCEDURE Execute_Loading_Sequence:
VAR
Target_Channels : Array[1..4] of Int;
Current_Channel : Int;
Channel_Index : Int;
BEGIN
// Get target channels for current format
Target_Channels := Get_Target_Channels_For_Format(Target_Format);
CASE Loading_Step OF
1: // Initialize loading
Current_Loading_Channel := Get_Outermost_Channel(Target_Format);
Channel_Index := 1;
Position_Input_Selector(Target_Channels[Channel_Index]);
Loading_Step := 2;
2: // Wait for selector positioning
IF Input_Selector_In_Position THEN
Enable_Channel_Motors_For_Loading(Current_Loading_Channel);
Enable_Input_Feeders();
Loading_Step := 3;
END_IF;
3: // Load current channel
IF Channel_Loading_Complete(Current_Loading_Channel) THEN
Disable_Input_Feeders();
Channel_Index := Channel_Index + 1;
IF Channel_Index <= 4 THEN
Current_Loading_Channel := Target_Channels[Channel_Index];
Position_Input_Selector(Current_Loading_Channel);
Loading_Step := 2;
ELSE
Loading_Step := 4; // All channels loaded
END_IF;
END_IF;
4: // Loading complete
Disable_All_Channel_Motors();
Position_Selectors_To_Bypass();
Current_Format_Stored := Target_Format;
Loading_Complete := TRUE;
END_CASE;
END_PROCEDURE;
FUNCTION Get_Target_Channels_For_Format(Format : Int) : Array[1..4] of Int:
BEGIN
IF Format_Data[Format].Accumulation_Side = 1 THEN // Left side
RETURN [1, 2, 3, 4]; // Load from outside to inside
ELSE // Right side
RETURN [9, 8, 7, 6]; // Load from outside to inside
END_IF;
END_FUNCTION;
FUNCTION Get_Outermost_Channel(Format : Int) : Int:
BEGIN
IF Format_Data[Format].Accumulation_Side = 1 THEN
RETURN 1; // Leftmost channel
ELSE
RETURN 9; // Rightmost channel
END_IF;
END_FUNCTION;
PROCEDURE Enable_Channel_Motors_For_Loading(Target_Channel : Int):
BEGIN
// Enable all channels from center to target channel
FOR i := 5 TO Target_Channel DO // or FROM Target_Channel TO 5
Status.Channel_Enable[i] := TRUE;
Status.Channel_Speed_mm_min[i] := Format_Data[Target_Format].Max_Speed_mm_min;
END_FOR;
END_PROCEDURE;
```
## 5. Unloading Sequence Logic
### 5.1 Unloading Sequence Steps
```pascal
PROCEDURE Execute_Unloading_Sequence:
VAR
Stored_Channels : Array[1..4] of Int;
Current_Channel : Int;
Channel_Index : Int;
BEGIN
// Get channels where current format is stored
Stored_Channels := Get_Target_Channels_For_Format(Current_Format_Stored);
CASE Unloading_Step OF
1: // Initialize unloading - start from innermost channel
Channel_Index := 4; // Start from innermost
Current_Unloading_Channel := Stored_Channels[Channel_Index];
Position_Output_Selector(Current_Unloading_Channel);
Unloading_Step := 2;
2: // Wait for selector positioning
IF Output_Selector_In_Position THEN
Enable_Channel_Motors_For_Unloading(Current_Unloading_Channel);
Enable_Output_Feeders();
Unloading_Step := 3;
END_IF;
3: // Unload current channel
IF Channel_Unloading_Complete(Current_Unloading_Channel) THEN
Disable_Output_Feeders();
Channel_Index := Channel_Index - 1;
IF Channel_Index >= 1 THEN
Current_Unloading_Channel := Stored_Channels[Channel_Index];
Position_Output_Selector(Current_Unloading_Channel);
Unloading_Step := 2;
ELSE
Unloading_Step := 4; // All channels unloaded
END_IF;
END_IF;
4: // Unloading complete
Disable_All_Channel_Motors();
Position_Selectors_To_Bypass();
Unloading_Complete := TRUE;
END_CASE;
END_PROCEDURE;
PROCEDURE Enable_Channel_Motors_For_Unloading(Target_Channel : Int):
BEGIN
// Enable all channels from target channel to center
FOR i := Target_Channel TO 5 DO // or FROM 5 TO Target_Channel
Status.Channel_Enable[i] := TRUE;
Status.Channel_Speed_mm_min[i] := Format_Data[Current_Format_Stored].Max_Speed_mm_min;
END_FOR;
END_PROCEDURE;
```
## 6. Bypass Mode Logic
### 6.1 Bypass Operation
```pascal
PROCEDURE Execute_Bypass_Mode:
BEGIN
// Enable only center channel for bypass
Status.Channel_Enable[5] := TRUE;
Status.Channel_Speed_mm_min[5] := Exchange.IN.Ring_Bypass_Speed_Request;
// Disable all other channels
FOR i := 1 TO 9 DO
IF i <> 5 THEN
Status.Channel_Enable[i] := FALSE;
END_IF;
END_FOR;
// Position selectors to bypass (channel 5)
Status.Input_Selector_Target_Channel := 5;
Status.Output_Selector_Target_Channel := 5;
Status.Input_Selector_Enable := TRUE;
Status.Output_Selector_Enable := TRUE;
// Update external signals
Exchange.OUT.Table_In_Bypass := TRUE;
Exchange.OUT.Output_Speed_Reference := Exchange.IN.Ring_Bypass_Speed_Request;
Exchange.OUT.Input_Request_Product := Exchange.IN.Ring_Input_Product_Available;
END_PROCEDURE;
```
## 7. Auxiliary Function Blocks
### 7.1 FB_Virtual_Encoder
```pascal
FB_Virtual_Encoder:
VAR_IN_OUT
Motor : UDT_Motor_Manage; // Motor structure reference
END_VAR
VAR_INPUT
Enable : Bool; // Enable calculation
Ratio_Hz_to_mm_min : Real; // Conversion factor Hz to mm/min
Reset_Position : Bool; // Reset total position
END_VAR
VAR_OUTPUT
Displacement_mm : Real; // Displacement since last call
Current_Speed_mm_min : Real; // Current speed in mm/min
Total_Distance_mm : Real; // Total accumulated distance
Motor_Running : Bool; // Motor running status
END_VAR
VAR_STAT
Last_Frequency_Hz : Real;
Last_Scan_Time : Time;
Position_Accumulated : Real;
END_VAR
// Pseudocode:
BEGIN
IF Enable THEN
Current_Frequency := Read_Motor_Frequency(Motor);
Current_Time := Get_System_Time();
IF First_Scan THEN
Last_Frequency_Hz := Current_Frequency;
Last_Scan_Time := Current_Time;
ELSE
Time_Delta := Current_Time - Last_Scan_Time;
Avg_Frequency := (Current_Frequency + Last_Frequency_Hz) / 2;
Speed_mm_min := Avg_Frequency * Ratio_Hz_to_mm_min;
Displacement_mm := Speed_mm_min * Time_Delta_In_Minutes;
IF NOT Reset_Position THEN
Total_Distance_mm := Total_Distance_mm + Displacement_mm;
ELSE
Total_Distance_mm := 0;
END_IF;
Last_Frequency_Hz := Current_Frequency;
Last_Scan_Time := Current_Time;
END_IF;
Current_Speed_mm_min := Current_Frequency * Ratio_Hz_to_mm_min;
Motor_Running := Motor.STATUS_RUN;
ELSE
Displacement_mm := 0;
Current_Speed_mm_min := 0;
END_IF;
END_FUNCTION_BLOCK;
```
### 7.2 FB_Area_Management
```pascal
FB_Area_Management:
VAR_IN_OUT
Motor : UDT_Motor_Manage; // Motor of this area
END_VAR
VAR_INPUT
Enable : Bool; // Area enable
Area_Length_mm : Real; // Total area length
Bottle_Length_mm : Real; // Bottle dimension
Photocell_Pulse : Bool; // Entry photocell pulse
Reset_Bottles : Bool; // Reset bottle tracking
END_VAR
VAR_OUTPUT
First_Bottle_Position : Real; // Position of first bottle
Last_Bottle_Position : Real; // Position of last bottle
Area_Empty : Bool; // Area completely empty
Bottles_In_Initial_Zone : Bool; // Bottles in initial zone
Bottles_In_Final_Zone : Bool; // Bottles in final zone
Bottle_Count : Int; // Number of bottles in area
END_VAR
VAR_STAT
Virtual_Encoder : FB_Virtual_Encoder;
Bottle_Positions : Array[1..50] of Real; // Track up to 50 bottles
Active_Bottles : Int;
Photocell_Pulse_Edge : R_TRIG;
END_VAR
// Pseudocode:
BEGIN
Virtual_Encoder(
Motor := Motor,
Enable := Enable,
Ratio_Hz_to_mm_min := Calculate_Area_Ratio()
);
// Detect new bottle entry
Photocell_Pulse_Edge(CLK := Photocell_Pulse);
IF Photocell_Pulse_Edge.Q THEN
Add_New_Bottle_To_Tracking();
END_IF;
// Update all bottle positions
FOR i := 1 TO Active_Bottles DO
Bottle_Positions[i] := Bottle_Positions[i] - Virtual_Encoder.Displacement_mm;
// Remove bottles that have exited the area
IF Bottle_Positions[i] <= 0 THEN
Remove_Bottle_From_Tracking(i);
END_IF;
END_FOR;
// Calculate outputs
IF Active_Bottles = 0 THEN
Area_Empty := TRUE;
First_Bottle_Position := 0;
Last_Bottle_Position := 0;
ELSE
Area_Empty := FALSE;
First_Bottle_Position := Find_Minimum_Position();
Last_Bottle_Position := Find_Maximum_Position();
END_IF;
Bottles_In_Initial_Zone := Check_Bottles_In_Zone(Area_Length_mm * 0.8, Area_Length_mm);
Bottles_In_Final_Zone := Check_Bottles_In_Zone(0, Area_Length_mm * 0.2);
Bottle_Count := Active_Bottles;
END_FUNCTION_BLOCK;
```
## 8. Motor-Specific Function Examples
### 8.1 FC_Table_Motor_M316 (Input Feeder Left)
```pascal
FC_Table_Motor_M316:
VAR_IN_OUT
Motor : UDT_Motor_Manage;
Table_Status : T_Table_Status_Commands; // Reference to FB_Table.Status
END_VAR
// Pseudocode:
BEGIN
// === MOTOR CONFIGURATION ===
Motor.CFG_VFD := TRUE;
Motor.CFG_PN := TRUE;
Motor.CFG_Inverter_Type := Inverter_Type_MINIMOTOR;
Motor.CFG_Min_Speed_Hz := 10;
Motor.CFG_Max_Speed_Hz := 500;
// === READ COMMANDS FROM TABLE LOGIC ===
Motor.REQ_EN_Run := Table_Status.Input_Feeders_Enable;
IF Table_Status.Input_Feeders_Enable THEN
Motor.REQ_Speed_Fix_01 := TRUE;
Motor.OUT_VFD_REQ_Speed_User := Convert_mm_min_to_User_Units(Table_Status.Input_Feeders_Speed_mm_min);
// Feeder-specific logic: synchronized operation with M317
Check_Synchronization_With_M317();
// Stop after bottle detection if requested
IF Table_Status.Input_Feeders_Stop_After_Bottle THEN
Implement_Stop_After_Bottle_Logic();
END_IF;
ELSE
Motor.REQ_Speed_Fix_01 := FALSE;
END_IF;
// === CALL MOTOR MANAGEMENT FB ===
FB_Motors_Manage(Motor);
END_FUNCTION;
```
### 8.2 FC_Table_Motor_M319 (Input Selector)
```pascal
FC_Table_Motor_M319:
VAR_IN_OUT
Motor : UDT_Motor_Manage;
Table_Status : T_Table_Status_Commands;
END_VAR
// Pseudocode:
BEGIN
// === MOTOR CONFIGURATION ===
Motor.CFG_VFD := TRUE;
Motor.CFG_PN := TRUE;
Motor.CFG_Inverter_Type := Inverter_Type_MINIMOTOR;
// === POSITIONING MODE SETUP ===
IF Table_Status.Input_Selector_Positioning_Mode THEN
Setup_Positioning_Mode();
Target_Position := Get_Position_For_Channel(Table_Status.Input_Selector_Target_Channel);
Motor.REQ_Target_Position := Target_Position;
Motor.REQ_Positioning_Enable := Table_Status.Input_Selector_Enable;
ELSE
Setup_Velocity_Mode();
Motor.REQ_EN_Run := Table_Status.Input_Selector_Enable;
END_IF;
// === CALL MOTOR MANAGEMENT FB ===
FB_Motors_Manage(Motor);
END_FUNCTION;
```
### 8.3 FC_Table_Motor_M332 (Center Channel - Bypass)
```pascal
FC_Table_Motor_M332:
VAR_IN_OUT
Motor : UDT_Motor_Manage;
Table_Status : T_Table_Status_Commands;
END_VAR
// Pseudocode:
BEGIN
// === MOTOR CONFIGURATION ===
Motor.CFG_VFD := TRUE;
Motor.CFG_PN := TRUE;
Motor.CFG_Inverter_Type := Inverter_Type_G120C_SIEMENS;
// === READ COMMANDS FROM TABLE LOGIC ===
Motor.REQ_EN_Run := Table_Status.Channel_Enable[5]; // Channel 5 = center
IF Table_Status.Channel_Enable[5] THEN
Motor.REQ_Speed_Fix_01 := TRUE;
Motor.OUT_VFD_REQ_Speed_User := Convert_mm_min_to_User_Units(Table_Status.Channel_Speed_mm_min[5]);
ELSE
Motor.REQ_Speed_Fix_01 := FALSE;
END_IF;
// === CALL MOTOR MANAGEMENT FB ===
FB_Motors_Manage(Motor);
END_FUNCTION;
```
## 9. Error Handling
### 9.1 Basic Error Detection
```pascal
PROCEDURE Check_Basic_Errors:
BEGIN
Error_Code := 0;
// Check motor inverter errors
IF Motor_M316.Alarm_02 OR Motor_M317.Alarm_02 THEN
Error_Code := Error_Code OR 16#0001; // Input feeders inverter error
END_IF;
IF Motor_M341.Alarm_02 OR Motor_M342.Alarm_02 THEN
Error_Code := Error_Code OR 16#0002; // Output feeders inverter error
END_IF;
// Check selector positioning errors
IF Motor_M319.Alarm_02 THEN
Error_Code := Error_Code OR 16#0004; // Input selector error
END_IF;
IF Motor_M340.Alarm_02 THEN
Error_Code := Error_Code OR 16#0008; // Output selector error
END_IF;
// Check channel motor errors
FOR i := 1 TO 9 DO
IF Get_Channel_Motor_Alarm(i) THEN
Error_Code := Error_Code OR (16#0010 SHL i); // Channel motor error
END_IF;
END_FOR;
// Transition to error state if errors detected
IF Error_Code <> 0 THEN
Current_State := TABLE_STATE_ERROR;
END_IF;
END_PROCEDURE;
```
## 10. Configuration and Initialization
### 10.1 Format Configuration Example
```pascal
PROCEDURE Initialize_Format_Data:
BEGIN
// Format 1 - Left side accumulation
Format_Data[1].Format_Number := 1;
Format_Data[1].Accumulation_Side := 1; // Left side
Format_Data[1].Bottle_Dimension_mm := 85.0;
Format_Data[1].Max_Speed_mm_min := 12000.0;
Format_Data[1].Target_Channels := [1, 2, 3, 4];
// Format 2 - Right side accumulation
Format_Data[2].Format_Number := 2;
Format_Data[2].Accumulation_Side := 2; // Right side
Format_Data[2].Bottle_Dimension_mm := 65.0;
Format_Data[2].Max_Speed_mm_min := 15000.0;
Format_Data[2].Target_Channels := [9, 8, 7, 6];
END_PROCEDURE;
```
### 10.2 Area Configuration
```pascal
PROCEDURE Initialize_Area_Management:
BEGIN
// Configure each area with its specific dimensions
Area_Input_Selector.Area_Length_mm := 500.0;
Area_Output_Selector.Area_Length_mm := 500.0;
FOR i := 1 TO 9 DO
Area_Channel[i].Area_Length_mm := Get_Channel_Length(i);
END_FOR;
END_PROCEDURE;
```
## 11. Integration Points
### 11.1 FC_Table_Devices Integration
```pascal
FC_Table_Devices:
BEGIN
// Call Table FB with all motor references and exchange data
"DB Table"(
Enable := System_Enable,
Target_Format := HMI_Selected_Format,
Manual_Mode := System_Manual_Mode,
Motor_M316 := "DB Motor M316".Manage,
Motor_M317 := "DB Motor M317".Manage,
Motor_M318 := "DB Motor M318".Manage,
Motor_M319 := "DB Motor M319".Manage,
Motor_M328 := "DB Motor M328".Manage,
Motor_M329 := "DB Motor M329".Manage,
Motor_M330 := "DB Motor M330".Manage,
Motor_M331 := "DB Motor M331".Manage,
Motor_M332 := "DB Motor M332".Manage,
Motor_M333 := "DB Motor M333".Manage,
Motor_M334 := "DB Motor M334".Manage,
Motor_M335 := "DB Motor M335".Manage,
Motor_M336 := "DB Motor M336".Manage,
Motor_M340 := "DB Motor M340".Manage,
Motor_M341 := "DB Motor M341".Manage,
Motor_M342 := "DB Motor M342".Manage,
Motor_M343 := "DB Motor M343".Manage,
Exchange := "DB ATable Exchange"
);
// Additional device coordination logic if needed
END_FUNCTION;
```
This specification provides a complete framework for implementing the table accumulation system while maintaining consistency with the existing motor management framework. The design allows for clear separation of concerns, easy debugging, and flexible implementation of motor-specific behaviors.

View File

@ -126,3 +126,104 @@ Questi sono 1: FC6 -> Force 4
Tilter: gsdml-v2.32-minimotor-dbs55-20190315.xml Tilter: gsdml-v2.32-minimotor-dbs55-20190315.xml
FC de ALPLA: gsdml-v2.32-minimotor-dbs55-20190315.xml FC de ALPLA: gsdml-v2.32-minimotor-dbs55-20190315.xml
### IO PLC
***
| Tag | IO | Description Italian |
| --------- | -------- | ----------------------------------------------------- |
| HL53010 | %A0.0 | COL. LUMINOSA MARCIAAUTOMATICA |
| HL53020 | %A0.1 | SEGNALAZIONE COL. LUMINOSA |
| HL53030 | %A0.2 | ALLARME COL. LUMINOSA |
| HA53040 | %A0.3 | COL. LUMINOSA SIRENA |
| SH50510 | %A0.5 | MARCIA SEGN. LUMINOSA |
| SH50560 | %A0.6 | SEGN. LUMINOSA RICHIESTAACCESSO |
| SH50560 | %A0.6 | RICHIESTA ACCESSO |
| SH50570 | %A0.7 | SEGN. RESET LUMINOSA ALLARMI |
| SH50570 | %A0.7 | RESET ALLARMI |
| KA53210 | %A2.0 | RELE EMERGENZA GENERALE RESET R |
| KA53220 | %A2.1 | CARTER DIVISORE RESET RELE |
| KA53230 | %A2.2 | TAVOLO SMISTATORE CARTER INGRESSO RESET RELE |
| KA53240 | %A2.3 | TAVOLO RELE CARTER SMISTATORE USCITA RESETF |
| KA53250 | %A2.4 | ABILTAZIONE DIVISORE GATEWAY USCITA E 1GRUPPO |
| KA53260 | %A2.5 | GATEWAY USCITA ABILTAZIONE DIVISORE E 2GRUPPO |
| KA53270 | %A2.6 | GATEWAYUSCITA ADIMSORE ABILITAZIONE 3GRUPPO |
| KA53280 | %A2.7 | DIVSORE GATEWAY USCITA E 4GRUPPO ABILITAZIONE |
| KA53310 | %A3.0 | GATEWAY INGRESSO DIVISORE ABILITAZIONE E 1 GRUPPO |
| KA53320 | %A3.1 | GATEWAY INGRESSO ABILITAZIONE DIVISORE E 2 GRUPPO |
| KA53330 | %A3.2 | GATEWAY INGRESSO DIVISORE ABILITAZIONE 3 GRUPPO |
| KA53340 | %A3.3 | DIVISORE GATEWAY INGRESSO ABILITAZIONE 4GRUPPO |
| KA53350 | %A3.4 | DIVISORE ABILTAZIONE LLUMINAZIONE |
| U30110EN | %A3.5 | ASSE ABILITAZIONE LONGITUDINALE DIVSORE |
| U30210EN | %A3.6 | TRASVERSALE ASSE ABILITAZIONE DIVISORE |
| M31910HOM | %A3.7 | TAVOLO AZZERAMENTO EINGRESSO SMISTATORE TRASLAZIONE |
| M34010HOM | %A4.0 | AZZERAMENTOTRASLAZIONE SMISTATORE USCITA TAVOLO |
| QF10410 | %E0.0 | LINEA ALIMENTAZIONE MOVIGEAR |
| SERIETDIV | %E0.1 | AZIONAMENT ALIMENTAZIONE DIVISORE |
| QF31110 | %E0.2 | ALIMENTAZIONE SPAZIATORE USCITA DIVISORE |
| QF27110 | %E0.3 | ALIMENT. REG. LARGHEZZA USCITA SPAZIATORE DIVSORF |
| QF31610 | %E0.4 | ALIMENTAZIONE TAVOLO SPAZIATORE INGRESSO |
| QF27130 | %E0.5 | TAVOLO ALIMENT.REG. LARGHEZZA INGRESSO SPAZIATORE |
| QF31910 | %E0.6 | ALIMENTAZIONE SMISTATORE TRASLAZIONE FINGRESSO TAVOLO |
| SERIETTAV | %E0.7 | TAVOLO ALIMENTAZIONE INVERTER |
| QF27170 | %E1.0 | ALIMENTAZIONE CINGHIOLI REG. DIVISORE |
| QF34010 | %E1.1 | SMISTATORE TRASLAZIONE ALIMENTAZIONE ATAVOLO USCITA |
| QF34110 | %E1.2 | TAVOLO ALIMENTAZIONE SPAZIATORE USCITA |
| QF27150 | %E1.3 | ALIMENT. REG. LARGHEZZA SPAZIATORE USCITA LTAVOLO |
| FA10910 | %E1.4 | 24VDC QUADRO ALIMENTAZIONE INTERNO |
| FA10970 | %E1.5 | ALIMENTAZIONE MICROMECCANICA MOTORIN |
| QF11030 | %E1.6 | ALIMENTAZIONE ILLUMINAZIONE DIVISORE |
| AIRQE | %E1.7 | CONDIZIONATORE ALLARME |
| K14010 | %E2.0 | EMERGENZA GENERALE RELEE |
| SB14110FK | %E2.1 | PB1 PULSANTE EM. PUI SANTIERA |
| SPARE2 | %E2.2 | PULSANTE SCORTA EM. |
| SPARE1 | %E2.3 | PULSANTE SCORTA EM. |
| SPARE3 | %E2.4 | PULSANTE SCORTA EM. |
| K15010 | %E3.0 | EMERGENZA CARTER DIVISORE RELE E |
| S20010 | %E3.1 | PORTA1DIVISORE MICRO ABILITAZIONE |
| S20010 | %E3.1 | DIVISORE MICRO 0PORTA1 |
| S20110 | %E3.2 | MICRO ABILITAZIONE PORTA 2 DIVISORE |
| S20110 | %E3.2 | MICRO PORTA 2 DIVISORE |
| S20210 | %E3.3 | MICRO ABILITAZIONE PORTA 3 DIVSORE |
| S20210 | %E3.3 | MICRO PORTA 3 DIVISORE |
| S20310 | %E3.4 | MICRO ABILITAZIONE PORTA 4 DIVISORE |
| S20310 | %E3.4 | DIVISORE MICRO PORTA 4 |
| S20410 | %E3.5 | MICRO ABILITAZIONE PORTA 5 DIVSORE |
| S20410 | %E3.5 | DIVISORE MICRO PORTA 5 |
| S20510 | %E3.6 | MICRO ABILITAZIONE PORTA 6 DIMSORE |
| S20510 | %E3.6 | MICRO PORTA 6 DIVISORE |
| S20610 | %E3.7 | MICRO ABILITAZIONE PORTA 7 DIVSORE |
| S20610 | %E3.7 | DIVISORE MICRO 0PORTA7 |
| S20710 | %E4.0 | MICRO ABILITAZIONE PORTA 8 DIVISORE |
| S20710 | %E4.0 | PORTA 8 MICRO DIVSORE |
| K16010 | %E4.2 | RELE CARTER SMISTATORE TAVOLO N INGRESSO MULTIMA |
| S20810 | %E4.3 | TAVOLO SMISTATORE INGRESSO MICRO PORTA 1 |
| S20910 | %E4.4 | SMISTATORE TAVOLO MICRO INGRESSO PORTA 2 |
| K17010 | %E4.5 | USCITA RELE CARTER SMISTATORE TAVOLO MULTIMA |
| S21010 | %E4.6 | TAVOLO SMISTATORE MICRO USCITA PORTA 1 |
| S21110 | %E4.7 | TAVOLO SMISTATORE MICRO PORTA 2 USCITA |
| SB50510 | %E5.0 | MARCIA |
| SB50520 | %E5.1 | ARRESTO |
| SA50530 | %E5.2 | MANUALE/AUTOMATICO |
| SA50540FF | %E5.3 | AVANTI MANUAL COMANDI |
| SA50540BW | %E5.4 | INDIETRO COMANDI MANUAL |
| B50610 | %E6.0 | CONTEGGIO DIVSORE FORMATO 1 |
| B50620 | %E6.1 | CONTEGGIO DIVISORE FORMATO 2 |
| B50630 | %E6.2 | TRASLAZIONE SICUREZZA DIVISORE ALTA |
| B50640 | %E6.3 | TRASLAZIONE BASSA DIVISORE SICURE77A |
| S31040 | %E1413.0 | Sensore Di Asse Longitudinale |
| S31050 | %E1413.1 | Sensore de Asse Transversale |
| S31051 | %E1413.2 | Sensore de Reg Spaziatore Uscita Divisore |
| B31060 | %E1413.3 | Sicurezza uscita spaziatore |
| B31440 | %E1577.0 | Minimo Polmone Ingresso Tavolo |
| B31540 | %E1597.0 | CONTEGGIO INGRESSO TAVOLO |
| B31550 | %E1597.1 | SICUREZA TRASLAZIONE SMISTATORE INGRESSO |
| S31550 | %E1597.2 | SENSORE DI HOMING SPAZIATORE ING. TAVOLO |
| S31560 | %E1597.3 | SENSORE DI HOMING TRASL SMISTATORE INGRESO |
| B34440 | %E2217.0 | SICUREZZA TRALAZIONE SMISTATORE USCITA |
| B34450 | %E2217.1 | CONTEGGIO USCITA TAVOLO |
| B34451 | %E2217.2 | INTASAMENTO USCITA TAVOLO |
| S34460 | %E2217.3 | SENSORE DI HOMING TRASL SMISTATORE USCITA |
| S34461 | %E2217.4 | SENSORE DE HOMING SPAZIATORE USCITA TAVOLO |

View File

@ -1,157 +0,0 @@
### 1. Goal
Implement the control logic for a two-format bottle loop consisting of the Accumulation Table, Curve 1, Divider, Combiner, Curve 2 and the format-change axes. Only the loop, table and format-change logic are in scope.
---
### 2. Physical Layout
`AccumTable → Curve 1 (M344) → Divider → Combiner (M311 + M312) → Curve 2 (M315) → AccumTable`
---
### 3. Runtime Data held by every entity
|Field|Type|Meaning|
|---|---|---|
|`formatId`|INT|Active bottle format|
|`cycleMode`|ENUM {AUTO, MAN}|Automatic / Manual|
|`alarmBits`|DWORD|Active alarms bitmap|
|`topAlarm`|WORD|Highest-priority alarm code|
---
### 4. Main Operating States
1. **Load** fill outermost channels first.
2. **Bypass** straight-through flow.
3. **Unload** empty innermost channels first.
---
### 5. Functional Behaviour (concise)
|Sub-system|Key rules of operation|
|---|---|
|**Accumulation Table**|• Works in three states (Load, Bypass, Unload).• Channels are filled from the outside in and emptied from the inside out; channels that lie between the selector and the active channel must run while bottles cross them.|
||• Each channel keeps two virtual counters `firstBottle_mm` & `lastBottle_mm`, initialised to the full channel length when a bottle is detected and decremented by the conveyor encoder; when `firstBottle_mm == 0` the leading bottle has reached the channels end.|
||• Once a channel starts **Unload** it must run until `lastBottle_mm == 0` to avoid trapping product.|
|**Curve 1 / Curve 2**|• Curve 1 runs in speed-follower mode slaved to the Divider and may move only while the Divider is running.• Curve 2 is slaved to the Combiner and must run whenever the Combiner runs; the two curves are the only places where line accumulation may build up.|
|**Combiner**|• Speed follows the Divider.• Stops if the downstream photo-sensor `pth_out` detects more than one bottle; if Combiner stops it also stops the Divider.|
|**Doser Pair**|• Two motors run in mirror at identical speed; if either trips, both stop.• After the last bottle pulse the pair runs an additional distance (`stopDist_mm`) using a virtual encoder before stopping.|
---
### 6. Key Parameters
`bottleLen_mm`, `minAccumTime_ms`, `loadSpeed_mmps`, `unloadSpeed_mmps`, `bypassSpeed_mmps`, `virtualEncRatio_HzPerMm`, `safetyGapIn_mm`, `safetyGapOut_mm`
---
### 7. Software Architecture (Function Blocks)
| FB Name | Purpose | Typical DB |
| ---------------------- | ---------------------------------------------------------- | ------------------------ |
| **FB_FormatAxis** | Position a single minimotor to the target format dimension | `DB_FormatAxis_<axis>` |
| **FB_ChannelSelector** | Position the infeed/outfeed selector to a channel | `DB_SelIn`, `DB_SelOut` |
| **FB_AreaTracker** | Track `firstBottle` / `lastBottle` and drive an area motor | `DB_Area_<n>` |
| **FB_DoserPair** | Run a left/right doser pair with stop-after-pulse logic | `DB_DoserIO` |
| **FB_BufferLogic** | High-level coordinator for Load / Bypass / Unload | `DB_Buffer` |
| **FB_CombinerCtrl** | Synchronise Combiner with Divider, stop on blockage | `DB_Combiner` |
| **FB_LoopCurve** | Slave Curve 1 to Divider and Curve 2 to Combiner | `DB_Curve1`, `DB_Curve2` |
---
### 8. Interfaces (concise examples)
_FB_FormatAxis_
```
Inputs : enable, dimSet_mm, cycleMode, cmdHoming, jogFwd, jogRev, reset
Outputs: inPosition, positioning, errorWord
```
_FB_ChannelSelector_
```
Inputs : enable, channelSet(0-9), cycleMode, cmdHoming, jogFwd, jogRev, reset
Outputs: inPosition, positioning, autoActive, errorWord
```
_FB_AreaTracker_
```
Inputs : enable, speedRef_mmps, bottleLen_mm, spacing_mm, areaDim_mm
Outputs: areaEmpty, noBottleAtIn, noBottleAtOut
```
_FB_DoserPair_
```
Inputs : enable, speedRef_mmps, bottlePulse, stopDist_mm
Outputs: running, errorWord
```
_FB_BufferLogic_
```
Inputs : reqLoad, reqFormatChange, unloadEnable, bypassSpeedRef
Outputs: tableNeedsProduct, formatChangeOK, outfeedSpeedRef, bypassActive
```
_FB_CombinerCtrl_
```
Inputs : dividerSpeedRef_mmps, pthOutBlocked, dividerRunning
Outputs: combinerSpeedRef_mmps, stopDivider
```
---
### 9. Naming Guidelines
|Category|Convention|Example|
|---|---|---|
|FBs|`FB_<Meaning>`|`FB_BufferLogic`|
|BOOL var|verbNounFlag|`enableMove`|
|WORD|camelCase|`errorWord`|
|REAL|suffix `_mm`, `_mmps`|`speedRef_mmps`|
|Structs|`ST_<Role>`|`ST_AreaStatus`|
---
### 10. Signal Map (I/O)
|Signal|Suggested Name|Dir|Comment|
|---|---|---|---|
|i1|`ringOutReq`|IN|Product request from downstream|
|i2|`loadCmd`|IN|Start load for format change|
|i3|`ringEmptyOk`|IN|Loop & Divider ready for change|
|i4|`bypassSpeedRef`|IN|Desired bypass speed|
|i5|`formatChangeCmd`|IN|HMI executes change|
|i6|`unloadEnable`|IN|Allow automatic unload|
|o1|`tableProdReq`|OUT|Table ready, asks for bottles|
|o2|`formatChangeOK`|OUT|Loading done & loop empty|
|o3|`outfeedSpeedRef`|OUT|Speed reference to ring outfeed|
|o4|`bypassActive`|OUT|Table in bypass state|
---
### 11. State Sequence Summary
1. External `loadCmd` → BufferLogic enters **Load**, enforcing outer-to-inner rule.
2. On HMI `formatChangeCmd`, BufferLogic finishes load, waits for `ringEmptyOk`, then raises `formatChangeOK`.
3. After format change, BufferLogic triggers **Unload** (inner-to-outer).
4. When all channels empty, state switches to **Bypass** and `bypassActive` is set.
---
This version retains the tight structure and English terminology from the previous draft while adding the essential operating descriptions for the Accumulation Table, Curves, Combiner and Doser logic drawn from the original Spanish document.

View File

@ -1,124 +0,0 @@
{
"edges": [
{
"fromNode": "e72fa25693e3125c",
"fromSide": "left",
"id": "2cf81a9c982a2067",
"styleAttributes": {
},
"toFloating": false,
"toNode": "ad6652d132247aaf",
"toSide": "right"
},
{
"fromFloating": false,
"fromNode": "bba4d98c4f5cd237",
"fromSide": "left",
"id": "8186fcdcf4ffa0ce",
"styleAttributes": {
"arrow": null,
"pathfindingMethod": "square"
},
"toFloating": false,
"toNode": "3d4520602586e940",
"toSide": "top"
},
{
"fromFloating": false,
"fromNode": "3d4520602586e940",
"fromSide": "right",
"id": "b6cf025f45f254f2",
"styleAttributes": {
"pathfindingMethod": "square"
},
"toFloating": false,
"toNode": "e72fa25693e3125c",
"toSide": "right"
},
{
"fromNode": "ad6652d132247aaf",
"fromSide": "left",
"id": "b61703c8f621acf7",
"styleAttributes": {
"pathfindingMethod": "square"
},
"toFloating": false,
"toNode": "3d4520602586e940",
"toSide": "left"
},
{
"fromFloating": false,
"fromNode": "3d4520602586e940",
"fromSide": "top",
"id": "8abcd389a15e7d5b",
"styleAttributes": {
"pathfindingMethod": "square"
},
"toFloating": false,
"toNode": "bba4d98c4f5cd237",
"toSide": "right"
}
],
"metadata": {
"frontmatter": {
},
"version": "1.0-1.0"
},
"nodes": [
{
"height": 60,
"id": "bba4d98c4f5cd237",
"styleAttributes": {
},
"text": "Table",
"type": "text",
"width": 260,
"x": -80,
"y": -680
},
{
"height": 60,
"id": "e72fa25693e3125c",
"styleAttributes": {
},
"text": "Divider",
"type": "text",
"width": 260,
"x": 120,
"y": -260
},
{
"height": 60,
"id": "ad6652d132247aaf",
"styleAttributes": {
},
"text": "Combiner",
"type": "text",
"width": 260,
"x": -280,
"y": -260
},
{
"height": 60,
"id": "3d4520602586e940",
"styleAttributes": {
},
"text": "Ring",
"type": "text",
"width": 260,
"x": -80,
"y": -440
},
{
"height": 110,
"id": "1fbed33d803bc91b",
"styleAttributes": {
},
"text": "Operador\nSolicita Cambio Formato\nHMI_Machine",
"type": "text",
"width": 260,
"x": -580,
"y": -760
}
]
}

View File

@ -0,0 +1,29 @@
***
### Para ver el uso:
Dashboard: [Cursor - The AI Code Editor](https://cursor.com/dashboard)
### Project-Specific MCP setup
* Poner bajo el subdirectorio .cursor el archivo mcp.json con la configuracion de los mcp
* Ejemplo : [mcp.json](file:///D:%5CProyectos%5CScripts%5CHomeAssistant%5C.cursor%5Cmcp.json)
```json
{
"mcpServers": {
"home-assistant": {
"command": "C:\\Users\\migue\\miniconda3\\envs\\homeassistant\\python.exe",
"args": [
"d:\\Proyectos\\Scripts\\HomeAssistant\\mcp_server.py"
],
"env": {
"HA_URL": "http://192.168.88.130:8123",
"HA_TOKEN": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI4MGZmZjNiMjI1MTI0YmRkYTQxMWVjODdjNmE3ZjBiMiIsImlhdCI6MTc0OTg5NzA1MSwiZXhwIjoyMDY1MjU3MDUxfQ.A47Nj9BrUFVF_DTfux2yrG7iZjsPdRJrfZr1LTKEWRw"
}
}
}
}
```