Direccionamiento indirecto en Step 7 (I) – Memoria y punteros a área

Para empezar con el tema del direccionamiento indirecto, vamos a explicar una serie de conceptos básicos y luego nos pondremos con la formas más básicas de direccionamientos indirectos.

 Los tipos de direccionamientos son tres:

  • Direccionamiento Inmediato
  • Direccionamiento Directo
  • Direccionamiento Indirecto

Los dos primeros, son los que conocemos muy bien:

Direccionamiento indirecto

  • El direccionamiento inmediato es cargar directamente el valor del operando (de cualquier tipo), por ejemplo L 32.
  • El direccionamiento directo será del tipo L MW10 (donde el valor de MW10 sea el 32 anterior) es decir, en la carga se apunta directamente al sitio de la memoria donde reside el valor que queremos cargar.

Nada nuevo bajo el sol.
Ahora bien, ¿qué pasa cuando queremos recorrer áreas de memoria de forma recursiva o leer un área dinámicamente?

Direccionamiento indirecto

Como decimos, podemos acceder a los valores de la memoria de una forma indirecta.. vamos a querer saber el contenido de una variable (o área de memoria) usando otra variable que se referirá a está área de la que queremos saber su valor.

Parece un poco enrevesado pero es bastante fácil de entender mediante un ejemplo: podemos abrir el DB10 con AUF de dos formas:

AUF DB10

o bien:

AUF DB[MW20], teniendo la marca MW20 el valor 10.

Esta última forma de cargar el valor de la marca MW10 es uno de los tipos de direccionamiento indirecto, pero hay varios:

  • Direccionamiento Indirecto por Memoria con Número
  • Direccionamiento Indirecto por Memoria con Puntero de Área
  • Direccionamiento Indirecto por Registro e Intraárea (área interna)
  • Direccionamiento Indirecto por Registro e Interárea (área cruzada)

El caso anterior, el usado es el primero, mediante número.  

Direccionamiento Indirecto por Memoria

Dentro de los direccionamientos indirectos por memoria con número a su vez, podemos usar MW (o DW de un DB) o MD (o DD de un DB) para acceder:

  • Usando formato palabra: accederemos a temporizadores, contadores , abriremos DB y accederemos a FB y FC.
  • Usando formato doble palabra: accederemos a datos de tipo bit, byte, palabra y doble palabra.

Formato palabra – número (indexados)

Es el más fácil de entender: en un número entero (palabra) introducimos el valor de DB, FB , temporizador etc que queramos leer.

Así podemos hacer un

L 10

T MW 10

U T[MW10]

con lo que estaremos leyendo el estado del temporizador T10.

Digamos que nos sirve para valores operandos que están indexados mediante un número como son los DB , los contadores etc. Para hacer referencia a ellos, nos servimos de un número ya que existe una lista de estos elementos.

Direccionamiento Indirecto con formato doble palabra – Punteros a área

Aquí ya se introduce el concepto estrella del direccionamiento indirecto… el puntero.

Hagamos un pequeño paréntesis para ver este concepto.

Un puntero no es más que una dirección. Nada más. No tiene un valor, sólo apunta con el dedo como un niño pequeño dónde mirar, pero no dice qué está viendo.

Los punteros pueden ser:

  • Interárea (Área cruzada) : Por ejemplo P#M10.0, o P#E10.0 o P#DBX10.0
  • Intraárea (Área interna): Por ejempo P#10.0

Como ves hay una gran diferencia. Los que tienen área de memoria se posicionan, dentro de todas las áreas la memoria en una en concreta, y de esa, en una posición definida (siguen sin decir lo que vale, pero la dirección es completa).

En cambio, los que no llevan área de memoria, simplemente es una dirección. ¡pero no sabemos de qué área de memoria!

En nuestro caso, y siguiendo con los direccionamientos indirectos, vamos a usar los punteros SIN área de memoria.

Así podremos hacer esto:

L P#10.0

