LibS7Adv/UNIFIED_INTERFACE_SUMMARY.md

155 lines
5.3 KiB
Markdown

# 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:
```csharp
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:
```csharp
// 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:
```csharp
// 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**
```csharp
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()`:
```csharp
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**
- [x] Todas las funciones Tag unificadas
- [x] Sin controles específicos por driver
- [x] WriteNumber implementado para AdvCoSimulator
- [x] Interfaz completamente unificada
- [x] Proyecto compila correctamente
- [x] Preparado para tabla de mapeo futura
- [x] **¡Sharp7 funciona perfectamente con direcciones absolutas!**