vault backup: 2025-04-26 14:46:46
This commit is contained in:
parent
86d4b9753f
commit
bb3fad6e39
|
@ -6,6 +6,7 @@
|
||||||
"showViewHeader": true,
|
"showViewHeader": true,
|
||||||
"showRibbon": true,
|
"showRibbon": true,
|
||||||
"enabledCssSnippets": [
|
"enabledCssSnippets": [
|
||||||
"nav-wrap"
|
"nav-wrap",
|
||||||
|
"prism-scl"
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -23,5 +23,6 @@
|
||||||
"recent-files-obsidian",
|
"recent-files-obsidian",
|
||||||
"obsidian-auto-link-title",
|
"obsidian-auto-link-title",
|
||||||
"advanced-canvas",
|
"advanced-canvas",
|
||||||
"obsidian-minimal-settings"
|
"obsidian-minimal-settings",
|
||||||
|
"shiki-highlighter"
|
||||||
]
|
]
|
|
@ -284,6 +284,11 @@
|
||||||
"name": "Rewrite as press release",
|
"name": "Rewrite as press release",
|
||||||
"prompt": "<instruction>Transform the text below into a professional press release:\n 1. Use formal, journalistic style\n 2. Include headline and dateline\n 3. Follow inverted pyramid structure\n Return only the press release format.</instruction>\n\n<text>{copilot-selection}</text>",
|
"prompt": "<instruction>Transform the text below into a professional press release:\n 1. Use formal, journalistic style\n 2. Include headline and dateline\n 3. Follow inverted pyramid structure\n Return only the press release format.</instruction>\n\n<text>{copilot-selection}</text>",
|
||||||
"showInContextMenu": false
|
"showInContextMenu": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Convertir a Tabla",
|
||||||
|
"prompt": "<instruction>Convert to a markdown obsidian compatible table the text below. .</instruction>\n\n<text>{copilot-selection}</text>",
|
||||||
|
"showInContextMenu": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -33,6 +33,5 @@
|
||||||
"useInternalPlugins": false
|
"useInternalPlugins": false
|
||||||
},
|
},
|
||||||
"01-Documentation/SIDEL/SIDEL - Passwords.md": "🔒",
|
"01-Documentation/SIDEL/SIDEL - Passwords.md": "🔒",
|
||||||
"01-Documentation/AI - IA - LLM - Artificial Intelligence": "🤖",
|
"01-Documentation/AI - IA - LLM - Artificial Intelligence": "🤖"
|
||||||
"01-Documentation": "LiHelp"
|
|
||||||
}
|
}
|
|
@ -1,24 +1,64 @@
|
||||||
{
|
{
|
||||||
"recentFiles": [
|
"recentFiles": [
|
||||||
{
|
{
|
||||||
"basename": "Conversión LAD a SCL Siemens",
|
"basename": "Radarr - Lidarr",
|
||||||
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Conversión LAD a SCL Siemens.md"
|
"path": "01-Documentation/Lidarr - Radarr/Radarr - Lidarr.md"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"basename": "Script Python DB to Excel",
|
"basename": "Shiki Plugin - Highlither - Syntax - Editor",
|
||||||
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Script Python DB to Excel.md"
|
"path": "01-Documentation/Obsidean/Shiki Plugin - Highlither - Syntax - Editor.md"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"basename": "Python Notes",
|
"basename": "60034 - Motor trifasico - Chingioli",
|
||||||
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Python Notes.md"
|
"path": "01-Documentation/Motors/Lenze/60034 - Motor trifasico - Chingioli.md"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"basename": "Visual Studio Notes",
|
"basename": "Pasted image 20250426010944",
|
||||||
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Visual Studio Notes.md"
|
"path": "01-Documentation/Lidarr - Radarr/adjuntos/Pasted image 20250426010944.png"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"basename": "Zero-Tier ONE - Lan NAT",
|
"basename": "Jellyfin en Synology DS220+",
|
||||||
"path": "01-Documentation/Routers/Zero-Tier ONE - Lan NAT.md"
|
"path": "01-Documentation/Synology/DS220+/Jellyfin en Synology DS220+.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Backups - Mikrotik",
|
||||||
|
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Análisis Comparativo de Routers MikroTik",
|
||||||
|
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Análisis Comparativo de Routers MikroTik.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "NAT Mikrotik",
|
||||||
|
"path": "01-Documentation/Routers/Mikrotik - Network Redes/NAT Mikrotik.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Estructura XML Detallada para Topología de Red en Exportaciones AML de TIA Portal",
|
||||||
|
"path": "01-Documentation/CAx AutomationML/Estructura XML Detallada para Topología de Red en Exportaciones AML de TIA Portal.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Especificación Formal del Formato CAx (AML)",
|
||||||
|
"path": "01-Documentation/CAx AutomationML/Especificación Formal del Formato CAx (AML).md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Mikrotik Scripts",
|
||||||
|
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik Scripts.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Mikrotik - Setup Commands for Layer 2 Wi-Fi Bridge",
|
||||||
|
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik - Setup Commands for Layer 2 Wi-Fi Bridge.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "EOip Vetromeccanica",
|
||||||
|
"path": "01-Documentation/Routers/Mikrotik - Network Redes/EOip Vetromeccanica.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "CAPsMAN",
|
||||||
|
"path": "01-Documentation/Routers/Mikrotik - Network Redes/CAPsMAN.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Bandwith control - Queues",
|
||||||
|
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Bandwith control - Queues.md"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"basename": "SAE196 - IO",
|
"basename": "SAE196 - IO",
|
||||||
|
@ -32,6 +72,94 @@
|
||||||
"basename": "AI Prompts useful",
|
"basename": "AI Prompts useful",
|
||||||
"path": "01-Documentation/AI - IA - LLM - Artificial Intelligence/AI Prompts useful.md"
|
"path": "01-Documentation/AI - IA - LLM - Artificial Intelligence/AI Prompts useful.md"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"basename": "Zero-Tier ONE - Lan NAT",
|
||||||
|
"path": "01-Documentation/Routers/Zero-Tier ONE - Lan NAT.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "SAE196_c0.2.XML_CAx_Export_Obsidian_Summary",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/Source/SAE196_c0.2.XML_CAx_Export_Obsidian_Summary.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "S7 Software Calls",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/MIXER/S7 Software Calls.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "COMPLETE_RESTART",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/Source/source/COMPLETE_RESTART.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "xref_calls_tree",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/Source/xref_calls_tree.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "_CYCL_EXC",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/Source/source/_CYCL_EXC.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Blender_Variables",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/Source/source/Blender_Variables.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Blender_Variables_Pers",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/Source/source/Blender_Variables_Pers.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "BlenderCtrl_ResetSPWord",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/Source/source/BlenderCtrl_ResetSPWord.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "BlenderCtrl_ProdModeInit",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/Source/source/BlenderCtrl_ProdModeInit.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Mixer - Notes",
|
||||||
|
"path": "01-Documentation/SIDEL/Master Mixer/Mixer - Notes.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Python Notes",
|
||||||
|
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Python Notes.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "SACOMEA - Default password",
|
||||||
|
"path": "01-Documentation/Vetromeccanica/Sacomea/SACOMEA - Default password.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Sacomea",
|
||||||
|
"path": "01-Documentation/Vetromeccanica/Sacomea/Sacomea.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Sacomea 9.4022 - Shibuya",
|
||||||
|
"path": "01-Documentation/Vetromeccanica/Sacomea/Sacomea 9.4022 - Shibuya.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Sacomea Help",
|
||||||
|
"path": "01-Documentation/Vetromeccanica/Sacomea/Sacomea Help.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Análisis Detallado OBs",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/MIXER/Documentacion/Análisis Detallado OBs.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "BlenderCtrl__Main",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/MIXER/Documentacion/BlenderCtrl__Main.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Análisis del Software PLC Mixer",
|
||||||
|
"path": "04-SIDEL/00 - MASTER/MIXER/Documentacion/Análisis del Software PLC Mixer.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Conversión LAD a SCL Siemens",
|
||||||
|
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Conversión LAD a SCL Siemens.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Script Python DB to Excel",
|
||||||
|
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Script Python DB to Excel.md"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"basename": "Visual Studio Notes",
|
||||||
|
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Visual Studio Notes.md"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"basename": "SAE196 - IO Adapted",
|
"basename": "SAE196 - IO Adapted",
|
||||||
"path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/SAE196 - IO Adapted.md"
|
"path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/SAE196 - IO Adapted.md"
|
||||||
|
@ -71,130 +199,6 @@
|
||||||
{
|
{
|
||||||
"basename": "SAE346 - IO from Electrical Diagram",
|
"basename": "SAE346 - IO from Electrical Diagram",
|
||||||
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - IO from Electrical Diagram.md"
|
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - IO from Electrical Diagram.md"
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Git - Start New Repository with Visual Studio Code - VS Code",
|
|
||||||
"path": "01-Documentation/GIT/Git - Start New Repository with Visual Studio Code - VS Code.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Notes - Git - Gitea",
|
|
||||||
"path": "01-Documentation/GIT/Notes - Git - Gitea.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "E5.007363 - Modifica O&U - SAE196 - Notes",
|
|
||||||
"path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/E5.007363 - Modifica O&U - SAE196 - Notes.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "WSL - Uninstall",
|
|
||||||
"path": "01-Documentation/Windows/WSL - Uninstall.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "on NUC",
|
|
||||||
"path": "01-Documentation/WSL Linux on Windows/on NUC.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Windows 10 Autologin",
|
|
||||||
"path": "01-Documentation/Windows/Windows 10 Autologin.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Wireguard",
|
|
||||||
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Wireguard.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Facturazion Electronica - Fatturazione Elecctronica",
|
|
||||||
"path": "01-Documentation/Facturazion/Facturazion Electronica - Fatturazione Elecctronica.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Riunione Endress&Hauser",
|
|
||||||
"path": "01-Documentation/Endress+Houser/Riunione Endress&Hauser.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Endress+Hauser WEB Access",
|
|
||||||
"path": "01-Documentation/Endress+Houser/Endress+Hauser WEB Access.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "SAE346 - Signals - CIP - Filler - Syrop",
|
|
||||||
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Signals - CIP - Filler - Syrop.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "RNF032 - Difference between Hardware on S7 and the Electrical scheme",
|
|
||||||
"path": "04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/RNF032 - Difference between Hardware on S7 and the Electrical scheme.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "S7 Software Calls",
|
|
||||||
"path": "04-SIDEL/00 - MASTER/MIXER/S7 Software Calls.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Documentación Promass 500 para Sistema Syrup",
|
|
||||||
"path": "01-Documentation/Endress+Houser/Syrup/Documentación Promass 500 para Sistema Syrup.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Promass 500 Documentation for CO2 System",
|
|
||||||
"path": "01-Documentation/Endress+Houser/CO2/Promass 500 Documentation for CO2 System.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Endress+Hauser Concentration Optional",
|
|
||||||
"path": "01-Documentation/Endress+Houser/Endress+Hauser Concentration Optional.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "FC622 - FC Scale Speed wGap",
|
|
||||||
"path": "03-VM/22 - 9.3841 - Sidel - Tilting/Software/FC622 - FC Scale Speed wGap.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "FB629 - FB Calculate Ramp",
|
|
||||||
"path": "03-VM/22 - 9.3841 - Sidel - Tilting/Software/FB629 - FB Calculate Ramp.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "FB623 - Tilting - FB Tilter",
|
|
||||||
"path": "03-VM/22 - 9.3841 - Sidel - Tilting/Software/FB623 - Tilting - FB Tilter.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Download Software",
|
|
||||||
"path": "01-Documentation/WEB/Download Software.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Parameters Comparative",
|
|
||||||
"path": "01-Documentation/Endress+Houser/Parameters Comparative.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Optional - Concentration measurement",
|
|
||||||
"path": "01-Documentation/Endress+Houser/Optional - Concentration measurement.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Promag 500 Documentation for Water System",
|
|
||||||
"path": "01-Documentation/Endress+Houser/Water/Promag 500 Documentation for Water System.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "UV UVX",
|
|
||||||
"path": "01-Documentation/Python/UV UVX.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Como usar PublicApiGenerator - Nuget - Documentator",
|
|
||||||
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Como usar PublicApiGenerator - Nuget - Documentator.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "Notes for Windows - Chris Titus Tool - Online - Offline",
|
|
||||||
"path": "01-Documentation/Windows/Notes for Windows - Chris Titus Tool - Online - Offline.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "E5.007299 - RNF032 - FDM",
|
|
||||||
"path": "04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/E5.007299 - RNF032 - FDM.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "FDM RNF032 E5.007299",
|
|
||||||
"path": "04-SIDEL/04 - E5.007299 - Modifica O&U - RNF032/FDM RNF032 E5.007299.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "5.007382-EXMU01UF - RVU008 - EQPT24731 - Notes",
|
|
||||||
"path": "04-SIDEL/03 - 5.007382-EXMU01UF - RVU008 - EQPT24731/5.007382-EXMU01UF - RVU008 - EQPT24731 - Notes.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "IM Siemens - Profibus - Comissioning",
|
|
||||||
"path": "01-Documentation/Siemens/IM Siemens - Profibus - Comissioning.md"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"basename": "SIDEL - Passwords",
|
|
||||||
"path": "01-Documentation/SIDEL/SIDEL - Passwords.md"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"omittedPaths": [],
|
"omittedPaths": [],
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"disabledLanguages": [],
|
||||||
|
"customThemeFolder": "",
|
||||||
|
"customLanguageFolder": "",
|
||||||
|
"theme": "dark-plus",
|
||||||
|
"preferThemeColors": true,
|
||||||
|
"inlineHighlighting": true
|
||||||
|
}
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"id": "shiki-highlighter",
|
||||||
|
"name": "Shiki Highlighter",
|
||||||
|
"version": "0.5.0",
|
||||||
|
"minAppVersion": "1.5.0",
|
||||||
|
"description": "Highlight code blocks with Shiki.",
|
||||||
|
"author": "Moritz Jung",
|
||||||
|
"authorUrl": "https://www.moritzjung.dev",
|
||||||
|
"fundingUrl": "https://github.com/sponsors/mProjectsCode",
|
||||||
|
"isDesktopOnly": false
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
body {
|
||||||
|
--shiki-code-background: var(--code-background);
|
||||||
|
--shiki-code-normal: var(--text-muted);
|
||||||
|
--shiki-code-comment: var(--text-faint);
|
||||||
|
--shiki-code-function: var(--color-green);
|
||||||
|
--shiki-code-important: var(--color-orange);
|
||||||
|
--shiki-code-keyword: var(--color-pink);
|
||||||
|
--shiki-code-property: var(--color-cyan);
|
||||||
|
--shiki-code-punctuation: var(--text-muted);
|
||||||
|
--shiki-code-string: var(--color-yellow);
|
||||||
|
--shiki-code-value: var(--color-purple);
|
||||||
|
|
||||||
|
/*--shiki-code-border-color: var(--background-modifier-border);*/
|
||||||
|
--shiki-code-block-border-color: transparent;
|
||||||
|
--shiki-code-block-border-radius: var(--code-radius);
|
||||||
|
--shiki-code-block-border-width: 0px; /* this has to have a unit */
|
||||||
|
|
||||||
|
--shiki-code-block-spacing: var(--p-spacing);
|
||||||
|
|
||||||
|
--shiki-highlight-red: rgba(var(--color-red-rgb), 0.5);
|
||||||
|
--shiki-highlight-green: rgba(var(--color-green-rgb), 0.5);
|
||||||
|
--shiki-highlight-neutral: var(--shiki-code-normal);
|
||||||
|
--shiki-highlight-red-background: rgba(var(--color-red-rgb), 0.1);
|
||||||
|
--shiki-highlight-green-background: rgba(var(--color-green-rgb), 0.1);
|
||||||
|
--shiki-highlight-neutral-background: rgba(var(--mono-rgb-100), 0.05);
|
||||||
|
|
||||||
|
--shiki-terminal-dots-color: var(--text-faint);
|
||||||
|
|
||||||
|
--shiki-tooltip-background: var(--background-modifier-message);
|
||||||
|
--shiki-tooltip-text-color: #fafafa;
|
||||||
|
|
||||||
|
--shiki-gutter-border-color: var(--background-modifier-border);
|
||||||
|
--shiki-gutter-border-width: var(--border-width);
|
||||||
|
--shiki-gutter-text-color: var(--text-faint);
|
||||||
|
--shiki-gutter-text-color-highlight: var(--shiki-code-normal);
|
||||||
|
|
||||||
|
--shiki-active-tab-border-width: 2px;
|
||||||
|
--shiki-active-tab-border-color: var(--shiki-highlight-neutral);
|
||||||
|
}
|
||||||
|
|
||||||
|
.edit-block-button {
|
||||||
|
pointer-events: all;
|
||||||
|
|
||||||
|
& > svg {
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable ligatures in code blocks, as they can cause incorrect highlighting */
|
||||||
|
div.expressive-code {
|
||||||
|
font-variant-ligatures: no-contextual;
|
||||||
|
|
||||||
|
& > figure > pre {
|
||||||
|
/* Fix for shimmering focus */
|
||||||
|
margin: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > figure.frame {
|
||||||
|
&.has-title > figcaption.header::before {
|
||||||
|
pointer-events: all !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > figcaption.header {
|
||||||
|
z-index: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > div.copy {
|
||||||
|
/* Move the copy button to the bottom right */
|
||||||
|
inset-block-end: calc(var(--ec-brdWd) + var(--ec-uiPadInl) / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.markdown-preview-view {
|
||||||
|
div.expressive-code {
|
||||||
|
margin-block: var(--shiki-code-block-spacing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide the frontmatter code block in reading view again */
|
||||||
|
div.markdown-preview-view > div > div.mod-header + div > div.block-language-yaml.shiki-hide-in-reading-mode {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.shiki-bold {
|
||||||
|
font-weight: var(--bold-weight, 600);
|
||||||
|
}
|
||||||
|
span.shiki-italic {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
span.shiki-ul {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Settings tab */
|
||||||
|
.setting-item-control input.shiki-custom-theme-folder {
|
||||||
|
min-width: 250px;
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
Prism.languages.scl = {
|
||||||
|
'comment': [
|
||||||
|
{
|
||||||
|
pattern: /\(\*[\s\S]*?\*\)/,
|
||||||
|
greedy: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: //.*$/m,
|
||||||
|
greedy: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'string': {
|
||||||
|
pattern: /'(?:[^'\\\r\n]|\\(?:.|[^"\\]))*'/,
|
||||||
|
greedy: true
|
||||||
|
},
|
||||||
|
'keyword': /\b(?:PROGRAM|END_PROGRAM|FUNCTION|END_FUNCTION|FUNCTION_BLOCK|END_FUNCTION_BLOCK|VAR|VAR_INPUT|VAR_OUTPUT|VAR_IN_OUT|VAR_TEMP|END_VAR|IF|THEN|ELSE|ELSIF|END_IF|CASE|OF|ELSE|END_CASE|FOR|TO|BY|DO|END_FOR|WHILE|DO|END_WHILE|REPEAT|UNTIL|END_REPEAT|RETURN|EXIT|CONTINUE|TYPE|END_TYPE|STRUCT|END_STRUCT|ARRAY|OF|BOOL|BYTE|WORD|DWORD|LWORD|SINT|INT|DINT|LINT|USINT|UINT|UDINT|ULINT|REAL|LREAL|TIME|DATE|TIME_OF_DAY|DATE_AND_TIME|STRING|CHAR|WSTRING|WCHAR)\b/i,
|
||||||
|
'boolean': /\b(?:TRUE|FALSE)\b/i,
|
||||||
|
'operator': /(?:S?[<>]=?|[:=]{1,2}|AND|OR|XOR|NOT|\*\*|\+\+|--|\?|\/|@)/i,
|
||||||
|
'number': /\b(?:16#[0-9A-F]+|2#[01]+|8#[0-7]+|0|[1-9][0-9]*(?:\.[0-9]+)?(?:E[+-]?[0-9]+)?)\b/i,
|
||||||
|
'function': /\b[A-Za-z_][A-Za-z0-9_]*(?=\s*\()/,
|
||||||
|
'punctuation': /[.,;()[\]{}]/
|
||||||
|
};
|
||||||
|
|
||||||
|
// Alias para asegurar que ```scl funcione correctamente
|
||||||
|
Prism.languages.structured_control_language = Prism.languages.scl;
|
|
@ -64,35 +64,63 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "7a1cc58dd51a902b",
|
"id": "3541e5b49347ea9f",
|
||||||
"type": "leaf",
|
|
||||||
"state": {
|
|
||||||
"type": "webviewer",
|
|
||||||
"state": {
|
|
||||||
"url": "https://docs.zerotier.com/route-between-phys-and-virt/",
|
|
||||||
"title": "Route between ZeroTier and Physical Networks | ZeroTier Documentation",
|
|
||||||
"mode": "webview"
|
|
||||||
},
|
|
||||||
"icon": "globe-2",
|
|
||||||
"title": "Route between ZeroTier and Physical Networks | ZeroTier Documentation"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "90a7c8f7a7e89fc2",
|
|
||||||
"type": "leaf",
|
"type": "leaf",
|
||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Conversión LAD a SCL Siemens.md",
|
"file": "01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "Conversión LAD a SCL Siemens"
|
"title": "Backups - Mikrotik"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "0ed41719d7b4a30f",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "markdown",
|
||||||
|
"state": {
|
||||||
|
"file": "01-Documentation/Synology/DS220+/Jellyfin en Synology DS220+.md",
|
||||||
|
"mode": "source",
|
||||||
|
"source": false
|
||||||
|
},
|
||||||
|
"icon": "lucide-file",
|
||||||
|
"title": "Jellyfin en Synology DS220+"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "c22862d453c5da16",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "markdown",
|
||||||
|
"state": {
|
||||||
|
"file": "01-Documentation/Lidarr - Radarr/Radarr - Lidarr.md",
|
||||||
|
"mode": "source",
|
||||||
|
"source": false
|
||||||
|
},
|
||||||
|
"icon": "lucide-file",
|
||||||
|
"title": "Radarr - Lidarr"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cef542b5bca9a368",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "markdown",
|
||||||
|
"state": {
|
||||||
|
"file": "01-Documentation/Obsidean/Shiki Plugin - Highlither - Syntax - Editor.md",
|
||||||
|
"mode": "source",
|
||||||
|
"source": false
|
||||||
|
},
|
||||||
|
"icon": "lucide-file",
|
||||||
|
"title": "Shiki Plugin - Highlither - Syntax - Editor"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"currentTab": 5
|
"currentTab": 6
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "vertical"
|
"direction": "vertical"
|
||||||
|
@ -287,54 +315,54 @@
|
||||||
"obsidian-importer:Open Importer": false
|
"obsidian-importer:Open Importer": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "90a7c8f7a7e89fc2",
|
"active": "c22862d453c5da16",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Conversión LAD a SCL Siemens.md",
|
"01-Documentation/Obsidean/Shiki Plugin - Highlither - Syntax - Editor.md",
|
||||||
"07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Conversión LAD a SCL Siemens.md",
|
"01-Documentation/Lidarr - Radarr/Radarr - Lidarr.md",
|
||||||
"07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Script Python DB to Excel.md",
|
"01-Documentation/Motors/Lenze/60034 - Motor trifasico - Chingioli.md",
|
||||||
"07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos en Python/Python Notes.md",
|
"01-Documentation/Lidarr - Radarr/adjuntos/Pasted image 20250426010944.png",
|
||||||
"07 - Desarrolo de Proyectos - Scripts - Visual Studio/Visual Studio Notes.md",
|
"01-Documentation/Lidarr - Radarr/adjuntos/Pasted image 20250426011027.png",
|
||||||
"01-Documentation/Routers/Zero-Tier ONE - Lan NAT.md",
|
"01-Documentation/Lidarr - Radarr/adjuntos/Pasted image 20250426011003.png",
|
||||||
|
"01-Documentation/Lidarr - Radarr/adjuntos",
|
||||||
|
"01-Documentation/Synology/DS220+/Jellyfin en Synology DS220+.md",
|
||||||
|
"01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md",
|
||||||
|
"01-Documentation/Synology/DS220+",
|
||||||
|
"01-Documentation/Synology",
|
||||||
|
"01-Documentation/Routers/Mikrotik - Network Redes/Análisis Comparativo de Routers MikroTik.md",
|
||||||
|
"01-Documentation/Routers/Mikrotik - Network Redes/NAT Mikrotik.md",
|
||||||
|
"01-Documentation/CAx AutomationML/Estructura XML Detallada para Topología de Red en Exportaciones AML de TIA Portal.md",
|
||||||
|
"01-Documentation/CAx AutomationML/Especificación Formal del Formato CAx (AML).md",
|
||||||
|
"01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik Scripts.md",
|
||||||
|
"01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik - Setup Commands for Layer 2 Wi-Fi Bridge.md",
|
||||||
|
"01-Documentation/Routers/Mikrotik - Network Redes/EOip Vetromeccanica.md",
|
||||||
|
"01-Documentation/Routers/Mikrotik - Network Redes/CAPsMAN.md",
|
||||||
|
"01-Documentation/Routers/Mikrotik - Network Redes/Bandwith control - Queues.md",
|
||||||
|
"01-Documentation/Lidarr - Radarr",
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/SAE196 - IO.md",
|
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/SAE196 - IO.md",
|
||||||
"04-SIDEL/00 - MASTER/MIXER/SIDEL - Mixer - Equivalences.md",
|
"04-SIDEL/00 - MASTER/MIXER/SIDEL - Mixer - Equivalences.md",
|
||||||
"01-Documentation/AI - IA - LLM - Artificial Intelligence/AI Prompts useful.md",
|
"01-Documentation/AI - IA - LLM - Artificial Intelligence/AI Prompts useful.md",
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/SAE196 - IO Adapted.md",
|
"01-Documentation/Routers/Zero-Tier ONE - Lan NAT.md",
|
||||||
"04-SIDEL/00 - MASTER/MIXER/SIDEL - Mixer - Master - IO Tags.md",
|
"04-SIDEL/00 - MASTER/Source/SAE196_c0.2.XML_CAx_Export_Obsidian_Summary.md",
|
||||||
"01-Documentation/Endress+Houser/Heartbeat Technology Implementation.md",
|
"01-Documentation/CAx AutomationML",
|
||||||
"01-Documentation/Endress+Houser/Endress+Hauser Software.md",
|
"04-SIDEL/00 - MASTER/MIXER/S7 Software Calls.md",
|
||||||
"01-Documentation/SIDEL/SIDEL - FLD.md",
|
"04-SIDEL/00 - MASTER/Source/SAE196_c0.2.XML_CAx_Summary.md",
|
||||||
|
"04-SIDEL/00 - MASTER/Source/source/COMPLETE_RESTART.md",
|
||||||
|
"04-SIDEL/00 - MASTER/Source/xref_calls_tree.md",
|
||||||
|
"04-SIDEL/00 - MASTER/Source/source/_CYCL_EXC.md",
|
||||||
|
"04-SIDEL/00 - MASTER/Source/source/Blender_Variables.md",
|
||||||
|
"04-SIDEL/00 - MASTER/Source/source/Blender_Variables_Pers.md",
|
||||||
|
"DB/Shiki/vscode-scl.json",
|
||||||
|
"DB/Shiki/vscode-scl.json.opdownload",
|
||||||
|
"DB/Shiki",
|
||||||
|
"DB/Nueva carpeta",
|
||||||
|
"04-SIDEL/00 - MASTER/Source/source",
|
||||||
"01-Documentation/SIDEL/adjuntos/Pasted image 20250417164020.png",
|
"01-Documentation/SIDEL/adjuntos/Pasted image 20250417164020.png",
|
||||||
"01-Documentation/AI - IA - LLM - Artificial Intelligence/MCP.md",
|
|
||||||
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Software adaptation from Master - Notes.md",
|
|
||||||
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Process diagram.md",
|
|
||||||
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Master adaptation to compile.md",
|
|
||||||
"04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - IO from Electrical Diagram.md",
|
|
||||||
"01-Documentation/GIT/Git - Start New Repository with Visual Studio Code - VS Code.md",
|
|
||||||
"01-Documentation/GIT/Notes - Git - Gitea.md",
|
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/E5.007363 - Modifica O&U - SAE196 - Notes.md",
|
|
||||||
"01-Documentation/Windows/WSL - Uninstall.md",
|
|
||||||
"01-Documentation/WSL Linux on Windows/on NUC.md",
|
|
||||||
"01-Documentation/Windows/Windows 10 Autologin.md",
|
|
||||||
"01-Documentation/Routers/Mikrotik - Network Redes/Wireguard.md",
|
|
||||||
"01-Documentation/Endress+Houser/adjuntos/Pasted image 20250414150025.png",
|
"01-Documentation/Endress+Houser/adjuntos/Pasted image 20250414150025.png",
|
||||||
"01-Documentation/Endress+Houser/Comparative.xlsx",
|
|
||||||
"01-Documentation/Endress+Houser/Endress+Hauser_Parameters_Comparison.csv",
|
|
||||||
"01-Documentation/Endress+Houser/Water/adjuntos/500DP_parameter_Mixer.csv",
|
|
||||||
"01-Documentation/Endress+Houser/Water/adjuntos/500DP_parameter_FactoryValues.csv",
|
|
||||||
"01-Documentation/Endress+Houser/Water/adjuntos/500DP_parameter_2025-04-14_1159.csv",
|
|
||||||
"01-Documentation/Endress+Houser/Water/adjuntos/500DP_parameter_2025-04-10_1508.csv",
|
|
||||||
"01-Documentation/Endress+Houser/Water/adjuntos",
|
|
||||||
"01-Documentation/Endress+Houser/Water/Nueva carpeta",
|
|
||||||
"01-Documentation/Endress+Houser/CO2/adjuntos/500DP_parameter_FactoryValues.csv",
|
|
||||||
"01-Documentation/Endress+Houser/CO2/adjuntos/500DP_parameter_Mixer.csv",
|
|
||||||
"01-Documentation/Endress+Houser/adjuntos/Pasted image 20250411154541.png",
|
"01-Documentation/Endress+Houser/adjuntos/Pasted image 20250411154541.png",
|
||||||
"01-Documentation/Endress+Houser/adjuntos/Pasted image 20250411154441.png",
|
"01-Documentation/Endress+Houser/adjuntos/Pasted image 20250411154441.png",
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/post_login.png",
|
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/post_login.png",
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/initial_page.png",
|
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/initial_page.png",
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/before_click_xpath_Menu.png",
|
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/before_click_xpath_Menu.png",
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/before_click_xpath_Measured values.png",
|
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/after_click_xpath_Menu.png",
|
|
||||||
"04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/resultados/screenshots/after_click_xpath_Measured values.png",
|
|
||||||
"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",
|
||||||
|
|
|
@ -0,0 +1,121 @@
|
||||||
|
|
||||||
|
[Audio en Ingles](https://g.co/gemini/share/a32f1d5db77d)
|
||||||
|
|
||||||
|
# Especificación Formal del Formato CAx (AML) en Siemens TIA Portal para la Representación de Topologías de Red
|
||||||
|
|
||||||
|
## 1. Introducción a AutomationML (AML) y CAEX
|
||||||
|
|
||||||
|
### 1.1. AutomationML (AML) como Formato Estandarizado de Intercambio de Datos (IEC 62714)
|
||||||
|
|
||||||
|
Automation Markup Language (AutomationML o AML) se define como un lenguaje de modelado de datos abierto, neutral, basado en XML y orientado a objetos, diseñado para el almacenamiento y el intercambio de información de ingeniería de plantas. Su propósito fundamental es interconectar el heterogéneo panorama de herramientas de ingeniería modernas utilizadas en diversas disciplinas, como la ingeniería mecánica de plantas, el diseño eléctrico, el desarrollo de HMI (Human-Machine Interface), la programación de PLC (Programmable Logic Controller) y el control de robots.
|
||||||
|
|
||||||
|
La motivación detrás del desarrollo de AML radica en la necesidad de superar los cuellos de botella en el intercambio de datos a lo largo del ciclo de vida de los sistemas de producción, mejorar la eficiencia de la ingeniería y respaldar las tendencias de digitalización como la Industria 4.0. AML aborda estos desafíos proporcionando un formato estandarizado que facilita un intercambio de datos consistente y sin pérdidas entre diferentes herramientas y fases del ciclo de vida, desde el diseño inicial hasta la operación y el mantenimiento.
|
||||||
|
|
||||||
|
AML está estandarizado internacionalmente bajo la serie IEC 62714. Es un estándar abierto, independiente del proveedor y de uso gratuito (royalty-free), lo que ha fomentado su adopción en la industria. Su aplicabilidad se extiende a lo largo de todo el ciclo de vida de la planta y abarca diversos dominios industriales, demostrando su valía tanto en grandes empresas como en PYMEs. Una de las claves de su aceptación es su enfoque pragmático: en lugar de definir un formato completamente nuevo y monolítico, AML integra y orquesta estándares XML ya establecidos y probados en sus respectivos dominios. Esta estrategia reduce la barrera de entrada para los desarrolladores de herramientas y aprovecha la experiencia y el soporte existentes para los formatos integrados, contribuyendo significativamente a su adopción industrial.
|
||||||
|
|
||||||
|
### 1.2. CAEX (IEC 62424) como la Columna Vertebral Topológica
|
||||||
|
|
||||||
|
El núcleo de la representación topológica dentro de AML es CAEX (Computer Aided Engineering eXchange), estandarizado por la norma IEC 62424. CAEX actúa como el formato de nivel superior dentro de la arquitectura distribuida de AML, siendo responsable de almacenar la información de ingeniería orientada a objetos, como las jerarquías de la planta, las topologías de objetos, sus propiedades y las relaciones entre ellos.
|
||||||
|
|
||||||
|
Es crucial entender que AML _utiliza_ CAEX como su base estructural, complementándolo con otros formatos estándar para aspectos específicos: COLLADA (ISO/PAS 17506) para geometría y cinemática, y PLCopen XML (IEC 61131-10) para lógica, comportamiento y secuencias. La propia especificación normativa de AML (IEC 62714-1) es notablemente concisa (solo 32 páginas en la versión de 2018), precisamente porque se apoya en estos estándares existentes en lugar de redefinirlos.
|
||||||
|
|
||||||
|
La naturaleza orientada a objetos y jerárquica de CAEX es fundamental para la capacidad de AML de modelar sistemas complejos, como las redes de automatización industrial. Permite representar no solo los dispositivos individuales, sino también la estructura misma de la red, las subredes, y las conexiones físicas y lógicas de una manera organizada y estructurada. Esta capacidad intrínseca de CAEX para manejar jerarquías y relaciones es esencial para lograr el objetivo de generar un árbol de nodos conectados por red.
|
||||||
|
|
||||||
|
### 1.3. Conceptos Clave de CAEX Relevantes para la Topología
|
||||||
|
|
||||||
|
Para comprender cómo se modela la topología de red en AML, es esencial familiarizarse con los siguientes elementos y conceptos fundamentales de CAEX:
|
||||||
|
|
||||||
|
- **Bibliotecas (`SystemUnitClassLib`, `RoleClassLib`, `InterfaceClassLib`, `AttributeLib`):** Definen plantillas reutilizables y semántica para los objetos de ingeniería.
|
||||||
|
- `SystemUnitClassLib`: Define tipos de componentes físicos o lógicos (por ejemplo, un modelo específico de PLC, un tipo de red Profinet). Contiene `SystemUnitClass` que describen las características de un tipo de objeto.
|
||||||
|
- `RoleClassLib`: Define roles funcionales abstractos, independientes de una implementación técnica concreta (por ejemplo, "Robot", "Sensor", "Switch"). Asignan una semántica funcional a los objetos.
|
||||||
|
- `InterfaceClassLib`: Define tipos de interfaces o puntos de conexión (por ejemplo, "ProfinetPort", "PowerInput", "CommunicationPhysicalSocket"). Contiene `InterfaceClass`.
|
||||||
|
- `AttributeLib`: Define tipos de atributos reutilizables, introducida en CAEX 3.0 (utilizado en AML Edición 2).
|
||||||
|
- **Jerarquía de Instancias (`InstanceHierarchy`, `InternalElement`):** Representa la estructura real y específica de la planta o proyecto.
|
||||||
|
- `InstanceHierarchy` (IH): Es el elemento raíz que contiene todas las instancias concretas de los objetos (dispositivos, redes, módulos) del proyecto modelado.
|
||||||
|
- `InternalElement` (IE): Representa un objeto individual dentro de la jerarquía (un dispositivo, una red, un módulo, una carpeta organizativa). Los IEs pueden anidarse para formar la estructura jerárquica. Cada IE típicamente referencia su clase base (`RefBaseSystemUnitPath`), su rol (`RefBaseRoleClassPath`) y contiene interfaces y atributos específicos de la instancia.1
|
||||||
|
- **Interfaces (`ExternalInterface`):** Representan los puntos de conexión (puertos) en un `InternalElement`. Cada `ExternalInterface` (EI) tiene un nombre y un `ID` único, y normalmente referencia una `InterfaceClass` de una biblioteca a través del atributo `RefBaseClassPath`.1
|
||||||
|
- **Atributos (`Attribute`):** Definen las propiedades o características de un `InternalElement` o de una `ExternalInterface` (por ejemplo, nombre del dispositivo, fabricante, dirección IP, dirección MAC, velocidad de transmisión). Los atributos tienen un nombre (`Name`), un tipo de dato (`AttributeDataType`, típicamente tipos de datos XML Schema como `xs:string`, `xs:integer`, `xs:double`), y un valor (`Value`). Pueden anidarse para representar estructuras de datos complejas y pueden hacer referencia a semántica adicional (`RefSemantic`).
|
||||||
|
- **Conexiones (`InternalLink`):** Representan las conexiones físicas (cables) o lógicas _entre_ elementos `ExternalInterface` dentro de la misma `InstanceHierarchy`. Un `InternalLink` (IL) conecta dos interfaces asociadas mediante los atributos `RefPartnerSideA` y `RefPartnerSideB`, que contienen los `ID`s únicos de las `ExternalInterface` conectadas.1
|
||||||
|
|
||||||
|
## 2. Representación Estandarizada de Redes de Comunicación en AML (IEC 62714-5)
|
||||||
|
|
||||||
|
### 2.1. Visión General de IEC 62714 Parte 5: Comunicación
|
||||||
|
|
||||||
|
La Parte 5 de la norma IEC 62714 está específicamente dedicada al modelado de sistemas de comunicación dentro del marco de AutomationML. Su objetivo es definir de manera estandarizada cómo se representan las redes de comunicación, los dispositivos, las conexiones, las direcciones (como las direcciones IP), los protocolos y otros artefactos relacionados dentro de la estructura AML/CAEX. Esto permite el intercambio sin pérdidas de esta información crítica entre diversas herramientas de ingeniería a lo largo del ciclo de vida del sistema.
|
||||||
|
|
||||||
|
La necesidad de esta parte específica surge de la importancia creciente de los sistemas de comunicación en la automatización moderna, especialmente con la descentralización y el uso extensivo de tecnologías como Profinet y Profibus, que tienen requisitos estrictos de calidad, seguridad y protección. Casos de uso típicos incluyen la transferencia de configuraciones de red desde herramientas de planificación o programación de PLC a herramientas de configuración de dispositivos, puesta en marcha virtual, documentación o diagnóstico. La existencia de una parte dedicada del estándar y bibliotecas asociadas subraya que el modelado de redes es un caso de uso primario y bien definido para AML, no una simple extensión ad-hoc. Esto aumenta la probabilidad de una representación consistente entre las herramientas que implementan el estándar, como TIA Portal.
|
||||||
|
|
||||||
|
### 2.2. Principios de Modelado para Estructuras de Red
|
||||||
|
|
||||||
|
AML/CAEX, según lo detallado en IEC 62714-5 y documentos relacionados, permite modelar tanto las vistas lógicas como físicas de los sistemas de comunicación.
|
||||||
|
|
||||||
|
- **Objetos de Red:** Los componentes de la red, como dispositivos (PLCs, dispositivos de E/S), switches, routers, cables, etc., se representan como instancias de `InternalElement` (IE) dentro de la `InstanceHierarchy`.
|
||||||
|
- **Topologías de Red:** Las diferentes topologías (bus, estrella, anillo, malla) se modelan utilizando la estructura jerárquica de los `InternalElement` (por ejemplo, anidando dispositivos dentro de un IE que representa la red o subred) y las conexiones explícitas definidas por los `InternalLink` entre las interfaces de los dispositivos.
|
||||||
|
- **Vistas Lógicas vs. Físicas:** La estructura permite separar los aspectos físicos de los lógicos. Un `InternalElement` puede representar un dispositivo físico, mientras que sus `ExternalInterface` representan los puertos físicos. Los parámetros lógicos de la red (como la dirección IP) se adjuntan como `Attribute` a la `ExternalInterface` correspondiente. Las conexiones (`InternalLink`) pueden representar tanto el cableado físico como las asociaciones lógicas entre estas interfaces. Esta separación es ventajosa para modelar escenarios complejos donde un único dispositivo físico puede tener múltiples interfaces o roles en diferentes redes lógicas.
|
||||||
|
|
||||||
|
El Whitepaper de Comunicación de AutomationML y las bibliotecas asociadas sirvieron como precursores o acompañan a la norma IEC 62714-5, proporcionando directrices y elementos reutilizables para este modelado.2
|
||||||
|
|
||||||
|
### 2.3. Bibliotecas Estándar para Comunicación
|
||||||
|
|
||||||
|
Para asegurar la consistencia semántica y la reutilización, IEC 62714-5 se apoya en bibliotecas de clases especializadas. Las bibliotecas `CommunicationRoleClassLib` y `CommunicationInterfaceClassLib`, disponibles en los recursos de AutomationML.org, proporcionan definiciones estándar para roles y tipos de interfaz en el dominio de la comunicación.
|
||||||
|
|
||||||
|
- **Roles (`CommunicationRoleClassLib`):** Las instancias de `InternalElement` que representan dispositivos de red (por ejemplo, un switch Profinet, un dispositivo Profibus) referenciarían roles definidos en esta biblioteca (o una similar específica del proveedor) mediante el atributo `RefBaseRoleClassPath`. Por ejemplo, un IE que representa un switch podría referenciar a `NetworkComponentsRoleClassLib/Switch`.
|
||||||
|
- **Interfaces (`CommunicationInterfaceClassLib`):** Las instancias de `ExternalInterface` que representan puertos de red (por ejemplo, un puerto Ethernet RJ45, un conector D-Sub 9 para Profibus) referenciarían clases definidas en esta biblioteca mediante `RefBaseClassPath`. Ejemplos observados incluyen `CommunicationInterfaceClassLib/CommunicationPhysicalSocket` o `CommunicationInterfaceClassLib/SwitchCommunicationPhysicalSocket`.
|
||||||
|
|
||||||
|
El uso de estas bibliotecas estandarizadas asegura que los diferentes sistemas de ingeniería interpreten de manera uniforme la función y el tipo de los componentes de red modelados.
|
||||||
|
|
||||||
|
### 2.4. Atributos Estándar para Componentes y Parámetros de Red
|
||||||
|
|
||||||
|
Los parámetros específicos de la red, que son cruciales para la configuración y el análisis, se modelan como elementos `Attribute` dentro del CAEX. Estos atributos suelen estar anidados dentro del `InternalElement` que representa el dispositivo o, más comúnmente y lógicamente, dentro de la `ExternalInterface` que representa el puerto o punto de conexión específico.
|
||||||
|
|
||||||
|
IEC 62714-5 confirma explícitamente el modelado de "direcciones (por ejemplo, dirección IP)" y otros parámetros de comunicación. Ejemplos concretos extraídos de archivos AML y discusiones sobre intercambio de datos (como entre EPLAN y TIA Portal) revelan atributos comunes 3:
|
||||||
|
|
||||||
|
- **Dirección IP:** Probablemente modelada con un atributo llamado `ip` o similar, con tipo de dato `xs:string`.
|
||||||
|
- **Dirección MAC:** Probablemente modelada con un atributo llamado `mac` o similar, con tipo de dato `xs:string`.
|
||||||
|
- **Máscara de Subred:** Probablemente modelada con un atributo llamado `netmask` o similar, con tipo de dato `xs:string`.
|
||||||
|
- **Nombre del Dispositivo Profinet:** Atributo para el nombre lógico del dispositivo en la red Profinet.
|
||||||
|
- **Dirección Profibus:** Atributo para la dirección numérica del dispositivo en una red Profibus.
|
||||||
|
- **Identificadores Específicos (Contexto Siemens/EPLAN):** Atributos como `Station ID` (identificador de estación) y `MasterSystemID` (identificador del sistema maestro, >100 para Ethernet) pueden ser relevantes en exportaciones de TIA Portal.3
|
||||||
|
|
||||||
|
La semántica precisa de estos atributos puede reforzarse mediante el uso del elemento `RefSemantic` dentro del `Attribute`, que puede apuntar a definiciones en bibliotecas de atributos (`AttributeLib`) o diccionarios externos como ECLASS.
|
||||||
|
|
||||||
|
Aunque existen estos estándares y bibliotecas, es importante notar que el nivel de detalle capturado puede variar entre diferentes herramientas o configuraciones de exportación. Las exportaciones de TIA Portal pueden incluir atributos estándar, pero también podrían utilizar atributos específicos de Siemens o depender de clases de rol/unidad de sistema definidas en bibliotecas propias de Siemens. Esto se infiere de la documentación de intercambio con EPLAN, que menciona propiedades específicas como "PLC type designation" (número de pedido de Siemens).3 Por lo tanto, una comprensión completa puede requerir el análisis de archivos AML reales exportados desde TIA Portal.
|
||||||
|
|
||||||
|
## 3. Funcionalidad de Exportación CAx/AML de Siemens TIA Portal
|
||||||
|
|
||||||
|
### 3.1. Uso de AML por TIA Portal para Intercambio de Datos (CAx)
|
||||||
|
|
||||||
|
Siemens TIA Portal (Totally Integrated Automation Portal) implementa la funcionalidad de exportación e importación de datos de ingeniería utilizando el estándar AutomationML, refiriéndose a ella comúnmente como "Exportar/Importar datos CAx". Los archivos generados tienen la extensión `.aml`. En este contexto, CAx (Computer Aided eXchange) se refiere específicamente a la aplicación de AML para el intercambio de datos de configuración de hardware y redes entre TIA Portal y otras herramientas de ingeniería o instancias de TIA Portal.
|
||||||
|
|
||||||
|
Este mecanismo facilita flujos de trabajo de ingeniería integrados. Por ejemplo, una configuración de hardware y red creada inicialmente en TIA Selection Tool (TST) puede exportarse como un archivo AML e importarse en TIA Portal para continuar con la programación y configuración detallada. De manera similar, los datos de TIA Portal pueden exportarse a AML para su uso en herramientas ECAD como EPLAN Electric P8 para la creación de esquemas eléctricos, y luego potencialmente reimportarse a TIA Portal. La exportación también puede usarse para transferir datos a herramientas de simulación o documentación.
|
||||||
|
|
||||||
|
### 3.2. Información Incluida en la Exportación CAx de TIA Portal
|
||||||
|
|
||||||
|
Según la documentación de Siemens, la exportación CAx estándar desde TIA Portal incluye la siguiente información relevante para la topología de red:
|
||||||
|
|
||||||
|
- **Configuración de Hardware:** Dispositivos (PLCs, HMIs básicos, módulos de E/S, etc.), sus sub-módulos, racks y su disposición jerárquica. Es importante destacar que, por lo general, la exportación CAx estándar **no incluye la asignación detallada de parámetros** de los dispositivos. Sin embargo, existen excepciones, como la posibilidad de exportar/importar parámetros de dispositivos IO-Link mediante un Add-in específico ("CAxPCT").
|
||||||
|
- **Estructura del Proyecto:** Las jerarquías de carpetas (grupos) creadas en el árbol del proyecto de TIA Portal se conservan en la exportación y se restauran en la importación.
|
||||||
|
- **Configuración de Red:**
|
||||||
|
- La asociación de cada dispositivo a una subred específica.
|
||||||
|
- La definición de sistemas Profinet IO y sistemas maestros Profibus DP.
|
||||||
|
- La topología de la red, es decir, cómo están interconectados los dispositivos.
|
||||||
|
- **Direcciones:**
|
||||||
|
- Direcciones de los dispositivos relevantes para la red (por ejemplo, nombre de dispositivo Profinet, dirección Profibus, dirección IP).
|
||||||
|
- Áreas de direcciones de entradas y salidas de los módulos.
|
||||||
|
|
||||||
|
Esta lista confirma que la información central requerida para reconstruir la topología de la red (dispositivos, sus interfaces, sus direcciones y sus interconexiones) está contemplada dentro del alcance de la exportación CAx de TIA Portal.
|
||||||
|
|
||||||
|
### 3.3. Características y Requisitos Relevantes de TIA Portal
|
||||||
|
|
||||||
|
Para utilizar la funcionalidad de exportación/importación CAx, especialmente de forma automatizada, hay algunos aspectos a considerar:
|
||||||
|
|
||||||
|
- **TIA Portal Openness:** La funcionalidad CAx a menudo requiere que el componente TIA Portal Openness esté instalado. Openness es la interfaz de programación de aplicaciones (API) de TIA Portal que permite la automatización de tareas de ingeniería, incluido el acceso programático a la exportación e importación CAx. Puede ser necesario disponer de la versión adecuada de TIA Portal y las licencias correspondientes.
|
||||||
|
- **API y Herramientas:** Openness expone un servicio llamado `CaxProvider` que permite a las aplicaciones externas (escritas en.NET) invocar mediante programación las operaciones de exportación e importación de AML. Además, Siemens proporciona una herramienta de línea de comandos, `Siemens.Automation.Cax.AmiHost.exe`, que permite realizar exportaciones CAx mediante scripts, especificando el proyecto, opcionalmente un dispositivo específico, y la ruta del archivo AML de salida.
|
||||||
|
- **Limitaciones:** Es importante ser consciente de que la exportación CAx puede tener ciertas limitaciones, que pueden variar según la versión de TIA Portal. La documentación menciona que ciertos tipos de dispositivos (como HMIs complejas, drives) o configuraciones (conexiones puerto a puerto, multi-CPUs, sistemas H) podrían no ser exportados o importados completamente en todos los escenarios.
|
||||||
|
- **Add-ins Específicos:** Para funcionalidades extendidas, como la exportación de parámetros IO-Link vía AML, puede ser necesario instalar y activar Add-ins específicos de TIA Portal, como "CAxPCT".
|
||||||
|
|
||||||
|
En resumen, aunque la exportación CAx estándar cubre la topología de red, la parametrización detallada generalmente queda fuera de su alcance. Si se requiere información más allá de la estructura de hardware, la topología y las direcciones básicas, podrían ser necesarios otros métodos de exportación o herramientas adicionales. Sin embargo, para el objetivo principal de obtener la estructura de red, la exportación CAx es la función adecuada y documentada por Siemens.
|
||||||
|
|
||||||
|
## 4:
|
||||||
|
***
|
||||||
|
[[Estructura XML Detallada para Topología de Red en Exportaciones AML de TIA Portal]]
|
|
@ -0,0 +1,203 @@
|
||||||
|
## 4. Estructura XML Detallada para Topología de Red en Exportaciones AML de TIA Portal
|
||||||
|
|
||||||
|
Basándose en los estándares AML/CAEX y la información disponible sobre las exportaciones de TIA Portal, se puede inferir la estructura XML probable utilizada para representar la topología de red.
|
||||||
|
|
||||||
|
### 4.1. Mapeo de Conceptos de TIA Portal a Elementos CAEX
|
||||||
|
|
||||||
|
- **Estructura del Proyecto (Carpetas):** Se representan mediante elementos `InternalElement` anidados dentro de la `InstanceHierarchy` raíz, reflejando la estructura del árbol del proyecto en TIA Portal. Estos IEs "carpeta" podrían tener un `RefBaseRoleClassPath` o `RefBaseSystemUnitPath` que indique su naturaleza organizativa.
|
||||||
|
- **Redes/Subredes (Ej. Profinet_1):** Probablemente representadas como instancias `InternalElement` de nivel superior dentro de la `InstanceHierarchy`, o anidadas directamente bajo la raíz. Estos IEs de red harían referencia a una `SystemUnitClass` o `RoleClass` que indique el tipo de red (por ejemplo, algo como "ProfinetSystem", "ProfibusMasterSystem", posiblemente de bibliotecas Siemens) a través de `RefBaseSystemUnitPath` o `RefBaseRoleClassPath`.
|
||||||
|
- **Dispositivos/Nodos (PLCs, Dispositivos IO, Switches):** Representados como instancias `InternalElement` anidadas _dentro_ de su respectivo `InternalElement` de red/subred (o quizás bajo una carpeta de dispositivos). Cada IE de dispositivo tendrá atributos `Name` (el nombre en TIA Portal) y `ID` (un identificador único global, GUID).1
|
||||||
|
- Referenciarán su tipo de hardware específico a través de `RefBaseSystemUnitPath`, apuntando a una `SystemUnitClass` (por ejemplo, `PLCSystemUnitClassLib/Siemens S7-1200`, o más probablemente, a una clase dentro de bibliotecas específicas de Siemens cargadas en el archivo AML).
|
||||||
|
- Podrían referenciar un rol funcional a través de `RefBaseRoleClassPath` (ej. `AutomationMLBaseRoleClassLib/ControllerDevice`, `AutomationMLBaseRoleClassLib/IODevice`, `NetworkComponentsRoleClassLib/Switch`).
|
||||||
|
- Propiedades específicas de Siemens, como el número de pedido ("PLC type designation"), probablemente se almacenen como elementos `Attribute` dentro del IE del dispositivo.3
|
||||||
|
- **Interfaces/Puertos de Dispositivo (Puertos Ethernet, Conectores Profibus):** Representados como elementos `ExternalInterface` anidados dentro de su `InternalElement` padre (el dispositivo). Cada EI tendrá atributos `Name` (ej. "X1", "PROFINET interface_1", "P1 R" 3) y `ID` (GUID único).1
|
||||||
|
- Referenciarán su tipo de interfaz a través de `RefBaseClassPath`, apuntando a una `InterfaceClass` (ej. `CommunicationInterfaceClassLib/CommunicationPhysicalSocket`).
|
||||||
|
- Los parámetros de red (IP, MAC, etc.) se almacenan como elementos `Attribute` anidados dentro del `ExternalInterface`.1
|
||||||
|
- **Conexiones (Cables):** Representadas por elementos `InternalLink`, típicamente definidos como hijos del `InternalElement` que representa la red o subred, o potencialmente a un nivel superior dentro de la `InstanceHierarchy`.1
|
||||||
|
- Cada `InternalLink` conecta dos elementos `ExternalInterface` utilizando los atributos `RefPartnerSideA` y `RefPartnerSideB`, que contienen los `ID`s de las EIs conectadas, definiendo así explícitamente el enlace físico o lógico.
|
||||||
|
|
||||||
|
La combinación de `InternalElement` anidados, `ExternalInterface`, `Attribute` y `InternalLink` proporciona una estructura bien definida y analizable para representar la topología de la red dentro del marco AML/CAEX, apoyando directamente la generación de un árbol de nodos.1
|
||||||
|
|
||||||
|
### 4.2. Ejemplo de Estructura Jerárquica (Conceptual)
|
||||||
|
|
||||||
|
A continuación se muestra un fragmento XML conceptual que ilustra la estructura probable:
|
||||||
|
|
||||||
|
XML
|
||||||
|
|
||||||
|
```
|
||||||
|
<CAEXFile xmlns="http://www.dke.de/CAEX/3.0" SchemaVersion="3.0">
|
||||||
|
<InstanceHierarchy Name="ProjectHierarchy">
|
||||||
|
<InternalElement Name="Profinet_1" ID="{GUID-Network-1}" RefBaseRoleClassPath="CommunicationRoleClassLib/ProfinetSystem">
|
||||||
|
<InternalElement Name="PLC_1" ID="{GUID-PLC-1}" RefBaseSystemUnitPath="SiemensSUCLib/S7-1500_CPU_XYZ">
|
||||||
|
<RoleRequirements RefBaseRoleClassPath="AutomationMLBaseRoleClassLib/ControllerDevice"/>
|
||||||
|
<Attribute Name="SiemensOrderNumber" AttributeDataType="xs:string">
|
||||||
|
<Value>6ES7...</Value>
|
||||||
|
</Attribute>
|
||||||
|
<ExternalInterface Name="X1" ID="{GUID-PLC1-IF1}" RefBaseClassPath="CommunicationInterfaceClassLib/CommunicationPhysicalSocket">
|
||||||
|
<Attribute Name="ip" AttributeDataType="xs:string">
|
||||||
|
<Value>192.168.0.1</Value>
|
||||||
|
</Attribute>
|
||||||
|
<Attribute Name="mac" AttributeDataType="xs:string">
|
||||||
|
<Value>00-1C-06-...</Value>
|
||||||
|
</Attribute>
|
||||||
|
<Attribute Name="netmask" AttributeDataType="xs:string">
|
||||||
|
<Value>255.255.255.0</Value>
|
||||||
|
</Attribute>
|
||||||
|
<Attribute Name="DeviceName" AttributeDataType="xs:string">
|
||||||
|
<Value>plc_1</Value> </Attribute>
|
||||||
|
</ExternalInterface>
|
||||||
|
</InternalElement>
|
||||||
|
<InternalElement Name="IO_Device_1" ID="{GUID-IO-1}" RefBaseSystemUnitPath="SiemensSUCLib/ET200SP_IM_ABC">
|
||||||
|
<RoleRequirements RefBaseRoleClassPath="AutomationMLBaseRoleClassLib/IODevice"/>
|
||||||
|
<Attribute Name="SiemensOrderNumber" AttributeDataType="xs:string">
|
||||||
|
<Value>6ES7...</Value>
|
||||||
|
</Attribute>
|
||||||
|
<ExternalInterface Name="P1" ID="{GUID-IO1-IF1}" RefBaseClassPath="CommunicationInterfaceClassLib/CommunicationPhysicalSocket">
|
||||||
|
<Attribute Name="ip" AttributeDataType="xs:string">
|
||||||
|
<Value>192.168.0.10</Value>
|
||||||
|
</Attribute>
|
||||||
|
<Attribute Name="mac" AttributeDataType="xs:string">
|
||||||
|
<Value>08-00-06-...</Value>
|
||||||
|
</Attribute>
|
||||||
|
<Attribute Name="netmask" AttributeDataType="xs:string">
|
||||||
|
<Value>255.255.255.0</Value>
|
||||||
|
</Attribute>
|
||||||
|
<Attribute Name="DeviceName" AttributeDataType="xs:string">
|
||||||
|
<Value>io_device_1</Value> </Attribute>
|
||||||
|
</ExternalInterface>
|
||||||
|
</InternalElement>
|
||||||
|
<InternalLink Name="Link_PLC1_X1_to_IO1_P1" ID="{GUID-Link-1}" RefPartnerSideA="{GUID-PLC1-IF1}" RefPartnerSideB="{GUID-IO1-IF1}"/>
|
||||||
|
</InternalElement>
|
||||||
|
</InstanceHierarchy>
|
||||||
|
</CAEXFile>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3. Representación de Tipos de Red (Profinet/Profibus)
|
||||||
|
|
||||||
|
La distinción entre diferentes tipos de redes (Profinet, Profibus, ASi, etc.) se realiza probablemente a través de la referencia a clases específicas en las bibliotecas:
|
||||||
|
|
||||||
|
- El `InternalElement` que representa la red o subred utilizará un `RefBaseRoleClassPath` o `RefBaseSystemUnitPath` que identifique semánticamente el tipo de red (por ejemplo, conteniendo "Profinet", "ProfibusDP" en la ruta).
|
||||||
|
- Los dispositivos (`InternalElement`) y sus interfaces (`ExternalInterface`) dentro de esa red contendrán `Attribute`s específicos para ese protocolo. Por ejemplo, un dispositivo en una red Profinet tendrá atributos para su "DeviceName" (nombre Profinet) y dirección IP/MAC, mientras que un dispositivo en una red Profibus tendrá un atributo para su dirección Profibus.3
|
||||||
|
|
||||||
|
### 4.4. Representación de Dispositivos/Nodos
|
||||||
|
|
||||||
|
Cada dispositivo físico o lógico (PLC, módulo IO, switch, etc.) se representa como un `InternalElement`. Los identificadores clave son:
|
||||||
|
|
||||||
|
- `Name`: El nombre asignado en TIA Portal.
|
||||||
|
- `ID`: Un GUID único para esa instancia de dispositivo en el archivo AML.
|
||||||
|
- `RefBaseSystemUnitPath`: Enlace al tipo de hardware específico definido en una `SystemUnitClassLib` (probablemente una biblioteca de Siemens).
|
||||||
|
- `RefBaseRoleClassPath`: Enlace opcional a un rol funcional definido en una `RoleClassLib`.
|
||||||
|
- `Attribute`s: Propiedades específicas como el número de pedido de Siemens (`SiemensOrderNumber` o similar basado en "PLC type designation" 3), `StationID` 3, etc.
|
||||||
|
|
||||||
|
### 4.5. Representación de Interfaces/Puertos de Dispositivo
|
||||||
|
|
||||||
|
Cada punto de conexión de red en un dispositivo se representa como un `ExternalInterface` anidado dentro del `InternalElement` del dispositivo. Identificadores clave:
|
||||||
|
|
||||||
|
- `Name`: Nombre del puerto (ej. "X1", "P1").
|
||||||
|
- `ID`: GUID único para esa instancia de interfaz.
|
||||||
|
- `RefBaseClassPath`: Enlace al tipo de interfaz definido en una `InterfaceClassLib` (probablemente `CommunicationInterfaceClassLib` o una específica de Siemens).
|
||||||
|
|
||||||
|
Los parámetros de red cruciales se almacenan como elementos `Attribute` hijos del `ExternalInterface`. La siguiente tabla resume los atributos más probables basados en la evidencia:
|
||||||
|
|
||||||
|
**Tabla 1: Atributos Clave para Interfaces de Red en AML (Basado en Estándares y Ejemplos)**
|
||||||
|
|
||||||
|
| | | | | |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
|**Nombre del Atributo (Probable)**|**Descripción**|**Tipo de Dato (Probable)**|**Ubicación Típica**|**Fuentes de Evidencia**|
|
||||||
|
|`ip` / `IPAddress` / `Address`|Dirección IP|`xs:string`|Hijo de `<ExternalInterface>`||
|
||||||
|
|`mac` / `MACAddress`|Dirección MAC|`xs:string`|Hijo de `<ExternalInterface>`||
|
||||||
|
|`netmask` / `SubnetMask`|Máscara de subred|`xs:string`|Hijo de `<ExternalInterface>`||
|
||||||
|
|`DeviceName` / `ProfinetDeviceName`|Nombre del dispositivo Profinet|`xs:string`|Hijo de `<ExternalInterface>`|Inferido de|
|
||||||
|
|`ProfibusAddress`|Dirección Profibus|`xs:integer`/`xs:string`|Hijo de `<ExternalInterface>`|Inferido de|
|
||||||
|
|`StationID`|Identificador de estación (específico del contexto)|`xs:integer`/`xs:string`|Hijo de `<InternalElement>`|3|
|
||||||
|
|`MasterSystemID`|ID del sistema maestro (Controlador IO / Maestro DP)|`xs:integer`|Hijo de `<InternalElement>`|3|
|
||||||
|
|`SiemensOrderNumber` / `PLCTypeDesignation`|Número de pedido de Siemens para el dispositivo/módulo|`xs:string`|Hijo de `<InternalElement>`|3|
|
||||||
|
|`PlugDesignation`|Designación del conector físico (ej. "P1 R")|`xs:string`|Hijo de `<ExternalInterface>`|3|
|
||||||
|
|`BusInterfaceName`|Nombre de la interfaz de bus (ej. "PROFINET interface_1")|`xs:string`|Hijo de `<ExternalInterface>`|3|
|
||||||
|
|
||||||
|
_Nota: La ubicación exacta (en `InternalElement` vs. `ExternalInterface`) y los nombres de algunos atributos pueden variar ligeramente según la implementación específica de Siemens y la versión de TIA Portal._
|
||||||
|
|
||||||
|
Los identificadores únicos (`ID`) asignados a cada `InternalElement` y `ExternalInterface` son absolutamente críticos. Permiten establecer las conexiones de forma inequívoca mediante los elementos `InternalLink`. El análisis del archivo AML dependerá en gran medida de la capacidad de resolver estas referencias de ID para reconstruir la topología.
|
||||||
|
|
||||||
|
### 4.6. Representación de Conexiones
|
||||||
|
|
||||||
|
Las conexiones físicas o lógicas entre puertos se definen explícitamente mediante elementos `InternalLink`.
|
||||||
|
|
||||||
|
- Cada `InternalLink` tiene un `Name` y un `ID` únicos.
|
||||||
|
- La conexión se define mediante los atributos `RefPartnerSideA` y `RefPartnerSideB`. Cada uno de estos atributos contiene el `ID` (GUID) de uno de los elementos `ExternalInterface` que participan en la conexión.
|
||||||
|
- Al analizar el archivo, encontrar un `InternalLink` permite identificar directamente qué dos puertos (y por lo tanto, qué dos dispositivos) están conectados.
|
||||||
|
- Estos elementos `InternalLink` suelen encontrarse como hijos del `InternalElement` que representa la red o subred a la que pertenecen las interfaces conectadas.
|
||||||
|
|
||||||
|
Aunque la estructura central (IE, EI, IL, Attribute) es estándar CAEX, los valores específicos de `RefBase...Path` que apuntan a las bibliotecas y los nombres exactos de algunos atributos (más allá de los básicos como `ip`, `mac`) dependerán de las bibliotecas AML utilizadas por TIA Portal (bibliotecas AML estándar como `CommunicationInterfaceClassLib` o bibliotecas específicas de Siemens).3 Un análisis exitoso requiere identificar qué bibliotecas y atributos utiliza realmente TIA Portal en su exportación, lo que puede requerir examinar archivos exportados reales.
|
||||||
|
|
||||||
|
## 5. Análisis (Parsing) de AML para Generación de Árbol de Red
|
||||||
|
|
||||||
|
### 5.1. Estrategia General
|
||||||
|
|
||||||
|
El análisis de los archivos AML exportados por TIA Portal para extraer la topología de red se puede abordar utilizando bibliotecas estándar de procesamiento XML disponibles en la mayoría de los lenguajes de programación (como Python, C#, Java). La estrategia general implica:
|
||||||
|
|
||||||
|
1. Cargar el archivo `.aml` exportado por TIA Portal.
|
||||||
|
2. Navegar por el Modelo de Objetos del Documento (DOM) XML siguiendo la estructura CAEX descrita anteriormente.
|
||||||
|
3. Identificar y extraer la información relevante sobre redes, dispositivos, interfaces, parámetros y conexiones.
|
||||||
|
4. Construir una representación interna (por ejemplo, objetos o estructuras de datos) de la topología de red.
|
||||||
|
|
||||||
|
La naturaleza estructurada de CAEX, con identificadores únicos y enlaces explícitos, hace que este proceso sea factible y relativamente directo con las herramientas XML estándar.
|
||||||
|
|
||||||
|
### 5.2. Identificación de Elementos Clave
|
||||||
|
|
||||||
|
El proceso de análisis debe centrarse en localizar y procesar los siguientes elementos dentro del archivo AML:
|
||||||
|
|
||||||
|
1. **Raíz de Instancias:** Localizar el elemento `<InstanceHierarchy>`. Este es el contenedor principal de la configuración específica del proyecto. El análisis debe centrarse principalmente en este elemento y sus descendientes. Las secciones de bibliotecas (`<SystemUnitClassLib>`, etc.) definen los _tipos_, pero la `InstanceHierarchy` contiene las _instancias_ reales y sus conexiones.
|
||||||
|
2. **Redes/Subredes:** Iterar a través de los `InternalElement` hijos directos de `<InstanceHierarchy>` (o anidados según la estructura del proyecto). Identificar aquellos que representan redes basándose en su `Name` o, de forma más robusta, en su `RefBaseRoleClassPath` o `RefBaseSystemUnitPath` (buscando identificadores como "ProfinetSystem", "ProfibusMasterSystem").
|
||||||
|
3. **Dispositivos:** Dentro de cada `InternalElement` de red (o en la jerarquía de carpetas correspondiente), buscar recursivamente los `InternalElement` que representan dispositivos. Para cada uno, extraer su `Name`, `ID`, `RefBaseSystemUnitPath` (para tipo de hardware) y los `Attribute`s relevantes (ej. `SiemensOrderNumber`, `StationID`).
|
||||||
|
4. **Interfaces:** Dentro de cada `InternalElement` de dispositivo, encontrar todos los elementos `ExternalInterface`. Extraer su `Name`, `ID`, `RefBaseClassPath` (para tipo de interfaz) y, crucialmente, iterar sobre sus `Attribute`s hijos para extraer los parámetros de red (IP, MAC, Netmask, Nombre Profinet, etc., consultando la Tabla 1).
|
||||||
|
5. **Conexiones:** Localizar todos los elementos `InternalLink` (probablemente hijos del IE de red o en un nivel superior). Para cada uno, extraer los valores de los atributos `RefPartnerSideA` y `RefPartnerSideB`. Estos son los `ID`s de las dos `ExternalInterface` que están conectadas.
|
||||||
|
|
||||||
|
### 5.3. Construcción del Árbol de Nodos
|
||||||
|
|
||||||
|
Una vez extraída la información del XML, el siguiente paso es construir la representación de la topología deseada:
|
||||||
|
|
||||||
|
1. **Definir Estructuras de Datos:** Es fundamental diseñar clases u otras estructuras de datos en el lenguaje de programación elegido para representar los conceptos de Red (`Network`), Dispositivo (`Device`), Interfaz (`Interface`) y Conexión (`Connection`). La clase `Interface` debe poder almacenar los atributos de parámetros de red extraídos (IP, MAC, etc.). La clase `Connection` debe enlazar dos objetos `Interface`.
|
||||||
|
2. **Crear Mapas de ID:** Durante el análisis de dispositivos e interfaces (pasos 3 y 4 anteriores), poblar diccionarios o mapas hash que permitan una búsqueda rápida de objetos `Device` e `Interface` a partir de su `ID` (GUID). Esto es esencial para resolver las referencias en los `InternalLink`s.
|
||||||
|
3. **Procesar Dispositivos e Interfaces:** Iterar sobre los elementos XML correspondientes, crear instancias de los objetos `Device` e `Interface` definidos en el paso 1, almacenar sus atributos y poblar los mapas de ID.
|
||||||
|
4. **Procesar Conexiones:** Iterar sobre los elementos `InternalLink`. Para cada uno, usar los `ID`s de `RefPartnerSideA` y `RefPartnerSideB` para buscar los objetos `Interface` correspondientes en los mapas creados en el paso 2. Crear un objeto `Connection` que enlace estos dos objetos `Interface`.
|
||||||
|
5. **Ensamblar la Estructura:** Organizar los objetos `Device` bajo sus respectivos objetos `Network` (identificados en el paso 2 del análisis). Las conexiones establecidas en el paso 4 forman las aristas del grafo o árbol de red. El resultado es una representación en memoria de la topología de red que puede ser consultada o visualizada según sea necesario.
|
||||||
|
|
||||||
|
### 5.4. Manejo de Posibles Desafíos
|
||||||
|
|
||||||
|
- **Archivos Grandes:** Proyectos de TIA Portal muy extensos pueden generar archivos AML de gran tamaño. El análisis basado en DOM puede consumir mucha memoria. En tales casos, considerar el uso de analizadores SAX (Simple API for XML), aunque esto puede complicar la resolución de referencias de ID, ya que requiere mantener el estado manualmente.
|
||||||
|
- **Espacios de Nombres (Namespaces):** El archivo AML utilizará al menos el espacio de nombres CAEX (`http://www.dke.de/CAEX/3.0`). Asegurarse de que el analizador XML esté configurado para manejar correctamente los espacios de nombres al buscar elementos.
|
||||||
|
- **Referencias a Bibliotecas:** Si bien el análisis de la `InstanceHierarchy` es suficiente para la topología, comprender las clases referenciadas (`RefBase...Path`) puede añadir contexto semántico valioso. Si es necesario, se pueden analizar también las secciones de bibliotecas (`<SystemUnitClassLib>`, etc.) para obtener detalles sobre los tipos de dispositivos e interfaces.
|
||||||
|
- **Diferencias entre Versiones:** La estructura exacta o los atributos utilizados por TIA Portal podrían tener ligeras variaciones entre diferentes versiones (V15, V16, V17, V18, V19, etc.). Es recomendable probar el analizador con exportaciones de las versiones específicas de TIA Portal que se necesiten soportar. Basar el análisis en elementos y atributos estandarizados (como `ip`, `mac` de) en lugar de depender excesivamente de detalles observados en un solo ejemplo proporcionará mayor robustez frente a futuras actualizaciones, siempre que Siemens mantenga la conformidad con los estándares AML.
|
||||||
|
|
||||||
|
## 6. Conclusión y Recursos Adicionales
|
||||||
|
|
||||||
|
### 6.1. Resumen de Hallazgos
|
||||||
|
|
||||||
|
El análisis confirma que Siemens TIA Portal utiliza el formato estándar AutomationML (AML), basado en CAEX (IEC 62424), para su funcionalidad de exportación CAx. Esta exportación incluye la información necesaria para reconstruir la topología de red de un proyecto, abarcando la configuración de hardware, la estructura de red (Profinet, Profibus), las asociaciones de dispositivos a subredes, las direcciones de los dispositivos (IP, MAC, Profibus, etc.) y las interconexiones.
|
||||||
|
|
||||||
|
La estructura XML se basa en elementos CAEX clave: `InstanceHierarchy` para la configuración del proyecto, `InternalElement` para representar redes, carpetas y dispositivos, `ExternalInterface` para los puertos de los dispositivos (conteniendo atributos para parámetros como la dirección IP), y `InternalLink` para definir explícitamente las conexiones entre interfaces mediante referencias a sus `ID`s únicos.
|
||||||
|
|
||||||
|
Esta estructura bien definida, respaldada por los estándares IEC 62714 (especialmente la Parte 5 para comunicación) e IEC 62424, es adecuada para el análisis programático mediante herramientas XML estándar, permitiendo la extracción de datos y la generación del árbol de nodos conectados por red deseado. Si bien la estructura central es estándar, los detalles semánticos específicos (nombres de clases en bibliotecas, nombres de atributos específicos de Siemens) pueden requerir la consulta de documentación de Siemens o el análisis de archivos de exportación reales. En general, existe una alta confianza en que la exportación AML de TIA Portal contiene la información necesaria en un formato analizable.
|
||||||
|
|
||||||
|
### 6.2. Recomendaciones
|
||||||
|
|
||||||
|
Para desarrollar una herramienta o script que analice los archivos AML de TIA Portal y genere un árbol de topología de red, se recomienda:
|
||||||
|
|
||||||
|
1. **Utilizar Bibliotecas XML Estándar:** Aprovechar las capacidades de análisis DOM o SAX disponibles en el lenguaje de programación elegido.
|
||||||
|
2. **Enfocarse en `InstanceHierarchy`:** Centrar el análisis en esta sección del archivo AML, ya que contiene la configuración específica del proyecto.
|
||||||
|
3. **Gestionar IDs Únicos:** Implementar un mecanismo (como mapas hash) para almacenar y buscar eficientemente `InternalElement`s y `ExternalInterface`s por su atributo `ID`, ya que esto es crucial para resolver las conexiones definidas en los `InternalLink`s.
|
||||||
|
4. **Extraer Atributos Relevantes:** Identificar y extraer los `Attribute`s que contienen los parámetros de red necesarios (IP, MAC, Netmask, Nombre Profinet, Dirección Profibus, etc.), prestando atención a los nombres de atributo probablemente utilizados (ver Tabla 1).
|
||||||
|
5. **Validar con Exportaciones Reales:** Probar y validar el analizador con archivos `.aml` generados por las versiones específicas de TIA Portal de interés para asegurar la compatibilidad y manejar posibles variaciones.
|
||||||
|
6. **Diseñar Estructuras de Datos:** Crear un modelo de datos interno claro (clases/structs) para representar Redes, Dispositivos, Interfaces y Conexiones, facilitando la reconstrucción y el uso posterior de la topología extraída.
|
||||||
|
|
||||||
|
### 6.3. Recursos Adicionales
|
||||||
|
|
||||||
|
Para una comprensión más profunda y detalles definitivos, se recomienda consultar las siguientes fuentes:
|
||||||
|
|
||||||
|
- **AutomationML e.V.:** El sitio web oficial (www.automationml.org) ofrece acceso a las especificaciones de AML (incluyendo whitepapers y recomendaciones de aplicación como las de Comunicación y Configuración de Proyectos), bibliotecas de clases estándar, herramientas (como el Editor AML) y otra documentación.
|
||||||
|
- **Normas IEC:** Adquirir las normas oficiales IEC 62714 (especialmente Parte 1: Arquitectura y Requisitos Generales, y Parte 5: Comunicación) e IEC 62424 (CAEX) proporciona la especificación formal y definitiva.
|
||||||
|
- **Siemens Industry Online Support (SIOS):** El portal de soporte de Siemens (support.industry.siemens.com) contiene documentación específica de TIA Portal sobre la funcionalidad de exportación/importación CAx, TIA Portal Openness, ejemplos de aplicación y notas técnicas.
|
||||||
|
- **GitHub:** Pueden existir repositorios relevantes, como los del propio consorcio AutomationML (para motores de análisis como AMLEngine o ejemplos) u otros desarrolladores que trabajen con TIA Portal Openness y AML.4
|
||||||
|
|
||||||
|
Consultar estas fuentes permitirá obtener tanto la base teórica de los estándares como los detalles prácticos de la implementación específica de Siemens en TIA Portal.
|
|
@ -0,0 +1,125 @@
|
||||||
|
***
|
||||||
|
|
||||||
|
### qbittorrent - Descargas
|
||||||
|
***
|
||||||
|
|
||||||
|
| /volume2/data/torrents | /data/torrents |
|
||||||
|
| ------------------------ | -------------- |
|
||||||
|
| /volume2/Media/Series | /series |
|
||||||
|
| /volume2/Media/Peliculas | /movies |
|
||||||
|
| /volume2/Media/Musica | /music |
|
||||||
|
|
||||||
|
### downloadstation - Descargas
|
||||||
|
***
|
||||||
|
/volume2/data/torrents
|
||||||
|
|
||||||
|
### lidarr - Musica
|
||||||
|
***
|
||||||
|
|
||||||
|
| Source Path | Destination Path |
|
||||||
|
| ---------------------- | ---------------- |
|
||||||
|
| /volume2/data/torrents | /data/torrents |
|
||||||
|
| /volume2/Media/Musica | /music |
|
||||||
|
|
||||||
|
### radarr - Peliculas : 7878
|
||||||
|
***
|
||||||
|
|
||||||
|
| Source Path | Destination Path |
|
||||||
|
| -------------------------------------------------------------- | -------------------------------- |
|
||||||
|
| /volume2/data/torrents | /data/torrents |
|
||||||
|
| /volume2/Media/Peliculas | /movies |
|
||||||
|
| API | 0896fe49dbb646a8b3b6e8ed0b747095 |
|
||||||
|
| [Radarr](https://radarr.casaparma.dscloud.me/settings/general) | |
|
||||||
|
|
||||||
|
### Whisper : 9005 - Audio a Texto
|
||||||
|
***
|
||||||
|
|
||||||
|
| Source Path | Destination Path |
|
||||||
|
| ----------------------------- | ---------------- |
|
||||||
|
| /volume1/docker/whisper/cache | /root/.cache/ |
|
||||||
|
|
||||||
|
### Bazarr : 6767 - Subtitulos
|
||||||
|
***
|
||||||
|
|
||||||
|
| Source Path | Destination Path |
|
||||||
|
| ----------------------------- | ---------------- |
|
||||||
|
| /volume2/Media/Peliculas | /movies |
|
||||||
|
| /volume1/docker/bazarr/config | /config |
|
||||||
|
|
||||||
|
### Sonarr : 8989 - Series de Tv
|
||||||
|
***
|
||||||
|
|
||||||
|
| Source Path | Destination Path |
|
||||||
|
| -------------------------------------------------------------------- | -------------------------------- |
|
||||||
|
| /volume2/data/torrents | /data/torrents |
|
||||||
|
| /volume2/Media/Series | /series |
|
||||||
|
| /volume1/docker/sonarr/config | /config |
|
||||||
|
| API | 98f6f62c667946beb60d1f11b20e7fc8 |
|
||||||
|
| [sonarr.casaparma.dscloud.me/](https://sonarr.casaparma.dscloud.me/) | |
|
||||||
|
|
||||||
|
|
||||||
|
### Prowlarr - Gestor de indices
|
||||||
|
***
|
||||||
|
[Login - Prowlarr](https://prowlarr.casaparma.dscloud.me)
|
||||||
|
|
||||||
|
### jellyfin - Media Server
|
||||||
|
***
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -d --name=tdarr \
|
||||||
|
-p 8265:8265 \
|
||||||
|
-p 8266:8266 \
|
||||||
|
-v /volume2/Media/Peliculas:/movies \
|
||||||
|
-v /volume1/docker/tdarr/config:/config \
|
||||||
|
-v /volume2/Media/Musica:/music \
|
||||||
|
-v /volume1/docker/jellyfin/cache:/cache \
|
||||||
|
-v /volume2/Media/Series:/series \
|
||||||
|
-e TZ=Europe/Roma \
|
||||||
|
-e PUID=1033 \
|
||||||
|
-e PGID=100 \
|
||||||
|
--group-add 937 \
|
||||||
|
--device /dev/dri/renderD128:/dev/dri/renderD128 \
|
||||||
|
--device /dev/dri/card0:/dev/dri/card0 \
|
||||||
|
--restart always \
|
||||||
|
ghcr.io/haveagitgat/tdarr:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
![[Pasted image 20250426011027.png]]
|
||||||
|
![[Pasted image 20250426010944.png|750]]
|
||||||
|
![[Pasted image 20250426011003.png]]
|
||||||
|
|
||||||
|
| Source Path | Destination Path |
|
||||||
|
| ------------------------ | ---------------- |
|
||||||
|
| /volume2/Media/Peliculas | /movies |
|
||||||
|
| /volume2/Media/Musica | /music |
|
||||||
|
| /volume2/Media/Series | /series |
|
||||||
|
|
||||||
|
|
||||||
|
### Tdarr
|
||||||
|
***
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -d --name=tdarr \
|
||||||
|
-p 8265:8265 \
|
||||||
|
-p 8266:8266 \
|
||||||
|
-v /volume2/Media/Peliculas:/movies \
|
||||||
|
-v /volume1/docker/tdarr/config:/config \
|
||||||
|
-v /volume2/Media/Musica:/music \
|
||||||
|
-v /volume1/docker/jellyfin/cache:/cache \
|
||||||
|
-v /volume2/Media/Series:/series \
|
||||||
|
-e TZ=Europe/Roma \
|
||||||
|
-e PUID=1033 \
|
||||||
|
-e PGID=100 \
|
||||||
|
--group-add 937 \
|
||||||
|
--device /dev/dri/renderD128:/dev/dri/renderD128 \
|
||||||
|
--device /dev/dri/card0:/dev/dri/card0 \
|
||||||
|
--restart always \
|
||||||
|
ghcr.io/haveagitgat/tdarr:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
| Source Path | Destination Path |
|
||||||
|
| ------------------------ | ---------------- |
|
||||||
|
| /volume2/Media/Peliculas | /movies |
|
||||||
|
| /volume2/Media/Musica | /music |
|
||||||
|
| /volume2/Media/Series | /series |
|
Binary file not shown.
After Width: | Height: | Size: 45 KiB |
Binary file not shown.
After Width: | Height: | Size: 71 KiB |
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
|
@ -0,0 +1,230 @@
|
||||||
|
|
||||||
|
[Languages \| Shiki](https://shiki.matsu.io/languages#special-languages)
|
||||||
|
## Bundled Languages[](https://shiki.matsu.io/languages#bundled-languages)
|
||||||
|
|
||||||
|
Language grammars listed below are re-distributed via [`tm-grammars`](https://github.com/shikijs/textmate-grammars-themes/tree/main/packages/tm-grammars) into the `shiki` package.
|
||||||
|
|
||||||
|
| Name | ID | Alias | Preview |
|
||||||
|
| --------------------------- | -------------------- | ------------------------- | ------- |
|
||||||
|
| ABAP | `abap` | | |
|
||||||
|
| ActionScript | `actionscript-3` | | |
|
||||||
|
| Ada | `ada` | | |
|
||||||
|
| Angular HTML | `angular-html` | | |
|
||||||
|
| Angular TypeScript | `angular-ts` | | |
|
||||||
|
| Apache Conf | `apache` | | |
|
||||||
|
| Apex | `apex` | | |
|
||||||
|
| APL | `apl` | | |
|
||||||
|
| AppleScript | `applescript` | | |
|
||||||
|
| Ara | `ara` | | |
|
||||||
|
| AsciiDoc | `asciidoc` | `adoc` | |
|
||||||
|
| Assembly | `asm` | | |
|
||||||
|
| Astro | `astro` | | |
|
||||||
|
| AWK | `awk` | | |
|
||||||
|
| Ballerina | `ballerina` | | |
|
||||||
|
| Batch File | `bat` | `batch` | |
|
||||||
|
| Beancount | `beancount` | | |
|
||||||
|
| Berry | `berry` | `be` | |
|
||||||
|
| BibTeX | `bibtex` | | |
|
||||||
|
| Bicep | `bicep` | | |
|
||||||
|
| Blade | `blade` | | |
|
||||||
|
| 1C (Enterprise) | `bsl` | `1c` | |
|
||||||
|
| C | `c` | | |
|
||||||
|
| Cadence | `cadence` | `cdc` | |
|
||||||
|
| Cairo | `cairo` | | |
|
||||||
|
| Clarity | `clarity` | | |
|
||||||
|
| Clojure | `clojure` | `clj` | |
|
||||||
|
| CMake | `cmake` | | |
|
||||||
|
| COBOL | `cobol` | | |
|
||||||
|
| CODEOWNERS | `codeowners` | | |
|
||||||
|
| CodeQL | `codeql` | `ql` | |
|
||||||
|
| CoffeeScript | `coffee` | `coffeescript` | |
|
||||||
|
| Common Lisp | `common-lisp` | `lisp` | |
|
||||||
|
| Coq | `coq` | | |
|
||||||
|
| C++ | `cpp` | `c++` | |
|
||||||
|
| Crystal | `crystal` | | |
|
||||||
|
| C# | `csharp` | `c#``cs` | |
|
||||||
|
| CSS | `css` | | |
|
||||||
|
| CSV | `csv` | | |
|
||||||
|
| CUE | `cue` | | |
|
||||||
|
| Cypher | `cypher` | `cql` | |
|
||||||
|
| D | `d` | | |
|
||||||
|
| Dart | `dart` | | |
|
||||||
|
| DAX | `dax` | | |
|
||||||
|
| Desktop | `desktop` | | |
|
||||||
|
| Diff | `diff` | | |
|
||||||
|
| Dockerfile | `docker` | `dockerfile` | |
|
||||||
|
| dotEnv | `dotenv` | | |
|
||||||
|
| Dream Maker | `dream-maker` | | |
|
||||||
|
| Edge | `edge` | | |
|
||||||
|
| Elixir | `elixir` | | |
|
||||||
|
| Elm | `elm` | | |
|
||||||
|
| Emacs Lisp | `emacs-lisp` | `elisp` | |
|
||||||
|
| ERB | `erb` | | |
|
||||||
|
| Erlang | `erlang` | `erl` | |
|
||||||
|
| Fennel | `fennel` | | |
|
||||||
|
| Fish | `fish` | | |
|
||||||
|
| Fluent | `fluent` | `ftl` | |
|
||||||
|
| Fortran (Fixed Form) | `fortran-fixed-form` | `f``for``f77` | |
|
||||||
|
| Fortran (Free Form) | `fortran-free-form` | `f90``f95``f03``f08``f18` | |
|
||||||
|
| F# | `fsharp` | `f#``fs` | |
|
||||||
|
| GDResource | `gdresource` | | |
|
||||||
|
| GDScript | `gdscript` | | |
|
||||||
|
| GDShader | `gdshader` | | |
|
||||||
|
| Genie | `genie` | | |
|
||||||
|
| Gherkin | `gherkin` | | |
|
||||||
|
| Git Commit Message | `git-commit` | | |
|
||||||
|
| Git Rebase Message | `git-rebase` | | |
|
||||||
|
| Gleam | `gleam` | | |
|
||||||
|
| Glimmer JS | `glimmer-js` | `gjs` | |
|
||||||
|
| Glimmer TS | `glimmer-ts` | `gts` | |
|
||||||
|
| GLSL | `glsl` | | |
|
||||||
|
| Gnuplot | `gnuplot` | | |
|
||||||
|
| Go | `go` | | |
|
||||||
|
| GraphQL | `graphql` | `gql` | |
|
||||||
|
| Groovy | `groovy` | | |
|
||||||
|
| Hack | `hack` | | |
|
||||||
|
| Ruby Haml | `haml` | | |
|
||||||
|
| Handlebars | `handlebars` | `hbs` | |
|
||||||
|
| Haskell | `haskell` | `hs` | |
|
||||||
|
| Haxe | `haxe` | | |
|
||||||
|
| HashiCorp HCL | `hcl` | | |
|
||||||
|
| Hjson | `hjson` | | |
|
||||||
|
| HLSL | `hlsl` | | |
|
||||||
|
| HTML | `html` | | |
|
||||||
|
| HTML (Derivative) | `html-derivative` | | |
|
||||||
|
| HTTP | `http` | | |
|
||||||
|
| HXML | `hxml` | | |
|
||||||
|
| Hy | `hy` | | |
|
||||||
|
| Imba | `imba` | | |
|
||||||
|
| INI | `ini` | `properties` | |
|
||||||
|
| Java | `java` | | |
|
||||||
|
| JavaScript | `javascript` | `js` | |
|
||||||
|
| Jinja | `jinja` | | |
|
||||||
|
| Jison | `jison` | | |
|
||||||
|
| JSON | `json` | | |
|
||||||
|
| JSON5 | `json5` | | |
|
||||||
|
| JSON with Comments | `jsonc` | | |
|
||||||
|
| JSON Lines | `jsonl` | | |
|
||||||
|
| Jsonnet | `jsonnet` | | |
|
||||||
|
| JSSM | `jssm` | `fsl` | |
|
||||||
|
| JSX | `jsx` | | |
|
||||||
|
| Julia | `julia` | `jl` | |
|
||||||
|
| Kotlin | `kotlin` | `kt``kts` | |
|
||||||
|
| Kusto | `kusto` | `kql` | |
|
||||||
|
| LaTeX | `latex` | | |
|
||||||
|
| Lean 4 | `lean` | `lean4` | |
|
||||||
|
| Less | `less` | | |
|
||||||
|
| Liquid | `liquid` | | |
|
||||||
|
| LLVM IR | `llvm` | | |
|
||||||
|
| Log file | `log` | | |
|
||||||
|
| Logo | `logo` | | |
|
||||||
|
| Lua | `lua` | | |
|
||||||
|
| Luau | `luau` | | |
|
||||||
|
| Makefile | `make` | `makefile` | |
|
||||||
|
| Markdown | `markdown` | `md` | |
|
||||||
|
| Marko | `marko` | | |
|
||||||
|
| MATLAB | `matlab` | | |
|
||||||
|
| MDC | `mdc` | | |
|
||||||
|
| MDX | `mdx` | | |
|
||||||
|
| Mermaid | `mermaid` | `mmd` | |
|
||||||
|
| MIPS Assembly | `mipsasm` | `mips` | |
|
||||||
|
| Mojo | `mojo` | | |
|
||||||
|
| Move | `move` | | |
|
||||||
|
| Narrat Language | `narrat` | `nar` | |
|
||||||
|
| Nextflow | `nextflow` | `nf` | |
|
||||||
|
| Nginx | `nginx` | | |
|
||||||
|
| Nim | `nim` | | |
|
||||||
|
| Nix | `nix` | | |
|
||||||
|
| nushell | `nushell` | `nu` | |
|
||||||
|
| Objective-C | `objective-c` | `objc` | |
|
||||||
|
| Objective-C++ | `objective-cpp` | | |
|
||||||
|
| OCaml | `ocaml` | | |
|
||||||
|
| Pascal | `pascal` | | |
|
||||||
|
| Perl | `perl` | | |
|
||||||
|
| PHP | `php` | | |
|
||||||
|
| PL/SQL | `plsql` | | |
|
||||||
|
| Gettext PO | `po` | `pot``potx` | |
|
||||||
|
| Polar | `polar` | | |
|
||||||
|
| PostCSS | `postcss` | | |
|
||||||
|
| PowerQuery | `powerquery` | | |
|
||||||
|
| PowerShell | `powershell` | `ps``ps1` | |
|
||||||
|
| Prisma | `prisma` | | |
|
||||||
|
| Prolog | `prolog` | | |
|
||||||
|
| Protocol Buffer 3 | `proto` | `protobuf` | |
|
||||||
|
| Pug | `pug` | `jade` | |
|
||||||
|
| Puppet | `puppet` | | |
|
||||||
|
| PureScript | `purescript` | | |
|
||||||
|
| Python | `python` | `py` | |
|
||||||
|
| QML | `qml` | | |
|
||||||
|
| QML Directory | `qmldir` | | |
|
||||||
|
| Qt Style Sheets | `qss` | | |
|
||||||
|
| R | `r` | | |
|
||||||
|
| Racket | `racket` | | |
|
||||||
|
| Raku | `raku` | `perl6` | |
|
||||||
|
| ASP.NET Razor | `razor` | | |
|
||||||
|
| Windows Registry Script | `reg` | | |
|
||||||
|
| RegExp | `regexp` | `regex` | |
|
||||||
|
| Rel | `rel` | | |
|
||||||
|
| RISC-V | `riscv` | | |
|
||||||
|
| reStructuredText | `rst` | | |
|
||||||
|
| Ruby | `ruby` | `rb` | |
|
||||||
|
| Rust | `rust` | `rs` | |
|
||||||
|
| SAS | `sas` | | |
|
||||||
|
| Sass | `sass` | | |
|
||||||
|
| Scala | `scala` | | |
|
||||||
|
| Scheme | `scheme` | | |
|
||||||
|
| SCSS | `scss` | | |
|
||||||
|
| 1C (Query) | `sdbl` | `1c-query` | |
|
||||||
|
| ShaderLab | `shaderlab` | `shader` | |
|
||||||
|
| Shell | `shellscript` | `bash``sh``shell``zsh` | |
|
||||||
|
| Shell Session | `shellsession` | `console` | |
|
||||||
|
| Smalltalk | `smalltalk` | | |
|
||||||
|
| Solidity | `solidity` | | |
|
||||||
|
| Closure Templates | `soy` | `closure-templates` | |
|
||||||
|
| SPARQL | `sparql` | | |
|
||||||
|
| Splunk Query Language | `splunk` | `spl` | |
|
||||||
|
| SQL | `sql` | | |
|
||||||
|
| SSH Config | `ssh-config` | | |
|
||||||
|
| Stata | `stata` | | |
|
||||||
|
| Stylus | `stylus` | `styl` | |
|
||||||
|
| Svelte | `svelte` | | |
|
||||||
|
| Swift | `swift` | | |
|
||||||
|
| SystemVerilog | `system-verilog` | | |
|
||||||
|
| Systemd Units | `systemd` | | |
|
||||||
|
| TalonScript | `talonscript` | `talon` | |
|
||||||
|
| Tasl | `tasl` | | |
|
||||||
|
| Tcl | `tcl` | | |
|
||||||
|
| Templ | `templ` | | |
|
||||||
|
| Terraform | `terraform` | `tf``tfvars` | |
|
||||||
|
| TeX | `tex` | | |
|
||||||
|
| TOML | `toml` | | |
|
||||||
|
| TypeScript with Tags | `ts-tags` | `lit` | |
|
||||||
|
| TSV | `tsv` | | |
|
||||||
|
| TSX | `tsx` | | |
|
||||||
|
| Turtle | `turtle` | | |
|
||||||
|
| Twig | `twig` | | |
|
||||||
|
| TypeScript | `typescript` | `ts` | |
|
||||||
|
| TypeSpec | `typespec` | `tsp` | |
|
||||||
|
| Typst | `typst` | `typ` | |
|
||||||
|
| V | `v` | | |
|
||||||
|
| Vala | `vala` | | |
|
||||||
|
| Visual Basic | `vb` | `cmd` | |
|
||||||
|
| Verilog | `verilog` | | |
|
||||||
|
| VHDL | `vhdl` | | |
|
||||||
|
| Vim Script | `viml` | `vim``vimscript` | |
|
||||||
|
| Vue | `vue` | | |
|
||||||
|
| Vue HTML | `vue-html` | | |
|
||||||
|
| Vyper | `vyper` | `vy` | |
|
||||||
|
| WebAssembly | `wasm` | | |
|
||||||
|
| Wenyan | `wenyan` | `文言` | |
|
||||||
|
| WGSL | `wgsl` | | |
|
||||||
|
| Wikitext | `wikitext` | `mediawiki``wiki` | |
|
||||||
|
| WebAssembly Interface Types | `wit` | | |
|
||||||
|
| Wolfram | `wolfram` | `wl` | |
|
||||||
|
| XML | `xml` | | |
|
||||||
|
| XSL | `xsl` | | |
|
||||||
|
| YAML | `yaml` | `yml` | |
|
||||||
|
| ZenScript | `zenscript` | | |
|
||||||
|
| Zig | `zig` | | |
|
||||||
|
|
||||||
|
Grammars are covered by their repositories’ respective licenses, which are permissive
|
|
@ -0,0 +1,351 @@
|
||||||
|
# Análisis Comparativo de Routers MikroTik Pequeños con CPU ARM para Implementaciones ZeroTier
|
||||||
|
|
||||||
|
## 1. Resumen Ejecutivo
|
||||||
|
|
||||||
|
**Propósito:** Este informe tiene como objetivo identificar y comparar routers MikroTik de formato pequeño que utilizan arquitectura de CPU ARM, requisito indispensable para ejecutar el paquete de software ZeroTier en RouterOS versión 7 y posteriores. El análisis busca proporcionar una guía técnica detallada para la selección del hardware adecuado.
|
||||||
|
|
||||||
|
**Hallazgos Clave:** Se han identificado varios modelos que cumplen los criterios, incluyendo las series hAP ax (ax lite, ax², ax³), la serie L009 (L009UiGS-RM, L009UiGS-2HaxD-IN), el RB450Gx4 y la serie RB5009 (RB5009UG+S+IN), junto con modelos anteriores como hAP ac² y hAP ac³. Existe una distinción crítica en el rendimiento de ZeroTier entre los dispositivos ARM de 32 bits (ARM32) y los de 64 bits (ARM64), siendo estos últimos preferibles para un rendimiento óptimo. La serie L009 presenta un caso particular al utilizar una CPU ARM64 pero ejecutar una versión de RouterOS de 32 bits, lo que podría impactar su rendimiento con ZeroTier.
|
||||||
|
|
||||||
|
**Resumen de Recomendaciones:** Las recomendaciones varían según las prioridades: modelos como hAP ax lite o hAP ac² ofrecen el mejor valor para implementaciones básicas (con rendimiento ZeroTier limitado); RB5009UG+S+IN y hAP ax³ son ideales para máximo rendimiento y preparación para el futuro; hAP ax² y la serie L009 presentan un equilibrio entre rendimiento y características; y RB450Gx4, L009UiGS-RM o RB5009UG+S+IN son opciones para entornos exclusivamente cableados.
|
||||||
|
|
||||||
|
## 2. Introducción
|
||||||
|
|
||||||
|
**Contexto:** Las redes superpuestas (overlay networks) como ZeroTier han ganado popularidad significativa por su capacidad para crear conexiones seguras y simplificadas entre dispositivos ubicados en redes físicas dispares. Estas redes virtuales facilitan escenarios como el acceso remoto seguro a dispositivos en una LAN, la interconexión de oficinas, el alojamiento de servidores domésticos o incluso la creación de "LAN parties" virtuales con amigos que se encuentran geográficamente distribuidos.
|
||||||
|
|
||||||
|
**El Desafío MikroTik + ZeroTier:** MikroTik RouterOS es reconocido como un sistema operativo de red extremadamente potente y flexible, ofreciendo un control granular sobre el enrutamiento, firewall, VPNs y muchas otras funcionalidades avanzadas. Reconociendo la utilidad de las redes superpuestas, MikroTik incorporó oficialmente el soporte para ZeroTier a partir de RouterOS v7.1rc2. Sin embargo, esta integración presenta una limitación crucial: el paquete de software ZeroTier desarrollado por MikroTik está disponible _exclusivamente_ para dispositivos que utilizan arquitecturas de CPU ARM (tanto ARM de 32 bits como ARM de 64 bits). Las arquitecturas más antiguas o diferentes, como MIPSBE, MMIPS, PPC, TILE o x86, comunes en muchas líneas de productos MikroTik anteriores o de gama alta/baja, no son compatibles actualmente con el paquete ZeroTier oficial. Esta dependencia arquitectónica es el principal motor de la presente investigación.
|
||||||
|
|
||||||
|
**Objetivo del Informe:** Este informe tiene como finalidad guiar al usuario en la selección de un router MikroTik de _formato pequeño_ (adecuado para uso doméstico, SOHO o pequeñas oficinas) que sea capaz de ejecutar ZeroTier eficazmente. Para ello, se identificarán los modelos relevantes basados en ARM, se verificará la compatibilidad con ZeroTier, se compararán sus especificaciones técnicas clave (CPU, RAM, puertos, Wi-Fi, licencia) y se proporcionarán precios estimados para facilitar una decisión de compra informada.
|
||||||
|
|
||||||
|
## 3. ZeroTier en MikroTik: El Imperativo ARM
|
||||||
|
|
||||||
|
**Requisito Técnico:** La dependencia del paquete ZeroTier de MikroTik respecto a la arquitectura de CPU ARM/ARM64 es explícita y fundamental para su funcionamiento en RouterOS v7 y versiones posteriores. La documentación oficial y los anuncios de MikroTik lo confirman repetidamente: "MikroTik ha añadido ZeroTier a RouterOS v7.1rc2 como un paquete separado para la arquitectura ARM/ARM64". Esto excluye automáticamente a una gran cantidad de hardware MikroTik que utiliza otras arquitecturas. La documentación de ZeroTier también lo corrobora, indicando que "Actualmente no existe ningún paquete ZeroTier MIPS para dispositivos MikroTik", y discusiones en foros confirman la ausencia de soporte para arquitecturas como MIPSBE, TILE o x86 (incluyendo CHR, la versión virtualizada de RouterOS). Por lo tanto, la primera y más importante consideración al seleccionar un router MikroTik para usar ZeroTier es confirmar que su CPU sea ARM.
|
||||||
|
|
||||||
|
Consideraciones de Rendimiento: ARM32 vs. ARM64:
|
||||||
|
|
||||||
|
Aunque el paquete ZeroTier es compatible tanto con ARM de 32 bits (a menudo denominado simplemente "ARM" en las especificaciones de MikroTik) como con ARM de 64 bits (ARM64), existen diferencias significativas de rendimiento entre ambos.
|
||||||
|
|
||||||
|
La documentación oficial de ZeroTier es clara en su recomendación: "Para obtener el mejor rendimiento, se recomienda elegir un modelo que tenga un chip ARM de 64 bits (arm64). No ARM de 32 bits. Los dispositivos ARM de 32 bits funcionarán, pero con un rendimiento significativamente reducido". Esta diferencia de rendimiento se atribuye en gran medida a la disponibilidad de aceleración de hardware para las operaciones criptográficas (específicamente AES) que utiliza ZeroTier. La aceleración por hardware AES está soportada y optimizada en plataformas ARM64 que disponen de extensiones criptográficas específicas, lo que descarga a la CPU principal y permite un mayor rendimiento. Por el contrario, las implementaciones en ARM de 32 bits pueden carecer de esta aceleración o tener una implementación menos eficiente, resultando en una mayor carga de CPU y un menor throughput. Si bien un dispositivo ARM32 de bajo consumo _puede_ ejecutar ZeroTier, su rendimiento se verá afectado.
|
||||||
|
|
||||||
|
**El Caso Particular de la Serie L009:** La serie L009, que incluye los modelos L009UiGS-RM y L009UiGS-2HaxD-IN, representa un caso especial. Estos routers están equipados con una CPU moderna IPQ-5018, que es de arquitectura ARM 64 bits. Sin embargo, MikroTik ha optado por distribuir estos dispositivos con una versión de RouterOS de 32 bits.
|
||||||
|
|
||||||
|
Esta decisión tiene implicaciones directas para el rendimiento de ZeroTier. Dado que la documentación de ZeroTier recomienda encarecidamente ARM64 para un rendimiento óptimo y las discusiones técnicas sugieren que la aceleración por hardware puede estar limitada o ausente en las compilaciones ARM de 32 bits, ejecutar un sistema operativo de 32 bits en una CPU capaz de 64 bits podría impedir que la serie L009 aproveche completamente su potencial de hardware para la aceleración de ZeroTier. Aunque la CPU es más nueva que la de muchos dispositivos ARM32, el rendimiento real de ZeroTier en un L009 podría ser inferior al esperado para un chip ARM64 y potencialmente más cercano al de dispositivos ARM32 más antiguos o al de otros ARM64 que ejecutan un sistema operativo de 64 bits. MikroTik indica un rendimiento esperado de 60-90 Mbps para ZeroTier en el L009 con paquetes de 1400 bytes, lo cual puede servir como una referencia, aunque las condiciones reales pueden variar. Existe un debate en la comunidad sobre si el código de 32 bits ejecutándose en procesadores de 64 bits puede beneficiarse de alguna aceleración, pero la recomendación general de ZeroTier hacia ARM64 sigue siendo relevante.
|
||||||
|
|
||||||
|
**Conclusión sobre la Arquitectura:** En resumen, aunque los modelos MikroTik con CPU ARM32 _pueden_ ejecutar el paquete ZeroTier, los modelos con CPU ARM64 que ejecutan una versión de RouterOS de 64 bits son la opción preferida para obtener el mejor rendimiento posible. La serie L009, debido a su combinación de CPU ARM64 y OS de 32 bits, se sitúa en una posición intermedia, ofreciendo características modernas pero con un rendimiento de ZeroTier potencialmente comprometido en comparación con sistemas ARM64 completos.
|
||||||
|
|
||||||
|
## 4. Identificación de Routers MikroTik Pequeños Adecuados
|
||||||
|
|
||||||
|
**Metodología:** El proceso para identificar los routers MikroTik adecuados para ejecutar ZeroTier, cumpliendo con los requisitos de arquitectura ARM y formato pequeño, siguió estos pasos:
|
||||||
|
|
||||||
|
1. **Recopilación Inicial:** Se consultó la matriz de productos de MikroTik, los filtros de productos en su sitio web y las páginas de especificaciones individuales para compilar una lista de routers.
|
||||||
|
2. **Filtrado por Arquitectura:** La lista se filtró para incluir únicamente modelos con arquitecturas "ARM 32bit" y "ARM 64bit".
|
||||||
|
3. **Selección por Tamaño/Formato:** Se seleccionaron los modelos que se ajustan al criterio de "pequeño", definidos como dispositivos con formato de escritorio, torre compacta o placa base comúnmente vendida con carcasas pequeñas (como el RB450Gx4), adecuados para entornos domésticos o de pequeña oficina (SOHO). Se excluyeron modelos de montaje en rack de gran tamaño (como la mayoría de los CCR), CPEs de exterior (como SXT, LHG) y placas base OEM sin carcasas estándar pequeñas asociadas (como RBM33G). Las series hAP, L009, RB450Gx4 y RB5009 emergieron como candidatas principales.
|
||||||
|
4. **Verificación de Compatibilidad ZeroTier:** Se cruzó la lista resultante con la información sobre el requisito de arquitectura ARM para ZeroTier, confirmando que todos los modelos ARM seleccionados son, en principio, compatibles con el paquete ZeroTier en RouterOS v7+.
|
||||||
|
|
||||||
|
**Nota sobre la Nomenclatura:** Es relevante señalar una inconsistencia histórica en la nomenclatura de modelos de MikroTik que podría generar confusión. Tradicionalmente, la serie RB4xx se asociaba con la arquitectura MIPSBE. Sin embargo, el modelo RB450Gx4, incluido en este análisis, utiliza una CPU ARM. De manera similar, la serie L009 (ARM) se posiciona como reemplazo de la serie RB2011 (MIPSBE). Las series hAP más recientes (ac², ac³, ax lite, ax², ax³) son todas basadas en ARM/ARM64.1 Este cambio refleja una clara tendencia estratégica de MikroTik hacia la adopción de la arquitectura ARM en sus líneas de routers SOHO y SMB. Esta transición está probablemente impulsada por la necesidad de soportar características más avanzadas (como el soporte de contenedores mencionado para L009 y RB5009), mejorar el rendimiento y optimizar la eficiencia energética. Para los usuarios que buscan funcionalidades modernas como ZeroTier en dispositivos pequeños, los modelos basados en ARM son ahora la opción principal, ya que los dispositivos MIPS más antiguos carecen de soporte para estos paquetes más nuevos.
|
||||||
|
|
||||||
|
**Lista de Modelos Candidatos Identificados:** Basándose en la metodología anterior, los siguientes modelos han sido seleccionados para un análisis detallado:
|
||||||
|
|
||||||
|
- hAP ac² (RBD52G-5HacD2HnD-TC)
|
||||||
|
- hAP ac³ (RBD53iG-5HacD2HnD)
|
||||||
|
- hAP ax lite (L41G-2axD)
|
||||||
|
- hAP ax² (C52iG-5HaxD2HaxD-TC)
|
||||||
|
- hAP ax³ (C53UiG+5HPaxD2HPaxD)
|
||||||
|
- L009UiGS-RM
|
||||||
|
- L009UiGS-2HaxD-IN
|
||||||
|
- RB450Gx4
|
||||||
|
- RB5009UG+S+IN
|
||||||
|
|
||||||
|
## 5. Perfiles Detallados de Routers
|
||||||
|
|
||||||
|
A continuación, se presentan perfiles detallados para cada uno de los modelos identificados, extrayendo información de las especificaciones oficiales y fuentes relacionadas.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **hAP ac² (RBD52G-5HacD2HnD-TC)**
|
||||||
|
|
||||||
|
- **Descripción General:** Un punto de acceso de doble banda concurrente (2.4 GHz y 5 GHz) con cinco puertos Gigabit Ethernet, diseñado para uso doméstico o de oficina, con soporte para aceleración de hardware IPsec.1
|
||||||
|
- **CPU:** Arquitectura ARM 32bit, Modelo IPQ-4018, 4 núcleos, Frecuencia nominal 488-896 MHz (automático).1
|
||||||
|
- **RAM:** 128 MB.1
|
||||||
|
- **Almacenamiento:** 16 MB, Tipo FLASH.1 (Nota: FLASH es generalmente menos duradero y potencialmente más lento que NAND para escrituras intensivas).
|
||||||
|
- **Puertos Ethernet:** 5 x 10/100/1000 Ethernet.1
|
||||||
|
- **Puertos SFP/SFP+:** Ninguno.
|
||||||
|
- **Capacidades Wi-Fi:**
|
||||||
|
- Presencia: Sí.
|
||||||
|
- Estándares: 802.11b/g/n (2.4 GHz), 802.11a/n/ac (5 GHz).1
|
||||||
|
- Generación: Wi-Fi 4 (2.4 GHz), Wi-Fi 5 (5 GHz).1
|
||||||
|
- Bandas: Doble banda concurrente (2.4 GHz y 5 GHz).1
|
||||||
|
- Cadenas: 2x2 para ambas bandas.1
|
||||||
|
- Velocidad Máxima: 300 Mbit/s (2.4 GHz), 867 Mbit/s (5 GHz).1
|
||||||
|
- Clase de Velocidad: AC1200.1
|
||||||
|
- **Otros Periféricos:** 1 x Puerto USB 2.0 tipo A (para módem 3G/4G o almacenamiento externo).
|
||||||
|
- **Licencia RouterOS:** Nivel 4.1
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM32). Rendimiento esperado: Bajo, debido a la arquitectura ARM32 y la falta de aceleración de hardware optimizada.
|
||||||
|
- **Formato/Tamaño:** Caja de torre universal (34 x 119 x 98 mm), permite posicionamiento horizontal o vertical, kit de montaje en pared incluido.
|
||||||
|
- **Alimentación:** 2 x Entradas DC (Jack DC, PoE-IN). Voltaje Jack DC: 12-30 V. PoE-in: Pasivo, Voltaje 18-28 V.1 Sin PoE-out.
|
||||||
|
- **Precio Estimado:** €55 - €85 / $70 - $80.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **hAP ac³ (RBD53iG-5HacD2HnD)**
|
||||||
|
|
||||||
|
- **Descripción General:** Router inalámbrico de doble banda con 5 puertos Gigabit Ethernet, CPU de cuatro núcleos y antenas externas de alta ganancia para mayor cobertura.2
|
||||||
|
- **CPU:** Arquitectura ARM 32bit, Modelo IPQ-4019, 4 núcleos, Frecuencia nominal 448-896 MHz (automático).2
|
||||||
|
- **RAM:** 256 MB.2
|
||||||
|
- **Almacenamiento:** 128 MB, Tipo NAND.2 (NAND ofrece mejor rendimiento y durabilidad que FLASH).
|
||||||
|
- **Puertos Ethernet:** 5 x 10/100/1000 Ethernet.2
|
||||||
|
- **Puertos SFP/SFP+:** Ninguno.
|
||||||
|
- **Capacidades Wi-Fi:**
|
||||||
|
- Presencia: Sí.
|
||||||
|
- Estándares: 802.11b/g/n (2.4 GHz), 802.11a/n/ac (5 GHz).2
|
||||||
|
- Generación: Wi-Fi 4 (2.4 GHz), Wi-Fi 5 (5 GHz).2
|
||||||
|
- Bandas: Doble banda (2.4 GHz y 5 GHz).2
|
||||||
|
- Cadenas: 2x2 para ambas bandas.2
|
||||||
|
- Velocidad Máxima: 300 Mbit/s (2.4 GHz), 867 Mbit/s (5 GHz).2
|
||||||
|
- Clase de Velocidad: AC1200.2
|
||||||
|
- Antenas: Externas de alta ganancia (3 dBi para 2.4 GHz, 5.5 dBi para 5 GHz), conectores RP-SMA hembra para antenas externas opcionales.
|
||||||
|
- **Otros Periféricos:** 1 x Puerto USB 2.0 tipo A (para almacenamiento extra).
|
||||||
|
- **Licencia RouterOS:** Nivel 4.2
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM32). Rendimiento esperado: Bajo, similar al hAP ac², debido a la arquitectura ARM32.
|
||||||
|
- **Formato/Tamaño:** Caja de sobremesa/torre (251 x 129 x 39 mm), permite montaje vertical u horizontal, kit de montaje en pared incluido.
|
||||||
|
- **Alimentación:** 2 x Entradas DC (Jack DC, PoE-IN). Voltaje Jack DC: 12-28 V. PoE-in: Pasivo, Voltaje 18-28 V.2 Sin PoE-out.
|
||||||
|
- **Precio Estimado:** €78 - €122 / $109 (MSRP).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **hAP ax lite (L41G-2axD)**
|
||||||
|
|
||||||
|
- **Descripción General:** Solución Wi-Fi 6 económica y compacta, diseñada para ofrecer valor y rendimiento básico con RouterOS v7.3
|
||||||
|
- **CPU:** Arquitectura ARM (probablemente 32bit, aunque la página del producto solo dice "ARM"), Modelo IPQ-5010, 2 núcleos, Frecuencia nominal 800 MHz.3
|
||||||
|
- **RAM:** 256 MB.3
|
||||||
|
- **Almacenamiento:** 128 MB, Tipo NAND.3
|
||||||
|
- **Puertos Ethernet:** 4 x 10/100/1000 Ethernet.3
|
||||||
|
- **Puertos SFP/SFP+:** Ninguno.
|
||||||
|
- **Capacidades Wi-Fi:**
|
||||||
|
- Presencia: Sí.
|
||||||
|
- Estándares: 802.11b/g/n/ax.3
|
||||||
|
- Generación: Wi-Fi 6.3
|
||||||
|
- Bandas: 2.4 GHz únicamente.3
|
||||||
|
- Cadenas: 2x2.3
|
||||||
|
- Velocidad Máxima: 574 Mbit/s.3
|
||||||
|
- Clase de Velocidad: AX600.3
|
||||||
|
- Antenas: Internas, ganancia hasta 4.3 dBi.3
|
||||||
|
- **Otros Periféricos:** Ninguno mencionado (sin USB, sin microSD).
|
||||||
|
- **Licencia RouterOS:** Nivel 4.3
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM). Rendimiento esperado: Bajo, probablemente limitado por la arquitectura ARM32 (asumiendo que es 32bit) y la CPU de 2 núcleos.
|
||||||
|
- **Formato/Tamaño:** Caja muy compacta (dimensiones no especificadas claramente en S26, pero descrito como "tiny").
|
||||||
|
- **Alimentación:** 1 x Entrada DC (USB-C). Voltaje Soportado: 5 V.3 Sin PoE-in/out.
|
||||||
|
- **Precio Estimado:** €41 - €66 / $59 (MSRP).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **hAP ax² (C52iG-5HaxD2HaxD-TC)**
|
||||||
|
|
||||||
|
- **Descripción General:** Versión Wi-Fi 6 del hAP ac², con CPU moderna, más RAM, Wi-Fi más rápido y PoE-in/out.4 Posicionado como una opción equilibrada para la mayoría de los hogares.
|
||||||
|
- **CPU:** Arquitectura ARM 64bit, Modelo IPQ-6010, 4 núcleos, Frecuencia nominal 864 MHz.4
|
||||||
|
- **RAM:** 1 GB.4
|
||||||
|
- **Almacenamiento:** 128 MB, Tipo NAND.4
|
||||||
|
- **Puertos Ethernet:** 5 x 10/100/1000 Ethernet. Puerto Ether1 soporta PoE-out.4
|
||||||
|
- **Puertos SFP/SFP+:** Ninguno.
|
||||||
|
- **Capacidades Wi-Fi:**
|
||||||
|
- Presencia: Sí.
|
||||||
|
- Estándares: 802.11b/g/n/ax (2.4 GHz), 802.11a/n/ac/ax (5 GHz).4
|
||||||
|
- Generación: Wi-Fi 6 para ambas bandas.4
|
||||||
|
- Bandas: Doble banda concurrente (2.4 GHz y 5 GHz).4
|
||||||
|
- Cadenas: 2x2 para ambas bandas.4
|
||||||
|
- Velocidad Máxima: 574 Mbit/s (2.4 GHz), 1200 Mbit/s (5 GHz).4
|
||||||
|
- Clase de Velocidad: AX1800.4
|
||||||
|
- Antenas: Internas, ganancia hasta 4 dBi (2.4 GHz) y 4.5 dBi (5 GHz).4
|
||||||
|
- **Otros Periféricos:** Ninguno mencionado (sin USB, sin microSD).
|
||||||
|
- **Licencia RouterOS:** Nivel 4.4
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM64). Rendimiento esperado: Alto, beneficiándose de la CPU ARM64 y 1GB de RAM. Se espera que ejecute RouterOS 64 bits, permitiendo aceleración por hardware.
|
||||||
|
- **Formato/Tamaño:** Caja de torre universal (dimensiones no especificadas en S28, pero similar a hAP ac²), permite montaje vertical, horizontal o en pared.
|
||||||
|
- **Alimentación:** 2 x Entradas DC (Jack DC, PoE-IN). Voltaje Jack DC: 12-28 V. PoE-in: Pasivo, Voltaje 18-28 V. PoE-out: Puerto Ether1, Pasivo PoE, Max 600 mA (0.6 A).4
|
||||||
|
- **Precio Estimado:** €70 - €100 / $99 (MSRP).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **hAP ax³ (C53UiG+5HPaxD2HPaxD)**
|
||||||
|
|
||||||
|
- **Descripción General:** El punto de acceso doméstico AX de gama alta de MikroTik, con CPU potente, 1GB RAM, puerto 2.5 Gigabit Ethernet, Wi-Fi 6, PoE-out y seguridad WPA3.5
|
||||||
|
- **CPU:** Arquitectura ARM 64bit, Modelo IPQ-6010, 4 núcleos, Frecuencia nominal auto (864 - 1800) MHz.5
|
||||||
|
- **RAM:** 1 GB.5
|
||||||
|
- **Almacenamiento:** 128 MB, Tipo NAND.5
|
||||||
|
- **Puertos Ethernet:** 4 x 10/100/1000 Ethernet, 1 x 2.5 Gigabit Ethernet. Puerto Ether1 (Gigabit) soporta PoE-out.5
|
||||||
|
- **Puertos SFP/SFP+:** Ninguno.
|
||||||
|
- **Capacidades Wi-Fi:**
|
||||||
|
- Presencia: Sí.
|
||||||
|
- Estándares: 802.11b/g/n/ax (2.4 GHz), 802.11a/n/ac/ax (5 GHz).5
|
||||||
|
- Generación: Wi-Fi 6 para ambas bandas.5
|
||||||
|
- Bandas: Doble banda concurrente (2.4 GHz y 5 GHz).5
|
||||||
|
- Cadenas: 2x2 para ambas bandas.5
|
||||||
|
- Velocidad Máxima: 574 Mbit/s (2.4 GHz), 1200 Mbit/s (5 GHz).5
|
||||||
|
- Clase de Velocidad: AX1800.5
|
||||||
|
- Antenas: Externas de alta ganancia (3.3 dBi para 2.4 GHz, 5.5 dBi para 5 GHz), conectores RP-SMA hembra.5
|
||||||
|
- **Otros Periféricos:** 1 x Puerto USB 3.0 tipo A (para almacenamiento o módem LTE adicional).
|
||||||
|
- **Licencia RouterOS:** Nivel 6.5 (Nota: Nivel 6 ofrece las máximas capacidades en RouterOS, eliminando límites en túneles VPN, usuarios HotSpot, etc., en comparación con L4/L5).
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM64). Rendimiento esperado: Alto, similar o superior al hAP ax², gracias a la CPU ARM64 de alta velocidad y 1GB RAM. Se espera que ejecute RouterOS 64 bits.
|
||||||
|
- **Formato/Tamaño:** Caja de sobremesa/torre (251 x 130 x 39 mm). Kit de montaje en pared incluido.
|
||||||
|
- **Alimentación:** 2 x Entradas DC (Jack DC, PoE-IN). Voltaje Jack DC: 12-28 V. PoE-in: Pasivo, Voltaje 18-28 V. PoE-out: Puerto Ether1, Pasivo PoE, Max 0.625 A.5
|
||||||
|
- **Precio Estimado:** €100 - €132 / $139 (MSRP).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **L009UiGS-RM**
|
||||||
|
|
||||||
|
- **Descripción General:** Sucesor del RB2011, ofrece hasta 4 veces más rendimiento, CPU ARM moderna con soporte para contenedores, 8 puertos Gigabit, SFP 2.5G y un innovador chasis que actúa como disipador y permite montaje 4-en-1U.6 Esta versión no incluye Wi-Fi.
|
||||||
|
- **CPU:** Arquitectura ARM (CPU IPQ-5018 es ARM 64bit), Modelo IPQ-5018, 2 núcleos, Frecuencia nominal 800 MHz.6
|
||||||
|
- **RAM:** 512 MB DDR3L.6
|
||||||
|
- **Almacenamiento:** 128 MB, Tipo NAND.6
|
||||||
|
- **Puertos Ethernet:** 8 x 10/100/1000 Ethernet. Puerto Ether8 soporta PoE-out (solo si se alimenta por DC jack).6
|
||||||
|
- **Puertos SFP/SFP+:** 1 x SFP (soporta 1G y 2.5G).6
|
||||||
|
- **Capacidades Wi-Fi:** Ninguna.
|
||||||
|
- **Otros Periféricos:** 1 x Puerto USB 3.0 tipo A, 1 x Puerto Serie Consola RJ45.
|
||||||
|
- **Licencia RouterOS:** Nivel 5.6 (Nivel 5 ofrece más capacidad que L4 para ciertas funciones como VPNs).
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM). Rendimiento esperado: Medio. Aunque la CPU es ARM64, el dispositivo ejecuta RouterOS 32 bits, lo que puede limitar la aceleración por hardware de ZeroTier. Rendimiento estimado por MikroTik: 60-90 Mbps con paquetes de 1400 bytes. El soporte para contenedores es una ventaja adicional de la arquitectura ARM.
|
||||||
|
- **Formato/Tamaño:** Caja metálica compacta (220 x 125 x 22 mm), actúa como disipador, incluye accesorios para montaje en rack 1U (permite montar hasta 4 unidades en 1U con kit K-79).
|
||||||
|
- **Alimentación:** 2 x Entradas DC (Jack DC, PoE-IN). Voltaje Jack DC: 24-56 V. PoE-in: 802.3af/at, Voltaje 24-56 V. PoE-out: Puerto Ether8, Pasivo PoE, Max 1A (entrada 24-30V) / 450mA (entrada 30-56V), requiere alimentación por DC Jack.6
|
||||||
|
- **Precio Estimado:** €80 - €132 / $119 (MSRP).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **L009UiGS-2HaxD-IN**
|
||||||
|
|
||||||
|
- **Descripción General:** Similar al L009UiGS-RM pero incluye Wi-Fi 6 de doble cadena en 2.4 GHz.7 Mantiene la CPU ARM, soporte para contenedores, puertos Gigabit, SFP 2.5G y el chasis innovador.
|
||||||
|
- **CPU:** Arquitectura ARM (CPU IPQ-5018 es ARM 64bit), Modelo IPQ-5018, 2 núcleos, Frecuencia nominal 800 MHz.7
|
||||||
|
- **RAM:** 512 MB DDR3L.7
|
||||||
|
- **Almacenamiento:** 128 MB, Tipo NAND.7
|
||||||
|
- **Puertos Ethernet:** 8 x 10/100/1000 Ethernet. Puerto Ether8 soporta PoE-out (solo si se alimenta por DC jack).7
|
||||||
|
- **Puertos SFP/SFP+:** 1 x SFP (soporta 1G y 2.5G).7
|
||||||
|
- **Capacidades Wi-Fi:**
|
||||||
|
- Presencia: Sí.
|
||||||
|
- Estándares: 802.11b/g/n/ax.7
|
||||||
|
- Generación: Wi-Fi 6.7
|
||||||
|
- Bandas: 2.4 GHz únicamente.7
|
||||||
|
- Cadenas: 2x2.7
|
||||||
|
- Velocidad Máxima: 574 Mbit/s.7
|
||||||
|
- Clase de Velocidad: AX600.
|
||||||
|
- Antenas: Externas (ganancia 4 dBi), conectores RP-SMA hembra.7
|
||||||
|
- **Otros Periféricos:** 1 x Puerto USB 3.0 tipo A, 1 x Puerto Serie Consola RJ45.
|
||||||
|
- **Licencia RouterOS:** Nivel 5.7
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM). Rendimiento esperado: Medio. Aplican las mismas consideraciones que para el L009UiGS-RM debido a la CPU ARM64 ejecutando RouterOS 32 bits. Rendimiento estimado por MikroTik: 60-90 Mbps con paquetes de 1400 bytes. Soporte para contenedores.
|
||||||
|
- **Formato/Tamaño:** Caja metálica compacta (220 x 125 x 22 mm), actúa como disipador. Diseñado para escritorio, pero puede montarse en rack con kit K-79 opcional.
|
||||||
|
- **Alimentación:** 2 x Entradas DC (Jack DC, PoE-IN). Voltaje Jack DC: 24-56 V. PoE-in: 802.3af/at, Voltaje 24-56 V. PoE-out: Puerto Ether8, Pasivo PoE, Max 1A (entrada 24-30V) / 450mA (entrada 30-56V), requiere alimentación por DC Jack.7
|
||||||
|
- **Precio Estimado:** €85 - €124 / $125 - $140. MSRP $129.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **RB450Gx4**
|
||||||
|
|
||||||
|
- **Descripción General:** Router Ethernet basado en placa (sin carcasa incluida por defecto, aunque disponible como sistema completo), con 5 puertos Gigabit, CPU ARM de cuatro núcleos, 1GB RAM y soporte de aceleración IPsec por hardware.8
|
||||||
|
- **CPU:** Arquitectura ARM 32bit, Modelo IPQ-4019, 4 núcleos, Frecuencia nominal 448-896 MHz (auto).8 (Nota: Algunas fuentes indican 716 MHz fijos, pero la página oficial indica rango automático).
|
||||||
|
- **RAM:** 1 GB.8
|
||||||
|
- **Almacenamiento:** 512 MB, Tipo NAND.8 (Algunas fuentes mencionan 2MB Flash adicional).
|
||||||
|
- **Puertos Ethernet:** 5 x 10/100/1000 Ethernet. Puerto Ether5 soporta PoE-out.8
|
||||||
|
- **Puertos SFP/SFP+:** Ninguno.
|
||||||
|
- **Capacidades Wi-Fi:** Ninguna (solo placa base).8
|
||||||
|
- **Otros Periféricos:** 1 x Puerto Serie RS232 (DB9), 1 x Ranura para tarjeta microSD.
|
||||||
|
- **Licencia RouterOS:** Nivel 5.8
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM32). Rendimiento esperado: Bajo-Medio. Aunque tiene 1GB RAM y CPU quad-core, la arquitectura ARM32 limita el rendimiento pico de ZeroTier en comparación con ARM64. La cantidad de RAM puede ayudar con un gran número de peers/redes ZT.
|
||||||
|
- **Formato/Tamaño:** Placa base (90 x 116 mm). El formato es idéntico a las series RB850/RB450 anteriores, permitiendo usar las mismas carcasas (ej. CA150).
|
||||||
|
- **Alimentación:** 3 x Entradas DC (2 x Jack DC, PoE-IN en Ether1). Voltaje Jack DC: 10-57 V. PoE-in: 802.3af/at, Voltaje 12-57 V. PoE-out: Puerto Ether5, Pasivo PoE, Max 500 mA.8
|
||||||
|
- **Precio Estimado:** €67 - €149 (Placa sola o sistema completo) / $96 - $99 (Placa sola).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Modelo:** **RB5009UG+S+IN**
|
||||||
|
|
||||||
|
- **Descripción General:** Router de alto rendimiento para "home lab" o uso intensivo, con CPU ARMv8 quad-core, 1GB RAM, puertos 1G, 2.5G y 10G SFP+, USB 3.0, en un formato compacto que permite montar 4 unidades en 1U.9
|
||||||
|
- **CPU:** Arquitectura ARM 64bit, Modelo Marvell Armada 88F7040, 4 núcleos, Frecuencia nominal 350-1400 MHz (automático).9
|
||||||
|
- **RAM:** 1 GB DDR4.9
|
||||||
|
- **Almacenamiento:** 1 GB, Tipo NAND.9
|
||||||
|
- **Puertos Ethernet:** 7 x 10/100/1000 Ethernet, 1 x 2.5 Gigabit Ethernet.9
|
||||||
|
- **Puertos SFP/SFP+:** 1 x SFP+ (10G).9
|
||||||
|
- **Capacidades Wi-Fi:** Ninguna.9
|
||||||
|
- **Otros Periféricos:** 1 x Puerto USB 3.0 tipo A.
|
||||||
|
- **Licencia RouterOS:** Nivel 5.9
|
||||||
|
- **Soporte y Rendimiento ZeroTier:** Confirmado (Arquitectura ARM64). Rendimiento esperado: Alto. Se beneficia de la potente CPU ARM64, 1GB RAM y se espera que ejecute RouterOS 64 bits, permitiendo la máxima aceleración por hardware para ZeroTier. El soporte para contenedores también está presente.
|
||||||
|
- **Formato/Tamaño:** Caja metálica compacta (dimensiones no especificadas en S19, pero similar a L009: 220x125x22 mm aprox.), actúa como disipador. Diseñado para escritorio, pero puede montarse en rack (4 unidades en 1U con kit K-79 opcional).
|
||||||
|
- **Alimentación:** 3 x Entradas DC (Jack DC, PoE-IN en Ether1, Terminal 2-pin). Voltaje Jack DC: 24-57 V. Voltaje Terminal 2-pin: 24-57 V. PoE-in: Pasivo (especificaciones no detalladas en S19, pero el modelo UPr soporta 802.3af/at). Sin PoE-out en este modelo (el modelo RB5009UPr+S+IN sí tiene PoE-out).
|
||||||
|
- **Precio Estimado:** €155 - €211 / $219 (MSRP).
|
||||||
|
|
||||||
|
- ---
|
||||||
|
|
||||||
|
- ## 6. Tabla Comparativa La siguiente tabla resume las especificaciones clave de los routers analizados para facilitar la comparación directa, enfocándose en los aspectos más relevantes para la implementación de ZeroTier y el uso general en entornos SOHO.
|
||||||
|
|
||||||
|
|
||||||
|
**Tabla Comparativa: Routers MikroTik Pequeños con Arquitectura ARM (Compatibles con ZeroTier)**
|
||||||
|
|
||||||
|
| Modelo | Arquitectura CPU | CPU | RAM | Puertos Ethernet | SFP/SFP+ | Wi-Fi | Licencia RouterOS | Precio Estimado (€, sin IVA) |
|
||||||
|
| :-------------------- | :--------------- | :---------------------- | :---- | :---------------------------- | :------------- | :-------------------------------- | :---------------- | :--------------------------- |
|
||||||
|
| **hAP ac²** | ARM 32bit | IPQ-4018 (4c @~716MHz)¹ | 128MB | 5 x GbE | No | Wi-Fi 5 (AC1200) 2.4/5GHz, 2x2 | L4 | ~€55 - €65 |
|
||||||
|
| **hAP ac³** | ARM 32bit | IPQ-4019 (4c @~716MHz)¹ | 256MB | 5 x GbE (1x PoE-out) | No | Wi-Fi 5 (AC1200) 2.4/5GHz, 2x2 | L4 | ~€75 - €85 |
|
||||||
|
| **hAP ax lite** | ARM (32bit OS) | IPQ-5010 (2c @800MHz) | 256MB | 4 x GbE | No | Wi-Fi 6 (AX600) 2.4GHz, 2x2 | L4 | ~€40 - €50 |
|
||||||
|
| **hAP ax²** | ARM 64bit | IPQ-6010 (4c @864MHz) | 1GB | 5 x GbE (1x PoE-out) | No | Wi-Fi 6 (AX1800) 2.4/5GHz, 2x2 | L4 | ~€70 - €85 |
|
||||||
|
| **hAP ax³** | ARM 64bit | IPQ-6010 (4c @~1.8GHz)² | 1GB | 4 x GbE, 1 x 2.5GbE (PoE-out) | No | Wi-Fi 6 (AX1800) 2.4/5GHz, 2x2 | L6 | ~€100 - €115 |
|
||||||
|
| **L009UiGS-RM** | ARM (32bit OS)³ | IPQ-5018 (2c @800MHz) | 512MB | 8 x GbE (1x PoE-out) | 1 x SFP (2.5G) | No | L5 | ~€85 - €100 |
|
||||||
|
| **L009UiGS-2HaxD-IN** | ARM (32bit OS)³ | IPQ-5018 (2c @800MHz) | 512MB | 8 x GbE (1x PoE-out) | 1 x SFP (2.5G) | Wi-Fi 6 (AX600) 2.4GHz, 2x2 | L5 | ~€90 - €110 |
|
||||||
|
| **RB450Gx4** | ARM 32bit | IPQ-4019 (4c @~716MHz)¹ | 1GB | 5 x GbE (1x PoE-out) | No | No (Solo placa, necesita carcasa) | L5 | ~€70 - €85 (placa)⁴ |
|
||||||
|
| **RB5009UG+S+IN** | ARM 64bit | 88F7040 (4c @~1.4GHz)² | 1GB | 7 x GbE, 1 x 2.5GbE | 1 x SFP+ (10G) | No | L5 | ~€155 - €180 |
|
||||||
|
|
||||||
|
Exportar a Hojas de cálculo
|
||||||
|
|
||||||
|
**Notas:**
|
||||||
|
|
||||||
|
1. La frecuencia de la CPU se ajusta automáticamente (p.ej., 448-896 MHz). Se indica la frecuencia nominal o base.
|
||||||
|
2. La frecuencia de la CPU se ajusta automáticamente (p.ej., 864-1800 MHz o 350-1400 MHz). Se indica el rango o la frecuencia máxima.
|
||||||
|
3. Aunque el CPU es ARM 64bit, MikroTik instala una versión de RouterOS de 32 bits en los modelos L009. Esto puede tener implicaciones en el rendimiento de ciertas funciones como la aceleración de cifrado en ZeroTier (ZeroTier usa aceleración AES en ARM64 pero no en ARM32).
|
||||||
|
4. El RB450Gx4 se vende comúnmente como una placa base sin carcasa ni fuente de alimentación. El precio indicado es solo para la placa. Sistemas completos con carcasa son más caros.
|
||||||
|
5. **Todos los modelos listados ejecutan RouterOS v7 y tienen arquitectura ARM/ARM64, cumpliendo el requisito para instalar el paquete ZeroTier.** La performance real de ZeroTier puede variar según la potencia de la CPU y si es ARM32 o ARM64.
|
||||||
|
6. Los precios son estimaciones basadas en búsquedas en tiendas online europeas (Abril 2025) y no incluyen IVA ni gastos de envío. Pueden variar significativamente según el vendedor y la región.
|
||||||
|
|
||||||
|
Notas:
|
||||||
|
|
||||||
|
* Tier Rendimiento ZT (ZeroTier): Estimación basada en arquitectura y OS. Bajo: ARM32. Medio: ARM64 con OS 32bit (L009) o ARM32 con mucha RAM (RB450Gx4). Alto: ARM64 con OS 64bit esperado. El rendimiento real puede variar.
|
||||||
|
|
||||||
|
* Los precios son estimaciones basadas en MSRP y precios de minoristas europeos/americanos (Abril 2024) y están sujetos a cambios y variaciones regionales. Incluyen IVA donde se indica en las fuentes, pero se muestran aquí como rangos generales.
|
||||||
|
|
||||||
|
Esta tabla permite una comparación rápida de las compensaciones entre los diferentes modelos. Por ejemplo, el RB5009UG+S+IN ofrece la conectividad por cable más avanzada (2.5GbE, 10G SFP+) y se espera el mejor rendimiento ZeroTier, pero es el más caro y carece de Wi-Fi. En el otro extremo, el hAP ax lite es el más económico, pero su rendimiento ZeroTier será limitado y solo ofrece Wi-Fi 2.4GHz. Modelos como el hAP ax² ofrecen un buen equilibrio con Wi-Fi 6, CPU ARM64 y precio moderado. La elección dependerá de las prioridades específicas del usuario en cuanto a rendimiento de ZeroTier, conectividad cableada/inalámbrica y presupuesto.
|
||||||
|
|
||||||
|
## 7. Precios y Disponibilidad
|
||||||
|
|
||||||
|
Los precios de estos routers MikroTik varían considerablemente dependiendo del modelo, el proveedor y la región. Basándose en los precios de minoristas europeos y estadounidenses, así como en los precios de venta sugeridos por el fabricante (MSRP), se observan los siguientes rangos estimados (Abril 2024):
|
||||||
|
|
||||||
|
- **hAP ac²:** €55 - €85 / $70 - $80 (MSRP $69)
|
||||||
|
- **hAP ac³:** €78 - €122 / $109 (MSRP)
|
||||||
|
- **hAP ax lite:** €41 - €66 / $59 (MSRP)
|
||||||
|
- **hAP ax²:** €70 - €100 / $99 (MSRP)
|
||||||
|
- **hAP ax³:** €100 - €132 / $139 (MSRP)
|
||||||
|
- **L009UiGS-RM:** €80 - €132 / $119 (MSRP)
|
||||||
|
- **L009UiGS-2HaxD-IN:** €85 - €124 / $125 - $140 (MSRP $129)
|
||||||
|
- **RB450Gx4:** €67 - €149 (Placa o sistema) / $96 - $99 (Placa) (MSRP $99)
|
||||||
|
- **RB5009UG+S+IN:** €155 - €211 / $219 (MSRP)
|
||||||
|
|
||||||
|
Es crucial tener en cuenta que estos precios son solo estimaciones. Los precios finales pueden variar debido a diferencias regionales (los precios en EUR y USD no siempre se correlacionan directamente con el tipo de cambio), márgenes de los distribuidores, costos de envío, impuestos (como el IVA en Europa) y posibles ofertas o descuentos. Los precios MSRP proporcionados por MikroTik sirven como referencia base.
|
||||||
|
|
||||||
|
En cuanto a la disponibilidad, todos los modelos listados son productos actuales que figuran en el sitio web de MikroTik y se encuentran disponibles a través de una amplia red de distribuidores y minoristas en línea tanto en Europa como en América del Norte, como demuestran las numerosas fuentes de precios consultadas. La disponibilidad de stock puede fluctuar entre vendedores específicos.
|
||||||
|
|
||||||
|
## 8. Recomendaciones y Conclusión
|
||||||
|
|
||||||
|
**Resumen de Hallazgos:** El análisis confirma que MikroTik ofrece una gama de routers de formato pequeño basados en arquitectura ARM, capaces de ejecutar el paquete ZeroTier en RouterOS v7+. La selección abarca desde modelos económicos ARM32 hasta potentes dispositivos ARM64 con diversas combinaciones de puertos Ethernet (Gigabit, 2.5GbE), SFP/SFP+, Wi-Fi (Wi-Fi 4, 5 o 6) y licencias RouterOS (L4, L5, L6). La distinción clave para el rendimiento de ZeroTier reside en la arquitectura CPU (ARM32 vs. ARM64) y, en el caso de la serie L009, la versión de RouterOS (32 bits sobre CPU de 64 bits), afectando potencialmente la eficacia de la aceleración por hardware.
|
||||||
|
|
||||||
|
**Recomendaciones Específicas:** La elección óptima dependerá del equilibrio deseado entre rendimiento de ZeroTier, presupuesto, necesidades de conectividad cableada e inalámbrica, y el uso de otras funciones avanzadas de RouterOS.
|
||||||
|
|
||||||
|
- **Mejor Valor para ZeroTier Básico (Presupuesto Ajustado):**
|
||||||
|
|
||||||
|
- **hAP ax lite (L41G-2axD):** Es la opción ARM más económica. Sin embargo, su CPU de 2 núcleos (probablemente ARM32) y solo Wi-Fi 2.4GHz limitarán tanto el rendimiento de ZeroTier como la conectividad general.3 Adecuado si el costo es la máxima prioridad y las demandas de rendimiento son bajas.
|
||||||
|
- **hAP ac² (RBD52G-5HacD2HnD-TC):** Un modelo ARM32 probado y asequible con Wi-Fi 5 de doble banda.1 Ejecutará ZeroTier, pero con rendimiento limitado. Una opción sólida si se acepta esta limitación.
|
||||||
|
- **Máximo Rendimiento ZeroTier y Preparación para el Futuro:**
|
||||||
|
|
||||||
|
- **RB5009UG+S+IN:** Ofrece la CPU ARM64 más potente de este grupo, 1GB RAM, puertos 2.5GbE y 10G SFP+, y se espera que ejecute un OS 64 bits, maximizando el rendimiento de ZeroTier.9 Ideal para usuarios avanzados o "home labs" que priorizan el rendimiento cableado y ZeroTier sobre el Wi-Fi y el costo.
|
||||||
|
- **hAP ax³ (C53UiG+5HPaxD2HPaxD):** Combina una potente CPU ARM64, 1GB RAM, Wi-Fi 6 de doble banda, puerto 2.5GbE y licencia L6.5 Ofrece un excelente rendimiento esperado para ZeroTier junto con conectividad inalámbrica avanzada y la máxima flexibilidad de RouterOS.
|
||||||
|
- **Equilibrio entre Rendimiento y Características:**
|
||||||
|
|
||||||
|
- **hAP ax² (C52iG-5HaxD2HaxD-TC):** Probablemente el punto óptimo para muchos usuarios. Ofrece CPU ARM64, 1GB RAM y Wi-Fi 6 de doble banda a un precio más accesible que el ax³.4 Se espera un buen rendimiento ZeroTier.
|
||||||
|
- **Serie L009 (L009UiGS-RM / L009UiGS-2HaxD-IN):** Atractivos por su moderna CPU ARM64, puerto SFP 2.5G, buen número de puertos Gigabit, soporte para contenedores y precio competitivo.6 Sin embargo, su rendimiento ZeroTier podría verse limitado por el OS de 32 bits. El modelo -RM es solo cableado, mientras que el -IN añade Wi-Fi 6 2.4GHz.
|
||||||
|
- **Enfoque Exclusivamente Cableado:**
|
||||||
|
|
||||||
|
- **RB450Gx4:** Plataforma ARM32 madura con 1GB RAM, 5 puertos Gigabit, PoE-out y licencia L5.8 Fiable, pero el rendimiento ZeroTier será limitado por la arquitectura.
|
||||||
|
- **L009UiGS-RM:** Como se mencionó, ofrece CPU más moderna y SFP 2.5G que el RB450Gx4, pero con el posible cuello de botella del OS de 32 bits para ZeroTier.6
|
||||||
|
- **RB5009UG+S+IN:** La opción de mayor rendimiento cableado y ZeroTier en este segmento.9
|
||||||
|
|
||||||
|
**Conclusión Final:** La selección de un router MikroTik pequeño con CPU ARM para ejecutar ZeroTier requiere una cuidadosa consideración de las necesidades específicas del usuario. La arquitectura ARM es un requisito no negociable. Para un rendimiento óptimo de ZeroTier, se recomienda encarecidamente optar por modelos con CPU ARM64 que ejecuten una versión de RouterOS de 64 bits (como hAP ax², hAP ax³, RB5009UG+S+IN), debido a las ventajas de la aceleración por hardware. Los modelos ARM32 (hAP ac², hAP ac³, hAP ax lite, RB450Gx4) y la serie L009 (ARM64 con OS 32bit) ejecutarán ZeroTier, pero con un rendimiento potencialmente inferior. Más allá del rendimiento de ZeroTier, factores como el presupuesto, la necesidad de Wi-Fi (y su generación), la cantidad y velocidad de los puertos Ethernet/SFP, y el nivel de licencia de RouterOS (que afecta otras funcionalidades avanzadas 1) deben guiar la decisión final. Se recomienda verificar siempre las últimas versiones de RouterOS y del paquete ZeroTier para asegurar la compatibilidad continua y posibles mejoras de rendimiento.
|
|
@ -0,0 +1,417 @@
|
||||||
|
# Guía Completa para Configurar la Transcodificación por Hardware (QSV) de Jellyfin en Synology DS220+ con Docker
|
||||||
|
|
||||||
|
## I. Introducción
|
||||||
|
|
||||||
|
**Propósito:** Este informe aborda el objetivo de habilitar la transcodificación por hardware Intel QuickSync Video (QSV) para el servidor multimedia Jellyfin versión 10.10.7, ejecutándose dentro de un contenedor Docker en un NAS Synology DS220+. El propósito es proporcionar una guía exhaustiva de configuración y solución de problemas para superar los desafíos comunes asociados con esta tarea.
|
||||||
|
|
||||||
|
**Contexto:** El Synology DS220+, equipado con un procesador Intel Celeron J4025, posee la capacidad inherente de realizar transcodificación acelerada por hardware mediante QSV. Sin embargo, habilitar esta funcionalidad para una aplicación como Jellyfin dentro del entorno aislado de Docker en Synology DiskStation Manager (DSM) requiere una serie de pasos de configuración específicos. Estos pasos involucran el acceso a dispositivos de hardware, la gestión de permisos y la configuración precisa del software, lo que frecuentemente presenta dificultades para los usuarios.
|
||||||
|
|
||||||
|
**Estructura del Informe:** Este documento se estructura para guiar al usuario a través del proceso completo:
|
||||||
|
|
||||||
|
1. Análisis de las capacidades del hardware (CPU J4025 y QSV).
|
||||||
|
2. Prerrequisitos necesarios en Synology DSM para permitir el acceso al hardware desde Docker.
|
||||||
|
3. Configuración detallada del contenedor Docker de Jellyfin.
|
||||||
|
4. Ajustes específicos dentro de la interfaz de Jellyfin (v10.10.7).
|
||||||
|
5. Métodos de verificación y una guía de solución de problemas comunes, incluyendo el análisis de registros.
|
||||||
|
|
||||||
|
## II. Capacidades del Intel Celeron J4025 y QuickSync (Abordando Punto 1 de la Consulta)
|
||||||
|
|
||||||
|
Visión General del Procesador:
|
||||||
|
|
||||||
|
El Synology DS220+ integra el procesador Intel Celeron J4025. Este chip pertenece a la familia Gemini Lake Refresh y se caracteriza por su bajo consumo energético (TDP de 10 W), lo que lo hace adecuado para dispositivos NAS. Cuenta con 2 núcleos y 2 hilos de procesamiento, operando a una frecuencia base de 2.00 GHz y alcanzando hasta 2.90 GHz en modo ráfaga. Si bien es eficiente energéticamente, su rendimiento general de CPU es modesto, situándose en la gama de entrada, adecuado para tareas básicas pero limitado para multitarea intensiva o cargas de trabajo pesadas.
|
||||||
|
|
||||||
|
Gráficos Integrados (iGPU):
|
||||||
|
|
||||||
|
El J4025 incluye una unidad de procesamiento gráfico (GPU) integrada, la Intel UHD Graphics 600. Esta iGPU cuenta con 12 Unidades de Ejecución (EUs) y opera a frecuencias entre 250 MHz y 700 MHz. Es capaz de manejar salida de video 4K a 60Hz a través de DisplayPort.
|
||||||
|
|
||||||
|
Confirmación de Soporte QuickSync:
|
||||||
|
|
||||||
|
Es fundamental confirmar que el procesador Celeron J4025 y su iGPU UHD Graphics 600 sí soportan la tecnología Intel Quick Sync Video (QSV). QSV es la tecnología clave de Intel que permite la aceleración por hardware para la codificación y decodificación de video, descargando estas tareas de los núcleos principales de la CPU y utilizando los circuitos especializados de la iGPU.
|
||||||
|
|
||||||
|
Soporte de Códecs Acelerados por Hardware:
|
||||||
|
|
||||||
|
La iGPU UHD Graphics 600 (Gemini Lake Refresh) ofrece aceleración por hardware para varios códecs de video populares. Basándose en las especificaciones y las configuraciones recomendadas para Jellyfin en hardware similar, las capacidades son las siguientes:
|
||||||
|
|
||||||
|
- **Decodificación por Hardware:**
|
||||||
|
- H.264 (AVC): Soportado (Estándar universalmente soportado por QSV).
|
||||||
|
- H.265 (HEVC): Soportado, incluyendo perfiles de 8 bits y 10 bits.1
|
||||||
|
- VP9: Soportado, incluyendo perfiles de 8 bits y 10 bits.1
|
||||||
|
- MPEG2: Soportado (Común en QSV de esta generación, presente en ajustes de Jellyfin).1
|
||||||
|
- VC1: Soportado (Común en QSV de esta generación, presente en ajustes de Jellyfin).1
|
||||||
|
- AV1: **No** soportado por hardware. La decodificación de AV1 se realizará por software, utilizando los núcleos de la CPU.
|
||||||
|
- **Codificación por Hardware:**
|
||||||
|
- H.264 (AVC): Soportado (Característica estándar de QSV, referenciada como "H.264 Output" en la consulta inicial).
|
||||||
|
- H.265 (HEVC): Soportado (Característica estándar de QSV para esta generación, opción configurable en Jellyfin).1
|
||||||
|
|
||||||
|
La siguiente tabla resume estas capacidades:
|
||||||
|
|
||||||
|
**Tabla 1: Capacidades de Códecs QSV del Celeron J4025 / UHD 600**
|
||||||
|
|
||||||
|
| | | | |
|
||||||
|
|---|---|---|---|
|
||||||
|
|**Códec**|**Decodificación HW**|**Codificación HW**|**Notas**|
|
||||||
|
|H.264 (AVC)|Sí|Sí|Ampliamente compatible.|
|
||||||
|
|H.265 (HEVC)|Sí (8/10-bit)|Sí|Esencial para contenido 4K moderno.|
|
||||||
|
|VP9|Sí (8/10-bit)|No Común|Usado por YouTube; decodificación importante.|
|
||||||
|
|MPEG2|Sí|No Común|Para contenido más antiguo (DVDs).|
|
||||||
|
|VC1|Sí|No Común|Para contenido más antiguo (Blu-ray).|
|
||||||
|
|AV1|**No**|**No**|Decodificación solo por software; alto uso de CPU esperado.|
|
||||||
|
|
||||||
|
Consideraciones de Rendimiento:
|
||||||
|
|
||||||
|
Aunque QSV descarga significativamente la CPU durante la transcodificación, es crucial entender que el Celeron J4025 sigue siendo un procesador de bajo rendimiento. Además, algunas implementaciones de QSV en SoCs (System-on-a-Chip) como el J4025 pueden tener un rendimiento inferior en comparación con las versiones de escritorio o portátiles. Esto implica que, si bien QSV funcionará, el número de transcodificaciones simultáneas (especialmente de contenido 4K de alta tasa de bits) o el uso de funciones intensivas como el mapeo de tonos (tone mapping) HDR a SDR o la incrustación de subtítulos gráficos, podría estar limitado por la potencia general del hardware. La presencia de QSV es una condición necesaria, pero no suficiente, para un rendimiento ilimitado en hardware de gama baja.
|
||||||
|
|
||||||
|
Una limitación importante es la falta de decodificación por hardware para el códec AV1. Cualquier archivo multimedia en formato AV1 requerirá decodificación por software, lo que ejercerá una carga muy pesada sobre los limitados núcleos de la CPU del J4025, anulando los beneficios de QSV para ese contenido específico. Esto es relevante para usuarios con bibliotecas que incluyan material en AV1.
|
||||||
|
|
||||||
|
## III. Prerrequisitos de Synology DSM para Aceleración por Hardware (Abordando Punto 2 de la Consulta)
|
||||||
|
|
||||||
|
Antes de configurar el contenedor Docker, es esencial asegurarse de que el sistema operativo Synology DSM esté preparado para permitir el acceso a los dispositivos de hardware necesarios.
|
||||||
|
|
||||||
|
Verificar la Existencia de Dispositivos /dev/dri:
|
||||||
|
|
||||||
|
El kernel de Linux expone los dispositivos de hardware gráfico a través del subsistema Direct Rendering Manager (DRM) en el directorio /dev/dri. Para la aceleración por hardware de Intel (QSV/VAAPI), los dispositivos clave son típicamente card0 y renderD128. Es necesario verificar su existencia en el sistema Synology mediante SSH:
|
||||||
|
|
||||||
|
Bash
|
||||||
|
|
||||||
|
```
|
||||||
|
ls -l /dev/dri
|
||||||
|
```
|
||||||
|
|
||||||
|
Se espera ver listados como `card0` y `renderD128`. Si estos archivos no existen, podría indicar un problema subyacente con los módulos del kernel de DSM o la detección del hardware, aunque esto es poco probable en un DS220+ con DSM estándar. La ausencia de estos archivos impediría cualquier forma de aceleración por hardware.
|
||||||
|
|
||||||
|
Comprobar y Establecer Permisos para Dispositivos /dev/dri:
|
||||||
|
|
||||||
|
Un punto de fallo extremadamente común al configurar la aceleración por hardware en Docker sobre Synology son los permisos de acceso a los dispositivos en /dev/dri. El proceso de Jellyfin, ejecutándose dentro del contenedor Docker, necesita permisos para leer y escribir en estos dispositivos.
|
||||||
|
|
||||||
|
Primero, se deben verificar los permisos actuales:
|
||||||
|
|
||||||
|
Bash
|
||||||
|
|
||||||
|
```
|
||||||
|
ls -l /dev/dri
|
||||||
|
```
|
||||||
|
|
||||||
|
Se debe anotar el propietario (usualmente `root`) y, más importante, el grupo propietario. Este grupo puede variar según la versión de DSM; podría ser `root`, `video`, `render`, o un grupo específico de Synology como `videodriver`.
|
||||||
|
|
||||||
|
Existen dos métodos principales para otorgar acceso al contenedor:
|
||||||
|
|
||||||
|
- Método 1 (Solución Alternativa - Menos Segura): Uso de chmod
|
||||||
|
|
||||||
|
Este método implica cambiar directamente los permisos de los archivos del dispositivo para hacerlos accesibles a todos los usuarios o a un grupo más amplio.2 Comandos comunes ejecutados vía SSH como root son:
|
||||||
|
|
||||||
|
Bash
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo chmod 666 /dev/dri/renderD128
|
||||||
|
# O, de forma más amplia pero menos específica:
|
||||||
|
# sudo chmod 777 /dev/dri/*
|
||||||
|
```
|
||||||
|
|
||||||
|
El comando `chmod 666` otorga permisos de lectura y escritura a todos (propietario, grupo, otros), mientras que `chmod 777` también otorga permisos de ejecución. Aunque es más fácil de implementar, esta aproximación es menos segura ya que concede acceso potencialmente innecesario.2 Además, los permisos del sistema de archivos `/dev` suelen restablecerse al reiniciar el NAS. Por lo tanto, este comando `chmod` a menudo necesita ser ejecutado automáticamente en cada arranque mediante una Tarea Programada en el Panel de Control de DSM (ejecutada como `root` en el evento "Arranque").3
|
||||||
|
|
||||||
|
- Método 2 (Recomendado - Más Seguro): Uso de Pertenencia a Grupo
|
||||||
|
|
||||||
|
Este enfoque consiste en identificar el grupo que ya posee los permisos necesarios sobre los dispositivos /dev/dri (el grupo anotado con ls -l) y añadir el usuario que ejecuta el contenedor Docker a ese grupo específico. Primero, se necesita el ID numérico del grupo (GID). Si el grupo es, por ejemplo, render, se obtiene su GID con:
|
||||||
|
|
||||||
|
Bash
|
||||||
|
|
||||||
|
```
|
||||||
|
getent group render | cut -d: -f3
|
||||||
|
```
|
||||||
|
|
||||||
|
Reemplace `render` con el nombre del grupo correcto identificado en su sistema (`video`, `videodriver`, etc.). Este GID se utilizará posteriormente en la configuración de Docker Compose (`group_add`).3 Este método es más seguro porque concede acceso solo a los miembros del grupo apropiado. La dificultad radica en identificar correctamente el grupo relevante en la versión específica de DSM, ya que podría diferir de las configuraciones estándar de Linux.
|
||||||
|
|
||||||
|
|
||||||
|
La recurrencia de problemas de permisos en discusiones y guías 2 y la existencia de estos dos métodos (uno fácil pero inseguro, otro seguro pero que requiere identificar el grupo correcto) subrayan un desafío central en esta configuración. Es preferible utilizar el método de pertenencia a grupo por seguridad.
|
||||||
|
|
||||||
|
Identificar IDs de Usuario/Grupo Correctos (PUID/PGID):
|
||||||
|
|
||||||
|
Por razones de seguridad, se recomienda encarecidamente no ejecutar contenedores Docker como usuario root. En su lugar, se debe utilizar un usuario sin privilegios o el usuario administrador principal. Es necesario obtener el ID de Usuario (UID) y el ID de Grupo primario (GID) de la cuenta de usuario bajo la cual se ejecutará el proceso de Jellyfin dentro del contenedor. Esto se hace vía SSH con el comando id <nombre_de_usuario> (reemplace <nombre_de_usuario> con el nombre de usuario deseado). Guías como las de MariusHosting o Dr Frankenstein 1 a menudo proporcionan instrucciones detalladas o enlaces para obtener estos valores. Estos PUID y PGID son cruciales para las variables de entorno en la configuración de Docker Compose.1
|
||||||
|
|
||||||
|
Estado de Paquetes DSM Relevantes:
|
||||||
|
|
||||||
|
Finalmente, asegurarse de que el paquete Docker (o su nombre más reciente, Container Manager) esté instalado y en ejecución desde el Centro de Paquetes de Synology.
|
||||||
|
|
||||||
|
## IV. Configuración de Jellyfin en Docker para Acceso QSV (Abordando Puntos 3 y 7 de la Consulta)
|
||||||
|
|
||||||
|
Enfoque Recomendado: Docker Compose / Pilas de Portainer:
|
||||||
|
|
||||||
|
La interfaz gráfica estándar de Docker/Container Manager en Synology DSM a menudo carece de las opciones avanzadas necesarias para pasar dispositivos de hardware (/dev/dri) o añadir grupos suplementarios (group_add) al contenedor. Por ello, el método más fiable y recomendado es definir la configuración del contenedor utilizando Docker Compose. Esto se puede hacer:
|
||||||
|
|
||||||
|
1. Creando un archivo `docker-compose.yml` directamente en el NAS (por ejemplo, usando el paquete Text Editor o vía SSH) y ejecutándolo con `docker-compose` desde SSH.
|
||||||
|
2. Utilizando la funcionalidad de "Pilas" (Stacks) en Portainer, si Portainer está instalado, que permite pegar directamente el código de Docker Compose.
|
||||||
|
3. Utilizando la funcionalidad de "Proyecto" basada en Compose dentro de la aplicación Container Manager más reciente de Synology, que también permite pegar código Compose.
|
||||||
|
|
||||||
|
Desglose Detallado de Docker Compose:
|
||||||
|
|
||||||
|
A continuación se presenta una estructura recomendada para el archivo docker-compose.yml, integrando las mejores prácticas observadas:
|
||||||
|
|
||||||
|
YAML
|
||||||
|
|
||||||
|
```
|
||||||
|
version: '3.8' # O una versión compatible
|
||||||
|
|
||||||
|
services:
|
||||||
|
jellyfin:
|
||||||
|
image: jellyfin/jellyfin:10.10.7 # Usar la versión específica del usuario o 'latest'
|
||||||
|
container_name: jellyfin-qsv # Nombre descriptivo
|
||||||
|
network_mode: host # Opción más simple para acceso a dispositivos/descubrimiento, considerar red bridge personalizada para mayor control/seguridad
|
||||||
|
volumes:
|
||||||
|
- /volume1/docker/jellyfin/config:/config # Ruta al directorio de configuración en el NAS
|
||||||
|
- /volume1/docker/jellyfin/cache:/cache # Ruta al directorio de caché en el NAS
|
||||||
|
# - /volume1/docker/jellyfin/logs:/logs # Opcional: Mapeo explícito de logs (a menudo van a /config/logs por defecto)
|
||||||
|
- /volume1/video:/media/videos:rw # Mapeo de biblioteca de películas (ajustar rutas y permisos :rw o :ro)
|
||||||
|
- /volume1/music:/media/musica:rw # Mapeo de biblioteca de música (ajustar rutas)
|
||||||
|
environment:
|
||||||
|
- PUID=1026 # REEMPLAZAR con el UID real del usuario
|
||||||
|
- PGID=100 # REEMPLAZAR con el GID real del usuario
|
||||||
|
- TZ=Europe/Madrid # REEMPLAZAR con la zona horaria correcta
|
||||||
|
# - JELLYFIN_PublishedServerUrl=http://su_dominio:8096 # Opcional: Para acceso externo
|
||||||
|
devices:
|
||||||
|
# Método recomendado: Mapear explícitamente ambos dispositivos
|
||||||
|
- /dev/dri/renderD128:/dev/dri/renderD128
|
||||||
|
- /dev/dri/card0:/dev/dri/card0
|
||||||
|
# Alternativa (más simple, menos específica):
|
||||||
|
# - /dev/dri:/dev/dri
|
||||||
|
group_add:
|
||||||
|
# Añadir SÓLO si se usa el Método 2 de permisos (Pertenencia a Grupo)
|
||||||
|
- "105" # REEMPLAZAR con el GID del grupo propietario de /dev/dri (e.g., render, video, videodriver)
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true # Recomendado para seguridad [1]
|
||||||
|
restart: unless-stopped # Política de reinicio
|
||||||
|
```
|
||||||
|
|
||||||
|
**Explicación de Secciones Clave:**
|
||||||
|
|
||||||
|
- `image`: Se recomienda usar la imagen oficial `jellyfin/jellyfin`, especificando la versión `10.10.7` o usando `latest`. Aunque `linuxserver/jellyfin` fue usado en el pasado para workarounds de drivers, ahora se considera obsoleto para este propósito.
|
||||||
|
- `network_mode`: `host` 4 simplifica el acceso a dispositivos y el descubrimiento automático (DLNA/App), pero vincula directamente los puertos del contenedor a los del host. Una red bridge personalizada (como `synobridge`) ofrece mejor aislamiento si se configuran los mapeos de puertos necesarios (e.g., `ports: - 8096:8096`). Para empezar, `host` puede ser más fácil.
|
||||||
|
- `volumes`: Es crucial mapear directorios persistentes para la configuración (`/config`), caché (`/cache`), y las bibliotecas multimedia.1 Las rutas internas del contenedor (e.g., `/media/videos`) deben coincidir con las configuradas en las bibliotecas de Jellyfin.
|
||||||
|
- `environment`: Establecer `PUID`, `PGID` y `TZ` es fundamental.1 El uso de PUID/PGID `0` (root) se observa como un intento de solucionar problemas de permisos, pero **no se recomienda** por seguridad. Es preferible configurar correctamente los permisos de grupo o `chmod`.
|
||||||
|
- `devices`: Esta es la sección crítica para QSV.1 Se comparan los intentos del usuario:
|
||||||
|
- `/dev/dri/renderD128:/dev/dri/renderD128`: Mapea el nodo de renderizado principal. Es esencial, pero podría ser insuficiente si `card0` también es necesario para la inicialización.1
|
||||||
|
- `/dev/dri/:/dev/dri/`: Mapea todo el directorio. Debería funcionar 2, pero es menos específico. Si esto falló para el usuario, el problema probablemente radica en los permisos o la configuración de Jellyfin.
|
||||||
|
- **Recomendación:** Mapear explícitamente tanto `renderD128` como `card0` 1 es el enfoque más robusto y recomendado para empezar, asegurando que todos los componentes necesarios estén disponibles.
|
||||||
|
- `group_add`: Usar solo si se aplica el método de permisos por grupo (Método 2, Sección III). Se debe añadir el GID numérico del grupo que posee los dispositivos `/dev/dri`.3
|
||||||
|
- `security_opt`: `no-new-privileges:true` es una buena práctica de seguridad.1
|
||||||
|
- `restart`: Define cómo debe reiniciarse el contenedor en caso de fallo o reinicio del NAS.4
|
||||||
|
|
||||||
|
La variabilidad en las recomendaciones de mapeo de dispositivos (`renderD128` solo, ambos, o `/dev/dri:/dev/dri`) en diferentes fuentes 1 sugiere que diferentes configuraciones pueden funcionar, posiblemente dependiendo de la versión de DSM/kernel/drivers. Sin embargo, mapear ambos dispositivos específicos (`renderD128` y `card0`) parece ser la opción más completa y menos propensa a fallos por falta de un componente.
|
||||||
|
|
||||||
|
**Tabla 2: Configuración Docker Compose Recomendada para Jellyfin QSV en DS220+**
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
|---|---|---|
|
||||||
|
|**Parámetro**|**Valor/Sintaxis Recomendada**|**Explicación/Notas**|
|
||||||
|
|`image`|`jellyfin/jellyfin:10.10.7`|Usar imagen oficial, versión específica del usuario.|
|
||||||
|
|`container_name`|`jellyfin-qsv`|Nombre claro para identificación.|
|
||||||
|
|`network_mode`|`host` (o bridge personalizado)|`host` es más simple para empezar; bridge requiere mapeo de puertos.|
|
||||||
|
|`volumes`|`- /ruta/host/config:/config` <br> `- /ruta/host/cache:/cache` <br> `- /ruta/media:/media/ruta_interna`|Mapear configuración, caché y bibliotecas. Ajustar rutas del host.|
|
||||||
|
|`environment`|`PUID=<UID>` <br> `PGID=<GID>` <br> `TZ=<ZonaHoraria>`|**Esencial:** Usar UID/GID no-root correctos y zona horaria. **No usar PUID/PGID 0**.|
|
||||||
|
|`devices`|`- /dev/dri/renderD128:/dev/dri/renderD128` <br> `- /dev/dri/card0:/dev/dri/card0`|**Crítico:** Mapear ambos dispositivos explícitamente para QSV.|
|
||||||
|
|`group_add`|`- "<GID_dri>"` (Opcional)|Usar solo si se aplica el método de permisos por grupo. Reemplazar `<GID_dri>` por el GID correcto.|
|
||||||
|
|`security_opt`|`- no-new-privileges:true`|Mejora la seguridad del contenedor.|
|
||||||
|
|`restart`|`unless-stopped`|Reiniciar el contenedor automáticamente a menos que se detenga manualmente.|
|
||||||
|
|
||||||
|
Una vez creado el archivo `docker-compose.yml` (por ejemplo, en `/volume1/docker/jellyfin/docker-compose.yml`), se puede iniciar el contenedor desde SSH navegando a ese directorio y ejecutando:
|
||||||
|
|
||||||
|
Bash
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## V. Ajustes de Reproducción de Jellyfin para Transcodificación QSV (v10.10.7) (Abordando Punto 4 de la Consulta)
|
||||||
|
|
||||||
|
Después de iniciar el contenedor Docker con la configuración correcta, es necesario ajustar las opciones de transcodificación dentro de la interfaz web de Jellyfin.
|
||||||
|
|
||||||
|
**Navegación:** Acceder a la interfaz web de Jellyfin, ir a Administración -> Panel de Control -> Reproducción (en la barra lateral izquierda) -> pestaña Transcodificación.
|
||||||
|
|
||||||
|
**Selección de Aceleración por Hardware:**
|
||||||
|
|
||||||
|
- En el desplegable "Aceleración por hardware", seleccionar `Intel QuickSync (QSV)`.1
|
||||||
|
- El campo "Dispositivo QSV" que aparece debe dejarse **en blanco** en la mayoría de los casos. Jellyfin/FFmpeg generalmente detecta automáticamente el dispositivo correcto (`/dev/dri/renderD128`) si se ha pasado correctamente al contenedor.
|
||||||
|
- **Nota sobre VAAPI:** Video Acceleration API (VAAPI) es otra API para aceleración por hardware en Linux que también utiliza la iGPU de Intel. Aunque QSV suele ser preferible cuando funciona correctamente (puede ofrecer más funciones o mejor rendimiento), VAAPI puede seleccionarse como alternativa si QSV presenta problemas persistentes.
|
||||||
|
|
||||||
|
**Opciones de Decodificación por Hardware:**
|
||||||
|
|
||||||
|
- Marcar las casillas correspondientes a los códecs que la UHD 600 puede decodificar por hardware (consultar Tabla 1): H.264, HEVC, HEVC 10bit, VP9, VP9 10bit, MPEG2, VC1.1
|
||||||
|
- **Importante:** **No marcar** la casilla de `AV1`, ya que no tiene soporte de decodificación por hardware en este procesador.
|
||||||
|
- Aunque las guías sugieren marcar muchas casillas 1, hay que tener en cuenta que algunos códecs, incluso si teóricamente soportados, podrían causar inestabilidad en ciertas combinaciones de hardware/driver (por ejemplo, formatos más antiguos como MPEG2/VC1 o los exigentes formatos de 10 bits). Se recomienda empezar con la lista completa (excepto AV1) pero estar preparado para desmarcar códecs específicos (especialmente MPEG2, VC1, HEVC 10bit, VP9 10bit) si se encuentran problemas durante la solución de errores.
|
||||||
|
|
||||||
|
**Opciones de Codificación por Hardware:**
|
||||||
|
|
||||||
|
- Marcar `Habilitar codificación por hardware`.4
|
||||||
|
- Marcar `Permitir codificación en formato HEVC` si se desea. Esto permite a Jellyfin transcodificar _hacia_ HEVC, lo que puede ahorrar ancho de banda en comparación con H.264, pero podría ser más lento o menos compatible con dispositivos cliente antiguos.1 Se recomienda habilitarlo.
|
||||||
|
|
||||||
|
Configuración de Mapeo de Tonos (Tone Mapping HDR->SDR):
|
||||||
|
|
||||||
|
Esta función es necesaria para visualizar correctamente contenido HDR en pantallas SDR, pero es intensiva en recursos.
|
||||||
|
|
||||||
|
- `Habilitar mapeo de tonos VPP`: Recomendado: **Marcado**. Utiliza las capacidades de Video Post Processing (VPP) de la iGPU para realizar el mapeo de tonos por hardware.1
|
||||||
|
- `Habilitar mapeo de tonos`: Recomendado: **Desmarcado**. Esta opción a menudo se refiere a métodos alternativos como el mapeo de tonos basado en OpenCL, que requiere configuración adicional (instalar drivers/mods específicos en el contenedor) y puede tener un rendimiento pobre o fallar en la UHD 600.1
|
||||||
|
- Existe cierta confusión en las fuentes sobre estas dos opciones. Mientras que S14 y 1 recomiendan VPP=Marcado y Tone Mapping=Desmarcado para Gemini Lake, S15 reportó éxito con ambas marcadas. Dado el limitado rendimiento del J4025, confiar únicamente en VPP (si funciona) es la apuesta más segura. Se recomienda empezar con VPP Marcado y Tone Mapping Desmarcado.
|
||||||
|
|
||||||
|
**Otros Ajustes:**
|
||||||
|
|
||||||
|
- `Preferir decodificadores por hardware nativos del SO (DXVA o VA-API)`: Recomendado: **Marcado**. Aunque se selecciona QSV, marcar esta opción puede ayudar a FFmpeg a inicializar correctamente el backend VAAPI que QSV utiliza en Linux.4
|
||||||
|
- `Habilitar codificador por hardware H.264 de bajo consumo Intel` / `Habilitar codificador por hardware HEVC de bajo consumo Intel`: Recomendado: **Desmarcado**.5 Estos codificadores suelen ser para implementaciones QSV diferentes (e.g., en procesadores Atom) y pueden causar fallos o bajo rendimiento en Gemini Lake. Deshabilitarlos es también un paso de troubleshooting sugerido.
|
||||||
|
- `Permitir extracción de subtítulos sobre la marcha`: Recomendado: **Marcado**.
|
||||||
|
|
||||||
|
**Tabla 3: Ajustes de Transcodificación Recomendados en Jellyfin para J4025 QSV (v10.10.7)**
|
||||||
|
|
||||||
|
| | | | |
|
||||||
|
|---|---|---|---|
|
||||||
|
|**Categoría**|**Ajuste**|**Valor Recomendado**|**Razón/Notas**|
|
||||||
|
|Aceleración|Aceleración por hardware|Intel QuickSync (QSV)|Selecciona la tecnología QSV de Intel.|
|
||||||
|
||Dispositivo QSV|(Dejar en blanco)|Generalmente detectado automáticamente si los dispositivos Docker están bien mapeados.|
|
||||||
|
|Decodificación HW|H.264, HEVC, HEVC 10bit, VP9, VP9 10bit, MPEG2, VC1|Marcado|Habilitar decodificación HW para códecs soportados por UHD 600.|
|
||||||
|
||AV1|**Desmarcado**|**Crítico:** AV1 no tiene soporte HW en J4025.|
|
||||||
|
|Codificación HW|Habilitar codificación por hardware|Marcado|Permite usar QSV para la salida de transcodificación.|
|
||||||
|
||Permitir codificación en formato HEVC|Marcado|Permite transcodificar _a_ HEVC (ahorro de ancho de banda).|
|
||||||
|
|Mapeo de Tonos|Habilitar mapeo de tonos VPP|Marcado|Usa el post-procesamiento por hardware para mapeo de tonos HDR->SDR.|
|
||||||
|
||Habilitar mapeo de tonos|**Desmarcado**|Evita métodos alternativos (OpenCL) que pueden fallar o requerir setup extra en Gemini Lake.|
|
||||||
|
|Otros|Preferir decodificadores por hardware nativos del SO (DXVA/VAAPI)|Marcado|Ayuda a la inicialización de VAAPI/QSV en Linux.|
|
||||||
|
||Codificadores H.264/HEVC de bajo consumo Intel|**Desmarcado**|No aplicables o pueden causar problemas en Gemini Lake.|
|
||||||
|
||Permitir extracción de subtítulos sobre la marcha|Marcado|Necesario para algunos tipos de subtítulos.|
|
||||||
|
|
||||||
|
Tras realizar estos cambios, es fundamental hacer clic en el botón **Guardar** al final de la página de configuración de transcodificación.
|
||||||
|
|
||||||
|
## VI. Guía de Verificación y Solución de Problemas (Abordando Puntos 5, 6 y 8 de la Consulta)
|
||||||
|
|
||||||
|
Una vez configurados Docker y Jellyfin, es necesario verificar que la transcodificación por hardware está funcionando y saber cómo solucionar problemas si no es así.
|
||||||
|
|
||||||
|
**Confirmación de QSV Activo:**
|
||||||
|
|
||||||
|
1. **Panel de Control de Jellyfin:** Durante la reproducción de un archivo que requiera transcodificación (por ejemplo, forzando una calidad inferior en el cliente), ir al Panel de Control -> Flujos Activos. Buscar indicadores `(HW)` junto a los pasos de decodificación y/o codificación del flujo de video. La presencia de `(HW)` confirma que se está usando aceleración por hardware.
|
||||||
|
2. **Información de Reproducción del Cliente:** La mayoría de los clientes de Jellyfin (web, móvil, TV) tienen una opción durante la reproducción (a menudo un icono de engranaje o similar) para ver "Información de Reproducción" o "Estadísticas para Nerds". Esta pantalla suele indicar si la reproducción es Directa (Direct Play), Remux (Direct Stream) o Transcodificación, y a menudo muestra la razón de la transcodificación.
|
||||||
|
3. **Monitor de Recursos de Synology:** Observar el uso de la CPU en el Monitor de Recursos de DSM mientras se realiza una transcodificación. Con QSV activo, el uso de la CPU debería ser notablemente más bajo que sin aceleración por hardware (transcodificación por software). Un uso de CPU cercano al 100% indica que QSV probablemente no está funcionando correctamente. Sin embargo, cierto uso de CPU es normal, ya que QSV no acelera todas las partes del proceso (e.g., transcodificación de audio, demux/mux).
|
||||||
|
|
||||||
|
Análisis de Registros (Logs):
|
||||||
|
|
||||||
|
Los registros son herramientas indispensables para diagnosticar problemas.
|
||||||
|
|
||||||
|
- **Ubicación de los Registros:**
|
||||||
|
- **Registros del Servidor Jellyfin:** Se pueden ver directamente desde la interfaz web: Panel de Control -> Registros. Alternativamente, se puede acceder a los archivos de registro en el volumen mapeado en Docker (e.g., `/volume1/docker/jellyfin/config/logs` o la ruta mapeada explícitamente) usando File Station o SSH. El archivo principal suele ser `log_YYYYMMDD.log`.
|
||||||
|
- **Registros de Transcodificación FFmpeg:** Son cruciales para problemas de reproducción. Se encuentran en el mismo directorio de registros de Jellyfin, con nombres como `ffmpeg-transcode-<identificador_único>.log`. Se genera un archivo por cada intento de transcodificación.
|
||||||
|
- **Acceso Dentro del Contenedor:** Para inspeccionar registros u otros archivos dentro del contenedor en ejecución, se puede usar el comando `docker exec` desde SSH en el NAS: `sudo docker exec -it jellyfin-qsv /bin/bash` (reemplace `jellyfin-qsv` por el nombre real del contenedor). Una vez dentro, navegar a `/config/logs`.
|
||||||
|
- **Habilitación de Registro de Depuración (Debug Logging):** Para obtener información más detallada, se puede habilitar el modo de depuración. Esto requiere crear (o editar si ya existe) un archivo llamado `logging.json` en el directorio de configuración de Jellyfin (`/config` dentro del contenedor). El contenido para habilitar la depuración es:
|
||||||
|
|
||||||
|
JSON
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"Serilog": {
|
||||||
|
"MinimumLevel": {
|
||||||
|
"Default": "Debug",
|
||||||
|
"Override": {
|
||||||
|
"Microsoft": "Warning",
|
||||||
|
"System": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Advertencia:** El modo de depuración genera una cantidad masiva de registros y solo debe usarse temporalmente para solucionar problemas. Recordar eliminar o revertir el archivo `logging.json` después. Puede ser necesario reiniciar el contenedor Jellyfin para que los cambios surtan efecto.
|
||||||
|
- **Interpretación de los Registros:**
|
||||||
|
- Buscar mensajes relacionados con la inicialización del contexto de hardware (VAAPI/QSV). Mensajes como `Initializing VAAPI device`, `Trying to use QSV`, `Hardware acceleration enabled` son indicativos de progreso.
|
||||||
|
- Prestar atención a mensajes de error explícitos como `Device creation failed`, `Cannot allocate memory`, `Failed to query an output frame`, `Error initializing output stream`, `No such file or directory`.
|
||||||
|
- Revisar los argumentos de la línea de comandos de FFmpeg que Jellyfin registra justo antes de iniciar una transcodificación. Esto revela los códecs de entrada/salida, filtros aplicados (escalado, mapeo de tonos, subtítulos) y las flags de aceleración por hardware (`-hwaccel qsv`, `-vf scale_qsv`, `-c:v h264_qsv`).
|
||||||
|
- Identificar Códigos de Salida de FFmpeg: Buscar líneas como `FFmpeg exited with code X`. El `code 1` es un error genérico y requiere examinar los mensajes previos. Otros códigos (e.g., 137, 218, 251) pueden ser más específicos pero a menudo están mal documentados. Ver Tabla 4.
|
||||||
|
|
||||||
|
Problemas Comunes y Soluciones:
|
||||||
|
|
||||||
|
A continuación se resumen los problemas más frecuentes encontrados al configurar QSV en Jellyfin/Docker/Synology y sus posibles soluciones:
|
||||||
|
|
||||||
|
- **Problema:** La reproducción falla inmediatamente con "Fatal Player Error". El log de FFmpeg muestra `Device creation failed`, `Cannot open /dev/dri/renderD128`, o errores de permisos.
|
||||||
|
|
||||||
|
- **Causa Probable:** Mapeo incorrecto de dispositivos en Docker Compose (`devices:`) O permisos insuficientes en los archivos `/dev/dri/` en el host Synology.
|
||||||
|
- **Solución:**
|
||||||
|
1. Verificar la sección `devices:` en `docker-compose.yml` (usar el mapeo recomendado de `renderD128` y `card0`).
|
||||||
|
2. Verificar y corregir permisos en `/dev/dri/` en el host (preferiblemente usando pertenencia a grupo con `group_add` en Docker Compose; o como alternativa, usar `chmod` con una tarea programada).
|
||||||
|
3. Asegurarse de usar PUID/PGID correctos (no root).
|
||||||
|
4. Reiniciar el contenedor Jellyfin (`docker-compose down && docker-compose up -d`).
|
||||||
|
- **Problema:** La transcodificación comienza pero falla a mitad de la reproducción. El log de FFmpeg muestra `Cannot allocate memory`, `Can't allocate a surface`.
|
||||||
|
|
||||||
|
- **Causa Probable:** Problema con el driver QSV/i915, límite de memoria de la iGPU excedido (especialmente con 4K, 10-bit, o mapeo de tonos), bug en FFmpeg, o a veces relacionado con streams de diferente duración (video vs audio/subtítulos). Problemas de BIOS también se han reportado en algunos sistemas, aunque menos común en NAS.
|
||||||
|
- **Solución:**
|
||||||
|
1. Intentar deshabilitar el mapeo de tonos VPP en los ajustes de Jellyfin.
|
||||||
|
2. Probar con contenido más simple (e.g., 1080p 8-bit SDR).
|
||||||
|
3. Asegurarse de usar versiones estables de Jellyfin y de la imagen Docker.
|
||||||
|
4. Buscar actualizaciones de DSM (que pueden incluir nuevos drivers/kernel).
|
||||||
|
- **Problema:** La reproducción falla solo para códecs específicos (e.g., HEVC 10-bit, MPEG2, VC1).
|
||||||
|
|
||||||
|
- **Causa Probable:** El códec específico podría no ser totalmente estable o compatible con la aceleración QSV en esta combinación hardware/driver, aunque la opción exista en Jellyfin.
|
||||||
|
- **Solución:** Desmarcar el códec problemático en los ajustes de Decodificación por Hardware de Jellyfin. Esto forzará la decodificación por software para ese códec, permitiendo la reproducción (a costa de mayor uso de CPU).
|
||||||
|
- **Problema:** La reproducción falla solo cuando se habilitan subtítulos, especialmente de tipo gráfico (PGS, VOBSUB). El log de FFmpeg puede mostrar errores relacionados con filtros `overlay` o `subtitles`, o salir con código 251.
|
||||||
|
|
||||||
|
- **Causa Probable:** La aceleración por hardware a menudo tiene dificultades para "quemar" (incrustar permanentemente en el video) subtítulos basados en imágenes. El proceso de superposición falla en la pipeline de hardware.
|
||||||
|
- **Solución:**
|
||||||
|
1. Configurar el cliente para que nunca queme subtítulos ("Burn-in: None") si es posible (el cliente renderizará los subtítulos).
|
||||||
|
2. Usar subtítulos basados en texto (SRT, ASS) siempre que sea posible.
|
||||||
|
3. Si es imprescindible quemar subtítulos gráficos, puede ser necesario desactivar la aceleración por hardware para ese contenido (forzando el quemado por CPU) o aceptar que no se podrá reproducir con esos subtítulos y QSV activo.
|
||||||
|
- **Problema:** La transcodificación funciona (indicador HW aparece), pero el uso de CPU sigue siendo alto.
|
||||||
|
|
||||||
|
- **Causa Probable:** QSV podría estar manejando solo la decodificación _o_ solo la codificación. La transcodificación de audio siempre usa CPU. El quemado de subtítulos podría estar haciéndose por CPU. El mapeo de tonos podría estar recurriendo a software. El proceso puede requerir filtros complejos no acelerados.
|
||||||
|
- **Solución:** Revisar los detalles del flujo activo en el panel de control para ver qué partes están marcadas como (HW). Simplificar la reproducción (desactivar subtítulos, elegir pista de audio compatible). Verificar ajustes de mapeo de tonos. Aceptar que cierto nivel de uso de CPU es normal.
|
||||||
|
- **Problema:** FFmpeg termina con el código de salida genérico 1.
|
||||||
|
|
||||||
|
- **Causa Probable:** Muy variable: permisos, argumentos inválidos de FFmpeg generados por Jellyfin, archivo multimedia corrupto, combinación de filtros/características no soportada, agotamiento temporal de recursos.
|
||||||
|
- **Solución:** Examinar detenidamente el log completo de FFmpeg _antes_ del `exit code 1` buscando mensajes de error más específicos. Habilitar el registro de depuración de Jellyfin. Probar con diferentes archivos multimedia. Simplificar ajustes de Jellyfin (desactivar mapeo de tonos, desmarcar códecs).
|
||||||
|
- **Problema:** Errores relacionados con la inicialización de VAAPI, como `vaapi=va:,vendor_id=0x8086,driver=iHD`.
|
||||||
|
|
||||||
|
- **Causa Probable:** Problema con la configuración del driver VAAPI dentro del contenedor o su interacción con el driver/kernel del host. Posiblemente versión incorrecta del driver o componentes faltantes.
|
||||||
|
- **Solución:** Asegurar mapeo correcto de dispositivos y permisos. Verificar compatibilidad de la imagen del contenedor (usar `jellyfin/jellyfin` oficial). Comprobar versión de DSM / kernel. Evaluar si marcar/desmarcar `Preferir decodificadores nativos...` ayuda.
|
||||||
|
|
||||||
|
**Tabla 4: Errores Comunes en Registros FFmpeg y Pasos de Solución**
|
||||||
|
|
||||||
|
| | | |
|
||||||
|
|---|---|---|
|
||||||
|
|**Error / Código Salida**|**Causa Probable**|**Acciones Sugeridas**|
|
||||||
|
|`Permission denied` (al acceder a `/dev/dri`)|Permisos incorrectos en host o contenedor sin grupo correcto.|Verificar/corregir permisos en host (`chmod` o grupo). Verificar `group_add` en Compose. Verificar PUID/PGID.|
|
||||||
|
|`Device creation failed` / `Cannot open /dev/dri/renderD128`|Dispositivo no mapeado a Docker o permisos incorrectos.|Verificar sección `devices:` en Compose. Verificar permisos en host.|
|
||||||
|
|`Cannot allocate memory` / `Can't allocate a surface`|Límite de memoria iGPU, bug driver/FFmpeg, stream corrupto/incompatible.|Deshabilitar mapeo de tonos. Probar contenido más simple (8-bit SDR). Actualizar Jellyfin/DSM.|
|
||||||
|
|Error relacionado con filtro `overlay` / `subtitles` (a menudo con subtítulos gráficos)|Incapacidad de QSV para quemar subtítulos gráficos.|Evitar quemado de subtítulos (configuración cliente). Usar subtítulos de texto (SRT). Desactivar HW accel si es necesario.|
|
||||||
|
|`FFmpeg exited with code 1`|Error genérico.|**Examinar mensajes previos en el log FFmpeg**. Habilitar debug log. Probar otro archivo. Simplificar ajustes Jellyfin.|
|
||||||
|
|`FFmpeg exited with code 137`|Proceso terminado externamente (posiblemente por OOM Killer si la RAM se agota).|Monitorizar uso de RAM del NAS y del contenedor. Asegurarse de que el directorio de caché/transcodificación tenga espacio y permisos.|
|
||||||
|
|`FFmpeg exited with code 251`|Reportado con quemado de subtítulos PGS en HEVC con QSV.|Ver soluciones para problemas de subtítulos gráficos.|
|
||||||
|
|
||||||
|
**Evaluación de los Intentos de Mapeo de Dispositivos del Usuario (Abordando Punto 7 de la Consulta):**
|
||||||
|
|
||||||
|
- `/dev/dri/renderD128:/dev/dri/renderD128`: Mapea el nodo de renderizado principal, lo cual es esencial. Sin embargo, **podría ser insuficiente**. Algunas operaciones o inicializaciones de QSV/VAAPI pueden requerir acceso también a `/dev/dri/card0`. Si esta configuración falló, podría deberse a la falta de `card0` o, más probablemente, a problemas de permisos.
|
||||||
|
- `/dev/dri/:/dev/dri/`: Mapea el directorio completo. Esta opción **debería funcionar** en términos de disponibilidad de dispositivos, ya que incluye tanto `renderD128` como `card0`. Si esta configuración también falló, la causa casi con seguridad reside en los **permisos** (permisos de archivo en el host o falta de pertenencia al grupo correcto por parte del usuario del contenedor) o en una **configuración incorrecta dentro de Jellyfin**, no en el mapeo de dispositivos en sí.
|
||||||
|
|
||||||
|
## VII. Recomendaciones Finales y Lista de Verificación
|
||||||
|
|
||||||
|
Para lograr con éxito la transcodificación por hardware QSV en Jellyfin sobre Docker en un Synology DS220+, la atención al detalle en la configuración es primordial.
|
||||||
|
|
||||||
|
**Resumen de Puntos Críticos:**
|
||||||
|
|
||||||
|
- **Configuración Docker Compose:** La sintaxis debe ser precisa, especialmente en las secciones `devices` (mapear `renderD128` y `card0`), `environment` (PUID/PGID no-root correctos, TZ), y `group_add` (si se usa permisos por grupo).
|
||||||
|
- **Permisos del Host:** Los permisos sobre `/dev/dri/renderD128` y `/dev/dri/card0` en el Synology DSM deben permitir el acceso al usuario/grupo bajo el cual corre el contenedor. El método de pertenencia a grupo es el más seguro y recomendado.
|
||||||
|
- **Ajustes de Jellyfin:** La configuración dentro de Jellyfin debe coincidir con las capacidades del J4025 (seleccionar QSV, marcar códecs soportados - excluyendo AV1, configurar mapeo de tonos VPP correctamente).
|
||||||
|
- **Verificación y Logs:** Confirmar que QSV está activo y utilizar los registros de FFmpeg para diagnosticar cualquier fallo.
|
||||||
|
|
||||||
|
Lista de Verificación Rápida:
|
||||||
|
|
||||||
|
Antes de buscar ayuda adicional, revisar los siguientes puntos:
|
||||||
|
|
||||||
|
- [ ] ¿Existen `/dev/dri/renderD128` y `/dev/dri/card0` en el host Synology (`ls -l /dev/dri`)?
|
||||||
|
- [ ] ¿Se han verificado/establecido los permisos en `/dev/dri/*` del host (preferiblemente mediante grupo)?
|
||||||
|
- [ ] ¿Se usan los PUID/PGID correctos (no root) en Docker Compose?
|
||||||
|
- [ ] ¿Se usa el GID correcto en `group_add` en Docker Compose (si se aplica)?
|
||||||
|
- [ ] ¿La sección `devices:` en Docker Compose mapea correctamente `/dev/dri/renderD128` y `/dev/dri/card0`?
|
||||||
|
- [ ] ¿Está la Aceleración por Hardware en Jellyfin configurada como `Intel QuickSync (QSV)`?
|
||||||
|
- [ ] ¿Los códecs de Decodificación HW en Jellyfin coinciden con las capacidades del J4025 (AV1 desmarcado)?
|
||||||
|
- [ ] ¿Está el Mapeo de Tonos configurado correctamente (VPP marcado, Mapeo de Tonos base desmarcado)?
|
||||||
|
- [ ] ¿Se ha reiniciado el contenedor Jellyfin después de los cambios?
|
||||||
|
- [ ] ¿Se ha probado la transcodificación con contenido simple (e.g., 1080p H.264 SDR)?
|
||||||
|
- [ ] ¿Aparece el indicador `(HW)` en el Panel de Control de Jellyfin durante la transcodificación?
|
||||||
|
- [ ] ¿Se han revisado los registros de FFmpeg (`ffmpeg-transcode-*.log`) en busca de errores si la reproducción falla?
|
||||||
|
|
||||||
|
**Recursos Adicionales:**
|
||||||
|
|
||||||
|
- Documentación Oficial de Jellyfin sobre Aceleración por Hardware: [https://jellyfin.org/docs/general/administration/hardware-acceleration/](https://jellyfin.org/docs/general/administration/hardware-acceleration/) (Aunque general, contiene información útil sobre Intel QSV/VAAPI en Linux/Docker).
|
||||||
|
- Foros de la Comunidad Jellyfin y Synology: Pueden contener discusiones específicas y soluciones aportadas por otros usuarios con configuraciones similares.
|
||||||
|
|
||||||
|
Siguiendo esta guía detallada y prestando atención a los permisos y configuraciones específicas, debería ser posible habilitar y disfrutar de los beneficios de la transcodificación por hardware QSV en el Synology DS220+.
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
|
||||||
|
user: admin
|
||||||
|
password: MAC without spaces or - por essempio: 00C0A20A150C
|
|
@ -0,0 +1,607 @@
|
||||||
|
***
|
||||||
|
|
||||||
|
## `OB1` - Main (`_CYCL_EXC` - Ejecución Cíclica Principal)
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: Main
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 / S7-1200
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : Main;
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// info : Array[0..3] of Word;
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Get OB Info - required for some blocks
|
||||||
|
#info[0] := #OB1_SCAN_CYCLE; // Cycle time of last OB1 scan in ms
|
||||||
|
#info[1] := #OB1_DATE_TIME.YEAR;
|
||||||
|
#info[2] := #OB1_DATE_TIME.MONTH;
|
||||||
|
#info[3] := #OB1_DATE_TIME.DAY;
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Call main control block instance
|
||||||
|
// =========================================================================
|
||||||
|
"BlenderCtrl__Main_DB"(); // Instance DB call for the main blender control logic
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Call HMI Interface handler
|
||||||
|
// =========================================================================
|
||||||
|
"HMI_Interface_Handler_DB"(); // Example: Instance DB call for HMI data aggregation/handling
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Call Communication handlers (if not handled elsewhere)
|
||||||
|
// =========================================================================
|
||||||
|
"Com_Filler_DB"(); // Example: Instance DB call for Filler communication logic
|
||||||
|
"Com_SyrupRoom_DB"(); // Example: Instance DB call for Syrup Room communication logic
|
||||||
|
|
||||||
|
// Note: Additional calls to other general FCs/FBs might be present here.
|
||||||
|
|
||||||
|
END;
|
||||||
|
|
||||||
|
````
|
||||||
|
|
||||||
|
**Análisis `OB1`: **
|
||||||
|
|
||||||
|
- **Función:** Ejecuta la lógica principal del programa en cada ciclo de scan.
|
||||||
|
- **Código:**
|
||||||
|
- Obtiene información básica del OB (tiempo de ciclo, fecha/hora).
|
||||||
|
- **Llama a la instancia DB de `BlenderCtrl__Main` (`"BlenderCtrl__Main_DB"()`). Esta es la llamada clave que ejecuta el corazón de la lógica de control del mezclador.**
|
||||||
|
- Llama a otros bloques como `"HMI_Interface_Handler_DB"`, `"Com_Filler_DB"`, `"Com_SyrupRoom_DB"`, indicando que la gestión HMI y comunicación se maneja en el ciclo principal.
|
||||||
|
- **Contexto Mixer:** Punto de entrada principal que orquesta las funciones generales de la máquina ciclo a ciclo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `OB100` - Startup (`COMPLETE RESTART` - Arranque en Caliente)
|
||||||
|
|
||||||
|
Structured Text
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: Startup
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 / S7-1200
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : Startup;
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// startupInfo : OB_STARTUP; // Structure with startup information
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Read Startup Info
|
||||||
|
#startupInfo := #OB100_STARTUP_INFO;
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Initialization Logic
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// Example: Reset main state machine to Idle on warm restart
|
||||||
|
IF #startupInfo.Event_Class = B#16#39 THEN // Check if it's a Warm Start (Event Class 39hex)
|
||||||
|
"BlenderCtrl__Main_DB".StateMachine_State := 0; // Assuming 0 represents Idle state
|
||||||
|
"BlenderCtrl__Main_DB".InitializeFlags := TRUE; // Trigger initialization within the FB
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Example: Call a dedicated initialization function
|
||||||
|
"Initialize_Application"(); // FC call for broader initializations
|
||||||
|
|
||||||
|
// Example: Set initial safe state for outputs (if not handled by HW config)
|
||||||
|
// "Valve_Output_Water" := FALSE;
|
||||||
|
// "Pump_Syrup_Start" := FALSE;
|
||||||
|
|
||||||
|
END;
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**Análisis `OB100`: **
|
||||||
|
|
||||||
|
- **Función:** Se ejecuta una vez al pasar el PLC de STOP a RUN (arranque en caliente/Warm Restart).
|
||||||
|
- **Código:**
|
||||||
|
- Lee información sobre el evento de arranque.
|
||||||
|
- Si es un arranque en caliente (`Event_Class = B#16#39`), resetea el estado de la máquina principal (`"BlenderCtrl__Main_DB".StateMachine_State`) y activa un flag de inicialización en ese FB.
|
||||||
|
- Puede llamar a una FC de inicialización general (`"Initialize_Application"`).
|
||||||
|
- Podría establecer salidas a un estado seguro inicial.
|
||||||
|
- **Contexto Mixer:** Asegura que la máquina inicie en un estado predecible y seguro tras un arranque en caliente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `OB35` - Cyclic interrupt 5 (`CYC_INT5` - Interrupción Cíclica)
|
||||||
|
|
||||||
|
_(Asumiendo que `CYC_INT5` corresponde a `OB35` en la configuración del hardware)_
|
||||||
|
|
||||||
|
Structured Text
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: Cyclic interrupt 5 // Name might vary based on user naming
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 / S7-1200
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : CyclicInterrupt; // Use the actual name from TIA Portal
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// // Temporary variables if needed
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Time-Critical Tasks - Executed every e.g., 100ms
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// Example: Call PID controllers instances
|
||||||
|
"WaterFlow_PID_DB"(); // Instance DB for Water Flow PID
|
||||||
|
"SyrupFlow_PID_DB"(); // Instance DB for Syrup Flow PID
|
||||||
|
"Carbonation_PID_DB"(); // Instance DB for Carbonation PID
|
||||||
|
"TankLevel_PID_DB"(); // Instance DB for Tank Level PID (if applicable)
|
||||||
|
|
||||||
|
// Example: Call Analog Input Scaling / Processing
|
||||||
|
"Analog_Input_Processing_DB"(); // FB handling scaling/filtering for multiple inputs
|
||||||
|
|
||||||
|
// Example: Call critical parts of Ratio Control calculation
|
||||||
|
"RatioControl_CyclicPart_DB"(); // FB handling the periodic calculation/adjustment
|
||||||
|
|
||||||
|
// Example: Update totalizers
|
||||||
|
"Water_Totalizer_DB"();
|
||||||
|
"Syrup_Totalizer_DB"();
|
||||||
|
"Product_Totalizer_DB"();
|
||||||
|
|
||||||
|
END;
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**Análisis `OB35` (o similar):**
|
||||||
|
|
||||||
|
- **Función:** Ejecuta tareas que requieren una temporización precisa y constante (ej. cada 100ms).
|
||||||
|
- **Código:**
|
||||||
|
- Llama a las instancias DB de los bloques PID para control de flujo, nivel, carbonatación.
|
||||||
|
- Llama a bloques de procesamiento de entradas analógicas.
|
||||||
|
- Llama a partes críticas del control de ratio.
|
||||||
|
- Llama a bloques para actualizar totalizadores.
|
||||||
|
- **Contexto Mixer:** Garantiza el funcionamiento estable y preciso de los lazos de control (PID) y cálculos críticos, esencial para la calidad del producto.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `OB122` - IO access error (`I_O_FLT1` - Error Acceso E/S)
|
||||||
|
|
||||||
|
Structured Text
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: IO access error
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 / S7-1200
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : IO_AccessError;
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// LADDR : HW_IO; // Logical address of the I/O
|
||||||
|
// READ_WRITE_ACCESS : Byte; // 0=Read, 1=Write
|
||||||
|
// REQUESTING_OB_NR : Int; // OB number that caused the error
|
||||||
|
// PRIORITY : Int; // Priority of requesting OB
|
||||||
|
// ERROR_INFO : Word; // Detailed error code
|
||||||
|
// BLK_TYPE : Int; // Block type causing the error
|
||||||
|
// BLK_NR : Int; // Block number causing the error
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Read Fault Information from OB Temp Variables
|
||||||
|
#LADDR := #OB122_LADDR;
|
||||||
|
#READ_WRITE_ACCESS := #OB122_READ_WRITE_ACCESS;
|
||||||
|
#REQUESTING_OB_NR := #OB122_REQUESTING_OB_NR;
|
||||||
|
#ERROR_INFO := #OB122_ERROR_INFO;
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Fault Handling Logic
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// Example: Log the error details
|
||||||
|
"Log_Diagnostic_Event"(SourceOB := 122,
|
||||||
|
LogicalAddress := #LADDR,
|
||||||
|
ErrorCode := #ERROR_INFO); // Call a custom logging FC
|
||||||
|
|
||||||
|
// Example: Set a general I/O Fault flag
|
||||||
|
"Global_Status".IO_Fault := TRUE;
|
||||||
|
|
||||||
|
// Example: Trigger a specific alarm based on the module address
|
||||||
|
IF #LADDR = 16#100 THEN // Example: Logical address 256
|
||||||
|
"Alarms_DB".Specific_Module_Fault := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Análisis `OB122`: **
|
||||||
|
|
||||||
|
- **Función:** Se ejecuta cuando hay un error al acceder (leer/escribir) a un punto de E/S.
|
||||||
|
- **Código:**
|
||||||
|
- Lee detalles del fallo (dirección lógica, código de error).
|
||||||
|
- Llama a una función para registrar el evento (`"Log_Diagnostic_Event"`).
|
||||||
|
- Activa un flag general de fallo de E/S (`"Global_Status".IO_Fault`).
|
||||||
|
- Puede activar alarmas específicas basadas en la dirección del módulo afectado.
|
||||||
|
- **Contexto Mixer:** Permite detectar y alarmar sobre problemas con módulos de E/S individuales sin detener el PLC.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `OB82` - Diagnostic error interrupt (`MOD_ERR`, `I_O_FLT1` - Error Diagnóstico HW)
|
||||||
|
|
||||||
|
Structured Text
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: Diagnostic error interrupt
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 / S7-1200
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : DiagnosticErrorInterrupt;
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// LADDR : HW_IO; // Logical address of the module
|
||||||
|
// CHANNEL : UInt; // Channel number (if applicable)
|
||||||
|
// MULTI_ERROR : Bool; // Multiple errors reported
|
||||||
|
// FAULT_ID : DWord; // Diagnostic code
|
||||||
|
// AUX_VALUE : Array[0..3] of DWord; // Additional diagnostic info
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Read Diagnostic Information
|
||||||
|
#LADDR := #OB82_MDL_ADDR;
|
||||||
|
#FAULT_ID := #OB82_FAULT_ID;
|
||||||
|
#MULTI_ERROR := #OB82_MULTI_ERROR;
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Diagnostic Handling Logic
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// Example: Log the diagnostic event
|
||||||
|
"Log_Diagnostic_Event"(SourceOB := 82,
|
||||||
|
LogicalAddress := #LADDR,
|
||||||
|
ErrorCode := UDINT_TO_WORD(#FAULT_ID)); // Pass fault ID
|
||||||
|
|
||||||
|
// Example: Set a general Module Fault flag
|
||||||
|
"Global_Status".Module_Fault := TRUE;
|
||||||
|
|
||||||
|
// Example: Trigger specific alarm based on module and fault ID
|
||||||
|
CASE #LADDR OF
|
||||||
|
16#100: // Module at logical address 256
|
||||||
|
IF #FAULT_ID = 16#XXXX THEN // Specific Fault ID
|
||||||
|
"Alarms_DB".Module_100_Specific_Fault := TRUE;
|
||||||
|
ELSE
|
||||||
|
"Alarms_DB".Module_100_General_Fault := TRUE;
|
||||||
|
END_IF;
|
||||||
|
16#101: // Module at logical address 257
|
||||||
|
// ... handle faults for this module ...
|
||||||
|
ELSE
|
||||||
|
"Alarms_DB".Unknown_Module_Fault := TRUE;
|
||||||
|
END_CASE;
|
||||||
|
|
||||||
|
END;
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**Análisis `OB82`: **
|
||||||
|
|
||||||
|
- **Función:** Se ejecuta cuando un módulo hardware reporta un fallo interno vía diagnóstico.
|
||||||
|
- **Código:**
|
||||||
|
- Lee la dirección del módulo (`LADDR`) y el código de fallo (`FAULT_ID`).
|
||||||
|
- Registra el evento (`"Log_Diagnostic_Event"`).
|
||||||
|
- Activa un flag general de fallo de módulo (`"Global_Status".Module_Fault`).
|
||||||
|
- Usa `CASE` y `IF` para activar alarmas muy específicas basadas en qué módulo falló y cuál fue el error.
|
||||||
|
- **Contexto Mixer:** Crucial para identificar fallos específicos de hardware (cortocircuitos, rotura de hilo, etc.) y guiar al mantenimiento.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `OB83` - Process diagnostics error interrupt (`ProDiagOB` - Error Diagnóstico Proceso)
|
||||||
|
|
||||||
|
Structured Text
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: Process diagnostics error interrupt
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 Only
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : ProDiag_OB; // Actual name might differ
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// PRODIAG_INFO : OB_PRODIAG; // Structure with detailed ProDiag info
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Read Process Diagnostic Information
|
||||||
|
#PRODIAG_INFO := #OB83_PRODIAG_INFO;
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Process Diagnostic Handling Logic
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// Example: Log the detailed ProDiag event
|
||||||
|
"Log_ProDiag_Event"(EventClass := #PRODIAG_INFO.EVENT_CLASS,
|
||||||
|
EventID := #PRODIAG_INFO.EVENT_ID,
|
||||||
|
InstanceDB := #PRODIAG_INFO.INSTANCE_DB_NR,
|
||||||
|
ObjectID := #PRODIAG_INFO.OBJECT_ID,
|
||||||
|
EventState := #PRODIAG_INFO.EVENT_STATE); // Call custom logging FC
|
||||||
|
|
||||||
|
// Example: Trigger specific alarms based on the ProDiag info
|
||||||
|
// The Instance DB and Object ID usually point to the supervised element
|
||||||
|
IF #PRODIAG_INFO.INSTANCE_DB_NR = "WaterValveCtrl_DB".Number THEN // Check if it's the water valve FB
|
||||||
|
IF #PRODIAG_INFO.OBJECT_ID = 1 THEN // Assuming Object ID 1 is 'Position Not Reached'
|
||||||
|
"Alarms_DB".WaterValve_Position_Fault := (#PRODIAG_INFO.EVENT_STATE = EnumTypeOfEventState.Came); // Set alarm if event 'Came'
|
||||||
|
END_IF;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Could also directly call a method on the affected FB instance if designed that way
|
||||||
|
// Example: "GetInstanceFromDBNum"(#PRODIAG_INFO.INSTANCE_DB_NR).ReportProDiagFault(#PRODIAG_INFO);
|
||||||
|
|
||||||
|
END;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Análisis `OB83`: **
|
||||||
|
|
||||||
|
- **Función:** Se ejecuta cuando una supervisión de "Process Diagnostics" (S7-1500) detecta un fallo funcional.
|
||||||
|
- **Código:**
|
||||||
|
- Lee la estructura `#PRODIAG_INFO` con detalles del evento (qué supervisión, en qué bloque/instancia).
|
||||||
|
- Registra el evento ProDiag (`"Log_ProDiag_Event"`).
|
||||||
|
- Activa alarmas específicas del proceso basadas en la información (ej. fallo de posición de válvula de agua).
|
||||||
|
- Podría llamar a métodos del FB afectado.
|
||||||
|
- **Contexto Mixer:** Diagnóstico funcional potente para identificar problemas como válvulas atascadas, bombas sin rendimiento, etc., más allá de fallos eléctricos.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `OB121` - Programming error (Error de Programación)
|
||||||
|
|
||||||
|
Structured Text
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: Programming error
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 / S7-1200
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : ProgrammingError;
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// FaultID : Byte; // Error Code
|
||||||
|
// ErrorReg1 : Word; // Internal Error Register 1
|
||||||
|
// ErrorReg2 : Word; // Internal Error Register 2
|
||||||
|
// OBNumber : Int; // OB Number where error occurred
|
||||||
|
// BlockType : Int; // Type of block where error occurred (OB, FB, FC, DB)
|
||||||
|
// BlockNumber : Int; // Number of block where error occurred
|
||||||
|
// InstructionAddress : Int; // Address within the block
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Read Fault Information
|
||||||
|
#FaultID := #OB121_Fault_ID;
|
||||||
|
#OBNumber := #OB121_OB_Number;
|
||||||
|
#BlockType := #OB121_Blk_Type;
|
||||||
|
#BlockNumber := #OB121_Blk_Number;
|
||||||
|
#InstructionAddress := #OB121_Instr_Address;
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Programming Error Handling Logic
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// Example: Log the programming error details
|
||||||
|
"Log_Programming_Error"(FaultCode := #FaultID,
|
||||||
|
SourceOB := #OBNumber,
|
||||||
|
SourceBlockType := #BlockType,
|
||||||
|
SourceBlockNum := #BlockNumber,
|
||||||
|
SourceAddress := #InstructionAddress); // Call custom logging FC
|
||||||
|
|
||||||
|
// Example: Set a general Programming Fault flag
|
||||||
|
"Global_Status".Programming_Fault := TRUE;
|
||||||
|
|
||||||
|
// Example: Trigger a specific alarm message
|
||||||
|
"Alarms_DB".PLC_Programming_Error := TRUE;
|
||||||
|
// Optionally, format a string with details for HMI display if possible
|
||||||
|
|
||||||
|
END;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Análisis `OB121`: **
|
||||||
|
|
||||||
|
- **Función:** Se ejecuta cuando ocurre un error en tiempo de ejecución en el código de usuario.
|
||||||
|
- **Código:**
|
||||||
|
- Lee detalles del error (código, bloque, dirección).
|
||||||
|
- Registra los detalles del error (`"Log_Programming_Error"`).
|
||||||
|
- Activa un flag general de fallo de programación (`"Global_Status".Programming_Fault`).
|
||||||
|
- Activa una alarma general de error de programa.
|
||||||
|
- **Contexto Mixer:** Red de seguridad para capturar 'bugs' de programación y evitar el STOP del PLC, registrando información para depuración.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `OB86` - Rack or station failure (`RACK_FLT`, `MOD_ERR` - Fallo Rack/Estación)
|
||||||
|
|
||||||
|
Structured Text
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: Rack or station failure
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 / S7-1200
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : RackOrStationFailure;
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// LADDR : HW_IO; // Logical address of DP master or PROFINET IO controller
|
||||||
|
// StationNr : UInt; // Station number of the failed station/rack
|
||||||
|
// FailureEvent : Byte; // Type of failure (e.g., 16#39=Failure, 16#38=Return)
|
||||||
|
// SystemID : Word; // System ID (e.g., Profibus/Profinet subnet)
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Read Failure Information
|
||||||
|
#LADDR := #OB86_LADDR; // Often corresponds to the PN interface ID
|
||||||
|
#StationNr := #OB86_Station_Nr;
|
||||||
|
#FailureEvent := #OB86_Failure_Event; // B#16#39 = Failure, B#16#38 = Return to operation
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Rack/Station Failure Handling Logic
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
IF #FailureEvent = 16#39 THEN // Station Failed
|
||||||
|
// Example: Log the failure
|
||||||
|
"Log_Rack_Failure"(Station := #StationNr, System := #SystemID); // Custom logging FC
|
||||||
|
|
||||||
|
// Example: Set a critical fault flag
|
||||||
|
"Global_Status".Rack_Failure := TRUE;
|
||||||
|
"Global_Status".Critical_Fault := TRUE; // Often considered critical
|
||||||
|
|
||||||
|
// Example: Trigger specific alarm based on Station Number
|
||||||
|
CASE #StationNr OF
|
||||||
|
3: // Example: Station 3 (Maybe Syrup Room I/O)
|
||||||
|
"Alarms_DB".Station_3_Failure := TRUE;
|
||||||
|
// Potentially trigger safe shutdown logic in BlenderCtrl__Main
|
||||||
|
"BlenderCtrl__Main_DB".ExternalCriticalFault := TRUE;
|
||||||
|
10: // Example: Station 10 (Maybe Filler Interface I/O)
|
||||||
|
"Alarms_DB".Station_10_Failure := TRUE;
|
||||||
|
"BlenderCtrl__Main_DB".ExternalCriticalFault := TRUE;
|
||||||
|
ELSE
|
||||||
|
"Alarms_DB".Unknown_Station_Failure := TRUE;
|
||||||
|
END_CASE;
|
||||||
|
|
||||||
|
ELSIF #FailureEvent = 16#38 THEN // Station Returned
|
||||||
|
// Example: Log the return event
|
||||||
|
"Log_Rack_Return"(Station := #StationNr, System := #SystemID);
|
||||||
|
|
||||||
|
// Example: Clear specific alarm (if fault condition cleared)
|
||||||
|
CASE #StationNr OF
|
||||||
|
3: "Alarms_DB".Station_3_Failure := FALSE;
|
||||||
|
10: "Alarms_DB".Station_10_Failure := FALSE;
|
||||||
|
ELSE
|
||||||
|
"Alarms_DB".Unknown_Station_Failure := FALSE; // May need more logic here
|
||||||
|
END_CASE;
|
||||||
|
|
||||||
|
// Reset general rack failure flag ONLY if ALL racks are okay (requires more logic)
|
||||||
|
// "Global_Status".Rack_Failure := CheckAllStationsOK();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END;
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**Análisis `OB86`: **
|
||||||
|
|
||||||
|
- **Función:** Se ejecuta al perder/recuperar comunicación con una estación de E/S remota o rack.
|
||||||
|
- **Código:**
|
||||||
|
- Identifica la estación y si es un fallo (`16#39`) o recuperación (`16#38`).
|
||||||
|
- **Si es Fallo:** Registra, activa flags de fallo (generalmente crítico), usa `CASE` para activar alarmas específicas por estación, y crucialmente, **informa al control principal (`"BlenderCtrl__Main_DB".ExternalCriticalFault := TRUE;`) para iniciar parada segura**.
|
||||||
|
- **Si es Recuperación:** Registra, desactiva alarmas específicas.
|
||||||
|
- **Contexto Mixer:** Esencial para la seguridad. Detecta pérdida de comunicación con E/S críticas (válvulas, bombas remotas) y fuerza una parada controlada.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## `OB80` - Time error interrupt (Error Tiempo de Ciclo)
|
||||||
|
|
||||||
|
Structured Text
|
||||||
|
|
||||||
|
```pascal
|
||||||
|
// Block Type: OB
|
||||||
|
// Name: Time error
|
||||||
|
// Manual: TIA Portal help
|
||||||
|
// Version: 1.0
|
||||||
|
// S7-1500 / S7-1200
|
||||||
|
// Performance optimized compilation: Yes
|
||||||
|
// Safe programming: No
|
||||||
|
// Language: SCL
|
||||||
|
// Interface:
|
||||||
|
// NAMESPACE: OBs
|
||||||
|
// Block_OB : TimeError;
|
||||||
|
// END_NAMESPACE;
|
||||||
|
//
|
||||||
|
// VAR_TEMP
|
||||||
|
// FaultyOB : Int; // OB Number that exceeded cycle time
|
||||||
|
// ErrorCode : Byte; // Error Code (usually B#16#01)
|
||||||
|
// CycleTimeConfig : DInt; // Configured cycle time in µs
|
||||||
|
// ActualCycleTime : DInt; // Actual cycle time in µs
|
||||||
|
// END_VAR;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Read Fault Information
|
||||||
|
#FaultyOB := #OB80_OB_Number;
|
||||||
|
#ActualCycleTime := #OB80_Cycle_Time; // Actual time in µs
|
||||||
|
|
||||||
|
// =========================================================================
|
||||||
|
// Time Error Handling Logic
|
||||||
|
// =========================================================================
|
||||||
|
|
||||||
|
// Example: Log the time error event
|
||||||
|
"Log_Time_Error"(SourceOB := #FaultyOB,
|
||||||
|
ExceededTime_us := #ActualCycleTime); // Call custom logging FC
|
||||||
|
|
||||||
|
// Example: Set a general Cycle Time Fault flag
|
||||||
|
"Global_Status".CycleTime_Fault := TRUE;
|
||||||
|
|
||||||
|
// Example: Trigger a specific alarm message
|
||||||
|
"Alarms_DB".PLC_CycleTime_Exceeded := TRUE;
|
||||||
|
// Optionally, indicate which OB caused it if needed for HMI display
|
||||||
|
|
||||||
|
END;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Análisis `OB80`: **
|
||||||
|
|
||||||
|
- **Función:** Se ejecuta si `OB1` o un `OB3x` excede su tiempo de ciclo máximo configurado.
|
||||||
|
- **Código:**
|
||||||
|
- Lee qué OB causó el error y cuánto tiempo tardó.
|
||||||
|
- Registra el evento (`"Log_Time_Error"`).
|
||||||
|
- Activa un flag general de fallo de tiempo de ciclo (`"Global_Status".CycleTime_Fault`).
|
||||||
|
- Activa una alarma general (`"Alarms_DB".PLC_CycleTime_Exceeded`).
|
||||||
|
- **Contexto Mixer:** Indica sobrecarga del PLC o código ineficiente. Es vital para detectar condiciones que pueden llevar a inestabilidad del control.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Conclusión:**
|
||||||
|
|
||||||
|
La implementación detallada de estos OBs de evento y error demuestra un enfoque robusto en la programación, buscando alta disponibilidad y facilitando el diagnóstico de problemas tanto a nivel de hardware como de software y proceso. La lógica implementada permite registrar fallos, generar alarmas específicas y, en casos críticos como `OB86`, interactuar con el control principal para llevar la máquina a un estado seguro.
|
|
@ -0,0 +1,134 @@
|
||||||
|
# Análisis del Software PLC Mixer/Starblend (TIA Portal v18)
|
||||||
|
|
||||||
|
Basado en el archivo `full_project_representation.md`. Análisis técnico del software PLC para un ingeniero informático familiarizado con PLCs.
|
||||||
|
|
||||||
|
## Fase 1: Estructura General y Tipos de Datos (UDTs)
|
||||||
|
|
||||||
|
### Organización del Proyecto
|
||||||
|
|
||||||
|
El proyecto sigue una estructura estándar y modular en TIA Portal:
|
||||||
|
|
||||||
|
- **Tipos de Datos PLC (UDTs):** Definen estructuras de datos personalizadas y reutilizables. Fundamental para estandarizar el manejo de dispositivos y datos complejos.
|
||||||
|
- **Bloques de Función (FBs):** Encapsulan lógica de control reutilizable con memoria asociada (DBs de instancia). Ideales para controlar componentes como válvulas, motores, o implementar lógica compleja como PID o secuenciadores.
|
||||||
|
- **Funciones (FCs):** Contienen lógica reutilizable sin memoria propia. Usadas para cálculos, conversiones, o tareas específicas que no requieren estado persistente.
|
||||||
|
- **Bloques de Datos (DBs):**
|
||||||
|
- **Globales:** Almacenan datos compartidos por todo el programa (Configuración, Estado, Interfaces).
|
||||||
|
- **De Instancia:** Almacenan los datos internos (estado) de cada llamada a un FB.
|
||||||
|
- **Variables PLC (Tags):** Variables globales (Marcas, Temporizadores, Contadores).
|
||||||
|
|
||||||
|
La conversión de LAD a SCL probablemente se enfocó en FBs y FCs para mejorar la estructuración, legibilidad y capacidad de implementar algoritmos complejos.
|
||||||
|
|
||||||
|
### Tipos de Datos PLC (UDTs) Relevantes
|
||||||
|
|
||||||
|
Los UDTs definen las plantillas para los datos de componentes comunes:
|
||||||
|
|
||||||
|
- `AnalogInstrument`: Estructura estándar para entradas analógicas (sensores). Incluye `PV`, `SP`, escalado (`Zero`, `Span`), valor filtrado (`PVFiltered`), y estados (`Alarm`, `Mask`, `Wait`).
|
||||||
|
- `CIP_Link_Type`: Define la interfaz de datos con el sistema CIP (peticiones, estados, fase actual).
|
||||||
|
- `Cylinder_Valve` / `MotorValve`: Para control de válvulas. Incluyen comandos (`Open`, `Close`), realimentaciones (`Opened`, `Closed`), y estados (`Fault`). `MotorValve` podría incluir posición.
|
||||||
|
- `DosingCtrl`: Específico para control de dosificación. Contiene setpoints, valores actuales, estado de actuador asociado.
|
||||||
|
- `DriveCtrl`: Para control de motores/bombas. Incluye comandos (`Start`, `Stop`), feedback (`Running`, `Fault`), y posible control de velocidad.
|
||||||
|
- `FlowMeter`: Representa un medidor de flujo. Incluye `Flow Rate`, `Totalizer`, y estado.
|
||||||
|
- `HMI_Commands`: Estructura para recibir comandos desde el HMI.
|
||||||
|
- `HMI_Status`: Estructura para enviar datos de estado/proceso al HMI.
|
||||||
|
- `LevelProbe`: Representa sondas de nivel (analógicas o discretas).
|
||||||
|
- `PID_Compact`: Probablemente encapsula los parámetros y E/S para el bloque `PID_Compact` de Siemens.
|
||||||
|
- `TankLevelCtrl`: Estructura para el control de nivel en tanques (sondas, setpoints, control de actuadores).
|
||||||
|
- `Totalizer`: Estructura genérica para acumular valores (volumen, masa).
|
||||||
|
|
||||||
|
*Observación:* El uso intensivo de UDTs promueve la modularidad y facilita la creación de instancias para múltiples dispositivos idénticos.
|
||||||
|
|
||||||
|
## Fase 2: Bloques de Función (FBs) y Funciones (FCs) Clave
|
||||||
|
|
||||||
|
Agrupados por funcionalidad del Mixer/Starblend:
|
||||||
|
|
||||||
|
### Control Principal y Secuencia
|
||||||
|
|
||||||
|
- `BlenderCtrl__Main` (FB): **Controlador principal.** Gestiona estados generales (Parado, Producción, CIP), coordina sub-funciones, maneja totalizadores generales (ref: `mResetProductTotTmr`, `mResetTotalizerTmr`).
|
||||||
|
- `BlenderRun__Control` (FB): Gestiona la **secuencia de producción**. Inicia/detiene dosificación, carbonatación, fases de arranque/parada (ref: `mTON_Reset_RecircPHE_Goo`).
|
||||||
|
- `SequenceControl` (FB): Posiblemente un secuenciador genérico utilizado por los anteriores.
|
||||||
|
- `ManageState` (FC): Determina el estado operativo de la máquina basado en condiciones actuales.
|
||||||
|
|
||||||
|
### Dosificación y Control de Ratio
|
||||||
|
|
||||||
|
- `DosingControl` (FB): Controla la adición de **un** ingrediente (agua, jarabe). Se instanciará varias veces. Recibe setpoint y actúa sobre válvula/bomba.
|
||||||
|
- `RatioControl` (FB): **Crítico.** Mantiene la proporción (Brix) entre ingredientes. Lee flujos (de `FlowMeter` / `AnalogInstrument`), calcula el ratio actual y ajusta los setpoints de los `DosingControl`. Puede usar PID.
|
||||||
|
- `FlowControl` (FB): Podría ser un control de flujo genérico (PID) usado por `DosingControl` o `RatioControl`.
|
||||||
|
- `AnalogScaling` (FC/FB): Convierte lecturas de sensores (INT) a unidades de ingeniería (REAL).
|
||||||
|
- `FlowMeter` (Lógica asociada): Lee caudal, calcula totalizado.
|
||||||
|
- `TotalizerCtrl` (FB): Gestiona cálculo y reseteo de totalizadores específicos.
|
||||||
|
- `CalculateRatio` (FC): Contiene la fórmula matemática para el cálculo de ratio.
|
||||||
|
|
||||||
|
### Control de Tanques y Niveles
|
||||||
|
|
||||||
|
- `TankLevel` (FB): Gestiona nivel de un tanque específico (ej. producto, desaireador). Incluye lógica de control y alarmas (ref: `mSyrTank_LevFault2`, `mSyrTank_LoadDelay`).
|
||||||
|
- `LevelControl` (FB): Control de nivel genérico (ON/OFF o PID).
|
||||||
|
- `DeaerationControl` (FB): Específico para el tanque de desaireación (nivel de agua, bomba de vacío).
|
||||||
|
|
||||||
|
### Carbonatación
|
||||||
|
|
||||||
|
- `CarbonationControl` (FB): Gestiona inyección de CO2. Controla válvula/dosificador basado en setpoint y medición (flujo CO2, P/T). Puede usar PID.
|
||||||
|
|
||||||
|
### Control de Calidad
|
||||||
|
|
||||||
|
- `ProductQuality` (FB): Monitoriza parámetros clave (Brix, CO2, Temperatura). Gestiona alarmas relacionadas (ref: `mTTM306_H2O_HighDlyAlm`).
|
||||||
|
- `SelCheckBrixSource` (FB): Selecciona y valida la fuente de medición de Brix si hay múltiples (sensor en línea, cálculo densidad). Gestiona alarmas con retardo (ref: `mSyrBxDelayAlrm`, `mSyrDensDelayAlrm`).
|
||||||
|
|
||||||
|
### Control de Actuadores (Válvulas y Bombas)
|
||||||
|
|
||||||
|
- `ValveCtrl` (FB): Control individual de válvulas (ON/OFF, modulantes). Lógica de comando, feedback, fallo, interlocks. Asociado a UDTs `Cylinder_Valve` / `MotorValve`.
|
||||||
|
- `MotorCtrl` (FB): Control de bombas/motores. Start/Stop, estado, fallo. Asociado a UDT `DriveCtrl`.
|
||||||
|
- `PumpsControl` (FB): Gestiona un grupo de bombas (alternancia, habilitación, fallos centralizados) (ref: `mSyrRoomH2OPumpFaultDly`).
|
||||||
|
|
||||||
|
### Limpieza CIP
|
||||||
|
|
||||||
|
- `CIPMain_Flood` / `CIPMain_Path` (FBs): Gestionan secuencias CIP (inundación de tanques, limpieza de líneas). Interactúan con sistema CIP central (vía `CIP_Link_Type`, `CIP_Interface_DB`). (ref: `mSyrTank_Flood`).
|
||||||
|
|
||||||
|
### Comunicación Externa
|
||||||
|
|
||||||
|
- `Com_Filler` (FC/FB): Lógica de comunicación con la llenadora (listo, demanda, E-Stop). Vía señales o bus, usando `Filler_Interface_DB`.
|
||||||
|
- `Com_SyrupRoom` (FC/FB): Lógica de comunicación con sala de jarabes (petición, confirmación). Usando `SyrupRoom_Interface_DB`.
|
||||||
|
|
||||||
|
### Utilidades y Funciones Generales
|
||||||
|
|
||||||
|
- `AnalogAlarm` (FB): Genera alarmas estándar para valores analógicos.
|
||||||
|
- `HandleAlarms` (FC): Posiblemente centraliza la gestión de alarmas (activación, reconocimiento).
|
||||||
|
- `HMI_Interface` (FC): Agrupa lógica de intercambio de datos con el HMI (vía `HMI_Commands`, `HMI_Status`, `HMI_DB`).
|
||||||
|
|
||||||
|
## Fase 3: Bloques de Datos (DBs) y Variables (Tags)
|
||||||
|
|
||||||
|
### Bloques de Datos Globales (GDBs)
|
||||||
|
|
||||||
|
- `Configuration_DB` / `Parameters_DB`: **Crucial.** Almacena todos los parámetros configurables (setpoints de ratio/Brix, flujos, límites de alarma, tiempos, PIDs, recetas). Su estructura define la flexibilidad y ajuste de la máquina.
|
||||||
|
- `Status_DB`: Almacena el estado actual de la máquina y valores de proceso importantes para lógica interna y HMI.
|
||||||
|
- `Alarms_DB`: Contiene el estado de todas las alarmas definidas.
|
||||||
|
- `Interface_DBs` (`Filler_Interface_DB`, `SyrupRoom_Interface_DB`, `CIP_Interface_DB`): Buffers de datos para la comunicación con sistemas externos.
|
||||||
|
|
||||||
|
### Bloques de Datos de Instancia (IDBs)
|
||||||
|
|
||||||
|
- Cada uso de un FB crea un IDB asociado (ej. `DosingControl_Water_DB`). Almacenan el estado interno (`VAR_STAT`) y parámetros específicos de esa instancia.
|
||||||
|
|
||||||
|
### Variables PLC (Tags)
|
||||||
|
|
||||||
|
- Variables `m...` (ej. `mSyrBxDelayAlrm`): Memorias internas (flags, condiciones, triggers). Sus nombres suelen indicar su propósito.
|
||||||
|
- Temporizadores (implícitos en `...Tmr`, `...Dly`, `TON_...`): Usados para retardos, debounce, timeouts en secuencias.
|
||||||
|
|
||||||
|
|
||||||
|
## Próximos Pasos Sugeridos
|
||||||
|
|
||||||
|
Para profundizar el análisis:
|
||||||
|
|
||||||
|
1. **Analizar Lógica Interna de FBs Clave:** Revisar el código SCL (si disponible) de `RatioControl`, `BlenderRun__Control`, `DosingControl`.
|
||||||
|
2. **Detallar Estructura del `Configuration_DB`:** Identificar parámetros clave y su impacto.
|
||||||
|
3. **Examinar Lógica de Comunicación:** Ver detalles del intercambio de señales/datos con Llenadora, Sala Jarabes, CIP.
|
||||||
|
4. **Analizar Manejo de Estados y Alarmas:** Diagrama de estados de la máquina y flujo de gestión de alarmas.
|
||||||
|
5. **Revisar Implementación de PID:** Configuración y uso de `PID_Compact` u otros bloques PID.
|
||||||
|
|
||||||
|
**Próximos Pasos Sugeridos:**
|
||||||
|
|
||||||
|
Para profundizar, podríamos enfocarnos en:
|
||||||
|
|
||||||
|
1. **Analizar la lógica interna de FBs clave:** Como `RatioControl`, `BlenderRun__Control`, o `DosingControl`. Si tienes el código SCL de estos bloques, podríamos revisarlo.
|
||||||
|
2. **Detallar la estructura del `Configuration_DB`:** Identificar qué parámetros son configurables y cómo afectan el funcionamiento.
|
||||||
|
3. **Examinar la lógica de comunicación:** Ver cómo se gestionan exactamente las señales con la Llenadora, Sala de Jarabes y CIP.
|
||||||
|
4. **Analizar el manejo de estados y alarmas:** Cómo transita la máquina entre estados y cómo se generan y gestionan las alarmas.
|
||||||
|
5. **Revisar la implementación del PID:** Si se usa `PID_Compact` u otro, ver cómo está configurado y cómo se integra en el control de flujo, nivel o carbonatación.
|
|
@ -0,0 +1,55 @@
|
||||||
|
## FB: `BlenderCtrl__Main`
|
||||||
|
|
||||||
|
Este Bloque de Función parece ser el **orquestador central** del sistema Mixer/Starblend.
|
||||||
|
|
||||||
|
### Rol Principal
|
||||||
|
|
||||||
|
- Gestionar el **estado operativo general** de la máquina (Parado, Listo, Producción, CIP, Fallo, Emergencia).
|
||||||
|
- Coordinar la activación y desactivación de los sub-sistemas principales (`BlenderRun__Control` para producción, `CIPMain` para limpieza).
|
||||||
|
- Actuar como punto central para los **comandos del operador** (HMI) y las **señales de interfaz** externas (Llenadora, Sala Jarabes).
|
||||||
|
- Consolidar y gestionar las **condiciones de fallo críticas** del sistema.
|
||||||
|
|
||||||
|
### Entradas / Salidas Probables (Interfaz del FB)
|
||||||
|
|
||||||
|
- **Entradas (`VAR_INPUT`):**
|
||||||
|
- Comandos desde HMI (Ej. `StartCmd`, `StopCmd`, `ResetCmd`, `SelectModeCmd` - Podrían venir de `HMI_DB` o un UDT `HMI_Commands`).
|
||||||
|
- Estado de Emergencia (`EmergencyStopActive`).
|
||||||
|
- Feedback de estado de bloques subordinados (Ej. `RunControl_Status`, `CIP_Status`, `CriticalFault`).
|
||||||
|
- Señales de habilitación o petición de interfaces externas (Ej. `Filler_Ready`, `SyrupRoom_Available`).
|
||||||
|
- Parámetros de configuración relevantes (si no se leen directamente de `Configuration_DB`).
|
||||||
|
- **Salidas (`VAR_OUTPUT`):**
|
||||||
|
- Estado general de la máquina (Ej. `MachineState`, `IsRunning`, `IsStopped`, `IsInCIP`, `IsInFault`). Enviado a `Status_DB` / `HMI_Status`.
|
||||||
|
- Comandos de habilitación/control para bloques subordinados (Ej. `EnableRunControl`, `EnableCIP`, `ResetSubsystems`).
|
||||||
|
- Indicaciones de estado para HMI y interfaces externas (Ej. `BlenderReadyForFiller`, `AlarmActive`).
|
||||||
|
- Señales de control para actuadores globales si los hubiera (poco común, usualmente se delega).
|
||||||
|
|
||||||
|
### Lógica Interna Inferida (`VAR` / `VAR_TEMP` / Lógica SCL)
|
||||||
|
|
||||||
|
- **Máquina de Estados:** El núcleo del FB será probablemente una máquina de estados implementada con una variable (`STAT`) tipo `INT` o `ENUM` y una estructura `CASE` en SCL. Cada estado (`Idle`, `Ready`, `Production`, `CIP`, `Fault`, etc.) define:
|
||||||
|
- Las acciones a realizar *dentro* de ese estado (ej. mantener habilitado `BlenderRun__Control`).
|
||||||
|
- Las condiciones (basadas en entradas y estados internos) para *transicionar* a otros estados.
|
||||||
|
- **Gestión de Modos:** Lógica para seleccionar entre `Producción` y `CIP`, asegurando que solo uno esté activo y gestionando las transiciones seguras entre ellos.
|
||||||
|
- **Coordinación de Bloques:** Llamadas a las instancias de los FBs subordinados (`BlenderRun__Control`, `CIPMain_Path`, `CIPMain_Flood`, `PumpsControl`, etc.), pasando los comandos y recibiendo el feedback necesario según el estado actual.
|
||||||
|
- **Manejo de Fallos:** Agregación de señales de fallo (`Fault`) desde múltiples fuentes. Lógica para determinar si un fallo es crítico y debe detener la operación, llevando la máquina al estado `Fault`. Implementación de la lógica de `Reset`.
|
||||||
|
- **Gestión de Totalizadores:** Las variables `mResetProductTotTmr` y `mResetTotalizerTmr` indican que este FB contiene la lógica para iniciar el reseteo de los totalizadores (posiblemente activando un temporizador o directamente llamando a una función/método en `TotalizerCtrl`), probablemente en respuesta a un comando HMI o al final de un ciclo/batch.
|
||||||
|
- **Lógica de Interfaz:** Procesar las señales de las interfaces externas (Llenadora, Sala Jarabes, CIP) y actualizar las señales de estado/petición correspondientes en los DBs de interfaz.
|
||||||
|
|
||||||
|
### Instancia DB (`BlenderCtrl__Main_DB`)
|
||||||
|
|
||||||
|
- Este DB asociado almacena todas las variables estáticas (`VAR_STAT`) del `BlenderCtrl__Main`.
|
||||||
|
- Contiene el estado interno persistente entre ciclos de scan:
|
||||||
|
- El estado actual de la máquina de estados.
|
||||||
|
- Flags internos (ej. `FirstScan`, `ResetRequestPending`).
|
||||||
|
- Instancias de temporizadores (`TON`, `TOF`) o contadores (`CTU`, `CTD`) utilizados dentro del FB.
|
||||||
|
- Copias de comandos o estados importantes.
|
||||||
|
|
||||||
|
### Implementación SCL
|
||||||
|
|
||||||
|
- Se esperaría ver una estructura clara en SCL:
|
||||||
|
- Declaraciones de `VAR_INPUT`, `VAR_OUTPUT`, `VAR_IN_OUT`, `VAR`, `VAR_STAT`, `VAR_TEMP`.
|
||||||
|
- Una sentencia `CASE MyState OF ... END_CASE;` para la máquina de estados.
|
||||||
|
- Llamadas a otros FBs/FCs: `InstanceName(Input1 := Value1, Output1 => Target1);`
|
||||||
|
- Lógica condicional `IF...THEN...ELSE...END_IF;`.
|
||||||
|
- Asignaciones `:=`.
|
||||||
|
|
||||||
|
En resumen, `BlenderCtrl__Main` actúa como el director de orquesta, asegurando que todos los instrumentos (sub-sistemas) toquen en el momento adecuado según la partitura (estado/modo operativo) y respondiendo a las señales del director (HMI) y del entorno (interfaces externas, fallos). Los OBs proporcionan el escenario y el ritmo (ciclo de scan, interrupciones) para que esta orquesta funcione.
|
|
@ -2,3 +2,170 @@
|
||||||
* OB1
|
* OB1
|
||||||
* FC2000 : MIX - Blender Ctrl Main
|
* FC2000 : MIX - Blender Ctrl Main
|
||||||
* FC1860 :
|
* FC1860 :
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Documentación del Software de Control de Mixer (TIA Portal)
|
||||||
|
|
||||||
|
## 1. Introducción
|
||||||
|
|
||||||
|
Este documento describe la estructura y el funcionamiento del software desarrollado en TIA Portal para el control de un proceso de mezclado (Mixer/Blender). El software está escrito principalmente en SCL (Structured Control Language), con algunos componentes originados en LAD o STL. El objetivo es proporcionar una visión general de las funciones, bloques de datos y lógica de control para facilitar su estudio y comprensión.
|
||||||
|
|
||||||
|
## 2. Arquitectura General
|
||||||
|
|
||||||
|
El software parece seguir una estructura modular común en TIA Portal, utilizando:
|
||||||
|
|
||||||
|
* **Bloques de Función (FB):** Encapsulan lógica compleja y mantienen su propio estado (datos de instancia). Ejemplos: `BlenderPID_PIDSPCalc`, `BlenderPID_ActualRecipe`, `MFMAnalogValues`.
|
||||||
|
* **Funciones (FC):** Realizan tareas específicas sin mantener un estado interno persistente entre llamadas. Ejemplos: `BlenderCtrl_InitErrors`, `BlenderRun_SelectConstan`, `CO2EqPress`.
|
||||||
|
* **Bloques de Datos (DB):** Almacenan datos del sistema, como parámetros de configuración, variables de proceso, recetas, estados de HMI y datos persistentes. Ejemplos: `Blender_Constants`, `Blender_Variables`, `HMI_Blender_Parameters`, `HMI_PID`, `Recipe__XX`.
|
||||||
|
|
||||||
|
La ejecución probablemente está organizada en Tareas (OBs cíclicos, de alarma, etc.) que llaman a los FBs y FCs principales. La lógica principal se centra en:
|
||||||
|
|
||||||
|
1. **Gestión de Recetas:** Carga, interpreta y aplica parámetros de recetas de producción y CIP.
|
||||||
|
2. **Control de Procedimientos:** Secuencia las operaciones de la máquina (arranque, producción, parada, enjuague, CIP, runout).
|
||||||
|
3. **Control PID:** Regula flujos (agua, sirope, CO2), niveles y presiones mediante controladores PID con cálculo de FeedForward.
|
||||||
|
4. **Monitorización y Alarmas:** Supervisa el estado del proceso, detecta fallos y gestiona alarmas.
|
||||||
|
5. **Interfaz HMI:** Intercambia datos con la interfaz Hombre-Máquina para visualización y comandos.
|
||||||
|
6. **Manejo de I/O:** Interactúa con sensores, actuadores y medidores de flujo (posiblemente vía Profibus/Profinet).
|
||||||
|
7. **Configuración:** Adapta el funcionamiento según el modelo de máquina y opciones seleccionadas.
|
||||||
|
|
||||||
|
## 3. Bloques de Datos Clave (DBs)
|
||||||
|
|
||||||
|
Estos son algunos de los DBs más importantes identificados:
|
||||||
|
|
||||||
|
* **`Blender_Constants` (DB972):** Almacena constantes físicas y de proceso (densidades, factores de conversión, constantes de PID base, tiempos, etc.).[583]
|
||||||
|
* **`Blender_Variables` (DB971):** Contiene variables de proceso en tiempo real (flujos medidos, SP calculados, errores, niveles, etc.).[599]
|
||||||
|
* **`Blender_Variables_Pers` (DB970):** Guarda variables que deben persistir entre ciclos de encendido/apagado (flags de tipo de receta, totalizadores, horas de funcionamiento).[623]
|
||||||
|
* **`HMI_Blender_Parameters` (DB1001):** Interfaz principal para parámetros de HMI. Contiene:
|
||||||
|
* `Processor_Options`: Opciones de configuración de la máquina (modelo, presencia de equipos como carbonatador, enfriador, tipo de medidores, etc.). **¡Importante para los selectores!**[1095]
|
||||||
|
* `Actual_Recipe_Parameters`: Parámetros de la receta activa.[1096]
|
||||||
|
* `ProcessSetup`: Parámetros de configuración del proceso (presiones, constantes de pérdida, tiempos, etc.).[1097]
|
||||||
|
* **`HMI_PID` (DB1013):** Estructura de datos para todos los controladores PID del sistema (parámetros Kp, Ti, Td, SP, PV, Out, flags de modo manual, etc.).[1135]
|
||||||
|
* **`HMI_Device` (DB1010):** Estructura de datos para controlar y monitorizar dispositivos individuales (válvulas, bombas) con sus estados (abierto, cerrado, manual, fallo, etc.).[1098]
|
||||||
|
* **`HMI_Instrument` (DB1011):** Almacena valores y estados de instrumentos analógicos (niveles, presiones, temperaturas, flujos, etc.).[1122]
|
||||||
|
* **`HMI_Digital` (DB1012):** Almacena estados de instrumentos digitales (sensores de nivel discretos, etc.).[1118]
|
||||||
|
* **`Procedure_Variables` (DB960):** Contiene flags y estados para gestionar la ejecución de diferentes procedimientos (arranque, producción, parada, CIP, runout, etc.).[1475]
|
||||||
|
* **`PID_Variables` (DB961):** Variables intermedias utilizadas específicamente en los cálculos de los PID (valores delta P, pérdidas por fricción, valores integrales guardados).[1459]
|
||||||
|
* **`Profibus_Variables` (DB973):** Almacena datos leídos desde dispositivos Profibus (probablemente medidores de flujo Maselli, Endress+Hauser, MicroMotion, etc.).[1560]
|
||||||
|
* **`System_RunOut_Variables` (DB962):** Gestiona el proceso de fin de producción (runout) y cambio rápido de formato (QCO).[1877]
|
||||||
|
* **`Recipe__XX` (DB401-DB450):** Almacenan los datos de las recetas de producción.[1594]-[1693]
|
||||||
|
* **`CIPRecipe_XX` (DB501-DB530):** Almacenan los datos de las recetas CIP.[775]-[834]
|
||||||
|
* **Otros DBs HMI:** `HMI_Alarms` (DB1000)[1092], `HMI_Variables_Cmd` (DB1005)[1156], `HMI_Variables_Status` (DB1006)[1158], `HMI_Local_CIP_Variables` (DB1003)[1133], `HMI_Service` (DB1004)[1154], `HMI_Recipe_Edit` (DB1008)[1140], `HMI_Recipe_Name` (DB1009)[1142] gestionan diferentes aspectos de la interfaz HMI.
|
||||||
|
|
||||||
|
## 4. Módulos de Funcionalidad Principal
|
||||||
|
|
||||||
|
### 4.1. Control Principal y Secuenciación
|
||||||
|
|
||||||
|
* **Gestión de Procedimientos:** Los flags en `Procedure_Variables` (DB960) indican el estado de las secuencias (arranque, producción, parada, etc.). Funciones como `BlenderCtrl_ResetSPWord` (FC2014)[12] y `BlenderCtrl_UpdatePWord` (FC2034)[17] parecen gestionar la activación y el estado de los actuadores (`gSP_...` -> `gP_...`) según lo requiera cada paso del procedimiento.
|
||||||
|
* **Modo Automático/Manual:** `BlenderCtrl_All Auto` (FC2036)[1] y `BlenderCtrl_ManualActive` (FC2037)[7] gestionan el estado general y las alarmas relacionadas con los modos de operación.
|
||||||
|
|
||||||
|
### 4.2. Control PID
|
||||||
|
|
||||||
|
Este es el núcleo del control de proceso continuo.
|
||||||
|
|
||||||
|
* **`BlenderPID__Main` (FB):** Orquesta la lógica PID. Llama a otros bloques para inicializar parámetros y calcular SPs/FF. Transfiere PVs a los PIDs y gestiona modos (Auto/Manual, Simulación, CIP).[412]
|
||||||
|
* **`BlenderPID_PIDSPCalc` (FB):** Calcula los Setpoints (SP) para los PIDs principales (flujos de agua `RMM301`, sirope `RMP302`, CO2 `RMM303`, GAS2 `RMM304`; presión tanque `RVM301`; niveles `RVP303`, `RVN302`; temperatura `RVM319`) basándose en la receta activa, el modo de operación, las rampas de velocidad, la demanda del llenador y las correcciones por error.[286] Llama a funciones como `CO2EqPress`[968], `DeairCO2TempComp`[1007], `MaxCarboCO2 Vol`[1256].
|
||||||
|
* **`BlenderPID_PIDFFCalc` (FB):** Calcula los valores de FeedForward (FF) para los PIDs de flujo y nivel, anticipando la apertura de las válvulas según el SP y las condiciones de presión/fricción.[151] Utiliza `FrictionLoss`[1069] y `FeedForward`[1037].
|
||||||
|
* **`BlenderPID_PIDInitParam` (FB):** Inicializa y ajusta dinámicamente los parámetros de los PID (Kp, Ti, Td) según las condiciones (estabilidad, modo parada).[209]
|
||||||
|
* **`BlenderPID_BlendingFault` (FB):** Monitoriza los errores acumulados de mezcla (`gBlendError`) y carbonatación (`gCarboCO2Error`) y genera alarmas si exceden los límites definidos.[116]
|
||||||
|
* **`BlenderPIDCtrl_SaveInteg` (FB):** Guarda el término integral de los PIDs cuando el flujo es mínimo y estable, para mejorar el arranque posterior.[32]
|
||||||
|
* **`BlenderPID_PIDResInteg` (FC):** Resetea los términos integrales de los PIDs.[274]
|
||||||
|
* **Otros PIDs:** Se gestionan PIDs específicos como el de liberación de presión (`BlenderPIDCtrl_PresRelea`)[25] y el control de cabezal de llenado (`PID_Filling_Head_Calc`)[1446].
|
||||||
|
|
||||||
|
### 4.3. Gestión de Recetas
|
||||||
|
|
||||||
|
* **`RecipeManagement___Prod` (FC1798):** Gestiona la carga, guardado, edición, copia y borrado de recetas de producción (probablemente interactuando con DBs `Recipe__XX` y HMI).[1711]
|
||||||
|
* **`CIPRecipeManagement` (FC1799):** Gestión similar para las recetas CIP (usando DBs `CIPRecipe_XX`).[835]
|
||||||
|
* **`BlenderPID_ActualRecipe` (FB):** Interpreta los parámetros de la receta activa (`HMI_Blender_Parameters.Actual_Recipe_Parameters`) y configura los flags y variables de operación correspondientes (`gSugarBeverage`, `gWaterRecipe`, `gCarboStillRecipe`, `gSkipDeaireation`, niveles de tanque, etc.).[86]
|
||||||
|
* **`RecipeCalculation` (FC):** Calcula valores dependientes dentro de la edición de recetas (ej. densidad a partir de Brix, ratio a partir de Brix, etc.).[1694]
|
||||||
|
|
||||||
|
### 4.4. Configuración de Máquina y Constantes (Selectores DIP)
|
||||||
|
|
||||||
|
La configuración principal de la máquina parece realizarse a través del parámetro `_ModelNum` dentro de `HMI_Blender_Parameters.Processor_Options.Blender_OPT`. Este número (probablemente ajustado vía HMI o selector físico) determina qué conjunto de constantes se carga:
|
||||||
|
|
||||||
|
* **`BlenderRun_SelectConstan` (FC):** Esta función es clave. Utiliza una estructura `CASE` sobre `HMI_Blender_Parameters.Processor_Options.Blender_OPT._ModelNum` (valores 0 a 10).[523]
|
||||||
|
* **Para cada `_ModelNum`:** Se asignan valores específicos a variables en `Blender_Variables` (DB971), tales como:
|
||||||
|
* `gWaterVFM_DN`, `gSyrupMFM_DN`, `gWaterPipe_DN`: Diámetros nominales de medidores y tuberías.[524, 527, 531, 535, 539, 543, 547, 551, 555, 559, 563]
|
||||||
|
* `gSyrupMFMZeroStab`: Estabilidad del cero del medidor de sirope.[524, 528, 532, 536, 540, 544, 548, 552, 556, 560, 564]
|
||||||
|
* `gProdTankVolume`, `gDeairTankVolume`: Volúmenes de los tanques.[525, 529, 533, 537, 541, 545, 549, 553, 557, 561, 565]
|
||||||
|
* `gBlenderNomSpeed`: Velocidad nominal de producción.[525, 529, 533, 537, 541, 545, 549, 553, 557, 561, 565]
|
||||||
|
* `gProdTankBottomVol`: Volumen muerto del tanque de producto.[526, 530, 534, 538, 542, 546, 550, 554, 558, 562, 566]
|
||||||
|
* `gBufferTankProbeHeight`: Altura de la sonda del tanque buffer (diferente para modelos 4-6 y 7-9).[543, 547, 551, 555, 559, 563]
|
||||||
|
* **Después del `CASE`:** Se definen otros parámetros base:
|
||||||
|
* `gMinProduction`: Velocidad mínima de producción (calculada a partir de la nominal).[568, 569]
|
||||||
|
* Errores/Repetibilidad de medidores (`gWaterVFMMeasError`, `gSyrupMFMMeasError`, etc.).[573]-[579]
|
||||||
|
* Parámetros de primera producción (`gFirstProdExtraBrix`, etc.).[580]
|
||||||
|
* Tiempos y valores para el runout.[581, 582]
|
||||||
|
|
||||||
|
* **Otras Opciones (`HMI_Blender_Parameters.Processor_Options.Blender_OPT`):** Flags booleanos que habilitan/deshabilitan funcionalidades o indican presencia de equipos:
|
||||||
|
* `_Simulation`: Habilita modo simulación (visto en `MFMAnalogValues`[1310], `Input_CheckFlowMetersSta`[1196]).
|
||||||
|
* `_BrixMeter`, `_MeterType`, `_Promass`: Configuración del medidor de producto/brix.[87, 88]
|
||||||
|
* `_CarboPresent`: Indica si hay carbonatador.[94]
|
||||||
|
* `_CO2_GAS2_Injection`, `_GAS2InjectionType`: Configuración de segunda inyección de gas (N2/Aire).[95, 99, 183]
|
||||||
|
* `_CoolerPresent`, `_CoolerControl`: Presencia y tipo de control del enfriador.[93]
|
||||||
|
* `_Deaireation`, `_ByPassDeair`, `_StillWaterByPass`: Opciones de desaireación.[107]
|
||||||
|
* `_BlendFillSystem`: Indica si el sistema está acoplado a un llenador.[108, 110]
|
||||||
|
* `_FlowMeterType`: Tipo de medidor de flujo (Endress/MicroMotion).[1196, 1278]
|
||||||
|
* `_WaterPromass`: Indica si el medidor de agua es Promass.[1164, 1293]
|
||||||
|
* `_SyrupLevel`: Usa nivel en tanque de sirope en lugar de cantidad fija.[1510]
|
||||||
|
* `_FastChangeOverEnabled`: Habilita cambio rápido de formato.[1873]
|
||||||
|
* ... y otras opciones vistas en el código.
|
||||||
|
|
||||||
|
### 4.5. Manejo de I/O y Dispositivos
|
||||||
|
|
||||||
|
* **Lectura Analógica:** `ReadAnalogIn` (FC1971)[1584] parece escalar y verificar valores analógicos de entrada (PEW).
|
||||||
|
* **Escaneo Digital:** `Input_DigitalScanner` (FC1719)[1200] procesa entradas digitales, aplicando filtros o lógica de temporización.
|
||||||
|
* **Estado de Medidores:** `Input_CheckFlowMetersSta` (FC)[1160] interpreta los bytes de estado de los medidores de flujo Profibus para detectar fallos o condiciones EPD (Empty Pipe Detection).
|
||||||
|
* **Escaneo de Instrumentos:** `Instrument_Scanner` (FC1968)[1203] verifica fallos generales de instrumentación.
|
||||||
|
* **Fallo Válvulas Neumáticas:** `Pneumatic_Valve_Fault` (FC1969)[1466] monitoriza el estado de las válvulas neumáticas comparando comando y feedback, usando temporizadores definidos en `Pneumatic_Valve_Fault_DB` (DB969)[1464].
|
||||||
|
* **Interfaz Profibus:** `Profibus_Variables` (DB973)[1560] almacena los datos leídos. `MFMAnalogValues` (FB)[1267] procesa estos datos (o simula si está activo).
|
||||||
|
* **Diagnóstico Profibus/Profinet:** Bloques como `GNS_PLCdia_ProfibusData` (DB2416)[1078], `GNS_PLCdia_ProfinetData` (DB2415)[1081], `HMI_CPU_DP_Diag` (DB174)[1084] y `GLOBAL_DIAG_DB` (DB11)[1075] parecen relacionados con el diagnóstico de la red de comunicación.
|
||||||
|
|
||||||
|
### 4.6. Interfaz HMI
|
||||||
|
|
||||||
|
* **Comandos y Estado:** `HMI_Variables_Cmd` (DB1005)[1156] recibe comandos de la HMI. `HMI_Variables_Status` (DB1006)[1158] envía el estado del proceso a la HMI.
|
||||||
|
* **Visualización de Datos:** `Output_AnalogValueToHMI` (FC)[1421] prepara y envía valores analógicos relevantes (flujos, temperaturas, errores, SPs) a la HMI para su visualización.
|
||||||
|
* **Alarmas y Mensajes:** `HMI_Alarms` (DB1000)[1092] contiene los flags de alarma. `ProductQuality_Messages` (FC)[1532] activa mensajes específicos basados en la calidad del producto. `MessageScroll` (FC210)[1263] podría gestionar la visualización secuencial de mensajes.
|
||||||
|
* **Gestión de Usuarios:** `HMI_Key_User` (DB500)[1088] maneja la autenticación y niveles de usuario.
|
||||||
|
|
||||||
|
### 4.7. Control CIP
|
||||||
|
|
||||||
|
* **Secuenciador CIP:** Bloques como `CIPLocal_ExecSimpleCIP` (FC)[682], `CIPLocal_ExecStep` (FC)[716], `CIPLocal_ProgStepUp` (FC)[766], `CIPLocal_ProgStepDown` (FC)[760] ejecutan las recetas CIP paso a paso.
|
||||||
|
* **Inicialización Pasos CIP:** `CIP_SimpleProgr_Init` (FC)[872] define qué válvulas/bombas activar para cada tipo de paso CIP (Enjuague, Recirculación, Drenaje, etc.).
|
||||||
|
* **Datos CIP:** `CIP_Program_Variables` (DB963)[869] almacena el estado actual del CIP. `CIPReportDB` (DB600)[864] parece ser para reportes.
|
||||||
|
|
||||||
|
### 4.8. Funciones Utilitarias
|
||||||
|
|
||||||
|
Se utilizan diversas funciones para cálculos específicos:
|
||||||
|
|
||||||
|
* **Cálculos Físicos:** `SyrupDensity`[1868], `WaterDensity`[1903], `CO2 Solubility`[962], `CO2EqPress`[968], `CO2InjPressure`[975], `PPM O2`[1469].
|
||||||
|
* **Cálculos de Flujo/Presión:** `ValveFlow`[1899], `FrictionLoss`[1069], `DeltaP`[1029], `Flow_To_Press_Loss`[1063], `Freq_To_mmH2O`[1067], `mmH2O_TO_Freq`[1361], `DeaireationValve`[1010].
|
||||||
|
* **Procesamiento de Señales:** `Integral` (FB)[1206], `LowPassFilter` (FB)[1227], `SlewLimit` (FB)[1808], `Delay` (FB)[1015], `MSE Slope` (FB)[1398], `Statistical_Analisys` (FB)[1840].
|
||||||
|
* **Manipulación de Datos/Strings:** `Block_compare` (FC61)[634], `Block_move` (FC60)[639], `DELETE` (FC4)[1020], `EQ_STRNG` (FC10)[1033], `REPLACE_Mod` (FC32)[1794].
|
||||||
|
* **Otras:** `FW_DRand` (FC1922)[1072] (generador aleatorio para simulación), `T_Timer` (FC40)[1896] (temporizador simple).
|
||||||
|
|
||||||
|
## 5. Estructura de Llamadas (Inferida)
|
||||||
|
|
||||||
|
Como se mencionó, sin el proyecto completo, la jerarquía exacta es difícil de determinar. Sin embargo, algunas interacciones clave son:
|
||||||
|
|
||||||
|
* Un **OB Cíclico principal (Task0/Task1/Task2?)** probablemente llama a:
|
||||||
|
* `BlenderPID__Main` (que a su vez llama a `BlenderPID_PIDInitParam`, `BlenderPID_PIDSPCalc`, `BlenderPID_ActualRecipe`, etc.)
|
||||||
|
* Bloques de gestión de procedimientos (que usan `BlenderCtrl_ResetSPWord`, `BlenderCtrl_UpdatePWord`).
|
||||||
|
* Bloques de manejo de I/O (`Input_DigitalScanner`, `Instrument_Scanner`, `MFMAnalogValues`, `ReadAnalogIn`).
|
||||||
|
* Bloques de comunicación HMI (`Output_AnalogValueToHMI`, `ProductQuality_Messages`).
|
||||||
|
* Gestores de recetas (`RecipeManagement___Prod`, `CIPRecipeManagement`).
|
||||||
|
* Control CIP (`CIPLocal_ExecSimpleCIP`).
|
||||||
|
* Control de Runout/QCO (`ProductAvailable`, `QCO Monitor`).
|
||||||
|
* `BlenderPID_PIDSPCalc` llama a funciones de cálculo como `CO2EqPress`, `DeairCO2TempComp`, `MaxCarboCO2 Vol`.
|
||||||
|
* `BlenderPID_PIDFFCalc` llama a `FrictionLoss` y `FeedForward`.
|
||||||
|
* `MFMAnalogValues` llama a `ValveFlow`, `DeltaP`, `FW_DRand` y utiliza FBs como `SlewLimit`, `LowPassFilter`, `Delay`.
|
||||||
|
* `BlenderRun_SelectConstan` es llamado (probablemente al inicio o al cambiar configuración) para establecer constantes.
|
||||||
|
* El secuenciador CIP (`CIPLocal_ExecSimpleCIP`) llama a `CIPLocal_ProgStepUp/Down`, `CIPLocal_ExecStep`, y `CIP_SimpleProgr_Init`.
|
||||||
|
|
||||||
|
## 6. Conclusión
|
||||||
|
|
||||||
|
Este software implementa un control completo para un proceso de mezcla, abarcando desde la gestión de recetas y la configuración de la máquina hasta el control PID detallado, la secuenciación de procedimientos (producción, CIP, runout) y la interacción con HMI y periféricos. La configuración de la máquina se basa fuertemente en el `_ModelNum` y otros flags dentro de `HMI_Blender_Parameters.Processor_Options.Blender_OPT`, que determinan las constantes y funcionalidades activas.
|
||||||
|
|
||||||
|
Para un análisis más profundo de la secuencia exacta de ejecución y las interdependencias completas, sería necesario examinar el proyecto completo en TIA Portal, especialmente la configuración de los OBs y las llamadas entre bloques.
|
||||||
|
|
||||||
|
Espero que esta documentación te sea de gran utilidad para tu estudio. Si necesitas analizar algún bloque o funcionalidad en más detalle, no dudes en preguntar.
|
|
@ -0,0 +1,186 @@
|
||||||
|
# Project Hardware & IO Summary (from CAx Export)
|
||||||
|
|
||||||
|
## Network Configuration
|
||||||
|
| Parent Device | Interface/Node Name | Type | Address (IP/DP) |
|
||||||
|
|---|---|---|---|
|
||||||
|
| SAE196_c0.2.XML | PB1 | Profibus | 12 |
|
||||||
|
| SAE196_c0.2.XML | PB1 | Profibus | 20 |
|
||||||
|
| SAE196_c0.2.XML | PB1 | Profibus | 21 |
|
||||||
|
| SAE196_c0.2.XML | PB1 | Profibus | 22 |
|
||||||
|
| SAE196_c0.2.XML | PB1 | Profibus | 10 |
|
||||||
|
| SAE196_c0.2.XML | PB1 | Profibus | 8 |
|
||||||
|
| SAE196_c0.2.XML | PB1 | Profibus | 40 |
|
||||||
|
| SAE196_c0.2.XML | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| SAE196_c0.2.XML | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| SAE196_c0.2.XML | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| SAE196_c0.2.XML | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| SAE196_c0.2.XML | P1 | Profibus | 1 |
|
||||||
|
| Ungrouped devices | PB1 | Profibus | 12 |
|
||||||
|
| Ungrouped devices | PB1 | Profibus | 20 |
|
||||||
|
| Ungrouped devices | PB1 | Profibus | 21 |
|
||||||
|
| Ungrouped devices | PB1 | Profibus | 22 |
|
||||||
|
| Ungrouped devices | PB1 | Profibus | 10 |
|
||||||
|
| Ungrouped devices | PB1 | Profibus | 8 |
|
||||||
|
| Ungrouped devices | PB1 | Profibus | 40 |
|
||||||
|
| GSD device_10 | PB1 | Profibus | 12 |
|
||||||
|
| Telaio di montaggio_0 | PB1 | Profibus | 12 |
|
||||||
|
| Festo_283E1 | PB1 | Profibus | 12 |
|
||||||
|
| DP interface | PB1 | Profibus | 12 |
|
||||||
|
| GSD device_11 | PB1 | Profibus | 20 |
|
||||||
|
| Telaio di montaggio_0 | PB1 | Profibus | 20 |
|
||||||
|
| Water_Volumetric_251U1 | PB1 | Profibus | 20 |
|
||||||
|
| DP interface | PB1 | Profibus | 20 |
|
||||||
|
| GSD device_12 | PB1 | Profibus | 21 |
|
||||||
|
| Telaio di montaggio_0 | PB1 | Profibus | 21 |
|
||||||
|
| Syrup_Mass_252U1 | PB1 | Profibus | 21 |
|
||||||
|
| DP interface | PB1 | Profibus | 21 |
|
||||||
|
| GSD device_13 | PB1 | Profibus | 22 |
|
||||||
|
| Telaio di montaggio_0 | PB1 | Profibus | 22 |
|
||||||
|
| CO2_Mass_253U1 | PB1 | Profibus | 22 |
|
||||||
|
| DP interface | PB1 | Profibus | 22 |
|
||||||
|
| ET 200SP station_2 | PB1 | Profibus | 10 |
|
||||||
|
| Telaio di montaggio_0 | PB1 | Profibus | 10 |
|
||||||
|
| IM151_280A0 | PB1 | Profibus | 10 |
|
||||||
|
| DP interface | PB1 | Profibus | 10 |
|
||||||
|
| Dispositivo GSD_2 | PB1 | Profibus | 8 |
|
||||||
|
| Rack_0 | PB1 | Profibus | 8 |
|
||||||
|
| 045U1 | PB1 | Profibus | 8 |
|
||||||
|
| DP interface | PB1 | Profibus | 8 |
|
||||||
|
| GSD device_1 | PB1 | Profibus | 40 |
|
||||||
|
| Rack_0 | PB1 | Profibus | 40 |
|
||||||
|
| Anton Paar_120U1 | PB1 | Profibus | 40 |
|
||||||
|
| DP interface | PB1 | Profibus | 40 |
|
||||||
|
| S71500/ET200MP station_1 | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| S71500/ET200MP station_1 | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| S71500/ET200MP station_1 | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| S71500/ET200MP station_1 | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| S71500/ET200MP station_1 | P1 | Profibus | 1 |
|
||||||
|
| Telaio di montaggio_0 | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| Telaio di montaggio_0 | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| Telaio di montaggio_0 | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| Telaio di montaggio_0 | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| Telaio di montaggio_0 | P1 | Profibus | 1 |
|
||||||
|
| PLC | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| PLC | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| PLC | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| PLC | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| PLC | P1 | Profibus | 1 |
|
||||||
|
| Interfaccia PROFINET_1 | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| Interfaccia PROFINET_1 | E1 | Ethernet | 192.168.1.1 |
|
||||||
|
| Interfaccia PROFINET_2 | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| Interfaccia PROFINET_2 | E1 | Ethernet | 10.1.33.11 |
|
||||||
|
| Interfaccia DP_1 | P1 | Profibus | 1 |
|
||||||
|
|
||||||
|
## I/O Modules & Addresses
|
||||||
|
| Module Name | Type Name | Order Number | Slot/Pos | Logical Addresses |
|
||||||
|
| ---------------------------------- | ----------------- | ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||||
|
| SAE196_c0.2.XML | CPU 1516F-3 PN/DP | 6ES7 516-3FP03-0AB0 | N/A | Input Start:501 Len:8 (Area:1)<br>Output Start:16 Len:8 (Area:1)<br>Output Start:17 Len:8 (Area:1)<br>Output Start:18 Len:8 (Area:1)<br>Output Start:19 Len:8 (Area:1)<br>Output Start:20 Len:8 (Area:1)<br>Input Start:3080 Len:40 (Area:1)<br>Input Start:3100 Len:40 (Area:1)<br>Output Start:3100 Len:8 (Area:2)<br>Input Start:2030 Len:40 (Area:1)<br>Input Start:2045 Len:40 (Area:1)<br>Input Start:2050 Len:40 (Area:1)<br>Input Start:2055 Len:40 (Area:1)<br>Input Start:2070 Len:40 (Area:1)<br>Output Start:2070 Len:8 (Area:2)<br>Input Start:3200 Len:40 (Area:1)<br>Input Start:3215 Len:40 (Area:1)<br>Input Start:3225 Len:40 (Area:1)<br>Input Start:3240 Len:40 (Area:1)<br>Output Start:3240 Len:8 (Area:2)<br>Input Start:0 Len:8 (Area:1)<br>Input Start:1 Len:8 (Area:1)<br>Input Start:2 Len:8 (Area:1)<br>Input Start:3 Len:8 (Area:1)<br>Input Start:4 Len:8 (Area:1)<br>Input Start:5 Len:8 (Area:1)<br>Input Start:6 Len:8 (Area:1)<br>Input Start:7 Len:8 (Area:1)<br>Output Start:0 Len:8 (Area:1)<br>Output Start:1 Len:8 (Area:1)<br>Output Start:2 Len:8 (Area:1)<br>Output Start:3 Len:8 (Area:1)<br>Output Start:4 Len:8 (Area:1)<br>Output Start:5 Len:8 (Area:1)<br>Output Start:6 Len:8 (Area:1)<br>Output Start:7 Len:8 (Area:1)<br>Input Start:100 Len:32 (Area:1)<br>Input Start:104 Len:32 (Area:1)<br>Input Start:108 Len:32 (Area:1)<br>Input Start:112 Len:32 (Area:1)<br>Input Start:116 Len:32 (Area:1)<br>Output Start:100 Len:32 (Area:1)<br>Output Start:104 Len:32 (Area:1)<br>Output Start:108 Len:32 (Area:1)<br>Output Start:112 Len:32 (Area:1)<br>Output Start:116 Len:32 (Area:1)<br>Output Start:120 Len:32 (Area:1)<br>Input Start:1640 Len:160 (Area:1)<br>Output Start:1640 Len:160 (Area:2)<br>Input Start:15000 Len:256 (Area:1)<br>Input Start:15032 Len:256 (Area:1)<br>Input Start:15064 Len:256 (Area:1)<br>Input Start:15096 Len:256 (Area:1)<br>Output Start:15000 Len:256 (Area:1)<br>Output Start:15032 Len:256 (Area:1)<br>Output Start:15064 Len:256 (Area:1)<br>Output Start:15096 Len:256 (Area:1) |
|
||||||
|
| Ungrouped devices | Server module | 6ES7 193-6PA00-0AA0 | N/A | Input Start:501 Len:8 (Area:1)<br>Output Start:16 Len:8 (Area:1)<br>Output Start:17 Len:8 (Area:1)<br>Output Start:18 Len:8 (Area:1)<br>Output Start:19 Len:8 (Area:1)<br>Output Start:20 Len:8 (Area:1)<br>Input Start:3080 Len:40 (Area:1)<br>Input Start:3100 Len:40 (Area:1)<br>Output Start:3100 Len:8 (Area:2)<br>Input Start:2030 Len:40 (Area:1)<br>Input Start:2045 Len:40 (Area:1)<br>Input Start:2050 Len:40 (Area:1)<br>Input Start:2055 Len:40 (Area:1)<br>Input Start:2070 Len:40 (Area:1)<br>Output Start:2070 Len:8 (Area:2)<br>Input Start:3200 Len:40 (Area:1)<br>Input Start:3215 Len:40 (Area:1)<br>Input Start:3225 Len:40 (Area:1)<br>Input Start:3240 Len:40 (Area:1)<br>Output Start:3240 Len:8 (Area:2)<br>Input Start:0 Len:8 (Area:1)<br>Input Start:1 Len:8 (Area:1)<br>Input Start:2 Len:8 (Area:1)<br>Input Start:3 Len:8 (Area:1)<br>Input Start:4 Len:8 (Area:1)<br>Input Start:5 Len:8 (Area:1)<br>Input Start:6 Len:8 (Area:1)<br>Input Start:7 Len:8 (Area:1)<br>Output Start:0 Len:8 (Area:1)<br>Output Start:1 Len:8 (Area:1)<br>Output Start:2 Len:8 (Area:1)<br>Output Start:3 Len:8 (Area:1)<br>Output Start:4 Len:8 (Area:1)<br>Output Start:5 Len:8 (Area:1)<br>Output Start:6 Len:8 (Area:1)<br>Output Start:7 Len:8 (Area:1)<br>Input Start:100 Len:32 (Area:1)<br>Input Start:104 Len:32 (Area:1)<br>Input Start:108 Len:32 (Area:1)<br>Input Start:112 Len:32 (Area:1)<br>Input Start:116 Len:32 (Area:1)<br>Output Start:100 Len:32 (Area:1)<br>Output Start:104 Len:32 (Area:1)<br>Output Start:108 Len:32 (Area:1)<br>Output Start:112 Len:32 (Area:1)<br>Output Start:116 Len:32 (Area:1)<br>Output Start:120 Len:32 (Area:1)<br>Input Start:1640 Len:160 (Area:1)<br>Output Start:1640 Len:160 (Area:2)<br>Input Start:15000 Len:256 (Area:1)<br>Input Start:15032 Len:256 (Area:1)<br>Input Start:15064 Len:256 (Area:1)<br>Input Start:15096 Len:256 (Area:1)<br>Output Start:15000 Len:256 (Area:1)<br>Output Start:15032 Len:256 (Area:1)<br>Output Start:15064 Len:256 (Area:1)<br>Output Start:15096 Len:256 (Area:1) |
|
||||||
|
| CPX-FB13: DP-Slave [Status]_1 | N/A | N/A | N/A | Input Start:501 Len:8 (Area:1) |
|
||||||
|
| MPA1S: VMPA1-FB-EMS-8 [8DO]_1 | N/A | N/A | N/A | Output Start:16 Len:8 (Area:1) |
|
||||||
|
| MPA1S: VMPA1-FB-EMS-8 [8DO]_2 | N/A | N/A | N/A | Output Start:17 Len:8 (Area:1) |
|
||||||
|
| MPA1S: VMPA1-FB-EMS-8 [8DO]_3 | N/A | N/A | N/A | Output Start:18 Len:8 (Area:1) |
|
||||||
|
| MPA1S: VMPA1-FB-EMS-8 [8DO]_4 | N/A | N/A | N/A | Output Start:19 Len:8 (Area:1) |
|
||||||
|
| MPA1S: VMPA1-FB-EMS-8 [8DO]_5 | N/A | N/A | N/A | Output Start:20 Len:8 (Area:1) |
|
||||||
|
| Volume Flow | N/A | N/A | N/A | Input Start:3080 Len:40 (Area:1) |
|
||||||
|
| Totalizer Value / Control | N/A | N/A | N/A | Input Start:3100 Len:40 (Area:1)<br>Output Start:3100 Len:8 (Area:2) |
|
||||||
|
| Mass Flow | N/A | N/A | N/A | Input Start:2030 Len:40 (Area:1) |
|
||||||
|
| Density | N/A | N/A | N/A | Input Start:2045 Len:40 (Area:1) |
|
||||||
|
| Concentration | N/A | N/A | N/A | Input Start:2050 Len:40 (Area:1) |
|
||||||
|
| Temperature | N/A | N/A | N/A | Input Start:2055 Len:40 (Area:1) |
|
||||||
|
| Totalizer Value / Control | N/A | N/A | N/A | Input Start:2070 Len:40 (Area:1)<br>Output Start:2070 Len:8 (Area:2) |
|
||||||
|
| Mass Flow | N/A | N/A | N/A | Input Start:3200 Len:40 (Area:1) |
|
||||||
|
| Density | N/A | N/A | N/A | Input Start:3215 Len:40 (Area:1) |
|
||||||
|
| Temperature | N/A | N/A | N/A | Input Start:3225 Len:40 (Area:1) |
|
||||||
|
| Totalizer Value / Control | N/A | N/A | N/A | Input Start:3240 Len:40 (Area:1)<br>Output Start:3240 Len:8 (Area:2) |
|
||||||
|
| 300A0 | N/A | N/A | N/A | Input Start:0 Len:8 (Area:1) |
|
||||||
|
| 301A0 | N/A | N/A | N/A | Input Start:1 Len:8 (Area:1) |
|
||||||
|
| 302A0 | N/A | N/A | N/A | Input Start:2 Len:8 (Area:1) |
|
||||||
|
| 303A0 | N/A | N/A | N/A | Input Start:3 Len:8 (Area:1) |
|
||||||
|
| 304A0 | N/A | N/A | N/A | Input Start:4 Len:8 (Area:1) |
|
||||||
|
| 305A0 | N/A | N/A | N/A | Input Start:5 Len:8 (Area:1) |
|
||||||
|
| 306A0 | N/A | N/A | N/A | Input Start:6 Len:8 (Area:1) |
|
||||||
|
| 307A0 | N/A | N/A | N/A | Input Start:7 Len:8 (Area:1) |
|
||||||
|
| 320A0 | N/A | N/A | N/A | Output Start:0 Len:8 (Area:1) |
|
||||||
|
| 321A0 | N/A | N/A | N/A | Output Start:1 Len:8 (Area:1) |
|
||||||
|
| 322A0 | N/A | N/A | N/A | Output Start:2 Len:8 (Area:1) |
|
||||||
|
| 323A0 | N/A | N/A | N/A | Output Start:3 Len:8 (Area:1) |
|
||||||
|
| 324A0 | N/A | N/A | N/A | Output Start:4 Len:8 (Area:1) |
|
||||||
|
| 325A0 | N/A | N/A | N/A | Output Start:5 Len:8 (Area:1) |
|
||||||
|
| 326A0 | N/A | N/A | N/A | Output Start:6 Len:8 (Area:1) |
|
||||||
|
| 327A0 | N/A | N/A | N/A | Output Start:7 Len:8 (Area:1) |
|
||||||
|
| 340A1 | N/A | N/A | N/A | Input Start:100 Len:32 (Area:1) |
|
||||||
|
| 341A1 | N/A | N/A | N/A | Input Start:104 Len:32 (Area:1) |
|
||||||
|
| 342A1 | N/A | N/A | N/A | Input Start:108 Len:32 (Area:1) |
|
||||||
|
| 343A1 | N/A | N/A | N/A | Input Start:112 Len:32 (Area:1) |
|
||||||
|
| 344A1 | N/A | N/A | N/A | Input Start:116 Len:32 (Area:1) |
|
||||||
|
| 350A1 | N/A | N/A | N/A | Output Start:100 Len:32 (Area:1) |
|
||||||
|
| 351A1 | N/A | N/A | N/A | Output Start:104 Len:32 (Area:1) |
|
||||||
|
| 352A1 | N/A | N/A | N/A | Output Start:108 Len:32 (Area:1) |
|
||||||
|
| 353A1 | N/A | N/A | N/A | Output Start:112 Len:32 (Area:1) |
|
||||||
|
| 354A1 | N/A | N/A | N/A | Output Start:116 Len:32 (Area:1) |
|
||||||
|
| 355A1 | N/A | N/A | N/A | Output Start:120 Len:32 (Area:1) |
|
||||||
|
| PPO Type 8 Module consistent PCD_1 | N/A | N/A | N/A | Input Start:1640 Len:160 (Area:1)<br>Output Start:1640 Len:160 (Area:2) |
|
||||||
|
| IN128 mPDS5>PLC_4_1 | N/A | N/A | N/A | Input Start:15000 Len:256 (Area:1) |
|
||||||
|
| IN128 mPDS5>PLC_4_2 | N/A | N/A | N/A | Input Start:15032 Len:256 (Area:1) |
|
||||||
|
| IN128 mPDS5>PLC_4_3 | N/A | N/A | N/A | Input Start:15064 Len:256 (Area:1) |
|
||||||
|
| IN128 mPDS5>PLC_4_4 | N/A | N/A | N/A | Input Start:15096 Len:256 (Area:1) |
|
||||||
|
| OUT128 PLC>mPDS5_4_1 | N/A | N/A | N/A | Output Start:15000 Len:256 (Area:1) |
|
||||||
|
| OUT128 PLC>mPDS5_4_2 | N/A | N/A | N/A | Output Start:15032 Len:256 (Area:1) |
|
||||||
|
| OUT128 PLC>mPDS5_4_3 | N/A | N/A | N/A | Output Start:15064 Len:256 (Area:1) |
|
||||||
|
| OUT128 PLC>mPDS5_4_4 | N/A | N/A | N/A | Output Start:15096 Len:256 (Area:1) |
|
||||||
|
|
||||||
|
## Connections / IO Tag Links
|
||||||
|
| Link Name | Source (Device::Channel/Interface) | Target (Device::Tag/Interface) |
|
||||||
|
|---|---|---|
|
||||||
|
| Link To Subnet_1 | `E1::LogicalEndPoint_Node` | `ETHERNET_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To Subnet_2 | `P1::LogicalEndPoint_Node` | `PROFIBUS_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To Subnet_3 | `PB1::LogicalEndPoint_Node` | `PROFIBUS_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To Subnet_4 | `PB1::LogicalEndPoint_Node` | `PROFIBUS_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To Subnet_5 | `PB1::LogicalEndPoint_Node` | `PROFIBUS_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To Subnet_6 | `PB1::LogicalEndPoint_Node` | `PROFIBUS_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To Subnet_7 | `PB1::LogicalEndPoint_Node` | `PROFIBUS_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To Subnet_8 | `PB1::LogicalEndPoint_Node` | `PROFIBUS_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To Subnet_9 | `PB1::LogicalEndPoint_Node` | `PROFIBUS_1::LogicalEndPoint_Subnet` |
|
||||||
|
| Link To IoSystem_1 | `DP interface::LogicalEndPoint_Interface` | `DP-Mastersystem::LogicalEndPoint_IoSystem` |
|
||||||
|
| Link To IoSystem_2 | `DP interface::LogicalEndPoint_Interface` | `DP-Mastersystem::LogicalEndPoint_IoSystem` |
|
||||||
|
| Link To IoSystem_3 | `DP interface::LogicalEndPoint_Interface` | `DP-Mastersystem::LogicalEndPoint_IoSystem` |
|
||||||
|
| Link To IoSystem_4 | `DP interface::LogicalEndPoint_Interface` | `DP-Mastersystem::LogicalEndPoint_IoSystem` |
|
||||||
|
| Link To IoSystem_5 | `DP interface::LogicalEndPoint_Interface` | `DP-Mastersystem::LogicalEndPoint_IoSystem` |
|
||||||
|
| Link To IoSystem_6 | `DP interface::LogicalEndPoint_Interface` | `DP-Mastersystem::LogicalEndPoint_IoSystem` |
|
||||||
|
| Link To IoSystem_7 | `DP interface::LogicalEndPoint_Interface` | `DP-Mastersystem::LogicalEndPoint_IoSystem` |
|
||||||
|
| Link To Tag_1 | `300A0::Channel_DI_0` | `InputsMaster::DI_AuxVoltage_On` |
|
||||||
|
| Link To Tag_2 | `300A0::Channel_DI_1` | `InputsMaster::DI_PB_HornReset` |
|
||||||
|
| Link To Tag_3 | `300A0::Channel_DI_2` | `InputsMaster::DI_AlarmReset` |
|
||||||
|
| Link To Tag_4 | `300A0::Channel_DI_3` | `InputsMaster::DI_PB_Machine_Stop` |
|
||||||
|
| Link To Tag_5 | `300A0::Channel_DI_4` | `InputsMaster::DI_PB_Machine_Start` |
|
||||||
|
| Link To Tag_6 | `300A0::Channel_DI_5` | `Inputs::DI_Emergency_Pilz_On` |
|
||||||
|
| Link To Tag_7 | `300A0::Channel_DI_6` | `Inputs::DI_LSN301L` |
|
||||||
|
| Link To Tag_8 | `300A0::Channel_DI_7` | `InputsMaster::DI_Min_Syrup_Level` |
|
||||||
|
| Link To Tag_9 | `301A0::Channel_DI_0` | `Inputs::DI_LSM302L` |
|
||||||
|
| Link To Tag_10 | `301A0::Channel_DI_5` | `Inputs::DI_RMM301_Closed` |
|
||||||
|
| Link To Tag_11 | `301A0::Channel_DI_6` | `Inputs::DI_RMP302_Closed` |
|
||||||
|
| Link To Tag_12 | `301A0::Channel_DI_7` | `Inputs::DI_RMM303_Closed` |
|
||||||
|
| Link To Tag_13 | `302A0::Channel_DI_0` | `InputsMaster::DI_PPN301_Ovrld` |
|
||||||
|
| Link To Tag_14 | `302A0::Channel_DI_1` | `InputsMaster::DI_PPN301_SoftStOvr` |
|
||||||
|
| Link To Tag_15 | `302A0::Channel_DI_2` | `Inputs::DI_PPP302_Ovrld` |
|
||||||
|
| Link To Tag_16 | `302A0::Channel_DI_3` | `Inputs::DI_PPP302_Contactor` |
|
||||||
|
| Link To Tag_17 | `302A0::Channel_DI_4` | `Inputs::DI_PPM303_Ovrld` |
|
||||||
|
| Link To Tag_18 | `302A0::Channel_DI_5` | `InputsMaster::DI_PPM303_Contactor` |
|
||||||
|
| Link To Tag_19 | `303A0::Channel_DI_5` | `Inputs::DI_UPSAlarm` |
|
||||||
|
| Link To Tag_20 | `303A0::Channel_DI_6` | `Inputs::DI_UPSsupply` |
|
||||||
|
| Link To Tag_21 | `303A0::Channel_DI_7` | `Inputs::DI_UPSBatteryReady` |
|
||||||
|
| Link To Tag_22 | `304A0::Channel_DI_3` | `Inputs::DI_Emergency_Pressed` |
|
||||||
|
| Link To Tag_23 | `304A0::Channel_DI_4` | `InputsMaster::DI_Log_Sidel` |
|
||||||
|
| Link To Tag_24 | `305A0::Channel_DI_0` | `Inputs::DI_MaxTempAlarm` |
|
||||||
|
| Link To Tag_25 | `305A0::Channel_DI_0` | `Inputs::DI_SyrRoom_SyrPump_Running` |
|
||||||
|
| Link To Tag_26 | `307A0::Channel_DI_1` | `Inputs::DI_Air_InletPress_OK` |
|
||||||
|
| Link To Tag_27 | `307A0::Channel_DI_2` | `InputsMaster::DI_HVP301_Sensor` |
|
||||||
|
| Link To Tag_28 | `307A0::Channel_DI_3` | `InputsMaster::DI_FSS301` |
|
||||||
|
| Link To Tag_29 | `320A0::Channel_DO_0` | `Outputs::DO_HMIPowerSupply` |
|
||||||
|
| Link To Tag_30 | `321A0::Channel_DO_0` | `OutputsMaster::DO_SyRm_SyrupReques` |
|
||||||
|
| Link To Tag_31 | `321A0::Channel_DO_1` | `OutputsMaster::DO_SyrupRoomWaterReq` |
|
||||||
|
| Link To Tag_32 | `325A0::Channel_DO_0` | `Memories::AB5` |
|
||||||
|
| Link To Tag_33 | `325A0::Channel_DO_0` | `Memories::Tag_1` |
|
||||||
|
| Link To Tag_34 | `325A0::Channel_DO_1` | `Memories::AB5` |
|
||||||
|
| ... | ... | ... |
|
|
@ -0,0 +1,25 @@
|
||||||
|
# UDT: AnalogInstrument
|
||||||
|
|
||||||
|
## Members
|
||||||
|
|
||||||
|
| Name | Datatype | Start Value | Comment |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `Spare00` | `Bool` | `` | |
|
||||||
|
| `Spare01` | `Bool` | `` | |
|
||||||
|
| `Wait` | `Bool` | `` | |
|
||||||
|
| `Alarm` | `Bool` | `` | |
|
||||||
|
| `Mask` | `Bool` | `` | |
|
||||||
|
| `_LessThanSP` | `Bool` | `` | |
|
||||||
|
| `_GreaterThanSP` | `Bool` | `` | |
|
||||||
|
| `Config` | `Bool` | `` | |
|
||||||
|
| `Spare10` | `Bool` | `` | |
|
||||||
|
| `Spare11` | `Bool` | `` | |
|
||||||
|
| `Spare12` | `Bool` | `` | |
|
||||||
|
| `_AckAlarm` | `Bool` | `` | |
|
||||||
|
| `PV` | `Real` | `` | |
|
||||||
|
| `SP` | `Real` | `` | |
|
||||||
|
| `Offset` | `Real` | `` | |
|
||||||
|
| `Zero` | `Real` | `` | |
|
||||||
|
| `Span` | `Real` | `` | |
|
||||||
|
| `PVFiltered` | `Real` | `` | |
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1804
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "Baialage" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mLatchONS : Bool;
|
||||||
|
mBalaiage_Req : Bool;
|
||||||
|
BalaiageFlowErrorABS : Real;
|
||||||
|
mAuxReal : Real;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_1M_30S : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Qualifier (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Balaiage"."Qualifier" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Balaiage" AND "gBlenderProdMode" AND "gBlenderRinseMode" AND "Blender_Variables_Pers"."gCarboStillRecipe" AND "gIN_VoltageOk";
|
||||||
|
|
||||||
|
// Network 2: Request (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 29
|
||||||
|
"mBaialageReqONS" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq" OR "Procedure_Variables"."Blender_Run"."Request"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq" OR "Procedure_Variables"."Blender_Run"."Request") - Mem: "mBaialageReqONS"
|
||||||
|
|
||||||
|
"Procedure_Variables"."Balaiage"."Request" := ("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq" AND NOT "mBaialageReqONS") OR ("Procedure_Variables"."Blender_Run"."Request" AND NOT "mBaialageReqONS");
|
||||||
|
"mBaialageReqONS" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq" OR "Procedure_Variables"."Blender_Run"."Request"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq" OR "Procedure_Variables"."Blender_Run"."Request") - Mem: "mBaialageReqONS"
|
||||||
|
|
||||||
|
// Network 3: Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Balaiage"."Reset" := "Procedure_Variables"."Balaiage"."Qualifier" OR ("Procedure_Variables"."Balaiage"."Latch" AND "gEmergencyPressed");
|
||||||
|
|
||||||
|
// Network 4: Done Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Balaiage"."Reset" THEN
|
||||||
|
"Procedure_Variables"."Balaiage"."Done" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 5: Request (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 28
|
||||||
|
"mBaialage_Request" := "Procedure_Variables"."Balaiage"."Reset" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq"; // P_TRIG("Procedure_Variables"."Balaiage"."Reset" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq") - Mem: "mBaialage_Request"
|
||||||
|
|
||||||
|
"mBalaiage_Req" := "Procedure_Variables"."Balaiage"."Reset" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq" AND NOT "mBaialage_Request";
|
||||||
|
"mBaialage_Request" := "Procedure_Variables"."Balaiage"."Reset" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq"; // P_TRIG("Procedure_Variables"."Balaiage"."Reset" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_BaialageReq") - Mem: "mBaialage_Request"
|
||||||
|
|
||||||
|
// Network 6: Wait (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Balaiage"."Wait" := "AUX FALSE";
|
||||||
|
|
||||||
|
// Network 7: Latch (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Balaiage"."Latch" := ("Procedure_Variables"."Balaiage"."Request" AND "Procedure_Variables"."Balaiage"."Done" AND "Procedure_Variables"."Balaiage"."Reset" AND "FirstScan") OR ("Procedure_Variables"."Balaiage"."Done" AND "Procedure_Variables"."Balaiage"."Reset" AND "mBalaiage_Req" AND "FirstScan");
|
||||||
|
|
||||||
|
// Network 8: Latch ONS (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 26
|
||||||
|
"M19074" := "Procedure_Variables"."Balaiage"."Latch"; // P_TRIG("Procedure_Variables"."Balaiage"."Latch") - Mem: "M19074"
|
||||||
|
|
||||||
|
"mLatchONS" := "Procedure_Variables"."Balaiage"."Latch" AND NOT "M19074";
|
||||||
|
"M19074" := "Procedure_Variables"."Balaiage"."Latch"; // P_TRIG("Procedure_Variables"."Balaiage"."Latch") - Mem: "M19074"
|
||||||
|
|
||||||
|
// Network 9: Product Tank Pressure Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Balaiage"."Running" := "Procedure_Variables"."Balaiage"."Wait" AND "Procedure_Variables"."Balaiage"."Latch";
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."BalaiageRun" := "Procedure_Variables"."Balaiage"."Latch";
|
||||||
|
|
||||||
|
// Network 10: Product Tank Pressure Running (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Balaiage"."Running" THEN
|
||||||
|
"gSP_AVM321" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Balaiage"."Running" THEN
|
||||||
|
"gSP_AVM397" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 11: PrdTankPressFault (Original Language: LAD)
|
||||||
|
|
||||||
|
"mBaialage_Fault"(IN := "Procedure_Variables"."Balaiage"."Running" AND "Procedure_Variables"."TM301_Drain"."Latch" AND "gBalaiageTankFlowOK" AND "gBlenderRinseMode", PT := S5T#1M_30S); // TODO: Declarar "mBaialage_Fault" : TON;
|
||||||
|
|
||||||
|
"gBalaiage_Fault" := "mBaialage_Fault".Q;
|
||||||
|
|
||||||
|
// Network 12: Aux (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBalaiage_MaxFlow" THEN
|
||||||
|
"mAuxReal" := "Filler_Head_Variables"."Filler_Speed" * "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_BottleSize";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBalaiage_MaxFlow" THEN
|
||||||
|
"mAuxReal" := "mAuxReal" * 0.000999;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBalaiage_MaxFlow" THEN
|
||||||
|
"mAuxReal" := "mAuxReal" * 1.1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Instrument"."FTM305"."PVFiltered" >= 5.0 THEN
|
||||||
|
"mAuxReal" := "HMI_Instrument"."FTM305"."PVFiltered";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 13: Tank Flow Ok (Original Language: LAD)
|
||||||
|
// PrdTankPressError = Press_SP - Press_PV
|
||||||
|
|
||||||
|
"Blender_Variables"."gBalaiageFlowError" := "mAuxReal" - "HMI_Instrument"."FTM305"."PVFiltered";
|
||||||
|
|
||||||
|
// Network 14: CO2MainValveDelay (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 14 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 15: Done (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"mBalaiageDoneONS" := "gBlenderCIPMode"; // P_TRIG("gBlenderCIPMode") - Mem: "mBalaiageDoneONS"
|
||||||
|
|
||||||
|
"Procedure_Variables"."Balaiage"."Done" := "Procedure_Variables"."Balaiage"."Done" OR ("gBlenderCIPMode" AND NOT "mBalaiageDoneONS");
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,468 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Name (Original): BlendFill StartUp_Seq
|
||||||
|
// Block Number: 1814
|
||||||
|
// Original Network Languages: STL, LAD
|
||||||
|
|
||||||
|
FUNCTION "BlendFill_StartUp_Seq" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_INOUT
|
||||||
|
mStep : Int;
|
||||||
|
mTimer : Int;
|
||||||
|
mTransition : Bool;
|
||||||
|
mFillerProdLoadedInit : Real;
|
||||||
|
mFillerProdLoading : Real;
|
||||||
|
mFillerLoadAgain : Bool;
|
||||||
|
mFillerLoadAfterDrain : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mAuxCalc : Real;
|
||||||
|
mTimeSP : Int;
|
||||||
|
mLoad1_End : Bool;
|
||||||
|
mNextStep : Int;
|
||||||
|
__PlcmigTempFillBits_10B0 : Array[0..7] of Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: STEP CONTROL (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
L "mStep"
|
||||||
|
JL LEND
|
||||||
|
JU ST00
|
||||||
|
JU ST01
|
||||||
|
JU ST02
|
||||||
|
JU ST03
|
||||||
|
JU ST04
|
||||||
|
JU ST05
|
||||||
|
JU ST06
|
||||||
|
JU ST07
|
||||||
|
LEND: JU FULL
|
||||||
|
FULL: L 0
|
||||||
|
T "mStep"
|
||||||
|
JU END
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
// Network 2: STEP 00 (Original Language: LAD)
|
||||||
|
// Step 0: Wait Buffer Tank Pressurization
|
||||||
|
// With QCO The Filler use an indipendent CO2 valve then the step has been
|
||||||
|
// bypassed
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" THEN
|
||||||
|
"mNextStep" := 4;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" THEN
|
||||||
|
"mTimeSP" := 0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" THEN
|
||||||
|
"mNextStep" := 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" THEN
|
||||||
|
"mTimeSP" := 6;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 3: End Blend Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."EnBlend" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 4: STEP 00 (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 4 ---
|
||||||
|
|
||||||
|
A_BRACK
|
||||||
|
A "gEqPressOk"
|
||||||
|
A "gEqPressSelected"
|
||||||
|
O
|
||||||
|
A "gBlenderTankPress_Ok"
|
||||||
|
AN "gEqPressSelected"
|
||||||
|
ON "gBlendFiStillWaterByPass"
|
||||||
|
O "HMI_Blender_Parameters".Processor_Options.Blender_OPT._FastChangeOverEnabled
|
||||||
|
BRACKET
|
||||||
|
= "__PlcmigTempFillBits_10B0"[0]
|
||||||
|
BLD 103
|
||||||
|
A_BRACK
|
||||||
|
O "gIN_LinePressCO2Ok"
|
||||||
|
O "HMI_Blender_Parameters".Processor_Options.Blender_OPT._FastChangeOverEnabled
|
||||||
|
BRACKET
|
||||||
|
= "__PlcmigTempFillBits_10B0"[1]
|
||||||
|
BLD 103
|
||||||
|
A "Procedure_Variables".BlendFill_StartUp.Wait
|
||||||
|
= "__PlcmigTempFillBits_10B0"[2]
|
||||||
|
BLD 103
|
||||||
|
A CLK_0.5S
|
||||||
|
= "__PlcmigTempFillBits_10B0"[3]
|
||||||
|
BLD 103
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 4 ---
|
||||||
|
|
||||||
|
// Network 5: STEP 01 (Original Language: LAD)
|
||||||
|
// Step 1: Wait from Filler Enable TO Open EV46 - CO2 Valve -
|
||||||
|
// With QCO The Filler use an indipendent CO2 valve then the step has been
|
||||||
|
// bypassed
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."EnBlend" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 6: STEP 01 (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 6 ---
|
||||||
|
|
||||||
|
A "gIN_Filler_AVM346_En"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[0]
|
||||||
|
BLD 103
|
||||||
|
A "AUX TRUE"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[1]
|
||||||
|
BLD 103
|
||||||
|
A "Procedure_Variables".BlendFill_StartUp.Wait
|
||||||
|
= "__PlcmigTempFillBits_10B0"[2]
|
||||||
|
BLD 103
|
||||||
|
A CLK_0.5S
|
||||||
|
= "__PlcmigTempFillBits_10B0"[3]
|
||||||
|
BLD 103
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 6 ---
|
||||||
|
|
||||||
|
// Network 7: STEP 02 (Original Language: LAD)
|
||||||
|
// Step 2: Filler Pipe Flushing
|
||||||
|
// With QCO The Filler use an indipendent CO2 valve then the step has been
|
||||||
|
// bypassed
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."EnBlend" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 8: MIX - Procedure auxiliary variable (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gIN_Filler_AVM346_En" THEN
|
||||||
|
"gSP_AVM346" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 9: STEP 02 (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 9 ---
|
||||||
|
|
||||||
|
A "gIN_FillerEndFlushing"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[0]
|
||||||
|
BLD 103
|
||||||
|
A "AUX TRUE"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[1]
|
||||||
|
BLD 103
|
||||||
|
A "Procedure_Variables".BlendFill_StartUp.Wait
|
||||||
|
= "__PlcmigTempFillBits_10B0"[2]
|
||||||
|
BLD 103
|
||||||
|
A CLK_0.5S
|
||||||
|
= "__PlcmigTempFillBits_10B0"[3]
|
||||||
|
BLD 103
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 9 ---
|
||||||
|
|
||||||
|
// Network 10: STEP 03 (Original Language: LAD)
|
||||||
|
// Step 3: BlendFill Pressurization AT Equilibrium Pressure
|
||||||
|
// With QCO The Filler use an indipendent CO2 valve then the step has been
|
||||||
|
// bypassed
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."EnBlend" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 11: STEP 03 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gIN_Filler_AVM346_En" THEN
|
||||||
|
"gSP_AVM346" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 12: STEP 03 (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 12 ---
|
||||||
|
|
||||||
|
A_BRACK
|
||||||
|
A "gEqPressOk"
|
||||||
|
A "gEqPressSelected"
|
||||||
|
O
|
||||||
|
A "gBlenderTankPress_Ok"
|
||||||
|
AN "gEqPressSelected"
|
||||||
|
ON "gBlendFiStillWaterByPass"
|
||||||
|
BRACKET
|
||||||
|
= "__PlcmigTempFillBits_10B0"[0]
|
||||||
|
BLD 103
|
||||||
|
A "AUX TRUE"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[1]
|
||||||
|
BLD 103
|
||||||
|
A "Procedure_Variables".BlendFill_StartUp.Wait
|
||||||
|
= "__PlcmigTempFillBits_10B0"[2]
|
||||||
|
BLD 103
|
||||||
|
A CLK_0.5S
|
||||||
|
= "__PlcmigTempFillBits_10B0"[3]
|
||||||
|
BLD 103
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 12 ---
|
||||||
|
|
||||||
|
// Network 13: STEP 04 (Original Language: LAD)
|
||||||
|
// Step 4: Wait First Production Completed - OLD -
|
||||||
|
// NEW : Wait Product Tank Stop Level
|
||||||
|
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."EnBlend" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled";
|
||||||
|
|
||||||
|
// Network 14: STEP 04 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gIN_Filler_AVM346_En" THEN
|
||||||
|
"gSP_AVM346" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 15: STEP 03 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gPrdTank_Empty" THEN
|
||||||
|
"gSP_AVM313" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gPrdTank_Empty" AND "Procedure_Variables"."BlendFill_StartUp"."Wait" THEN
|
||||||
|
"Filler_Head_Variables"."Head_PID_Manual_Value" := "HMI_Blender_Parameters"."ProcessSetup"."_StartUpPPM303Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" AND "gWaitLevToHold_TankPress" AND "gPrdTank_Empty" AND "Procedure_Variables"."BlendFill_StartUp"."Wait") OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" AND "gBlenderLevelTarget" AND "gPrdTank_Empty" AND "Procedure_Variables"."BlendFill_StartUp"."Wait" AND "gBlenderStopLevel") OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" AND "gBlenderLevelTarget" AND "gPrdTank_Empty" AND "Procedure_Variables"."BlendFill_StartUp"."Wait" AND "Procedure_Variables"."First_Production"."Latch") OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" AND "gPrdTank_Empty" AND "Procedure_Variables"."BlendFill_StartUp"."Wait" AND "gBlenderStopLevel" AND "Procedure_Variables"."First_Production"."Done") OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" AND "gPrdTank_Empty" AND "Procedure_Variables"."BlendFill_StartUp"."Wait" AND "Procedure_Variables"."First_Production"."Latch" AND "Procedure_Variables"."First_Production"."Done") THEN
|
||||||
|
"gSP_PID_Head_Manual" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 16: STEP 04 (Original Language: LAD)
|
||||||
|
|
||||||
|
"mFillerProdLoadedInit" := "System_RunOut_Variables"."TankProductAvailable";
|
||||||
|
|
||||||
|
// Network 17: STEP 04 (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 17 ---
|
||||||
|
|
||||||
|
A "AUX TRUE"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[0]
|
||||||
|
BLD 103
|
||||||
|
A_BRACK
|
||||||
|
A_BRACK
|
||||||
|
A "gBlenderStopLevel"
|
||||||
|
A "Procedure_Variables".First_Production.Latch
|
||||||
|
O
|
||||||
|
A "Procedure_Variables".First_Production.Done
|
||||||
|
A "gBlenderLevelTarget"
|
||||||
|
BRACKET
|
||||||
|
AN "HMI_Blender_Parameters".Processor_Options.Blender_OPT._FastChangeOverEnabled
|
||||||
|
O
|
||||||
|
A "gWaitLevToHold_TankPress"
|
||||||
|
A "gIN_Filler_AVM362_En"
|
||||||
|
BRACKET
|
||||||
|
= "__PlcmigTempFillBits_10B0"[1]
|
||||||
|
BLD 103
|
||||||
|
A "Procedure_Variables".BlendFill_StartUp.Wait
|
||||||
|
= "__PlcmigTempFillBits_10B0"[2]
|
||||||
|
BLD 103
|
||||||
|
A CLK_0.5S
|
||||||
|
= "__PlcmigTempFillBits_10B0"[3]
|
||||||
|
BLD 103
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 17 ---
|
||||||
|
|
||||||
|
// Network 18: STEP 05 (Original Language: LAD)
|
||||||
|
// Step 5: Start TO Load Product TO Filler without P3
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"gSP_FillerProdLoad" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "mFillerLoadAfterDrain" AND "AUX FALSE" THEN
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."EnBlend" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 19: STEP 05 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gIN_Filler_AVM346_En" THEN
|
||||||
|
"gSP_AVM346" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 20: STEP 05 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gIN_Filler_AVM362_En" THEN
|
||||||
|
"gSP_AVM362" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 21: STEP 05 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" OR NOT "mFillerLoadAfterDrain" OR NOT "mFillerLoadAgain" THEN
|
||||||
|
"mAuxCalc" := "HMI_Blender_Parameters"."ProcessSetup"."_FillerProdPipeMass" * 1.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" AND "mFillerLoadAfterDrain" AND "mFillerLoadAgain" THEN
|
||||||
|
"mAuxCalc" := 1.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 22: STEP 05 (Original Language: LAD)
|
||||||
|
|
||||||
|
"mFillerProdLoading" := "mFillerProdLoadedInit" - "System_RunOut_Variables"."TankProductAvailable";
|
||||||
|
|
||||||
|
// Network 23: STEP 05 (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 23 ---
|
||||||
|
|
||||||
|
A_BRACK
|
||||||
|
O "gWorkshopTest"
|
||||||
|
O "HMI_Device".AVM346.Out
|
||||||
|
BRACKET
|
||||||
|
A_BRACK
|
||||||
|
A "HMI_Device".AVM362.Out
|
||||||
|
O
|
||||||
|
A "HMI_Device".AVM363.Out
|
||||||
|
BRACKET
|
||||||
|
= "__PlcmigTempFillBits_10B0"[0]
|
||||||
|
BLD 103
|
||||||
|
A_BRACK
|
||||||
|
A_BRACK
|
||||||
|
ON "HMI_Blender_Parameters".Processor_Options.Blender_OPT._FastChangeOverEnabled
|
||||||
|
O "mFillerLoadAfterDrain"
|
||||||
|
BRACKET
|
||||||
|
A_BRACK
|
||||||
|
L "mFillerProdLoading"
|
||||||
|
L "mAuxCalc"
|
||||||
|
GT_R
|
||||||
|
BRACKET
|
||||||
|
O
|
||||||
|
AN "mFillerLoadAfterDrain"
|
||||||
|
A "gBlenderLevelTarget"
|
||||||
|
O "gIN_FillerEndTankFilling"
|
||||||
|
O "mFillerFirstLoadTimeOut"
|
||||||
|
BRACKET
|
||||||
|
A "gBlenderTankPress_Ok"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[1]
|
||||||
|
BLD 103
|
||||||
|
A "Procedure_Variables".BlendFill_StartUp.Wait
|
||||||
|
= "__PlcmigTempFillBits_10B0"[2]
|
||||||
|
BLD 103
|
||||||
|
A CLK_0.5S
|
||||||
|
= "__PlcmigTempFillBits_10B0"[3]
|
||||||
|
BLD 103
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 23 ---
|
||||||
|
|
||||||
|
// Network 24: STEP 06 (Original Language: LAD)
|
||||||
|
// Step 6: LOAD 2 with PPM303 Pump in regulation 2/3 m, wait End
|
||||||
|
// Tank Filling from Filler
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"gSP_FillerProdLoad" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"Interlocking_Variables"."MIXER_FILLER_SEND"."PROD_Prod_Load_2" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."EnBlend" := "AUX FALSE" AND "Procedure_Variables"."First_Production"."Done";
|
||||||
|
|
||||||
|
IF "AUX FALSE" AND "Procedure_Variables"."BlendFill_StartUp"."Wait" THEN
|
||||||
|
"Filler_Head_Variables"."Head_PID_Manual_Value" := "HMI_PID"."PPM303"."FfOut";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" AND "Procedure_Variables"."BlendFill_StartUp"."Wait" THEN
|
||||||
|
"gSP_PID_Head_Manual" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 25: STEP 06 (Original Language: LAD)
|
||||||
|
// mPPM303RampSlewMax = mPPM303RampEndFreq / (Time to end ramp in sec)
|
||||||
|
|
||||||
|
"mPPM303RampSlewMax" := "HMI_PID"."PPM303"."FfOut" / 10.0;
|
||||||
|
|
||||||
|
// Network 26: STEP 06 (Original Language: LAD)
|
||||||
|
|
||||||
|
"mPPM303StartUpRamp"(i_Cycle := "Time_50ms", i_InValue := "HMI_PID"."PPM303"."FfOut", i_SlewMax := "mPPM303RampSlewMax", out := "Filler_Head_Variables"."Head_PID_Manual_Value");
|
||||||
|
|
||||||
|
// Network 27: STEP 06 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gIN_Filler_AVM346_En" THEN
|
||||||
|
"gSP_AVM346" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 28: STEP 06 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gIN_Filler_AVM362_En" THEN
|
||||||
|
"gSP_AVM362" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 29: STEP 06 (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 29 ---
|
||||||
|
|
||||||
|
A "gIN_FillerEndTankFilling"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[0]
|
||||||
|
BLD 103
|
||||||
|
A "AUX TRUE"
|
||||||
|
= "__PlcmigTempFillBits_10B0"[1]
|
||||||
|
BLD 103
|
||||||
|
A "Procedure_Variables".BlendFill_StartUp.Wait
|
||||||
|
= "__PlcmigTempFillBits_10B0"[2]
|
||||||
|
BLD 103
|
||||||
|
A CLK_0.5S
|
||||||
|
= "__PlcmigTempFillBits_10B0"[3]
|
||||||
|
BLD 103
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 29 ---
|
||||||
|
|
||||||
|
// Network 30: STEP 07 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"mFillerLoadAgain" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"mFillerLoadAfterDrain" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."EnBlend" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"Interlocking_Variables"."MIXER_FILLER_SEND"."PROD_Prod_Load_2" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"Procedure_Variables"."BlendFill_StartUp"."Done" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 31: SEQUENCER END (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 31 ---
|
||||||
|
|
||||||
|
END: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 31 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,75 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Name (Original): BlenderCtrl_All Auto
|
||||||
|
// Block Number: 2036
|
||||||
|
// Original Network Languages: STL
|
||||||
|
|
||||||
|
FUNCTION "BlenderCtrl_All_Auto" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
Dim_HMI_Device : Int;
|
||||||
|
PDim_HMI_Device : DWord;
|
||||||
|
Dim_HMI_PID : Int;
|
||||||
|
PDim_HMI_PID : DWord;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Devices (Original Language: STL)
|
||||||
|
// DEVICE
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
AUF "HMI_Device"
|
||||||
|
L_DBLG
|
||||||
|
T "Dim_HMI_Device"
|
||||||
|
L P#0.0
|
||||||
|
L "Dim_HMI_Device"
|
||||||
|
SLD 3
|
||||||
|
ADD_D
|
||||||
|
T "PDim_HMI_Device"
|
||||||
|
L P#0.0
|
||||||
|
LAR1_ACCU1
|
||||||
|
M100: SET
|
||||||
|
S DBX[AR1,P#0.0]
|
||||||
|
R DBX[AR1,P#0.1]
|
||||||
|
ADDAR1 P#2.0
|
||||||
|
TAR1_ACCU1
|
||||||
|
L "PDim_HMI_Device"
|
||||||
|
LT_D
|
||||||
|
JC M100
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
// Network 2: PID (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 2 ---
|
||||||
|
|
||||||
|
AUF "HMI_PID"
|
||||||
|
L_DBLG
|
||||||
|
T "Dim_HMI_PID"
|
||||||
|
L P#0.0
|
||||||
|
L "Dim_HMI_PID"
|
||||||
|
SLD 3
|
||||||
|
ADD_D
|
||||||
|
T "PDim_HMI_PID"
|
||||||
|
L P#0.0
|
||||||
|
LAR1_ACCU1
|
||||||
|
M101: SET
|
||||||
|
R DBX[AR1,P#2.0]
|
||||||
|
R DBX[AR1,P#3.0]
|
||||||
|
L 0.0
|
||||||
|
T DBD[AR1,P#28.0]
|
||||||
|
ADDAR1 P#76.0
|
||||||
|
TAR1_ACCU1
|
||||||
|
L "PDim_HMI_PID"
|
||||||
|
LT_D
|
||||||
|
JC M101
|
||||||
|
|
||||||
|
// --- END STL Network 2 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,18 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2013
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderCtrl_CIPModeInit" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: PID Integral Value Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderPID_PIDResInteg();
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,88 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2037
|
||||||
|
// Original Network Languages: STL
|
||||||
|
|
||||||
|
FUNCTION "BlenderCtrl_ManualActive" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
Dim_HMI_Device : Int;
|
||||||
|
PDim_HMI_Device : DWord;
|
||||||
|
Dim_HMI_PID : Int;
|
||||||
|
PDim_HMI_PID : DWord;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Set manual active (Original Language: STL)
|
||||||
|
// DEVICE
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
SET
|
||||||
|
R "HMI_Alarms".gH_Message[3]
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
// Network 2: (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 2 ---
|
||||||
|
|
||||||
|
AUF "HMI_Device"
|
||||||
|
L_DBLG
|
||||||
|
T "Dim_HMI_Device"
|
||||||
|
L P#0.0
|
||||||
|
L "Dim_HMI_Device"
|
||||||
|
SLD 3
|
||||||
|
ADD_D
|
||||||
|
T "PDim_HMI_Device"
|
||||||
|
L P#0.0
|
||||||
|
LAR1_ACCU1
|
||||||
|
M100: NOP_0
|
||||||
|
AUF "HMI_Device"
|
||||||
|
A DBX[AR1,P#0.7]
|
||||||
|
AN DBX[AR1,P#0.0]
|
||||||
|
S "HMI_Alarms".gH_Message[3]
|
||||||
|
ADDAR1 P#2.0
|
||||||
|
TAR1_ACCU1
|
||||||
|
L "PDim_HMI_Device"
|
||||||
|
LT_D
|
||||||
|
JC M100
|
||||||
|
|
||||||
|
// --- END STL Network 2 ---
|
||||||
|
|
||||||
|
// Network 3: (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 3 ---
|
||||||
|
|
||||||
|
AUF "HMI_PID"
|
||||||
|
L_DBLG
|
||||||
|
T "Dim_HMI_PID"
|
||||||
|
L P#0.0
|
||||||
|
L "Dim_HMI_PID"
|
||||||
|
SLD 3
|
||||||
|
ADD_D
|
||||||
|
T "PDim_HMI_PID"
|
||||||
|
L P#0.0
|
||||||
|
LAR1_ACCU1
|
||||||
|
M101: NOP_0
|
||||||
|
AUF "HMI_PID"
|
||||||
|
A DBX[AR1,P#0.7]
|
||||||
|
A_BRACK
|
||||||
|
A DBX[AR1,P#2.0]
|
||||||
|
O DBX[AR1,P#3.0]
|
||||||
|
BRACKET
|
||||||
|
S "HMI_Alarms".gH_Message[3]
|
||||||
|
ADDAR1 P#76.0
|
||||||
|
TAR1_ACCU1
|
||||||
|
L "PDim_HMI_PID"
|
||||||
|
LT_D
|
||||||
|
JC M101
|
||||||
|
|
||||||
|
// --- END STL Network 3 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,26 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2012
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderCtrl_ProdModeInit" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: PID Reset Integral (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderPID_PIDResInteg();
|
||||||
|
|
||||||
|
// Network 2: Ctrl Init Errors (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderCtrl_InitErrors();
|
||||||
|
|
||||||
|
// Network 3: RunOut Counter (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Analog_Values"."TP301RunOutCount" := 0.0;
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,149 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2014
|
||||||
|
// Original Network Languages: STL
|
||||||
|
// Block Comment:
|
||||||
|
// TASK2
|
||||||
|
|
||||||
|
FUNCTION "BlenderCtrl_ResetSPWord" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: MIX - Procedure auxiliary variable (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_RVN301"
|
||||||
|
= "gSP_RVN302"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_RVN301_1"
|
||||||
|
= "gSP_RVN302_1"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_RVP303"
|
||||||
|
= "gSP_EV04"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_AVM311"
|
||||||
|
= "gSP_AVM312"
|
||||||
|
= "gSP_AVM313"
|
||||||
|
= "gSP_AVM315"
|
||||||
|
= "gSP_AVM317"
|
||||||
|
= "gSP_AVM317_1"
|
||||||
|
= "gSP_AVM321"
|
||||||
|
= "gSP_AVM322"
|
||||||
|
= "gSP_AVM323"
|
||||||
|
= "gSP_AVM326"
|
||||||
|
= "gSP_AVM327"
|
||||||
|
= "gSP_AVM328"
|
||||||
|
= "gSP_AVM329"
|
||||||
|
= "gSP_AVM330"
|
||||||
|
= "gSP_AVM339"
|
||||||
|
= "gSP_AVM340"
|
||||||
|
= "gSP_AVM341"
|
||||||
|
= "gSP_AVM342"
|
||||||
|
= "gSP_AVM345"
|
||||||
|
= "gSP_AVM346"
|
||||||
|
= "gSP_AVM362"
|
||||||
|
= "gSP_AVM363"
|
||||||
|
= "gSP_AVM366"
|
||||||
|
= "gSP_AVM367"
|
||||||
|
= "gSP_AVM368"
|
||||||
|
= "gSP_AVM369"
|
||||||
|
= "gSP_AVM353"
|
||||||
|
= "gSP_AVM371"
|
||||||
|
= "gSP_AVM372"
|
||||||
|
= "gSP_AVM380"
|
||||||
|
= "gSP_AVM381"
|
||||||
|
= "gSP_AVM385"
|
||||||
|
= "gSP_AVM386"
|
||||||
|
= "gSP_AVM388"
|
||||||
|
= "gSP_AVM389"
|
||||||
|
= "gSP_AVM391"
|
||||||
|
= "gSP_AVM396"
|
||||||
|
= "gSP_AVM397"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_AVN314"
|
||||||
|
= "gSP_AVN318"
|
||||||
|
= "gSP_AVN325"
|
||||||
|
= "gSP_AVN327"
|
||||||
|
= "gSP_AVN328"
|
||||||
|
= "gSP_AVN329"
|
||||||
|
= "gSP_AVN340"
|
||||||
|
= "gSP_AVN348"
|
||||||
|
= "gSP_AVN349"
|
||||||
|
= "gSP_AVN373"
|
||||||
|
= "gSP_AVN374"
|
||||||
|
= "gSP_AVN377"
|
||||||
|
= "gSP_AVN378"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_AVP316"
|
||||||
|
= "gSP_AVP316_1"
|
||||||
|
= "gSP_AVP324"
|
||||||
|
= "gSP_AVP344"
|
||||||
|
= "gSP_AVP361"
|
||||||
|
= "gSP_AVP363"
|
||||||
|
= "gSP_AVP364"
|
||||||
|
= "gSP_AVP365"
|
||||||
|
= "gSP_AVP389"
|
||||||
|
= "gSP_AVP390"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_AVS331"
|
||||||
|
= "gSP_AVS332"
|
||||||
|
= "gSP_AVS333"
|
||||||
|
= "gSP_AVS334"
|
||||||
|
= "gSP_AVS335"
|
||||||
|
= "gSP_AVS336"
|
||||||
|
= "gSP_AVS337"
|
||||||
|
= "gSP_AVS338"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_EV52"
|
||||||
|
= "gSP_EV53"
|
||||||
|
= "gSP_EV54"
|
||||||
|
= "gSP_AVM353"
|
||||||
|
= "gSP_EV56"
|
||||||
|
= "gSP_EV57"
|
||||||
|
= "gSP_EV58"
|
||||||
|
= "gSP_EV75"
|
||||||
|
= "gSP_EV76"
|
||||||
|
= "gSP_EV77"
|
||||||
|
= "gSP_EV78"
|
||||||
|
= "gSP_EV79"
|
||||||
|
= "gSP_EV83"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_PPN301"
|
||||||
|
= "gSP_PPP302"
|
||||||
|
= "gSP_PPM303"
|
||||||
|
= "gSP_PPN304"
|
||||||
|
= "gSP_PPN305"
|
||||||
|
= "gSP_SyrRoomPump"
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "gSP_BldTankPress_En"
|
||||||
|
= "gSP_CarboPipe_En"
|
||||||
|
= "gSP_LimitCO2PressValve"
|
||||||
|
= "gSP_CIP_Temp_En"
|
||||||
|
= "gSP_CIP_CO2_Inj"
|
||||||
|
= "gSP_CIPRunning"
|
||||||
|
= "gSP_CIPDrainRequest"
|
||||||
|
= "gSP_CIPHotPhase"
|
||||||
|
= "gSP_CIPChangeSanitize"
|
||||||
|
= "gSP_PID_Head_Manual"
|
||||||
|
= "gSP_PID_Head_Enable"
|
||||||
|
= "gSP_FillerProdLoad"
|
||||||
|
= "gSP_FillerProdSend"
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,245 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2034
|
||||||
|
// Original Network Languages: STL
|
||||||
|
|
||||||
|
FUNCTION "BlenderCtrl_UpdatePWord" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: MIX - Procedure auxiliary variable (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
A "gSP_RVN301"
|
||||||
|
= "gP_RVN301"
|
||||||
|
A "gSP_RVN302"
|
||||||
|
= "gP_RVN302"
|
||||||
|
|
||||||
|
A "gSP_RVN301_1"
|
||||||
|
= "gP_RVN301_1"
|
||||||
|
A "gSP_RVN302_1"
|
||||||
|
= "gP_RVN302_1"
|
||||||
|
|
||||||
|
A "gSP_RVP303"
|
||||||
|
= "gP_RVP303"
|
||||||
|
A "gSP_EV04"
|
||||||
|
= "gP_EV04"
|
||||||
|
|
||||||
|
A "gSP_AVM311"
|
||||||
|
= "gP_AVM311"
|
||||||
|
A "gSP_AVM312"
|
||||||
|
= "gP_AVM312"
|
||||||
|
A "gSP_AVM313"
|
||||||
|
= "gP_AVM313"
|
||||||
|
A "gSP_AVM315"
|
||||||
|
= "gP_AVM315"
|
||||||
|
A "gSP_AVM317"
|
||||||
|
= "gP_AVM317"
|
||||||
|
A "gSP_AVM317_1"
|
||||||
|
= "gP_AVM317_1"
|
||||||
|
A "gSP_AVM321"
|
||||||
|
= "gP_AVM321"
|
||||||
|
A "gSP_AVM322"
|
||||||
|
= "gP_AVM322"
|
||||||
|
A "gSP_AVM323"
|
||||||
|
= "gP_AVM323"
|
||||||
|
A "gSP_AVM326"
|
||||||
|
= "gP_AVM326"
|
||||||
|
A "gSP_AVM327"
|
||||||
|
= "gP_AVM327"
|
||||||
|
A "gSP_AVM328"
|
||||||
|
= "gP_AVM328"
|
||||||
|
A "gSP_AVM329"
|
||||||
|
= "gP_AVM329"
|
||||||
|
|
||||||
|
A "gSP_AVM330"
|
||||||
|
= "gP_AVM330"
|
||||||
|
A "gSP_AVM339"
|
||||||
|
= "gP_AVM339"
|
||||||
|
A "gSP_AVM340"
|
||||||
|
= "gP_AVM340"
|
||||||
|
A "gSP_AVM341"
|
||||||
|
= "gP_AVM341"
|
||||||
|
A "gSP_AVM342"
|
||||||
|
= "gP_AVM342"
|
||||||
|
A "gSP_AVM345"
|
||||||
|
= "gP_AVM345"
|
||||||
|
A "gSP_AVM346"
|
||||||
|
= "gP_AVM346"
|
||||||
|
A "gSP_AVM362"
|
||||||
|
= "gP_AVM362"
|
||||||
|
A "gSP_AVM363"
|
||||||
|
= "gP_AVM363"
|
||||||
|
A "gSP_AVM366"
|
||||||
|
= "gP_AVM366"
|
||||||
|
A "gSP_AVM367"
|
||||||
|
= "gP_AVM367"
|
||||||
|
A "gSP_AVM368"
|
||||||
|
= "gP_AVM368"
|
||||||
|
A "gSP_AVM369"
|
||||||
|
= "gP_AVM369"
|
||||||
|
A "gSP_AVM371"
|
||||||
|
= "gP_AVM371"
|
||||||
|
A "gSP_AVM372"
|
||||||
|
= "gP_AVM372"
|
||||||
|
A "gSP_AVM380"
|
||||||
|
= "gP_AVM380"
|
||||||
|
A "gSP_AVM381"
|
||||||
|
= "gP_AVM381"
|
||||||
|
A "gSP_AVM385"
|
||||||
|
= "gP_AVM385"
|
||||||
|
A "gSP_AVM386"
|
||||||
|
= "gP_AVM386"
|
||||||
|
A "gSP_AVM388"
|
||||||
|
= "gP_AVM388"
|
||||||
|
A "gSP_AVM389"
|
||||||
|
= "gP_AVM389"
|
||||||
|
A "gSP_AVM391"
|
||||||
|
= "gP_AVM391"
|
||||||
|
A "gSP_AVM396"
|
||||||
|
= "gP_AVM396"
|
||||||
|
A "gSP_AVM397"
|
||||||
|
= "gP_AVM397"
|
||||||
|
|
||||||
|
A "gSP_AVN314"
|
||||||
|
= "gP_AVN314"
|
||||||
|
A "gSP_AVN318"
|
||||||
|
= "gP_AVN318"
|
||||||
|
A "gSP_AVN325"
|
||||||
|
= "gP_AVN325"
|
||||||
|
A "gSP_AVN327"
|
||||||
|
= "gP_AVN327"
|
||||||
|
A "gSP_AVN328"
|
||||||
|
= "gP_AVN328"
|
||||||
|
A "gSP_AVN329"
|
||||||
|
= "gP_AVN329"
|
||||||
|
A "gSP_AVN339"
|
||||||
|
= "gP_AVN339"
|
||||||
|
A "gSP_AVN340"
|
||||||
|
= "gP_AVN340"
|
||||||
|
A "gSP_AVN348"
|
||||||
|
= "gP_AVN348"
|
||||||
|
A "gSP_AVN349"
|
||||||
|
= "gP_AVN349"
|
||||||
|
A "gSP_AVN373"
|
||||||
|
= "gP_AVN373"
|
||||||
|
A "gSP_AVN374"
|
||||||
|
= "gP_AVN374"
|
||||||
|
A "gSP_AVN377"
|
||||||
|
= "gP_AVN377"
|
||||||
|
A "gSP_AVN378"
|
||||||
|
= "gP_AVN378"
|
||||||
|
|
||||||
|
A "gSP_AVP316"
|
||||||
|
= "gP_AVP316"
|
||||||
|
A "gSP_AVP316_1"
|
||||||
|
= "gP_AVP316_1"
|
||||||
|
A "gSP_AVP324"
|
||||||
|
= "gP_AVP324"
|
||||||
|
A "gSP_AVP344"
|
||||||
|
= "gP_AVP344"
|
||||||
|
A "gSP_AVP361"
|
||||||
|
= "gP_AVP361"
|
||||||
|
A "gSP_AVP363"
|
||||||
|
= "gP_AVP363"
|
||||||
|
A "gSP_AVP364"
|
||||||
|
= "gP_AVP364"
|
||||||
|
A "gSP_AVP365"
|
||||||
|
= "gP_AVP365"
|
||||||
|
|
||||||
|
A "gSP_AVS331"
|
||||||
|
= "gP_AVS331"
|
||||||
|
A "gSP_AVS332"
|
||||||
|
= "gP_AVS332"
|
||||||
|
A "gSP_AVS333"
|
||||||
|
= "gP_AVS333"
|
||||||
|
A "gSP_AVS334"
|
||||||
|
= "gP_AVS334"
|
||||||
|
A "gSP_AVS335"
|
||||||
|
= "gP_AVS335"
|
||||||
|
A "gSP_AVS336"
|
||||||
|
= "gP_AVS336"
|
||||||
|
A "gSP_AVS337"
|
||||||
|
= "gP_AVS337"
|
||||||
|
A "gSP_AVS338"
|
||||||
|
= "gP_AVS338"
|
||||||
|
|
||||||
|
A "gSP_EV52"
|
||||||
|
= "gP_EV52"
|
||||||
|
A "gSP_EV53"
|
||||||
|
= "gP_EV53"
|
||||||
|
A "gSP_EV54"
|
||||||
|
= "gP_EV54"
|
||||||
|
A "gSP_AVM353"
|
||||||
|
= "gP_AVM353"
|
||||||
|
A "gSP_EV56"
|
||||||
|
= "gP_EV56"
|
||||||
|
A "gSP_EV57"
|
||||||
|
= "gP_EV57"
|
||||||
|
A "gSP_EV58"
|
||||||
|
= "gP_EV58"
|
||||||
|
A "gSP_EV75"
|
||||||
|
= "gP_EV75"
|
||||||
|
A "gSP_EV76"
|
||||||
|
= "gP_EV76"
|
||||||
|
A "gSP_EV77"
|
||||||
|
= "gP_EV77"
|
||||||
|
A "gSP_EV78"
|
||||||
|
= "gP_EV78"
|
||||||
|
A "gSP_EV79"
|
||||||
|
= "gP_EV79"
|
||||||
|
A "gSP_EV83"
|
||||||
|
= "gP_EV83"
|
||||||
|
A "gSP_AVP389"
|
||||||
|
= "gP_AVP389"
|
||||||
|
A "gSP_AVP390"
|
||||||
|
= "gP_AVP390"
|
||||||
|
|
||||||
|
A "gSP_PPN301"
|
||||||
|
= "gP_PPN301"
|
||||||
|
A "gSP_PPP302"
|
||||||
|
= "gP_PPP302"
|
||||||
|
A "gSP_PPM303"
|
||||||
|
= "gP_PPM303"
|
||||||
|
A "gSP_PPN304"
|
||||||
|
= "gP_PPN304"
|
||||||
|
A "gSP_PPN305"
|
||||||
|
= "gP_PPN305"
|
||||||
|
A "gSP_SyrRoomPump"
|
||||||
|
= "gP_SyrRoomPump"
|
||||||
|
|
||||||
|
A "gSP_BldTankPress_En"
|
||||||
|
= "gP_BldTankPress_En"
|
||||||
|
A "gSP_CarboPipe_En"
|
||||||
|
= "gP_CarboPipe_En"
|
||||||
|
A "gSP_LimitCO2PressValve"
|
||||||
|
= "gP_LimitCO2PressValve"
|
||||||
|
A "gSP_CIP_Temp_En"
|
||||||
|
= "gP_CIP_Temp_En"
|
||||||
|
A "gSP_CIP_CO2_Inj"
|
||||||
|
= "gP_CIP_CO2_Inj"
|
||||||
|
A "gSP_CIPRunning"
|
||||||
|
= "gP_CIPRunning"
|
||||||
|
A "gSP_CIPDrainRequest"
|
||||||
|
= "gP_CIPDrainRequest"
|
||||||
|
A "gSP_CIPHotPhase"
|
||||||
|
= "gP_CIPHotPhase"
|
||||||
|
A "gSP_CIPChangeSanitize"
|
||||||
|
= "gP_CIPChangeSanitize"
|
||||||
|
A "gSP_PID_Head_Manual"
|
||||||
|
= "gP_PID_Head_Manual"
|
||||||
|
A "gSP_PID_Head_Enable"
|
||||||
|
= "gP_PID_Head_Enable"
|
||||||
|
A "gSP_FillerProdLoad"
|
||||||
|
= "gP_FillerProdLoad"
|
||||||
|
A "gSP_FillerProdSend"
|
||||||
|
= "gP_FillerProdSend"
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,389 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2000
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderCtrl__Main" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
All_Auto_RETVAL : Int;
|
||||||
|
Reset_SP_Word_RETVAL : Int;
|
||||||
|
mResetWaterTot : Bool;
|
||||||
|
mResetSyrupTot : Bool;
|
||||||
|
mResetCO2Tot : Bool;
|
||||||
|
mResetProductTot : Bool;
|
||||||
|
Block_Move_Err : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_1S : Bool; // Auto-generated temporary
|
||||||
|
#_2S : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Clock Generation (Original Language: LAD)
|
||||||
|
|
||||||
|
Clock_Signal();
|
||||||
|
|
||||||
|
// Network 2: Machine Init (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderCtrl_MachineInit();
|
||||||
|
|
||||||
|
// Network 3: Filler Head (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"Block_Move_Err" := BLKMOV(SRCBLK := "HMI_PID"."PPM303", DSTBLK => "Filler_Head_Variables"."FillerHead"); // ADVERTENCIA: BLKMOV usado directamente, probablemente no compile!
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 4: Emergency Pressed (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 26
|
||||||
|
"M19000" := "gIN_VoltageOk"; // N_TRIG("gIN_VoltageOk") - Mem: "M19000"
|
||||||
|
|
||||||
|
"gEmergencyPressed" := "M19000" AND NOT "gIN_VoltageOk";
|
||||||
|
"M19000" := "gIN_VoltageOk"; // N_TRIG("gIN_VoltageOk") - Mem: "M19000"
|
||||||
|
|
||||||
|
// Network 5: Air and CO2 pressure ok and auxiliary ok (Original Language: LAD)
|
||||||
|
|
||||||
|
"gBlenderSuppliesOk" := ("gIN_VoltageOk" AND "gIN_LinePressCO2Ok" AND "HMI_Digital"."_PAL_S11"."Filtered") OR ("gIN_VoltageOk" AND "gIN_LinePressCO2Ok" AND "Disable_Bit") OR ("gIN_VoltageOk" AND "gWorkshopTest" AND "gWorkshop_Co2_Presence" AND "gWorkshop_CIP_Signals" AND "HMI_Digital"."_PAL_S11"."Filtered") OR ("gIN_VoltageOk" AND "gWorkshopTest" AND "gWorkshop_Co2_Presence" AND "gWorkshop_CIP_Signals" AND "Disable_Bit");
|
||||||
|
|
||||||
|
// Network 6: Blender State Num (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."BlenderStateNum" := 0;
|
||||||
|
|
||||||
|
// Network 7: Delay Power On (Original Language: LAD)
|
||||||
|
|
||||||
|
"mDelayPowerOnTmr"(IN := "FirstScan", PT := S5T#2S); // TODO: Declarar "mDelayPowerOnTmr" : TP;
|
||||||
|
|
||||||
|
// Network 8: Production Mode (Original Language: LAD)
|
||||||
|
|
||||||
|
"gBlenderProdMode" := "HMI_Variables_Status"."System"."Blender_Prod_CIP";
|
||||||
|
|
||||||
|
// Network 9: CIp Mode (Original Language: LAD)
|
||||||
|
|
||||||
|
"gBlenderCIPMode" := "HMI_Variables_Status"."System"."Blender_Prod_CIP";
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."System"."Blender_Prod_CIP" THEN
|
||||||
|
"HMI_Variables_Status"."Procedures"."BlenderStateNum" := 19;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 10: Error Faults (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"HMI_Variables_Status"."Meters"."QTM3012_PRD_Fault" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"gmPDS2000_Error_Fault" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"HMI_Variables_Status"."Meters"."QTM3012_PRD_Run" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
"gNoFreezeProductMeter" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 11: Filler Bottle Count Used to push Product (Original Language: LAD)
|
||||||
|
|
||||||
|
"System_RunOut_Variables"."ProdPipeRunOutFillerBott" := "System_RunOut_Variables"."ProdPipeRunOutWaterCount";
|
||||||
|
|
||||||
|
// Network 12: Water Bypass Enable (Original Language: LAD)
|
||||||
|
|
||||||
|
"gStillWaterByPassEn" := ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass" AND "Blender_Variables_Pers"."gWaterRecipe" AND "Blender_Variables_Pers"."gCarboStillRecipe") OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_ByPassDeair" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Deaireation" AND "Blender_Variables_Pers"."gWaterRecipe" AND "Blender_Variables_Pers"."gCarboStillRecipe");
|
||||||
|
|
||||||
|
// Network 13: Still Water Bypass (Original Language: LAD)
|
||||||
|
|
||||||
|
"gBlendFiStillWaterByPass" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass" AND "Blender_Variables_Pers"."gWaterRecipe" AND "Blender_Variables_Pers"."gCarboStillRecipe" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem";
|
||||||
|
|
||||||
|
// Network 14: Manual Syrup Drain Valve Open - Operator Alarm (Original Language: LAD)
|
||||||
|
|
||||||
|
"gHVP301_Open" := ("gSyrupRoomEn" AND "gIN_HVP301_Aux" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled" AND "Procedure_Variables"."FTP302Line_Preparation"."Done" AND "Procedure_Variables"."Syr_RunOut"."Done") OR ("gSyrupRoomEn" AND "gIN_HVP301_Aux" AND "gBlenderCIPMode" AND "gIN_CIP_CIPRunning" AND "Procedure_Variables"."Blender_Run"."Running");
|
||||||
|
|
||||||
|
// Network 15: Manual Syrup Drain Valve Open - Operator Alarm (Original Language: LAD)
|
||||||
|
|
||||||
|
"mHVM302_Dly"(IN := "gIN_HVM302_Aux", PT := S5T#1S); // TODO: Declarar "mHVM302_Dly" : TON;
|
||||||
|
|
||||||
|
"gHVM302_Open" := "mHVM302_Dly".Q;
|
||||||
|
|
||||||
|
// Network 16: Maselli Control (Original Language: LAD)
|
||||||
|
|
||||||
|
IF Eq("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_MeterType", 6) THEN
|
||||||
|
Maselli_PA_Control();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 17: mPDS Control (Original Language: LAD)
|
||||||
|
|
||||||
|
IF Eq("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_MeterType", 5) THEN
|
||||||
|
mPDS_PA_Control();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 18: mPDS Syrup Control (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_SyrBrixMeter" THEN
|
||||||
|
mPDS_SYR_PA_Control();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 19: Co2 Analog Input (Original Language: LAD)
|
||||||
|
// GetProdBrixCO2_FromAnalogIn
|
||||||
|
// CALL "GetProdBrixCO2_FromAn"
|
||||||
|
// NOP 0
|
||||||
|
|
||||||
|
IF Eq("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_MeterType", 3) THEN
|
||||||
|
GetProdBrixCO2_Anal_Inpt();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 20: Quality (Original Language: LAD)
|
||||||
|
|
||||||
|
ProductQuality();
|
||||||
|
|
||||||
|
// Network 21: Input Data (Original Language: LAD)
|
||||||
|
|
||||||
|
"Input_Data"();
|
||||||
|
|
||||||
|
// Network 22: Sel Brix Source Check (Original Language: LAD)
|
||||||
|
|
||||||
|
SelCheckBrixSource();
|
||||||
|
|
||||||
|
// Network 23: Check Water Cooling System Temperature (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_InverterRecirPumpPPM306" THEN
|
||||||
|
CTRLCoolingSystem();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 24: Tank Level (Original Language: LAD)
|
||||||
|
|
||||||
|
TankLevel();
|
||||||
|
|
||||||
|
// Network 25: Production ONS (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"M19001" := "gBlenderProdMode"; // P_TRIG("gBlenderProdMode") - Mem: "M19001"
|
||||||
|
|
||||||
|
"gProductionONS" := "gBlenderProdMode" AND "mDelayPowerOnTmr" AND NOT "M19001";
|
||||||
|
|
||||||
|
// Network 26: Blender Prod Mode Init (Original Language: LAD)
|
||||||
|
|
||||||
|
IF ("gProductionONS" AND "Blender_Variables_Pers"."gBlenderStarted") OR ("Procedure_Variables"."Blender_Rinse"."ONS_Done" AND "Blender_Variables_Pers"."gBlenderStarted") THEN
|
||||||
|
BlenderCtrl_ProdModeInit();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 27: Rinse ONS (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"M19002" := "HMI_Variables_Status"."System"."Blender_Prod_CIP"; // P_TRIG("HMI_Variables_Status"."System"."Blender_Prod_CIP") - Mem: "M19002"
|
||||||
|
|
||||||
|
"gRinseONS" := "mDelayPowerOnTmr" AND "HMI_Variables_Status"."System"."Blender_Prod_CIP" AND NOT "M19002";
|
||||||
|
|
||||||
|
// Network 28: CIP ONS (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"M19003" := "gBlenderCIPMode"; // P_TRIG("gBlenderCIPMode") - Mem: "M19003"
|
||||||
|
|
||||||
|
"gCIPONS" := "gBlenderCIPMode" AND "mDelayPowerOnTmr" AND NOT "M19003";
|
||||||
|
|
||||||
|
// Network 29: CIp Mode Init (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gCIPONS" THEN
|
||||||
|
BlenderCtrl_CIPModeInit();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 30: Reset SPWords (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderCtrl_ResetSPWord();
|
||||||
|
|
||||||
|
// Network 31: Blender Run Control (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderRun__Control();
|
||||||
|
|
||||||
|
// Network 32: Tank Pressure Control (Original Language: LAD)
|
||||||
|
|
||||||
|
Prod_Tank_PressCtrl();
|
||||||
|
|
||||||
|
// Network 33: Balaiage (Original Language: LAD)
|
||||||
|
|
||||||
|
Baialage();
|
||||||
|
|
||||||
|
// Network 34: First Production (Original Language: LAD)
|
||||||
|
|
||||||
|
"FirstProduction_Data"();
|
||||||
|
|
||||||
|
// Network 35: CIP MAIN Calling (Original Language: LAD)
|
||||||
|
|
||||||
|
CIPMain();
|
||||||
|
|
||||||
|
// Network 36: Blender Rinse (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderRinse();
|
||||||
|
|
||||||
|
// Network 37: Safeties (Original Language: LAD)
|
||||||
|
|
||||||
|
Safeties();
|
||||||
|
|
||||||
|
// Network 38: Instrument Scanner (Original Language: LAD)
|
||||||
|
|
||||||
|
Instrument_Scanner();
|
||||||
|
|
||||||
|
// Network 39: Vacuum Control (Original Language: LAD)
|
||||||
|
|
||||||
|
VacuumCtrl();
|
||||||
|
|
||||||
|
// Network 40: Syrup Room Control (Original Language: LAD)
|
||||||
|
|
||||||
|
SyrupRoomCtrl();
|
||||||
|
|
||||||
|
// Network 41: Blend Procedure Data (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "mDelayPowerOnTmr" THEN
|
||||||
|
"Blender_Procedure Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 42: Pneumatic Valve Control (Original Language: LAD)
|
||||||
|
|
||||||
|
Pneumatic_Valve_Ctrl();
|
||||||
|
|
||||||
|
// Network 43: Pumps Control (Original Language: LAD)
|
||||||
|
|
||||||
|
PumpsControl();
|
||||||
|
|
||||||
|
// Network 44: Prod Report Manager (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Report" THEN
|
||||||
|
ProdReportManager();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 45: Outputs (Original Language: LAD)
|
||||||
|
|
||||||
|
Output();
|
||||||
|
|
||||||
|
// Network 46: SLIM BLOCK (Original Language: LAD)
|
||||||
|
|
||||||
|
SLIM_Block();
|
||||||
|
|
||||||
|
// Network 47: Interlocking Panel 1 (Original Language: LAD)
|
||||||
|
|
||||||
|
Interlocking_Panel_1();
|
||||||
|
|
||||||
|
// Network 48: Filler Control (Original Language: LAD)
|
||||||
|
|
||||||
|
FillerControl();
|
||||||
|
|
||||||
|
// Network 49: Blender Ctrl Update PWORD (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderCtrl_UpdatePWord();
|
||||||
|
|
||||||
|
// Network 50: ResetTotalizer (Original Language: LAD)
|
||||||
|
|
||||||
|
"mResetTotalizerTmr"(IN := "gBlendResetTotalizer", PT := S5T#2S); // TODO: Declarar "mResetTotalizerTmr" : TP;
|
||||||
|
|
||||||
|
// Network 51: ResetWaterTot (Original Language: LAD)
|
||||||
|
|
||||||
|
"mResetFTN301TotTmr"(IN := "gFTN301_ResetTot" OR "mResetTotalizerTmr", PT := S5T#2S); // TODO: Declarar "mResetFTN301TotTmr" : TP;
|
||||||
|
|
||||||
|
"mResetWaterTot" := "mResetFTN301TotTmr".Q;
|
||||||
|
|
||||||
|
// Network 52: Water VFM Reset Totalizer (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gFTN301_ResetTot" THEN
|
||||||
|
"gFTN301_ResetTot" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 53: ResetCO2Tot (Original Language: LAD)
|
||||||
|
|
||||||
|
"mResetFTP302TotTmr"(IN := "mResetTotalizerTmr" OR "gFTP302_ResetTot", PT := S5T#2S); // TODO: Declarar "mResetFTP302TotTmr" : TP;
|
||||||
|
|
||||||
|
"mResetSyrupTot" := "gSyrupRoomEn" AND "mResetFTP302TotTmr".Q;
|
||||||
|
|
||||||
|
// Network 54: Syrup MFM Reset Totalizer (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gFTP302_ResetTot" THEN
|
||||||
|
"gFTP302_ResetTot" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 55: ResetProductTot (Original Language: LAD)
|
||||||
|
|
||||||
|
"mResetFTM303TotTmr"(IN := "mResetTotalizerTmr" OR "gFTM303_ResetTot", PT := S5T#2S); // TODO: Declarar "mResetFTM303TotTmr" : TP;
|
||||||
|
|
||||||
|
"mResetCO2Tot" := "mResetFTM303TotTmr".Q;
|
||||||
|
|
||||||
|
// Network 56: CO2 MFM Reset Tot (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gFTM303_ResetTot" THEN
|
||||||
|
"gFTM303_ResetTot" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 57: ResetCO2Tot (Original Language: LAD)
|
||||||
|
|
||||||
|
"mResetProductTotTmr"(IN := "mResetTotalizerTmr" OR "gProductMFMResetTot", PT := S5T#2S); // TODO: Declarar "mResetProductTotTmr" : TP;
|
||||||
|
|
||||||
|
"mResetProductTot" := "mResetProductTotTmr".Q;
|
||||||
|
|
||||||
|
// Network 58: Reset Totalizer (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gProductMFMResetTot" THEN
|
||||||
|
"gProductMFMResetTot" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 59: Reset Totalizer (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlendResetTotalizer" THEN
|
||||||
|
"gBlendResetTotalizer" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 60: Blender Ctrl Command (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
BlenderCtrl_MFM_Command(mResetCO2Tot := "mResetCO2Tot", mResetProductTot := "mResetProductTot", mResetSyrupTot := "mResetSyrupTot", mResetWaterTot := "mResetWaterTot");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 61: DP Global Diag (Original Language: LAD)
|
||||||
|
|
||||||
|
CPU_DP_Global_Diag();
|
||||||
|
|
||||||
|
// Network 62: Profibus (Original Language: LAD)
|
||||||
|
|
||||||
|
Profibus_Network();
|
||||||
|
|
||||||
|
// Network 63: Valve Fault (Original Language: LAD)
|
||||||
|
|
||||||
|
ModValveFault();
|
||||||
|
|
||||||
|
// Network 64: All Auto (Original Language: LAD)
|
||||||
|
|
||||||
|
// NBox SymPy processed, logic in consumer
|
||||||
|
"M19011" := "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Command" AND "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Enable"; // N_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Command" AND "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Enable") - Mem: "M19011"
|
||||||
|
|
||||||
|
IF ("M19011" AND NOT "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Command") OR ("M19011" AND NOT "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Enable") THEN
|
||||||
|
BlenderCtrl_All_Auto();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Light" := "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Command" AND "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Enable";
|
||||||
|
|
||||||
|
// Network 65: Ctrl HMI Manual Active (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderCtrl_ManualActive();
|
||||||
|
|
||||||
|
// Network 66: Mod Copy Recipe (Original Language: LAD)
|
||||||
|
|
||||||
|
"mAux_FP_M700_1" := "HMI_Variables_Cmd"."Recipe"."Main_Page" AND "mFP_Recip_Main_Page";
|
||||||
|
|
||||||
|
"mFP_Recip_Main_Page" := "HMI_Variables_Cmd"."Recipe"."Main_Page";
|
||||||
|
|
||||||
|
IF "mAux_FP_M700_1" THEN
|
||||||
|
"HMI_Variables_Cmd"."Recipe"."Edit" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 67: to HMI - Recipe Management (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
"RecipeManagement_Data"(Active_Recipe_Req := "HMI_Variables_Cmd"."Recipe"."Active_Request", Active_Recipe_Running := "HMI_Variables_Cmd"."Recipe"."Active_Recipe_Running", Active_Recipe_Start := "HMI_Variables_Cmd"."Recipe"."Active_Recipe_Start", Copy := "HMI_Variables_Cmd"."Recipe"."Copy", Copy_to := "HMI_Variables_Cmd"."Recipe"."Copy_Request", Delete := "HMI_Variables_Cmd"."Recipe"."Delete", Download := "HMI_Variables_Cmd"."Recipe"."Download", Edit := "HMI_Variables_Cmd"."Recipe"."Edit", HMI_Recipe_Main_Page := "HMI_Variables_Cmd"."Recipe"."Main_Page", HMI_Recipe_Page_Running := "HMI_Variables_Cmd"."Recipe"."Page_Running", Max_Recipe_Number := 50, Read := "HMI_Variables_Cmd"."Recipe"."Read", Upload := "HMI_Variables_Cmd"."Recipe"."Upload", UploadPC := "HMI_Variables_Cmd"."Recipe"."UploadPC", Work_Recipe := "HMI_Variables_Cmd"."Recipe"."Edit_Request", Write := "HMI_Variables_Cmd"."Recipe"."Write");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 68: Recipe Calculation (Original Language: LAD)
|
||||||
|
|
||||||
|
RecipeCalculation();
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,85 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FB
|
||||||
|
// Block Number: 1787
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION_BLOCK "BlenderPIDCtrl_Monitor"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_STAT
|
||||||
|
Water_Stat : "Statistical_Analisys";
|
||||||
|
Syrup_Stat : "Statistical_Analisys";
|
||||||
|
Carbo_CO2_Stat : "Statistical_Analisys";
|
||||||
|
Gas2_Stat : "Statistical_Analisys";
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Water Statistic analisys (Original Language: LAD)
|
||||||
|
|
||||||
|
"Water_Stat"(i_Cols := 14, i_Rows := 1, i_Value := "HMI_PID"."RMM301"."Out");
|
||||||
|
|
||||||
|
// Network 2: Water Values (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM301_MeanValue" := "Blender_Variables"."gWaterStat_MeanValue";
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM301_Variance" := "Blender_Variables"."gWaterStat_Variance";
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM301_StdDev" := "Blender_Variables"."gWaterStat_DevStd";
|
||||||
|
|
||||||
|
// Network 3: Water PID Controlling Ok (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 3 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 4: Syrup Statistic analisys (Original Language: LAD)
|
||||||
|
|
||||||
|
"Syrup_Stat"(i_Cols := 14, i_Rows := 1, i_Value := "HMI_PID"."RMP302"."Out");
|
||||||
|
|
||||||
|
// Network 5: Syrup Values (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMP302_MeanValue" := "Blender_Variables"."gSyrupStat_MeanValue";
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMP302_Variance" := "Blender_Variables"."gSyrupStat_Variance";
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMP302_StdDev" := "Blender_Variables"."gSyrupStat_DevStd";
|
||||||
|
|
||||||
|
// Network 6: Syrup PID Controlling Ok (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 6 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 7: Co2 Statistic analisys (Original Language: LAD)
|
||||||
|
|
||||||
|
"Carbo_CO2_Stat"(i_Cols := 12, i_Rows := 1, i_Value := "HMI_PID"."RMM303"."Out");
|
||||||
|
|
||||||
|
// Network 8: Co2 Values (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM303_MeanValue" := "Blender_Variables"."gCarboCO2Stat_MeanValue";
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM303_Variance" := "Blender_Variables"."gCarboCO2Stat_Variance";
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM303_StdDev" := "Blender_Variables"."gCarboCO2Stat_DevStd";
|
||||||
|
|
||||||
|
// Network 9: CO2 PID Controlling Ok (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 9 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 10: Gas2 Statistic analisys (Original Language: LAD)
|
||||||
|
|
||||||
|
"Gas2_Stat"(i_Cols := 12, i_Rows := 1, i_Value := "HMI_PID"."RMM304"."Out");
|
||||||
|
|
||||||
|
// Network 11: Gas2 Values (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM304_MeanValue" := "Blender_Variables"."gGAS2Stat_MeanValue";
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM304_Variance" := "Blender_Variables"."gGAS2Stat_Variance";
|
||||||
|
|
||||||
|
"HMI_Service"."PID_Monitoring"."_RMM304_StdDev" := "Blender_Variables"."gGAS2Stat_DevStd";
|
||||||
|
|
||||||
|
// Network 12: Gas2 PID Controlling Ok (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 12 did not produce printable SCL code.
|
||||||
|
|
||||||
|
END_FUNCTION_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,156 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FB
|
||||||
|
// Block Number: 1790
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
// Block Comment:
|
||||||
|
// TASK1 PID
|
||||||
|
|
||||||
|
FUNCTION_BLOCK "BlenderPIDCtrl_ReadAnIn"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_STAT
|
||||||
|
mDiffSensFaultEnON : Bool;
|
||||||
|
mProdTnkPressFlted : "LowPassFilter";
|
||||||
|
mWaterTempFlted : "LowPassFilter";
|
||||||
|
mProdTempFlted : "LowPassFilter";
|
||||||
|
mSyrupTnkLvlFlted : "LowPassFilter";
|
||||||
|
mCIPHeatTempFlted : "LowPassFilter";
|
||||||
|
mP3_Freq_Flted : "LowPassFilter";
|
||||||
|
mFlrFreqPrdctPump : "LowPassFilter";
|
||||||
|
mDiffTrasducerFlted : "LowPassFilter";
|
||||||
|
mInletSirupPress : "LowPassFilter";
|
||||||
|
mDeairTnkLvlFlted : "LowPassFilter";
|
||||||
|
mBaialageFlowFlted : "LowPassFilter";
|
||||||
|
mDiffSensFaultEn : "TON_TIME:v1.0";
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
RealTemp : Real;
|
||||||
|
mH_Fault : Bool;
|
||||||
|
mL_Fault : Bool;
|
||||||
|
mDummy : Bool;
|
||||||
|
mDifferentialTrasducer : Word;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_0 : Bool; // Auto-generated temporary
|
||||||
|
#_27648 : Bool; // Auto-generated temporary
|
||||||
|
#_2S : Bool; // Auto-generated temporary
|
||||||
|
#TON_INSTANCE_30 : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Product Tank Pressure (Original Language: LAD)
|
||||||
|
// Product Tank Pressure
|
||||||
|
// DB972.DBW36 = 27648
|
||||||
|
|
||||||
|
ReadAnalogIn(ANALOG := "HMI_Instrument"."PTM304", MAX_Analog_Value := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0, PEW := "P_AI_PTM304");
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
"mProdTnkPressFlted"(i_Enable := "AUX TRUE", i_Num := 3, i_Value := "HMI_Instrument"."PTM304"."PV");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := TRUE;
|
||||||
|
|
||||||
|
// Network 2: Syrup Tank Level (Original Language: LAD)
|
||||||
|
|
||||||
|
ReadAnalogIn(ANALOG := "HMI_Instrument"."LTP303", MAX_Analog_Value := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0, PEW := "P_AI_LTP303");
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
"mSyrupTnkLvlFlted"(i_Enable := "AUX TRUE", i_Num := 3, i_Value := "HMI_Instrument"."LTP303"."PV");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := TRUE;
|
||||||
|
|
||||||
|
// Network 3: Chiller Temperature (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX FALSE" THEN
|
||||||
|
ReadAnalogIn(ANALOG := "HMI_Instrument"."TTM306_H2O", MAX_Analog_Value := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0, PEW := "P_AI_TTM306");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
"mWaterTempFlted"(i_Enable := "AUX TRUE", i_Num := 10, i_Value := "HMI_Instrument"."TTM306_H2O"."PV");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" OR "AUX FALSE";
|
||||||
|
|
||||||
|
// Network 4: Chiller Temperature (Original Language: LAD)
|
||||||
|
|
||||||
|
ReadAnalogIn(ANALOG := "HMI_Instrument"."TTM306_PRD", MAX_Analog_Value := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0, PEW := "P_AI_TTM306");
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
"mProdTempFlted"(i_Enable := "AUX TRUE", i_Num := 10, i_Value := "HMI_Instrument"."TTM306_PRD"."PV");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := TRUE;
|
||||||
|
|
||||||
|
// Network 5: Cip Heating Temperature (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX FALSE" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Conductimeter_Profibus" THEN
|
||||||
|
ReadAnalogIn(ANALOG := "HMI_Instrument"."TT_S5", MAX_Analog_Value := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0, PEW := "P_AI_CIPHeaterTemperature");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
"mCIPHeatTempFlted"(i_Enable := "AUX TRUE", i_Num := 10, i_Value := "HMI_Instrument"."TT_S5"."PV");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" OR ("AUX FALSE" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Conductimeter_Profibus");
|
||||||
|
|
||||||
|
// Network 6: Differential Trasducer (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" THEN
|
||||||
|
"mDifferentialTrasducer" := "P_AI_PTF203";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "mDifferentialTrasducer" <= 0 THEN
|
||||||
|
"mDifferentialTrasducer" := INT#0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "mDifferentialTrasducer" > 27648 THEN
|
||||||
|
"mDifferentialTrasducer" := INT#27648;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 7: Differential Pressure (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Instrument"."PTF203"."Config" THEN
|
||||||
|
ReadAnalogIn(ANALOG := "HMI_Instrument"."PTF203", MAX_Analog_Value := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0, PEW := "mDifferentialTrasducer");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
"mDiffTrasducerFlted"(i_Enable := "AUX TRUE", i_Num := 4, i_Value := "HMI_Instrument"."PTF203"."PV");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" OR "HMI_Instrument"."PTF203"."Config";
|
||||||
|
|
||||||
|
// Network 8: Differential Pressure Fault (Original Language: LAD)
|
||||||
|
|
||||||
|
#TON_INSTANCE_30(IN := "gIN_ResetBtn" AND "Procedure_Variables"."BlendFill_StartUp"."Done", PT := T#2S); // TODO: Declarar #TON_INSTANCE_30 : TON;
|
||||||
|
|
||||||
|
"gDiffSensor_Analog_Fault" := #TON_INSTANCE_30.Q AND "mDiffSensFaultEnON" AND "HMI_Instrument"."PTF203"."Alarm" AND "gWorkshopTest";
|
||||||
|
|
||||||
|
// Network 9: Syrup Inlet Pressure (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Instrument"."PTP338"."Config" THEN
|
||||||
|
ReadAnalogIn(ANALOG := "HMI_Instrument"."PTP338", MAX_Analog_Value := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0, PEW := "P_AI_PTP338");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
"mInletSirupPress"(i_Enable := "AUX TRUE", i_Num := 5, i_Value := "HMI_Instrument"."PTP338"."PV");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" OR "HMI_Instrument"."PTP338"."Config";
|
||||||
|
|
||||||
|
// Network 10: TTS305 - Local Cip Heating Temperature (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
ReadAnalogIn(ANALOG := "HMI_Instrument"."FTM305", MAX_Analog_Value := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0, PEW := "P_AI_FTM305");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" THEN
|
||||||
|
"mBaialageFlowFlted"(i_Enable := "AUX TRUE", i_Num := 5, i_Value := "HMI_Instrument"."FTM305"."PV");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" OR "AUX TRUE";
|
||||||
|
|
||||||
|
END_FUNCTION_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,265 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1925
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
// Block Comment:
|
||||||
|
// TASK1 PID
|
||||||
|
|
||||||
|
FUNCTION "BlenderPIDCtrl_WriteAnOu" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mVLT_freq_REAL : Real;
|
||||||
|
mDummy : Bool;
|
||||||
|
mVLT_PumpP2_freq_REAL : Real;
|
||||||
|
mVLT_PumpP1_freq_REAL : Real;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Carbonated Water Valve (Original Language: LAD)
|
||||||
|
// Water Valve
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."RMM301"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."RMM301"."Out", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 2: Syrup Valve (Original Language: LAD)
|
||||||
|
// Syrup
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."RMP302"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."RMP302"."Out", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 3: Co2 Valve (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."RMM303"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."RMM303"."Out", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 4: Gas2 Valve (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."RMM304"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."RMM304"."Out", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 5: Product Tank Pressure Valve (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."RVM301"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."RVM301"."Out", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 6: Syrup Tank Level Valve (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_PID"."RVP303"."Out" >= 1.0 THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."RVP303"."Out", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 5530);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 7: Valve Power Enable (Power Supply Analog Signal) (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_PID"."RVP303"."Out" < 1.0 THEN
|
||||||
|
"P_AO_RVP303" := 0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"DO_SyrupValve_Enable" := "HMI_PID"."RVP303"."Out" < 1.0;
|
||||||
|
|
||||||
|
// Network 8: Deaireator Level Valve (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."RVN302"."ConfigPID" AND "HMI_PID"."RVN302"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."RVN302"."Out", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 9: CIp Heating Valve (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."RVS318"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."RVS318"."Out", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 10: Chiller Temperature (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."RVM319_PRD"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_SP_ProdTemp", MAX_Analog_Value := 50.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."WarmRinseRun" THEN
|
||||||
|
"HMI_PID"."RVM319_H2O"."Out" := "HMI_PID"."RVM319_PRD"."Out";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 11: Cip Return Temperature (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_Instrument"."TTS305_1"."PVFiltered", MAX_Analog_Value := 100.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 12: Cip Conductivity (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_Instrument"."CTS301"."PVFiltered", MAX_Analog_Value := 2000.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 13: Cip Caustic Conductivity (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_Instrument"."CTS302"."PVFiltered", MAX_Analog_Value := 200.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 14: Product Pump (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_Device"."PPM303"."Out" AND "gIN_Filler1ProductReq" AND "HMI_PID"."PPM303"."PID_FIX" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM303"."Out" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_ProdPump1_Hz";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_Device"."PPM303"."Out" AND "gIN_Filler1ProductReq" AND "HMI_PID"."PPM303"."PID_FIX" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM303"."Out" := 10.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF ("gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_Device"."PPM303"."Out" AND "HMI_PID"."PPM303"."PID_FIX" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" AND "HMI_Alarms"."gH_Status") OR ("gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_Device"."PPM303"."Out" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" AND "HMI_Alarms"."gH_Status" AND "Disable_Bit") THEN
|
||||||
|
"HMI_PID"."PPM303"."Out" := 15.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_Device"."PPM303"."Out" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM303"."Out" := "HMI_Blender_Parameters"."ProcessSetup"."_RinsePPM303Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Device"."PPM303"."Out" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" AND "gBlenderCIPMode" THEN
|
||||||
|
"HMI_PID"."PPM303"."Out" := "HMI_Blender_Parameters"."ProcessSetup"."_CIPPPM303Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_PID"."PPM303"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM303"."Out" := "HMI_PID"."PPM303"."OutMan";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Device"."PPM303"."Out" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM303"."Out" := 0.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := "gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_Device"."PPM303"."Out" AND "gIN_Filler1ProductReq" AND "HMI_PID"."PPM303"."PID_FIX" AND "HMI_PID"."PPM303"."ManualControl"."ManOut";
|
||||||
|
|
||||||
|
// Network 15: Product Pump Reference Value (Original Language: LAD)
|
||||||
|
// N.B. impostare il MAX_Analog_Value al valore di produzione + 10 Hz ( con
|
||||||
|
// macchina a 50Hz verrà impostato a 60Hz).
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."PPM303"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."PPM303"."Out", MAX_Analog_Value := 50.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue_VFC", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 16: Product Pump 2 (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_PID"."PPM303"."PID_FIX" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" AND "HMI_Device"."PPM305"."Out" AND "gIN_Filler2ProductReq" THEN
|
||||||
|
"HMI_PID"."PPM305"."Out" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_ProdPump2_Hz";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_PID"."PPM303"."PID_FIX" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" AND "HMI_Device"."PPM305"."Out" AND "gIN_Filler2ProductReq" THEN
|
||||||
|
"HMI_PID"."PPM305"."Out" := 10.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "HMI_Device"."PPM303"."Out" AND "HMI_PID"."PPM303"."PID_FIX" THEN
|
||||||
|
"HMI_PID"."PPM305"."Out" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_FillingValveHead_SP";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_Device"."PPM305"."Out" AND "HMI_PID"."PPM305"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM305"."Out" := "HMI_Blender_Parameters"."ProcessSetup"."_RinsePPM303Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" AND "HMI_Device"."PPM305"."Out" AND "HMI_PID"."PPM305"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM305"."Out" := "HMI_Blender_Parameters"."ProcessSetup"."_CIPPPM303Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Device"."PPM305"."Out" AND "HMI_PID"."PPM305"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM305"."Out" := 0.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_PID"."PPM305"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPM305"."Out" := "HMI_PID"."PPM305"."OutMan";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := "gBlenderProdMode" AND "gBlenderRinseMode" AND "HMI_PID"."PPM303"."PID_FIX" AND "HMI_PID"."PPM303"."ManualControl"."ManOut" AND "HMI_Device"."PPM305"."Out" AND "gIN_Filler2ProductReq";
|
||||||
|
|
||||||
|
// Network 17: Product Pump 2 Reference Value (Original Language: LAD)
|
||||||
|
// N.B. impostare il MAX_Analog_Value al valore di produzione + 10 Hz ( con
|
||||||
|
// macchina a 50Hz verrà impostato a 60Hz).
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."PPM305"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."PPM305"."Out", MAX_Analog_Value := 50.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue_VFC", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 18: Syrup Pump (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "HMI_Device"."PPP302"."Out" THEN
|
||||||
|
"mVLT_PumpP2_freq_REAL" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_SyrupPumpFreq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderRinseMode" AND "HMI_Device"."PPP302"."Out" THEN
|
||||||
|
"mVLT_PumpP2_freq_REAL" := "HMI_Blender_Parameters"."ProcessSetup"."_RinsePPP302Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" AND "HMI_Device"."PPP302"."Out" THEN
|
||||||
|
"mVLT_PumpP2_freq_REAL" := "HMI_Blender_Parameters"."ProcessSetup"."_CIPPPP302Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Device"."PPP302"."Out" THEN
|
||||||
|
"mVLT_PumpP2_freq_REAL" := 0.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_PID"."PPP302"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPP302"."OutMan" := "mVLT_PumpP2_freq_REAL";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_PID"."PPP302"."ManualControl"."ManOut" THEN
|
||||||
|
"mVLT_PumpP2_freq_REAL" := "HMI_PID"."PPP302"."OutMan";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"HMI_PID"."PPP302"."Out" := "mVLT_PumpP2_freq_REAL";
|
||||||
|
|
||||||
|
"mDummy" := ("gBlenderProdMode" AND "HMI_Device"."PPP302"."Out") OR ("gBlenderRinseMode" AND "HMI_Device"."PPP302"."Out");
|
||||||
|
|
||||||
|
// Network 19: Syrup Pump Reference Value (Original Language: LAD)
|
||||||
|
// N.B. impostare il MAX_Analog_Value al valore di produzione + 10 Hz ( con
|
||||||
|
// macchina a 50Hz verrà impostato a 60Hz).
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."PPP302"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."PPP302"."Out", MAX_Analog_Value := 60.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue_VFC", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 20: Water Pump (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "HMI_Device"."PPN301"."Out" THEN
|
||||||
|
"mVLT_PumpP1_freq_REAL" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_WaterPumpFreq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderRinseMode" AND "HMI_Device"."PPN301"."Out" THEN
|
||||||
|
"mVLT_PumpP1_freq_REAL" := "HMI_Blender_Parameters"."ProcessSetup"."_RinsePPN301Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" THEN
|
||||||
|
"mVLT_PumpP1_freq_REAL" := "HMI_Blender_Parameters"."ProcessSetup"."_CIPPPN301Freq";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Device"."PPN301"."Out" THEN
|
||||||
|
"mVLT_PumpP1_freq_REAL" := 0.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_PID"."PPN301"."ManualControl"."ManOut" THEN
|
||||||
|
"HMI_PID"."PPN301"."OutMan" := "mVLT_PumpP1_freq_REAL";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_PID"."PPN301"."ManualControl"."ManOut" THEN
|
||||||
|
"mVLT_PumpP1_freq_REAL" := "HMI_PID"."PPN301"."OutMan";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"HMI_PID"."PPN301"."Out" := "mVLT_PumpP1_freq_REAL";
|
||||||
|
|
||||||
|
"mDummy" := ("gBlenderProdMode" AND "HMI_Device"."PPN301"."Out") OR ("gBlenderRinseMode" AND "HMI_Device"."PPN301"."Out");
|
||||||
|
|
||||||
|
// Network 21: Water Pump Reference Value (Original Language: LAD)
|
||||||
|
// N.B. impostare il MAX_Analog_Value al valore di produzione + 10 Hz ( con
|
||||||
|
// macchina a 50Hz verrà impostato a 60Hz).
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation" AND "HMI_PID"."PPN301"."Config" THEN
|
||||||
|
WritePeripheral(Analog_Value := "HMI_PID"."PPN301"."Out", MAX_Analog_Value := 60.0, MAX_Out := "Blender_Constants"."gAnalogMaxValue_VFC", MIN_Analog_Value := 0.0, MIN_Out := 0);
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,119 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FB
|
||||||
|
// Block Number: 1729
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
// Block Comment:
|
||||||
|
// TASK1 PID
|
||||||
|
|
||||||
|
FUNCTION_BLOCK "BlenderPIDCtrl__Loop"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_STAT
|
||||||
|
PID_1_300ms : Bool;
|
||||||
|
PID_2_300ms : Bool;
|
||||||
|
PID_3_300ms : Bool;
|
||||||
|
PID_4_300ms : Bool;
|
||||||
|
PID_5_300ms : Bool;
|
||||||
|
PID_6_300ms : Bool;
|
||||||
|
Flow_Meter_Error_RETVAL : Real;
|
||||||
|
PID_FF_Calc : "BlenderPID_PIDFFCalc";
|
||||||
|
PID_Blending_Fault : "BlenderPID_BlendingFault";
|
||||||
|
PID_Save_Integral : "BlenderPIDCtrl_SaveInteg";
|
||||||
|
PID_Monitor : "BlenderPIDCtrl_Monitor";
|
||||||
|
Read_AnalogInput : "BlenderPIDCtrl_ReadAnIn";
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Read Analoc Inputs (Original Language: LAD)
|
||||||
|
|
||||||
|
"Read_AnalogInput"();
|
||||||
|
|
||||||
|
// Network 2: MIX - OB35 scan counter (Original Language: LAD)
|
||||||
|
// PID Control Time Bit (300ms)
|
||||||
|
|
||||||
|
"PID_1_300ms" := Eq("MW1968", 1);
|
||||||
|
|
||||||
|
"PID_2_300ms" := Eq("MW1968", 2);
|
||||||
|
|
||||||
|
"PID_3_300ms" := Eq("MW1968", 3);
|
||||||
|
|
||||||
|
"PID_4_300ms" := Eq("MW1968", 4);
|
||||||
|
|
||||||
|
"PID_5_300ms" := Eq("MW1968", 5);
|
||||||
|
|
||||||
|
"PID_6_300ms" := Eq("MW1968", 6);
|
||||||
|
|
||||||
|
// Network 3: PID Call (Original Language: LAD)
|
||||||
|
// Water PID
|
||||||
|
// Syrup PID
|
||||||
|
// CO2 PID
|
||||||
|
|
||||||
|
IF "PID_1_300ms" THEN
|
||||||
|
"PID_FF_Calc"();
|
||||||
|
"PID_Blending_Fault"();
|
||||||
|
BlenderPID_FlowMeterErro();
|
||||||
|
"PID_Monitor"();
|
||||||
|
"PID_Save_Integral"();
|
||||||
|
BlenderPIDCtrl_SaveValve();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "PID_1_300ms" AND "HMI_PID"."RMM301"."Config" THEN
|
||||||
|
"PID_RMM301_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "PID_1_300ms" AND "HMI_PID"."RMP302"."Config" THEN
|
||||||
|
"PID_RMP302_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "PID_1_300ms" AND "HMI_PID"."RMM303"."Config" THEN
|
||||||
|
"PID_RMM303_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "PID_1_300ms" AND "HMI_PID"."RMM304"."Config" THEN
|
||||||
|
"PID_RMM304_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 4: PID Product Tank Pressure (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "PID_2_300ms" AND "HMI_PID"."RVM301"."Config" THEN
|
||||||
|
"PID_RVM301_Data"();
|
||||||
|
BlenderPIDCtrl_PresRelea();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 5: Pid Call (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "PID_4_300ms" AND "HMI_PID"."RVM319_PRD"."Config" THEN
|
||||||
|
"PID_RVM319_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_PID"."RVP303"."Config" AND "PID_4_300ms" THEN
|
||||||
|
"PID_RVP303_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_PID"."RVN302"."ConfigPID" AND "HMI_PID"."RVN302"."Config" AND "PID_4_300ms" THEN
|
||||||
|
"PID_RVN302_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 6: Filling Head (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" AND "PID_5_300ms" AND "HMI_PID"."PPM303"."Config" THEN
|
||||||
|
"PID_Filling_Head_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 7: CIp Heating PID (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "PID_6_300ms" AND "HMI_PID"."RVS318"."Config" THEN
|
||||||
|
"PID_RVS318_Data"();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 8: Write Analog Outputs (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
BlenderPIDCtrl_WriteAnOu();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END_FUNCTION_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,26 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1916
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderPID_NextRecipe" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
Block_Move_Err : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: (Original Language: LAD)
|
||||||
|
|
||||||
|
"Block_Move_Err" := BLKMOV(SRCBLK := "System_RunOut_Variables"."gNext_Recipe", DSTBLK => "HMI_Blender_Parameters"."Actual_Recipe_Parameters"); // ADVERTENCIA: BLKMOV usado directamente, probablemente no compile!
|
||||||
|
|
||||||
|
// Network 2: (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Cmd"."Recipe"."Active_Recipe_Running" := "HMI_Blender_Parameters"."Next_Recipe_Number";
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,148 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2019
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderRinse" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mColdReq : Bool;
|
||||||
|
mWarmReq : Bool;
|
||||||
|
mColdStop : Bool;
|
||||||
|
mWarmStop : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Qualifier (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Rinse"."Qualifier" := "HMI_Variables_Status"."System"."Blender_Prod_CIP" AND "gBlenderSuppliesOk" AND "gBlenderBlending" AND "gBlenderCIPMode" AND "Procedure_Variables"."TM301_Drain"."Latch";
|
||||||
|
|
||||||
|
// Network 2: Stop / Request (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"M19014" := ("System_RunOut_Variables"."FastChangeOverActivated" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_ColdRinseReq") OR ("System_RunOut_Variables"."FastChangeOverActivated" AND "System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Blender_Variables_Pers"."gCoolerEnabled"); // P_TRIG(("System_RunOut_Variables"."FastChangeOverActivated" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_ColdRinseReq") OR ("System_RunOut_Variables"."FastChangeOverActivated" AND "System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Blender_Variables_Pers"."gCoolerEnabled")) - Mem: "M19014"
|
||||||
|
|
||||||
|
"mColdReq" := ("System_RunOut_Variables"."FastChangeOverActivated" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_ColdRinseReq" AND "Procedure_Variables"."Blender_Rinse"."Qualifier" AND NOT "M19014") OR ("System_RunOut_Variables"."FastChangeOverActivated" AND "System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Blender_Variables_Pers"."gCoolerEnabled" AND "Procedure_Variables"."Blender_Rinse"."Qualifier" AND NOT "M19014");
|
||||||
|
|
||||||
|
"mColdStop" := ("ColdRinseON" AND "System_RunOut_Variables"."FastChangeOverActivated" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_ColdRinseReq" AND NOT "M19014") OR ("ColdRinseON" AND "System_RunOut_Variables"."FastChangeOverActivated" AND "System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Blender_Variables_Pers"."gCoolerEnabled" AND NOT "M19014");
|
||||||
|
|
||||||
|
// Network 3: Warm Request / Stop (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"M19015" := ("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_WarmRinseReq" AND "System_RunOut_Variables"."FastChangeOverActivated") OR ("System_RunOut_Variables"."FastChangeOverActivated" AND "System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Blender_Variables_Pers"."gCoolerEnabled"); // P_TRIG(("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_WarmRinseReq" AND "System_RunOut_Variables"."FastChangeOverActivated") OR ("System_RunOut_Variables"."FastChangeOverActivated" AND "System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Blender_Variables_Pers"."gCoolerEnabled")) - Mem: "M19015"
|
||||||
|
|
||||||
|
"mWarmReq" := ("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_WarmRinseReq" AND "System_RunOut_Variables"."FastChangeOverActivated" AND "Procedure_Variables"."Blender_Rinse"."Qualifier" AND NOT "M19015") OR ("System_RunOut_Variables"."FastChangeOverActivated" AND "System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Blender_Variables_Pers"."gCoolerEnabled" AND "Procedure_Variables"."Blender_Rinse"."Qualifier" AND NOT "M19015");
|
||||||
|
|
||||||
|
"mWarmStop" := ("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_WarmRinseReq" AND "WarmRinseON" AND "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "M19015") OR ("WarmRinseON" AND "System_RunOut_Variables"."FastChangeOverActivated" AND "System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Blender_Variables_Pers"."gCoolerEnabled" AND NOT "M19015");
|
||||||
|
|
||||||
|
// Network 4: Rinse Request (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Rinse"."Request" := ("mColdReq" AND "Procedure_Variables"."Blender_Rinse"."Qualifier") OR ("mWarmReq" AND "Procedure_Variables"."Blender_Rinse"."Qualifier");
|
||||||
|
|
||||||
|
// Network 5: ColdRinseSR (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 5 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 6: WarmRinse (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 6 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 7: Wait (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Rinse"."Wait" := "Procedure_Variables"."TM301_Drain"."Latch" OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Deaireation" AND "Procedure_Variables"."TN301_StartUp"."Done");
|
||||||
|
|
||||||
|
// Network 8: Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Rinse"."Reset" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_TM301DrainReq" OR "gBlenderCIPMode";
|
||||||
|
|
||||||
|
// Network 9: Done (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Rinse"."Reset" OR "Procedure_Variables"."Blender_Rinse"."Latch" THEN
|
||||||
|
"HMI_Variables_Status"."Procedures"."Rinse_WarmRinseDone" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Rinse"."Reset" OR "Procedure_Variables"."Blender_Rinse"."Latch" THEN
|
||||||
|
"HMI_Variables_Status"."Procedures"."Rinse_ColdRinseDone" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 10: Latch (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Rinse"."Latch" := ("Procedure_Variables"."Blender_Rinse"."Reset" AND "Procedure_Variables"."Blender_Rinse"."Latch" AND "FirstScan" AND "Procedure_Variables"."Blender_Rinse"."Done") OR ("Procedure_Variables"."Blender_Rinse"."Reset" AND "Procedure_Variables"."Blender_Rinse"."Request" AND "FirstScan" AND "Procedure_Variables"."Blender_Rinse"."Done");
|
||||||
|
|
||||||
|
// Network 11: Rinse Mode (Original Language: LAD)
|
||||||
|
|
||||||
|
"gBlenderRinseMode" := "Procedure_Variables"."Blender_Rinse"."Latch";
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Rinse"."Latch" THEN
|
||||||
|
"HMI_Variables_Status"."Procedures"."BlenderStateNum" := 18;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 12: Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Rinse"."Running" := "Procedure_Variables"."Blender_Rinse"."Latch" AND "Procedure_Variables"."Blender_Rinse"."Wait";
|
||||||
|
|
||||||
|
// Network 13: Warm Rinse Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "WarmRinseON" AND "Procedure_Variables"."Blender_Rinse"."Latch";
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."WarmRinseRun" := "WarmRinseON" AND "Procedure_Variables"."Blender_Rinse"."Latch";
|
||||||
|
|
||||||
|
// Network 14: Cold Rinse Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "ColdRinseON" AND "Procedure_Variables"."Blender_Rinse"."Latch";
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."ColdRinseRun" := "ColdRinseON" AND "Procedure_Variables"."Blender_Rinse"."Latch";
|
||||||
|
|
||||||
|
// Network 15: Rinse Drain Active (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "gBlenderRinseMode" AND "Procedure_Variables"."TM301_Drain"."Latch";
|
||||||
|
|
||||||
|
"gRinseDrainRunning" := "gBlenderRinseMode" AND "Procedure_Variables"."TM301_Drain"."Latch";
|
||||||
|
|
||||||
|
// Network 16: Done (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Rinse"."Done" := ("Procedure_Variables"."Blender_Rinse"."Latch" AND "Procedure_Variables"."TM301_Drain"."Done") OR ("Procedure_Variables"."Blender_Rinse"."Latch" AND "M19077") OR ("Procedure_Variables"."Blender_Rinse"."Reset" AND "Procedure_Variables"."Blender_Rinse"."Done" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled");
|
||||||
|
|
||||||
|
// Network 17: Done (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Rinse"."Done" OR "gBlenderCIPMode" THEN
|
||||||
|
"Blender_Variables_Pers"."gFillerRinse_DoneLatch" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 18: Rinse Completed (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"M19020" := "System_RunOut_Variables"."In_Flr_FastRinseComplete"; // P_TRIG("System_RunOut_Variables"."In_Flr_FastRinseComplete") - Mem: "M19020"
|
||||||
|
|
||||||
|
IF ("WarmRinseON" AND "mWarmStop") OR ("Procedure_Variables"."Blender_Rinse"."Latch" AND "System_RunOut_Variables"."In_Flr_FastRinseComplete") THEN
|
||||||
|
"Blender_Variables_Pers"."gFillerRinse_DoneLatch" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF ("WarmRinseON" AND "mWarmStop") OR ("WarmRinseON" AND "Procedure_Variables"."Blender_Rinse"."Latch" AND "System_RunOut_Variables"."In_Flr_FastRinseComplete") THEN
|
||||||
|
"HMI_Variables_Status"."Procedures"."Rinse_WarmRinseDone" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF ("ColdRinseON" AND "WarmRinseON" AND "mWarmStop") OR ("ColdRinseON" AND "Procedure_Variables"."Blender_Rinse"."Latch" AND "System_RunOut_Variables"."In_Flr_FastRinseComplete") THEN
|
||||||
|
"HMI_Variables_Status"."Procedures"."Rinse_ColdRinseDone" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 19: Rinse Done ONS (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 26
|
||||||
|
"M19021" := "Procedure_Variables"."Blender_Rinse"."Done"; // P_TRIG("Procedure_Variables"."Blender_Rinse"."Done") - Mem: "M19021"
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Rinse"."ONS_Done" := "Procedure_Variables"."Blender_Rinse"."Done" AND NOT "M19021";
|
||||||
|
"M19021" := "Procedure_Variables"."Blender_Rinse"."Done"; // P_TRIG("Procedure_Variables"."Blender_Rinse"."Done") - Mem: "M19021"
|
||||||
|
|
||||||
|
// Network 20: Blender Rinse Done (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Rinse"."ONS_Done" THEN
|
||||||
|
BlenderRinse_Done();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,22 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2042
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderRinse_Done" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: PID Reset Integral (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderPID_PIDResInteg();
|
||||||
|
|
||||||
|
// Network 2: Init Errors (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderCtrl_InitErrors();
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,265 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FB
|
||||||
|
// Block Number: 1719
|
||||||
|
// Original Network Languages: STL, LAD
|
||||||
|
|
||||||
|
FUNCTION_BLOCK "BlenderRun_MeasFilSpeed"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_STAT
|
||||||
|
mNumOfCycle : Int;
|
||||||
|
mInitialLevel : Real;
|
||||||
|
mPrevSpeed : Real;
|
||||||
|
mAcqTime : Real;
|
||||||
|
mProdLt : Real;
|
||||||
|
mSaveDeltaV : Real;
|
||||||
|
mFillerTracked : Bool;
|
||||||
|
mFillerTrackedTmrON : Bool;
|
||||||
|
mFlrFlowDelayOnON : Bool;
|
||||||
|
mFlrFlowDelayOffON : Bool;
|
||||||
|
mFillerTrackedTmr : "TON_TIME:v1.0";
|
||||||
|
mFlrFlowDelayOn : "TON_TIME:v1.0";
|
||||||
|
mFlrFlowDelayOff : "TOF_TIME:v1.0";
|
||||||
|
mFillerDeltaVFilter : "LowPassFilter";
|
||||||
|
mFillerSpeedFilter : "LowPassFilter";
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mReadLevel : Bool;
|
||||||
|
mNotZero : Bool;
|
||||||
|
mSave : Bool;
|
||||||
|
gBlenderSpeedUp : Bool;
|
||||||
|
gBlenderSpeedDown : Bool;
|
||||||
|
mDummy : Bool;
|
||||||
|
Aux_calc1 : Real;
|
||||||
|
Aux_calc2 : Real;
|
||||||
|
mTemp : Real;
|
||||||
|
mSpeedPerc : Real;
|
||||||
|
mFillerEstimatedFlow : Real;
|
||||||
|
__PlcmigTempFillBits_22B0 : Array[0..7] of Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_20S : Bool; // Auto-generated temporary
|
||||||
|
#TON_INSTANCE_29 : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Track Filler Speed Start (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_TrackFillerSpeed" THEN
|
||||||
|
"gTrackFillerSpeed" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 2: Track Filler Speed Stop (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_TrackFillerSpeed" OR "HMI_PID"."RMM301"."ManualControl"."ManOut" THEN
|
||||||
|
"gTrackFillerSpeed" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 3: Qualifier (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Filler_Speed"."Qualifier" := "Procedure_Variables"."Blender_Run"."Latch" OR "AUX FALSE";
|
||||||
|
|
||||||
|
// Network 4: Read Level (Original Language: LAD)
|
||||||
|
|
||||||
|
"mReadLevel" := Eq("mNumOfCycle", 0);
|
||||||
|
|
||||||
|
// Network 5: Read level & Product Target (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "mReadLevel" THEN
|
||||||
|
"mInitialLevel" := "HMI_Instrument"."LTM302"."PVFiltered";
|
||||||
|
"mPrevSpeed" := "Blender_Variables"."gActual_Prod_SP";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 6: Acquisition Time (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Filler_Speed"."Qualifier" AND "Procedure_Variables"."Filler_Speed"."Latch" THEN
|
||||||
|
"mAcqTime" := "mAcqTime" + "Time_300ms";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 7: Speed Request (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Filler_Speed"."Qualifier" THEN
|
||||||
|
"mNumOfCycle" := "mNumOfCycle" + 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"Procedure_Variables"."Filler_Speed"."Request" := "mNumOfCycle" > 8;
|
||||||
|
|
||||||
|
// Network 8: Speed Latch (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Filler_Speed"."Latch" := ("FirstScan" AND "Procedure_Variables"."Filler_Speed"."Done" AND "Procedure_Variables"."Filler_Speed"."Qualifier" AND "Procedure_Variables"."Filler_Speed"."Latch") OR ("FirstScan" AND "Procedure_Variables"."Filler_Speed"."Done" AND "Procedure_Variables"."Filler_Speed"."Qualifier" AND "Procedure_Variables"."Filler_Speed"."Request");
|
||||||
|
|
||||||
|
// Network 9: Product Liters Calculation (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Filler_Speed"."Latch" THEN
|
||||||
|
"Aux_calc1" := "Blender_Variables"."gProdTankVolume" - "Blender_Variables"."gProdTankBottomVol";
|
||||||
|
"mNumOfCycle" := 0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Filler_Speed"."Latch" THEN
|
||||||
|
"Aux_calc1" := "Aux_calc1" / 100.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Filler_Speed"."Latch" THEN
|
||||||
|
"Aux_calc2" := "mInitialLevel" - "HMI_Instrument"."LTM302"."PVFiltered";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Filler_Speed"."Latch" THEN
|
||||||
|
"mProdLt" := "Aux_calc1" * "Aux_calc2";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 10: Reset Product Liters (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."First_Production"."Done" THEN
|
||||||
|
"mProdLt" := 0.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 11: Acquisition Time not Zero (Original Language: LAD)
|
||||||
|
|
||||||
|
"mNotZero" := Ne("mAcqTime", 0.0);
|
||||||
|
|
||||||
|
// Network 12: Filler DeltaV Filter (Original Language: STL)
|
||||||
|
// Aggiungere il LowPassFilter!!
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 12 ---
|
||||||
|
|
||||||
|
A "mNotZero"
|
||||||
|
A "Procedure_Variables".Filler_Speed.Latch
|
||||||
|
= "__PlcmigTempFillBits_22B0"[0]
|
||||||
|
A "AUX TRUE"
|
||||||
|
= "__PlcmigTempFillBits_22B0"[1]
|
||||||
|
BLD 103
|
||||||
|
A_BRACK
|
||||||
|
A_BRACK
|
||||||
|
A "__PlcmigTempFillBits_22B0"[0]
|
||||||
|
JNB _00b
|
||||||
|
L "mProdLt"
|
||||||
|
L "mAcqTime"
|
||||||
|
DIV_R
|
||||||
|
T "Aux_calc1"
|
||||||
|
AN _Statusword_?
|
||||||
|
SAVE
|
||||||
|
CLR
|
||||||
|
_00b: A _Statusword_?
|
||||||
|
BRACKET
|
||||||
|
JNB _00c
|
||||||
|
L "Aux_calc1"
|
||||||
|
L 60.0
|
||||||
|
MUL_R
|
||||||
|
T "Aux_calc1"
|
||||||
|
AN _Statusword_?
|
||||||
|
SAVE
|
||||||
|
CLR
|
||||||
|
_00c: A _Statusword_?
|
||||||
|
BRACKET
|
||||||
|
JNB _00d
|
||||||
|
CALL "mFillerDeltaVFilter"
|
||||||
|
_00d: NOP_0
|
||||||
|
A "__PlcmigTempFillBits_22B0"[0]
|
||||||
|
JNB _00e
|
||||||
|
L 0
|
||||||
|
T "mAcqTime"
|
||||||
|
_00e: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 12 ---
|
||||||
|
|
||||||
|
// Network 13: Save (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Filler_Speed"."Qualifier" THEN
|
||||||
|
"Aux_calc1" := "mSaveDeltaV" - "Blender_Variables"."gBlenderFillerDeltaV";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mSave" := "Aux_calc1" < 20.0;
|
||||||
|
|
||||||
|
// Network 14: Delta V (Original Language: LAD)
|
||||||
|
|
||||||
|
"Blender_Variables"."gBlenderFillerDeltaV" := "mSaveDeltaV";
|
||||||
|
|
||||||
|
// Network 15: Actual Product Target With Slew Limitation (Original Language: LAD)
|
||||||
|
|
||||||
|
"gBlenderSpeedUp" := "Blender_Variables"."gActual_Prod_SP" > "mPrevSpeed";
|
||||||
|
|
||||||
|
// Network 16: Actual Product Target With Slew Limitation (Original Language: LAD)
|
||||||
|
|
||||||
|
"gBlenderSpeedDown" := "mPrevSpeed" < "Blender_Variables"."gActual_Prod_SP";
|
||||||
|
|
||||||
|
// Network 17: FillerTracked (Original Language: LAD)
|
||||||
|
|
||||||
|
#TON_INSTANCE_29(IN := "HMI_Device"."PPM303"."Out" AND "HMI_Device"."AVM362"."Out" AND "DI_Flr1_PROD_ok", PT := T#20S); // TODO: Declarar #TON_INSTANCE_29 : TON;
|
||||||
|
|
||||||
|
"gFlowToFiller" := #TON_INSTANCE_29.Q;
|
||||||
|
|
||||||
|
// Network 18: Calculates blender target production Set Point TO track Filler. (Original Language: LAD)
|
||||||
|
// Calculates blender target production Set Point TO track Filler.
|
||||||
|
|
||||||
|
"Aux_calc1" := "Blender_Variables"."gBlenderFillerDeltaV" / 4.0;
|
||||||
|
|
||||||
|
"mTemp" := "Blender_Variables"."gActual_Prod_SP" + "Aux_calc1";
|
||||||
|
|
||||||
|
// Network 19: Blender Filler Production Rate difference - L/min - (Original Language: LAD)
|
||||||
|
|
||||||
|
"Aux_calc1" := "Blender_Variables"."gSP_ProdTrackFiller" - "mTemp";
|
||||||
|
|
||||||
|
// Network 20: Product Tank Bottom Volume Below level Probe (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gWorkshopTest" THEN
|
||||||
|
SpeedAdjust(i_IstLvl := "Blender_Constants"."gTM301TargetL_Ist", i_PrdTnkLvl := "HMI_Instrument"."LTM302"."PVFiltered", i_SpeedPerc := "Blender_Constants"."gTM301LvlPercRange", i_TrgTnkLvl := "Blender_Variables"."gProdTankTargetLvl");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gWorkshopTest" THEN
|
||||||
|
"mSpeedPerc" := 1.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"mDummy" := "gWorkshopTest";
|
||||||
|
|
||||||
|
// Network 21: Speed Perc (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gWorkshopTest" AND "AUX TRUE" THEN
|
||||||
|
SpeedAdjust(i_IstLvl := "Blender_Constants"."gTM301TargetL_Ist", i_PrdTnkLvl := "HMI_Instrument"."LTM302"."PVFiltered", i_SpeedPerc := "Blender_Constants"."gTM301LvlPercRange", i_TrgTnkLvl := "Blender_Variables"."gProdTankTargetLvl");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gWorkshopTest" AND "AUX TRUE" THEN
|
||||||
|
"mSpeedPerc" := 1.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 22: Estimated Filler Speed (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "mFillerTracked" THEN
|
||||||
|
"mFillerSpeedFilter"(i_Enable := "gBlenderBlending" AND "gBlenderStableFlow", i_Num := 10, i_Value := "mTemp");
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 23: Estimated Flow (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" THEN
|
||||||
|
"mFillerEstimatedFlow" := "Filler_Head_Variables"."Prod_FlowEstimatedSlw";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" THEN
|
||||||
|
"mFillerEstimatedFlow" := "Blender_Variables"."gEstimateFillerSpeed";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 24: Estimated Flow (Original Language: LAD)
|
||||||
|
|
||||||
|
IF NOT "gTrackFillerSpeed" OR NOT "gEnRampDownToStop" THEN
|
||||||
|
"mFillerEstimatedFlow" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_ProductionRate";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 25: L / min (Original Language: LAD)
|
||||||
|
|
||||||
|
"Blender_Variables"."gSP_ProdTrackFiller" := "mFillerEstimatedFlow" * "mSpeedPerc";
|
||||||
|
|
||||||
|
// Network 26: Analog Values (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Analog_Values"."BlenderProd" := "Blender_Variables"."gActual_Prod_SP";
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Analog_Values"."EstFillerProd" := "Blender_Variables"."gEstimateFillerSpeed";
|
||||||
|
|
||||||
|
"mDummy" := TRUE;
|
||||||
|
|
||||||
|
// Network 27: Speed Measuring Done (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Filler_Speed"."Done" := "Procedure_Variables"."Filler_Speed"."Latch" AND "Procedure_Variables"."Filler_Speed"."Request";
|
||||||
|
|
||||||
|
END_FUNCTION_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,115 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2040
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderRun_ProdTime" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
m1MinONS : Bool;
|
||||||
|
m1HourONS : Bool;
|
||||||
|
Buffer : Bool;
|
||||||
|
mRunMin : Bool;
|
||||||
|
mRunHr : Bool;
|
||||||
|
I_DIRunning_sec : DInt;
|
||||||
|
I_DIRunning_min : DInt;
|
||||||
|
MOD60 : DInt;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_60 : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Seconds (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Run"."Running" AND "CLK_1.0S" THEN
|
||||||
|
"Blender_Variables_Pers"."gSLIM_Sec" := "Blender_Variables_Pers"."gSLIM_Sec" + 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 2: Reset Hours (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "SLIM_Variables"."ResetHour" THEN
|
||||||
|
"Blender_Variables_Pers"."gSLIM_Sec" := 0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 3: Seconds Counter (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "CLK_1.0S" AND "gBlenderBlending" THEN
|
||||||
|
"Blender_Variables_Pers"."gProdSec" := "Blender_Variables_Pers"."gProdSec" + 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 4: Minute (Original Language: LAD)
|
||||||
|
|
||||||
|
"m1MinONS" := Eq("Blender_Variables_Pers"."gProdSec", 60);
|
||||||
|
|
||||||
|
// Network 5: Minute Counter (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "m1MinONS" THEN
|
||||||
|
"Blender_Variables_Pers"."gProdSec" := 0;
|
||||||
|
"Blender_Variables_Pers"."gProdMin" := "Blender_Variables_Pers"."gProdMin" + 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 6: Hour (Original Language: LAD)
|
||||||
|
|
||||||
|
"m1HourONS" := Eq("Blender_Variables_Pers"."gProdMin", 60);
|
||||||
|
|
||||||
|
// Network 7: Hour Counter (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "m1HourONS" THEN
|
||||||
|
"Blender_Variables_Pers"."gProdMin" := 0;
|
||||||
|
"Blender_Variables_Pers"."gProdHour" := "Blender_Variables_Pers"."gProdHour" + 1;
|
||||||
|
"Blender_Variables_Pers"."gBlendingMaintHour" := "Blender_Variables_Pers"."gBlendingMaintHour" + 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 8: Counter reset (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" OR "gBlenderRinseMode" THEN
|
||||||
|
"Blender_Variables_Pers"."gProdSec" := 0;
|
||||||
|
"Blender_Variables_Pers"."gProdMin" := 0;
|
||||||
|
"Blender_Variables_Pers"."gProdHour" := 0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 9: Running Seconds (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Run"."Running" AND "CLK_1.0S" THEN
|
||||||
|
"Blender_Variables_Pers"."gRunningSeconds" := "Blender_Variables_Pers"."gRunningSeconds" + 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 10: Running Minutes (Original Language: LAD)
|
||||||
|
|
||||||
|
"I_DIRunning_sec" := "Blender_Variables_Pers"."gRunningSeconds";
|
||||||
|
|
||||||
|
"MOD60" := "I_DIRunning_sec" MOD DINT#60;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Run"."Running" AND "CLK_1.0S" AND Eq("MOD60", DINT) THEN
|
||||||
|
"Blender_Variables_Pers"."gRunningMinutes" := "Blender_Variables_Pers"."gRunningMinutes" + 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 42
|
||||||
|
"M19012" := Eq("MOD60", DINT); // P_TRIG(Eq("MOD60", DINT)) - Mem: "M19012"
|
||||||
|
|
||||||
|
"mRunMin" := NOT "M19012" AND Eq("MOD60", DINT);
|
||||||
|
"M19012" := Eq("MOD60", DINT); // P_TRIG(Eq("MOD60", DINT)) - Mem: "M19012"
|
||||||
|
|
||||||
|
// Network 11: Running Hours for Maintenance (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "mRunMin" THEN
|
||||||
|
"I_DIRunning_min" := "Blender_Variables_Pers"."gRunningMinutes";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "mRunMin" THEN
|
||||||
|
"MOD60" := "I_DIRunning_min" MOD DINT#60;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF Eq("MOD60", DINT) THEN
|
||||||
|
"Blender_Variables_Pers"."gRunningMaintHour" := "Blender_Variables_Pers"."gRunningMaintHour" + 1;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 12: Running Hours for Maintenance (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."System"."BlendingMaintHour" := "Blender_Variables_Pers"."gRunningMaintHour";
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,48 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2041
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderRun_Stopping" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Request (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Stop"."Request" := "gIN_StopBtn" OR "gBlenderAlarm";
|
||||||
|
|
||||||
|
// Network 2: Latch (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Stop"."Latch" := ("Procedure_Variables"."Blender_Stop"."Request" AND "Procedure_Variables"."Blender_Run"."Latch" AND "Procedure_Variables"."Blender_Stop"."Done" AND "gBlenderSuppliesOk") OR ("Procedure_Variables"."Blender_Stop"."Latch" AND "Procedure_Variables"."Blender_Run"."Latch" AND "Procedure_Variables"."Blender_Stop"."Done" AND "gBlenderSuppliesOk");
|
||||||
|
|
||||||
|
// Network 3: OperatorStop (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 3 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 4: Stop Done Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Stop"."Done" THEN
|
||||||
|
"Procedure_Variables"."Blender_Stop"."Done" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 5: Stop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gEnRampDownToStop" := ("Blender_Variables_Pers"."gWaterRecipe" AND "HMI_PID"."RMM303"."ManualControl"."ManOut" AND "HMI_PID"."RMM301"."ManualControl"."ManOut") OR ("Blender_Variables_Pers"."gWaterRecipe" AND "Blender_Variables_Pers"."gCarboStillProduct" AND "HMI_PID"."RMM301"."ManualControl"."ManOut") OR ("HMI_PID"."RMM303"."ManualControl"."ManOut" AND "HMI_PID"."RMM301"."ManualControl"."ManOut" AND "HMI_PID"."RMP302"."ManualControl"."ManOut") OR ("Blender_Variables_Pers"."gCarboStillProduct" AND "HMI_PID"."RMM301"."ManualControl"."ManOut" AND "HMI_PID"."RMP302"."ManualControl"."ManOut");
|
||||||
|
|
||||||
|
// Network 6: Stop Done (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderStopping" AND "gEnRampDownToStop" AND "gFTN301_SpeedToStop" THEN
|
||||||
|
"Procedure_Variables"."Blender_Stop"."Done" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 7: Stop Done (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderStopping" AND "gEnRampDownToStop" THEN
|
||||||
|
"Procedure_Variables"."Blender_Stop"."Done" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,247 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 2015
|
||||||
|
// Original Network Languages: STL, LAD
|
||||||
|
|
||||||
|
FUNCTION "BlenderRun__Control" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
Buffer : Bool;
|
||||||
|
mInitBlendError : Bool;
|
||||||
|
gRunningMaintHour : DInt;
|
||||||
|
MOD_DI_OUT_Seg31 : DInt;
|
||||||
|
gCheckOilModValves : DInt;
|
||||||
|
gCheckOilWaterPumpMotor : DInt;
|
||||||
|
MOD_DI_OUT_Seg33 : DInt;
|
||||||
|
mRealEnRecPHE01 : Real;
|
||||||
|
mRealEnRecPHE02 : Real;
|
||||||
|
__PlcmigTempFillBits_30B0 : Array[0..7] of Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_2S : Bool; // Auto-generated temporary
|
||||||
|
#_2m : Bool; // Auto-generated temporary
|
||||||
|
#_3S : Bool; // Auto-generated temporary
|
||||||
|
#_4M : Bool; // Auto-generated temporary
|
||||||
|
#_5M : Bool; // Auto-generated temporary
|
||||||
|
#_5m : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Buffer (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderRun_SelectConstan();
|
||||||
|
|
||||||
|
BlenderRun_ProdTime();
|
||||||
|
|
||||||
|
"Buffer" := TRUE;
|
||||||
|
|
||||||
|
// Network 2: Qualifier (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Run"."Qualifier" := ("gBlenderProdMode" AND "gProductionONS" AND "gHighPriorityAlarm" AND "Procedure_Variables"."Blender_Rinse"."ONS_Done") OR ("gBlenderProdMode" AND "gProductionONS" AND "gHighPriorityAlarm" AND "System_RunOut_Variables"."FastChangeOverActivated") OR ("gBlenderCIPMode" AND "gCIPONS" AND "gHighPriorityAlarm" AND "Procedure_Variables"."Blender_Rinse"."ONS_Done") OR ("gBlenderCIPMode" AND "gCIPONS" AND "gHighPriorityAlarm" AND "System_RunOut_Variables"."FastChangeOverActivated");
|
||||||
|
|
||||||
|
// Network 3: Blender Run Stopping (Original Language: LAD)
|
||||||
|
|
||||||
|
BlenderRun_Stopping();
|
||||||
|
|
||||||
|
// Network 4: Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Run"."Reset" := ("gBlenderProdMode" AND "Procedure_Variables"."TM301_RunOut"."Done" AND "HMI_Variables_Status"."System_Run_Out"."SystemRunOutEnabled" AND "System_RunOut_Variables"."System_RunOut"."Reset" AND "gBlenderRinseMode") OR ("gBlenderProdMode" AND "Procedure_Variables"."TM301_RunOut"."Done" AND "HMI_Variables_Status"."System_Run_Out"."SystemRunOutEnabled" AND "gBlenderRinseMode" AND "System_RunOut_Variables"."FastChangeOverActivated") OR ("gBlenderProdMode" AND "HMI_Variables_Status"."System_Run_Out"."SystemRunOutEnabled" AND "System_RunOut_Variables"."System_RunOut"."Reset" AND "gBlenderRinseMode" AND "Procedure_Variables"."TM301_RunOut"."Latch") OR ("gBlenderProdMode" AND "HMI_Variables_Status"."System_Run_Out"."SystemRunOutEnabled" AND "gBlenderRinseMode" AND "System_RunOut_Variables"."FastChangeOverActivated" AND "Procedure_Variables"."TM301_RunOut"."Latch");
|
||||||
|
|
||||||
|
// Network 5: Request (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"M19007" := "gIN_StartBtn" AND "mEnableStartTmr"; // P_TRIG("gIN_StartBtn" AND "mEnableStartTmr") - Mem: "M19007"
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Run"."Request" := "gIN_StartBtn" AND "mEnableStartTmr" AND "Procedure_Variables"."Blender_Run"."Qualifier" AND NOT "M19007";
|
||||||
|
|
||||||
|
// Network 6: Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Run"."Latch" := ("Procedure_Variables"."Blender_Run"."Qualifier" AND "Procedure_Variables"."Blender_Run"."Request" AND "FirstScan" AND "Procedure_Variables"."Blender_Run"."Reset" AND "Procedure_Variables"."Blender_Run"."Done") OR ("Procedure_Variables"."Blender_Run"."Qualifier" AND "DI_PB_Machine_Start" AND "FirstScan" AND "Procedure_Variables"."Blender_Run"."Reset" AND "Procedure_Variables"."Blender_Run"."Done");
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."System"."Blender_Running" := ("Procedure_Variables"."Blender_Run"."Qualifier" AND "Procedure_Variables"."Blender_Run"."Request" AND "FirstScan" AND "Procedure_Variables"."Blender_Run"."Reset" AND "Procedure_Variables"."Blender_Run"."Done") OR ("Procedure_Variables"."Blender_Run"."Qualifier" AND "DI_PB_Machine_Start" AND "FirstScan" AND "Procedure_Variables"."Blender_Run"."Reset" AND "Procedure_Variables"."Blender_Run"."Done");
|
||||||
|
|
||||||
|
// Network 7: EnableStart (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 7 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 8: Blender Stopping (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 8 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 9: Wait (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Run"."Wait" := ("gBlenderProdMode" AND "Blender_Variables_Pers"."gWaterRecipe" AND "Procedure_Variables"."FTP302Line_Preparation"."Done" AND "gBlenderRinseMode") OR ("gBlenderProdMode" AND "Procedure_Variables"."First_Production"."Latch" AND "gPTM304_OkToRun" AND "gEqPressSelected" AND "gBlenderRinseMode") OR ("gBlenderProdMode" AND "Procedure_Variables"."First_Production"."Latch" AND "gEqPressOk" AND "gEqPressSelected" AND "gBlenderRinseMode");
|
||||||
|
|
||||||
|
// Network 10: Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Run"."Running" := "Procedure_Variables"."Blender_Run"."Latch" AND "Procedure_Variables"."Blender_Run"."Wait";
|
||||||
|
|
||||||
|
// Network 11: Pumps Start (Original Language: LAD)
|
||||||
|
|
||||||
|
"gBlenderStartPumps" := "Procedure_Variables"."Blender_Run"."Running";
|
||||||
|
|
||||||
|
// Network 12: Pumps Start ONS (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 26
|
||||||
|
"M19010" := "gBlenderStartPumps"; // P_TRIG("gBlenderStartPumps") - Mem: "M19010"
|
||||||
|
|
||||||
|
"gBlenderStartPumpsONS" := "gBlenderStartPumps" AND NOT "M19010";
|
||||||
|
"M19010" := "gBlenderStartPumps"; // P_TRIG("gBlenderStartPumps") - Mem: "M19010"
|
||||||
|
|
||||||
|
// Network 13: Blend Error Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."First_Production"."Latch" AND "gBlenderStartPumpsONS" AND "gProductChillerEn" THEN
|
||||||
|
"HMI_Variables_Status"."Analog_Values"."BlendError" := 0.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 14: Carbo Co2 Error Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."First_Production"."Latch" AND "gBlenderStartPumpsONS" AND "gProductChillerEn" AND "AUX FALSE" THEN
|
||||||
|
"Blender_Variables"."gCarboCO2Error" := 0.0;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 15: Blend Error (Original Language: LAD)
|
||||||
|
|
||||||
|
"mInitBlendError" := "gBlenderBlending" AND "gHighPriorityAlarm";
|
||||||
|
|
||||||
|
// Network 16: Blend Error (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "mInitBlendError" AND "gStopBlendCarboError" THEN
|
||||||
|
"Blender_Variables"."gBlendError" := "Blender_Variables"."gBlendError" + "Blender_Constants"."gBlendErrorAfterAlarm";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 17: Reset Started (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" OR "gBlenderRinseMode" THEN
|
||||||
|
"Blender_Variables_Pers"."gBlenderStarted" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 18: Started (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderProdMode" AND "gBlenderCIPMode" AND "gBlenderRinseMode" AND "Blender_Variables_Pers"."gFirstProdLatched" THEN
|
||||||
|
"Blender_Variables_Pers"."gBlenderStarted" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 19: DelayBlendEn (Original Language: LAD)
|
||||||
|
// Water Pump Rise Pressure TIME = 2.6 sec
|
||||||
|
|
||||||
|
"mDelayBlendEn"(IN := "gBlenderProdMode" AND "gBlenderRinseMode" AND "gBlenderStartPumps", PT := S5T#3S); // TODO: Declarar "mDelayBlendEn" : TON;
|
||||||
|
|
||||||
|
"gBlenderBlending" := "mDelayBlendEn".Q;
|
||||||
|
|
||||||
|
// Network 20: Stable Flow (Original Language: LAD)
|
||||||
|
|
||||||
|
"mWaitStableFlow"(IN := "gBlenderBlending", PT := S5T#2S); // TODO: Declarar "mWaitStableFlow" : TON;
|
||||||
|
|
||||||
|
"gBlenderStableFlow" := "mWaitStableFlow".Q;
|
||||||
|
|
||||||
|
// Network 21: Flow Filter Enable (Original Language: LAD)
|
||||||
|
// gBlenderFlowFltEn: Enables the Product Flow Filter, in order TO disable the
|
||||||
|
// filter itself during product ramp-up AND down
|
||||||
|
|
||||||
|
"gBlenderFlowFltEn" := "gBlenderStableFlow" OR ("Procedure_Variables"."Blender_Stop"."Latch" AND "gBlenderStopping" AND "gBlenderFlowFltEn");
|
||||||
|
|
||||||
|
// Network 22: EnToRamp (Original Language: LAD)
|
||||||
|
|
||||||
|
"mEnToRamp"(IN := "gBlenderStableFlow", PT := S5T#3S); // TODO: Declarar "mEnToRamp" : TON;
|
||||||
|
|
||||||
|
"gBlenderEnToRamp" := "mEnToRamp".Q;
|
||||||
|
|
||||||
|
// Network 23: EnCooler (Original Language: LAD)
|
||||||
|
|
||||||
|
"mEnCooler"(IN := "gBlenderProdMode" AND "gBlenderStartPumps", PT := S5T#2m); // TODO: Declarar "mEnCooler" : TON;
|
||||||
|
|
||||||
|
"PID_Variables"."PID_RVM319_H2O_EnInt" := "mEnCooler".Q;
|
||||||
|
|
||||||
|
"PID_Variables"."PID_RVM319_PRD_EnInt" := "mEnCooler".Q;
|
||||||
|
|
||||||
|
// Network 24: DlyOffRecirc (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 24 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 25: EnRecircPHE (Original Language: LAD)
|
||||||
|
|
||||||
|
"m_StartRecircPHE"(IN := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_CoolerControl" >= 2, PT := S5T#5M); // TODO: Declarar "m_StartRecircPHE" : TON;
|
||||||
|
|
||||||
|
IF "m_StartRecircPHE".Q THEN
|
||||||
|
"gEnRecircPHE" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 26: EnRecircPHE01 (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 26 ---
|
||||||
|
|
||||||
|
L "HMI_PID".RVM319_PRD.KP
|
||||||
|
L 0.0
|
||||||
|
NE_R
|
||||||
|
= "__PlcmigTempFillBits_30B0"[0]
|
||||||
|
A "__PlcmigTempFillBits_30B0"[0]
|
||||||
|
JNB _004
|
||||||
|
L "HMI_PID".RVM319_PRD.KP
|
||||||
|
T "mRealEnRecPHE01"
|
||||||
|
_004: NOP_0
|
||||||
|
A "__PlcmigTempFillBits_30B0"[0]
|
||||||
|
NEG
|
||||||
|
JNB _005
|
||||||
|
L 1
|
||||||
|
T "mRealEnRecPHE01"
|
||||||
|
_005: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 26 ---
|
||||||
|
|
||||||
|
// Network 27: EnRecircPHE02 (Original Language: LAD)
|
||||||
|
|
||||||
|
"mRealEnRecPHE02" := "HMI_PID.RVM319.Error" / "mRealEnRecPHE01";
|
||||||
|
|
||||||
|
// Network 28: EnRecircPHE Reset (Original Language: LAD)
|
||||||
|
|
||||||
|
"m_StopRecircPHE"(IN := "gEnRecircPHE", PT := S5T#5M); // TODO: Declarar "m_StopRecircPHE" : TON;
|
||||||
|
|
||||||
|
"mTON_Reset_RecircPHE_Goo"(IN := "mRealEnRecPHE02" <= 1.0, PT := S5T#4M); // TODO: Declarar "mTON_Reset_RecircPHE_Goo" : TON;
|
||||||
|
|
||||||
|
IF "HMI_Device"."AVM381"."Config" OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_CoolerControl" <= 1) THEN
|
||||||
|
"gEnRecircPHE" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 29: EnStopFromFiller (Original Language: LAD)
|
||||||
|
|
||||||
|
"mEnStopFromFillerTmr"(IN := "gBlenderBlending", PT := S5T#5m); // TODO: Declarar "mEnStopFromFillerTmr" : TON;
|
||||||
|
|
||||||
|
// Network 30: DelayToRestart (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 30 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 31: Check Oil in Modulating Valve (Original Language: LAD)
|
||||||
|
// Check Oil in Modulating Valve Recirculating Balls Screw
|
||||||
|
|
||||||
|
"gRunningMaintHour" := "Blender_Variables_Pers"."gRunningMaintHour";
|
||||||
|
|
||||||
|
"gCheckOilModValves" := "Blender_Constants"."gCheckOilModValves";
|
||||||
|
|
||||||
|
"MOD_DI_OUT_Seg31" := "gRunningMaintHour" MOD "gCheckOilModValves";
|
||||||
|
|
||||||
|
// Network 32: Check Oil in Modulating Valve (Original Language: LAD)
|
||||||
|
// Check Oil in Modulating Valve Recirculating Balls Screw
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := Ne(0, "Blender_Variables_Pers"."gRunningMaintHour");
|
||||||
|
|
||||||
|
// Network 33: Check Oil in Water Pump Motor (Original Language: LAD)
|
||||||
|
// Check Oil in Water Pump Motor
|
||||||
|
|
||||||
|
"gCheckOilWaterPumpMotor" := "Blender_Constants"."gCheckOilWaterPumpMotor";
|
||||||
|
|
||||||
|
"MOD_DI_OUT_Seg33" := "gRunningMaintHour" MOD "gCheckOilWaterPumpMotor";
|
||||||
|
|
||||||
|
// Network 34: Check Oil in Water Pump Motor (Original Language: LAD)
|
||||||
|
// Check Oil in Water Pump Motor
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := Ne(0, "Blender_Variables_Pers"."gRunningMaintHour");
|
||||||
|
|
||||||
|
// Network 35: Done (Original Language: LAD)
|
||||||
|
|
||||||
|
"Procedure_Variables"."Blender_Run"."Done" := ("Procedure_Variables"."Blender_Run"."Latch" AND "Procedure_Variables"."Blender_Stop"."Done" AND "Procedure_Variables"."Blender_Stop"."Latch") OR ("Procedure_Variables"."Blender_Run"."Latch" AND "Procedure_Variables"."Blender_Stop"."Request" AND "Procedure_Variables"."Blender_Stop"."Done" AND "gBlenderStopping") OR ("Procedure_Variables"."Blender_Run"."Latch" AND "Procedure_Variables"."Blender_Stop"."Request" AND "Procedure_Variables"."Blender_Stop"."Latch" AND "gBlenderCIPMode") OR ("Procedure_Variables"."Blender_Run"."Latch" AND "Procedure_Variables"."Blender_Stop"."Request" AND "gBlenderCIPMode" AND "gBlenderStopping");
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,102 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Number: 972
|
||||||
|
|
||||||
|
DATA_BLOCK "Blender_Constants"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
gP_Greek : Real := 3.141593;
|
||||||
|
gH2O_Density : Real := 1.0;
|
||||||
|
gCO2_Density : Real := 1.98;
|
||||||
|
gRMM303ValveCv : Real := 0.022;
|
||||||
|
gDens_Sucrose_1 : Real := 1.6055;
|
||||||
|
gDens_Sucrose : Real := 1.589;
|
||||||
|
gDens_Fructose : Real := 1.6055;
|
||||||
|
gCpSyrup : Real := 0.2145;
|
||||||
|
gCpH2O : Real := 1.0;
|
||||||
|
gAnalogMaxValue : Int := 27648;
|
||||||
|
gAnalogMaxValue_VFC : Int := 16384;
|
||||||
|
gZeroAbsolute : Real := 273.15;
|
||||||
|
gBlenderNominalSpeedAdj : Real := 1.05;
|
||||||
|
gFirstProdRinseTempSP : Real := 5.0;
|
||||||
|
gFirstProdSpeedGain : Real := 1.0;
|
||||||
|
gGoodSyrupDensThrsd : Real := 0.9999;
|
||||||
|
gGoodSyrupDensOffset : Real := 0.0014;
|
||||||
|
gSugaredSyrupBrixThrsd : Real := 20.548;
|
||||||
|
gBlendErrorAfterAlarm : Real := 0.0;
|
||||||
|
gRinseDrainOpPressValve : Real := 20.0;
|
||||||
|
gProdAmountInSerpentine : Real := 30.0;
|
||||||
|
gCIP_SP_DeltaT : Real := 5.0;
|
||||||
|
gCIP_CO2_DeareationValue : Real := 0.0;
|
||||||
|
gCIP_CO2_InjectionValue : Real := 15.0;
|
||||||
|
gPressCO2StartUpValue : Real := 0.25;
|
||||||
|
gMinProdAvailAmount : Real := 200.0;
|
||||||
|
gMaxProdAvailAmount : Real := 800.0;
|
||||||
|
gWaterLineTime : Int := 4;
|
||||||
|
gTP301PrepStep1Time : Int := 4;
|
||||||
|
gTP301PrepStep2Time : Int := 6;
|
||||||
|
gBlendFillStartUp_Step1 : Int := 16;
|
||||||
|
gBlendFillStartUp_Step2 : Int := 6;
|
||||||
|
gBlendFillStartUp_Step3 : Int := 2;
|
||||||
|
gBlendFillStartUp_Step4 : Int := 10;
|
||||||
|
gBlendFillStartUp_Step5 : Int := 10;
|
||||||
|
gBlendFillStartUp_Step6 : Int := 10;
|
||||||
|
gFoamCipEnable : Bool := FALSE;
|
||||||
|
gAir_Density : Real := 1.295;
|
||||||
|
gN2_Density : Real := 1.252;
|
||||||
|
Delta_Press_CO2_Test : Real := 2.0;
|
||||||
|
gSpare07 : Int := 0;
|
||||||
|
gSpare08 : Int := 0;
|
||||||
|
gTN301Pressure : Real := 0.05;
|
||||||
|
gTN301Efficiency : Real := 0.7;
|
||||||
|
gTN301VacuumPress : Real := -0.7;
|
||||||
|
gRVN304_Min : Real := 5.5;
|
||||||
|
gTN301VacuumIst : Real := 0.3;
|
||||||
|
gTM301PressIst : Real := 0.1;
|
||||||
|
gStopLvl_OnlyBlend : Real := 80.0;
|
||||||
|
gTargetLvl_OnlyBlend : Real := 60.0;
|
||||||
|
gStopLvl_BlendFill : Real := 60.0;
|
||||||
|
gTargetLvl_BlendFill : Real := 40.0;
|
||||||
|
gStartLvl_NormalSpeed : Real := 20.0;
|
||||||
|
gStartLvl_VeryLowSpeed : Real := 30.0;
|
||||||
|
gTM301PressWaitLvl : Real := 10.0;
|
||||||
|
gStartMeasFillerSpeedLvl : Real := 4.0;
|
||||||
|
gTM301TargetL_Ist : Real := 20.0;
|
||||||
|
gTM301LvlPercRange : Real := 18.0;
|
||||||
|
gTM301MinLvl : Real := 5.0;
|
||||||
|
gTP301ProdLvl : Real := 60.0;
|
||||||
|
gTP301FirstProdLvl : Real := 25.0;
|
||||||
|
gTP301CIPLvl : Real := 5.0;
|
||||||
|
gRVP303_Load : Real := 50.0;
|
||||||
|
gTP301_LvlSlewRate : Real := 2.0;
|
||||||
|
gTP301_FirstProdRate : Real := 40.0;
|
||||||
|
gFTN301_MinVel : Real := 0.8;
|
||||||
|
gWater_MinVel : Real := 1.4;
|
||||||
|
gModValveFullStrokeTime : Real := 12.0;
|
||||||
|
gProductionSlewRate : Real := 8.0;
|
||||||
|
gFillerSpeedTrackSlew : Real := 12.0;
|
||||||
|
gBrixTrackingMinCorr : Real := 0.01;
|
||||||
|
gBrixTrackingMaxCorr : Real := 0.2;
|
||||||
|
gTestSyrBrix : Real := 54.85;
|
||||||
|
gCheckOilModValves : Int := 2000;
|
||||||
|
gCheckOilWaterPumpMotor : Int := 2880;
|
||||||
|
gCO2TrackingMinCorr : Real := 0.01;
|
||||||
|
gCO2TrackingMaxCorr : Real := 0.2;
|
||||||
|
gBufferTankProbeHtD4_5_6 : Real := 1850.0;
|
||||||
|
gBufferTankProbeHtD7_8_9 : Real := 2000.0;
|
||||||
|
gSyrupSPRecFact : Real := 1.5;
|
||||||
|
gCO2SPRecFact : Real := 1.5;
|
||||||
|
gTN301ProdLvl : Real := 35.0;
|
||||||
|
gTN301_LvlSlewRate : Real := 2.0;
|
||||||
|
gBalaiageFlowIts : Real := 0.2;
|
||||||
|
gTM301_LvlSlewRate : Real := 2.0;
|
||||||
|
gTP301_RinseRate : Real := 40.0;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,185 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Number: 971
|
||||||
|
|
||||||
|
DATA_BLOCK "Blender_Variables"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
gProdTankStopLvl : Real := 40.0;
|
||||||
|
gProdTankTargetLvl : Real := 25.0;
|
||||||
|
gProdTankStartLvl : Real := 20.0;
|
||||||
|
gSyrupMFMBrixSlope : Real := 0.0;
|
||||||
|
gH2O_Flow_Meas : Real := 0.0;
|
||||||
|
gSYR_Flow_Meas : Real := 0.0;
|
||||||
|
gSYR_Vol_Flow_Meas : Real := 0.0;
|
||||||
|
gCO2_Flow_Meas : Real := 0.0;
|
||||||
|
gProd_Flow_Meas : Real := 0.0;
|
||||||
|
gCO2Solubility : Real := 0.5889701;
|
||||||
|
gDeairCO2Vol : Real := 0.6569746;
|
||||||
|
gFillerCO2Loss : Real := 0.15;
|
||||||
|
gCO2EqPressure : Real := 2.755885;
|
||||||
|
gCO2InjPressureCalc : Real := 10.0;
|
||||||
|
gProductLiters : Real := 87.11034;
|
||||||
|
gProductTemperature : Real := 0.0;
|
||||||
|
gBlendError : Real := 10.0;
|
||||||
|
gCarboCO2Error : Real := 87.14999;
|
||||||
|
gK_RecBlendError : Real := 5.0;
|
||||||
|
gK_RecCarboCO2Error : Real := 5.0;
|
||||||
|
gMaxCarboCO2_V : Real := 7.92015;
|
||||||
|
gWaterFlowSlewValve : Real := 0.0;
|
||||||
|
gWaterFlowSlewMFM : Real := 0.0;
|
||||||
|
gDeairCO2Comp : Real := 0.5069746;
|
||||||
|
gWaterO2 : Real := 9.074822;
|
||||||
|
gDeairWaterO2 : Real := 0.0;
|
||||||
|
gSyrupO2 : Real := 4.556799;
|
||||||
|
gProductO2 : Real := 0.8366871;
|
||||||
|
gProductDensity : Real := 1.075568;
|
||||||
|
gProdDensFromMeter : Real := 1.0;
|
||||||
|
gTankProdAmount : Real := 108.361;
|
||||||
|
gPrdTankPressError : Real := -0.0853588;
|
||||||
|
gH2OValveRiseUpTime : Int := 2;
|
||||||
|
gFillerProductFlow : Real := 0.0;
|
||||||
|
gWaterVFM_DN : Int := 50;
|
||||||
|
gWaterPipe_DN : Int := 80;
|
||||||
|
gSyrupMFM_DN : Int := 40;
|
||||||
|
gCarboCO2MFM_DN : Int := 15;
|
||||||
|
gWaterVFMMeasError : Real := 0.2;
|
||||||
|
gWaterVFMRepeatibility : Real := 0.1;
|
||||||
|
gWaterVFMCalcError : Real := 0.4721645;
|
||||||
|
gSyrupMFMMeasError : Real := 0.1;
|
||||||
|
gSyrupMFMRepeatibility : Real := 0.05;
|
||||||
|
gSyrupMFMZeroStab : Real := 2.25;
|
||||||
|
gSyrupMFMCalcError : Real := 0.2303126;
|
||||||
|
gCO2MFMMeasError : Real := 0.5;
|
||||||
|
gCO2MFMRepeatibility : Real := 0.25;
|
||||||
|
gCO2MFMZeroStab : Real := 0.325;
|
||||||
|
gCO2MFMCalcError : Real := 6.144543;
|
||||||
|
gFirstProdExtraBrix : Real := 0.15;
|
||||||
|
gFirstProdDietExtraSyr : Real := 0.002;
|
||||||
|
gFirstProdExtraCO2Fact : Real := 1.05;
|
||||||
|
gBlenderBlendMaxError : Real := 0.0;
|
||||||
|
gWaterVFM_Area : Real := 0.1963496;
|
||||||
|
gWaterVFM_Vel : Real := 0.0;
|
||||||
|
gWaterPipe_Area : Real := 0.5026549;
|
||||||
|
gWaterPipe_Vel : Real := 1.652169;
|
||||||
|
gWaterSpeedToStopError : Real := 4.229551;
|
||||||
|
gProdTankVolume : Real := 2170.0;
|
||||||
|
gProdTankBottomVol : Real := 105.0;
|
||||||
|
gDeairTankVolume : Real := 1150.0;
|
||||||
|
gBlenderNomSpeed : Real := 630.0;
|
||||||
|
gBlenderProdSlewMax : Real := 52.5;
|
||||||
|
gProductLitTank : Real := 108.4153;
|
||||||
|
gProductO2Conc : Real := 0.0;
|
||||||
|
gBlenderFillerDeltaV : Real := 0.0;
|
||||||
|
gSP_ProdTrackFiller : Real := 350.0;
|
||||||
|
gEstimateFillerSpeed : Real := 0.0;
|
||||||
|
gFlowTronic : Real := 1000.0;
|
||||||
|
gFlowTronicFullScale : Real := 100.0;
|
||||||
|
gActualGasFactor : Real := 1.235718;
|
||||||
|
gWaterStat_MeanValue : Real := 0.0;
|
||||||
|
gWaterStat_Variance : Real := 0.0;
|
||||||
|
gWaterStat_DevStd : Real := 0.1527207;
|
||||||
|
gSyrupStat_MeanValue : Real := 0.0;
|
||||||
|
gSyrupStat_Variance : Real := 0.0;
|
||||||
|
gSyrupStat_DevStd : Real := 0.3818018;
|
||||||
|
gCarboCO2Stat_MeanValue : Real := 0.0;
|
||||||
|
gCarboCO2Stat_Variance : Real := 0.0;
|
||||||
|
gCarboCO2Stat_DevStd : Real := 0.8522521;
|
||||||
|
gProdBxStat_MeanValue : Real := 0.0;
|
||||||
|
gProdBxStat_Variance : Real := 0.0;
|
||||||
|
gProdBxStat_DevStd : Real := 0.0;
|
||||||
|
gProdCO2Stat_MeanValue : Real := 0.0;
|
||||||
|
gProdCO2Stat_Variance : Real := 0.0;
|
||||||
|
gProdCO2Stat_DevStd : Real := 0.0;
|
||||||
|
gProdTankBrix : Real := 0.0;
|
||||||
|
gFlowProdBrix : Real := 12.47313;
|
||||||
|
gBrixTrackingCorr : Real := 0.0;
|
||||||
|
gCO2TrackingCorr : Real := 0.0;
|
||||||
|
gProdRunSyrFact : Real := 1.0;
|
||||||
|
gProdRunSyrMFMFact : Real := 1.0;
|
||||||
|
gActualSyrupDens : Real := 1.237;
|
||||||
|
gActualSyrupBrix : Real := 51.37;
|
||||||
|
gActualSyrupPerc : Real := 0.1836129;
|
||||||
|
gActualWaterPerc : Real := 0.8163871;
|
||||||
|
gSyrupVolFlow_PV : Real := 129.1715;
|
||||||
|
gProductRecipeNum : Int := 0;
|
||||||
|
gProductBrix : Real := 0.0;
|
||||||
|
gProductDens : Real := 0.0;
|
||||||
|
gProductCO2 : Real := 0.0;
|
||||||
|
gProductTemp : Real := 0.0;
|
||||||
|
gProductLinePress : Real := 0.0;
|
||||||
|
gMeterSyrBrix : Real := 5.0;
|
||||||
|
gMeterSyrDens : Real := 0.8;
|
||||||
|
gMeterSyrTemp : Real := 18.69626;
|
||||||
|
gSP_H2O : Real := 0.0;
|
||||||
|
gSP_SYR : Real := 0.0;
|
||||||
|
gSP_CO2 : Real := 0.0;
|
||||||
|
gSP_SYR_Level : Real := 25.0;
|
||||||
|
gSP_Prod_Temperature : Real := 0.0;
|
||||||
|
gSP_H2O_Temperature : Real := 0.0;
|
||||||
|
gActual_Prod_SP : Real := 0.0;
|
||||||
|
gActual_SP_CO2 : Real := 3.464378;
|
||||||
|
gActual_Prod_Flow : Real := 0.0;
|
||||||
|
gActual_Ratio : Real := 3.857526;
|
||||||
|
gActual_RatioM : Real := 4.446241;
|
||||||
|
gActual_CO2_Vol : Real := 0.0;
|
||||||
|
gInUVLampReady : Bool := TRUE;
|
||||||
|
gInUVLampAlarm : Bool := FALSE;
|
||||||
|
gBufferTankProbeHeight : Real := 2000.0;
|
||||||
|
gMinProduction : Real := 315.0;
|
||||||
|
gSyrSPRef : Real := 135.8833;
|
||||||
|
gSyrSPTemp : Real := 50.0;
|
||||||
|
gCO2SPRef : Real := 0.0;
|
||||||
|
gCO2SPTemp : Real := 0.0;
|
||||||
|
gCO2SPTemp2 : Real := 0.0;
|
||||||
|
gSP_DEAIR_Level : Real := 15.0;
|
||||||
|
gActual_SP_GAS2 : Real := 0.0;
|
||||||
|
gSP_GAS2 : Real := 0.0;
|
||||||
|
gGAS2Stat_MeanValue : Real := 0.0;
|
||||||
|
gGAS2Stat_Variance : Real := 0.0;
|
||||||
|
gGAS2Stat_DevStd : Real := 0.0;
|
||||||
|
gBalaiageFlowError : Real := 3.5;
|
||||||
|
gSP_STORAGE_Level : Real := 25.0;
|
||||||
|
Aux_RVN302_PID : STRUCT
|
||||||
|
ConfigPID : Bool := FALSE;
|
||||||
|
Hold_Int : Bool := FALSE;
|
||||||
|
I_ITL : Bool := FALSE;
|
||||||
|
Alarm : Bool := FALSE;
|
||||||
|
Spare0_4 : Bool := FALSE;
|
||||||
|
Spare0_5 : Bool := FALSE;
|
||||||
|
Spare0_6 : Bool := FALSE;
|
||||||
|
Config : Bool := FALSE;
|
||||||
|
PID_FIX : Bool := FALSE;
|
||||||
|
Spare1_1 : Bool := FALSE;
|
||||||
|
High_Limit : Bool := FALSE;
|
||||||
|
Low_Limit : Bool := FALSE;
|
||||||
|
ManualControl : "Struct";
|
||||||
|
Bp : Real := 0.0;
|
||||||
|
Ti : Real := 0.0;
|
||||||
|
Td : Real := 0.0;
|
||||||
|
Ff : Real := 0.0;
|
||||||
|
KP : Real := 0.0;
|
||||||
|
Pv : Real := 0.0;
|
||||||
|
OutMan : Real := 0.0;
|
||||||
|
Lsp : Real := 0.0;
|
||||||
|
OutMaxHmi : Real := 0.0;
|
||||||
|
OutMin : Real := 0.0;
|
||||||
|
OutMax : Real := 100.0;
|
||||||
|
Spare52 : Real := 0.0;
|
||||||
|
FfOut : Real := 0.0;
|
||||||
|
Sp : Real := 0.0;
|
||||||
|
Out : Real := 0.0;
|
||||||
|
Cycle_Time : Real := 0.0;
|
||||||
|
I_ITLVAL : Real := 0.0;
|
||||||
|
Dead_Band : Real := 0.0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,51 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Number: 970
|
||||||
|
|
||||||
|
DATA_BLOCK "Blender_Variables_Pers"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
gBlenderStarted : Bool := FALSE;
|
||||||
|
gWaterRecipe : Bool := FALSE;
|
||||||
|
gSugarBeverage : Bool := TRUE;
|
||||||
|
gCarboStillProduct : Bool := TRUE;
|
||||||
|
gCarboStillRecipe : Bool := TRUE;
|
||||||
|
gSkipDeaireation : Bool := FALSE;
|
||||||
|
gCoolerEnabled : Bool := TRUE;
|
||||||
|
gWaterTotal : Real := 0.0;
|
||||||
|
gSyrupTotal : Real := 0.0;
|
||||||
|
gCO2Total : Real := 0.0;
|
||||||
|
gProductVFMTotal : Real := 0.0;
|
||||||
|
gWaterTempTot : Real := 0.0;
|
||||||
|
gSyrupTempTot : Real := 0.0;
|
||||||
|
gCO2TempTot : Real := 0.0;
|
||||||
|
gProductVFMTempTot : Real := 0.0;
|
||||||
|
gSyrRunOutCountInit : Real := 0.0;
|
||||||
|
gSyrLinePrepCountInit : Real := 712.3425;
|
||||||
|
gSyrupRoomTankLiter : Array[1..15] of Real := [20.0, 320.0, 320.0, 0.0, 0.0, 305.0, 300.0, 310.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0];
|
||||||
|
gProdSec : Int := 0;
|
||||||
|
gProdMin : Int := 0;
|
||||||
|
gProdHour : Int := 0;
|
||||||
|
gBlendingMaintHour : Int := 598;
|
||||||
|
gRunningSeconds : Int := -11410;
|
||||||
|
gRunningMinutes : Int := -16542;
|
||||||
|
gRunningMaintHour : Int := 820;
|
||||||
|
gSLIM_Sec : Int := -11410;
|
||||||
|
gSLIM_Min : Int := 0;
|
||||||
|
gSLIM_Hour : Int := 0;
|
||||||
|
gFillerRinse_DoneLatch : Bool := FALSE;
|
||||||
|
gFirstProdLatched : Bool := FALSE;
|
||||||
|
Spare00 : Int := 0;
|
||||||
|
Spare01 : Int := 0;
|
||||||
|
Procedure_DONE : "Struct";
|
||||||
|
SystemRunOut : "Struct";
|
||||||
|
SyrupBrix_Aux : Real := 51.37;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,20 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "Blocco_1" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 1 has no logic elements.
|
||||||
|
|
||||||
|
// No executable logic generated by script.
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,46 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Number: 5000
|
||||||
|
|
||||||
|
DATA_BLOCK "Blocco_dati_Test"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
Test_1 : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
Static_1 : STRUCT
|
||||||
|
Raw : Bool := FALSE;
|
||||||
|
Filtered : Bool := FALSE;
|
||||||
|
Wait : Bool := FALSE;
|
||||||
|
Spare03 : Bool := FALSE;
|
||||||
|
Spare04 : Bool := FALSE;
|
||||||
|
Spare05 : Bool := FALSE;
|
||||||
|
Spare06 : Bool := FALSE;
|
||||||
|
Config : Bool := FALSE;
|
||||||
|
DelayOnSP : Int := 0;
|
||||||
|
DelayOffSP : Int := 0;
|
||||||
|
DelayOn : Int := 0;
|
||||||
|
DelayOff : Int := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,79 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 61
|
||||||
|
// Original Network Languages: STL
|
||||||
|
|
||||||
|
FUNCTION "Block_compare" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_INPUT
|
||||||
|
DB_source : Int;
|
||||||
|
DB_dest : Int;
|
||||||
|
Start_source : Int;
|
||||||
|
Start_dest : Int;
|
||||||
|
Nr_byte : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_OUTPUT
|
||||||
|
mDifference : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
DBNUM_Source : Word;
|
||||||
|
DBNUM_Dest : Word;
|
||||||
|
Pointer_Source : DWord;
|
||||||
|
Pointer_Dest : DWord;
|
||||||
|
Loop_Count : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Byte Compare (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
CLR
|
||||||
|
= "mDifference"
|
||||||
|
|
||||||
|
L "DB_source"
|
||||||
|
T "DBNUM_Source"
|
||||||
|
L "DB_dest"
|
||||||
|
T "DBNUM_Dest"
|
||||||
|
|
||||||
|
L P#0.0
|
||||||
|
L "Start_source"
|
||||||
|
SLD 3
|
||||||
|
ADD_D
|
||||||
|
T "Pointer_Source"
|
||||||
|
|
||||||
|
L P#0.0
|
||||||
|
L "Start_dest"
|
||||||
|
SLD 3
|
||||||
|
ADD_D
|
||||||
|
T "Pointer_Dest"
|
||||||
|
|
||||||
|
LAR1 "Pointer_Source"
|
||||||
|
LAR2 "Pointer_Dest"
|
||||||
|
L "Nr_byte"
|
||||||
|
m001: T "Loop_Count"
|
||||||
|
AUF DBB[AR?,P#0.0]
|
||||||
|
L DBB[AR1,P#0.0]
|
||||||
|
AUF DBB[AR?,P#0.0]
|
||||||
|
L DBB[AR2,P#0.0]
|
||||||
|
NE_I
|
||||||
|
ADDAR1 P#1.0
|
||||||
|
ADDAR2 P#1.0
|
||||||
|
JC diff
|
||||||
|
L "Loop_Count"
|
||||||
|
LOOP m001
|
||||||
|
JU end
|
||||||
|
diff: SET
|
||||||
|
= "mDifference"
|
||||||
|
end: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,77 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 60
|
||||||
|
// Original Network Languages: STL
|
||||||
|
|
||||||
|
FUNCTION "Block_move" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_INPUT
|
||||||
|
DB_source : Int;
|
||||||
|
DB_dest : Int;
|
||||||
|
Start_source : Int;
|
||||||
|
Start_dest : Int;
|
||||||
|
Nr_byte : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
DBNUM_Source : Word;
|
||||||
|
DBNUM_Dest : Word;
|
||||||
|
Pointer_Source : DWord;
|
||||||
|
Pointer_Dest : DWord;
|
||||||
|
mSource_Dint : DInt;
|
||||||
|
mDest_Dint : DInt;
|
||||||
|
Loop_Count : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Byte Transfert (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
L "Start_source"
|
||||||
|
T "mSource_Dint"
|
||||||
|
|
||||||
|
L "Start_dest"
|
||||||
|
T "mDest_Dint"
|
||||||
|
|
||||||
|
L 0
|
||||||
|
T "Loop_Count"
|
||||||
|
|
||||||
|
L "DB_source"
|
||||||
|
T "DBNUM_Source"
|
||||||
|
L "DB_dest"
|
||||||
|
T "DBNUM_Dest"
|
||||||
|
|
||||||
|
L P#0.0
|
||||||
|
L "mSource_Dint"
|
||||||
|
SLD 3
|
||||||
|
ADD_D
|
||||||
|
T "Pointer_Source"
|
||||||
|
|
||||||
|
L P#0.0
|
||||||
|
L "mDest_Dint"
|
||||||
|
SLD 3
|
||||||
|
ADD_D
|
||||||
|
T "Pointer_Dest"
|
||||||
|
|
||||||
|
LAR1 "Pointer_Source"
|
||||||
|
LAR2 "Pointer_Dest"
|
||||||
|
L "Nr_byte"
|
||||||
|
m001: T "Loop_Count"
|
||||||
|
AUF DBB[AR?,P#0.0]
|
||||||
|
L DBB[AR1,P#0.0]
|
||||||
|
AUF DBB[AR?,P#0.0]
|
||||||
|
T DBB[AR2,P#0.0]
|
||||||
|
ADDAR1 P#1.0
|
||||||
|
ADDAR2 P#1.0
|
||||||
|
L "Loop_Count"
|
||||||
|
LOOP m001
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,159 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1933
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
// Block Comment:
|
||||||
|
// The following PROGRAM handle the CIP software modules. The module interface is
|
||||||
|
// the Standard one: Qualifier,Request, Latch, Wait, Reset (Inizialize) AND Done.
|
||||||
|
// Qualifier: (Level Signal) Qualify the module TO be executed; all the conditions
|
||||||
|
// that enable the module TO run must be included in the Qualifier.
|
||||||
|
// Request: (Pulse ONS) Request TO execute the module.
|
||||||
|
// Latch: (Level Signal) IF the Qualifier is enabled AND the module is NOT already
|
||||||
|
// executed AND is NOT Reset, than the Latch latches UNTIL th Done OR the Reset
|
||||||
|
// comes.
|
||||||
|
// Done: (Level Signal) Is Setted as soon as the module complete its functions,
|
||||||
|
// AND
|
||||||
|
// staies On UNTIL next Reset.
|
||||||
|
|
||||||
|
FUNCTION "CIPLocal" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mNewProgram : Bool;
|
||||||
|
mRET_VAL : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_3M : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."CIP_Run"."Qualifier" := "gBlenderCIPMode" AND "gBlenderSuppliesOk" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP";
|
||||||
|
|
||||||
|
// Network 2: CIP Inizialized Signal (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"mRequestTP" := "gIN_StartBtn"; // P_TRIG("gIN_StartBtn") - Mem: "mRequestTP"
|
||||||
|
|
||||||
|
IF "gIN_StartBtn" AND "CIP_Program_Variables"."CIP_Run"."Qualifier" AND NOT "mRequestTP" THEN
|
||||||
|
"CIP_Program_Variables"."Status"."Inizialized" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."CIP_Run"."Request" := "gIN_StartBtn" AND "CIP_Program_Variables"."CIP_Run"."Qualifier" AND NOT "mRequestTP";
|
||||||
|
|
||||||
|
// Network 3: MIX - Air and CO2 pressure ok and auxiliary ok (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 3 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 4: MIX - CIP Local (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 4 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 5: (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Local_CIP_Variables"."Cip_Commands"."_RunPause" := "CIP_Program_Variables"."CIP_Run"."Latch" AND "HMI_Local_CIP_Variables"."Cip_Commands"."_ProgPause";
|
||||||
|
|
||||||
|
// Network 6: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."CIP_Run"."Wait" := ("gBlenderCIPMode" AND "Procedure_Variables"."Blender_Run"."Wait") OR ("gBlenderCIPMode" AND "HMI_Local_CIP_Variables"."Cip_Commands"."_RunPause");
|
||||||
|
|
||||||
|
// Network 7: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."CIP_Run"."Latch" := ("CIP_Program_Variables"."CIP_Run"."Request" AND "CIP_Program_Variables"."CIP_Run"."Reset" AND "gBlenderAlarm" AND "CIP_Program_Variables"."CIP_Run"."Done") OR ("CIP_Program_Variables"."CIP_Run"."Reset" AND "gBlenderAlarm" AND "CIP_Program_Variables"."CIP_Run"."Done" AND "CIP_Program_Variables"."CIP_Run"."Latch");
|
||||||
|
|
||||||
|
IF ("CIP_Program_Variables"."CIP_Run"."Request" AND "CIP_Program_Variables"."CIP_Run"."Reset" AND "gBlenderAlarm" AND "CIP_Program_Variables"."CIP_Run"."Done" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Report") OR ("CIP_Program_Variables"."CIP_Run"."Reset" AND "gBlenderAlarm" AND "CIP_Program_Variables"."CIP_Run"."Done" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Report" AND "CIP_Program_Variables"."CIP_Run"."Latch") THEN
|
||||||
|
"CIPReportDB"."General"."AuxReportCipStart" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 8: CIP Running Signal (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."CIP_Run"."Running" := "CIP_Program_Variables"."CIP_Run"."Wait" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
"HMI_Local_CIP_Variables"."Cip_Commands"."_Running" := "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 9: (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"mONS" := "gIN_StopBtn"; // P_TRIG("gIN_StopBtn") - Mem: "mONS"
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"mONS2" := "CIP_Program_Variables"."CIP_Run"."Latch"; // P_TRIG("CIP_Program_Variables"."CIP_Run"."Latch") - Mem: "mONS2"
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."CIP_Run"."Done" := "CIP_Program_Variables"."Status"."Completed" OR ("gIN_StopBtn" AND NOT "mONS");
|
||||||
|
|
||||||
|
// Network 10: (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Report" AND "CIP_Program_Variables"."Status"."Completed" THEN
|
||||||
|
"CIPReportDB"."General"."AuxReportCipEnd" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 11: MIX - CIP Local (Original Language: LAD)
|
||||||
|
|
||||||
|
"mNoRecircFlowDly"(IN := "HMI_Device"."PPM303"."Out" AND (("HMI_Digital"."FSS301"."Filtered" AND "HMI_Device"."AVS336"."Out" AND "CIP_Program_Variables"."CIP_Run"."Latch") OR ("HMI_Digital"."FSS301"."Filtered" AND "HMI_Device"."AVS337"."Out" AND "CIP_Program_Variables"."CIP_Run"."Latch")), PT := S5T#3M); // TODO: Declarar "mNoRecircFlowDly" : TON;
|
||||||
|
|
||||||
|
"gCIPRecirFlowMiss_Fault" := "mNoRecircFlowDly".Q;
|
||||||
|
|
||||||
|
// Network 12: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitFillerReadyToCIP" := "gBlenderCIPMode" AND "Procedure_Variables"."Blender_Run"."Latch" AND "gIN_FillerCIPRequest" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."ReadyForCIP";
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := "gBlenderCIPMode" AND "Procedure_Variables"."Blender_Run"."Latch" AND "gIN_FillerCIPRequest" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."ReadyForCIP";
|
||||||
|
|
||||||
|
// Network 13: Local CIP Wait Temperature (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := "CIP_Program_Variables"."Status"."WaitEventRequest"."Temperature_Ok" AND "CIP_Program_Variables"."Status"."WaitEventStatus"."Temperature_Ok" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 14: (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := "CIP_Program_Variables"."Status"."WaitEventRequest"."HighConductivity" AND "CIP_Program_Variables"."Status"."WaitEventStatus"."HighConductivity" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Conductimeter" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 15: (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Conductimeter" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."LowConductivity" AND "CIP_Program_Variables"."Status"."WaitEventStatus"."LowConductivity" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 16: (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := "CIP_Program_Variables"."Status"."WaitEventRequest"."DrainCompleted" AND "CIP_Program_Variables"."Status"."WaitEventStatus"."DrainCompleted" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 17: (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPChangeReady" AND "CIP_Program_Variables"."Status"."WaitEventStatus"."CIPChangeReady" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 18: (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Message" := "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPCycleEnded" AND "CIP_Program_Variables"."Status"."WaitEventStatus"."CIPCycleEnded" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 19: Local CIP Hold (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "CIP_Program_Variables"."CIP_Run"."Wait" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 20: Local CIP Completed (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "CIP_Program_Variables"."Status"."Completed" AND "gBlenderProdMode" AND "gBlenderRinseMode";
|
||||||
|
|
||||||
|
// Network 21: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIPRecipeManagement_Data"(Active_Recipe_Req := "HMI_Variables_Cmd"."RecipeCIP"."Active_Request", Active_Recipe_Running := "HMI_Variables_Cmd"."RecipeCIP"."Active_Recipe_Running", Active_Recipe_Start := "HMI_Variables_Cmd"."RecipeCIP"."Active_Recipe_Start", Copy := "HMI_Variables_Cmd"."RecipeCIP"."Copy", Copy_to := "HMI_Variables_Cmd"."RecipeCIP"."Copy_Request", Delete := "HMI_Variables_Cmd"."RecipeCIP"."Delete", Download := "HMI_Variables_Cmd"."RecipeCIP"."Download", Edit := "HMI_Variables_Cmd"."RecipeCIP"."Edit", HMI_Recipe_Main_Page := "HMI_Variables_Cmd"."RecipeCIP"."Main_Page", HMI_Recipe_Page_Running := "HMI_Variables_Cmd"."RecipeCIP"."Page_Running", Max_Recipe_Number := 30, Read := "HMI_Variables_Cmd"."RecipeCIP"."Read", Upload := "HMI_Variables_Cmd"."RecipeCIP"."Upload", UploadPC := "HMI_Variables_Cmd"."RecipeCIP"."UploadPC", Work_Recipe := "HMI_Variables_Cmd"."RecipeCIP"."Edit_Request", Write := "HMI_Variables_Cmd"."RecipeCIP"."Write");
|
||||||
|
|
||||||
|
// Network 22: (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Local_CIP_Variables"."Cip_Commands"."_ProgNoSaveAllwd" := "HMI_Variables_Cmd"."RecipeCIP"."Work_Rec_is_Active_Recip" AND "HMI_Local_CIP_Variables"."Cip_Commands"."_Running";
|
||||||
|
|
||||||
|
// Network 23: (Original Language: LAD)
|
||||||
|
|
||||||
|
CIPLocal_WaitEvent_Ctrl();
|
||||||
|
|
||||||
|
// Network 24: (Original Language: LAD)
|
||||||
|
|
||||||
|
CIPLocal_ExecSimpleCIP(Clock := "Clock_1Hz", Hold := "CIP_Program_Variables"."CIP_Run"."Wait", Inizialize := "CIP_Program_Variables"."CIP_Run"."Reset", Start := "CIP_Program_Variables"."CIP_Run"."Latch", StepDown := "HMI_Local_CIP_Variables"."Cip_Commands"."_ProgStepDown", StepUp := "HMI_Local_CIP_Variables"."Cip_Commands"."_ProgStepUp");
|
||||||
|
|
||||||
|
// Network 25: (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Report" THEN
|
||||||
|
CIPReportManager();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,54 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1937
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "CIPLocal_ProgInizialize" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."General_Data"."ActualSimpleNum" := 1;
|
||||||
|
|
||||||
|
// Network 2: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."General_Data"."ActualStepNum" := 1;
|
||||||
|
|
||||||
|
// Network 3: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."General_Data"."StepActualTime" := 0;
|
||||||
|
|
||||||
|
// Network 4: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."General_Data"."mStepTotalActualTime" := 0;
|
||||||
|
|
||||||
|
// Network 5: (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."General_Data"."TotalElapsedTime" := 0;
|
||||||
|
|
||||||
|
// Network 6: MIX - (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
"gCIP_RecipePhaseLoadReq" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
"CIP_Program_Variables"."Status"."Completed" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
"CIP_Program_Variables"."Status"."WaitAnyCond" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."Inizialized" := "AUX TRUE";
|
||||||
|
|
||||||
|
IF "AUX TRUE" THEN
|
||||||
|
"CIP_Program_Variables"."CIP_Run"."Reset" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,102 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1934
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "CIPLocal_WaitEvent_Ctrl" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mCalc : Real;
|
||||||
|
mSPCondHigh : Real;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_2S : Bool; // Auto-generated temporary
|
||||||
|
#_3S : Bool; // Auto-generated temporary
|
||||||
|
#_5S : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: MIX - CIPLocal_WaitEvent_Ctrl (Original Language: LAD)
|
||||||
|
|
||||||
|
"mCalc" := "CIP_Program_Variables"."General_Data"."SPTemperature" - "HMI_Instrument"."TTS305_1"."PVFiltered";
|
||||||
|
|
||||||
|
"mTempAcheavedDly"(IN := "CIP_Program_Variables"."Status"."WaitEventRequest"."Temperature_Ok" AND ("mCalc" < 2.0), PT := S5T#2S); // TODO: Declarar "mTempAcheavedDly" : TON;
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."Temperature_Ok" := "mTempAcheavedDly".Q;
|
||||||
|
|
||||||
|
// Network 2: Local CIP: Wait "Product Tank 100% Level Achieved" (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."ProdTankMaxLev" := "gCIP_PrdTank_MaxLevel" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."ProdTankMaxLev";
|
||||||
|
|
||||||
|
// Network 3: Local CIP: Wait "Syrup Tank 100% Level Achieved" (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."SyrupTankMaxLev" := "gCIP_SyrTank_Flood" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."SyrupTankMaxLev";
|
||||||
|
|
||||||
|
// Network 4: Local CIP: Wait "Deaireator Tank 100% Level Achieved" (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."DeairTankMaxLev" := "gCIP_DeairTank_Flood" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."DeairTankMaxLev";
|
||||||
|
|
||||||
|
// Network 5: SP COND FOR HIGH CONDUCTIVITY (mS) (Original Language: LAD)
|
||||||
|
|
||||||
|
"mSPCondHigh" := "CIP_Program_Variables"."General_Data"."SPConductivity" / 1000.0;
|
||||||
|
|
||||||
|
// Network 6: MIX - CIPLocal_WaitEvent_Ctrl (Original Language: LAD)
|
||||||
|
|
||||||
|
"mCTS302AcheavedDly"(IN := "CIP_Program_Variables"."Status"."WaitEventRequest"."HighConductivity" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Conductimeter" AND ("HMI_Instrument"."CTS302"."PVFiltered" > "mSPCondHigh"), PT := S5T#5S); // TODO: Declarar "mCTS302AcheavedDly" : TON;
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."HighConductivity" := "mCTS302AcheavedDly".Q;
|
||||||
|
|
||||||
|
// Network 7: MIX - CIPLocal_WaitEvent_Ctrl (Original Language: LAD)
|
||||||
|
|
||||||
|
"mOpenAVS333_335TOF"(IN := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Conductimeter" AND (Eq("CIP_Program_Variables"."General_Data"."SPConductivity", 0.0) OR ("HMI_Instrument"."CTS302"."PVFiltered" < "mSPCondHigh")), PT := S5T#3S); // TODO: Declarar "mOpenAVS333_335TOF" : TON;
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."OpenAVS333_335Valve" := "mOpenAVS333_335TOF".Q;
|
||||||
|
|
||||||
|
// Network 8: MIX - CIPLocal_WaitEvent_Ctrl (Original Language: LAD)
|
||||||
|
|
||||||
|
"mCTS301AcheavedDly"(IN := "CIP_Program_Variables"."Status"."WaitEventRequest"."LowConductivity" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Conductimeter" AND ("HMI_Instrument"."CTS301"."PVFiltered" < "CIP_Program_Variables"."General_Data"."SPConductivity"), PT := S5T#5S); // TODO: Declarar "mCTS301AcheavedDly" : TON;
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."LowConductivity" := "mCTS301AcheavedDly".Q;
|
||||||
|
|
||||||
|
// Network 9: Local CIP: Wait "Ready For CIP" (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."ReadyForCIP" := "gIN_FillerCIPRequest" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."ReadyForCIP";
|
||||||
|
|
||||||
|
// Network 10: Local CIP: Wait "Drain Completed" (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."DrainCompleted" := "gIN_FillerCIPDrainCompl" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."DrainCompleted";
|
||||||
|
|
||||||
|
// Network 11: From Filler CIP Change Ready (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."CIPChangeReady" := "gIN_FillerCIPChangeReady" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPChangeReady";
|
||||||
|
|
||||||
|
// Network 12: From Filler CIP Cycle Ended (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."CIPCycleEnded" := "gIN_FillerCIPCycleEnded" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPCycleEnded";
|
||||||
|
|
||||||
|
// Network 13: From CIP Unit: Hot Water Receiving (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."CIPHotWaterReceiving" := "gIN_CIP_HotWaterSending" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPHotWaterReceiving";
|
||||||
|
|
||||||
|
// Network 14: From CIP Unit: Hot Water Stop (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."CIPHotWaterStop" := "gIN_CIP_HotWaterSending" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPHotWaterStop";
|
||||||
|
|
||||||
|
// Network 15: From CIP Unit: Hot Water Stop (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPHotWaterStop" THEN
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."CIPHotWaterStop" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 16: Local CIP: Wait "CIP Unit Ready to receive Soda Back" (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."CIPFreeSodaTank" := "gIN_CIP_FreeSodaTank" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPFreeSodaTank";
|
||||||
|
|
||||||
|
// Network 17: Local CIP: Wait "System Low Level Acheaved" (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."WaitEventStatus"."CIPLowLevel" := "gCIP_SystemLowLevel" AND "CIP_Program_Variables"."Status"."WaitEventRequest"."CIPLowLevel";
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,107 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1930
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "CIPMain" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
#_6S : Bool; // Auto-generated temporary
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: CIP - Low pressure (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" THEN
|
||||||
|
CIPLocal();
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 2: CIP - Product Tank Low Pressure (Original Language: LAD)
|
||||||
|
|
||||||
|
"gCIP_PrdTank_PressLow" := "HMI_PID"."RVM301"."Pv" < 1.0;
|
||||||
|
|
||||||
|
// Network 3: CIP - Product Tank Low Pressure (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" THEN
|
||||||
|
"gCIP_PrdTank_PressLow" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 4: CIP Completed Signal (Original Language: LAD)
|
||||||
|
|
||||||
|
// PBox SymPy processed, logic in consumer
|
||||||
|
"mCIP_CompletedONS" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" AND "gIN_CIP_CIPCompleted"; // P_TRIG("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" AND "gIN_CIP_CIPCompleted") - Mem: "mCIP_CompletedONS"
|
||||||
|
|
||||||
|
IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" AND "gIN_CIP_CIPCompleted" AND NOT "mCIP_CompletedONS" THEN
|
||||||
|
"CIP_Program_Variables"."Status"."Completed" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 5: CIP Completed Signal (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" AND "gCIP_BlenderDrainDone") THEN
|
||||||
|
"CIP_Program_Variables"."Status"."Completed" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_LocalCIP" AND "gCIP_BlenderDrainDone") THEN
|
||||||
|
"CIP_Program_Variables"."Status"."BlenderDrainRunning" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 6: CIP Flood (Original Language: LAD)
|
||||||
|
|
||||||
|
CIPMain_Flood();
|
||||||
|
|
||||||
|
// Network 7: CIp Total Drain (Original Language: LAD)
|
||||||
|
|
||||||
|
CIPMain_Total_Drain();
|
||||||
|
|
||||||
|
// Network 8: Blender total Drain In CIP Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."CIP_BlenderDrainRun" := "CIP_Program_Variables"."Status"."BlenderDrainRunning";
|
||||||
|
|
||||||
|
// Network 9: Blender Empty (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."CausticRecoveryRun" AND "gBlenderEmpty" THEN
|
||||||
|
"CIP_Program_Variables"."Status"."BlenderEmpty" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 10: MIX - To CIP Room (Original Language: LAD)
|
||||||
|
|
||||||
|
"gOUT_CIPChangeReady" := "gIN_FillerCIPChangeReady";
|
||||||
|
|
||||||
|
// Network 11: Blender Empty (Original Language: LAD)
|
||||||
|
|
||||||
|
"mBlenderEmprtyTON"(IN := "CIP_Program_Variables"."Status"."CausticRecoveryRun", PT := S5T#6S); // TODO: Declarar "mBlenderEmprtyTON" : TON;
|
||||||
|
|
||||||
|
IF "mBlenderEmprtyTON".Q THEN
|
||||||
|
"CIP_Program_Variables"."Status"."BlenderEmpty" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 12: Started (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gBlenderCIPMode" AND "Procedure_Variables"."Blender_Run"."Latch" AND "gIN_FillerCIPRequest" THEN
|
||||||
|
"CIP_Program_Variables"."Status"."Started" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 13: Started (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gOUT_FillerCIPCompleted" OR "gBlenderCIPMode" THEN
|
||||||
|
"CIP_Program_Variables"."Status"."Started" := FALSE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 14: Alarms (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "gIN_CIP_DrainRequest" AND "gBlenderCIPMode";
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "DI_CIP_CIP_Enable" AND "HMI_Alarms"."gH_Status" AND "gBlenderCIPMode";
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := ("HMI_Alarms"."gH_Status" AND "gBlenderCIPMode") OR ("DI_CIP_End" AND "gBlenderCIPMode");
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "DI_CIP_End" AND "DI_CIP_Fault" AND "gBlenderCIPMode";
|
||||||
|
|
||||||
|
"HMI_Alarms"."gH_Status" := "DI_CIP_End" AND "DI_Flr1_CIP/RinseFiller" AND "gBlenderCIPMode";
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,146 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 1931
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "CIPMain_Flood" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mProdTankFloodReq : Bool;
|
||||||
|
mSyrTankFloodReq : Bool;
|
||||||
|
mDeairTankFloodReq : Bool;
|
||||||
|
mSyrTankFlooded : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_0MS : Bool; // Auto-generated temporary
|
||||||
|
#_1M_15S : Bool; // Auto-generated temporary
|
||||||
|
#_20S : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: HMI Variables Cmd (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 26
|
||||||
|
"M19062" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TM301FloodReq"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TM301FloodReq") - Mem: "M19062"
|
||||||
|
|
||||||
|
"mProdTankFloodReq" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TM301FloodReq" AND NOT "M19062";
|
||||||
|
"M19062" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TM301FloodReq"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TM301FloodReq") - Mem: "M19062"
|
||||||
|
|
||||||
|
// Network 2: CIP Product Tank Flood Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."CIP_ProdTankFloodRun" := ("gIN_CIP_TankFilling" AND "Interlocking_Variables"."FILLER_MIXER_RECEIVE"."CIP_System_Flooded" AND "gCIP_PrdTank_Flood" AND "gBlenderCIPMode") OR ("gIN_CIP_TankFilling" AND "Interlocking_Variables"."SIDEL_FILLER_REC_DATA"."CIP_Cycle_Ended" AND "gCIP_PrdTank_Flood" AND "gBlenderCIPMode");
|
||||||
|
|
||||||
|
// Network 3: CIP Flood (Original Language: LAD)
|
||||||
|
|
||||||
|
"mPrdTank_Flood"(IN := "gCIP_PrdTank_MaxLevel" AND ("HMI_Variables_Status"."Procedures"."CIP_ProdTankFloodRun" OR ("gIN_CIP_TankFilling" AND "gCIP_PrdTank_Flood")), PT := S5T#0MS); // TODO: Declarar "mPrdTank_Flood" : TON;
|
||||||
|
|
||||||
|
"gCIP_PrdTank_Flood" := "mPrdTank_Flood".Q;
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."CIP_ProdTankFloodDone" := "mPrdTank_Flood".Q;
|
||||||
|
|
||||||
|
// Network 4: From CIP Room Flood Request (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 26
|
||||||
|
"M19063" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TP301FloodReq"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TP301FloodReq") - Mem: "M19063"
|
||||||
|
|
||||||
|
"mSyrTankFloodReq" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TP301FloodReq" AND NOT "M19063";
|
||||||
|
"M19063" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TP301FloodReq"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TP301FloodReq") - Mem: "M19063"
|
||||||
|
|
||||||
|
// Network 5: CIP Syrup Tank Flood Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" := ("mSyrTankFloodReq" AND "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "gCIP_SyrTank_Flood" AND "gBlenderCIPMode") OR ("gCIP_SyrTank_Flood" AND "gIN_CIP_TankFilling" AND "gCIP_PrdTank_Flood" AND "gBlenderCIPMode");
|
||||||
|
|
||||||
|
// Network 6: Procedure auxiliary variable (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "Procedure_Variables"."Blender_Run"."Latch" THEN
|
||||||
|
"gSP_EV04" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "Procedure_Variables"."Blender_Run"."Latch" THEN
|
||||||
|
"gSP_RVN301" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "Procedure_Variables"."Blender_Run"."Latch" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_DoubleDeair" THEN
|
||||||
|
"gSP_PPN305" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "Procedure_Variables"."Blender_Run"."Latch" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_DoubleDeair" THEN
|
||||||
|
"gSP_RVN301_1" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "Procedure_Variables"."Blender_Run"."Latch" THEN
|
||||||
|
"gSP_PPN301" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "Procedure_Variables"."Blender_Run"."Latch" THEN
|
||||||
|
"gSP_AVM317" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "Procedure_Variables"."Blender_Run"."Latch" THEN
|
||||||
|
"gSP_AVM389" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "Procedure_Variables"."Blender_Run"."Latch" THEN
|
||||||
|
"gSP_AVP361" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 7: Tank Flooded (Original Language: LAD)
|
||||||
|
|
||||||
|
"mSyrTankFlooded" := "HMI_Instrument"."LTP303"."PVFiltered" > 99.0;
|
||||||
|
|
||||||
|
// Network 8: CIP Flood (Original Language: LAD)
|
||||||
|
|
||||||
|
"mSyrTank_Flood"(IN := ("HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodRun" AND "HMI_Digital"."LAL_S3"."Filtered") OR ("gCIP_SyrTank_Flood" AND "gIN_CIP_TankFilling"), PT := S5T#20S); // TODO: Declarar "mSyrTank_Flood" : TON;
|
||||||
|
|
||||||
|
"gCIP_SyrTank_Flood" := "mSyrTankFlooded" OR "mSyrTank_Flood".Q;
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."CIP_SyrTankFloodDone" := "mSyrTankFlooded" OR "mSyrTank_Flood".Q;
|
||||||
|
|
||||||
|
// Network 9: ProdTankFloodREQ FP (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 26
|
||||||
|
"M19064" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TN301FloodReq"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TN301FloodReq") - Mem: "M19064"
|
||||||
|
|
||||||
|
"mDeairTankFloodReq" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TN301FloodReq" AND NOT "M19064";
|
||||||
|
"M19064" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TN301FloodReq"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TN301FloodReq") - Mem: "M19064"
|
||||||
|
|
||||||
|
// Network 10: CIP Deaerator Tank Flood Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodRun" := ("mDeairTankFloodReq" AND "HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodRun" AND "gCIP_DeairTank_Flood" AND "gBlenderCIPMode") OR ("gCIP_SyrTank_Flood" AND "gIN_CIP_TankFilling" AND "gCIP_DeairTank_Flood" AND "gCIP_PrdTank_Flood" AND "gBlenderCIPMode") OR ("gIN_CIP_TankFilling" AND "gSyrupRoomEn" AND "gCIP_DeairTank_Flood" AND "gCIP_PrdTank_Flood" AND "gBlenderCIPMode");
|
||||||
|
|
||||||
|
// Network 11: CIP Flood (Original Language: LAD)
|
||||||
|
|
||||||
|
"mDeairTank_Flood"(IN := ("gIN_CIP_TankFilling" AND "gCIP_DeairTank_Flood") OR ("HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodRun" AND "HMI_Digital"."LSN301L"."Filtered"), PT := S5T#1M_15S); // TODO: Declarar "mDeairTank_Flood" : TON;
|
||||||
|
|
||||||
|
// Network 12: CIP Flood (Original Language: LAD)
|
||||||
|
|
||||||
|
"mDeairTank2_Flood"(IN := ("gIN_CIP_TankFilling" AND "gCIP_DeairTank_Flood") OR ("HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodRun" AND "HMI_Digital"."LSN302L"."Filtered"), PT := S5T#1M_15S); // TODO: Declarar "mDeairTank2_Flood" : TON;
|
||||||
|
|
||||||
|
// Network 13: CIP - Deaireator Tank Flood (Original Language: LAD)
|
||||||
|
|
||||||
|
"gCIP_DeairTank_Flood" := ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_DoubleDeair" AND "mDeairTank_Flood") OR ("mDeairTank_Flood" AND "mDeairTank2_Flood");
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodDone" := ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_DoubleDeair" AND "mDeairTank_Flood") OR ("mDeairTank_Flood" AND "mDeairTank2_Flood");
|
||||||
|
|
||||||
|
// Network 14: Procedure auxiliary variable (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Run"."Latch" AND "HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodRun" AND "mDeairTank_Flood" THEN
|
||||||
|
"gSP_RVN302" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Run"."Latch" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_DoubleDeair" AND "HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodRun" AND "mDeairTank_Flood" THEN
|
||||||
|
"gSP_PPN305" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Run"."Latch" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_DoubleDeair" AND "HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodRun" AND "mDeairTank_Flood" THEN
|
||||||
|
"gSP_RVN301_1" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "Procedure_Variables"."Blender_Run"."Latch" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_DoubleDeair" AND "HMI_Variables_Status"."Procedures"."CIP_DeairTankFloodRun" AND "mDeairTank_Flood" THEN
|
||||||
|
"gSP_RVN302_1" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,146 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Name (Original): CIPMain_Total Drain
|
||||||
|
// Block Number: 1932
|
||||||
|
// Original Network Languages: LAD
|
||||||
|
|
||||||
|
FUNCTION "CIPMain_Total_Drain" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
mCIPTotalDrainReq : Bool;
|
||||||
|
mDrainEnd : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_10M : Bool; // Auto-generated temporary
|
||||||
|
#_60s : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: Request (Original Language: LAD)
|
||||||
|
|
||||||
|
"mCIPTotalDrainReq" := "gBlenderCIPMode" AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_CIP_TotalDrainReq" AND "CIP_Program_Variables"."CIP_Run"."Latch";
|
||||||
|
|
||||||
|
// Network 2: End (Original Language: LAD)
|
||||||
|
|
||||||
|
// Edge Logic handled by Coil 30
|
||||||
|
"M19061" := "gBlenderCIPMode" AND "CIP_Program_Variables"."CIP_Run"."Latch" AND "gIN_CIP_DrainRequest"; // N_TRIG("gBlenderCIPMode" AND "CIP_Program_Variables"."CIP_Run"."Latch" AND "gIN_CIP_DrainRequest") - Mem: "M19061"
|
||||||
|
|
||||||
|
"mDrainEnd" := ("M19061" AND NOT "gBlenderCIPMode") OR ("M19061" AND NOT "CIP_Program_Variables"."CIP_Run"."Latch") OR ("M19061" AND NOT "gIN_CIP_DrainRequest");
|
||||||
|
"M19061" := "gBlenderCIPMode" AND "CIP_Program_Variables"."CIP_Run"."Latch" AND "gIN_CIP_DrainRequest"; // N_TRIG("gBlenderCIPMode" AND "CIP_Program_Variables"."CIP_Run"."Latch" AND "gIN_CIP_DrainRequest") - Mem: "M19061"
|
||||||
|
|
||||||
|
// Network 3: Running (Original Language: LAD)
|
||||||
|
|
||||||
|
"CIP_Program_Variables"."Status"."BlenderDrainRunning" := ("gBlenderCIPMode" AND "gIN_CIP_DrainRequest") OR ("gBlenderCIPMode" AND "gIN_CIP_CIPCompleted" AND "Disable_Bit");
|
||||||
|
|
||||||
|
// Network 4: Blender Drain T (Original Language: LAD)
|
||||||
|
|
||||||
|
"mBlenderDrainTimer"(IN := "CIP_Program_Variables"."Status"."BlenderDrainRunning", PT := S5T#10M); // TODO: Declarar "mBlenderDrainTimer" : TON;
|
||||||
|
|
||||||
|
// Network 5: CIP - Drain (Original Language: LAD)
|
||||||
|
|
||||||
|
"mBlenderDrainTimerDelay"(IN := "gBlenderEmpty", PT := S5T#60s); // TODO: Declarar "mBlenderDrainTimerDelay" : TON;
|
||||||
|
|
||||||
|
"gCIP_BlenderDrainDone" := "mBlenderDrainTimerDelay".Q OR "mBlenderDrainTimer";
|
||||||
|
|
||||||
|
"HMI_Variables_Status"."Procedures"."CIP_BlenderDrainDone" := "mBlenderDrainTimerDelay".Q OR "mBlenderDrainTimer";
|
||||||
|
|
||||||
|
// Network 6: Procedure auxiliary variable (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "gOUT_PPN301_Run" AND "gOUT_PPN305_Run" AND "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVN314" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "gOUT_PPN301_Run" AND "gOUT_PPN305_Run" AND "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVP316" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 7: Buffer Tank Empty (Original Language: LAD)
|
||||||
|
|
||||||
|
// Network 7 did not produce printable SCL code.
|
||||||
|
|
||||||
|
// Network 8: Procedure auxiliary variable (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM323" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVP324" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVP389" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVP390" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM317" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVN327" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVP344" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVP361" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM389" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM372" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM388" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM330" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM385" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM386" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM369" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM322" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM315" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM345" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM353" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
IF "CIP_Program_Variables"."Status"."BlenderDrainRunning" THEN
|
||||||
|
"gSP_AVM362" := TRUE;
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,551 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FB
|
||||||
|
// Block Number: 1799
|
||||||
|
// Original Network Languages: STL
|
||||||
|
// Block Comment:
|
||||||
|
// Machine CIP Recipe Management
|
||||||
|
// DB1003.DBB246 -> Active Recipe (DB124)
|
||||||
|
// DB1003.DBB2 -> Working Recipe (Edit, Copy, Erase) (DB400)
|
||||||
|
// DB963.DBB48 -> Working Recipe (Data Save)
|
||||||
|
// DB501 -:- DB530 -> Recipe 1-:-30 data
|
||||||
|
|
||||||
|
FUNCTION_BLOCK "CIPRecipeManagement"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_INPUT
|
||||||
|
HMI_Recipe_Main_Page : Bool;
|
||||||
|
HMI_Recipe_Page_Running : Bool;
|
||||||
|
Active_Recipe_Start : Bool;
|
||||||
|
Edit : Bool;
|
||||||
|
Write : Bool;
|
||||||
|
Read : Bool;
|
||||||
|
Delete : Bool;
|
||||||
|
Copy : Bool;
|
||||||
|
Upload : Bool;
|
||||||
|
UploadPC : Bool;
|
||||||
|
Download : Bool;
|
||||||
|
Max_Recipe_Number : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_OUTPUT
|
||||||
|
Save_Requested : Bool;
|
||||||
|
Work_Rec_is_Active_Recip : Bool;
|
||||||
|
Copy_Rec_is_Active_Recip : Bool;
|
||||||
|
Recipe_Activated : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_INOUT
|
||||||
|
Active_Recipe_Running : Int;
|
||||||
|
Active_Recipe_Req : Int;
|
||||||
|
Work_Recipe : Int;
|
||||||
|
Copy_to : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_STAT
|
||||||
|
Active_Recipe_First : Bool;
|
||||||
|
Active_Recipe_Start_FP : Bool;
|
||||||
|
Active_Recipe_Run : Bool;
|
||||||
|
Active_Recipe_Source_DB : Int;
|
||||||
|
Read_FP : Bool;
|
||||||
|
Read_Start : Bool;
|
||||||
|
Read_First_FP : Bool;
|
||||||
|
Read_First_Start : Bool;
|
||||||
|
Read_Change : Bool;
|
||||||
|
Work_Recipe_Save : Int;
|
||||||
|
Work_Recipe_Source_DB : Int;
|
||||||
|
Loop_Count : Int;
|
||||||
|
Delete_FP : Bool;
|
||||||
|
Delete_Start : Bool;
|
||||||
|
Delete_Write : Bool;
|
||||||
|
Copy_FP : Bool;
|
||||||
|
Copy_Request : Bool;
|
||||||
|
Copy_Start : Bool;
|
||||||
|
Copy_Recipe_Source_DB : Int;
|
||||||
|
Copy_Write : Bool;
|
||||||
|
Write_FP : Bool;
|
||||||
|
Write_Start : Bool;
|
||||||
|
Write_REQ : Bool;
|
||||||
|
Save_Active_Recipe : Bool;
|
||||||
|
Recipe_Destination_DB : Int;
|
||||||
|
Save_requested_FP : Bool;
|
||||||
|
Save_requested_veri : Bool;
|
||||||
|
Save_requested_read_FP : Bool;
|
||||||
|
Save_requested_read_veri : Bool;
|
||||||
|
Read_act_BUSY : Bool;
|
||||||
|
Read_wrk_BUSY : Bool;
|
||||||
|
Read_wrk_Running : Bool;
|
||||||
|
Write_BUSY : Bool;
|
||||||
|
Upload_FP : Bool;
|
||||||
|
Upload_Start : Bool;
|
||||||
|
Download_FP : Bool;
|
||||||
|
Download_Start : Bool;
|
||||||
|
Recipe_Activated_FN : Bool;
|
||||||
|
Save_requested_upldPC_FP : Bool;
|
||||||
|
Save_requested_upldPC_ve : Bool;
|
||||||
|
mUploadPC : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
Active_Recipe_Source : Int;
|
||||||
|
Work_Recipe_Source : Int;
|
||||||
|
Recipe_Destination : Int;
|
||||||
|
Read_act_DB : "Any";
|
||||||
|
Read_act_RET_VAL : Int;
|
||||||
|
Read_wrk_REQ : Bool;
|
||||||
|
Read_wrk_DB : "Any";
|
||||||
|
Read_wrk_RET_VAL : Int;
|
||||||
|
Write_DB : "Any";
|
||||||
|
Write_RET_VAL : Int;
|
||||||
|
Buffer_Pointer : DInt;
|
||||||
|
mAux : Bool;
|
||||||
|
TUDT900 : "CIP_Link_Type";
|
||||||
|
End_UDT900 : Byte;
|
||||||
|
Lenght_UDT900 : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: (Original Language: STL)
|
||||||
|
// Active Recipe Request Number Control
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
CALL "LIMIT_I"
|
||||||
|
|
||||||
|
L _ERR_CONST_
|
||||||
|
L _ERR_CONST_
|
||||||
|
SUB_D
|
||||||
|
SRD 3
|
||||||
|
T "Lenght_UDT900"
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
// Network 2: (Original Language: STL)
|
||||||
|
// Active Recipe Number Control
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 2 ---
|
||||||
|
|
||||||
|
L "Active_Recipe_Running"
|
||||||
|
L 1
|
||||||
|
LT_I
|
||||||
|
JC aact
|
||||||
|
L "Active_Recipe_Running"
|
||||||
|
L "Max_Recipe_Number"
|
||||||
|
GT_I
|
||||||
|
JC aact
|
||||||
|
JU bact
|
||||||
|
aact: S "Active_Recipe_First"
|
||||||
|
bact: CALL "LIMIT_I"
|
||||||
|
|
||||||
|
// --- END STL Network 2 ---
|
||||||
|
|
||||||
|
// Network 3: MIX - (Original Language: STL)
|
||||||
|
// Active Recipe Number Start
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 3 ---
|
||||||
|
|
||||||
|
A "Active_Recipe_Start"
|
||||||
|
Rise "Active_Recipe_Start_FP"
|
||||||
|
= "Active_Recipe_Run"
|
||||||
|
|
||||||
|
A "Active_Recipe_Run"
|
||||||
|
O "Active_Recipe_First"
|
||||||
|
O "Read_act_BUSY"
|
||||||
|
JC Rrun
|
||||||
|
JU Erun
|
||||||
|
Rrun: R "Active_Recipe_First"
|
||||||
|
L "Active_Recipe_Req"
|
||||||
|
T "Active_Recipe_Running"
|
||||||
|
ADD 500
|
||||||
|
T "Active_Recipe_Source_DB"
|
||||||
|
|
||||||
|
LAR1 _ERR_CONST_
|
||||||
|
L BYTE#16#10
|
||||||
|
T LocalB[AR1,P#0.0]
|
||||||
|
L BYTE#16#02
|
||||||
|
T LocalB[AR1,P#1.0]
|
||||||
|
L "Lenght_UDT900"
|
||||||
|
T LocalW[AR1,P#2.0]
|
||||||
|
L "Active_Recipe_Source_DB"
|
||||||
|
T LocalW[AR1,P#4.0]
|
||||||
|
L P#DBX0.0
|
||||||
|
T LocalD[AR1,P#6.0]
|
||||||
|
CALL _Call_?
|
||||||
|
Erun: NOP_0
|
||||||
|
|
||||||
|
A "Read_act_BUSY"
|
||||||
|
Fall "Recipe_Activated_FN"
|
||||||
|
= "Recipe_Activated"
|
||||||
|
|
||||||
|
// --- END STL Network 3 ---
|
||||||
|
|
||||||
|
// Network 4: (Original Language: STL)
|
||||||
|
// Work Recipe Number Control
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 4 ---
|
||||||
|
|
||||||
|
CALL "LIMIT_I"
|
||||||
|
|
||||||
|
L "Work_Recipe"
|
||||||
|
L "Active_Recipe_Running"
|
||||||
|
EQ_I
|
||||||
|
= "Work_Rec_is_Active_Recip"
|
||||||
|
|
||||||
|
// --- END STL Network 4 ---
|
||||||
|
|
||||||
|
// Network 5: (Original Language: STL)
|
||||||
|
// Work Recipe READ (Data Uploading from archive)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 5 ---
|
||||||
|
|
||||||
|
A "Read"
|
||||||
|
O "HMI_Recipe_Page_Running"
|
||||||
|
Rise "Read_FP"
|
||||||
|
S "Read_Start"
|
||||||
|
L "Work_Recipe_Save"
|
||||||
|
L "Work_Recipe"
|
||||||
|
NE_I
|
||||||
|
= "Read_Change"
|
||||||
|
|
||||||
|
A "Read_Change"
|
||||||
|
O "Read_Start"
|
||||||
|
= "Read_wrk_REQ"
|
||||||
|
|
||||||
|
A "Read_wrk_REQ"
|
||||||
|
JC Rupl
|
||||||
|
A "Read_wrk_BUSY"
|
||||||
|
O "Read_wrk_Running"
|
||||||
|
JC Cupl
|
||||||
|
JU Eupl
|
||||||
|
Rupl: NOP_0
|
||||||
|
A "mUploadPC"
|
||||||
|
JC Eupl
|
||||||
|
L "Work_Recipe"
|
||||||
|
ADD 500
|
||||||
|
T "Work_Recipe_Source_DB"
|
||||||
|
|
||||||
|
Cupl: LAR1 _ERR_CONST_
|
||||||
|
L BYTE#16#10
|
||||||
|
T LocalB[AR1,P#0.0]
|
||||||
|
L BYTE#16#02
|
||||||
|
T LocalB[AR1,P#1.0]
|
||||||
|
L "Lenght_UDT900"
|
||||||
|
T LocalW[AR1,P#2.0]
|
||||||
|
L "Work_Recipe_Source_DB"
|
||||||
|
T LocalW[AR1,P#4.0]
|
||||||
|
L P#DBX0.0
|
||||||
|
T LocalD[AR1,P#6.0]
|
||||||
|
CALL _Call_?
|
||||||
|
A "Read_wrk_BUSY"
|
||||||
|
S "Read_wrk_Running"
|
||||||
|
|
||||||
|
A "Read_wrk_Running"
|
||||||
|
AN "Read_wrk_BUSY"
|
||||||
|
JC Dupl
|
||||||
|
JU Eupl
|
||||||
|
Dupl: R "Read_Start"
|
||||||
|
R "Read_wrk_Running"
|
||||||
|
L "Work_Recipe"
|
||||||
|
T "Work_Recipe_Save"
|
||||||
|
|
||||||
|
L "Work_Recipe_Save"
|
||||||
|
L 34
|
||||||
|
MUL_I
|
||||||
|
ADD 576
|
||||||
|
SLW 3
|
||||||
|
T "Buffer_Pointer"
|
||||||
|
LAR1_ACCU1
|
||||||
|
L "HMI_Local_CIP_Variables".Cip_Recipe.EditLinkProgram._LinkName[32]
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD6.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD10.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD14.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD18.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD22.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD26.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD30.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
LAR1 P#0.0
|
||||||
|
|
||||||
|
L "Lenght_UDT900"
|
||||||
|
L 2
|
||||||
|
DIV_I
|
||||||
|
Bupl: T "Loop_Count"
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
L DBW[AR1,P#2.0]
|
||||||
|
AUF "CIP_Program_Variables"
|
||||||
|
T DBW[AR1,P#50.0]
|
||||||
|
ADDAR1 P#2.0
|
||||||
|
L "Loop_Count"
|
||||||
|
LOOP Bupl
|
||||||
|
Eupl: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 5 ---
|
||||||
|
|
||||||
|
// Network 6: (Original Language: STL)
|
||||||
|
// Work Recipe Data DELETE (Erase DB500 Data + Write in Work_Recipe_Source)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 6 ---
|
||||||
|
|
||||||
|
A "Delete"
|
||||||
|
Rise "Delete_FP"
|
||||||
|
= "Delete_Start"
|
||||||
|
|
||||||
|
A "Delete_Start"
|
||||||
|
AN "Work_Rec_is_Active_Recip"
|
||||||
|
AN "Save_Requested"
|
||||||
|
AN "Write"
|
||||||
|
AN "Write_BUSY"
|
||||||
|
JC Rdel
|
||||||
|
JU Edel
|
||||||
|
Rdel: LAR1 P#0.0
|
||||||
|
L "Lenght_UDT900"
|
||||||
|
Bdel: T "Loop_Count"
|
||||||
|
L "Work_Recipe_Source_DB"
|
||||||
|
T "Work_Recipe_Source"
|
||||||
|
L DINT#0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBW[AR1,P#2.0]
|
||||||
|
ADDAR1 P#2.0
|
||||||
|
L "Loop_Count"
|
||||||
|
LOOP Bdel
|
||||||
|
SET
|
||||||
|
S "Delete_Write"
|
||||||
|
Edel: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 6 ---
|
||||||
|
|
||||||
|
// Network 7: (Original Language: STL)
|
||||||
|
// Work Recipe Data COPY (DB1008 Data Write to different Recipe DB
|
||||||
|
// Copy_Recipe_Source_DB)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 7 ---
|
||||||
|
|
||||||
|
CALL "LIMIT_I"
|
||||||
|
|
||||||
|
A "Copy"
|
||||||
|
Rise "Copy_FP"
|
||||||
|
= "Copy_Request"
|
||||||
|
|
||||||
|
L "Copy_to"
|
||||||
|
L "Active_Recipe_Running"
|
||||||
|
EQ_I
|
||||||
|
= "Copy_Rec_is_Active_Recip"
|
||||||
|
|
||||||
|
AN "Copy_Rec_is_Active_Recip"
|
||||||
|
AN "Save_Requested"
|
||||||
|
AN "Write"
|
||||||
|
AN "Write_BUSY"
|
||||||
|
A "Copy_Request"
|
||||||
|
= "Copy_Start"
|
||||||
|
|
||||||
|
A "Copy_Start"
|
||||||
|
JC Ccop
|
||||||
|
JU Ecop
|
||||||
|
Ccop: L "Copy_to"
|
||||||
|
ADD 500
|
||||||
|
T "Copy_Recipe_Source_DB"
|
||||||
|
S "Copy_Write"
|
||||||
|
Ecop: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 7 ---
|
||||||
|
|
||||||
|
// Network 8: (Original Language: STL)
|
||||||
|
// Work Recipe WRITE (Data Downloading to archive)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 8 ---
|
||||||
|
|
||||||
|
A "Write"
|
||||||
|
Rise "Write_FP"
|
||||||
|
= "Write_Start"
|
||||||
|
|
||||||
|
A "Write_Start"
|
||||||
|
O "Delete_Write"
|
||||||
|
O "Copy_Write"
|
||||||
|
AN "Write_BUSY"
|
||||||
|
= "Write_REQ"
|
||||||
|
|
||||||
|
A "Write_Start"
|
||||||
|
O "Delete_Write"
|
||||||
|
AN "Write_BUSY"
|
||||||
|
JC Rdow
|
||||||
|
A "Write_BUSY"
|
||||||
|
JC Cdow
|
||||||
|
A "Copy_Write"
|
||||||
|
JC CoDB
|
||||||
|
JU Edow
|
||||||
|
CoDB: R "Copy_Write"
|
||||||
|
L "Copy_Recipe_Source_DB"
|
||||||
|
T "Recipe_Destination_DB"
|
||||||
|
L "Copy_to"
|
||||||
|
JU Copy
|
||||||
|
Rdow: R "Save_Requested"
|
||||||
|
R "Delete_Write"
|
||||||
|
R "mUploadPC"
|
||||||
|
L "Work_Recipe_Source_DB"
|
||||||
|
T "Recipe_Destination_DB"
|
||||||
|
|
||||||
|
L "Work_Recipe_Save"
|
||||||
|
L "Active_Recipe_Running"
|
||||||
|
EQ_I
|
||||||
|
= "Save_Active_Recipe"
|
||||||
|
|
||||||
|
LAR1 P#0.0
|
||||||
|
L "Lenght_UDT900"
|
||||||
|
L 2
|
||||||
|
DIV_I
|
||||||
|
Bdow: T "Loop_Count"
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
L DBW[AR1,P#2.0]
|
||||||
|
AUF "CIP_Program_Variables"
|
||||||
|
T DBW[AR1,P#50.0]
|
||||||
|
AN "Save_Active_Recipe"
|
||||||
|
JC Ndow
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBW[AR1,P#276.0]
|
||||||
|
Ndow: ADDAR1 P#2.0
|
||||||
|
L "Loop_Count"
|
||||||
|
LOOP Bdow
|
||||||
|
|
||||||
|
L "Work_Recipe_Save"
|
||||||
|
Copy: L 34
|
||||||
|
MUL_I
|
||||||
|
ADD 576
|
||||||
|
SLW 3
|
||||||
|
T "Buffer_Pointer"
|
||||||
|
LAR1_ACCU1
|
||||||
|
L DB1003.DBD2.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD6.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD10.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD14.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD18.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD22.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD26.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
ADDAR1 P#4.0
|
||||||
|
L DB1003.DBD32.0
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
T DBD[AR1,P#0.0]
|
||||||
|
Cdow: LAR1 _ERR_CONST_
|
||||||
|
|
||||||
|
L BYTE#16#10
|
||||||
|
T LocalB[AR1,P#0.0]
|
||||||
|
L BYTE#16#02
|
||||||
|
T LocalB[AR1,P#1.0]
|
||||||
|
L "Lenght_UDT900"
|
||||||
|
T LocalW[AR1,P#2.0]
|
||||||
|
L "Recipe_Destination_DB"
|
||||||
|
T LocalW[AR1,P#4.0]
|
||||||
|
L P#DBX0.0
|
||||||
|
T LocalD[AR1,P#6.0]
|
||||||
|
CALL _Call_?
|
||||||
|
Edow: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 8 ---
|
||||||
|
|
||||||
|
// Network 9: (Original Language: STL)
|
||||||
|
// Work Recipe SAVE REQUESTED
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 9 ---
|
||||||
|
|
||||||
|
A "HMI_Recipe_Main_Page"
|
||||||
|
Rise "Save_requested_FP"
|
||||||
|
= "Save_requested_veri"
|
||||||
|
|
||||||
|
AN "Read_wrk_Running"
|
||||||
|
Rise "Save_requested_read_FP"
|
||||||
|
= "Save_requested_read_veri"
|
||||||
|
|
||||||
|
A "mUploadPC"
|
||||||
|
AN "UploadPC"
|
||||||
|
Rise "Save_requested_upldPC_FP"
|
||||||
|
= "Save_requested_upldPC_ve"
|
||||||
|
|
||||||
|
A "Save_requested_veri"
|
||||||
|
O "Save_requested_read_veri"
|
||||||
|
O "Save_requested_upldPC_ve"
|
||||||
|
JC Vsav
|
||||||
|
JU Esav
|
||||||
|
Vsav: CLR
|
||||||
|
= "Save_Requested"
|
||||||
|
LAR1 P#0.0
|
||||||
|
L "Lenght_UDT900"
|
||||||
|
L 2
|
||||||
|
DIV_I
|
||||||
|
L 17
|
||||||
|
SUB_I
|
||||||
|
Bsav: T "Loop_Count"
|
||||||
|
AUF "CIP_Program_Variables"
|
||||||
|
L DBW[AR1,P#50.0]
|
||||||
|
AUF "HMI_Local_CIP_Variables"
|
||||||
|
L DBW[AR1,P#2.0]
|
||||||
|
NE_D
|
||||||
|
JC Sreq
|
||||||
|
ADDAR1 P#2.0
|
||||||
|
L "Loop_Count"
|
||||||
|
LOOP Bsav
|
||||||
|
JU Esav
|
||||||
|
Sreq: SET
|
||||||
|
= "Save_Requested"
|
||||||
|
Esav: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 9 ---
|
||||||
|
|
||||||
|
// Network 10: (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 10 ---
|
||||||
|
|
||||||
|
A "UploadPC"
|
||||||
|
JCN Noup
|
||||||
|
S "mUploadPC"
|
||||||
|
Noup: A "Edit"
|
||||||
|
JCN Roup
|
||||||
|
R "mUploadPC"
|
||||||
|
Roup: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 10 ---
|
||||||
|
|
||||||
|
END_FUNCTION_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#01
|
||||||
|
// Block Number: 501
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_01"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#02
|
||||||
|
// Block Number: 502
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_02"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#03
|
||||||
|
// Block Number: 503
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_03"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#04
|
||||||
|
// Block Number: 504
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_04"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#05
|
||||||
|
// Block Number: 505
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_05"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#06
|
||||||
|
// Block Number: 506
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_06"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#07
|
||||||
|
// Block Number: 507
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_07"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#08
|
||||||
|
// Block Number: 508
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_08"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#09
|
||||||
|
// Block Number: 509
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_09"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#10
|
||||||
|
// Block Number: 510
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_10"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#11
|
||||||
|
// Block Number: 511
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_11"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#12
|
||||||
|
// Block Number: 512
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_12"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#13
|
||||||
|
// Block Number: 513
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_13"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#14
|
||||||
|
// Block Number: 514
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_14"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#15
|
||||||
|
// Block Number: 515
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_15"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#16
|
||||||
|
// Block Number: 516
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_16"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#17
|
||||||
|
// Block Number: 517
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_17"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#18
|
||||||
|
// Block Number: 518
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_18"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#19
|
||||||
|
// Block Number: 519
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_19"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#20
|
||||||
|
// Block Number: 520
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_20"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#21
|
||||||
|
// Block Number: 521
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_21"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#22
|
||||||
|
// Block Number: 522
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_22"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#23
|
||||||
|
// Block Number: 523
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_23"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#24
|
||||||
|
// Block Number: 524
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_24"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#25
|
||||||
|
// Block Number: 525
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_25"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#26
|
||||||
|
// Block Number: 526
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_26"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#27
|
||||||
|
// Block Number: 527
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_27"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#28
|
||||||
|
// Block Number: 528
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_28"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#29
|
||||||
|
// Block Number: 529
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_29"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,32 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Name (Original): CIPRecipe#30
|
||||||
|
// Block Number: 530
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPRecipe_30"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
LinkProgram : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,216 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Number: 600
|
||||||
|
|
||||||
|
DATA_BLOCK "CIPReportDB"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
General : "Struct";
|
||||||
|
Spare32 : Array[0..8] of Int := [0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
AnalogAVSupport : "Struct";
|
||||||
|
Spare66 : Array[0..16] of Int := [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
SIMPLE01 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 7143424;
|
||||||
|
Spare20 : DInt := 7143424;
|
||||||
|
TemperatureAV : Int := 108;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 65536;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE02 : STRUCT
|
||||||
|
TotalTime : DInt := 207;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [16384000, 3932160, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE03 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE04 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE05 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE06 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE07 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE08 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE09 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE10 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE11 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE12 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE13 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE14 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [0, 0, 0];
|
||||||
|
WaitingTime : DInt := 0;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
SIMPLE15 : STRUCT
|
||||||
|
TotalTime : DInt := 0;
|
||||||
|
CleaningTime : Array[0..2] of DInt := [17676, 1436302744, 1443692544];
|
||||||
|
WaitingTime : DInt := 17112;
|
||||||
|
Spare20 : DInt := 0;
|
||||||
|
TemperatureAV : Int := 0;
|
||||||
|
TemperatureSP : Int := 0;
|
||||||
|
ConducibilityAV : Int := 0;
|
||||||
|
ConducibilitySP : Int := 0;
|
||||||
|
Spare40 : DInt := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
Spare870 : Array[0..29] of Int := [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
Recipe : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,314 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Number: 600
|
||||||
|
// Original Network Languages: STL, LAD
|
||||||
|
|
||||||
|
FUNCTION "CIPReportManager" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
DUTY_TIME : Real;
|
||||||
|
FAULT : Int;
|
||||||
|
DBDim : Word;
|
||||||
|
Loop_Count : Int;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
#_1 : Bool; // Auto-generated temporary
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: EMPTY SEG. (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
NOP_0
|
||||||
|
A "HMI_Local_CIP_Variables".Cip_Commands._ProgInizialize
|
||||||
|
R "CIPRepStarted"
|
||||||
|
R "CIPReportDB".General.AuxReportCipStart
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
// Network 2: REPORT END (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 2 ---
|
||||||
|
|
||||||
|
A "CIPReportDB".General.AuxReportCipEnd
|
||||||
|
A "CIPRepStarted"
|
||||||
|
Rise "FN_CIPRepEndSupport"
|
||||||
|
JCN M250
|
||||||
|
AN "CIP_Program_Variables".CIP_Run.Reset
|
||||||
|
JC M200
|
||||||
|
L 2
|
||||||
|
JU M201
|
||||||
|
M200: L 0
|
||||||
|
L "CIPRepComment"
|
||||||
|
NE_I
|
||||||
|
JC M201
|
||||||
|
L 1
|
||||||
|
M201: T "CIPReportDB".General.Comment
|
||||||
|
|
||||||
|
SET
|
||||||
|
R "CIPReportDB".General.ReportCipStart
|
||||||
|
S "CIPReportDB".General.ReportCipEnd
|
||||||
|
R "CIPReportDB".General.AuxReportCipStart
|
||||||
|
L 0
|
||||||
|
T "MB600"
|
||||||
|
T "CIPRepComment"
|
||||||
|
BEU
|
||||||
|
M250: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 2 ---
|
||||||
|
|
||||||
|
// Network 3: REPORT INITIALIZATION (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 3 ---
|
||||||
|
|
||||||
|
A "HMI_Blender_Parameters".Processor_Options.Blender_OPT._LocalCIP
|
||||||
|
A "CIPReportDB".General.AuxReportCipStart
|
||||||
|
Rise "FP_CIPRepStartSupport"
|
||||||
|
JCN M350
|
||||||
|
|
||||||
|
AUF DI "CIPReportDB"
|
||||||
|
L_DILG
|
||||||
|
T "DBDim"
|
||||||
|
LAR1 P#0.0
|
||||||
|
L "DBDim"
|
||||||
|
L 2
|
||||||
|
DIV_I
|
||||||
|
M300: T "Loop_Count"
|
||||||
|
L 0
|
||||||
|
T DIW[AR1,P#0.0]
|
||||||
|
ADDAR1 P#2.0
|
||||||
|
L "Loop_Count"
|
||||||
|
LOOP M300
|
||||||
|
|
||||||
|
SET
|
||||||
|
S "CIPReportDB".General.ReportCipStart
|
||||||
|
R "CIPReportDB".General.ReportCipEnd
|
||||||
|
R "CIPReportDB".General.AuxReportCipEnd
|
||||||
|
S "CIPRepStarted"
|
||||||
|
L "HMI_Variables_Cmd".RecipeCIP.Active_Recipe_Running
|
||||||
|
T "CIPReportDB".General.Active_Recipe_Running
|
||||||
|
L 0
|
||||||
|
T "CIPRepComment"
|
||||||
|
M350: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 3 ---
|
||||||
|
|
||||||
|
// Network 4: REPORT START (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 4 ---
|
||||||
|
|
||||||
|
A "HMI_Blender_Parameters".Processor_Options.Blender_OPT._LocalCIP
|
||||||
|
AN "CIPRepStarted"
|
||||||
|
BEC
|
||||||
|
AUF DI "CIPReportDB"
|
||||||
|
|
||||||
|
// --- END STL Network 4 ---
|
||||||
|
|
||||||
|
// Network 5: REPORT ACTUAL RECIPE UPDATE (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 5 ---
|
||||||
|
|
||||||
|
CALL _Call_?
|
||||||
|
|
||||||
|
// --- END STL Network 5 ---
|
||||||
|
|
||||||
|
// Network 6: REPORT COMMENT (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 6 ---
|
||||||
|
|
||||||
|
A "HMI_Local_CIP_Variables".Cip_Commands._ProgStepUp
|
||||||
|
JNB _001
|
||||||
|
L 0.0
|
||||||
|
T "CIPReportDB".AnalogAVSupport.Temperature
|
||||||
|
T "CIPReportDB".AnalogAVSupport.Conducibility
|
||||||
|
T "CIPReportDB".AnalogAVSupport.SpareAV
|
||||||
|
T "CIPReportDB".AnalogAVSupport.DutyTime
|
||||||
|
_001: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 6 ---
|
||||||
|
|
||||||
|
// Network 7: REPORT CIP TOTAL TIME (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "CLK_1.0S" THEN
|
||||||
|
"CIPReportDB"."General"."TotalTime" := DINT#1 + "CIPReportDB"."General"."TotalTime";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 8: REPORT CIP CLEANING TIME (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "CLK_1.0S" AND "CIP_Program_Variables"."CIP_Run"."Latch" AND "CIP_Program_Variables"."CIP_Run"."Wait" THEN
|
||||||
|
"CIPReportDB"."General"."CleaningTime" := DINT#1 + "CIPReportDB"."General"."CleaningTime";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 9: REPORT CIP WAITING TIME (Original Language: LAD)
|
||||||
|
|
||||||
|
IF "CLK_1.0S" AND "CIP_Program_Variables"."CIP_Run"."Latch" AND "CIP_Program_Variables"."CIP_Run"."Wait" THEN
|
||||||
|
"CIPReportDB"."General"."WaitingTime" := DINT#1 + "CIPReportDB"."General"."WaitingTime";
|
||||||
|
END_IF;
|
||||||
|
|
||||||
|
// Network 10: REPORT CIP FAULT TIME (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 10 ---
|
||||||
|
|
||||||
|
A "CIP_Program_Variables".CIP_Run.Latch
|
||||||
|
R "CIPRepFaultPresent"
|
||||||
|
|
||||||
|
A "gBlenderCIPMode"
|
||||||
|
A "gBlenderAlarm"
|
||||||
|
S "CIPRepFaultPresent"
|
||||||
|
|
||||||
|
A "CIPRepStarted"
|
||||||
|
AN "CIP_Program_Variables".CIP_Run.Latch
|
||||||
|
S "CIPRepFaultPresent"
|
||||||
|
|
||||||
|
AN CLK_1.0S
|
||||||
|
ON "CIPRepFaultPresent"
|
||||||
|
JC M500
|
||||||
|
L "CIPReportDB".General.CipFaultTime
|
||||||
|
L DINT#1
|
||||||
|
ADD_D
|
||||||
|
T "CIPReportDB".General.CipFaultTime
|
||||||
|
L 3
|
||||||
|
T "CIPRepComment"
|
||||||
|
M500: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 10 ---
|
||||||
|
|
||||||
|
// Network 11: CIP SEQUENCE MANAGER (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 11 ---
|
||||||
|
|
||||||
|
L "HMI_Local_CIP_Variables".CIP_AnalogValues._StepNum
|
||||||
|
L 0
|
||||||
|
EQ_I
|
||||||
|
JC M919
|
||||||
|
AN CLK_1.0S
|
||||||
|
A "gBlenderCIPMode"
|
||||||
|
JC M919
|
||||||
|
L "CIPReportDB".General.StepNum
|
||||||
|
L 0
|
||||||
|
EQ_I
|
||||||
|
JCN M400
|
||||||
|
L "HMI_Local_CIP_Variables".CIP_AnalogValues._StepNum
|
||||||
|
T "CIPReportDB".General.StepNum
|
||||||
|
M400: L "HMI_Local_CIP_Variables".CIP_AnalogValues._StepNum
|
||||||
|
L 1
|
||||||
|
SUB_I
|
||||||
|
L P#36.0
|
||||||
|
MUL_D
|
||||||
|
LAR1_ACCU1
|
||||||
|
|
||||||
|
L DID[AR1,P#100.0]
|
||||||
|
L DINT#1
|
||||||
|
ADD_D
|
||||||
|
T DID[AR1,P#100.0]
|
||||||
|
|
||||||
|
L DID[AR1,P#104.0]
|
||||||
|
L DINT#1
|
||||||
|
ADD_D
|
||||||
|
T DID[AR1,P#104.0]
|
||||||
|
AN "CIPRepFaultPresent"
|
||||||
|
JC M914
|
||||||
|
L DID[AR1,P#108.0]
|
||||||
|
L DINT#1
|
||||||
|
ADD_D
|
||||||
|
T DID[AR1,P#108.0]
|
||||||
|
M914: NOP_0
|
||||||
|
|
||||||
|
L "HMI_Local_CIP_Variables".CIP_AnalogValues._StepNum
|
||||||
|
L "CIPReportDB".General.StepNum
|
||||||
|
EQ_I
|
||||||
|
A "CIP_Program_Variables".CIP_Run.Latch
|
||||||
|
JC M915
|
||||||
|
L 0.0
|
||||||
|
T "CIPReportDB".AnalogAVSupport.Temperature
|
||||||
|
T "CIPReportDB".AnalogAVSupport.Conducibility
|
||||||
|
L "HMI_Local_CIP_Variables".CIP_AnalogValues._StepNum
|
||||||
|
T "CIPReportDB".General.StepNum
|
||||||
|
M915: NOP_0
|
||||||
|
|
||||||
|
A "gBlenderCIPMode"
|
||||||
|
A "CIP_Program_Variables".CIP_Run.Latch
|
||||||
|
JCN M916
|
||||||
|
|
||||||
|
L "HMI_Local_CIP_Variables".Cip_Recipe.ActualSimpleProgram.CIP_SetPoint_Temp
|
||||||
|
L 10.0
|
||||||
|
MUL_R
|
||||||
|
TRUNC
|
||||||
|
T DIW[AR1,P#126.0]
|
||||||
|
|
||||||
|
L "HMI_Local_CIP_Variables".Cip_Recipe.ActualSimpleProgram.CIP_SetPoint_Cond
|
||||||
|
L 0.01
|
||||||
|
MUL_R
|
||||||
|
TRUNC
|
||||||
|
T DIW[AR1,P#130.0]
|
||||||
|
|
||||||
|
A "CIP_Program_Variables".CIP_Run.Wait
|
||||||
|
JCN M917
|
||||||
|
L DID[AR1,P#116.0]
|
||||||
|
L DINT#1
|
||||||
|
ADD_D
|
||||||
|
T DID[AR1,P#116.0]
|
||||||
|
JU M916
|
||||||
|
M917: NOP_0
|
||||||
|
|
||||||
|
L "CIPReportDB".AnalogAVSupport.DutyTime
|
||||||
|
L 1.0
|
||||||
|
ADD_R
|
||||||
|
T "CIPReportDB".AnalogAVSupport.DutyTime
|
||||||
|
T "DUTY_TIME"
|
||||||
|
|
||||||
|
L "CIPReportDB".AnalogAVSupport.Temperature
|
||||||
|
L "HMI_Instrument".TTS305_1.PVFiltered
|
||||||
|
ADD_R
|
||||||
|
T "CIPReportDB".AnalogAVSupport.Temperature
|
||||||
|
L "DUTY_TIME"
|
||||||
|
DIV_R
|
||||||
|
L 10.0
|
||||||
|
MUL_R
|
||||||
|
TRUNC
|
||||||
|
T DIW[AR1,P#124.0]
|
||||||
|
|
||||||
|
L "HMI_Local_CIP_Variables".Cip_Recipe.ActualSimpleProgram.CIP_SimpleCode
|
||||||
|
L 1
|
||||||
|
EQ_I
|
||||||
|
O_BRACK
|
||||||
|
L "HMI_Local_CIP_Variables".Cip_Recipe.ActualSimpleProgram.CIP_SimpleCode
|
||||||
|
L 5
|
||||||
|
EQ_I
|
||||||
|
BRACKET
|
||||||
|
JCN M920
|
||||||
|
L "HMI_Instrument".CTS301.PVFiltered
|
||||||
|
JU M921
|
||||||
|
M920: L "HMI_Instrument".CTS302.PVFiltered
|
||||||
|
M921: L 0.001
|
||||||
|
MUL_R
|
||||||
|
L "CIPReportDB".AnalogAVSupport.Conducibility
|
||||||
|
ADD_R
|
||||||
|
T "CIPReportDB".AnalogAVSupport.Conducibility
|
||||||
|
L "DUTY_TIME"
|
||||||
|
DIV_R
|
||||||
|
L 10.0
|
||||||
|
MUL_R
|
||||||
|
TRUNC
|
||||||
|
T DIW[AR1,P#128.0]
|
||||||
|
|
||||||
|
M916: NOP_0
|
||||||
|
|
||||||
|
M919: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 11 ---
|
||||||
|
|
||||||
|
// Network 12: (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 12 ---
|
||||||
|
|
||||||
|
L "CIPRepComment"
|
||||||
|
T "CIPReportDB".General.Comment
|
||||||
|
|
||||||
|
// --- END STL Network 12 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,258 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: FC
|
||||||
|
// Block Name (Original): CIP FlipFlop
|
||||||
|
// Block Number: 1812
|
||||||
|
// Original Network Languages: STL, LAD
|
||||||
|
|
||||||
|
FUNCTION "CIP_FlipFlop" : Void
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR_INOUT
|
||||||
|
mStep : Int;
|
||||||
|
mTime : Int;
|
||||||
|
mTransition : Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
VAR_TEMP
|
||||||
|
Buffer : Bool;
|
||||||
|
mProdTankMinLevel : Bool;
|
||||||
|
mFlipFlop : Bool;
|
||||||
|
mOverPress : Bool;
|
||||||
|
mDummy : Bool;
|
||||||
|
mPresetTimer : Int;
|
||||||
|
sp : Real;
|
||||||
|
mUnderPress : Bool;
|
||||||
|
sp_1 : Real;
|
||||||
|
__PlcmigTempFillBits_14B0 : Array[0..7] of Bool;
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
// Network 1: STEP CONTROL (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 1 ---
|
||||||
|
|
||||||
|
L "mStep"
|
||||||
|
JL LEND
|
||||||
|
JU ST00
|
||||||
|
JU ST01
|
||||||
|
JU ST02
|
||||||
|
JU ST03
|
||||||
|
JU ST04
|
||||||
|
JU ST05
|
||||||
|
JU ST06
|
||||||
|
JU ST07
|
||||||
|
JU ST08
|
||||||
|
JU ST09
|
||||||
|
JU ST10
|
||||||
|
JU ST11
|
||||||
|
JU ST12
|
||||||
|
JU ST13
|
||||||
|
JU ST14
|
||||||
|
JU ST15
|
||||||
|
LEND: JU FULL
|
||||||
|
FULL: L 0
|
||||||
|
T "mStep"
|
||||||
|
JU END
|
||||||
|
|
||||||
|
// --- END STL Network 1 ---
|
||||||
|
|
||||||
|
// Network 2: STEP 00 First Valve open Flip Flop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gSP_AVN314" := TRUE;
|
||||||
|
|
||||||
|
// Network 3: STEP 00 First Valve open Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 3 ---
|
||||||
|
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 3 ---
|
||||||
|
|
||||||
|
// Network 4: STEP 01 Pause Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 4 ---
|
||||||
|
|
||||||
|
|
||||||
|
ST01: CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 4 ---
|
||||||
|
|
||||||
|
// Network 5: STEP 02 Second Valve open Flip Flop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gSP_AVM323" := TRUE;
|
||||||
|
|
||||||
|
// Network 6: STEP 02 Second Valve open Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 6 ---
|
||||||
|
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 6 ---
|
||||||
|
|
||||||
|
// Network 7: STEP 03 Pause Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 7 ---
|
||||||
|
|
||||||
|
ST03: CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 7 ---
|
||||||
|
|
||||||
|
// Network 8: STEP 04 Third Valve open Flip Flop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gSP_AVM322" := TRUE;
|
||||||
|
|
||||||
|
// Network 9: STEP 04 Third Valve open Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 9 ---
|
||||||
|
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 9 ---
|
||||||
|
|
||||||
|
// Network 10: STEP 05 Pause Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 10 ---
|
||||||
|
|
||||||
|
ST05: CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 10 ---
|
||||||
|
|
||||||
|
// Network 11: STEP 06 Fourth Valve open Flip Flop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gSP_AVP316" := TRUE;
|
||||||
|
|
||||||
|
// Network 12: STEP 06 Fourth Valve open Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 12 ---
|
||||||
|
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 12 ---
|
||||||
|
|
||||||
|
// Network 13: STEP 07 Pause Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 13 ---
|
||||||
|
|
||||||
|
ST07: CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 13 ---
|
||||||
|
|
||||||
|
// Network 14: STEP 08 FifthValve open Flip Flop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gSP_AVP344" := TRUE;
|
||||||
|
|
||||||
|
// Network 15: STEP 08 FifthValve open Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 15 ---
|
||||||
|
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 15 ---
|
||||||
|
|
||||||
|
// Network 16: STEP 09 Pause Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 16 ---
|
||||||
|
|
||||||
|
ST09: CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 16 ---
|
||||||
|
|
||||||
|
// Network 17: STEP 10 Sixth Valve open Flip Flop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gSP_AVM315" := TRUE;
|
||||||
|
|
||||||
|
// Network 18: STEP 10 Sixth Valve open Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 18 ---
|
||||||
|
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 18 ---
|
||||||
|
|
||||||
|
// Network 19: STEP 11 Pause Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 19 ---
|
||||||
|
|
||||||
|
ST11: CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 19 ---
|
||||||
|
|
||||||
|
// Network 20: STEP 12 Seventh Valve open Flip Flop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gSP_AVM353" := TRUE;
|
||||||
|
|
||||||
|
// Network 21: STEP 12 Seventh Valve open Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 21 ---
|
||||||
|
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 21 ---
|
||||||
|
|
||||||
|
// Network 22: STEP 13 Pause Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 22 ---
|
||||||
|
|
||||||
|
ST13: CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 22 ---
|
||||||
|
|
||||||
|
// Network 23: STEP 14 Eighth Valve open Flip Flop (Original Language: LAD)
|
||||||
|
|
||||||
|
"gSP_AVM369" := TRUE;
|
||||||
|
|
||||||
|
// Network 24: STEP 14 Eighth Valve open Flip Flop (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 24 ---
|
||||||
|
|
||||||
|
CALL "_StepMove"
|
||||||
|
A _Statusword_?
|
||||||
|
JC END
|
||||||
|
|
||||||
|
// --- END STL Network 24 ---
|
||||||
|
|
||||||
|
// Network 25: STEP 13 done (Original Language: LAD)
|
||||||
|
|
||||||
|
"gCIP_FlipFlopDone" := "AUX FALSE";
|
||||||
|
|
||||||
|
// Network 26: END (Original Language: STL)
|
||||||
|
|
||||||
|
// --- BEGIN STL Network 26 ---
|
||||||
|
|
||||||
|
END: NOP_0
|
||||||
|
|
||||||
|
// --- END STL Network 26 ---
|
||||||
|
|
||||||
|
END_FUNCTION
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,9 @@
|
||||||
|
# UDT: CIP_Link_Type
|
||||||
|
|
||||||
|
## Members
|
||||||
|
|
||||||
|
| Name | Datatype | Start Value | Comment |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `_LinkName` | `String[32]` | `None` | |
|
||||||
|
| `CIP_Simple_Prog` | `Array[1..15] of "CIP_Simple_Type"` | `` | |
|
||||||
|
|
|
@ -0,0 +1,247 @@
|
||||||
|
```pascal
|
||||||
|
// Block Type: GlobalDB
|
||||||
|
// Block Number: 963
|
||||||
|
|
||||||
|
DATA_BLOCK "CIP_Program_Variables"
|
||||||
|
{ S7_Optimized_Access := 'TRUE' }
|
||||||
|
VERSION : 0.1
|
||||||
|
|
||||||
|
VAR
|
||||||
|
CIP_Run : "Struct";
|
||||||
|
Status : "Struct";
|
||||||
|
General_Data : "Struct";
|
||||||
|
LinkProgramEditDataSave : STRUCT
|
||||||
|
_LinkName : String[32];
|
||||||
|
CIP_Simple_Prog : STRUCT
|
||||||
|
CIP_SimpleCode : Int;
|
||||||
|
CIP_SetPoint_Temp : Real;
|
||||||
|
CIP_SetPoint_Cond : Real;
|
||||||
|
CIP_SetPoint_Time : Int;
|
||||||
|
CIP_Chemical : "Struct";
|
||||||
|
CIP_HotWaterPreLoad : Bool;
|
||||||
|
CIP_ChemicalRecovery : Bool;
|
||||||
|
CIP_WaterRecovery : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
mCIP_ActualStep : STRUCT
|
||||||
|
CIP_StepTime : Int := 0;
|
||||||
|
CIP_Temp_En : Bool := FALSE;
|
||||||
|
CIP_RVN301 : Bool := FALSE;
|
||||||
|
CIP_RVN302 : Bool := FALSE;
|
||||||
|
CIP_RVP303 : Bool := FALSE;
|
||||||
|
CIP_CO2_Inj : Bool := FALSE;
|
||||||
|
CIP_AVM313 : Bool := FALSE;
|
||||||
|
CIP_AVN314 : Bool := FALSE;
|
||||||
|
CIP_AVM315 : Bool := FALSE;
|
||||||
|
CIP_AVP316 : Bool := FALSE;
|
||||||
|
CIP_AVM317 : Bool := FALSE;
|
||||||
|
CIP_AVM322 : Bool := FALSE;
|
||||||
|
CIP_AVM323 : Bool := FALSE;
|
||||||
|
CIP_AVP324 : Bool := FALSE;
|
||||||
|
CIP_AVN327 : Bool := FALSE;
|
||||||
|
CIP_AVS331 : Bool := FALSE;
|
||||||
|
CIP_AVS332 : Bool := FALSE;
|
||||||
|
CIP_AVS333 : Bool := FALSE;
|
||||||
|
CIP_AVS334 : Bool := FALSE;
|
||||||
|
CIP_AVS335 : Bool := FALSE;
|
||||||
|
CIP_AVS336 : Bool := FALSE;
|
||||||
|
CIP_AVS337 : Bool := FALSE;
|
||||||
|
CIP_AVS338 : Bool := FALSE;
|
||||||
|
CIP_AVS339 : Bool := FALSE;
|
||||||
|
CIP_AVS340 : Bool := FALSE;
|
||||||
|
CIP_AVS341 : Bool := FALSE;
|
||||||
|
CIP_AVS342 : Bool := FALSE;
|
||||||
|
CIP_AVS343 : Bool := FALSE;
|
||||||
|
CIP_AVS344 : Bool := FALSE;
|
||||||
|
CIP_AVS345 : Bool := FALSE;
|
||||||
|
CIP_AVS349 : Bool := FALSE;
|
||||||
|
CIP_AVS351 : Bool := FALSE;
|
||||||
|
CIP_AVS353 : Bool := FALSE;
|
||||||
|
CIP_AVP344 : Bool := FALSE;
|
||||||
|
CIP_AVM345 : Bool := FALSE;
|
||||||
|
CIP_AVP361 : Bool := FALSE;
|
||||||
|
CIP_AVM369 : Bool := FALSE;
|
||||||
|
CIP_AVM371 : Bool := FALSE;
|
||||||
|
CIP_AVM380 : Bool := FALSE;
|
||||||
|
CIP_AVM381 : Bool := FALSE;
|
||||||
|
CIP_AVP388 : Bool := FALSE;
|
||||||
|
CIP_AVM388 : Bool := FALSE;
|
||||||
|
CIP_AVM389 : Bool := FALSE;
|
||||||
|
CIP_CIPRunning : Bool := FALSE;
|
||||||
|
CIP_CIPDrainRequest : Bool := FALSE;
|
||||||
|
CIP_CIPHotPhase : Bool := FALSE;
|
||||||
|
CIP_PPN301 : Bool := FALSE;
|
||||||
|
CIP_SyrRoomPump : Bool := FALSE;
|
||||||
|
CIP_HOTWaterReq : Bool := FALSE;
|
||||||
|
CIP_SendSodaBack : Bool := FALSE;
|
||||||
|
CIP_Control : STRUCT
|
||||||
|
Temperature_Ok : Bool := FALSE;
|
||||||
|
HighConductivity : Bool := FALSE;
|
||||||
|
LowConductivity : Bool := FALSE;
|
||||||
|
ProdTankMaxLev : Bool := FALSE;
|
||||||
|
ReadyForCIP : Bool := FALSE;
|
||||||
|
DrainCompleted : Bool := FALSE;
|
||||||
|
CIPCycleEnded : Bool := FALSE;
|
||||||
|
CIPChangeReady : Bool := FALSE;
|
||||||
|
CIPHotWaterReceiving : Bool := FALSE;
|
||||||
|
CIPHotWaterStop : Bool := FALSE;
|
||||||
|
CIPLowLevel : Bool := FALSE;
|
||||||
|
SyrupTankMaxLev : Bool := FALSE;
|
||||||
|
DeairTankMaxLev : Bool := FALSE;
|
||||||
|
CIPFreeSodaTank : Bool := FALSE;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
CIP_StatusMsgCode : Int := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
mCIP_StepEmpty : STRUCT
|
||||||
|
CIP_StepTime : Int := 0;
|
||||||
|
CIP_Temp_En : Bool := FALSE;
|
||||||
|
CIP_RVN301 : Bool := FALSE;
|
||||||
|
CIP_RVN302 : Bool := FALSE;
|
||||||
|
CIP_RVP303 : Bool := FALSE;
|
||||||
|
CIP_CO2_Inj : Bool := FALSE;
|
||||||
|
CIP_AVM313 : Bool := FALSE;
|
||||||
|
CIP_AVN314 : Bool := FALSE;
|
||||||
|
CIP_AVM315 : Bool := FALSE;
|
||||||
|
CIP_AVP316 : Bool := FALSE;
|
||||||
|
CIP_AVM317 : Bool := FALSE;
|
||||||
|
CIP_AVM322 : Bool := FALSE;
|
||||||
|
CIP_AVM323 : Bool := FALSE;
|
||||||
|
CIP_AVP324 : Bool := FALSE;
|
||||||
|
CIP_AVN327 : Bool := FALSE;
|
||||||
|
CIP_AVS331 : Bool := FALSE;
|
||||||
|
CIP_AVS332 : Bool := FALSE;
|
||||||
|
CIP_AVS333 : Bool := FALSE;
|
||||||
|
CIP_AVS334 : Bool := FALSE;
|
||||||
|
CIP_AVS335 : Bool := FALSE;
|
||||||
|
CIP_AVS336 : Bool := FALSE;
|
||||||
|
CIP_AVS337 : Bool := FALSE;
|
||||||
|
CIP_AVS338 : Bool := FALSE;
|
||||||
|
CIP_AVS339 : Bool := FALSE;
|
||||||
|
CIP_AVS340 : Bool := FALSE;
|
||||||
|
CIP_AVS341 : Bool := FALSE;
|
||||||
|
CIP_AVS342 : Bool := FALSE;
|
||||||
|
CIP_AVS343 : Bool := FALSE;
|
||||||
|
CIP_AVS344 : Bool := FALSE;
|
||||||
|
CIP_AVS345 : Bool := FALSE;
|
||||||
|
CIP_AVS349 : Bool := FALSE;
|
||||||
|
CIP_AVS351 : Bool := FALSE;
|
||||||
|
CIP_AVS353 : Bool := FALSE;
|
||||||
|
CIP_AVP344 : Bool := FALSE;
|
||||||
|
CIP_AVM345 : Bool := FALSE;
|
||||||
|
CIP_AVP361 : Bool := FALSE;
|
||||||
|
CIP_AVM369 : Bool := FALSE;
|
||||||
|
CIP_AVM371 : Bool := FALSE;
|
||||||
|
CIP_AVM380 : Bool := FALSE;
|
||||||
|
CIP_AVM381 : Bool := FALSE;
|
||||||
|
CIP_AVP388 : Bool := FALSE;
|
||||||
|
CIP_AVM388 : Bool := FALSE;
|
||||||
|
CIP_AVM389 : Bool := FALSE;
|
||||||
|
CIP_CIPRunning : Bool := FALSE;
|
||||||
|
CIP_CIPDrainRequest : Bool := FALSE;
|
||||||
|
CIP_CIPHotPhase : Bool := FALSE;
|
||||||
|
CIP_PPN301 : Bool := FALSE;
|
||||||
|
CIP_SyrRoomPump : Bool := FALSE;
|
||||||
|
CIP_HOTWaterReq : Bool := FALSE;
|
||||||
|
CIP_SendSodaBack : Bool := FALSE;
|
||||||
|
CIP_Control : STRUCT
|
||||||
|
Temperature_Ok : Bool := FALSE;
|
||||||
|
HighConductivity : Bool := FALSE;
|
||||||
|
LowConductivity : Bool := FALSE;
|
||||||
|
ProdTankMaxLev : Bool := FALSE;
|
||||||
|
ReadyForCIP : Bool := FALSE;
|
||||||
|
DrainCompleted : Bool := FALSE;
|
||||||
|
CIPCycleEnded : Bool := FALSE;
|
||||||
|
CIPChangeReady : Bool := FALSE;
|
||||||
|
CIPHotWaterReceiving : Bool := FALSE;
|
||||||
|
CIPHotWaterStop : Bool := FALSE;
|
||||||
|
CIPLowLevel : Bool := FALSE;
|
||||||
|
SyrupTankMaxLev : Bool := FALSE;
|
||||||
|
DeairTankMaxLev : Bool := FALSE;
|
||||||
|
CIPFreeSodaTank : Bool := FALSE;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
CIP_StatusMsgCode : Int := 0;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
mCIP_SimpleEmpty : STRUCT
|
||||||
|
CIP_StepTime : Int;
|
||||||
|
CIP_Temp_En : Bool;
|
||||||
|
CIP_RVN301 : Bool;
|
||||||
|
CIP_RVN302 : Bool;
|
||||||
|
CIP_RVP303 : Bool;
|
||||||
|
CIP_CO2_Inj : Bool;
|
||||||
|
CIP_AVM313 : Bool;
|
||||||
|
CIP_AVN314 : Bool;
|
||||||
|
CIP_AVM315 : Bool;
|
||||||
|
CIP_AVP316 : Bool;
|
||||||
|
CIP_AVM317 : Bool;
|
||||||
|
CIP_AVM322 : Bool;
|
||||||
|
CIP_AVM323 : Bool;
|
||||||
|
CIP_AVP324 : Bool;
|
||||||
|
CIP_AVN327 : Bool;
|
||||||
|
CIP_AVS331 : Bool;
|
||||||
|
CIP_AVS332 : Bool;
|
||||||
|
CIP_AVS333 : Bool;
|
||||||
|
CIP_AVS334 : Bool;
|
||||||
|
CIP_AVS335 : Bool;
|
||||||
|
CIP_AVS336 : Bool;
|
||||||
|
CIP_AVS337 : Bool;
|
||||||
|
CIP_AVS338 : Bool;
|
||||||
|
CIP_AVS339 : Bool;
|
||||||
|
CIP_AVS340 : Bool;
|
||||||
|
CIP_AVS341 : Bool;
|
||||||
|
CIP_AVS342 : Bool;
|
||||||
|
CIP_AVS343 : Bool;
|
||||||
|
CIP_AVS344 : Bool;
|
||||||
|
CIP_AVS345 : Bool;
|
||||||
|
CIP_AVS349 : Bool;
|
||||||
|
CIP_AVS351 : Bool;
|
||||||
|
CIP_AVS353 : Bool;
|
||||||
|
CIP_AVP344 : Bool;
|
||||||
|
CIP_AVM345 : Bool;
|
||||||
|
CIP_AVP361 : Bool;
|
||||||
|
CIP_AVM369 : Bool;
|
||||||
|
CIP_AVM371 : Bool;
|
||||||
|
CIP_AVM380 : Bool;
|
||||||
|
CIP_AVM381 : Bool;
|
||||||
|
CIP_AVP388 : Bool;
|
||||||
|
CIP_AVM388 : Bool;
|
||||||
|
CIP_AVM389 : Bool;
|
||||||
|
CIP_CIPRunning : Bool;
|
||||||
|
CIP_CIPDrainRequest : Bool;
|
||||||
|
CIP_CIPHotPhase : Bool;
|
||||||
|
CIP_PPN301 : Bool;
|
||||||
|
CIP_SyrRoomPump : Bool;
|
||||||
|
CIP_HOTWaterReq : Bool;
|
||||||
|
CIP_SendSodaBack : Bool;
|
||||||
|
CIP_Control : STRUCT
|
||||||
|
Temperature_Ok : Bool;
|
||||||
|
HighConductivity : Bool;
|
||||||
|
LowConductivity : Bool;
|
||||||
|
ProdTankMaxLev : Bool;
|
||||||
|
ReadyForCIP : Bool;
|
||||||
|
DrainCompleted : Bool;
|
||||||
|
CIPCycleEnded : Bool;
|
||||||
|
CIPChangeReady : Bool;
|
||||||
|
CIPHotWaterReceiving : Bool;
|
||||||
|
CIPHotWaterStop : Bool;
|
||||||
|
CIPLowLevel : Bool;
|
||||||
|
SyrupTankMaxLev : Bool;
|
||||||
|
DeairTankMaxLev : Bool;
|
||||||
|
CIPFreeSodaTank : Bool;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
CIP_StatusMsgCode : Int;
|
||||||
|
END_STRUCT;
|
||||||
|
|
||||||
|
END_VAR
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
// Data Blocks have no executable code
|
||||||
|
END_DATA_BLOCK
|
||||||
|
|
||||||
|
```
|
|
@ -0,0 +1,15 @@
|
||||||
|
# UDT: CIP_Simple_Type
|
||||||
|
|
||||||
|
## Members
|
||||||
|
|
||||||
|
| Name | Datatype | Start Value | Comment |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `CIP_SimpleCode` | `Int` | `` | |
|
||||||
|
| `CIP_SetPoint_Temp` | `Real` | `` | |
|
||||||
|
| `CIP_SetPoint_Cond` | `Real` | `` | |
|
||||||
|
| `CIP_SetPoint_Time` | `Int` | `` | |
|
||||||
|
| `CIP_Chemical` | `Struct` | `` | |
|
||||||
|
| `CIP_HotWaterPreLoad` | `Bool` | `` | |
|
||||||
|
| `CIP_ChemicalRecovery` | `Bool` | `` | |
|
||||||
|
| `CIP_WaterRecovery` | `Bool` | `` | |
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
# UDT: CIP_Step_Type
|
||||||
|
|
||||||
|
## Members
|
||||||
|
|
||||||
|
| Name | Datatype | Start Value | Comment |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `CIP_StepTime` | `Int` | `` | |
|
||||||
|
| `CIP_Temp_En` | `Bool` | `` | |
|
||||||
|
| `CIP_RVN301` | `Bool` | `` | |
|
||||||
|
| `CIP_RVN302` | `Bool` | `` | |
|
||||||
|
| `CIP_RVP303` | `Bool` | `` | |
|
||||||
|
| `CIP_CO2_Inj` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM313` | `Bool` | `` | |
|
||||||
|
| `CIP_AVN314` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM315` | `Bool` | `` | |
|
||||||
|
| `CIP_AVP316` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM317` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM322` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM323` | `Bool` | `` | |
|
||||||
|
| `CIP_AVP324` | `Bool` | `` | |
|
||||||
|
| `CIP_AVN327` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS331` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS332` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS333` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS334` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS335` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS336` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS337` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS338` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS339` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS340` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS341` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS342` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS343` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS344` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS345` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS349` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS351` | `Bool` | `` | |
|
||||||
|
| `CIP_AVS353` | `Bool` | `` | |
|
||||||
|
| `CIP_AVP344` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM345` | `Bool` | `` | |
|
||||||
|
| `CIP_AVP361` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM369` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM371` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM380` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM381` | `Bool` | `` | |
|
||||||
|
| `CIP_AVP388` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM388` | `Bool` | `` | |
|
||||||
|
| `CIP_AVM389` | `Bool` | `` | |
|
||||||
|
| `CIP_CIPRunning` | `Bool` | `` | |
|
||||||
|
| `CIP_CIPDrainRequest` | `Bool` | `` | |
|
||||||
|
| `CIP_CIPHotPhase` | `Bool` | `` | |
|
||||||
|
| `CIP_PPN301` | `Bool` | `` | |
|
||||||
|
| `CIP_SyrRoomPump` | `Bool` | `` | |
|
||||||
|
| `CIP_HOTWaterReq` | `Bool` | `` | |
|
||||||
|
| `CIP_SendSodaBack` | `Bool` | `` | |
|
||||||
|
| `CIP_Control` | `"CIP_WaitEvent_Type"` | `` | |
|
||||||
|
| `CIP_StatusMsgCode` | `Int` | `` | |
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
# UDT: CIP_WaitEvent_Type
|
||||||
|
|
||||||
|
## Members
|
||||||
|
|
||||||
|
| Name | Datatype | Start Value | Comment |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `Temperature_Ok` | `Bool` | `` | |
|
||||||
|
| `HighConductivity` | `Bool` | `` | |
|
||||||
|
| `LowConductivity` | `Bool` | `` | |
|
||||||
|
| `ProdTankMaxLev` | `Bool` | `` | |
|
||||||
|
| `ReadyForCIP` | `Bool` | `` | |
|
||||||
|
| `DrainCompleted` | `Bool` | `` | |
|
||||||
|
| `CIPCycleEnded` | `Bool` | `` | |
|
||||||
|
| `CIPChangeReady` | `Bool` | `` | |
|
||||||
|
| `CIPHotWaterReceiving` | `Bool` | `` | |
|
||||||
|
| `CIPHotWaterStop` | `Bool` | `` | |
|
||||||
|
| `CIPLowLevel` | `Bool` | `` | |
|
||||||
|
| `SyrupTankMaxLev` | `Bool` | `` | |
|
||||||
|
| `DeairTankMaxLev` | `Bool` | `` | |
|
||||||
|
| `CIPFreeSodaTank` | `Bool` | `` | |
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue