La verdad es que no es normal el uso de strings en los PLC y se usen operaciones con strings en Step 7.
No es no se use en absoluto, pero no es su fuerte, por decirlo de alguna forma.
En general cuando programes no usarás muchas cadenas de caracteres más alla de arrastrar algo de información de modelo de la pieza que se está produciendo o cosas similares.
Ya sabemos que los autómatas de Siemens se lleva muy bien con las señales booleanas, pero de vez en cuando, hay que trabajar con las cadenas de caracteres aunque no sea tan habitual.
La cosa es que recientemente he tenido la necesidad de darle una pensada a un problema que me ha dado pie a esta entrada.
Contenido
El problema con operaciones con strings en Step 7
Tenemos un HMI bastante viejito que está conectado con un PLC de la serie 400.
Tenemos la necesidad de pasar la hora de un histórico al HMI, pero este, que no es de Siemens, no puede leer variables de tipo DTL y solo tenemos las típicas booleanas , byte, enteros, reales y strings.
Dándole un poco al rosco he pensado que podía crear un FB que cogiera el reloj del sistema y pasara la fecha y hora a una variable de tipo String.
Lamentablemente no existe tal cosa de forma directa en Step 7, por lo que te has de fabricar la función a medida.
Y es lo que he hecho.
¿Qué operaciones con strings en Step 7 voy a usar?
Básicamente voy a usar dos funciones con strings:
- Función FC16 I_STRING IEC
- Función FC2 CONCAT IEC
Ambas funciones las encontrarás en Standard Library/IEC Function Bloks
Lo que te propongo es lo siguiente:
Crear un FB en el cual descomponer la hora leída del PLC mediante el SFC1 «READ_CLK».
Esta hora, la descompondremos es variables de tipo INT para tener el año, mes, dia, hora, etc.
Posteriormente usaremos esa información para montar 3 cadenas de caracteres:
- Fecha
- Hora
- Fecha y hora
Así, tendremos las cadenas de caracteres que deseemos.
Durante todo el proceso nos apoyaremos en punteros de área.
Si no conoces bien el temario, puedo ayudarte mediante Cómo programar Step 7 y no morir en el intento donde tendrás ejemplos resueltos
¿Cómo usaremos las operaciones con strings en Step 7?
Una vez hayamos obtenido los valores del año, mes, etc, deberemos realizar alguna operación adicional.
Pasaremos la variable a un string usando la función FC16 I_STRING IEC.
Hay que tener en cuenta que el resultado en nuestro caso tendrá 2 o 3 caracteres. Esto es debido a que el primer caracter del string resultante es el signo del valor numérico.
Por tanto, si el año, el mes o el valor que sea, es inferior a 10, tendrá 2 caracteres. Si es de dos digitos, (año 18, por ejemplo) tendrá 3 caracteres.
Bien, en función del número de caracteres, pondremos un cero en caso de valores inferiores a 10, y tomaremos los valores tal cual, en caso de ser valores de dos dígitos.
Estos valores se irán insertando en posiciones fijas de las variables «Fecha» u «Hora» en función de la variable.
Además, añadiremos los separadores pertinentes. Usaremos «/» para separar en la fecha y el carácter «:» para la hora.
Para crear la variable «Fecha y hora» usaremos la función FC2 CONCAT IEC de tal forma que concatenemos la fecha y la hora, con un espacio en blanco en medio.
Un video explicativo de operaciones con strings en Step 7
Para ver esto mejor, he preparado un video como de costumbre en te lo explico un poco más en detalle.
¿Que te ha parecido?
Espero que te haya parecido interés.
Si necesitas algo similar, ya sabes que hay opciones como esta para jugar con las cadenas de caracteres.
¿Sueles usar operaciones con strings en Step 7?
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.
19 Comentarios
Muchas gracias Iñigo.
Para mi nivel, es una programación un tanto compleja, pero muy, muy, muy interesante
Saludos !!!
Poco a poco Pablo.
Todo es ponerse con los punteros.
Saludos.!
Hola Iñigo!
Gran ejercicio para conocer estas dos funciones de la librería y de paso recordar punteros y string pero una duda ¿ cuando cargas un 0 en la posición de string y lo hace con un w#16#30 por que no lo haces con un w#16#00?
Desearía sugerir si alguna vez se pudiera hacer una entrada al blog de como editar o estructurar un DB, con arrays, arrays de arrays , udt´s datos complejos que aparentemente es sencillo pero cuando queremos hacer estructuras un poco mas complejas y anidadas se empieza a complicar todo un poco.
Saludos!
Hola David.. lo de w16#30 y no cargarle un 0… ¡¡porque estás hablando de caracteres y código ASCII!! jeje.
El valor w16#30 en el código ASCII es el caracter «0» De ahí su valor.
En cuanto a lo de los UDT, no hay problema, pero ¿podrías proponer un ejemplo para resolver?
Saludos
OK no había caído en el detalle de que estábamos en ASCII y no en INT jeje, uno es duro de mollera.
En el curso de TIA Portal del 1200 es mucho mas fácil hacer estructuras mas o menos complejas de un DB´s o UDT´s pero en Step 7 al menos a mi se me hace cuesta arriba sobre todo a la hora de anidar. El ejemplo que tuve que lidiar fue el crear un DB para registrar 16 tipos de piezas y cada tipo de pieza debería tener 8 valores diferentes y tener un valor inicial que no sea 0 en caso de tener que recargar el DB con un arranque frio o algo así. Es una propuesta para cuando haya tiempo para si es de interés hacer referencia sobre ello. Un saludo Iñigo y te echamos un poco de menos!!!
David, no tiene mayor complicación crear un UDT anidado más allá de añadir una estructura.
Pero me lo apunto.
HOLA IÑIGO TENGO UN PROBLEMILLA TENGO UNA PREGUNTA AHORITA TENGO CADENA DE CARACTERES 8 EN NUMERACION Y ACTUALMENTE VA 1,2,3, MI CLIENTE QUIERE QUE APARESCA 000001,0000002, HAY ALGUNA MANERA DE HACERLO.
SALUDOS
Rellena los caracteres con el carácter 0, no con un cero, sino con el carácter 0 del código ascii.
hola iñigo necesito un poco de tu ayuda tengo un plc s7300 y en el cual necesito generar unos strings de unos numerous de parte, pero lo he intentado de algunas formas pero no he tenido exito, en el programa que tengo ya existen dos FC de los que mencionas en el video. FC2 CONCAT y FC16 I_STRING pero no me es possible accesar a ellos
Lo siento, pero no entiendo que quieres decir.
Hola Iñigo que gusto poder leer tus post, siempre se agradece que compartas tan buena información.
Tengo una pregunta… El ejercicio tal cual puedo hacerlo en TIA PORTA V14.
Cuando declaro
LAR1 P##Fecha_y_Hora
me marca error de syntaxis.
Tengo un IM151-8DP/PN y necesito sacar la fecha y hora; me di cuenta que no es tan facil y utilice el RD_SYS_T, descubri tambien como comentaste que no es tan sencillo pasarlas a string por el tipo de dato DL; pero al querer cambiar el tipo de dato apoyandome de tu ejemplo tengo error de sytaxix en el apuntador.
Ojala me haya explicado bien y puedas ayudarme.
Saludos cordiales!!!
Tiene pinta que lo que te pasa es que tienes la variable sin declarar en el interface.
Voy a checar nuevamente paso a paso como lo hiciste.
Eres muy amable, gracias por contestar!!!
B DIAS IÑIGO
Serias tan amable de explicar el mismo ejemplo pero de string a entero..
no con fecha pero si con un numero cualquiera
gracias
Revisa el programa, porque esa parte está hecha. La hora pasa de BCD a INT, y de INT a STR. Pues quédate solamente con la parte que quieres.
Buenas Iñigo, una pregunta, se puede leer la hora directamente de un S7-300 programado en Step7 con el WinCC 7.3 sin tener que pasarlo a caracteres??
Un saludo y gracias
No existe en WinCC DateAndTime así que hay que buscarse la vida un poco si lo quieres representar.
Hola Iñigo:
He empezado el curso TIA portal y lo encuentro muy difícil, en cambio el STEP 7 V5.x lo veo más comprensible para mi nivel que es 0, que te parece si realizo primero el STEP 7 y después el TIA PORTAL?
Saludos
Pues creo que es más fácil Tia portal por lo amigable que es respecto al tradicional.
Awl es más duro que scl por ejemplo.