Desplazamiento y giro de bits en Step7

Aunque ya vimos algo sobre el desplazamiento de bits cuando jugamos con el display de 7 segmentos, en la entrada de esta semana vamos a ver todas las operaciones disponibles de desplazamiento y giro de bits en Step7 además de un par de vídeos para ilustrar lo expuesto.

Desplazamiento y giro de bits en Step7

  • SHR_I    Desplazar entero a la derecha
  • SHR_DI    Desplazar entero doble a la derecha
  • SHL_W    Desplazar 16 bits a la izquierda
  • SHR_W    Desplazar 16 bits a la derecha
  • SHL_DW    Desplazar 32 bits a la izquierda
  • SHR_DW    Desplazar 32 bits a la derecha

Además, hay operaciones de rotación:

  • ROL_DW    Rotar 32 bits a la izquierda
  • ROR_DW    Rotar 32 bits a la derecha

Desplazan el contenido de ACU1 bit a bit. Son incondicionales, no dependen del RLO.  Podemos desplazar, tanto a la derecha como a la izquierda, palabras, doble palabras, enteros y dobles enteros.

En general, lo que se harán en todas las instrucciones es dar la palabra o doble palabra a desplazar y un número de bits a ser desplazado.

Vale. Hasta ahí lo entiendo, pero ¿qué diferencia hay desplazar entero o un word a la derecha?

Básicamente funcionan igual. La diferencia fundamental es que al desplazar los enteros, arrastramos también el signo.

¿Lo qué?

Bien. Además de simplemente arrastrar bits de izquierda a derecha o de derecha a izquierda, esto implicitamente lleva consigo operaciones de multiplicación y división en base 2. Es decir, desplazar a la derecha 1 bit significa dividir entre dos el número que tengamos. La diferencia entre hacerlo con enteros o con words, es que en enteros (SHR_I ) podemos hacer divisiones con signo.

Así si tenemos:

Valor a dividir: MW 102 = 1000 (tanto en entero o decimal)

Desplazar a derecha: MW200 = 1

Si hacemos SHR_I: MW104 = 500 (en entero o en decimal)

Si hacemos SHR_W: MW106 = 500 (en entero o en decimal)

 En principio no hay diferencia ¿no?

La cosa es que si ahora hacemos

Valor a dividir: MW 102 = (-1000) ó 64536 en decimal

Desplazar a derecha: MW200 = 1

Si hacemos SHR_I: MW104 = -500 en entero o en 65036  visto en decimal

Si hacemos SHR_W: MW106 = 32268 en entero o 32268 visto en decimal)

Como puedes observar, la diferencia es notable dependiendo de si tenemos un valor entero positivo o no. Análogamente si desplazamos a la izquierda en vez de a la derecha sucederá lo mismo, pero multiplicando en vez de dividiendo… salvo por un pequeño detalle, que sólo existe el SHL_W. 

Entiendo que la razón por la que no existe desplazamiento a la izquierda de enteros es porque no tiene sentido ya que no se va a guardar el signo, por lo que no existe tal cosa. Si tuvieramos el último bit con signo menos, lo perderíamos, por lo que de ahí entiendo la inexistencia de dicha operación.

En cualquier caso, la forma de hacerlo en AWL será de la siguiente forma:

L MW 200 -> Cargamos el número de bits a desplazar
L MW 102 -> Cargamos la palabra a desplazar
SLW  –> Operación de desplazamiento (en este caso word a la izquierda)
T MW 104 -> Transferimos el resultado a cualquier otra palabra

Análogamente sería con las dobles palabras(SHR_DI, SHL_DW, SHL_DW ). Pero ojo, cuando tenemos los bits bien estirados uno detrás de otro, recordad que en una doble palabra, el bit más a la derecha es el bit .0 del byte bajo de la palabra baja. Es decir, del MD0, el bit más a la derecha será el M3.0, y el más a la izquierda, el bit .7 del byte alto de la palabra alta … el M0.7.

 Y el giro de dobles palabras

El caso de giro de las dobles palabras es más sencillo aún de entender: daremos el número de bits a girar y desplazaremos los bits a la izquierda (por ejemplo). Los bits que quedan fuera por la izquierda, son reintroducidos por la derecha. Si se gira al revés, pues funciona al revés.

 Y como es más fácil de entender viéndolo, pues qué mejor que un video que lo muestre.

¿Podrías poner un ejemplo real de desplazamiento y giro de bits en Step7?

Pues sí. De hecho esta entrada es debida a una petición de ayuda. Se trata de un ejemplo de embotelladora. La cosa es arrastrar una señal a lo largo de un camino paso a paso, a modo de tracking.

El problema es el siguiente: detectamos a lo largo de una cinta la presencia o no de las botellas, pero el embotellado no es in situ, sino que se produce como 10 posiciones más adelante. Se trata de arrastrar la información de la fotocélula hasta la posición donde debe ser rellenada la botella.

