Las operaciones de saltos en Step 7 son parecidas conceptualmente a los que nos podemos encontrar en otros lenguajes: interrumpen la ejecución normal del programa (secuencial) y lo retoman en una etiqueta dada.
Los saltos tienen una serie de características y requisitos:
- Constan de una condición de salto y una dirección donde saltar (la etiqueta).
- La etiqueta puede tener como máximo 4 caracteres y el primer carácter no puede ser un número.
- Los saltos pueden ser incondicionales y condicionados.
- Se distinguen en los nombres de las etiquetas entre mayúsculas y minúsculas («aaa» no es la misma etiqueta que «AAA»)
En la entrada de hoy vamos a ver un salto incondicional (SPA) y dos condicionados (SPB y SPBN). Te mostraré en futuras entradas más saltos para poder hacer un CASE o un FOR-NEXT, pero de momento veremos estos que son los más simples y probablemente más habituales.[divider]
Contenido
Saltos en Step 7: SPA
La operación de salto SPA es un salto incondicional, es decir, se ejecuta siempre que se encuentre en el camino de la ejecución del programa y no depende del estado del RLO.
La sintáxis será de la siguiente forma:
….
SPA pepe
(código que no se ejecutará)
pepe: NOP 0
(Código que continuará ejecutándose)
…
Tras la etiqueta hay que escribir 2 puntos y obligatoriamente una instrucción.
La instrucción NOP 0 es una instrucción nula. No hace nada de nada. Ocupa 2 bytes en memoria y lleva un minúsculo tiempo de ejecución. Además sólo es programable en AWL.
A mi personalmente me gusta colocar el NOP 0 tras la etiqueta por varios motivos
- Porque cuando estás colocando las etiquetas SPA u otras me gusta colocar la etiqueta de salto inmediatamente después. Como no sé cómo va a seguir el programa, coloco la NOP 0.
- Si coloco una instrucción tras la etiqueta y mañana borro la primera instrucción tras el salto corro el peligro de no darme cuenta que además de la instrucción, he borrado también el salto.
- A mi juicio queda más limpio ya que todas las etiquetas siempre llevarán el mismo empiece y es más visible entre todo el código.
- Manías personales (la de más peso probablemente de todas)
La operación de salto SPA en general no irá sola ya que salvo en ocasiones que quieras evitar la ejecución de una parte del código porque estés depurando alguna parte, no tiene mucha utilidad en sí misma.
Normalmente va a ir acompañada de otras instrucciones de salto, complementando las acciones. En el vídeo de ejemplo podrás ver cómo se pueden combinar.[divider]
Saltos en Step 7: SPB y SPBN (If /Then)
Estas dos operaciones de salto son condicionadas, es decir, dependen del estado del RLO:
- SPB: Se ejecutará el salto cuando el resultado de la operación booleana sea true (RLO = 1)
- SPBN: Se ejecutará el salto cuando el resultado de la operación booleana sea FALSE (RLO = 0)
En definitiva es lo que podríamos llamar los IF- THEN de otros lenguajes de programación.
La sintáxis será de la siguiente forma:
….
Condición booleana
SPB pepe
(código que se ejecutará si RLO = 0 y no se ejecutará con RLO=1)
pepe: NOP 0
(Código que continuará ejecutándose con o sin salto)
…
Evidentemente con SPBN sería idéntico:
….
Condición booleana
SPBN pepe
(código que se ejecutará si RLO = 1 y no se ejecutará con RLO=0)
pepe: NOP 0
(Código que continuará ejecutándose con o sin salto)
…
Como bien indica la sintáxis el salto se produce si y sólo si se produce la condición de salto (RLO=0 ó 1 dependiendo de si elijes SPB o SPBN). Esto implica, y quiero dejarlo bien claro aunque sea una obviedad, que el código que está bajo la condición de salto y la etiqueta se ejecutará normalmente si la condición de salto no se satisface.
Para que tengas una idea de cómo hacer un IF-THEN-ELSE… la estructura sería del estilo
…
Condición IF
SPB Etiq1
(Codigo ELSE)
SPA Etiq2
Etiq1: NOP 0
(Codigo del IF)
Etiq2: NOP 0
…
Como puedes ver, hemos combinado el SPB con el SPA de forma que:
- Si la condición de salto se cumple, saltamos al Etiq1 y ejecutamos el código del IF y continuamos evitando el código del ELSE.
- Si la condición de salto NO se cumple, ejecutamos a continuación el código del ELSE y hacemos un salto incondicional (SPA) para evitar y no ejecutar el código del IF saltando al Etiq2.
Como veis estas instrucciones empiezan a ser interesantes ya que nos van a dar bastante juego a la hora de realizar nuestros programas.[divider]
¿Cuándo los voy a usar?
En general vas a usar estas instrucciones cuando el código a evitar o no no lleven aparejado un FC/FB ya que en otro caso, es más simple crear una booleana que te active la llamada a la funcion FB/FB que no andar con saltos.
Es decir, la usaré dentro de los FC/FB cuando el código a ejecutar o a esquivar sea pequeño y no merezca tener un FC/FB para ello ya que si el código va a ser muy largo, bajo mi punto de vista es mejor englobarlo en una función para un mejor seguimiento y depuración.[divider]
¿Existen más tipos de saltos en Step 7?
Efectivamente hay otros tipos de salto para realizar otro tipos de tareas como pueden ser los que se generan en otros lenguajes como son las sentencias SELECT-CASE o FOR-NEXT entre otros.
Estos tipos de saltos los veremos en posteriores entradas.
Para finalizar, os dejo un video con un ejemplo de saltos donde ver los conceptos vistos anteriormente.
https://youtube.com/watch?v=z611CvyJxvo%3Ffs%3D1
Referencias:
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.
13 Comentarios
La verdad es de mucha utilidada para mi ya que estoy practicando, solo y me estoy enterando de muchas cosas a travez de su informacion espero contar contigo para cualquier consulta desde ya gracias y saludos.
Hola Euclides,
Por su puesto que puedes preguntar lo que quieras y en lo que te pueda ayudar, así será.
¿Algún tema en concreto?
Por cierto, podéis contactar conmigo a través de twitter a través del usuario programacions7 o igutiez
Estimado inigo necesito saber si me puedes ayudar en lo siguiente:
Me estoy empezando a empapar en el tema de programacion y la duda es la siguiente: Me pidieron en mi trabajo dejar fuera de servicio una parte del programa de la maquina, que tiene originalmente la siguiente instruccion:
SEGMENTO 31
UN #step.bit_21
SPB M011
// Gate opening
S #Gate
U «DB_Machine setup».POS_0
U #Gate_low
U #Compactions_opened
R #step.bit_21
S #step.bit_22
M011: NOP 0
Yo necesitaria que no se cumplan las siguientes operaciones logicas:
(S #Gate) y (U #Gate_low)
Las demas operaciones se tendrian que continuar ejecutandose,…yo arme y modifique todo el segmento por este:
SEGMENTO 31
UN #step.bit_21
SPB M011
// Gate opening
SPA M100
S #Gate
M100: NOP 0
U «DB_Machine setup».POS_0
SPA M101
U #Gate_low
M101: NOP 0
U #Compactions_opened
R #step.bit_21
S #step.bit_22
M011: NOP 0
Me podrias decir si esta correcto lo que hice?
Saludos Y Muchas Gracias
Si. Esta bien. Pero te has complicado la vida un buen rato.
Si quieres anular eso sin borrarlo, simplemente los comentas poniendo // delante y ya esta.
No tiene mucho sentido hacer saltos para eso
Saludos
Estimado Inigo:
Te agradezco enormemente la respuesta, la verdad no se me habia ocurrido, al poner las // queda como una parte comentada del programa y eso no se ejecutaria no es cierto?
Cooorrecto!
Saludos!
Saludos inigo y nuevamente gracias, me gustaria tener otro medio de contacto, es posible? una direccion de mail?
En el apartado «acerca de» puedes encontrarlo.
En cualquier caso, aprovecho para comentar que las dudas que no hagan referencia a la entrada, por favor realizadlas en el foro.
Tampoco por correo voy a ayudar si puedo. Todo las dudas que pueda resolver, en el foro.
Saludos
Perfecto Iñigo, entiendo y acepto las politicas del blog, ya modifique el programa del plc en cuestion y quedo perfecto, fue enorme tu ayuda.
Saludos
Hola no puedo ver el video.
Corregido.
Buenas,tengo una pregunta. Cuando el programa de dentro del salto se ejecuta y llega al BEA, el programa vuelve a la primera linea,o vuelve a la linea en la que se llamó al salto? Gracias de antemano.
Ninguna de las dos.
Bea es finalizar la ejecución del bloque incondicional, y por tanto sale de este y continua en el bloque padre (desde donde se llamó)