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
- Mapea tag → Llama a
-
EscribirTagBool(string pTag, bool pValue)
: ✅- Mapea tag → Llama a
EscribirBool(address, pValue)
- Funciona con ambos drivers
- Mapea tag → Llama a
Funciones Tag Números:
-
LeerTagInt16(string pTag)
: ✅- Mapea tag → Llama a
LeerNumber(address)
→ Convierte a int - Funciona con ambos drivers
- Mapea tag → Llama a
-
LeerTagDInt(string pTag)
: ✅- Mapea tag → Llama a
LeerNumber(address)
→ Convierte a int - Funciona con ambos drivers
- Mapea tag → Llama a
-
EscribirTagInt16(string pTag, int pValue)
: ✅- Mapea tag → Llama a
EscribirNumber(address, pValue)
- Funciona con ambos drivers
- Mapea tag → Llama a
-
EscribirTagDInt(string pTag, int pValue)
: ✅- Mapea tag → Llama a
EscribirNumber(address, pValue)
- Funciona con ambos drivers
- Mapea tag → Llama a
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!