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
- Anatomía de la estructura de puntero S7 ANY de 10 bytes
- Construcción de punteros ANY dinámicos en S7-SCL
- Método: Implementación paso a paso del bloque wrapper SCL
- Verificación
- Limitaciones y precauciones operativas
- Preguntas frecuentes de ingeniería
- Referencias técnicas
- Artículos relacionados
- Etiquetas relacionadas
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:
Syntax_IDBYTE16#10 para punteros SIMATIC S7 estándar.Data_TypeBYTE16#02 = BYTE, 16#04 = WORD, 16#06 = DWORD.Repetition_FactorWORDDB_NumberWORD16#0032); 0 para memoria que no sea DB.Memory_AreaBYTE16#84 para Data Blocks (DB), 16#83 para marcas de memoria (M).Byte_Bit_Pointer3 BytesConstrucció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. SiBRCVintenta 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:
BRCVno se ejecuta en tiempo cero. El protocolo de enlace es multicíclico. No lea ni procese los datos del DB de destino hasta queNDRse active aTRUE. - Unicidad de R_ID: Cada par
BSEND/BRCVen la misma conexión S7 debe usar unR_IDglobalmente único. Los valores deR_IDen 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
- How to Configure and Simulate AS-to-AS Communication in S7-PLCSIM
- How to Pack and Unpack Double Words (DWORD) in SIMATIC PCS 7 CFC
- How to Resolve SCL Syntax Errors When Compiling CFC Charts as Block Types in PCS 7
Etiquetas relacionadas
- BRCV
- BSEND
- S7-SCL
- Puntero ANY
- SFB13
- Comunicación S7
- Automatización industrial