vault backup: 2025-06-09 16:22:34

This commit is contained in:
Miguel 2025-06-09 16:22:34 +02:00
parent 0e76cb0e71
commit 36a3ec33e7
29 changed files with 4340 additions and 201 deletions

View File

@ -1,7 +1,6 @@
[ [
"mousewheel-image-zoom", "mousewheel-image-zoom",
"obsidian-image-toolkit", "obsidian-image-toolkit",
"numerals",
"copy-as-html", "copy-as-html",
"copy-document-as-html", "copy-document-as-html",
"obsidian-pandoc", "obsidian-pandoc",
@ -23,9 +22,9 @@
"recent-files-obsidian", "recent-files-obsidian",
"obsidian-auto-link-title", "obsidian-auto-link-title",
"advanced-canvas", "advanced-canvas",
"obsidian-minimal-settings",
"obsidian-mindmap-nextgen", "obsidian-mindmap-nextgen",
"obsidian-plantuml", "obsidian-plantuml",
"mcp-tools", "mcp-tools",
"obsidian-local-rest-api" "obsidian-local-rest-api",
"obsidian-excel-to-markdown-table"
] ]

View File

@ -102,6 +102,223 @@
"version": 2, "version": 2,
"source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.9.2", "source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.9.2",
"libraryItems": [ "libraryItems": [
{
"id": "Jcb27Z7tsLyhmBl-4Yl7A",
"status": "unpublished",
"elements": [
{
"id": "e01IusppIXekthvQI4dsi",
"type": "rectangle",
"x": -646.8844788749002,
"y": -374.28650595561646,
"width": 22.13098427962416,
"height": 22.13098427962416,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"zoxFXczlNsNs7_uDZMfy8"
],
"frameId": null,
"index": "aN",
"roundness": null,
"seed": 1261532191,
"version": 64,
"versionNonce": 1784958993,
"isDeleted": false,
"boundElements": [],
"updated": 1749053618097,
"link": null,
"locked": false
},
{
"id": "OJsW5dAkHk_bM3YQqzdLc",
"type": "line",
"x": -646.9383377449386,
"y": -374.18299579915805,
"width": 21.67528767610702,
"height": 21.67528767610696,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"zoxFXczlNsNs7_uDZMfy8"
],
"frameId": null,
"index": "aO",
"roundness": null,
"seed": 176168273,
"version": 35,
"versionNonce": 416626047,
"isDeleted": false,
"boundElements": [],
"updated": 1749053618097,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
21.67528767610702,
21.67528767610696
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "qVrEcAmiTyjmVNhcIpBbv",
"type": "line",
"x": -646.9383377449386,
"y": -370.4296992318668,
"width": 18.20348835136258,
"height": 18.20348835136258,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"zoxFXczlNsNs7_uDZMfy8"
],
"frameId": null,
"index": "aP",
"roundness": null,
"seed": 255581791,
"version": 36,
"versionNonce": 1919034865,
"isDeleted": false,
"boundElements": [],
"updated": 1749053618097,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
18.20348835136258,
18.20348835136258
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "2LRECUsuFp9ZwO3Yh5ZDs",
"type": "line",
"x": -646.9383377449386,
"y": -365.73807852275274,
"width": 13.473250240646507,
"height": 13.533411429315947,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"zoxFXczlNsNs7_uDZMfy8"
],
"frameId": null,
"index": "aQ",
"roundness": null,
"seed": 2651295,
"version": 33,
"versionNonce": 2024811935,
"isDeleted": false,
"boundElements": [],
"updated": 1749053618097,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
13.473250240646507,
13.533411429315947
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
},
{
"id": "K5zwTUBZbp8soB1Y2dF15",
"type": "line",
"x": -646.9383377449386,
"y": -359.54513918672217,
"width": 7.487284433781497,
"height": 7.366962056442219,
"angle": 0,
"strokeColor": "#1971c2",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 0.5,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [
"zoxFXczlNsNs7_uDZMfy8"
],
"frameId": null,
"index": "aR",
"roundness": null,
"seed": 387931679,
"version": 33,
"versionNonce": 1273642961,
"isDeleted": false,
"boundElements": [],
"updated": 1749053618097,
"link": null,
"locked": false,
"points": [
[
0,
0
],
[
7.487284433781497,
7.366962056442219
]
],
"lastCommittedPoint": null,
"startBinding": null,
"endBinding": null,
"startArrowhead": null,
"endArrowhead": null
}
],
"created": 1749053623052
},
{ {
"id": "qLdU5G5F49LoCvIYKf21c", "id": "qLdU5G5F49LoCvIYKf21c",
"status": "unpublished", "status": "unpublished",

View File

@ -0,0 +1,230 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/main.ts
__export(exports, {
default: () => ExcelToMarkdownTablePlugin
});
var import_obsidian = __toModule(require("obsidian"));
// src/table-alignment-syntax.ts
var ALIGNED_LEFT_SYNTAX = {
prefix: "",
postfix: "",
adjust: 0
};
var ALIGNED_RIGHT_SYNTAX = {
prefix: "",
postfix: ":",
adjust: 1
};
var ALIGNED_CENTER_SYNTAX = {
prefix: ":",
postfix: ":",
adjust: 2
};
// src/excel-markdown-helpers.ts
var ALIGNED_LEFT = "l";
var ALIGNED_RIGHT = "r";
var ALIGNED_CENTER = "c";
var EXCEL_COLUMN_DELIMITER = " ";
var MARKDOWN_NEWLINE = "<br/>";
var UNESCAPED_DOUBLE_QUOTE = '"';
var EXCEL_ROW_DELIMITER_REGEX = /[\n\u0085\u2028\u2029]|\r\n?/g;
var COLUMN_ALIGNMENT_REGEX = /^(\^[lcr])/i;
var EXCEL_NEWLINE_ESCAPED_CELL_REGEX = /"([^\t]*(?<=[^\r])\n[^\t]*)"/g;
var EXCEL_NEWLINE_REGEX = /\n/g;
var EXCEL_DOUBLE_QUOTE_ESCAPED_REGEX = /""/g;
function addMarkdownSyntax(rows, columnWidths) {
return rows.map(function(row, rowIndex) {
return "| " + row.map(function(column, index) {
column = column.replace("|", "\\|");
return column + Array(columnWidths[index] - column.length + 1).join(" ");
}).join(" | ") + " |";
});
}
function addAlignmentSyntax(markdownRows, columnWidths, colAlignments) {
let result = Object.assign([], markdownRows);
result.splice(1, 0, "|" + columnWidths.map(function(width, index) {
let { prefix, postfix, adjust } = calculateAlignmentMarkdownSyntaxMetadata(colAlignments[index]);
return prefix + Array(columnWidths[index] + 3 - adjust).join("-") + postfix;
}).join("|") + "|");
return result;
}
function calculateAlignmentMarkdownSyntaxMetadata(alignment) {
switch (alignment) {
case ALIGNED_LEFT:
return ALIGNED_LEFT_SYNTAX;
case ALIGNED_CENTER:
return ALIGNED_CENTER_SYNTAX;
case ALIGNED_RIGHT:
return ALIGNED_RIGHT_SYNTAX;
default:
return ALIGNED_LEFT_SYNTAX;
}
}
function getColumnWidthsAndAlignments(rows) {
let colAlignments = [];
return {
columnWidths: rows[0].map(function(column, columnIndex) {
let alignment = columnAlignment(column);
colAlignments.push(alignment);
column = column.replace(COLUMN_ALIGNMENT_REGEX, "");
rows[0][columnIndex] = column;
return columnWidth(rows, columnIndex);
}),
colAlignments
};
}
function columnAlignment(columnHeaderText) {
var m = columnHeaderText.match(COLUMN_ALIGNMENT_REGEX);
if (m) {
var alignChar = m[1][1].toLowerCase();
return columnAlignmentFromChar(alignChar);
}
return ALIGNED_LEFT;
}
function columnAlignmentFromChar(alignChar) {
switch (alignChar) {
case ALIGNED_LEFT:
return ALIGNED_LEFT;
case ALIGNED_CENTER:
return ALIGNED_CENTER;
case ALIGNED_RIGHT:
return ALIGNED_RIGHT;
default:
return ALIGNED_LEFT;
}
}
function columnWidth(rows, columnIndex) {
return Math.max.apply(null, rows.map(function(row) {
return row[columnIndex] && row[columnIndex].length || 0;
}));
}
function splitIntoRowsAndColumns(data) {
var rows = data.split(EXCEL_ROW_DELIMITER_REGEX).map(function(row) {
return row.split(EXCEL_COLUMN_DELIMITER);
});
return rows;
}
function replaceIntraCellNewline(data) {
let cellReplacer = (_) => _.slice(1, -1).replace(EXCEL_DOUBLE_QUOTE_ESCAPED_REGEX, UNESCAPED_DOUBLE_QUOTE).replace(EXCEL_NEWLINE_REGEX, MARKDOWN_NEWLINE);
return data.replace(EXCEL_NEWLINE_ESCAPED_CELL_REGEX, cellReplacer);
}
// src/excel-markdown-tables.ts
var LINE_ENDING = "\n";
function excelToMarkdown(rawData) {
let data = rawData.trim();
var intraCellNewlineReplacedData = replaceIntraCellNewline(data);
var rows = splitIntoRowsAndColumns(intraCellNewlineReplacedData);
var { columnWidths, colAlignments } = getColumnWidthsAndAlignments(rows);
const markdownRows = addMarkdownSyntax(rows, columnWidths);
return addAlignmentSyntax(markdownRows, columnWidths, colAlignments).join(LINE_ENDING);
}
function getExcelRows(rawData) {
let data = rawData.trim();
var intraCellNewlineReplacedData = replaceIntraCellNewline(data);
return splitIntoRowsAndColumns(intraCellNewlineReplacedData);
}
function excelRowsToMarkdown(rows) {
var { columnWidths, colAlignments } = getColumnWidthsAndAlignments(rows);
const markdownRows = addMarkdownSyntax(rows, columnWidths);
return addAlignmentSyntax(markdownRows, columnWidths, colAlignments).join(LINE_ENDING);
}
function isExcelData(rows) {
return rows && rows[0] && rows[0].length > 1 ? true : false;
}
// src/main.ts
var ExcelToMarkdownTablePlugin = class extends import_obsidian.Plugin {
constructor() {
super(...arguments);
this.pasteHandler = (evt, editor) => {
if (evt.clipboardData === null) {
return;
}
if (evt.clipboardData.types.length === 1 && evt.clipboardData.types[0] === "text/plain") {
return;
}
const rawData = evt.clipboardData.getData("text");
const rows = getExcelRows(rawData);
if (isExcelData(rows)) {
const markdownData = excelRowsToMarkdown(rows);
editor.replaceSelection(markdownData + "\n");
evt.preventDefault();
}
};
}
onload() {
return __async(this, null, function* () {
this.addCommand({
id: "excel-to-markdown-table",
name: "Excel to Markdown",
hotkeys: [
{
modifiers: ["Mod", "Alt"],
key: "v"
}
],
editorCallback: (editor, view) => __async(this, null, function* () {
const text = yield navigator.clipboard.readText();
editor.replaceSelection(excelToMarkdown(text));
})
});
this.app.workspace.on("editor-paste", this.pasteHandler);
});
}
onunload() {
this.app.workspace.off("editor-paste", this.pasteHandler);
}
};
/* nosourcemap */

View File

@ -0,0 +1,10 @@
{
"id": "obsidian-excel-to-markdown-table",
"name": "Excel to Markdown Table",
"version": "0.4.0",
"minAppVersion": "0.12.0",
"description": "An Obsidian plugin to paste data from Microsoft Excel, Google Sheets, Apple Numbers and LibreOffice Calc as Markdown tables in Obsidian editor.",
"author": "Ganessh Kumar R P <rpganesshkumar@gmail.com>",
"authorUrl": "https://ganesshkumar.com",
"isDesktopOnly": false
}

View File

@ -0,0 +1 @@

View File

@ -1,7 +1,6 @@
{ {
"version": "2.0", "version": "2.0",
"layout": [ "layout": [
null,
null, null,
null, null,
null null

View File

@ -1,5 +1,141 @@
{ {
"recentFiles": [ "recentFiles": [
{
"basename": "PLC IO Tags",
"path": "03-VM/44 - 98050 - Fiera/IO/PLC IO Tags.md"
},
{
"basename": "Problem with drag&drop or Left Click",
"path": "01-Documentation/Dispositivos - Manuales/Mouse/Problem with drag&drop or Left Click.md"
},
{
"basename": "Mapping Divider",
"path": "03-VM/44 - 98050 - Fiera/IO/Mapping Divider.md"
},
{
"basename": "SysInternals Tools - WinInternals",
"path": "01-Documentation/Windows/SysInternals Tools - WinInternals.md"
},
{
"basename": "Device IO Tags",
"path": "03-VM/44 - 98050 - Fiera/IO/Device IO Tags.md"
},
{
"basename": "AI Prompts useful",
"path": "01-Documentation/AI - IA - LLM - Artificial Intelligence/AI Prompts useful.md"
},
{
"basename": "Layout - Anello-Ring",
"path": "03-VM/44 - 98050 - Fiera/Layout - Anello-Ring.md"
},
{
"basename": "IO - Ips Nodes",
"path": "03-VM/44 - 98050 - Fiera/IO - Ips Nodes.md"
},
{
"basename": "DAR Description - DIET AS REGULAR - SAE452 San Giorgio in Bosco",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/DAR Description - DIET AS REGULAR - SAE452 San Giorgio in Bosco.md"
},
{
"basename": "98050_Hardware",
"path": "03-VM/44 - 98050 - Fiera/98050_Hardware.md"
},
{
"basename": "Conda - Anaconda - miniconda",
"path": "01-Documentation/Python/Scripts Python/Conda - Anaconda - miniconda.md"
},
{
"basename": "Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp",
"path": "03-VM/44 - 98050 - Fiera/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp.md"
},
{
"basename": "Calc v0.3 Pure",
"path": "01-Documentation/Python/Scripts Python/Calc/Calc v0.3 Pure.md"
},
{
"basename": "Calc v0.2",
"path": "01-Documentation/Python/Scripts Python/Calc/Calc v0.2.md"
},
{
"basename": "Calc v0.1",
"path": "01-Documentation/Python/Scripts Python/Calc/Calc v0.1.md"
},
{
"basename": "Miniconda Como hacer un backup completo de un entorno creado con Miniconda",
"path": "01-Documentation/Python/Scripts Python/Miniconda Como hacer un backup completo de un entorno creado con Miniconda.md"
},
{
"basename": "Group Scripts Manager",
"path": "01-Documentation/Python/Scripts Python/Group Scripts Manager.md"
},
{
"basename": "Notes - Update Multilane Table",
"path": "03-VM/41 - 94154 - Update Multilane Table/Notes - Update Multilane Table.md"
},
{
"basename": "Backups - Mikrotik",
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md"
},
{
"basename": "Mikrotik - Comandos WIFI - Clientes de wlan y CAP",
"path": "01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik - Comandos WIFI - Clientes de wlan y CAP.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": "Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.0 - Ita",
"path": "03-VM/44 - 98050 - Fiera/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.0 - Ita.md"
},
{
"basename": "Drawing 2025-02-24 19.56.40.excalidraw",
"path": "03-VM/41 - 94154 - Update Multilane Table/Drawing 2025-02-24 19.56.40.excalidraw.md"
},
{
"basename": "Drawing 2025-02-25 18.12.26.excalidraw",
"path": "03-VM/41 - 94154 - Update Multilane Table/Drawing 2025-02-25 18.12.26.excalidraw.md"
},
{
"basename": "IPs & Address - Master - Vetromeccanica",
"path": "03-VM/9..... MASTER Transport/Standard Transport/IPs & Address - Master - Vetromeccanica.md"
},
{
"basename": "Autocad - useful Commands",
"path": "01-Documentation/Autocad - Acad/Autocad - useful Commands.md"
},
{
"basename": "Autocad - Acad - show all layers - unlock all layers",
"path": "01-Documentation/Autocad - Acad/Autocad - Acad - show all layers - unlock all layers.md"
},
{
"basename": "Minimotor - Setup - Chingiolli - FC6",
"path": "01-Documentation/Vetromeccanica/Minimotor - FC6/Minimotor - Setup - Chingiolli - FC6.md"
},
{
"basename": "Minimotor - Encoder setup",
"path": "01-Documentation/Vetromeccanica/Minimotor - FC6/Minimotor - Encoder setup.md"
},
{
"basename": "Drawing 2024-04-03 11.29.20.excalidraw",
"path": "01-Documentation/Vetromeccanica/Minimotor - FC6/Drawing 2024-04-03 11.29.20.excalidraw.md"
},
{
"basename": "Siemens HMI Translate - Python - LLM - Google Translate",
"path": "01-Documentation/Python/Scripts Python/Siemens HMI Translate - Python - LLM - Google Translate.md"
},
{
"basename": "MR-J4",
"path": "01-Documentation/Inverters/Mitsubishi/MR-J4.md"
},
{
"basename": "Test - Fatto su Maselli - 06-05-2025",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/Documentation/Test - Fatto su Maselli - 06-05-2025.md"
},
{
"basename": "Hardware used for 485-TCP",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Hardware used for 485-TCP.md"
},
{ {
"basename": "FB2120 - MasseliTCP Read - v1.8", "basename": "FB2120 - MasseliTCP Read - v1.8",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - v1.8.md" "path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - v1.8.md"
@ -8,10 +144,6 @@
"basename": "FB2120 - MasseliTCP Read - Descrizzione Software - v1.8", "basename": "FB2120 - MasseliTCP Read - Descrizzione Software - v1.8",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - Descrizzione Software - v1.8.md" "path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - Descrizzione Software - v1.8.md"
}, },
{
"basename": "Hardware used for 485-TCP",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Hardware used for 485-TCP.md"
},
{ {
"basename": "Versiones", "basename": "Versiones",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Versiones.md" "path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Versiones.md"
@ -24,10 +156,6 @@
"basename": "Maselli - ADAM - Protocol", "basename": "Maselli - ADAM - Protocol",
"path": "01-Documentation/Dispositivos - Manuales/Maselli/Maselli - ADAM - Protocol.md" "path": "01-Documentation/Dispositivos - Manuales/Maselli/Maselli - ADAM - Protocol.md"
}, },
{
"basename": "Progetto 98050 Fiera - Tavolo di accumulo",
"path": "03-VM/44 - 98050 - Fiera/Progetto 98050 Fiera - Tavolo di accumulo.md"
},
{ {
"basename": "Install Docker on Ubuntu", "basename": "Install Docker on Ubuntu",
"path": "01-Documentation/Dockers/Install Docker on Ubuntu.md" "path": "01-Documentation/Dockers/Install Docker on Ubuntu.md"
@ -56,14 +184,6 @@
"basename": "Waveshare RS232-485 Ethernet - Wifi - ADAM 4021 - Using Serial200", "basename": "Waveshare RS232-485 Ethernet - Wifi - ADAM 4021 - Using Serial200",
"path": "01-Documentation/Dispositivos - Manuales/Waveshare RS232-485 Ethernet - Wifi/Waveshare RS232-485 Ethernet - Wifi - ADAM 4021 - Using Serial200.md" "path": "01-Documentation/Dispositivos - Manuales/Waveshare RS232-485 Ethernet - Wifi/Waveshare RS232-485 Ethernet - Wifi - ADAM 4021 - Using Serial200.md"
}, },
{
"basename": "DAR Description - DIET AS REGULAR - SAE452 San Giorgio in Bosco",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/DAR Description - DIET AS REGULAR - SAE452 San Giorgio in Bosco.md"
},
{
"basename": "Test - Fatto su Maselli - 06-05-2025",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/Documentation/Test - Fatto su Maselli - 06-05-2025.md"
},
{ {
"basename": "GIT commands HELP", "basename": "GIT commands HELP",
"path": "01-Documentation/GIT - GitHub/GIT commands HELP.md" "path": "01-Documentation/GIT - GitHub/GIT commands HELP.md"
@ -79,118 +199,6 @@
{ {
"basename": "GitHub Privacy", "basename": "GitHub Privacy",
"path": "01-Documentation/GIT - GitHub/GitHub Privacy.md" "path": "01-Documentation/GIT - GitHub/GitHub Privacy.md"
},
{
"basename": "Visit to Maselli 06-05-2025",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/Documentation/Visit to Maselli 06-05-2025.md"
},
{
"basename": "Waveshare RS232-485 Ethernet - Wifi - ADAM 4021 - Using com0com - MaselliSimulatorApp Python",
"path": "01-Documentation/Dispositivos - Manuales/Waveshare RS232-485 Ethernet - Wifi/Waveshare RS232-485 Ethernet - Wifi - ADAM 4021 - Using com0com - MaselliSimulatorApp Python.md"
},
{
"basename": "CableMAX - Converter 485 - Serial Adaptor RS232 - CM-RSDB9-PRO",
"path": "01-Documentation/Dispositivos - Manuales/CableMAX - Converter 485 - Serial Adaptor RS232 - CM-RSDB9-PRO.md"
},
{
"basename": "ADAM 4021 - 485 to 4..20ma - Commissioning & Firmware update",
"path": "01-Documentation/Dispositivos - Manuales/ADAM/ADAM 4021 - 485 to 4..20ma - Commissioning & Firmware update.md"
},
{
"basename": "Maselli Sensor to Siemens PLC Communication Implementation",
"path": "01-Documentation/Dispositivos - Manuales/ADAM/Maselli Sensor to Siemens PLC Communication Implementation.md"
},
{
"basename": "Masselli (UR62 & UR29)",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/Masselli (UR62 & UR29).md"
},
{
"basename": "ADAM -",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/ADAM -.md"
},
{
"basename": "Untitled",
"path": "04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/Untitled.md"
},
{
"basename": "Communication TSEND_C - TRCV_C",
"path": "01-Documentation/Siemens/PLC Siemens/Communication TSEND_C - TRCV_C.md"
},
{
"basename": "Maselli Proprietary Serial-Socket Protocol",
"path": "01-Documentation/Dispositivos - Manuales/Maselli/Maselli - Utility/Maselli Proprietary Serial-Socket Protocol.md"
},
{
"basename": "Maselli - Protocol - Gateway - 485 - Ethernet",
"path": "01-Documentation/Dispositivos - Manuales/Maselli/Maselli - Protocol - Gateway - 485 - Ethernet.md"
},
{
"basename": "Untitled",
"path": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/Untitled.md"
},
{
"basename": "com0com Setup Only version 2.2 - version 3 NOT WORKING with Windows 11",
"path": "01-Documentation/Dispositivos - Manuales/COM - Virtual COM com0com/com0com Setup Only version 2.2 - version 3 NOT WORKING with Windows 11.md"
},
{
"basename": "LAD Descriptions from XDA files from Tia Portal",
"path": "01-Documentation/Python/Scripts Python/XML to SCL Siemens/LAD Descriptions from XDA files from Tia Portal.md"
},
{
"basename": "AI Prompts useful",
"path": "01-Documentation/AI - IA - LLM - Artificial Intelligence/AI Prompts useful.md"
},
{
"basename": "Guía de Exportación a Formato SIMATIC SD con TIA Portal Openness y Csharp",
"path": "01-Documentation/Siemens/Openness/Guía de Exportación a Formato SIMATIC SD con TIA Portal Openness y Csharp.md"
},
{
"basename": "Projects Description",
"path": "04-SIDEL/Projects Description.md"
},
{
"basename": "SAE346 - HMI - Machine Configuration",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - HMI - Machine Configuration.md"
},
{
"basename": "Comm - Mixer - Filler",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/COMM - FILLER - MIXER/Comm - Mixer - Filler.md"
},
{
"basename": "SAE346 - Software adaptation from Master - Notes",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Software adaptation from Master - Notes.md"
},
{
"basename": "SAE346 P&ID",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 P&ID.md"
},
{
"basename": "SAE346 - Signals - CIP - Filler - Syrop",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Signals - CIP - Filler - Syrop.md"
},
{
"basename": "SAE346 - Process diagram",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Process diagram.md"
},
{
"basename": "SAE346 - Master adaptation to compile",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - Master adaptation to compile.md"
},
{
"basename": "SAE346 - IO from Electrical Diagram",
"path": "04-SIDEL/05 - E5.007161 - Modifica O&U - SAE346/SAE346 - IO from Electrical Diagram.md"
},
{
"basename": "Openness Python Library - siemens_tia_scripting",
"path": "01-Documentation/Siemens/Openness/Openness Python Library - siemens_tia_scripting.md"
},
{
"basename": "Untitled",
"path": "04-SIDEL/13 - E5.007560 - Modifica O&U - SAE235/Untitled.md"
},
{
"basename": "Notas para crear nuevas aplicaciones",
"path": "07 - Desarrolo de Proyectos - Scripts - Visual Studio/Proyectos Visual Studio/Notas para crear nuevas aplicaciones.md"
} }
], ],
"omittedPaths": [], "omittedPaths": [],

1763
.obsidian/plugins/solve/main.js vendored Normal file

File diff suppressed because one or more lines are too long

14
.obsidian/plugins/solve/manifest.json vendored Normal file
View File

@ -0,0 +1,14 @@
{
"id": "solve",
"name": "Solve",
"version": "1.1.0",
"minAppVersion": "0.15.0",
"description": "Supercharge your notes with real-time calculations without AI fuss. From dates ('Now + 20 days'), percentages ('10% of 120'), units of measurement ('100cm + 2m'), arithmetic ('10 + 5') and more!",
"author": "Liam Riddell",
"authorUrl": "https://github.com/LiamRiddell",
"fundingUrl": {
"Buy Me a Coffee": "https://www.buymeacoffee.com/liamriddell",
"GitHub Sponser": "https://github.com/sponsors/LiamRiddell"
},
"isDesktopOnly": false
}

76
.obsidian/plugins/solve/styles.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -4,67 +4,49 @@
"type": "split", "type": "split",
"children": [ "children": [
{ {
"id": "06a172e6fdedfbf5", "id": "8d35ee3dbc1e7652",
"type": "tabs", "type": "tabs",
"children": [ "children": [
{ {
"id": "46cbecdfd83b10e4", "id": "db16746106a49cac",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "markdown", "type": "markdown",
"state": { "state": {
"file": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/Documentation/Test - Fatto su Maselli - 06-05-2025.md", "file": "03-VM/44 - 98050 - Fiera/IO/Mapping Divider.md",
"mode": "source", "mode": "source",
"source": false, "source": false,
"backlinks": false "backlinks": false
}, },
"icon": "lucide-file", "icon": "lucide-file",
"title": "Test - Fatto su Maselli - 06-05-2025" "title": "Mapping Divider"
} }
}, },
{ {
"id": "5964c169ed489ae8", "id": "5db613eb1ce999fb",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "markdown", "type": "excalidraw",
"state": { "state": {
"file": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Hardware used for 485-TCP.md", "file": "03-VM/44 - 98050 - Fiera/Layout - Anello-Ring.md"
"mode": "source",
"source": false,
"backlinks": false
}, },
"icon": "lucide-file", "icon": "excalidraw-icon",
"title": "Hardware used for 485-TCP" "title": "Layout - Anello-Ring"
} }
}, },
{ {
"id": "e1a87a8e25c39351", "id": "075404432f3ecddb",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "markdown", "type": "markdown",
"state": { "state": {
"file": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - v1.8.md", "file": "03-VM/44 - 98050 - Fiera/IO/PLC IO Tags.md",
"mode": "source", "mode": "preview",
"source": false, "source": false,
"backlinks": false "backlinks": false
}, },
"icon": "lucide-file", "icon": "lucide-file",
"title": "FB2120 - MasseliTCP Read - v1.8" "title": "PLC IO Tags"
}
},
{
"id": "2bc2280b9c18e51a",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - v1.8.md",
"mode": "source",
"source": false,
"backlinks": false
},
"icon": "lucide-file",
"title": "FB2120 - MasseliTCP Read - v1.8"
} }
} }
], ],
@ -135,7 +117,8 @@
} }
], ],
"direction": "horizontal", "direction": "horizontal",
"width": 286.5 "width": 286.5,
"collapsed": true
}, },
"right": { "right": {
"id": "403186784ae0fd88", "id": "403186784ae0fd88",
@ -151,7 +134,7 @@
"state": { "state": {
"type": "backlink", "type": "backlink",
"state": { "state": {
"file": "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - v1.8.md", "file": "01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md",
"collapseAll": false, "collapseAll": false,
"extraContext": false, "extraContext": false,
"sortOrder": "alphabetical", "sortOrder": "alphabetical",
@ -161,7 +144,7 @@
"unlinkedCollapsed": true "unlinkedCollapsed": true
}, },
"icon": "links-coming-in", "icon": "links-coming-in",
"title": "Backlinks for FB2120 - MasseliTCP Read - v1.8" "title": "Backlinks for Backups - Mikrotik"
} }
}, },
{ {
@ -233,7 +216,8 @@
"title": "Copilot" "title": "Copilot"
} }
} }
] ],
"currentTab": 4
} }
], ],
"direction": "horizontal", "direction": "horizontal",
@ -262,39 +246,44 @@
"obsidian-importer:Open Importer": false "obsidian-importer:Open Importer": false
} }
}, },
"active": "e1a87a8e25c39351", "active": "075404432f3ecddb",
"lastOpenFiles": [ "lastOpenFiles": [
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - Descrizzione Software - v1.8.md", "01-Documentation/Dispositivos - Manuales/Mouse/Problem with drag&drop or Left Click.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Hardware used for 485-TCP.md", "01-Documentation/Dispositivos - Manuales/Mouse",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/FB2120 - MasseliTCP Read - v1.8.md", "03-VM/44 - 98050 - Fiera/IO/PLC IO Tags.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Untitled/Untitled.md", "03-VM/44 - 98050 - Fiera/IO/Mapping Divider.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Untitled/doc1.3.md", "01-Documentation/Windows/SysInternals Tools - WinInternals.md",
"03-VM/44 - 98050 - Fiera/IO/Device IO Tags.md",
"01-Documentation/AI - IA - LLM - Artificial Intelligence/AI Prompts useful.md",
"03-VM/44 - 98050 - Fiera/Layout - Anello-Ring.md",
"03-VM/44 - 98050 - Fiera/IO",
"03-VM/44 - 98050 - Fiera/IO - Ips Nodes.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/DAR Description - DIET AS REGULAR - SAE452 San Giorgio in Bosco.md",
"03-VM/44 - 98050 - Fiera/98050_Hardware.md",
"01-Documentation/Python/Scripts Python/Conda - Anaconda - miniconda.md",
"03-VM/44 - 98050 - Fiera/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.1 - Esp.md",
"03-VM/44 - 98050 - Fiera/98050_PLC_01_CAx_Export_Hardware_Tree.md",
"03-VM/44 - 98050 - Fiera/98050_PLC_01_CAx_Summary.md",
"01-Documentation/Python/Scripts Python/Calc/Calc v0.3 Pure.md",
"01-Documentation/Python/Scripts Python/Calc/Calc v0.2.md",
"01-Documentation/Python/Scripts Python/Calc/Calc v0.1.md",
"01-Documentation/Python/Scripts Python/Calc/Untitled 1.md",
"01-Documentation/Python/Scripts Python/Untitled.md",
"01-Documentation/Python/Scripts Python/Miniconda Como hacer un backup completo de un entorno creado con Miniconda.md",
"01-Documentation/Python/Scripts Python/Calc",
"01-Documentation/Python/Scripts Python/Group Scripts Manager.md",
"03-VM/41 - 94154 - Update Multilane Table/Notes - Update Multilane Table.md",
"01-Documentation/Routers/Mikrotik - Network Redes/Backups - Mikrotik.md",
"01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik - Comandos WIFI - Clientes de wlan y CAP.md",
"01-Documentation/Routers/Mikrotik - Network Redes/Mikrotik - Setup Commands for Layer 2 Wi-Fi Bridge.md",
"03-VM/44 - 98050 - Fiera/Progetto 98050 Fiera - Tavolo di accumulo - Logica - v 0.0 - Ita.md",
"03-VM/44 - 98050 - Fiera/adjuntos/Layout-Model.png",
"03-VM/44 - 98050 - Fiera/adjuntos",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Untitled", "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Untitled",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250530095111.png", "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250530095111.png",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250530095053.png", "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250530095053.png",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Versiones.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Untitled 1.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/Untitled.md",
"01-Documentation/Siemens/PLC Siemens/S7-300 - TCON - TRCV.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250529221344.png", "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250529221344.png",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250529221334.png", "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250529221334.png",
"01-Documentation/Dispositivos - Manuales/Maselli/Maselli - ADAM - Protocol.md",
"03-VM/44 - 98050 - Fiera/Progetto 98050 Fiera - Tavolo di accumulo.md",
"03-VM/44 - 98050 - Fiera/Untitled.md",
"01-Documentation/Dockers/Install Docker on Ubuntu.md",
"03-VM/9..... MASTER Transport/Standard Transport/FB Scan Time - FB1.md",
"04-SIDEL/03 - 5.007382-EXMU01UF - RVU008 - EQPT24731/5.007382-EXMU01UF - RVU008 - EQPT24731 - Initial Data.md",
"03-VM/9..... MASTER Transport/Standard Transport/OB30 Calculation.md",
"03-VM/9..... MASTER Transport/Standard Transport/FB Scan Time OB1 - FB4.md",
"01-Documentation/Dockers/Docker Basics - Essential Commands and Usage Guide.md",
"01-Documentation/Dispositivos - Manuales/Waveshare RS232-485 Ethernet - Wifi/Waveshare RS232-485 Ethernet - Wifi - ADAM 4021 - Using Serial200.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/DAR Description - DIET AS REGULAR - SAE452 San Giorgio in Bosco.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/Documentation/Test - Fatto su Maselli - 06-05-2025.md",
"01-Documentation/GIT - GitHub/GIT commands HELP.md",
"01-Documentation/GIT - GitHub/Notes - Git - Gitea.md",
"01-Documentation/GIT - GitHub/Git - Start New Repository with Visual Studio Code - VS Code.md",
"01-Documentation/GIT - GitHub/GitHub Privacy.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/Documentation/Visit to Maselli 06-05-2025.md",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250526165501.png", "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos/Pasted image 20250526165501.png",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos", "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP/adjuntos",
"04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP", "04-SIDEL/09 - SAE452 - Diet as Regular - San Giovanni in Bosco/FB2120 - MasseliTCP",
@ -304,12 +293,7 @@
"01-Documentation/Dispositivos - Manuales/Waveshare RS232-485 Ethernet - Wifi/adjuntos", "01-Documentation/Dispositivos - Manuales/Waveshare RS232-485 Ethernet - Wifi/adjuntos",
"01-Documentation/Dispositivos - Manuales/Waveshare RS232-485 Ethernet - Wifi", "01-Documentation/Dispositivos - Manuales/Waveshare RS232-485 Ethernet - Wifi",
"01-Documentation/Dispositivos - Manuales/COM - Virtual COM com0com/adjuntos/Pasted image 20250523122236.png", "01-Documentation/Dispositivos - Manuales/COM - Virtual COM com0com/adjuntos/Pasted image 20250523122236.png",
"01-Documentation/Dispositivos - Manuales/adjuntos/Pasted image 20250522183148.png",
"01-Documentation/Dispositivos - Manuales/COM - Virtual COM com0com/adjuntos", "01-Documentation/Dispositivos - Manuales/COM - Virtual COM com0com/adjuntos",
"01-Documentation/Dispositivos - Manuales/COM - Virtual COM com0com/Untitled",
"01-Documentation/Dispositivos - Manuales/COM - Virtual COM com0com",
"01-Documentation/Python/Scripts Python/XML to SCL Siemens",
"04-SIDEL/13 - E5.007560 - Modifica O&U - SAE235",
"03-Revised/93789 Sipa Italia - Tinny - HSCounters - Piattaforma/Divider/Untitled.canvas", "03-Revised/93789 Sipa Italia - Tinny - HSCounters - Piattaforma/Divider/Untitled.canvas",
"04-InLavoro/9..... MASTER Transport/Standard Transport/FB500 Logic.canvas", "04-InLavoro/9..... MASTER Transport/Standard Transport/FB500 Logic.canvas",
"04-InLavoro/HENKEL/93040 - HENKEL - BowlingGreen/TL22-L25/Synoptic Change/Q3.canvas", "04-InLavoro/HENKEL/93040 - HENKEL - BowlingGreen/TL22-L25/Synoptic Change/Q3.canvas",

View File

@ -301,4 +301,14 @@ Al final del documento, crea una sección titulada "## Excepciones y Problemas"
Quiero crer una aplicacion .net 8 en C# WPF que use modelo MVVM con los siguientes nugets si son necesarios CommunityToolkit.Mvvm, Ookii.Dialogs.Wpf, NewtonSoft.Json, Extended.Wpf.Toolkit. Quiero crer una aplicacion .net 8 en C# WPF que use modelo MVVM con los siguientes nugets si son necesarios CommunityToolkit.Mvvm, Ookii.Dialogs.Wpf, NewtonSoft.Json, Extended.Wpf.Toolkit.
```
#### Para mapear IO de device sobre IO de PLC
Hacer OCR desde el esquema eléctrico para las IO del PLC
Exportar tags dese Tia Portal y convertirlas con 3:Convertir Excel Tags a Markdown
```
Quisiera que me ayudes a adaptar los tags de Device IO Tags a los IO reales del PLC PLC IO Tags usando solo los comentarios ya que no tengo otra informacion. Por favor indicar el nivel de seguridad y si el nivel de seguridad es mas bajo de 70% no adaptar. La tabla resultante deberia ser Device IO Tags con las direcciones del PLC IO Tags.
``` ```

View File

@ -0,0 +1,20 @@
### Way 1. Run the SFC and DISM Scans
Firstly, the problems with drag-and-drop can be due to corrupted system files. Hence, you can run the [System File Checker](https://en.wikipedia.org/wiki/System_File_Checker) (SFC) and Deployment Image Servicing Management (DISM) on your system. The SFC scan detects and replaces the corrupt files, while the DISM scan directly replaces these files from Microsoft.
The quick steps to run SFC and DISM scans include the following:
**Step 1:** Type "Powershell" in the search bar.
**Step 2**. Select the "Run as Administrator" option from the right-side menu.
**Step 3.** Type the command sfc / scannow and press enter.
![powershell interface](https://www.easeus.com/images/en/wiki-news/how-to-fix-drag-and-drop-not-working-02.JPG)
**Step 4.** Wait until the SFC scan is complete.
**Step 5.** Now, type the command DISM /Online /Cleanup-Image /RestoreHealth and press enter.
**Step 6.** Wait until the DISM scan is complete, then reboot your system to check if drag-and-drop is functioning properly.

View File

@ -0,0 +1,5 @@
## MR-J4:
[Search Results Global \| Mitsubishi Electric Americas](https://us.mitsubishielectric.com/fa/en/search/#q=MR-J4&sort=relevancy&f:@sysfiletype=[zip]&sir=siemens)

View File

@ -0,0 +1,236 @@
# Calculadora Algebraica Híbrida
### Concepto Fundamental
La calculadora mantiene **forma simbólica como representación primaria** y proporciona **evaluación numérica como información complementaria** cuando es posible y útil.
**Principio de Evaluación Numérica**: El resultado siempre se intenta calcular numéricamente y se muestra cuando la representación string del resultado numérico difiere del resultado algebraico.
## Sistema de Asignaciones y Ecuaciones
### Principio: Separación clara entre asignaciones y ecuaciones
```python
# Asignación de variable
x = 5 # → Se guarda el valor simbólico (NO se agrega como ecuación)
y = x + a # → Se guarda la expresión simbólica
# Ecuación pura (detección automática)
x**2 + 2*x = 8 # → Se agrega como ecuación Eq(x**2 + 2*x, 8)
a + b = 10 # → Se agrega como ecuación Eq(a + b, 10)
a > b + 1 # → Se agrega como desigualdad
```
### Criterios de Detección de Ecuaciones
**Se considera ecuación si:**
- Contiene `=` Y NO es una asignación simple de variable
- Contiene operadores de comparación: `==`, `>`, `<`, `>=`, `<=`
- Tiene estructura algebraica en ambos lados del `=`
**NO se considera ecuación:**
- Asignaciones simples: `x = 5`, `y = expresión`
- Líneas con solo números o comentarios
---
## Uso de `solve()` y el Atajo `=?`
### Principio: `variable=?` es equivalente a `solve(variable)`
```python
# Ambas formas son idénticas:
solve(a) # Resuelve 'a' usando el sistema de ecuaciones
a=? # Atajo sintáctico para solve(a)
```
El comando intenta resolver algebraicamente y numéricamente en paralelo cuando es posible.
---
## Sistema de Tokenización con Prioridades
### Principio: Las prioridades son números arbitrarios que determinan el orden de aplicación
```
Prioridad 5: IntBase → Patrón: 16#FF (muy específico)
Prioridad 6: Hex/Bin → Patrón: 0xFF, 0b1010 (específico)
Prioridad 10: FourBytes → Patrón: x.x.x.x (general)
```
**Regla**: Menor número = se aplica primero
Esto garantiza que `16#10.10.10.10` se tokenice como IntBase antes de considerar FourBytes.
---
## Conversión Perezosa y Tipos Especializados
### Principio: Mantener el tipo especializado siempre que sea posible
**Se evita convertir a SymPy al máximo**. Los objetos especializados mantienen su tipo cuando pueden resolver la operación internamente.
```python
# Operaciones que mantienen el tipo especializado:
Hex(15) + 1 → Hex(16) # Hex maneja la suma
16#15 + 1 → 16#16 # IntBase maneja la suma
10.1.1.1 + 1 → 10.1.1.2 # FourBytes maneja la suma
# Conversión a SymPy solo cuando es necesario:
sin(16#FF) → sin(255) # sin() requiere SymPy
solve(x + 16#10) → solve() # Álgebra compleja requiere SymPy
```
**Regla**: Solo se convierte a SymPy cuando el token no es atómico o la operación requiere capacidades algebraicas avanzadas.
---
## Contexto Limpio por Evaluación
### Principio: Cada evaluación comienza desde cero
**Contexto Limpio** significa:
- Se eliminan todas las ecuaciones previas
- Se eliminan todas las variables definidas
- Se re-evalúa todo el contenido línea por línea
- Comportamiento idéntico a iniciar una nueva sesión
Esto garantiza resultados predecibles y sin efectos secundarios acumulados.
---
## Resultados Interactivos
### Principio: Activación mediante clicks en elementos con binding
Los resultados interactivos se crean cuando el tipo de resultado requiere visualización expandida:
```python
plot(sin(x)) → "📊 Ver Plot" # Click abre ventana matplotlib
Matrix([[1,2],[3,4]]) → "📋 Ver Matriz" # Click muestra matriz formateada
[1,2,3,4,5,6,7,8] → "📋 Ver Lista" # Click expande contenido
```
**Activación**: Click en el texto con binding dispara la ventana emergente correspondiente.
---
## Sistema de Autocompletado
### Principio: Sistema extensible con prioridades (por implementar)
Se propone usar un sistema de prioridades numéricas similar al de tokenización:
```
Prioridad 1: Métodos del objeto específico
Prioridad 2: Métodos de la clase base
Prioridad 3: Funciones SymPy relevantes
Prioridad 4: Helpers contextuales
```
---
## Integración con SymPy
### Principio: En casos de conflicto, siempre prevalece SymPy
Cuando hay ambigüedad o conflicto entre tipos personalizados y SymPy:
- Funciones SymPy tienen precedencia
- Símbolos SymPy (como `e`, `pi`) mantienen su significado matemático
- Las conversiones fallidas retornan a comportamiento SymPy estándar
---
## Arquitectura de Tipos Personalizados
### Clases Base Universales
**IntBase**: Números en cualquier base
- Aritmética nativa que preserva la base
- Conversión a SymPy solo cuando necesario
- Soporte para símbolos algebraicos
**FourBytes**: Patrones x.x.x.x
- Aritmética de 32-bit para IPs
- Soporte para elementos simbólicos
- Base para tipos como IP4
### Principio de Extensibilidad
Cada tipo en `custom_types/` define:
1. Su lógica de tokenización
2. Sus operaciones aritméticas
3. Sus métodos de conversión
4. Su ayuda contextual
5. Sus sugerencias de autocompletado
---
## Flujo de Evaluación Completo
```
Entrada Usuario
[Tokenización Universal]
¿Asignación o Ecuación?
├─ Asignación → Guardar valor simbólico
└─ Ecuación → Agregar al sistema
[Evaluación]
├─ Mantener tipo especializado si es posible
└─ Convertir a SymPy si es necesario
[Resultado]
├─ Forma simbólica (siempre)
└─ Evaluación numérica (si difiere como string)
```
---
## Ejemplos Integrales
```python
# Tokenización y tipos especializados
16#FF + 2#1010 → 16#109 # IntBase preservado
192.168.1.1 + 5 → 192.168.1.6 # FourBytes preservado
# Asignaciones vs ecuaciones
x = 10 # Asignación (solo guarda valor)
x + y = 15 # Ecuación (se agrega al sistema)
y=? # solve(y) → y = 5
# Evaluación numérica automática
4/5 → 4/5 ≈ 0.8 # Difiere como string
sqrt(2) → √2 ≈ 1.414 # Difiere como string
2 + 3 → 5 # NO se muestra ≈ (igual string)
# Resultados interactivos
plot(sin(x)) → "📊 Ver Plot" [clickeable]
Matrix([[1,2]]) → "📋 Ver Matriz" [clickeable]
```
---
## Principios de Diseño Resumidos
1. **Álgebra primero**: Mantener forma simbólica siempre
2. **Evaluación numérica inteligente**: Mostrar solo cuando agrega valor
3. **Tipos especializados preservados**: Conversión a SymPy solo cuando necesario
4. **Tokenización ordenada**: Sistema de prioridades simple y predecible
5. **Contexto limpio**: Cada evaluación desde cero
6. **Extensibilidad**: Nuevos tipos se integran automáticamente
7. **SymPy prevalece**: En conflictos, el comportamiento matemático estándar gana
Este documento ahora refleja con precisión la arquitectura implementada y sirve como guía coherente para el desarrollo futuro.

View File

@ -0,0 +1,434 @@
# Calculator MAV - Hybrid CAS Application Logic
***
## Overview
This document describes the operational logic of the Calculator MAV (Hybrid Computer Algebra System), focusing on the semantic flow from user input to result display. The application implements a distributed tokenization system with automatic type discovery, pure algebraic evaluation, and hybrid symbolic-numeric computation.
## Architecture Components
### 1. Application Entry Point (calc.py)
The launcher serves as the system bootstrap, handling:
- **Logging Infrastructure**: Establishes comprehensive error tracking with automatic log rotation
- **System Verification**: Validates dependencies and environment setup
- **Error Recovery**: Provides detailed error reporting with context-aware debugging information
- **Application Lifecycle**: Manages startup, execution, and graceful shutdown
### 2. Main Application Interface (main_calc_app.py)
The GUI application provides:
- **Dual-Pane Interface**: Synchronized input and output panels with smart resizing
- **Real-time Evaluation**: Debounced input processing with automatic width adjustment
- **Interactive Results**: Clickable elements for plots, matrices, and complex data structures
- **Dynamic Help System**: Context-aware assistance using registered type helpers
### 3. Type Discovery System (type_registry.py)
The core innovation implementing:
- **Automatic Class Detection**: Scans custom_types directory for *_type.py files
- **Dynamic Registration**: Loads classes and their capabilities without code modification
- **Tokenization Pattern Collection**: Aggregates parsing rules from individual types
- **Context Building**: Creates unified namespace for evaluation engine
## Computation Flow
### Phase 1: Input Processing
When a user types in the input panel, the system triggers a processing cycle:
**Input Capture**: The text widget captures keystrokes and triggers debounced evaluation after 300ms of inactivity. Special handling occurs for dot notation (triggering autocomplete) and real-time content analysis.
**Content Parsing**: The entire input content is split into lines, with each line processed independently. Empty lines and comments (starting with #) are preserved but bypassed during evaluation.
**Context Reset**: Before each full evaluation cycle, the algebraic engine clears its internal state, ensuring consistent results regardless of previous computations.
### Phase 2: Distributed Tokenization
The tokenization system operates on a priority-based pattern matching approach:
**Pattern Discovery**: Each registered type contributes tokenization patterns with priority levels. Higher priority patterns (more specific) are applied first, preventing conflicts between similar syntaxes.
**Expression Transformation**: The universal tokenizer applies transformations in priority order:
- Base number patterns (16#FF, 2#1010) are converted to IntBase constructor calls
- Four-element patterns (192.168.1.1, 10.x.y.z) become FourBytes instances
- Specialized prefixes (0x, 0b) are handled by specific type patterns
**Bracket Parser Integration**: After tokenization, the bracket parser handles the simplified syntax transformation from Type[value] to Type("value") constructor calls.
### Phase 3: Line Classification
The pure algebraic engine analyzes each processed line to determine its semantic type:
**Assignment Detection**: Lines matching "variable = expression" where the left side is a valid Python identifier are classified as assignments. These create symbol bindings and optionally add implicit equations if undefined symbols are present.
**Equation Recognition**: Lines containing equals signs that aren't simple assignments become equations. The system distinguishes between algebraic equations (=) and SymPy comparisons (==, <=, >=, !=).
**Solve Shortcuts**: The pattern "variable=?" is recognized as shorthand for solve(variable), providing quick variable resolution.
**Expression Evaluation**: All other lines are treated as mathematical expressions for symbolic or numeric evaluation.
### Phase 4: Symbolic Evaluation
The evaluation engine operates in pure algebraic mode:
**SymPy Integration**: All mathematical operations prioritize symbolic representation, maintaining exact forms (fractions, radicals, symbolic expressions) whenever possible.
**Dynamic Context**: The evaluation context combines:
- Base mathematical functions (sin, cos, integrate, solve, etc.)
- Dynamically registered custom types from the type discovery system
- User-defined variables from previous assignments
- Automatic symbol creation for undefined variables
**Hybrid Object Handling**: Custom types (IP4, IntBase, FourBytes, etc.) maintain their native operations while integrating seamlessly with SymPy algebra through the SympyClassBase inheritance pattern.
### Phase 5: Smart Solving
The equation system implements intelligent resolution:
**System Building**: Each equation is added to a persistent equation list, with variable extraction and dependency tracking.
**Variable Resolution**: The solve shortcut (variable=?) triggers sophisticated resolution logic:
- Single-variable equations are solved directly
- Multi-variable systems use SymPy's constraint solver
- Underdetermined systems provide parametric solutions
- Overdetermined systems report conflicts with context
**Automatic Substitution**: Known variable values are automatically substituted into symbolic expressions, providing immediate numeric evaluation when all symbols are resolved.
### Phase 6: Result Processing
The evaluation results undergo format optimization:
**Display Selection**: The system determines the most informative representation:
- Symbolic form is preserved for exact mathematical expressions
- Numeric approximations are provided when significantly different from symbolic form
- Custom type representations use their native display methods
**Interactive Enhancement**: Complex results (plots, matrices, large lists) are converted to interactive placeholders that open detailed views when clicked.
**Error Context**: Failed evaluations trigger contextual help suggestions from registered type helpers, providing guidance based on input patterns.
### Phase 7: Output Synchronization
The GUI updates reflect the complete evaluation state:
**Parallel Display**: Input and output panels maintain line-by-line correspondence, with synchronized scrolling and visual alignment.
**Color Coding**: Results are tagged with semantic colors:
- Symbolic expressions in blue
- Numeric results in green
- Equations in purple
- Errors in red
- Helper suggestions in gold
**Layout Adaptation**: The input panel automatically resizes based on content width, maintaining optimal visibility for both mathematical expressions and code.
## Key Semantic Principles
### Pure Algebraic Approach
Unlike traditional calculators, this system treats every assignment as a potential equation. Variables maintain their symbolic nature until explicitly evaluated, enabling sophisticated algebraic manipulation.
### Distributed Extensibility
The type system allows seamless addition of new mathematical objects without modifying core engine code. Each type contributes its own tokenization patterns, helper functions, and algebraic integration.
### Context Preservation
The evaluation engine maintains a persistent mathematical context across all input lines, enabling complex multi-step calculations and equation system building.
### Smart Automation
The system automatically:
- Creates symbols for undefined variables
- Applies substitutions when variables are resolved
- Provides numeric approximations when helpful
- Suggests corrections for invalid input patterns
### Hybrid Integration
Custom types (networking, programming, engineering) integrate seamlessly with pure mathematical operations, enabling domain-specific calculations within a unified algebraic framework.
This architecture enables the calculator to function as both a powerful symbolic mathematics tool and a specialized computational environment for technical domains, with the flexibility to expand into new areas through the distributed type system.
```plantuml
@startuml Calculator_MAV_Flow
!define RECTANGLE class
title Calculator MAV - Hybrid CAS Processing Flow
start
:User types in input panel;
note right: GUI captures keystrokes\nwith 300ms debounce
:Input Processing Phase;
partition "Input Capture" {
:Split content into lines;
:Preserve comments and empty lines;
:Clear engine context for fresh evaluation;
}
:Distributed Tokenization Phase;
partition "Pattern Matching" {
:Discover tokenization patterns from registered types;
note left: Type registry auto-discovers\npatterns from custom_types/*
:Apply high-priority patterns first;
note right: 16#FF → IntBase("FF", 16)\n2#1010 → IntBase("1010", 2)
:Apply medium-priority patterns;
note right: 192.168.1.1 → FourBytes("192.168.1.1")
:Apply bracket parser transformations;
note right: Type[value] → Type("value")
}
:Line Classification Phase;
partition "Semantic Analysis" {
if (Line contains "=?") then (yes)
:Classify as Solve Shortcut;
elseif (Simple assignment pattern?) then (yes)
:Classify as Assignment;
note right: variable = expression\nwhere left side is valid identifier
elseif (Contains = but not assignment?) then (yes)
:Classify as Equation;
note right: x**2 + 2*x = 8\na + b == 10
else (no)
:Classify as Expression;
endif
}
:Symbolic Evaluation Phase;
partition "Algebraic Processing" {
if (Assignment type?) then (yes)
:Create symbol binding;
:Check for undefined symbols;
if (Has undefined symbols?) then (yes)
:Add implicit equation to system;
endif
elseif (Equation type?) then (yes)
:Parse left and right sides;
:Create SymPy Eq object;
:Add to equation system;
elseif (Solve shortcut?) then (yes)
:Extract variable name;
:Trigger smart solving;
else (Expression)
:Evaluate with SymPy priority;
:Maintain symbolic form;
:Auto-create undefined symbols;
endif
}
:Smart Solving Phase;
partition "Equation Resolution" {
if (Solve shortcut triggered?) then (yes)
:Find equations containing variable;
if (Single variable equations?) then (yes)
:Solve directly;
elseif (Multi-variable system?) then (yes)
:Use SymPy constraint solver;
:Handle parametric solutions;
else (no equations)
:Return current symbol value;
endif
endif
:Apply automatic substitutions;
note right: Substitute known values\ninto symbolic expressions
}
:Result Processing Phase;
partition "Output Formatting" {
:Determine optimal representation;
if (Complex result?) then (yes)
:Create interactive placeholder;
note right: Plots, matrices, large lists\nbecome clickable elements
endif
:Generate numeric approximation if helpful;
:Apply semantic color coding;
note right: Symbolic: blue\nNumeric: green\nEquations: purple\nErrors: red
}
:Output Synchronization Phase;
partition "GUI Updates" {
:Update output panel with line correspondence;
:Apply synchronized scrolling;
:Auto-resize input panel based on content;
:Enable interactive result clicking;
}
if (Error occurred?) then (yes)
:Trigger contextual help from type helpers;
note right: Dynamic help based on\ninput patterns and registered types
endif
stop
@enduml
```
```plantuml
@startuml Calculator_MAV_Flow_Corrected
!define RECTANGLE class
title Calculator MAV - Pure Algebraic Engine Processing Flow
start
:User types in input panel;
note right: GUI captures keystrokes\nwith 300ms debounce
:Input Processing Phase;
partition "Input Capture" {
:Split content into lines;
:Preserve comments and empty lines;
:Clear engine context for fresh evaluation;
note right: PureAlgebraicEngine.clear_context()
}
:Distributed Tokenization Phase;
partition "Pattern Matching" {
:Apply dynamic tokenization patterns;
note left: From get_registered_tokenization_patterns()
:Transform expressions in priority order;
note right: 16#FF → IntBase("FF", 16)\n192.168.1.1 → FourBytes("192.168.1.1")
:Apply bracket parser processing;
}
:Line Classification Phase;
partition "Pure Algebraic Analysis" {
if (Line ends with "=?") then (yes)
:Classify as Solve Shortcut;
note right: x=? becomes solve(x)
elseif (Contains "=" and not comparison?) then (yes)
:Classify as Equation;
note right: ALL assignments become equations\nin pure algebraic mode
else (no)
:Classify as Expression;
endif
}
:Pure Algebraic Evaluation;
partition "SymPy-First Processing" {
if (Equation type?) then (yes)
:Split on "=" sign;
:Create SymPy Eq() object;
:Add to equations list;
:Extract and track variables;
elseif (Solve shortcut?) then (yes)
:Extract variable name;
:Call _solve_variable_in_system();
else (Expression)
:Evaluate with sympify() first;
:Maintain symbolic form;
:Apply simplify if configured;
endif
}
:Smart Variable Resolution;
partition "Equation System Solving" {
if (Solve triggered?) then (yes)
:Find relevant equations for variable;
if (Multi-variable system?) then (yes)
:Solve complete system with SymPy;
:Extract specific variable;
else (simple case)
:Solve single variable directly;
endif
:Update symbol_table with result;
endif
}
:Result Processing Phase;
partition "Output Formatting" {
:Generate symbolic result;
:Create numeric approximation if different;
:Format as single-line output;
note right: Concise format:\n"x = 5 ≈ 5.000000"
}
:Output Synchronization Phase;
partition "GUI Updates" {
:Update output panel;
:Apply color coding for result type;
:Auto-resize input panel;
}
if (Error occurred?) then (yes)
:Get help from registered helpers;
:Display error with context;
endif
stop
note bottom : **Pure Algebraic Principle**\nAll assignments become equations\nSymbolic evaluation prioritized\nNumeric approximation secondary
@enduml
```
```plantuml
@startuml Calculator_MAV_Architecture_Corrected
!define RECTANGLE class
title Calculator MAV - Architecture with Pure Algebraic Engine
package "Application Layer" {
[calc.py] as launcher
[main_calc_app.py] as gui
}
package "Core Processing" {
[main_evaluation_puro.py] as pure_engine
[tl_bracket_parser.py] as parser
[type_registry.py] as registry
note top of pure_engine : **Pure Algebraic Engine**\n• All assignments → equations\n• SymPy-first evaluation\n• Persistent equation system\n• Smart variable resolution
}
package "Unused Components" #lightgray {
[main_evaluation.py] as hybrid_engine
note bottom of hybrid_engine : Not currently used\nin main application
}
package "Type System" {
folder "custom_types/" {
[intbase_type.py]
[fourbytes_type.py]
[ip4_type.py]
[... more types]
}
}
package "Support Components" {
[sympy_Base.py] as base
[class_base.py] as classbase
[tl_popup.py] as popup
[sympy_helper.py] as helper
}
package "External Dependencies" {
[SymPy Library] as sympy
[Tkinter GUI] as tkinter
}
' Active connections
launcher --> gui : "Initialize"
gui --> pure_engine : "evaluate_line()"
pure_engine --> parser : "process_expression()"
parser --> registry : "get_registered_tokenization_patterns()"
pure_engine --> registry : "get_registered_base_context()"
pure_engine --> sympy : "sympify(), solve(), Eq()"
' Type system integration
registry --> intbase_type.py : "Auto-discover"
registry --> fourbytes_type.py : "Load patterns"
registry --> "... more types" : "Dynamic loading"
' Inheritance
intbase_type.py --> base
fourbytes_type.py --> classbase
base --> sympy
' Support
gui --> helper : "Contextual help"
gui --> popup : "Interactive results"
' Unused connection (grayed out)
hybrid_engine -.-> sympy : "Not used"
@enduml
```

View File

@ -0,0 +1,165 @@
# MAV Calculator Application Logic Documentation
## Overview
The MAV Calculator is a hybrid Computer Algebra System (CAS) built around a pure algebraic engine that treats all assignments as equations. The application follows a clean pipeline from user input to result display, with sophisticated tokenization and symbolic computation capabilities.
### The application has this main components:
* Algebraic components using sympy engine with sympify, solve, evalf. This includes all the mathematical functions and the functions of sympy.
* Special objects called Types or classes under custom_types folder.
* This classes are automatically discovered at startup.
* every class has functions that some are for the interaction with other clases o with sympy. Other functions can be used directly by the user with parameters and returning the same object or other object.
* special tokenization patterns & substitution using data collected from classes under custom_types folder.
* every class has the Helper function to assist the user when on the line it is detected an error and the line starts with some patter
* every class has a descriptor of functions that can be used for this object to permit the autocomplete popup help the user when they press "."
### Concepts
* Types : Special classes under custom_types folder. That are automatically discovered at startup.
* Cycle: every time the user change the input panel start a cycle that ends when all lines are evaluated and produced an output
* Input panel: tk text area where the user can write or modify text.
* Output panel: read only tk area text correlated 1:1 to every line on the input panel . Every input line must correspond to only 1 line on the output. The output lines can have colors and binds to click for opening the plots or to show matrix or lists.
* Persistence: The app maintain the state of all configurated setup and dimension of the window and all the text on the input panel.
## Application Architecture
### Entry Point and Initialization
The application starts through `calc.py`, which serves as a launcher with comprehensive logging and error handling. It initializes the main GUI application (`HybridCalculatorApp`) which in turn creates a `PureAlgebraicEngine` instance as its computational core.
During initialization, the system performs auto-discovery of custom types from the `custom_types/` directory. Each type module can define tokenization patterns, helper functions, and computational behaviors. This creates a registry of available types and their associated transformation rules.
## Calculation Cycle Flow
### 1. Input Capture and Triggering
The calculation cycle begins when the user types in the input panel. The GUI uses a debounced key release handler that triggers evaluation after a 300ms delay, preventing excessive computation during active typing.
### 2. Line Processing Pipeline
The engine processes all input lines sequentially, maintaining a clean context for each evaluation cycle:
**Context Reset**: Before each evaluation cycle, the engine clears its internal context completely. This ensures that each modification to the input re-evaluates everything from scratch, maintaining consistency.
**Line Classification**: Each line is categorized as:
- Empty or comment (ignored)
- Equation (contains `=` but not as comparison operator)
- Solve shortcut (pattern `variable=?`)
- Expression (everything else)
### 3. Tokenization System
The tokenization system operates through a distributed pattern-matching architecture:
**Pattern Discovery**: During initialization, the system discovers tokenization patterns from all registered type classes. Each type can define multiple patterns with priorities and replacement functions.
**Pattern Application**: Tokenization applies patterns in priority order (higher priority first). Each pattern consists of:
- A regular expression to match
- A replacement function that transforms the match
- Priority level for ordering
- Description for debugging
**Example Transformations**:
- `192.168.1.1` becomes `FourBytes("192.168.1.1")`
- `16#FF` becomes `IntBase("FF", 16)`
- `2#1010` becomes `IntBase("1010", 2)`
**Bracket Parser Integration**: After tokenization, the bracket parser processes any remaining bracket syntax transformations for legacy compatibility. ==Must be removed==
Also every constructor of every Type must be instantiated using eval. For example if a line has "a = IP4(10.1.1.1)" the tokeniser first will translate to "a = IP4(FourBytes("10.1.1.1"))" then eval needs to instantiate the IP4 object so the a will be equal to an object IP4.
### 4. Algebraic Engine Processing
The `PureAlgebraicEngine` implements a pure algebraic approach where all assignments become equations:
**Equation Detection**: The engine distinguishes between:
- Simple assignments (`x = 5`) - creates both a variable assignment and an implicit equation-
- Complex equations (`x**2 + 2*x = 8`) - added directly to the equation system
- Solve shortcuts (`x=?`) - equivalent to `solve(x)` using the current equation system
**Symbol Management**: Variables are automatically and must maintain the type as long as possible. Also if there are aritmetic use with Types we need to cast the result to the Type involved. For example if we have "IP4(10.1.1.1)+1" the result must be IP4 object. The engine maintains a symbol table and equation list that increase every line that persist until the end of the cycle.
**Context Building**: For each evaluation, the engine builds a complete context including:
- Base mathematical functions (sin, cos, solve, etc.)
- Dynamically registered custom types
- Current variable assignments
- Helper functions from type registry
### 5. Expression Evaluation Strategy
The engine uses a hybrid evaluation strategy:
**Symbolic Priority**: Expressions are first attempted through SymPy's `sympify` to maintain symbolic forms. This preserves exact mathematical representations.
**Automatic Substitution**:
* The engine automatically substitutes known numerical values into symbolic expressions when possible, while preserving symbolic forms for unknown variables.
* ==Funtions
**Numerical Approximation**: When beneficial, the engine provides numerical approximations alongside symbolic results. The decision is based on whether the numerical form differs meaningfully from the symbolic representation.
### 6. Result Processing and Display
**Result Classification**: Each evaluation produces an `EvaluationResult` with:
- The computed result (symbolic or numerical)
- Result type classification
- Success/error status
- Optional numerical approximation
- Metadata about the evaluation
**Interactive Elements**: The display system identifies results that benefit from interactivity:
- Large matrices become expandable views
- Plot commands create interactive matplotlib windows
- Long lists become scrollable displays
- Complex objects get detailed inspection windows
**Tag-Based Formatting**: Results are displayed with color-coded tags based on their type and semantic meaning. The GUI applies appropriate formatting for equations, errors, symbolic expressions, and custom type outputs.
## Type System Integration
### Dynamic Type Loading
The type system loads custom classes from the `custom_types/` directory at startup. Each type module can define:
- Class behaviors and arithmetic operations
- Tokenization patterns for automatic recognition
- Helper functions for contextual assistance
- Display and conversion methods
### Inheritance Patterns
Types inherit from either:
- `ClassBase` - for basic custom types
- `SympyClassBase` - for types requiring full SymPy integration
This allows seamless interaction between custom types and the symbolic algebra system.
### Method Discovery
The system automatically discovers and exposes methods from custom types for autocompletion and help systems. This includes both instance methods and static helper functions.
## Error Handling and Recovery
The application implements comprehensive error handling at each stage:
**Tokenization Errors**: Failed tokenization patterns are logged but don't halt processing, allowing partial transformations to proceed.
**Evaluation Errors**: Helper from classes first, then if there is no match SymPy evaluation errors trigger fallback strategies, including symbol creation for undefined variables and alternative parsing approaches.
**Display Errors**: Rendering failures fall back to string representations, ensuring results are always visible even if formatting fails.
## Performance Characteristics
**Lazy Evaluation**: Complex computations are deferred until needed, with caching of intermediate results where appropriate.
**Incremental Processing**: Only changed content triggers re-evaluation, though the current implementation re-evaluates everything for consistency.
**Memory Management**: The system manages symbol tables and equation lists efficiently, with cleanup mechanisms for large sessions.
## Session Persistence
The application maintains session continuity through:
**History Persistence**: Input content is automatically saved and restored between sessions.
**Context Preservation**: Variable assignments and equations persist during the scope of every cycle. The context is added on every line and cleared at the begining of ever cycle. This means that every time the user changes the input panel the context is cleared.
**Settings Management**: UI state and preferences are preserved across application restarts.

View File

@ -11,6 +11,13 @@ conda --version
conda update conda conda update conda
``` ```
#### Instalar desde Requirements
```bash
pip install -r requirements.txt
```
## Gestión de Entornos ## Gestión de Entornos
### Crear un nuevo entorno ### Crear un nuevo entorno

View File

@ -0,0 +1,51 @@
### ===== CLIENTES LOCALES (interfaces wlan1/wlan2) =====
#### Ver clientes conectados a wlan1 (2.4 GHz)
/interface wireless registration-table print where interface=wlan1
#### Ver clientes conectados a wlan2 (5 GHz)
/interface wireless registration-table print where interface=wlan2
#### Ver todos los clientes WiFi locales
/interface wireless registration-table print
### ===== CLIENTES DE CAPSMAN =====
#### Ver todos los clientes conectados a través de CAPsMAN
/caps-man registration-table print
#### Ver clientes de CAP por configuración específica (2Ghz en tu caso)
/caps-man registration-table print where configuration=2Ghz
#### Ver información detallada de clientes CAP
/caps-man registration-table print detail
#### Ver solo información específica de clientes CAP
/caps-man registration-table print brief
#### ===== VISTA COMPLETA (LOCALES + CAP) =====
```bash
# Script para ver todo junto
:put "=== CLIENTES LOCALES WLAN1 (2.4 GHz) ==="
/interface wireless registration-table print where interface=wlan1
:put ""
:put "=== CLIENTES LOCALES WLAN2 (5 GHz) ==="
/interface wireless registration-table print where interface=wlan2
:put ""
:put "=== CLIENTES CAPSMAN ==="
/caps-man registration-table print
```
#### ===== INFORMACIÓN DE LOS CAPS =====
#### Ver los CAPs conectados al manager
/caps-man remote-cap print
#### Ver estado de los CAPs
/caps-man remote-cap print detail
#### ===== MONITOREO =====
#### Monitorear clientes CAP en tiempo real
/caps-man registration-table print interval=5
#### Para ver información del DHCP y relacionar IPs con MACs
/ip dhcp-server lease print where active=yes

View File

@ -0,0 +1,36 @@
| Device Name | Device Address | Device Type | Order Number | Firmware Version | Module Name | Module Type | IO Input Start Address | IO Output Start Address | Total Input Bits | Total Output Bits |
|----------------|----------------|-----------------------|---------------------|------------------|------------------------------------|----------------------------------|------------------------|-------------------------|------------------|-------------------|
| BA 2xRJ45 | 10.1.30.11 | BA 2xRJ45 | 6ES7 193-6AR00-0AA0 | V0.0 | | | | | | |
| U30110-AxisX | 10.1.30.31 | C1250xMIPD 1S V3.0 | | | DO SERVO_1 | DO SERVO | 1100 | 1100 | 160 | 160 |
| U30210-AxisY | 10.1.30.32 | C1250xMIPD 1S V3.0 | | | DO SERVO_1 | DO SERVO | 1124 | 1124 | 160 | 160 |
| U30310 | 10.1.30.33 | MELSERVO MR-J4-TM | | | DO with manufacturer telegr. 102_1 | DO with manufacturer telegr. 102 | 1148 | 1148 | 384 | 384 |
| U30410 | 10.1.30.34 | MELSERVO MR-J4-TM | | | DO with manufacturer telegr. 102_1 | DO with manufacturer telegr. 102 | 1200 | 1200 | 384 | 384 |
| U30510 | 10.1.30.35 | MELSERVO MR-J4-TM | | | DO with manufacturer telegr. 102_1 | DO with manufacturer telegr. 102 | 1252 | 1252 | 384 | 384 |
| U30610 | 10.1.30.36 | MELSERVO MR-J4-TM | | | DO with manufacturer telegr. 102_1 | DO with manufacturer telegr. 102 | 1304 | 1304 | 384 | 384 |
| M30710 | 10.1.30.37 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 1356 | 1356 | 176 | 352 |
| M31010 | 10.1.30.40 | DFC2xA V1.0 | | | Module I/O (08 words) | Module I/O (08 words) | 1404 | 1404 | 128 | 128 |
| M31110 | 10.1.30.41 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 1424 | 1424 | 176 | 352 |
| M31210 | 10.1.30.42 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 1472 | 1472 | 176 | 352 |
| M31310 | 10.1.30.43 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 1520 | 1520 | 176 | 352 |
| M31410 | 10.1.30.44 | DFC2xA V1.0 | | | Module I/O (08 words) | Module I/O (08 words) | 1568 | 1568 | 128 | 128 |
| M31510 | 10.1.30.45 | DFC2xA V1.0 | | | Module I/O (08 words) | Module I/O (08 words) | 1588 | 1588 | 128 | 128 |
| M31610 | 10.1.30.46 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 1608 | 1608 | 176 | 352 |
| M31710 | 10.1.30.47 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 1656 | 1656 | 176 | 352 |
| M31810 | 10.1.30.48 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 1704 | 1704 | 176 | 352 |
| M31910 | 10.1.30.49 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 1752 | 1752 | 176 | 352 |
| U32810 | 10.1.30.58 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1800 | 1800 | 0 | 0 |
| U32910 | 10.1.30.59 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1824 | 1824 | 0 | 0 |
| U33010 | 10.1.30.60 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1848 | 1848 | 0 | 0 |
| U33110 | 10.1.30.61 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1872 | 1872 | 0 | 0 |
| U33210 | 10.1.30.62 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1896 | 1896 | 0 | 0 |
| U33310 | 10.1.30.63 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1920 | 1920 | 0 | 0 |
| U33410 | 10.1.30.64 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1944 | 1944 | 0 | 0 |
| U33510 | 10.1.30.65 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1968 | 1968 | 0 | 0 |
| U33610 | 10.1.30.66 | G120C PN | 6SL3210-1KE13-2AF2 | 4.7.13 | | | 1992 | 1992 | 0 | 0 |
| M34010 | 10.1.30.70 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 2016 | 2016 | 176 | 352 |
| M34110 | 10.1.30.71 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 2064 | 2064 | 176 | 352 |
| M34210 | 10.1.30.72 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 2112 | 2112 | 176 | 352 |
| M34310 | 10.1.30.73 | DBS55-XXX Extend-A | | | DS402_Extend-A | | 2160 | 2160 | 176 | 352 |
| M34410 | 10.1.30.74 | DFC2xA V1.0 | | | Module I/O (08 words) | Module I/O (08 words) | 2208 | 2208 | 128 | 128 |
| E44010-Encoder | 10.1.30.170 | Multiturn 30 Bit V2.x | | | EO Encoder Multiturn V2.x_1 | | 2228 | 2228 | 128 | 32 |

View File

@ -0,0 +1,113 @@
***
= 139 = 139 = 139 = 170
### IP network: 10.1.30.0/20
| | | | IP | Mask | Page | | | | | |
| ------------ | ------ | ----------------------------------- | :-: | ---- | ---- | -------------------------- | ----------- | ---------- | ---------- | --------------------------- |
| PLC | | CPU 1514SP T-2 PN | 11 | /12 | 405 | 6ES7 514-2VN03-0AB0 | | | | |
| HMI | | | 10 | /12 | | | | | | |
| | | | | | | | | | | |
| Divider | E44010 | Encoder Divider | 170 | /12 | 440 | | | | | |
| Divider | U30110 | Axis-X | 31 | | 301 | LinMot C1250-MI-XC-0S-000 | Isochronous | E100..E119 | A100..A119 | |
| Divider | U30210 | Axis-Y | 32 | | 302 | LinMot C1250-MI-XC-0S-000 | Isochronous | E120..E139 | A120..A139 | |
| Divider | U30310 | Timing Belt DX 1 | 33 | | 303 | Mitsubishi MR-J4-60TM4-PNT | | E256.. | | |
| Divider | U30410 | Timing Belt DX 2 | 34 | | 304 | Mitsubishi MR-J4-60TM4-PNT | | | | |
| Divider | U30510 | Timing Belt SX 1 | 35 | | 305 | Mitsubishi MR-J4-60TM4-PNT | | | | |
| Divider | U30610 | Timing Belt SX 2 | 36 | | 306 | Mitsubishi MR-J4-60TM4-PNT | | | | |
| Divider | M30710 | Dosser Format | 37 | | 307 | Minimotor | | | | |
| Divider | M31010 | Transport Inside | 40 | | 310 | SEW MGFAS-2 | | | | S31040,S31050,S31051,B31060 |
| Divider | M31110 | Combiner 1 DX | 41 | | 311 | Minimotor | | | | |
| Divider | M31210 | Combiner 2 SX | 42 | | 312 | Minimotor | | | | |
| Divider | M31310 | Format Change Outfeed | 43 | | 313 | Minimotor | | | | |
| Divider/Ring | M31410 | Transport Outfeed | 44 | | 314 | SEW MGFAS-2 | | | | B31440 |
| | | | | | | | | | | |
| | | | | | | | | | | |
| Table | M31510 | Infeed | 45 | | 315 | SEW MGFAS-2 | | | | B31540,B31550,S31550,S31560 |
| Table | M31610 | Dosser SX Infeed | 46 | | 316 | Minimotor | | | | |
| Table | M31610 | Dosser DX Infeed | 47 | | 317 | Minimotor | | | | |
| Table | M31810 | Dosser Format Infeed | 48 | | 318 | Minimotor | | | | |
| Table | M31910 | Channel Selection Infeed | 49 | | 319 | Minimotor | | | | |
| Table | U32810 | Canale 1 | 58 | | 328 | Siemens G120C | | | | |
| Table | U32910 | Canale 2 | 59 | | 329 | Siemens G120C | | | | |
| Table | U33010 | Canale 3 | 60 | | 330 | Siemens G120C | | | | |
| Table | U33110 | Canale 4 | 61 | | 331 | Siemens G120C | | | | |
| Table | U33210 | Canale 5 | 62 | | 332 | Siemens G120C | | | | |
| Table | U33310 | Canale 6 | 63 | | 333 | Siemens G120C | | | | |
| Table | U33410 | Canale 7 | 64 | | 334 | Siemens G120C | | | | |
| Table | U33510 | Canale 8 | 65 | | 335 | Siemens G120C | | | | |
| Table | U33610 | Canale 9 | 66 | | 336 | Siemens G120C | | | | |
| Table | M34010 | Channel Selection Outfeed | 70 | | 340 | Minimotor | | | | |
| Table | M34110 | Motore 1 Dosser Outfeed | 71 | | 341 | Minimotor | | | | |
| Table | M34210 | Motore 1 Dosser Outfeed | 72 | | 342 | Minimotor | | | | |
| Table | M34310 | Regolazione Largheza Dosser Outfeed | 73 | | 343 | Minimotor | | | | |
| Table/Ring | M34410 | Transport outfeed | 74 | | 344 | SEW MGFAS-2 | | | | |
| | | | | | | | | | | |
| Ring | E44520 | Gateway Outfeed Divider | 175 | | 445 | | | | | |
| Ring | E44620 | Gateway Infeed Divider | 176 | | 446 | | | | | |
### Photocells / Sensors
***
| | Tag | Description | Connected to |
| --- | ------ | ----------------------------------------- | ------------ |
| | S31040 | Sensore Di Asse Longitudinale | M31010 |
| | S31050 | Sensore de Asse Transversale | M31010 |
| | S31051 | Sensore de Reg Spaziatore Uscita Divisore | M31010 |
| | B31060 | Sicurezza uscita spaziatore | M31010 |
| | B31440 | Minimo Polmone Ingresso Tavolor | M31410 |
| | | | |
| | B31540 | Conteggio Ingresso Tavolo | M31510 |
| | B31550 | Sicurezza Tranlazione Ingresso | M31510 |
| | S31550 | Homing Dosser Infeed Table | M31510 |
| | S31560 | Sensore de homing Trasl. Dosser Infeed | M31510 |
### Emergency circuit
***
* K14010 - p140
* K15010 - p150 <- 20740/20750 - Divider doors - 8 doors
* K16010 - p160 - Table Infeed Doors - 2 doors
* K17010 - p170 - Table Outfeed Doors - 2 doors
*
### Motors:
***
| | | | | Inverter | | |
| ------- | ------ | -------------------------------------- | --- | -------- | ----- | ---- |
| Divider | M30160 | Axis-X | | U30110 | | |
| Divider | M30260 | Axis-Y | | | | |
| Divider | M30320 | Dosser 1 DX | 303 | U30310 | | |
| Divider | M30420 | Dosser 2 DX | 304 | U30410 | | |
| Divider | M30520 | Dosser 1 SX | 305 | U30510 | | |
| Divider | M30620 | Dosser 2 SX | 306 | U30610 | | |
| | | | | | | |
| Table | M30710 | Dosser Format | | 307 | | |
| Table | M31510 | Infeed | | 315 | | |
| Table | M31610 | Dosser SX Infeed | | 316 | | |
| Table | M31610 | Dosser DX Infeed | | 317 | | |
| Table | M31810 | Dosser Format Infeed | | 318 | | |
| Table | M31910 | Traslazione Smistatore Ingresso Tavolo | | 319 | | |
| Table | M32860 | Canale 1 | | 328 | .75kw | 1.9A |
| Table | M32960 | Canale 2 | | 329 | .75kw | 1.9A |
| Table | M33060 | Canale 3 | | 330 | .75kw | 1.9A |
| Table | M33160 | Canale 4 | | 331 | .75kw | 1.9A |
| Table | M33260 | Canale 5 | | 332 | .75kw | 1.9A |
| Table | M33360 | Canale 6 | | 333 | .75kw | 1.9A |
| Table | M33460 | Canale 7 | | 334 | .75kw | 1.9A |
| Table | M33560 | Canale 8 | | 335 | .75kw | 1.9A |
| Table | M33660 | Canale 9 | | 336 | .75kw | 1.9A |
| | | | | | | |

View File

@ -0,0 +1,55 @@
## Inputs (Inputs)
| Master Tag | Type | Data Type |
| -------------------------------- | ----- | --------- |
| zoneA24VDC | Input | Bool |
| zoneD24VDC | Input | Bool |
| thermicTrip | Input | Bool |
| safetyRelay | Input | Bool |
| eStop_ElectricalCabinet | Input | Bool |
| Divider_gateRight1 | Input | Bool |
| Divider_gateRight2 | Input | Bool |
| Divider_gateRight3 | Input | Bool |
| Divider_gateRight4 | Input | Bool |
| Divider_gateLeft1 | Input | Bool |
| Divider_gateLeft2 | Input | Bool |
| Divider_gateLeft3 | Input | Bool |
| Divider_gateLeft4 | Input | Bool |
| Divider_startButton | Input | Bool |
| Divider_stopButton | Input | Bool |
| Divider_automaticSelector | Input | Bool |
| Divider_manualForwardButton | Input | Bool |
| Divider_manualBackwardButton | Input | Bool |
| Divider_resetButton | Input | Bool |
| Divider_CountPhotocell | Input | Bool |
| Divider_TranslationSafetyHighPho | Input | Bool |
| Divider_TooFull1Line1 | Input | Bool |
| Divider_TooFull1Line2 | Input | Bool |
| eStop_PB1 | Input | Bool |
| Divider_TooFull1Line3 | Input | Bool |
| Divider_TooFull1Line4 | Input | Bool |
| Divider_TooFull1Line5 | Input | Bool |
| Divider_TooFull1Line6 | Input | Bool |
| Divider_encoderReferenceXAxis | Input | Bool |
| Divider_encoderReferenceYAxis | Input | Bool |
| Divider_TooFull2Line1 | Input | Bool |
| Divider_TooFull2Line2 | Input | Bool |
| Divider_TooFull2Line3 | Input | Bool |
| Divider_TooFull2Line4 | Input | Bool |
| Divider_TooFull2Line5 | Input | Bool |
| Divider_TooFull2Line6 | Input | Bool |
## Outputs (Outputs)
| Master Tag | Type | Data Type |
| -------------------------- | ------ | --------- |
| Divider_runLamp | Output | Bool |
| Divider_resetLamp | Output | Bool |
| Divider_towerLampAutomatic | Output | Bool |
| Divider_towerLampManual | Output | Bool |
| Divider_towerLampAlarm | Output | Bool |
| Divider_acousticAlarm | Output | Bool |
| Divider_enableX | Output | Bool |
| Divider_enableY | Output | Bool |

View File

@ -0,0 +1,57 @@
# Mapeo Device IO Tags a PLC IO Tags - Sistema Divisor
## Inputs Mapeados
| Device Tag | Type | PLC Address | PLC Description | Confianza |
| -------------------------------- | ----- | ----------- | ----------------------------------- | --------- |
| Divider_automaticSelector | Input | E5.2 | MANUALE/AUTOMATICO | 95% |
| Divider_CountPhotocell | Input | E6.0 | CONTEGGIO DIVSORE FORMATO 1 | 80% |
| Divider_gateLeft1 | Input | E3.5 | DIVISORE MICRO PORTA 5 | 75% |
| Divider_gateLeft2 | Input | E3.6 | MICRO PORTA 6 DIVISORE | 75% |
| Divider_gateLeft3 | Input | E3.7 | DIVISORE MICRO 0PORTA7 | 75% |
| Divider_gateLeft4 | Input | E4.0 | PORTA 8 MICRO DIVSORE | 75% |
| Divider_gateRight1 | Input | E3.1 | DIVISORE MICRO 0PORTA1 | 80% |
| Divider_gateRight2 | Input | E3.2 | MICRO PORTA 2 DIVISORE | 80% |
| Divider_gateRight3 | Input | E3.3 | MICRO PORTA 3 DIVISORE | 80% |
| Divider_gateRight4 | Input | E3.4 | DIVISORE MICRO PORTA 4 | 80% |
| Divider_manualBackwardButton | Input | E5.4 | INDIETRO COMANDI MANUAL | 90% |
| Divider_manualForwardButton | Input | E5.3 | AVANTI MANUAL COMANDI | 90% |
| Divider_resetButton | Input | E5.6 | RESET ALLARMI | 90% |
| Divider_startButton | Input | E5.0 | MARCIA | 95% |
| Divider_stopButton | Input | E5.1 | ARRESTO | 95% |
| Divider_TranslationSafetyHighPho | Input | E6.2 | TRASLAZIONE SICUREZZA DIVISORE ALTA | 90% |
| eStop_ElectricalCabinet | Input | E2.0 | EMERGENZA GENERALE RELEE | 90% |
| eStop_PB1 | Input | E2.1 | PB1 PULSANTE EM. PUI SANTIERA | 95% |
| safetyRelay | Input | E3.0 | EMERGENZA CARTER DIVISORE RELE E | 85% |
| zoneA24VDC | Input | E1.4 | 24VDC QUADRO ALIMENTAZIONE INTERNO | 75% |
## Outputs Mapeados
| Device Tag | Type | PLC Address | PLC Description | Confianza |
| -------------------------- | ------ | ----------- | --------------------------------------- | --------- |
| Divider_acousticAlarm | Output | A0.3 | COL. LUMINOSA SIRENA | 90% |
| Divider_enableX | Output | A3.5 | ASSE ABILITAZIONE LONGITUDINALE DIVSORE | 90% |
| Divider_enableY | Output | A3.6 | TRASVERSALE ASSE ABILITAZIONE DIVISORE | 90% |
| Divider_resetLamp | Output | A0.7 | SEGN. RESET LUMINOSA ALLARMI | 90% |
| Divider_runLamp | Output | A0.5 | MARCIA SEGN. LUMINOSA | 90% |
| Divider_towerLampAlarm | Output | A0.2 | ALLARME COL. LUMINOSA | 95% |
| Divider_towerLampAutomatic | Output | A0.0 | COL. LUMINOSA MARCIAAUTOMATICA | 95% |
| Divider_towerLampManual | Output | A0.1 | SEGNALAZIONE COL. LUMINOSA | 75% |
## Tags No Mapeados (Confianza <70%)
**Inputs no encontrados:**
- zoneD24VDC
- thermicTrip
- Divider_TooFull1Line1-6
- Divider_TooFull2Line1-6
- Divider_encoderReferenceXAxis
- Divider_encoderReferenceYAxis
**Notas:**
- Mapeo basado únicamente en descripciones disponibles
- Algunas puertas pueden estar intercambiadas entre Right/Left
- Se requiere verificación en campo para confirmar correspondencias exactas
- Tags con confianza <70% requieren información adicional para mapeo seguro

View File

@ -0,0 +1,140 @@
| Tag | IO | Description Italian |
| --------- | ---- | ----------------------------------------------------- |
| QF10410 | E0.0 | LINEA ALIMENTAZIONE MOVIGEAR |
| SERIETTAV | E0.7 | TERMICI TAVOLO ALIMENTAZIONE INVERTER |
| SERIETDIV | E0.1 | TERMICI AZIONAMENT ALIMENTAZIONE DIVISORE |
| QF31110 | E0.2 | ALIMENTAZIONE SPAZIATORE USCITA DIVISORE |
| QF27110 | E0.3 | ALIMENT. REG. LARGHEZZA USCITA SPAZIATORE DIVSORF |
| QF31610 | E0.4 | ALIMENTAZIONE TAVOLO SPAZIATORE INGRESSO |
| QF27130 | E0.5 | TAVOLO ALIMENT.REG. LARGHEZZA INGRESSO SPAZIATORE |
| QF31910 | E0.6 | ALIMENTAZIONE SMISTATORE TRASLAZIONE FINGRESSO TAVOLO |
| QF27170 | E1.0 | ALIMENTAZIONE CINGHIOLI REG. DIVISORE |
| QF34010 | E1.1 | SMISTATORE TRASLAZIONE ALIMENTAZIONE ATAVOLO USCITA |
| QF34110 | E1.2 | TAVOLO ALIMENTAZIONE SPAZIATORE USCITA |
| QF27150 | E1.3 | ALIMENT. REG. LARGHEZZA SPAZIATORE USCITA LTAVOLO |
| FA10910 | E1.4 | 24VDC QUADRO ALIMENTAZIONE INTERNO |
| FA10970 | E1.5 | ALIMENTAZIONE MICROMECCANICA MOTORIN |
| QF11030 | E1.6 | ALIMENTAZIONE ILLUMINAZIONE DIVISORE |
| AIRQE | E1.7 | CONDIZIONATORE ALLARME |
| K14010 | E2.0 | EMERGENZA GENERALE RELEE |
| SPARE1 | E2.3 | PULSANTE SCORTA EM. |
| EMSB14110 | E2.1 | PB1 PULSANTE EM. PUI SANTIERA |
| SPARE2 | E2.2 | PULSANTE SCORTA EM. |
| SPARE3 | E2.4 | PULSANTE SCORTA EM. |
| K15010 | E3.0 | EMERGENZA CARTER DIVISORE RELE E |
| S20010 | E3.1 | DIVISORE MICRO 0PORTA1 |
| S20110 | E3.2 | MICRO PORTA 2 DIVISORE |
| S20210 | E3.3 | MICRO PORTA 3 DIVISORE |
| S20310 | E3.4 | DIVISORE MICRO PORTA 4 |
| S20410 | E3.5 | DIVISORE MICRO PORTA 5 |
| S20510 | E3.6 | MICRO PORTA 6 DIVISORE |
| S20610 | E3.7 | DIVISORE MICRO 0PORTA7 |
| S20710 | E4.0 | PORTA 8 MICRO DIVSORE |
| S21010 | E4.6 | TAVOLO SMISTATORE MICRO USCITA PORTA 1 |
| S21110 | E4.7 | TAVOLO SMISTATORE MICRO PORTA 2 USCITA |
| K16010 | E4.2 | RELE CARTER SMISTATORE TAVOLO N INGRESSO MULTIMA |
| S20810 | E4.3 | TAVOLO SMISTATORE INGRESSO MICRO PORTA 1 |
| S20910 | E4.4 | SMISTATORE TAVOLO MICRO INGRESSO PORTA 2 |
| K17010 | E4.5 | USCITA RELE CARTER SMISTATORE TAVOLO MULTIMA |
| SB50510 | E5.0 | MARCIA |
| SB50520 | E5.1 | ARRESTO |
| SA50530 | E5.2 | MANUALE/AUTOMATICO |
| SB50560 | E5.5 | RICHIESTA ACCESSO |
| SB50570 | E5.6 | RESET ALLARMI |
| SA50540 | E5.3 | AVANTI MANUAL COMANDI |
| SA50540 | E5.4 | INDIETRO COMANDI MANUAL |
| B50610 | E6.0 | CONTEGGIO DIVSORE FORMATO 1 |
| B50620 | E6.1 | CONTEGGIO DIVISORE FORMATO 2 |
| B50630 | E6.2 | TRASLAZIONE SICUREZZA DIVISORE ALTA |
| B50640 | E6.3 | TRASLAZIONE BASSA DIVISORE SICURE77A |
| HL53010 | A0.0 | COL. LUMINOSA MARCIAAUTOMATICA |
| HL53020 | A0.1 | SEGNALAZIONE COL. LUMINOSA |
| HL53030 | A0.2 | ALLARME COL. LUMINOSA |
| HA53040 | A0.3 | COL. LUMINOSA SIRENA |
| SH50510 | A0.5 | MARCIA SEGN. LUMINOSA |
| SH50560 | A0.6 | SEGN. LUMINOSA RICHIESTAACCESSO |
| SH50570 | A0.7 | SEGN. RESET LUMINOSA ALLARMI |
| S20010 | A1.0 | PORTA1DIVISORE MICRO ABILITAZIONE |
| S20110 | A1.1 | MICRO ABILITAZIONE PORTA 2 DIVISORE |
| S20210 | A1.2 | MICRO ABILITAZIONE PORTA 3 DIVSORE |
| S20310 | A1.3 | MICRO ABILITAZIONE PORTA 4 DIVISORE |
| S20410 | A1.4 | MICRO ABILITAZIONE PORTA 5 DIVSORE |
| S20510 | A1.5 | MICRO ABILITAZIONE PORTA 6 DIMSORE |
| S20610 | A1.6 | MICRO ABILITAZIONE PORTA 7 DIVSORE |
| S20710 | A1.7 | MICRO ABILITAZIONE PORTA 8 DIVISORE |
| KA53210 | A2.0 | RELE EMERGENZA GENERALE RESET R |
| KA53220 | A2.1 | CARTER DIVISORE RESET RELE |
| KA53230 | A2.2 | TAVOLO SMISTATORE CARTER INGRESSO RESET RELE |
| KA53240 | A2.3 | TAVOLO RELE CARTER SMISTATORE USCITA RESETF |
| KA53250 | A2.4 | ABILTAZIONE DIVISORE GATEWAY USCITA E 1GRUPPO |
| KA53260 | A2.5 | GATEWAY USCITA ABILTAZIONE DIVISORE E 2GRUPPO |
| KA53270 | A2.6 | GATEWAYUSCITA ADIMSORE ABILITAZIONE 3GRUPPO |
| KA53280 | A2.7 | DIVSORE GATEWAY USCITA E 4GRUPPO ABILITAZIONE |
| KA53310 | A3.0 | GATEWAY INGRESSO DIVISORE ABILITAZIONE E 1 GRUPPO |
| KA53320 | A3.1 | GATEWAY INGRESSO ABILITAZIONE DIVISORE E 2 GRUPPO |
| KA53330 | A3.2 | GATEWAY INGRESSO DIVISORE ABILITAZIONE 3 GRUPPO |
| KA53340 | A3.3 | DIVISORE GATEWAY INGRESSO ABILITAZIONE 4GRUPPO |
| KA53350 | A3.4 | DIVISORE ABILTAZIONE LLUMINAZIONE |
| U30110EN | A3.5 | ASSE ABILITAZIONE LONGITUDINALE DIVSORE |
| U30210EN | A3.6 | TRASVERSALE ASSE ABILITAZIONE DIVISORE |
| M31910HOM | A3.7 | TAVOLO AZZERAMENTO EINGRESSO SMISTATORE TRASLAZIONE |
| M34010HOM | A4.0 | AZZERAMENTOTRASLAZIONE SMISTATORE USCITA TAVOLO |
| Network | Type | Address | Device Name | Sub-Device | OrderNo | Type | IO Type | IO Address | Number of Bits |
| ----------------- | ----------------- | ----------- | -------------- | ---------------------------------- | ------------------- | -------------------------------- | ------- | --------------- | -------------- |
| PLC Local Modules | Local I/O | Local | PLC A40510 | A41110 | 6ES7 131-6BF01-0BA0 | DI 8x24VDC ST | Input | `EW 0..0` | 8 |
| PLC Local Modules | Local I/O | Local | PLC A40510 | A41111 | 6ES7 131-6BF01-0BA0 | DI 8x24VDC ST | Input | `EW 1..1` | 8 |
| PLC Local Modules | Local I/O | Local | PLC A40510 | A41120 | 6ES7 131-6BF01-0BA0 | DI 8x24VDC ST | Input | `EW 2..2` | 8 |
| PLC Local Modules | Local I/O | Local | PLC A40510 | A41121 | 6ES7 131-6BF01-0BA0 | DI 8x24VDC ST | Input | `EW 3..3` | 8 |
| PLC Local Modules | Local I/O | Local | PLC A40510 | A41130 | 6ES7 132-6BF01-0BA0 | DQ 8x24VDC/0.5A ST | Output | `AW 0..0` | 8 |
| PLC Local Modules | Local I/O | Local | PLC A40510 | A41131 | 6ES7 132-6BF01-0BA0 | DQ 8x24VDC/0.5A ST | Output | `AW 1..1` | 8 |
| PLC Local Modules | Local I/O | Local | PLC A40510 | A41140 | 6ES7 132-6BF01-0BA0 | DQ 8x24VDC/0.5A ST | Output | `AW 2..2` | 8 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.31 | U30110-AxisX | DO SERVO_1 | N/A | DO SERVO | Input | `EW 1100..1119` | 160 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.31 | U30110-AxisX | DO SERVO_1 | N/A | DO SERVO | Output | `AW 1100..1119` | 160 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.32 | U30210-AxisY | DO SERVO_1 | N/A | DO SERVO | Input | `EW 1124..1143` | 160 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.32 | U30210-AxisY | DO SERVO_1 | N/A | DO SERVO | Output | `AW 1124..1143` | 160 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.33 | U30310 | DO with manufacturer telegr. 102_1 | N/A | DO with manufacturer telegr. 102 | Input | `EW 1148..1195` | 384 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.33 | U30310 | DO with manufacturer telegr. 102_1 | N/A | DO with manufacturer telegr. 102 | Output | `AW 1148..1195` | 384 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.34 | U30410 | DO with manufacturer telegr. 102_1 | N/A | DO with manufacturer telegr. 102 | Input | `EW 1200..1247` | 384 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.34 | U30410 | DO with manufacturer telegr. 102_1 | N/A | DO with manufacturer telegr. 102 | Output | `AW 1200..1247` | 384 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.35 | U30510 | DO with manufacturer telegr. 102_1 | N/A | DO with manufacturer telegr. 102 | Input | `EW 1252..1299` | 384 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.35 | U30510 | DO with manufacturer telegr. 102_1 | N/A | DO with manufacturer telegr. 102 | Output | `AW 1252..1299` | 384 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.36 | U30610 | DO with manufacturer telegr. 102_1 | N/A | DO with manufacturer telegr. 102 | Input | `EW 1304..1351` | 384 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.36 | U30610 | DO with manufacturer telegr. 102_1 | N/A | DO with manufacturer telegr. 102 | Output | `AW 1304..1351` | 384 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.37 | M30710 | DS402_Extend-A | N/A | N/A | Input | `EW 1356..1377` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.37 | M30710 | DS402_Extend-A | N/A | N/A | Output | `AW 1356..1399` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.40 | M31010 | Module I/O (08 words) | N/A | Module I/O (08 words) | Input | `EW 1404..1419` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.40 | M31010 | Module I/O (08 words) | N/A | Module I/O (08 words) | Output | `AW 1404..1419` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.41 | M31110 | DS402_Extend-A | N/A | N/A | Input | `EW 1424..1445` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.41 | M31110 | DS402_Extend-A | N/A | N/A | Output | `AW 1424..1467` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.42 | M31210 | DS402_Extend-A | N/A | N/A | Input | `EW 1472..1493` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.42 | M31210 | DS402_Extend-A | N/A | N/A | Output | `AW 1472..1515` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.43 | M31310 | DS402_Extend-A | N/A | N/A | Input | `EW 1520..1541` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.43 | M31310 | DS402_Extend-A | N/A | N/A | Output | `AW 1520..1563` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.44 | M31410 | Module I/O (08 words) | N/A | Module I/O (08 words) | Input | `EW 1568..1583` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.44 | M31410 | Module I/O (08 words) | N/A | Module I/O (08 words) | Output | `AW 1568..1583` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.45 | M31510 | Module I/O (08 words) | N/A | Module I/O (08 words) | Input | `EW 1588..1603` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.45 | M31510 | Module I/O (08 words) | N/A | Module I/O (08 words) | Output | `AW 1588..1603` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.46 | M31610 | DS402_Extend-A | N/A | N/A | Input | `EW 1608..1629` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.46 | M31610 | DS402_Extend-A | N/A | N/A | Output | `AW 1608..1651` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.47 | M31710 | DS402_Extend-A | N/A | N/A | Input | `EW 1656..1677` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.47 | M31710 | DS402_Extend-A | N/A | N/A | Output | `AW 1656..1699` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.48 | M31810 | DS402_Extend-A | N/A | N/A | Input | `EW 1704..1725` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.48 | M31810 | DS402_Extend-A | N/A | N/A | Output | `AW 1704..1747` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.49 | M31910 | DS402_Extend-A | N/A | N/A | Input | `EW 1752..1773` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.49 | M31910 | DS402_Extend-A | N/A | N/A | Output | `AW 1752..1795` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.70 | M34010 | DS402_Extend-A | N/A | N/A | Input | `EW 2016..2037` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.70 | M34010 | DS402_Extend-A | N/A | N/A | Output | `AW 2016..2059` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.71 | M34110 | DS402_Extend-A | N/A | N/A | Input | `EW 2064..2085` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.71 | M34110 | DS402_Extend-A | N/A | N/A | Output | `AW 2064..2107` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.72 | M34210 | DS402_Extend-A | N/A | N/A | Input | `EW 2112..2133` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.72 | M34210 | DS402_Extend-A | N/A | N/A | Output | `AW 2112..2155` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.73 | M34310 | DS402_Extend-A | N/A | N/A | Input | `EW 2160..2181` | 176 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.73 | M34310 | DS402_Extend-A | N/A | N/A | Output | `AW 2160..2203` | 352 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.74 | M34410 | Module I/O (08 words) | N/A | Module I/O (08 words) | Input | `EW 2208..2223` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.74 | M34410 | Module I/O (08 words) | N/A | Module I/O (08 words) | Output | `AW 2208..2223` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.170 | E44010-Encoder | EO Encoder Multiturn V2.x_1 | N/A | N/A | Input | `EW 2228..2243` | 128 |
| PN/IE_1 | Ethernet/Profinet | 10.1.30.170 | E44010-Encoder | EO Encoder Multiturn V2.x_1 | N/A | N/A | Output | `AW 2228..2231` | 32 |

View File

@ -0,0 +1,441 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
M316 ^QGpBOsPR
M317 ^XwY6YBxg
M315 ^5uw93rn8
M318 ^R1xTprpX
B31540 ^1yPovzco
B31550 ^orOOU9K9
S31550 ^LL1ixc09
M328 ^Wu6lcYjc
M329 ^udjVHVza
M330 ^bTQ5oKGd
M331 ^I8y1IZ0k
M336 ^ZJVjURen
M335 ^vqG6Eh7e
M334 ^RLFXNXj2
M333 ^oXfahoxt
M332 ^xITnc4cQ
B34440 ^A6MjGh8q
S34460 ^jqFuZsCh
M340 ^AQXPJwvv
M341 ^3KyRdxVs
M342 ^RYTbgj1D
B34450 ^qliZ1nIA
M343 ^wBu9Je9J
B34451 ^RzrQ6N17
M344 ^yOPtEZnu
M311 ^7VW2eTrq
M312 ^E1cDenf1
M310 ^LXZs5H0T
M313 ^4IL2QVlN
B31060 ^Zx5y3RpD
M314 ^z962gh5J
B31440 ^iZOsgyG1
M319 ^6AK1KY2Z
M307 ^KP4NXEjV
M304 ^W93X5RUo
M306 ^dsWbRb1W
C1 ^M1uAvTX8
C9 ^Jg2LBtOi
C5 ^rlSM1POS
S34470 ^SpmLp1Cq
S31051 ^eoUd3YsC
S34461 ^heswS0PC
S34460 ^bwPm9Dz6
## Embedded Files
cc2e866f5ab74b824891b9e6e5d79ed0c73485aa: [[Layout-Model.png]]
%%
## Drawing
```compressed-json
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
```
%%

View File

@ -10,7 +10,7 @@ Il progetto coinvolge un trasporto di bottiglie ad anello con i seguenti element
* Per effettuare il cambio di formato, il tavolo ha 2 motori di cambio formato delle guide che aprono o chiudono le sponde e i dosatori. * Per effettuare il cambio di formato, il tavolo ha 2 motori di cambio formato delle guide che aprono o chiudono le sponde e i dosatori.
* Per selezionare il canale di carico o scarico si utilizzano 2 motori minimotori, uno all'ingresso e l'altro all'uscita che permettono di modificare l'angolo delle sponde. Questo angolo deve essere caricato come parametro e ci sono 9 canali possibili. * Per selezionare il canale di carico o scarico si utilizzano 2 motori minimotori, uno all'ingresso e l'altro all'uscita che permettono di modificare l'angolo delle sponde. Questo angolo deve essere caricato come parametro e ci sono 9 canali possibili.
### Tavolo di accumulo ### Tavolo di accumulo
*** ***
L'obiettivo del tavolo di accumulo è di immagazzinare il formato che non si sta usando. L'obiettivo del tavolo di accumulo è di immagazzinare il formato che non si sta usando.

View File

@ -0,0 +1,68 @@
***
El proyecto involucra un transporte de botellas en anillo con los siguientes elementos:
* Anillo compuesto M314, M315 y M344
* Transporte con guías motorizadas para cambio de formato
* Divider de alta velocidad
* Cambio formato Guías M307 - Homing S34470
* Combinador para unificar los canales a la salida del divider.
* Cambio formato Combinador M313 - S31051
* Logica de salida B31060
* Mesa de acumulación que permite almacenar el formato no utilizado.
* La mesa de acumulación cuenta con 4 filas a la derecha y 4 a la izquierda además de la fila central usada solo como bypass.
* Las guias de traslacion que permiten mover las botellas desde los canales exteriores a el canal central necesita no tiene traccion propia y como pasa por los canales centrales esto obliga a que para cargar o descargar los canales exteriores los transportes de los canales interiores tengan que estar en marcha. Tambien restringe por este motivo a que los canales exteriores se cargan primero y se descargan ultimo ya que necesitamos mover libremente los canales internos a medida que cargamos o descargamos los canales mas exteriores.
* Si definimos como canal(centro) , centro + n es formato derecho, contro - n es formato izquierdo y centro es el canal de bypass, luego para cargar el formato derecho debemos y tenienedo como Max(n) la cantidad maxima de canales a la derecha o izquierda entonces primero debemos cargar canal n=centro+Max(n) y vamos decrementando n mientras sea mayor a centro. Mientras cargamos el canal n los canales desde centro hasta n se ponen en marcha.
* Para la descarga se hace el procedimiento inverso descargando desde los canales mas cercanos a centro hacia el canal Max(n)
* Para el formato izquierdo se invierte el signo al usar n=centro-Max(n).
* Para la mesa de acumulacion que estamos trabajando Max(n) = 4, los canales estan definidos desde 1 a 9 y el canal central = 5.
* La mesa puede almacenar 2 formatos, uno a la derecha y el otro a la izquierda. Cuando se requiere un cambio de formato se carga el formato en curso y se descarga el nuevo formato. Una vez descargado el formato en curso se activa el modo bypass.
* Cambio formato:
* Dosadores de Ingreso: M318 - Homing S31550
* Dosadores de Salida: M343 - Homing S34461
* Para seleccionar el canal de carga o descarga se utilizan 2 motores minimotores, uno a la entrada y el otro a la salida que permiten modificar el ángulo de las bordes. Este ángulo debe ser cargado como parámetro y hay 9 canales posibles.
La secuencia partiendo de la mesa de acumulacion es:
* Mesa de acumulacion:
* Dosadores de ingreso M316 y M317. Cambio de formato con M318
### Mesa de acumulación
***
El objetivo de la mesa de acumulación es almacenar el formato que no se está usando.
El trabajo tendrá los siguientes objetivos:
- Lógica de la mesa de carga, descarga y bypass: gestión del cambio de formato para el minimotor. Por simplicidad, la mesa está dividida en derecha/izquierda y los formatos pueden estar solo en un lado.
- Lógica de los motores en anillo y lógica estándar VM.
- El HMI no será desarrollado en esta fase, me has dicho que se hace por separado, pero se creará un simulador para nosotros.
- Gestión de las recetas en el HMI: inicialmente, se seguirá el plan acordado. Se crearán filas en el recetario para cada motor en anillo y para los datos de la mesa. El cambio de formato de la mesa comenzará solo después de verificar que no haya más botellas en el anillo y que el modo carga esté activo, con el divider y el anillo en automático.
- Velocidad:
- Velocidad de bypass: depende del divider y del anillo, no limitada por la mesa.
- Velocidad de carga/descarga: debe ser lenta para cerrar los huecos entre los cambios de canal de la mesa. Durante la carga, la descarga está detenida y viceversa.
Por ahora, preveo la mesa como un Dispositivo con los siguientes señales de entrada/salida:
#### Señales de Entrada (Input)
***
| Señal | Descripción | Función |
| ------- | ----------------------------------------------- | ---------------------------------------------------------- |
| i1 | Salida anillo solicitada producto | Salida libre |
| i2 | Solicitud de carga | Para cambio de formato |
| i3 | Anillo vacío + divider en auto + anillo en auto | Para generar consentimiento a cambio de formato |
| i4 | Velocidad motor bypass solicitada | Velocidad deseada para bypass |
| i5 | Cambio de formato ejecutado desde el HMI | Comando de ejecución |
| i6 | Habilitación de descarga | Inhibe descarga automática una vez completada la carga |
#### Señales de Salida (Output)
***
| Señal | Descripción | Función |
| ------- | -------------------------- | ---------------------------------------------------- |
| o1 | Entrada solicita producto | Mesa lista y en marcha |
| o2 | Cambio de formato permitido | Finalizado el carga y anillo vacío |
| o3 | Velocidad motor salida | Para interfaz con 1 motor de salida de la mesa en el anillo |
| o4 | Mesa en Bypass | Estado de bypass activo |
Cambio de estados en la mesa:
- La carga comienza por solicitud externa i2 (de operador o temporizador).
- La descarga ocurre automáticamente después de un cambio de formato (i5). La mesa se descarga completamente antes de iniciar el modo bypass.
- Una vez descargada, se activa el modo bypass. (o4)

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

View File

@ -1,5 +1,5 @@
[Elenco I-O Standard_V07.xlsx](file:///C:%5CTrabajo%5CVM%5C07%20-%20MASTER%20Transport%5CReporte%5CElenco%20I-O%20Standard_V07.xlsx) [Elenco I-O Standard_V07.xlsx](file:///D:%5CTrabajo%5CVM%5C07%20-%20MASTER%20Transport%5CReporte%5CElenco%20I-O%20Standard_V07.xlsx)
| Componente | IP Standard | Commento | Optional | | Componente | IP Standard | Commento | Optional |