• Saltar a la navegación principal
  • Saltar al contenido principal
  • Saltar al pie de página

Programación Siemens

Cursos online de TIA Portal y PLC Siemens.

  • Cursos
  • Blog
  • Mi cuenta
    • Mi cuenta
    • Foros
    • Curso HMI con Python y Qt-Designer
    • Curso de AWL
    • Curso de iniciación a la Industria 4.0
    • Curso Express de TIA Portal
    • Curso de WinCC Flexible 2008
    • Crear HMI con OPC y VB.NET
    • Crear HMI con Snap7 y VB.NET
    • Curso ViSnap7
    • Curso de TIA Portal para CPU 1200
    • Curso de Step 7 V5.x
    • Curso de comunicaciones IE y Profinet
  • Contacto & Faq
Home | ejemplos | Desplazamiento y giro de bits en Step7

Desplazamiento y giro de bits en Step7

por Iñigo Gútiez · 15 comentarios

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.[divider]

Contenido

  • 1 Vale. Hasta ahí lo entiendo, pero ¿qué diferencia hay desplazar entero o un word a la derecha?
    • 1.1 ¿Lo qué?
    • 1.2  En principio no hay diferencia ¿no?
    • 1.3  Y el giro de dobles palabras
  • 2 ¿Podrías poner un ejemplo real de desplazamiento y giro de bits en Step7?

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.

[divider]

¿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).[divider]

Referencias

  • Esquema de contactos KOP (capítulo 11)
Iñigo Gútiez
Iñigo Gútiez

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.

Publicado en: ejemplos, Teoría, Tutoriales, Videos Etiquetado como: awl, desplazamiento, ejemplos, instrucciones, proyecto, Tutoriales, videos, youtube

Interacciones con los lectores

    Deja un comentario Cancelar

    Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

    15 Comentarios

  1. marci dice

    27 marzo, 2013 a las 21:08

    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

    Responder
  2. Iñigo Gútiez dice

    28 marzo, 2013 a las 1:14

    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.

    Responder
    • marci dice

      28 marzo, 2013 a las 7:50

      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

      Responder
  3. igor dice

    8 noviembre, 2013 a las 22:16

    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.

    Responder
    • Iñigo Gútiez dice

      8 noviembre, 2013 a las 23:46

      Mírate esto: https://programacionsiemens.com/configuracion-basica-de-un-variador-micromaster-420/
      Pero por favor las cuestiones no relacionadas con el en el post concreto o en el foro.
      Gracias y un saludo

      Responder
  4. andres dice

    26 mayo, 2014 a las 11:45

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

    Responder
  5. Carla dice

    21 agosto, 2014 a las 23:09

    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.

    Responder
  6. juan antonio dice

    13 marzo, 2015 a las 11:02

    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

    Responder
  7. rogerio dice

    7 julio, 2019 a las 14:43

    Parabéns mestre ótimos conteúdos …

    Responder
  8. Alberto Llerenas dice

    3 noviembre, 2019 a las 6:39

    que tal ing. tendrá algún pdf o algún archivo para hacer paso a paso la función de desplazamiento y giro. Sin mas por el momento me despido y agradezco su atención

    Responder
    • Iñigo Gútiez dice

      3 noviembre, 2019 a las 11:41

      Hola Alberto. No no hay más de lo que se comenta en el vídeo, y tampoco creo que de para mucho más que lo expuesto. En el vídeo se describe el funcionamiento de ambas instrucciones, y es que no hay más.

      Responder
  9. Juan dice

    15 septiembre, 2021 a las 14:14

    Mi duda es. La función es para desplazar el bit, pero para ponerlo a 1 como lo haces?

    Responder
    • Iñigo Gútiez dice

      22 septiembre, 2021 a las 1:52

      Pues haces un set del bit que quieras, y ya está, ¿no?

      Responder
  10. Juan dice

    22 septiembre, 2021 a las 1:22

    Buenas noches, se puede hacer más de 32 bits de desplazamientos?

    Responder
    • Iñigo Gútiez dice

      22 septiembre, 2021 a las 1:53

      Con la instrucción no. Tendrías que programarlo.

      Responder

Footer

· Acerca de
· Misión, Visión y valores
· Aviso Legal y Política de Privacidad
· Condiciones de Venta
· Política de cookies
Utilizamos cookies propios y de terceros para mejorar nuestros servicios y tu experiencia de usuario. Si continuas navegando, consideramos que aceptas su uso. Aceptar Política de cookies
Política de Cookies

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
Siempre activado
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Non-necessary
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
GUARDAR Y ACEPTAR