Pero como siempre, es más fácil de entender viendo el vídeo que con palabras. Así que te dejo con el segundo video de esta semana (hoy ración doble).

Referencias

Acerca de Iñigo Gútiez

Ingeniero industrial por la Escuela de Ingenieros Superiores de Bilbao. Trabajo como ingeniero de proyectos y automatización en Guardian Industries

Te puede interesar

Idea_Proyecto

Buenas prácticas de programación en S7

Siempre que comenzamos a programar, tenemos la incertidumbre de si la forma en la que …

10 Comentarios

  1. Hola Iñigo,
    te felicito por blog y te doy las gracias por los conocimientos que nos transmites.
    Te comento una duda: se pueden encadenar dos desplazamientos de dobles palabras (ej. SHR_DW) para tener un registro de 64 bits. En caso afirmativo, como sería?
    Gracias por todo y saludos cordiales

  2. Hola Marci,

    En primer lugar, muchas gracias por comentar.

    En cuanto a tu pregunta, me pillas en fuera de juego, pero entiendo que no se puede hacer un desplazamiento como comentas ya que al hacer cualquier tipo de desplazamiento, los bits salientes, se pierden y por tanto directamente no se podría hacer.

    Ahora bien, digo directamente. Podrías fabricarte tu propio desplazador.
    Así, para 64 bits, tendrías dos MD. Imaginemos que el MD0 y el MD4.
    Imaginemos que quieres desplazar hacia la izquierda (de MD0 a MD4).
    Imaginemos también, que queremos desplazar por ejemplo 3 bits.

    Entoces, puedes hacer lo siguiente:

    Haces una copia del MD0 en MD10 por ejemplo

    Desplazas tanto MD0 como MD4 hacia la izquierda. Por tanto, pierdes los 3 bits de la derecha del MD0 y del MD4. Los del MD4 nos da igual, pero los del MD0 no. Pero sabemos que bits son los perdidos ya que tenemos una copia del original.

    Copias los 3 bits de la izquierda (M0.5 – M0.7) a los primeros bits de la derecha del MD4 (bits M7.0 a M7.2):
    M0.5 -> M7.0
    M0.6 -> M7.1
    M0.7 -> M7.2

    Creo que con eso sería todo. Espero que me haya explicado.

    Un saludo.

    • Gracias Iñigo por tu contestación, probaré lo que me dices.
      Mi pregunta viene de lo siguiente. Tengo una emblistadora de comprimidos donde, mediante visión artificial, se comprueba que el blister es correcto. En caso de blister malo, el rechazo se efectúa a distancia de mas de 32 ciclos/máquina y además es variable dependiendo del tamaño del blister. Por eso necesito un desplazamiento de más de 32 bits
      Ahora, mediante un contador externo (el de los dígitos con ruedecitas) se indica el numero de ciclos para que el blister malo coincida con la señal de expulsión. Este contador es de dos dígitos, rango máximo 99.
      La máquina es antigua y no tiene PLC (tiene control propietario), y esta parte no funciona. Además esta el tema que mediante el contador tengo que indicar que bit es el que voy a utilizar en cada caso para la expulsión y esto tampoco tengo claro como hacerlo por programa.
      A lo mejor me estoy liando y se puede hacer de otra manera mas sencilla.
      No sé si me puedes realizar algún comentario al respecto. En cualquier caso, gracias por todo y te animo a que sigas con tus artículos.
      Saludos

  3. Tengo un Variador Siemen Micromaster 420 que necesito poner en lugar de un variador Eurotherm Drive con Profibus en una maquina que tiene un PLC siemen S7 400 por donde empiezo.
    Saludos.

  4. gracias iñigo por todo este tiempo y trabajo….animo para que continues!

  5. hola buenas tardes, tengo una duda en la configuración del micromaster 420, ya que necesito configurar el micromaster para cuando ocurra una falla el rele cierre cuando esto ocurra, ese parámetro ya lo encontre es el P0748, pero necesito tambien deshabilitar la funciion que tiene de rearranque al vuelo, porq me ocasiona problema de remanencia, el objetivo es lograr que se detenga cunado ocurra una falla, al mismo tiempo que el rele haga su función, no se si me puedas decir con que parametro configuro el drive para que haga eso.
    Muchas gracias.

  6. Hola Iñigo !!

    Está muy bien el ejemplo de la embotelladora. Estoy pensando en otro ejemplo que a lo mejor se pudiera realizar con un desplazador; sería para realizar un secuenciador mediante un pulsador. Sería posible, me encantaría que lo incluyeras como ejemplo y el código para poderlo bajar.

    Gracias, maestro. Un saludo.

    juan antonio