PDA

Ver la versión completa : Hacer bucles con S7-200



pegaso
07/06/2010, 20:04
Hola compañeros,
Estoy realizando un proyecto con Microwin y me veo en la necesidad de repetir un trozo de programa un número de veces determinado, es decir, realizar un bucle.Pues bien, hago uso de la instrucción For que está dentro de Operaciones->control de programa. pongo todas las condiciones e introduzco los segmentos que quiero que se repitan, poniendo al final un segmento con la operación Next.
Lo compilo, lo transfiero y todo correcto el problema es que en la ejecución del programa no se repite las veces que yo quiero sino que está continuamente realizando el bucle, la orden For tiene una palabra MW0 para el indice, el valor 1 para el init y el 5 para el final, porque quiero que se repita 5 veces, pero no me lo hace, se queda indefinidamente sumando.
Si hay alguien interesado en el tema y sepa la solución le agradeceria mucho la ayuda.
Os adjunto el programilla en un adjunto para ser mas explicito.
Muchas gracias

Redilt
08/06/2010, 11:53
¿y poque no usas un contador con una entrada de veces que quieres hacer el ciclo en una variable y al final del cico poner un pulso que sume mas uno al contador (con un flanco ascendente)?

nose si funcionaria como quieres, pero yo lo veo asi mas simple:)

un saludo

pegaso
08/06/2010, 12:06
No me gustaria hacerlo así porque tendria que utilizar saltos de programa y se me complicaria el asunto, la idea es que una parte del programa se repita un número de veces. Se supone que con la función For deberia de ir bien, pero no sé qué he hecho mal para que no lo haga.
He adjuntado el programa para que se entienda mejor, si te das cuenta he utilizado un direccionamiento indirecto para desde el acumulador ir metiendo distintos tiempos en un temporizador.
¿A ti te funciona la orden For?
Gracias por tu atención.

lluisot
08/06/2010, 13:36
Yo nunca he usado la instruccion For , pero si sólo queres repetir solo esa parte del programa , tambien podrias ponerla en una SBR especifica y llamarla solo las veces que quieras no ?

Por lo del programa que has puesto , veo que en el primer ciclo cargas *AC1 en AC0 mientras que en Net6 incrementas en 2 AC1 y no *AC1 , no se si puede ser eso ,he trabajado muy poco con punteros y tendria que probarlo .

pegaso
08/06/2010, 13:46
Lluisot veo que has visto el programa.
El programa funciona bien, el hecho de utilizar * es para cargar el contenido del AC1 en AC0, si no lo pones lo trata como una dirección de puntero, de hecho al sumarle 2 lo que hacemos es irnos dos direcciones mas allá de la que apunta el puntero, es decir, como ves el puntero apunta a VB10 y cuando le sumo 2 apunta a VB12, al poner el artedisco ya no le indico direcciones sino el valor de la dirección.
En cuanto a utilizar subrutinas, imagino que si es una solución pero no lo veo claro, además mi empeño es hacer funcionar la orden FOR, aunque solo sea por cabezoneria.
Muchas gracias Lluisot

lluisot
08/06/2010, 14:05
Bueno , probare el programa por curiosidad. Asi vere como funciona el For pues nunca lo he usado y nunca se sabe .Por otra parte , el indice te va aumentando ?Que es lo que te esta sumando constantemente ?
Por cierto , en el programa en final tienes 2 y no 5 .

pegaso
08/06/2010, 14:41
El indice es solo para visualizar el contaje, pero en realidad lo que hace es ir contando desde el valor inicial hasta el final una unidad.
Cuando decia que el programa funcionaba me referia al tema de acumuladores, y el direccionamiento indirecto pero el bucle no me lo hace por eso insisto tanto en la orden For.
Si consigues hacer que funcione te agradeceria que me lo dijeses.Es cierto que al final puse 2 despues de tantas pruebas, pero para el caso es lo mismo debiera de cargar solo dos tiempos no todos los que hay en el bloque de datos.
Un saludo

Grimpow
08/06/2010, 23:30
Hola pegaso,

No entiendo muy bien lo que pretendes conseguir con el código que tienes dentro del bucle, pero es lo de menos.

