En diversas ocasiones es necesario leer y entender las tramas de comunicación que circulan entre un IED y un terminal cliente como un SCADA o una GATEWAY. Cuando tenemos ausencia de datos, calidad inválida inesperada o errores en la estampa de tiempo de un dato, podemos hacer uso de herramientas como Wireshark para capturara y analizar los flujos de datos. Sin embargo, alguna de las descripciones que obtenemos son demasiado abstractas, dificultando identificar los campos y valores que podrían ayudarnos en el diagnóstico del problema. Este es el caso de los reportes de IEC 61850 a través del protocolo MMS
En este artículo vamos a profundizar en la compresión de la información que nos proporciona Wireshark en dos escenarios: primero, cuando se lee un objeto del tipo ReportControlBlock, a partir de los cual la herramienta cliente toma decisiones para habilitar o no un reporte; y segundo, el envío de datos espontáneos a través del informationReport, que sin duda, es el tipo de objeto principal durante la fase de supervisión en IED con IEC 61850.
Lectura de un Report Control Block
En la figura 1 vemos el inicio de una comunicación entre un IED con dirección IP 85.16.1.21 y un sistema SCADA con IP 85.16.1.64. Con las dos primeras tramas de la comunicación se establecen los parámetro de comunicación MMS entre las dos entidades. Luego de eso el SCADA solicita una lectura del reporte con identificación: IO1CFG/LLN0$BR$BRep01.
Como resultado de dicha petición, el IED responde con la siguiente estructura, ver figura 2, la cual vamos a ver en detalle a continuación.
Para comenzar nos centraremos en la estructura que forma el cuerpo de la respuesta:
structure: 13 items Data: visible-string (10) --- Identificador del reporte (RpdID) visible-string: IO1CFG/LLN0$BR$BRep01 Data: boolean (3) --- Si está habilitado (RptEna) boolean: False Data: visible-string (10) --- Nombre del Dataset (DatSet) visible-string: IO1CFG/LLN0$DSet01 Data: unsigned (6) --- Versión de configuración (ConfRev) unsigned: 1 Data: bit-string (4) --- Campos opcionales (OptFlds) Padding: 6 bit-string: 7c80 Data: unsigned (6) --- Tiempo de buferado (BufTm) unsigned: 500 Data: unsigned (6) --- Número secuencia del reporte (SeqNum) unsigned: 0 Data: bit-string (4) --- Opciones de disparo (TrgOps) Padding: 2 bit-string: 60 Data: unsigned (6) --- Periodo de integridad (IntgPd) unsigned: 0 Data: boolean (3) --- Interrogación general (GI) boolean: False Data: boolean (3) --- Purga (PurgeBuf) boolean: False Data: octet-string (9) --- ID última entrada (EntryID) octet-string: 0000002100000000 Data: binary-time (12) --- Última entrada (TimeOfEntry) binary-time: Aug 14, 2018 23:43:42.660000000 UTC
Algunos de los campos son de interpretación directa, por ejemplo el identificador del reporte (RptId) o si está o no habilitado el reporte (RptEna). En el caso de RptEna la lógica funciona en sentido inverso, RptEna=True nos dice que el reporte ya esta habilitado, es decir, que no esta disponible para ser tomado por otro cliente. Sin embargo, otros requieren de una mejor explicación como los campos opcionales (OptFlds) o las opciones de disparo (TrgOp).
En el caso de los campos opcionales se debe desglosar su valor en forma de bits. Para el ejemplo el valor dado es 7c80 con 6 bit de relleno (padding), es decir, equivale a 0111110010000000 y excluyendo los 6 bits menos significativos se tiene 0111110010.
Posición | Parámetro | Valor |
1 | No se utiliza | 0 |
2 | Incluir número de secuencia | 1 |
3 | Incluir estampa de tiempo de reporte | 1 |
4 | Incluir causa de transmisión | 1 |
5 | Incluir el nombre del dataset | 1 |
6 | Incluir identificadores de objetos | 1 |
7 | Buffer-overflow | 0 |
8 | Incluir Entry Id | 0 |
9 | Incluir conf-revision | 1 |
10 | skip segmentation | 0 |
Por un criterio de eficiencia, se recomienda habilitar campos opcionales. Estos pueden ser útiles si estamos diagnosticando un problema de comunicación o si el nodo cliente llegara a necesitar alguno de estos, por ejemplo ante el manejo de Entry ID y la purga de reportes buffeados.
Por su parte, las opciones de disparo se muestran como un bit-string de valor 60 con 2 bit de padding. Repitiendo la operación, 60 equivale a 01100000 menos 2 bit tenemos 011000.
Posición | Parámetro | Valor |
1 | No se utiliza | 0 |
2 | Cambio de dato (Data-change) | 1 |
3 | Cambio de calidad (Quality-change) | 1 |
4 | Actualización de dato (Data-update) | 0 |
5 | Integridad (Integrity) | 0 |
6 | Interrogación general (GI) | 0 |
Usualmente se espera que los reportes respondan a cambios de dato (Data-change), calidad (Quality-change) e interrogación general (GI), cosa que no sucede en el caso de ejemplo.
Interpretando un Information Report
Un Information Report es la estructura que llega de un reporte frente a una de las condiciones de disparo para las que fue configurado. La figura 3 presenta un ejemplo de la captura de este tipo de estructuras
La interpretación de los campos de un information report depende de los campos opcionales se hayan habilitado. Para entenderlo vamos a analizar la siguiente trama:
MMS
unconfirmed-PDU unconfirmedService: informationReport (0) informationReport variableAccessSpecification: variableListName (1) listOfAccessResult: 11 items AccessResult: success (1) success: visible-string (10) --- Identificador del reporte (RpdID) visible-string: IO1CFG/LLN0$RP$URep0101 AccessResult: success (1) success: bit-string (4) --- Campos opcionales (OptFlds) Padding: 6 bit-string: 7e80 (de este campo se definen los siguiente)
AccessResult: success (1) success: unsigned (6) unsigned: 14 --- Valor de secuencia AccessResult: success (1) success: binary-time (12) --- Estampa de tiempo de reporte binary-time: Aug 15, 2018 16:36:41.741000000 UTC AccessResult: success (1) success: visible-string (10) --- Nombre del dataset visible-string: IO1CFG/LLN0$DSet07 AccessResult: success (1) success: boolean (3) --- Buffer overflow boolean: False AccessResult: success (1) success: unsigned (6) --- Versión de configuración unsigned: 1 AccessResult: success (1) success: bit-string (4) Padding: 0 bit-string: 800000 --- Identificador de segmento AccessResult: success (1) success: visible-string (10) --- Identificador de objeto visible-string: IO1ANN/IN2GGIO12$ST$Ind01 AccessResult: success (1) success: structure (2) structure: 3 items Data: boolean (3) --- Valor del objeto boolean: False Data: bit-string (4) --- Calidad del dato Padding: 3 bit-string: C000 Data: utc-time (17) --- Estampa de tiempo del dato utc-time: Jan 1, 1970 00:00:00.000000000 UTC AccessResult: success (1) success: bit-string (4) Padding: 2 bit-string: 40 --- Causa de transmisión
La clave del análisis está en los campos opcionales. Debe interpretar este valor y en función de ello encontrará secuencialmente los siguiente valores:
- Número de secuencia (seqNumber)
- Estampa de tiempo de reporte (timeStamp)
- Nombre del Dataset
- Buffer-Overflow
- ID de la entrada del reporte (EntryId)
- Revisión de configuración (ConfRev)
Para este caso, los campos que requieren una interpretación adicional serían la Calidad y Causa de transmisión. Para la calidad tenemos C000 con 3 bit de relleno, es decir: 1100000000000. La siguiente tabla nos ayudará a interpretar su valor:
Posición | Parámetro | Valor |
1 | Validad(Good | Invalid | Reserved | Questionable) | 1 |
2 | 1 | |
3 | Desbordamiento (Overflow) | 0 |
4 | Fuera de rango (OutOfRange) | 0 |
5 | Mala referencia (BadReference) | 0 |
6 | Oscilante (Oscillatory) | 0 |
7 | Fallido (Failure) | 0 |
8 | Antiguo (Old data) | 0 |
9 | Incosistente (Inconsistent) | 0 |
10 | Impreciso (Inaccurate) | 0 |
Para el caso, la calidad del dato es cuestionable, señalado por el valor 11 de los dos primeros bits de datos. Finalmente, la causa de transmisión es 40 con 2 bit de relleno, es decir: 010000. Utilizando la misma tabla que TrgOpts se tiene:
Posición | Parámetro | Valor |
1 | No se utiliza | 0 |
2 | Cambio de dato (Data-change) | 1 |
3 | Cambio de calidad (Quality-change) | 0 |
4 | Actualización de dato (Data-update) | 0 |
5 | Integridad (Integrity) | 0 |
6 | Interrogación general (GI) | 0 |
En el siguiente enlace incluimos herramientas en línea que facilitan la interpretación de estos campos.