Bloque que ejecuta una lectura de datos vía SDO de un esclavo remoto en la red CANopen.
Representación Ladder

Estructura del Bloque
Tipo de Variable |
Nombre |
Tipo de Dato |
Descripción |
VAR_INPUT |
Execute |
BOOL |
Habilitación del bloque |
NodeID# |
BYTE |
Dirección del esclavo |
|
Index# |
WORD |
Indice del objeto a ser accedido en el esclavo |
|
SubIndex# |
BYTE |
Subíndice del objeto |
|
Size# |
BYTE |
Tamaño en bytes del dato accedido |
|
Timeout# |
WORD |
Tiempo de espera máximo para llegada del dato, a partir del inicio de la solicitud [ms] |
|
VAR_OUTPUT |
Done |
BOOL |
Habilitación de salida |
Active |
BOOL |
Señalizador de espera de respuesta |
|
Busy |
BOOL |
Señalizador de que el cliente SDO está ocupado con otra solicitud |
|
Error |
BOOL |
Señalizador de error en la ejecución |
|
ErrorID |
BYTE USINT |
Identificador del error ocurrido |
|
Value |
BYTE USINT |
Variable que almacena los datos recibidos |
|
VAR |
CO_SDOREAD_INST_0 |
CO_SDOREAD |
Instancia de acceso a la estructura del bloque |
Operación
Este bloque, cuando detecta un flanco de subida en Execute, verifica si el cliente SDO en la dirección especificado en NodeID# está libre para envío de datos (variable Busy en nivel FALSE). En caso de que lo esté, enviará el pedido de lectura al objeto de tamaño Size# localizado en Index# y SubIndex# y ajustará la salida Active, reseteándola al recibir la respuesta del esclavo. Los datos recibidos serán almacenados en la variable Value. En caso de que el esclavo no esté libre, el bloque aguardará que Busy pase a nivel FALSE para reenviar la solicitud.
|
¡NOTA! En caso de Execute pase a nivel FALSE y Busy aún esté en nivel TRUE, la solicitud será cancelada. |
|
¡NOTA! Value es un array de tamaño igual a Size#. Es importante verificar esta compatibilidad para no generar errores en el bloque. |
|
¡NOTA! Solo es posible leer un objeto (BYTE, WORD, DWORD) por bloque. No es posible leer un array de objetos. |
Cuando Execute tiene valor FALSE, Done permanece FALSE. La salida Done sólo es activada cuando el bloque termina la ejecución exitosamente, permaneciendo en nivel TRUE hasta que Execute reciba FALSE.
En caso de que haya algún error en la ejecución, la salida error será activada y ErrorID exhibirá el código del error según la tabla de abajo.
Código |
Descripción |
0 |
Ejecutado exitosamente |
1 |
La tarjeta no puede ejecutar la función |
2 |
Timeout en la respuesta del esclavo |
3 |
El esclavo retornó error |
Diagrama de Flujo del Bloque

Ejemplo en Ladder

El ejemplo de arriba demanda la lectura del dato de tamaño SIZE, localizado en INDEX - SUBINDEX, del dispositivo NODEID. Ese dato es pasado a VALUE. Finalizado exitosamente el bloque, será activada la salida Done.
Ejemplo en ST
El siguiente ejemplo muestra las instrucciones para aplicar el ejemplo anterior en el lenguaje ST.
VAR ERROR : BOOL; INDEX, TIMEOUT : WORD; NODEID, SUBINDEX : BYTE; VALUE : UDINT; CO_SDOREAD_INST_0 : FB_CO_SDOREAD; END_VAR
CO_SDOREAD_INST_0.Execute := DI1; CO_SDOREAD_INST_0( NodeId:=NODEID, Index:=INDEX, SubIndex:=SUBINDEX, Size:=4, Timeout:=TIMEOUT); ERROR := CO_SDOREAD_INST_0.Error; VALUE := CO_SDOREAD_INST_0.Value; DO1 := CO_SDOREAD_INST_0.Done;
|
|---|