Para asegurarte de que no estas provocando algún conflicto con el código, prueba a eliminar todas las instrucciones e ir añadiendo segmente a segmento dentro del bucle para comprobar si el problema esta en el código.

En principio se usa For - Next correctamente, asi que si lo usas sin contenido, debería funcionar bien.

Pruebalo y ya me diras,

Saludos,

pegaso
09/06/2010, 03:20
Hola Grimpow,
Lo que me dices ya lo he probado y la verdad, de haber algun conflicto con el codigo ni me lo compilaria ni me lo dejaria descargar en la CPU.
De hecho adjunto un ejemplo muy sencillito en el que mediante un bucle utilizando la instrucción For me deberia de sumar 1 cinco veces con lo cual al final VW10 debiera de valer 6 pero como el bucle no termina no para de sumar e incluso da valores negativos, me tiene cada vez mas confundido.
Si te pasa lo mismo dimelo, por favor.
Gracias

lluisot
09/06/2010, 15:18
Hola , he estado probando esto y la instruccion Next sólo se ejecuta 5 veces .Lo que no se es porque sigue incrementando la vw10 .Lo he probado con un flanco y solo se ejecuta una vez .

Te he puesto un ejemplo donde guardo el valor de vw0 (indice ) en otra variable .

Si lo pruebas sin flanco veras que el indice no sigue aumentando aunque si lo hace la variable de suma .

Claro que todo es muy rapido ,no se si servira para lo que quieres hacer .

Quizas alguien nos pueda decir para que usa esta instruccion :confused:

David
09/06/2010, 16:46
No puedo ver el prog y no tengo ni pun de siemens pero por si os vale de algo:

Yo utilizo la instrucción For Next en beckhoff y sin problemas, se que con siemens se puede hacer, incluso tiene una utilidad para comprobar si se quedo en un bucle.

De todas formas, digo yo: No puede pasar que este haciendo el bucle correctamente pero el problema este en que lo hace a cada ciclo de scan?. Hay una condición con flanco para entrar en el bucle?

lluisot
09/06/2010, 19:47
Bueno , pero para que usais el For-Next ?

pegaso
09/06/2010, 19:52
Lluisot la utilizamos para hacer un bucle dentro del programa ciclico principal, y que se repita una parte del código un número determinado de veces.

David
09/06/2010, 20:11
Por ejemplo:

Recorrer un array (vector) para hacer una comprobación.

Sumar una cantidad a varios Registros.

Llenar una matriz con un valor inicial.

etc.

En prog informática se usa bastante y principalmente se trata de ahorrar código.

lluisot
09/06/2010, 20:50
entonces , puede ser interesante para temas de valores de variables y demas , pero no para salidas digitales porque veo que el for-next se ejecuta muy rapidamente y ademas , cuando acaba de ejecutarse siguen las salidas activadas .

Es curioso , las salidas, marcas siguen activas y los timers siguen contando , en cambio las memorias de variables V no .

pegaso
09/06/2010, 20:59
Creo haber hallado la solución, he tenido que recurrir a una marca para que cuando el contador del bucle "index" llegue al valor que quiero me pare dicho bucle, es decir, he hecho la cuenta de la vieja pero ahí queda y por lo que veo funciona.
Voy a probarlo con los direccionamientos indirectos y los temporizadores, cuando lo haya probado os lo cuento.
Sigue mosqueandome el comportamiento de la orden For que no es correcto, por cierto David tu explicación ha sido de libro, sabes como importar un fichero de datos y cargarlo en un bloque de datos en S7-200.
Os adjunto el ejemplo que he llegado hacer funcionar, por favor pruebenlo y si le veis un fallo decidmelo.
Gracias a todos por vuestra atención, seguimos en contacto.

David
09/06/2010, 21:00
Un ejemplo de For Next:
http://www.infoplc.net/blog2/2010/01/23/user-function-block/

Es en ST.

