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:
- 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?
Contenido
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.
Recordarte finalmente que si estás interesado en formarte en Step 7, puede que te interese adquirir el libro «Cómo programar en Step 7 y no morir en el intento» donde puedes encontrar no sólamente el curso completo gratuito, sino muchas más entradas del blog que como sabes se irán actualizando para los que lo adquieran de forma gratuita. Si estás interesado, puedes echarle un vistazo a este enlace donde se explica qué es lo que contiene el libro, el precio y los métodos de pago.
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.
22 Comentarios
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.
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.
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
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
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.
saludos
exelente la exsplicacion fue de mucha ayuda
pregunat
como puedo graficar los datos acumulados en un db ?
Graficar datos de un DB ¿dónde?
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
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
Hola Iñigo.
Una duda, quizás muy tonta, la dirección 10.0 no son 88 bits.
saludos.
excelente las explicaciones
Hola. No, 10.0 son 80 bits y 81 direcciones ya que comienzas por decirlo así en el bit 0 (para la dirección 0.0)
Digamos que tienes que multiplicar el número de bytes por 8 y sumarle la dirección del bit
Por tanto es 8×10 +0 = 80 aunque como digo es la dirección 81 ya que la 0.0 también existe.
Hola, si no me equivoco, el formato del puntero es:
El bit 0,1y2 son los bits del puntero, los siguientes 16 bits son el byte del puntero y los demas no importa ahora.
80 en binario es 1010000, le sacas los 3 primeros bits te queda 1010 bin =10 dec. 000 bin= 0 dec.
quedo 10.0
Si, aunque yo prefiero simplemente contar bits y listo. También para construir el puntero puedes mover a la izquierda 3 posiciones el número de bytes (que viene siendo multiplicar por 8) y luego sumarle los bits.
Hola Iñigo, te hago una consulta ojala puedas responderme, ¿cómo se busca dentro del programa una salida digital de periferia, sin saber por los comentarios del programa, donde esta el segmento de ejecución, si esta programada con puntero? En el plano de ocupación no aparece y buscar con «ir a punto de aplicación» es inútil.
Ejemplo:
L P#13.2
L AR1
U E[AR1,P#0.0] //Si esta la entrada E13.2
= A[AR1,P#0.3] //Se ejecuta la salida A13.5
Esta salida no aparece en referencias cruzadas, como se busca?
Gracias!!
En direccionamiento indirecto, no se puede, lo cual tiene «lógica» por otra parte. Hasta que el programa no se ejecuta el U E[AR1.P#0.0] no tiene valor alguno, por lo que no te puede dar una referencia cruzada de algo que desconoce. En este caso, es fijo, porque le cargas previamente P#13.2, pero podría ser aún más dinámico cargándole la MD100, por decir algo.
Así pues, con direccionamiento indirecto, no se puede hacer referencias cruzadas.
Maestro en el libro «Cómo programar en Step 7 y no morir en el intento» explica mas a fondo el direccionamiento indirecto , y ademas explicas mas a fondo programar en lenguaje AWL ???
Sí, se explican todas esas materias. Echa un vistazo al curso, en la ficha del curso, al final hay un descargable con una demo del curso y todo el indice del curso.
Saludos!