T MD10

U E[MD10]

= A [MD10]

En este ejemplo de una imaginación sin parangón, lo que hemos hecho es cargar un puntero (en el área de direcciones de la que ya hablaremos AR1) y se lo hemos transferido a la marca MD10. Por tanto, el código de arriba sería lo mismo que escribir:

U E10.0

= A10.0

¿Ves a dónde te puede llevar esto y las posibilidades que ofrece? ¿También se te ha erizado el bello?.

Sigamos…

¿Se puede cargar los punteros de otra forma?

Pues sí.

Resumiendo diremos que le damos la dirección bien mediante el puntero (P#10.0) o contando con los dedos cuántos bits tiene la dirección. Es decir:

Podemos hacer, al igual que en el caso de arriba:

L 80 (porque la dirección 10.0 son 80 bits)

T MD10

U E[MD10]

= A [MD10]

 ¿Es lo mismo? Extrictamente lo mismo. Hemos creado el puntero de la misma forma. Por tanto, de forma numérica, un puntero se verá como el número de bits de ese puntero.

Para terminar, y como siempre, os dejo un pequeño video en el cual se explica todo lo anterior. Espero que os sea de utilidad.

 

Como siempre recomendaros que os paséis por www.masvoltaje.com si tenéis intención de comprar material eléctrico y si entráis desde este blog, ayudáis a mantenerlo.

 

Referencias:

16 Comentarios

  1. Hola Íñigo, muy bien explicado, lo había leído por ahí en alguna literatura de la que dispongo, pero tenía pendiente el intentar asimilarlo un poco más, pero tal y como lo has explicado, es muy entendible. Un saludo.

  2. Muchas gracias. Intento explicarlo lo más sencillo posible. Seguramente muchas veces lo haré con inexactitudes, pero lo importante es transmitir el concepto. Luego el que quiera indagar en mayor profundidad, le será más fácil. Que ojo, con el tema del blog me está viniendo bien para repasar algún concepto olvidado.

    La semana que viene otra entrega.

    Espero que una entrega semanal lo consideréis una frecuencia adecuada. Si puedo en algún momento hacer dos entradas la misma semana lo haré, pero realmente es complicado con el tiempo disponible.

    ¿Que añadirías al blog?

    Un saludo,

    • Claro que si Íñigo, una publicación semanal está muy bien, sobre todo si es gratis… Bueno, bromas aparte, poco hay que pedir, porque supongo que la aplicación de estas “partes” de la programación en ejemplos reales va a ser una simpleza, si es que se puede hacer, ya que los ejemplos reales siempre van a ser una combinación de todo lo que nos estás contando, también he visto que has completado la literatura del Blog con vídeos que al fin y al cabo sirven para ver realmente lo que se explica. En todo caso, y no sé si será posible, ya que una cosa es programar y otra cablear, no sé si le puedes dedicar alguna entrada a la parte de hardware, por que unas CPU´s u otras, por que unos módulos u otros, precauciones, cálculos de alimentación, accesorios físicos, descentralización y demás ¿qué te parece la idea?.

      • ¿Me lees el pensamiento? jeje. Por supuesto que con el tiempo hablaremos del tema más físico. Diferencias entre unas CPU y otras, remotas, uso del Profibus, MPI, Profinet… O cómo leer un encóder o comunicarte con un variador Micromaster, por poner algún ejemplo.

        También tengo en la cabeza meter cosas como el WinCC, el viejito Protool o cómo conectar y hacer tu propio Scada con el OPC-Server de Siemens con VB.Net que es una combinación muy buena.

        Y lo más importante, quería hacer unas pocas entradas, tampoco muchas de cómo estructurar un programa. Buenas prácticas por así decirlo. Claro que luego alguno dirá que no son tan buenas o mejorables, pero eso ya es otro cantar..

        Pero bueno, de momento centrarme en la parte del soft, que es con la que todos empezamos a trastear, pero lógicamente no sólo de 0 y 1 vive el hombre… No me parece mal introducir alguna entrada de hardware en breve… ¿algo en especial? Porque me interesa mucho vuestra opinión e inquietudes.

  3. Buenos dias, soy un tecnico principiante en la programcion del Tia portal v11, y necesito visualizar el giro d eun encoder programdo enun plc s7-1200, es decir necesito ver en uan pantalla kp600 color PN, un circulo donde se vea una linea ke recorre toda la circunfernecia segun la posicion del encoder. En ekl software solo encontre esto pero en forma de una barra vertical, es decir necesito hacer casi lo mismo pero en forma circular.

    gracia spro tu ayuda
    saludos
    oswaldo

  4. Hola Oswaldo,

    Si no está el objeto que necesitas, tendrás que fabricarlo de alguna forma, mediante quesitos por ejemplo, dando a cada quesito que en función de un valor cambie de color. No sé que precisión necesitarías. Si es mucha lógicamente lo de los quesitos no es plan.

    Un saludo

    • Muchas gracias por tu ayuda, intentare hacerlo segun tu sugerencia, si no hay otra mas efectiva, por otro lado, es normal que en mi software de Tia portal V11 y el wincc v11 sp2, solo haya de tres a cuatro obejtos para insertar y trabajar o existe la posibilidad de descargar mas objetos o elmentos ( barras, circulo, flecha, cuadrado, boton, numeros y letras) que se puedan utilizar en una programcion …. Entiendo que s epueden importar graficos u figuras pero lo que necesito son elmentos como la barra por ejemplo .

      gracias
      saludos
      oswaldo

  5. Hola,

    Tienes los objetos básicos y los ampliados.

    A patir de ahí te tendrás que crear tus propios bloques de imágenes (pestaña módulos, y una vez creados desde librería) si lo que quieres es reutilizar los bloques.

    En cuanto objetos ya creados no sé si existiran de forma comercial o se pueden añadir nuevos.

    Tendrás que googlear a ver si encuentras algo.

  6. saludos
    exelente la exsplicacion fue de mucha ayuda

    pregunat

    como puedo graficar los datos acumulados en un db ?

  7. Hola. No puedes hacer algun ejemplo con punteros en Step7? La verdad es que estoy muy interesado en el tema pero no entiendo la informacion que encuentro.

    • Hola Adrián.

      Con el nuevo año seguiremos con la segunda parte del curso donde efectivamente veremos punteros.

      Hasta entonces, tendrás que esperar o servirte de la información que puedes encontrar en la sección Teoría.

      Saludos

  8. Hola Iñigo, ya se que el hilo es un poco antigüo, pero la verdad es que me estoy volviendo loco para intentar sacar los punteros para adelante.

    En Omron usando el CX-Programmer se pueden utilizar punteros en KOP, pero no sé si es posible hacerlo para un S7-1200 con el Step7 en TIA Portal V12. ¿Sería esto posible o sólo me queda la opción de script?

    En caso afirmativo, intento almacenar una serie de datos que introduzco mediante un campo de E/S en la Pantalla Programable y que estos se vayan almacenando en diferentes DB según la receta que tenga seleccionada.

    Por ejemplo:

    Tengo seleccionada la receta 23, e introduzco el número en el campo E/S 750. Esta debería almacenarse en la DB23.ValorE/S. (donde valor E/S es una variable dentro de la DB).

    No intento que me lo hagas ni nada por el estilo, tan sólo busco saber si es posible realizar todo esto en KOP.

    Un saludo y gracias de antemano.

    • Hola Jose,

      Lamentablemente en TIA portal no tengo experiencia aún como para poder ayudarte. Tengo en mente ponerme con ello, pero no tengo excesivo tiempo actualmente. A ver si alguien te puede echar una mano. Solicita ayuda en el foro.

      Un saludo

Deja un Comentario

Tu dirección de email no será publicada. Required fields are marked *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>