LibS7Adv/ADDRESS_NORMALIZATION_SUMMA...

5.9 KiB

Resumen Final: Sistema de Normalización de Direcciones PLC

Nueva Funcionalidad Implementada

🎯 Objetivo Logrado

Se implementó un sistema completo de normalización de direcciones PLC que permite usar múltiples notaciones indistintamente, todas se convierten automáticamente al formato compatible con Sharp7.

🔧 Sistema de Normalización Implementado

Función Principal: NormalizePlcAddress(string address)

  • Convierte automáticamente diferentes notaciones al formato Sharp7
  • Soporta notación alemana, americana, con P y sin P
  • Es completamente transparente para el usuario

Notaciones Soportadas:

🇩🇪 INPUTS (Entradas) - Alemán:
PEW0  → IW0     (Alemán con P)
EW0   → IW0     (Alemán sin P)
PEB0  → IB0     (Bytes)
EB0   → IB0     
PED0  → ID0     (DWords)
ED0   → ID0     
PE0.0 → I0.0    (Bits)
E0.0  → I0.0    
🇺🇸 INPUTS - Americano:
PIW0  → IW0     (Americano con P)
IW0   → IW0     (Sin cambios - ya correcto)
PIB0  → IB0     
IB0   → IB0     
PID0  → ID0     
ID0   → ID0     
PI0.0 → I0.0    
I0.0  → I0.0    
🇩🇪 OUTPUTS (Salidas) - Alemán:
PAW0  → QW0     (Alemán con P)
AW0   → QW0     (Alemán sin P)
PAB0  → QB0     
AB0   → QB0     
PAD0  → QD0     
AD0   → QD0     
PA0.0 → Q0.0    
A0.0  → Q0.0    
🇺🇸 OUTPUTS - Americano:
POW0  → QW0     (Americano con P)
QW0   → QW0     (Sin cambios)
POB0  → QB0     
QB0   → QB0     
POD0  → QD0     
QD0   → QD0     
PO0.0 → Q0.0    
Q0.0  → Q0.0    
🏗️ SIN CAMBIOS:
DB1.DBX0.0  → DB1.DBX0.0    (Data Blocks)
DB1.DBW0    → DB1.DBW0      
DB1.DBD0    → DB1.DBD0      
M0.0        → M0.0          (Marcas/Memory)
MW0         → MW0           
MD0         → MD0           

🎯 Integración Completa

Función MapTagToAddress() Mejorada:

  1. Búsqueda en tabla de mapeo (futuro)
  2. Normalización automática de direcciones PLC NUEVO
  3. Fallback a dirección original

Todas las Funciones Actualizadas:

  • LeerBool() - Usa normalización
  • EscribirBool() - Usa normalización
  • LeerNumber() - Usa normalización
  • EscribirNumber() - Usa normalización
  • LeerTagBool() - Usa normalización
  • EscribirTagBool() - Usa normalización
  • LeerTagInt16() - Usa normalización
  • EscribirTagInt16() - Usa normalización
  • LeerTagDInt() - Usa normalización
  • EscribirTagDInt() - Usa normalización

🚀 Beneficios de la Implementación

Flexibilidad Total

  • Usa cualquier notación: Alemana, americana, con P, sin P
  • Compatibilidad completa: Con ambos drivers (Sharp7 y AdvCoSimulator)
  • Transparencia total: La normalización es invisible para el usuario

Facilidad de Migración

  • Código existente sigue funcionando: Sin breaking changes
  • Nuevos proyectos más flexibles: Pueden usar notación preferida
  • Equipos internacionales: Cada uno puede usar su notación familiar

Preparado para el Futuro

  • Base sólida para tabla de mapeo: Solo agregar búsqueda en tabla
  • Extensible: Fácil agregar nuevas notaciones
  • Mantenible: Lógica centralizada en una función

📝 Ejemplos de Uso

Sharp7 con Múltiples Notaciones:

plc.PlcData.ConnectionType = ConnectionType.Sharp7;
plc.Connect();

// ¡Todas estas formas funcionan!
bool sensor1 = plc.LeerBool("E0.0");        // Alemán → I0.0
bool sensor2 = plc.LeerBool("PE0.1");       // Alemán+P → I0.1  
bool sensor3 = plc.LeerBool("PI0.2");       // Americano+P → I0.2
bool sensor4 = plc.LeerBool("I0.3");        // Americano → I0.3

string temp1 = plc.LeerNumber("EW2");        // Alemán → IW2
string temp2 = plc.LeerNumber("PEW4");       // Alemán+P → IW4
string temp3 = plc.LeerNumber("PIW6");       // Americano+P → IW6
string temp4 = plc.LeerNumber("IW8");        // Americano → IW8

plc.EscribirBool("A0.0", true);             // Alemán → Q0.0
plc.EscribirBool("PA0.1", false);           // Alemán+P → Q0.1
plc.EscribirNumber("AW2", 1234);            // Alemán → QW2
plc.EscribirNumber("PAW4", 5678);           // Alemán+P → QW4

AdvCoSimulator - Misma Funcionalidad:

plc.PlcData.ConnectionType = ConnectionType.AdvCoSimulator;
plc.Connect();

// ¡El mismo código funciona idénticamente!
bool sensor = plc.LeerBool("E0.0");         // → I0.0
plc.EscribirBool("A0.1", true);            // → Q0.1
int value = plc.LeerTagInt16("PEW2") ?? 0;  // → IW2
plc.EscribirTagInt16("PAW4", 9999);        // → QW4

🔮 Roadmap Futuro

Fase 1: COMPLETADA

  • Sistema de normalización de direcciones
  • Soporte para notaciones alemanas/americanas
  • Integración con todas las funciones
  • Compatibilidad con ambos drivers

Fase 2: Tabla de Mapeo (Futuro)

// Implementación futura:
private Dictionary<string, string> _tagMappingTable = new()
{
    { "MotorRunning", "E0.0" },      // → I0.0 (con normalización)
    { "MotorOutput", "A0.1" },       // → Q0.1 (con normalización)
    { "Temperature", "PEW2" },       // → IW2 (con normalización)
    { "SetPoint", "PAW4" }           // → QW4 (con normalización)
};

// Flujo completo:
// "MotorRunning" → Tabla → "E0.0" → Normalización → "I0.0" → Sharp7

Estado Final

  • Sistema de normalización completamente funcional
  • Soporte para todas las notaciones comunes de PLC
  • Compatibilidad total con Sharp7 y AdvCoSimulator
  • Interfaz unificada sin breaking changes
  • Documentación completa y ejemplos
  • Preparado para tabla de mapeo futura
  • Proyecto compila correctamente

¡La biblioteca ahora es verdaderamente flexible y puede usar cualquier notación de direcciones PLC! 🎉