Entiendo que tienes claro que debes aprender SCL TIA Portal.
En esta entrada, vamos a ver cómo usar PEEK y POKE como alternativa a los punteros en AWL que usamos en la entrada anterior para realizar el ejemplo de convertir la dirección de una serie de booleanas en un listado de direcciones.
Contenido
¿Y por qué vamos a realizar este ejemplo con PEEK y POKE?
Pues porque uno de los alumnos del curso de TIA Portal me escribió para decirme que como AWL no está disponible en la serie S7-1200, estaría bien realizar el mismo ejemplo, pero para un 1200 en TIA Portal.
Yo le propuse que lo intentara realizar él y lo compartiera, y Victor, se puso con ello.
Tras alguna corrección que otra para que funcionara bien, lo cierto es que el programa funciona perfectamente usando PEEK y POKE
PEEK Y POKE
Como hemos visto en el bloque de SCL, PEEK y POKE son unas herramientas muy potentes en SCL para la serie 1200 como alternativa a los punteros que se usan en AWL.
Sirven para leer (PEEK) o escribir (POKE) en diferentes zonas de memoria (marcas, DB, periferia…)
La idea es básica, indicas el tipo de área que quieres leer o escribir (marcas, DB, PEW…) y la dirección, y voilà.
En caso de querer leer un bit, o escribir un bit, lo harás con PEEK_BOOL o POKE_BOOL.
El código del ejemplo
A continuación, puedes ver el código del bloque creado en SCL:
//Reseteamos los errores #Error := 0; #Indice := 1; // Comprobamos que el número de bits sea inferior al número máximo // IF #NumeroBits>#NumeroMaximoBits THEN #Error := 1; RETURN; END_IF; //Rellenamos el DB con -1.0 para identificar las direcciones no válidas. Metemos un -1 en un DWORD //Usamos la instrucción POKE para guardar el valor (debemos usar tipo DWORD como valor). #Borrado := REAL_TO_DWORD(-1.0); FOR #Contador := 0 TO #NumeroMaximoBits - 1 DO POKE(area := 16#84, dbNumber := #DBReales, byteOffset := #Contador * 4, value := #Borrado); END_FOR; //Recorremos el DB de booleanas los #NumeroBits definidos como parametro de entrada FOR #Contador := 0 TO #NumeroBits-1 DO //Definimos la dirección el bit en función del contador #Direccion_Byte := #Contador / 8; // Byte #Direccion_Bit := #Contador MOD 8;//Bit //Obtenemos el estado del bit sabiendo el DB de booleanas y la dirección #ValorBit:= PEEK_BOOL(area:=16#84, dbNumber:=#DBBoleanas, byteOffset:=#Direccion_Byte,bitOffset:=#Direccion_Bit); // Si el valor está a 1, entonces guardamos el valor en el DB de reales IF #ValorBit THEN //Obtenemos la dirección con Direccion_Byte.#Direccion_Bit #ValorReal := INT_TO_REAL(#Direccion_Byte) + INT_TO_REAL(#Direccion_Bit) / 10.0; //Pasamos el valor real a DWORD para usar POKE #ValorDword := REAL_TO_DWORD(#ValorReal); //Obenemos la dirección donde guardar #Direccion := (#Indice - 1) * 4; POKE(area:=16#84, dbNumber:=#DBReales, byteOffset:=(#Indice-1)*4, value:=#ValorDword); //Sumamos una unidad para el siguiente registro #Indice := #Indice + 1; END_IF; END_FOR;
La explicación de PEEK y POKE
Como en multitud de ocasiones, te dejo con el vídeo ilustrativo que explica el código que tienes arriba.
¿Mola SCL eh?
Seguro que te gustaría controlar SCL y hacer cosas chulas.
Lo entiendo, la verdad es que es super potente y versátil.
Pues si lo que quieres es conocerlo bien, y hacer tus propios desarrollos, ya sabes que en curso de TIA Portal, el bloque 4 está dedicado exclusivamente a SCL.
Además, si lo deseas, puedes adquirirlo por separado del curso aquí.
Recuerda que puedes apuntarte en Guorker.com donde por una cuota mensual, tendrás tarifa plana en todos los cursos disponibles en la plataforma.
Enseño a programar PLC de Siemens a través de mis cursos.
Más información sobre mi aquí
Puedes seguirme en cualquiera de las siguientes redes sociales.
Deja un comentario