Decodificando IEC 61850, informes y bloques de control de reportes

Decodificando IEC 61850, informes y bloques de control de reportes

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.

Figura 1. Solicitud de lectura de un objeto tipo ReportControlBlock
Figura 1. Solicitud de lectura de un objeto tipo ReportControlBlock

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.

Figura 2. Estructura de respuesta a la lectura de un reporte.
Figura 2. Estructura de respuesta a la lectura de un reporte.

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

Figura 3. Ejemplo de captura de datos espontáneos de un reporte con MMS.
Figura 3. Ejemplo de captura de datos espontáneos de un reporte con MMS.

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.

Figura 4.Herramienta Decoder IEC 61850
Figura 4.Herramienta Decoder IEC 61850

Para poder descargar el contenido de forma gratuita debe iniciar sesión: