El protocolo DNP3 (Distributed Network Protocol) fue desarrollado por Harris en 1993 con la
finalidad de tener un estándar de comunicación para lograr la interoperabilidad entre Unidades
Terminales Remotas, Dispositivos Electrónicos Inteligentes y Unidades Terminales Maestras para
aplicaciones SCADA enfocadas a la industria Eléctrica, con este protocolo podemos:
DNP esta basado en estándares de IEC que lo hacen un protocolo abierto y de dominio público,
basándose en el modelo ISO-OSI de 7 capas como se observa a continuación.
Application
Presentation
Session
Transport
Network
Data Link
Physical
Modelo OSI
Capa de Sesión. Esta capa permite que dos usuarios se comuniquen a través de la red (se incluyen
las tareas de seguridad, las contraseñas de usuarios y la administración del sistema).
Capa de Aplicación. Se encarga del intercambio de información entre los usuarios y el sistema
operativo (se incluye la transferencia de archivos y los programas de aplicación).
De estas siete capas las cuatro primeras tienen funciones de comunicación y las tres restantes de
proceso, donde las capas inferiores proporcionan servicios a los niveles superiores, cada capa
dispone de un conjunto de servicios y cada servicio esta definido mediante protocolos.
De este modelo el protocolo DNP3 se basa en el modelo EPA (Enhanced Performance Architecture)
de Arquitectura Mejorada la cual consiste de la capa Física, capa de Enlace de Datos y la capa de
Aplicación, como se observa a continuación.
Physical Layer
EPA Data Link Layer
Application Layer
A continuación se indica los servicios de cada una de las capas utilizadas en el protocolo DNP3
FT3 Frame Format de LPDU (Link Protocol Data Unit). Esta definido como 1 block de 10 bytes
identificado como “Header Block”, seguido de blocks opcionales de datos, cada block es de 16
bytes con su CRC al final de cada block.
La especificación IEC indica que el “Header Block” (block 0) esta formado por 2 bytes de inicio o
encabezado, 1 byte que indica el tamaño o longitud del mensaje, 1 byte de control, 2 bytes para la
dirección destino, 2 bytes para la dirección fuente y 2 bytes para el código de seguridad CRC. Como
se observa en la imagen Estructura formato FT3.
El o los siguientes blocks de datos conocidos como “User Data” cada uno es de 16 bytes, excepto el
último block el cual puede ser menor de acuerdo a la función solicitada.
START START LENGTH CONTROL DESTINATION SOURCE CRC USER CRC USER CRC
0X05 0X64 DATA DATA
START Son los 2 bytes del encabezado, su valor es en hexadecimal y es el mismo valor
tanto en mensajes solicitud como de respuesta, el 1er byte es igual a 05 y el segundo
byte es igual a 64. Dentro del mensaje son los 2 primeros bytes
LENGTH Indica el número de bytes que se van a transmitir, en este contador se incluyen los
bytes de CONTROL, DESTINATION y SOURCE, los códigos de CRC no se incluyen
en el número de bytes que se transmiten, así como los tres bytes de START(2) y
LENGHT(1).
El valor mínimo para LENGTH es 5 y el máximo 255, este campo ocupa el tercer
byte en el mensaje.
Bit 7 6 5 4 3 2 1 0
DIR (Direction Bit) Este bit se utiliza para indicar la dirección física de transmisión
del mensaje con relación a la estación maestra designada, donde la estación
A es la maestra, cuando es de UTM a UTR el valor de DIR es 1 y de UTR a
UTM es 0.
PRM (Primary Message Bit) Este bit indica la dirección de quien envía el mensaje es
decir si es del primario o del secundario, si este bit vale 1 lo envía el
primario y si es cero lo envía el secundario
FCB (Frame Count Bit) Este bit es utilizado para indicar duplicidad de mensajes a la
misma estación. Inicialmente antes de comunicarse con 1 estación
secundaria o después de una falla de comunicación la estación primaria
deberá resetear el Data Link de cada estación secundaria. Cada estación
secundaria después de 1 falla no deberá aceptar ningún mensaje SEND-
CONFIRM estando la bandera FCV=1 hasta la recepción del comando
RESET y el envío del mensaje CONFIRM.
FCV (Frame Count Valid) Habilita la bandera FCB, si el valor de FCV es igual a 0 el
estado de FCB es ignorado, si vale 1 indica a la estación secundaria que el
estado de FCB deberá ser checado otra vez de el último mensaje enviado con
la bandera FCV habilitada.
DFC (Data Flow Control) Este bit es usado para indicar un Overflow en una estación
secundaria, el bit es colocado por la estación secundaria ocasionando que la
estación primaria deberá interrogar a la secundaria con el comando
REQUEST-RESPOND, Request Link Status hasta que DFC=0.
FUNCTION CODE se utilizan 4 bits y son para identificar el tipo de mensaje el cual
es diferente para el primario o para el secundario de acuerdo al estado del
bit PRM y al valor asociado a FCV. A continuación se muestran los códigos
de función para el Primario y secundario.
Function Code Field of the Control Octect Sent from the Secondary Station (PRM=0)
Function Frame Type Service Function
Code
0 CONFIRM ACK positive acknowledgement
1 CONFIRM NACK Message not accepted, link busy
2 Not Used
3 Not Used
4 Not Used
5 Not Used
6 Not Used
7 Not Used
8 Not Used
9 Not Used
10 Not Used
11 RESPOND Status of Link (DFC=0 or DFC=1)
12 Not Used
13 Not Used
14 Link service not functioning
15 Link service not used or implemented
DESTINATION Este campo utiliza 2 bytes y nos indican la dirección de la estación a la cual se esta
enviando el mensaje, el 1er byte de este campo contiene la parte baja de la dirección
y el segundo byte contiene la parte alta de la dirección, por lo tanto se puede tener
hasta 65535 direcciones. Dentro del mensaje son los bytes 5 y 6.
SOURCE Este campo utiliza 2 bytes y nos indican la dirección de la estación que esta
originando el mensaje, el 1er byte de este campo contiene la parte baja de la
dirección y el segundo byte contiene la parte alta de la dirección, por lo tanto se
puede tener hasta 65535 direcciones. Dentro del mensaje son los bytes 7 y 8.
USER DATA Contiene los blocks que siguen al “Header Block”, donde cada block es de 16 bytes
mas el CRC (Código de Redundancia Cíclica), excepto el último block que puede ser
CRC Este campo utiliza 2 bytes que son para el código de seguridad el cual se genera
para cada block y se agrega el CRC al final de cada block.
Reset Esta función se utiliza por ejemplo para habilitar la comunicación en una dirección
siendo de Primaria a Secundaria, otra uso es cuando lo envía la estación Primaria
cuando es la primera vez o bien después de 1 falla de comunicación (no responde la
UTR), también se usa para sincronizar el FCB entre la estación primaria y
secundaria.
A continuación se observa el formato de esta capa formado por TH byte 11 dentro del mensaje y
User Data byte 12 en adelante.
TH USER DATA
El primer campo de esta capa es “Transport Header” TH, el cual contiene información para la
estación secundaria para reconstruir el mensaje completo. Donde la estación secundaria checa el TH
cada vez que recibe un LSDU (Link Service Data Unit), para la secuencia correcta y en base a esta
construir un TSDU (Transport Service Data Unit)..
El campo de Transport Header utiliza un byte, a continuación se indica la información de los bits o
banderas utilizados en este byte.
SEQUENCE
FIN FIR
Bit 7 6 5 4 3 2 1 0
FIN=0 Indica que continúan mas mensajes, esto aplica cuando la función esta
solicitando mas de 249 bytes.
FIN=1 Indica que es el último telegrama, es decir son menos de 249 bytes los que se
están solicitando.
FIR FIRst bit este bit se utiliza para indicar cuando es el primer “telegrama”, de una
secuencia.
SEQUENCE Este campo es utilizado para verificar que cada mensaje del mismo tipo no se pierda
o se duplique, el número de secuencia se incrementa en uno para cada mensaje que
es transmitido o recibido a la misma dirección. El número de secuencia varia entre 0
y 63 y es del tipo circular.
Ejemplo si se van a transmitir 598 bytes, entonces tenemos que el número máximo
que podemos transmitir por telegrama es 249 bytes, nos da como resultado 2
telegramas de 249 bytes y un tercero de 100 bytes, a continuación se muestra el
valor de los bits FIR, FIN y SÉQUENSE.
Envía los primeros 249 Envía los siguientes 249 Envía los últimos 100 bytes
bytes. bytes. FIR=0
FIR=1 FIR=0 FIN=1
FIN=0 FIN=0 SEQUENSE=4
SEQUENSE=2 SEQUENSE=3 USER DATA=2
USER DATA=0 USER DATA=1
Request Header
Response Header
APPLICATION Este campo esta formado por 1 byte, y se utiliza para reconstruir información
CONTROL cuando son varios telegramas, este campo esta integrado por 4 campos como se
observa a continuación.
SEQUENCE
FIN FIR CON
Bit 7 6 5 4 3 2 1 0
FIN Este bit si esta en 1 indica que es el fragmento final de un mensaje de aplicación.
SEQUENSE este campo utiliza 5 bits (0- 1Fh) y es para indicar el número de
fragmento, si el valor se encuentra entre 0 y 15 indica son solicitudes de la
FUNCTION Este campo esta formado por 1 byte, y se utiliza para indicar la función que se está
CODE solicitando (lectura, selección, operación de punto de control, etc.) así como la
dirección del mensaje si es una solicitud o respuesta. Para respuesta los valores
permitidos son 0, 128 ó 129.
De la imagen Response Header observamos que está formado por los campos de “Application
Control” , “Function Code” y “Internal Indications”
La información para los 2 primeros campos “Application Control” , “Function Code” es la misma
que se describió en “Request Header “, a continuación se describe el uso del tercer campo “Internal
Indications”.
INTERNAL Este campo esta formado por 2 bytes, y la información contenida se refiere al estado
INDICATION de las banderas, estas banderas solo aplican en el mensaje de respuesta.
De estos 2 bytes se usan 14 bits para banderas, el bit 6 y 7 del segundo byte están reservadas
para uso futuro. Para ver el significado de cada bit referirse al manual de DNP3 sección
“Application Layer” apartado “Internal Indication”.
Después de “Application Header” continua “Object Header” el cual especifica los objetos de datos
que están contenidos en el mensaje o que van a ser usados para respuesta. Este esta formado por 3
campos como se indica a continuación y que son los mismos para solicitud y respuesta.
Object Header
OBJECT Este campo esta formado por 2 bytes, y la información contenida se refiere al grupo
y variación del objeto.
QUALIFIER Este campo esta formado por 1 byte, y la información contenida en este byte indica
como será interpretado el campo Rango. Este byte esta formado a su vez por 3
campos como se observa a continuación
Bit 7 6 5 4 3 2 1 0
Qualifier Code. Este campo es de 4 bits y se utiliza para especificar el contenido del
campo rango. Para valores de 0, 1 y 2 el rango de inicio y final son
considerados como índices de datos, para valores de 3, 4 y 5 los rangos son
interpretados como direcciones de memoria virtual y para valores 7, 8 y 9
son usados para indicar que el campo rango consiste de un contador
indicando el número de objetos en cuestión.
Valor Descripción
0 Usa 8 bits para indicar rango de inicio y fin.
1 Usa 16 bits para indicar rango de inicio y fin
2 Usa 32 bits para indicar rango de inicio y fin
3 Usa 8 bits para indicar una dirección
4 Usa 16 bits para indicar una dirección
5 Usa 32 bits para indicar una dirección
6 EL TAMAÑO DEL RANGO ES 0 implica todos los puntos
7 Usa 8 bits para indicar la cantidad de objetos
8 Usa 16 bits para indicar la cantidad de objetos
9 Usa 32 bits para indicar la cantidad de objetos
RANGE Este campo esta en función del valor de Index Size y de Qualifier, el cual puede estar
formado de 0 hasta 8 bytes. Por ejemplo si el valor del campo Qualifier esta entre 0
y 5 el campo rango tendrá 2 subcampos indicando rango de inicio y rango final que
se utiliza para definir un rango de objetos, los cuales siguen después del Object
Header.