Cómo crear un wrapper SCL personalizado para el bloque BRCV con punteros ANY dinámicos

Para crear un bloque wrapper S7-SCL reutilizable alrededor del bloque de función de sistema SFB13 (BRCV - Block Receive) que reciba bloques de datos de longitud variable de forma dinámica, construya una estructura de puntero ANY de 10 bytes en la memoria temporal y asígnela al parámetro RD_1. En SIMATIC S7-400 y PCS 7, los bloques de comunicación de sistema estándar requieren punteros ANY para definir el búfer de datos de destino. Como S7-SCL no permite matrices (arrays) variables directamente en las interfaces formales de bloques estándar, los ingenieros deben ensamblar los componentes del puntero ANY manualmente —especificando el ID de sintaxis (16#10), el tipo de datos, la longitud en bytes y el número del bloque de datos (DB) de destino— y gestionar los estados del protocolo de enlace de comunicación asíncrona (EN_R, NDR, ERROR, STATUS).

Índice de contenidos

Mecánica del SFB13 (BRCV) en comunicaciones entre estaciones S7-400

En arquitecturas SIMATIC S7 y PCS 7 de gran tamaño, se intercambian grandes bloques de datos (de hasta 64 KB) entre controladores o entre un AS y sistemas externos utilizando el par de bloques de comunicación S7 configurados:
- BSEND (SFB12): Transmite bloques de datos segmentados de forma asíncrona a través de una conexión S7.
- BRCV (SFB13): Recibe el flujo de datos, reensambla los segmentos y transfiere la carga útil (payload) directamente a un Data Block (DB) de destino.
- El protocolo de enlace de coordinación (Handshake):
- ID: ID de conexión S7 configurado desde NetPro.
- R_ID: Un identificador de 32 bits único que empareja un BSEND específico con su BRCV correspondiente.
- EN_R: Entrada de habilitación continua que autoriza la recepción de datos.
- NDR (New Data Received): Genera un pulso TRUE durante un ciclo de CPU cuando la transferencia se realiza correctamente.
- ERROR y STATUS: Códigos de condición de diagnóstico de salida.

Anatomía de la estructura de puntero S7 ANY de 10 bytes

Para indicar a BRCV dónde depositar los datos entrantes, el parámetro receptor RD_1 requiere un puntero ANY. En la memoria, un puntero ANY consta exactamente de 10 bytes estructurados en seis campos:

Desplazamiento en bytesNombre de campoTipo de datoValor / PropósitoByte 0Syntax_IDBYTESiempre 16#10 para punteros SIMATIC S7 estándar.Byte 1Data_TypeBYTETipo de dato del destino: 16#02 = BYTE, 16#04 = WORD, 16#06 = DWORD.Bytes 2–3Repetition_FactorWORDNúmero de elementos (por ejemplo, número de bytes a recibir).Bytes 4–5DB_NumberWORDNúmero del Data Block de destino (por ejemplo, DB 50 = 16#0032); 0 para memoria que no sea DB.Byte 6Memory_AreaBYTECódigo de área: 16#84 para Data Blocks (DB), 16#83 para marcas de memoria (M).Bytes 7–9Byte_Bit_Pointer3 BytesPuntero de dirección de bit: Desplazamiento del byte de inicio multiplicado por 8 ($\text{ByteOffset} \ll 3$).

Construcción de punteros ANY dinámicos en S7-SCL

En S7-SCL, declarar una estructura interna en VAR_TEMP permite el ensamblaje directo de estos bytes binarios:

VAR_TEMP
    Target_Any : ANY;
    Any_Overlay AT Target_Any : STRUCT
        Syntax_ID   : BYTE;
        DataType    : BYTE;
        Count       : WORD;
        DB_Num      : WORD;
        AreaCode    : BYTE;
        ByteOffset  : DWORD; // 3 bytes used for bit address
    END_STRUCT;
END_VAR

Utilizando el filtro de superposición AT de SCL, escribir valores en los elementos individuales de Any_Overlay rellena simultáneamente la variable formal Target_Any, que luego se pasa directamente a SFB13.

Método: Implementación paso a paso del bloque wrapper SCL

Siga esta implementación completa en S7-SCL para construir un bloque de función receptor parametrizado y dinámico:

Código fuente SCL completo:

FUNCTION_BLOCK FB2604
TITLE = 'Dynamic_BRCV_Receiver'
VERSION : '1.0'
AUTHOR  : 'AutomationNet'

VAR_INPUT
    ID          : WORD;       // Connection ID from NetPro
    R_ID        : DWORD;      // Unique Pair Identifier
    EN_R        : BOOL;       // Enable Receive
    DB_NUM_I    : INT;        // Target DB Number
    DB_LEN_I    : INT;        // Number of Bytes to Receive
END_VAR

VAR_OUTPUT
    NDR         : BOOL;       // New Data Received (Pulse)
    ERROR       : BOOL;       // Communication Error Flag
    STATUS      : WORD;       // Error Status Code
END_VAR

VAR
    inst_BRCV   : BRCV;       // Static Multi-Instance of SFB13
END_VAR

VAR_TEMP
    Target_Any  : ANY;
    Any_Struct  AT Target_Any : STRUCT
        Syntax_ID   : BYTE;
        DataType    : BYTE;
        Count       : INT;
        DB_Number   : INT;
        BytePointer : DWORD;
    END_STRUCT;
END_VAR

BEGIN
    // 1. Construct the ANY Pointer dynamically in temp memory
    Any_Struct.Syntax_ID   := 16#10;            // S7 Standard Syntax ID
    Any_Struct.DataType    := 16#02;            // Type: BYTE
    Any_Struct.Count       := DB_LEN_I;         // Length in bytes
    Any_Struct.DB_Number   := DB_NUM_I;         // Target DB Number

    // Memory Area 16#84 (DB) + Start Offset at Byte 0 (0 * 8 = 0)
    // 16#84000000 points to DBX 0.0
    Any_Struct.BytePointer := 16#84000000;

    // 2. Call the internal SFB13 (BRCV) instance
    inst_BRCV(
        EN_R := EN_R,
        ID   := ID,
        R_ID := R_ID,
        RD_1 := Target_Any
    );

    // 3. Map status outputs to block interface
    NDR    := inst_BRCV.NDR;
    ERROR  := inst_BRCV.ERROR;
    STATUS := inst_BRCV.STATUS;

END_FUNCTION_BLOCK

Verificación

Para verificar que el wrapper SCL personalizado recibe los datos correctamente:
- En SIMATIC Manager, compile el archivo fuente .SCL en el bloque FB2604.
- Inserte el FB2604 en un diagrama CFC cíclico (por ejemplo, OB35).
- Parametrize el bloque:
- ID: Introduzca el ID de conexión hexadecimal exacto de NetPro (por ejemplo, 16#0001).
- R_ID: Introduzca el ID de 32 bits correspondiente (por ejemplo, DW#16#00000001).
- EN_R: Configúrelo a TRUE.
- DB_NUM_I: Introduzca el número de DB de destino (por ejemplo, 50).
- DB_LEN_I: Introduzca la longitud de carga útil esperada (por ejemplo, 128).
- Active BSEND en el controlador asociado:
- Confirme que NDR genera un pulso TRUE en el modo de prueba en línea (Test Mode).
- Verifique que ERROR = FALSE y STATUS = 16#0000.
- Abra el DB50 de destino en línea: confirme que los bytes de datos del emisor llenan el bloque de datos con precisión.

Limitaciones y precauciones operativas

  • Dimensionamiento del Data Block de destino: El Data Block de destino en la memoria del controlador debe ser igual o mayor que el valor configurado en DB_LEN_I. Si BRCV intenta escribir más allá del final del DB declarado, la CPU provocará un error de área de longitud (OB121) o pasará al modo STOP.
  • Reglas de ejecución asíncrona: BRCV no se ejecuta en tiempo cero. El protocolo de enlace es multicíclico. No lea ni procese los datos del DB de destino hasta que NDR se active a TRUE.
  • Unicidad de R_ID: Cada par BSEND/BRCV en la misma conexión S7 debe usar un R_ID globalmente único. Los valores de R_ID en colisión provocan interferencias cruzadas en los telegramas y corrupción de datos.

Preguntas frecuentes de ingeniería

¿Por qué falló el código original del ticket al compilar en SCL?

La publicación original intentó utilizar desplazamientos de bits no alineados y estructuras temporales no declaradas sin el filtro de superposición AT, lo que provocó errores de sintaxis en S7-SCL en el parámetro RD_1.

¿Puede este wrapper recibir datos en un área de memoria de marcas (M) en lugar de un DB?

Sí. Cambie Any_Struct.BytePointer de 16#84000000 (DB) a 16#83000000 (Área de memoria de bits) y establezca Any_Struct.DB_Number := 0.

¿Qué significa STATUS = 16#7000 o 16#7001 en BRCV?

16#7000 indica que el bloque está en reposo o no ha sido llamado. 16#7001 indica que el bloque ha sido habilitado (EN_R = 1), está a la espera de datos entrantes y la comunicación está armada activamente.

¿Cuántos bloques BRCV pueden ejecutarse simultáneamente en una CPU S7-400?

El límite lo determinan las instancias de comunicación disponibles y los recursos de conexión de la CPU. Las CPU de alto rendimiento como la CPU 410-5H admiten decenas de instancias de comunicación BSEND/BRCV simultáneas.

Referencias técnicas

  • Siemens Industry Online Support: Manual de software de sistema para funciones estándar y de sistema de S7-300/400 (SFB12/SFB13).
  • Siemens Industry Online Support: Manual de programación S7-SCL para S7-300/400.
  • Entrada SIOS 109742323: Compendio de PCS 7 Parte A - Directrices de comunicación industrial.
  • FAQ de soporte de Siemens: Estructura del puntero ANY en STEP 7.

Artículos relacionados

Etiquetas relacionadas

  • BRCV
  • BSEND
  • S7-SCL
  • Puntero ANY
  • SFB13
  • Comunicación S7
  • Automatización industrial
20 respuestas