pegaso
09/06/2010, 21:02
Creo haber hallado la solución, he tenido que recurrir a una marca para que cuando el contador del bucle "index" llegue al valor que quiero me pare dicho bucle, es decir, he hecho la cuenta de la vieja pero ahí queda y por lo que veo funciona.
Voy a probarlo con los direccionamientos indirectos y los temporizadores, cuando lo haya probado os lo cuento.
Sigue mosqueandome el comportamiento de la orden For que no es correcto, por cierto David tu explicación ha sido de libro, sabes como importar un fichero de datos y cargarlo en un bloque de datos en S7-200.
Os adjunto el ejemplo que he llegado hacer funcionar, por favor pruebenlo y si le veis un fallo decidmelo.
Gracias a todos por vuestra atención, seguimos en contacto.
Perdonad se me olvidó adjuntar el archivo... ahí va.

David
09/06/2010, 21:02
Lo siento pero no tengo ni idea de siemens, y espero no tener que aprender, jajaja


Creo haber hallado la solución, he tenido que recurrir a una marca para que cuando el contador del bucle "index" llegue al valor que quiero me pare dicho bucle, es decir, he hecho la cuenta de la vieja pero ahí queda y por lo que veo funciona.
Voy a probarlo con los direccionamientos indirectos y los temporizadores, cuando lo haya probado os lo cuento.
Sigue mosqueandome el comportamiento de la orden For que no es correcto, por cierto David tu explicación ha sido de libro, sabes como importar un fichero de datos y cargarlo en un bloque de datos en S7-200.
Os adjunto el ejemplo que he llegado hacer funcionar, por favor pruebenlo y si le veis un fallo decidmelo.
Gracias a todos por vuestra atención, seguimos en contacto.

David
09/06/2010, 21:28
entonces , puede ser interesante para temas de valores de variables y demas , pero no para salidas digitales porque veo que el for-next se ejecuta muy rapidamente y ademas , cuando acaba de ejecutarse siguen las salidas activadas .

Es curioso , las salidas, marcas siguen activas y los timers siguen contando , en cambio las memorias de variables V no .

Como poder, deberían poder activarse (Set /reset) marcas, entradas etc. A los efectos es como si repitiéramos el código varias veces y sumando uno al indice del bucle.

Lo que si esta claro es que si activas y desactivas dentro del bucle no has hecho nada, ya que no se termino el ciclo de scan.

lluisot
09/06/2010, 21:29
Creo haber hallado la solución, he tenido que recurrir a una marca para que cuando el contador del bucle "index" llegue al valor que quiero me pare dicho bucle, es decir, he hecho la cuenta de la vieja pero ahí queda y por lo que veo funciona.


Lo que has hecho funciona , pero si pones la suma dentro del bucle antes del contacto negado de la marca sigue sumando , aunque el bucle haya acabado

Si pones en cambio un flanco de la entrada , la suma se realiza en cambio correctamente .Por otra parte , antes de salir del bucle guardo el valor del indice en otra memoria v y si le vuelvo a dar al bucle , me vuelve a sumar el valor de bucle, pero el bucle no se ejecuta .La comparacion tambien la puedes hacer antes el bucle sin usar una marca .
Te adjunto el ejemplo

lluisot
09/06/2010, 21:36
Como poder, deberían poder activarse (Set /reset) marcas, entradas etc. A los efectos es como si repitiéramos el código varias veces y sumando uno al indice del bucle.

Lo que si esta claro es que si activas y desactivas dentro del bucle no has hecho nada, ya que no se termino el ciclo de scan.

Ya , pero yo lo que digo es que pongo el flanco de una entrada para ejecutar el bucle 2000 veces , y dentro de el , entre For y Next , pongo un segmento con contacto siempre on + una bobina directa de una salida .
Activo el flanco de la entrada , y el bucle se queda en 2000 y en cambio la salida sigue activa .

David
09/06/2010, 22:21
Lo que dices es esto?:

For i = 0 To 2

------[SiempreOn]---------(Y0)

Next

Esto es igual a:

-----[SiempreOn]--------(Y0)
-----[SiempreOn]--------(Y0)
-----[SiempreOn]--------(Y0)

Por lo tanto es logico que la salida quede a ON

No se si te habré entendido bien.


Lo que si puede tener sentido es esto:

For i = 0 To 20

----[Temp(i) > 20]-------(Set Y1)--

Next i

Siendo Temp un array que contiene 21 registros de temperatura