LibS7Adv/UNIFIED_INTERFACE_SUMMARY.md

5.3 KiB

Resumen Final: Unificación Completa de la Interfaz mediante MapTagToAddress

Cambios Completados

🎯 Objetivo Logrado

Se eliminaron todos los controles if (_connection?.ConnectionType == ConnectionType.AdvCoSimulator) de las funciones de tags, implementando una interfaz completamente unificada que utiliza MapTagToAddress() seguido de las operaciones básicas de lectura/escritura.

🔧 Funciones Completamente Unificadas

Funciones Tag Bool:

  • LeerTagBool(string pTag):

    • Mapea tag → Llama a LeerBool(address)
    • Funciona con ambos drivers
  • EscribirTagBool(string pTag, bool pValue):

    • Mapea tag → Llama a EscribirBool(address, pValue)
    • Funciona con ambos drivers

Funciones Tag Números:

  • LeerTagInt16(string pTag):

    • Mapea tag → Llama a LeerNumber(address) → Convierte a int
    • Funciona con ambos drivers
  • LeerTagDInt(string pTag):

    • Mapea tag → Llama a LeerNumber(address) → Convierte a int
    • Funciona con ambos drivers
  • EscribirTagInt16(string pTag, int pValue):

    • Mapea tag → Llama a EscribirNumber(address, pValue)
    • Funciona con ambos drivers
  • EscribirTagDInt(string pTag, int pValue):

    • Mapea tag → Llama a EscribirNumber(address, pValue)
    • Funciona con ambos drivers

Funciones Tag Genéricas:

  • LeerTag(string pTag): ⚠️ Limitada

    • Solo funciona completamente con AdvCoSimulator
    • Retorna mensaje informativo para Sharp7
  • EscribirTag(string pTag, SDataValue Value): ⚠️ Limitada

    • Solo funciona completamente con AdvCoSimulator
    • Retorna mensaje informativo para Sharp7

🔧 Nueva Implementación en AdvCoSimulatorConnection

Se implementó WriteNumber() para AdvCoSimulator:

public bool WriteNumber(string address, object value)
{
    // Detecta automáticamente el tipo del valor:
    // - int pequeño → WriteTagInt16()
    // - int grande → WriteTagDInt()  
    // - short → WriteTagInt16()
    // - byte → WriteTagInt16()
    // - otros tipos → WriteTag() genérico
}

🎯 Comportamiento Actual por Driver

Sharp7:

// TODAS estas llamadas funcionan igual con direcciones absolutas:
bool motor = plc.LeerTagBool("DB1.DBX0.0");     // → LeerBool("DB1.DBX0.0")
plc.EscribirTagBool("Q0.1", true);              // → EscribirBool("Q0.1", true)
int temp = plc.LeerTagInt16("DB1.DBW2") ?? 0;   // → LeerNumber("DB1.DBW2")
plc.EscribirTagInt16("DB1.DBW4", 1234);         // → EscribirNumber("DB1.DBW4", 1234)

AdvCoSimulator:

// MISMAS llamadas, pero internamente puede usar direcciones o tags:
bool motor = plc.LeerTagBool("MotorRunning");    // → LeerBool(MapTagToAddress("MotorRunning"))
plc.EscribirTagBool("AlarmOutput", true);       // → EscribirBool(MapTagToAddress("AlarmOutput"), true)
int temp = plc.LeerTagInt16("Temperature") ?? 0; // → LeerNumber(MapTagToAddress("Temperature"))
plc.EscribirTagInt16("SetPoint", 1234);         // → EscribirNumber(MapTagToAddress("SetPoint"), 1234)

🚀 Ventajas de la Nueva Implementación

Interfaz Completamente Unificada

  • Una sola forma de programar para ambos drivers
  • Sin código específico por driver en las funciones de usuario
  • Cambio de driver transparente sin modificar código de aplicación

Máxima Flexibilidad

  • Sharp7: Garantiza uso de direcciones absolutas
  • AdvCoSimulator: Puede usar direcciones absolutas O tags (según el mapeo)
  • Preparado para tabla de mapeo: Solo modificar MapTagToAddress()

Código Limpio y Mantenible

  • Lógica centralizada en MapTagToAddress()
  • Sin duplicación de código entre drivers
  • Fácil debugging y mantenimiento

📝 Ejemplo de Uso Unificado

var plc = new PLCViewModel();

// Configuración para cualquier driver
plc.PlcData.ConnectionType = ConnectionType.Sharp7; // o AdvCoSimulator
plc.PlcData.IP = "192.168.1.100";
plc.Connect();

if (plc.IsConnected)
{
    // CÓDIGO IDÉNTICO para ambos drivers:
    
    // Operaciones Bool
    bool status = plc.LeerTagBool("DB1.DBX0.0");
    plc.EscribirTagBool("Q0.1", true);
    
    // Operaciones numéricas
    int value = plc.LeerTagInt16("DB1.DBW2") ?? 0;
    plc.EscribirTagInt16("DB1.DBW4", 1234);
    
    int bigValue = plc.LeerTagDInt("DB1.DBD6") ?? 0;
    plc.EscribirTagDInt("DB1.DBD8", 98765);
    
    // ¡El mismo código funciona con Sharp7 Y AdvCoSimulator!
}

🔮 Implementación Futura de Tabla de Mapeo

Cuando implementes la tabla de mapeo, solo necesitas modificar MapTagToAddress():

private string MapTagToAddress(string tag)
{
    // Buscar en tabla de mapeo
    if (_tagMappingTable?.ContainsKey(tag) == true)
    {
        return _tagMappingTable[tag];
    }
    
    // Fallback: asumir que es dirección absoluta
    return tag;
}

¡Todo el resto del código seguirá funcionando automáticamente!

Estado Final

  • Todas las funciones Tag unificadas
  • Sin controles específicos por driver
  • WriteNumber implementado para AdvCoSimulator
  • Interfaz completamente unificada
  • Proyecto compila correctamente
  • Preparado para tabla de mapeo futura
  • ¡Sharp7 funciona perfectamente con direcciones absolutas!