181 lines
5.9 KiB
Markdown
181 lines
5.9 KiB
Markdown
# 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:**
|
|
```csharp
|
|
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:**
|
|
```csharp
|
|
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**
|
|
- [x] Sistema de normalización de direcciones
|
|
- [x] Soporte para notaciones alemanas/americanas
|
|
- [x] Integración con todas las funciones
|
|
- [x] Compatibilidad con ambos drivers
|
|
|
|
### **Fase 2: Tabla de Mapeo (Futuro)**
|
|
```csharp
|
|
// 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**
|
|
|
|
- [x] **Sistema de normalización completamente funcional**
|
|
- [x] **Soporte para todas las notaciones comunes de PLC**
|
|
- [x] **Compatibilidad total con Sharp7 y AdvCoSimulator**
|
|
- [x] **Interfaz unificada sin breaking changes**
|
|
- [x] **Documentación completa y ejemplos**
|
|
- [x] **Preparado para tabla de mapeo futura**
|
|
- [x] **Proyecto compila correctamente**
|
|
|
|
**¡La biblioteca ahora es verdaderamente flexible y puede usar cualquier notación de direcciones PLC!** 🎉
|