Inicio > Foro > Programación IEC 61131 (LogicLab) > Administre un contador con un valor retentivo
- Este tema tiene 9 respuestas, 2 participantes y se actualizó por última vez 5 años, hace 7 meses da Sergio Bertana.
-
autorPublicación
-
Octubre 31, 2017 en 8: 56 am #36161Alessandro Campodonicopartícipe
Debo administrar un recuento colocando el valor en una variable retentiva (RETAIN), para el recuento he creado mi propio FB que realiza las diversas verificaciones y aumenta un contador, luego coloco la salida en una variable retentiva (en DB100.2048). Pero cuando apago el sistema y lo vuelvo a encender, el valor de recuento me restablece, ¿qué puedo hacer?
Octubre 31, 2017 en 9: 04 am #40003Sergio BertanaAdministrador del foroSu problema es que cuando el FB está encendido tiene todas sus variables internas restablecidas, por lo tanto, también se restablece su valor de salida, ya que coloca el valor de salida en la variable de búfer, también restablece la variable.
Para usar variables asignadas en la memoria intermedia (respaldo o retención) dentro de funciones o bloques de funciones, debe usar punteros que pasen la dirección de la variable. De esta forma operaremos sobre el valor real de la variable, la cual, al estar en búfer, mantendrá el valor que tenía cuando se apagó cuando se enciende. En LogicLab los punteros se identifican con el símbolo @por lo tanto, una variable @UINT es en realidad un puntero a una variable UINT.
Me di cuenta del proyecto RetainCounter (Imprimir programa) que ilustra con tres FB diferentes en los idiomas LD, IL y ST cómo gestionar las variables RETAIN de un FB (Descarga del proyecto).
Julio 18, 2018 en 6: 08 am #45121Alessandro CampodonicopartícipeBuenas noches, todavía estoy luchando con mi contador de FB, hasta hoy lo he logrado, creando un pequeño programa en el arranque de la tarea que copiaba el valor de una variable retentiva a la entrada de mi FB, así que cuando inicio el plc FB toma el valor de la variable retentiva y por lo tanto no me reinicia.
El problema es que este sistema "pesa" el programa tanto como espacio de código como espacio de variable, por lo que hoy me encuentro teniendo que modificar FB para mantener correctamente los valores retentivos y eliminar esa parte innecesaria del código.
Hice algunas pruebas usando el programa que cargue, el primer mi problema que se plantea es que, toda mi programa está escrito en lenguaje IL y sin embargo no han logrado encontrar una manera de utilizar la función de ADR en este idioma, como yo ?
¿Cómo cambio mi FB para adaptarlo al puntero? ¿Solo tengo que configurar la variable con la @ y configurarla como una variable de entrada? ¿La variable de soporte externo siempre tiene que ser una @ o una normal?
Julio 19, 2018 en 6: 36 am #45124Sergio BertanaAdministrador del foroPara evitar tener que copiar la variable, la única forma es pasar su dirección a la función o bloque de funciones ya que usa el lenguaje IL, aquí se explica cómo escribir el programa que usa el FB ILRetainCtr. Declaré la variable en el programa Para contrarrestar del tipo ILRetainCtr.
VAR
Contador: ILRetainCtr;
END_VARY aquí hay un IL listado simple, como puede ver, la entrada Di00CPU está conectada al reloj del contador, y a Value se le pasa la dirección de la variable Counters [0] que es de tipo RETAIN.
LD Di00CPU
ST Counter.Clk
Contadores ADR [0]
ST Counter.Value
Contador CALAdjunto el proyecto LogicLab para descargar.
Julio 20, 2018 en 6: 26 am #45125Alessandro CampodonicopartícipeMe ha engañado el hecho de que al escribir el comando ADR (en IL) la escritura no era azul, lo que sucede, por ejemplo, (LD ST ADD SUB GT ECC ECC), entonces pensé que no funcionaba. Así que aprovecho esta oportunidad para preguntarte una cosa más (lo siento si voy a OT)
¿Cómo se utilizan las "funciones" en lenguaje IL si trato de mapear una variable?
Julio 20, 2018 en 6: 47 am #45135Sergio BertanaAdministrador del foroLa respuesta a tu pregunta está en el manual de LogicLab, con LogicLab existen dos manuales, uno es el que explica el funcionamiento del programa (F1 en cualquier ventana del programa) y el otro es el que hace referencia a todas las funciones y FB proporcionados con nuestros productos (F1 en el nombre de una función o FB).
Pero al llegar a su pregunta para ejecutar una función desde IL, simplemente ponga su nombre como el primer operando de una línea de programa. Recuerde que el primer parámetro de la función se pasa a través del acumulador, mientras que los demás se colocan en línea con la definición. El resultado de la función se devuelve al acumulador. Ahi esta captura de pantalla con un ejemplo.
Julio 20, 2018 en 2: 01 pm #45136Alessandro CampodonicopartícipePor ejemplo, traté de usar la función ValueScale pero el compilador me da un error:
G0001 Numero di operandi non valido.
Y lo responderé escribiendo solo
Temperatura de LD
ValueScale¿Qué puedo hacer para resolver?
Julio 20, 2018 en 2: 05 pm #45138Sergio BertanaAdministrador del foroLa respuesta es un error, la función ValueScale tiene varios operandos
Input (REAL) Valor de entrada a escalar.
ILow (REAL) Límite mínimo del valor de entrada a escalar.
IHigh (REAL) Límite máximo del valor de entrada a escalar.
OLow (REAL) Límite mínimo del valor de salida escalado.
OHigh (REAL) Límite máximo del valor de salida escalado.Y no los pones. Por ejemplo, si desea transformar una entrada de 4-20 mA en 10-50 PSI, debe escribir:
Sensor LD (* Entrada, valor de entrada a escalar *)
ValueScale 4.0, 20.0, 10.0, 50.0
Presión STSeptiembre 12, 2018 en 3: 17 pm #45361Alessandro CampodonicopartícipeBuenos días, volví a estar al tanto de mis horas de operación de conteo de FB y punteros. Estaba intentando actualizar mi bloque, para evitar tener que copiar siempre los valores, pero encuentro un bloque del PLC, lo explicaré mejor.
Luego, mi bloque cuenta el tiempo de activación de su entrada, dividido por segundos, minutos y horas, luego dentro de él se ejecutan todas las instrucciones en estas variables 3 (salida al bloque)
si no he entendido mal actualizar correctamente el bloque con punteros, debería "mapearlos" correctamente agregando la @ en la lista de estas 3 variables, luego siempre agregue la @ en la lista de instrucciones donde se usan estas variables, finalmente asigne las 3 variables como entrada y no como salida, al hacerlo en teoría debería haber actualizado correctamente (de nuevo si no he entendido mal). Pero al cargar el programa en el plc tengo un bloque, el archivo de registro me da este texto
[E] SFR050 [05/09/2018 10:24:06] 1020, Except: IVECTOR At:0x00000000
[L] SFR050 [05/09/2018 10:24:06] 1000, System power on
[L] SFW184 [05/09/2018 10:24:06] 5005, Starting Op. System SFW184B080
[E] SFW184 [05/09/2018 10:24:06] 6030, LLab Cn, ApplID:0x364F53D4Septiembre 12, 2018 en 3: 23 pm #45377Sergio BertanaAdministrador del foroEl uso de punteros proporciona una potencia considerable en el desarrollo de programas pero es MUY PELIGROSO, si pasas una dirección incorrecta al puntero puedes acceder a toda la memoria del sistema que va a operar incluso en áreas del sistema operativo.
En su caso, probablemente se haya equivocado de dirección que cuelga el sistema con una excepción. Después del error, el sistema se reinicia, luego, si LogicLab estaba conectado, se detiene. Pero si LogicLab no está conectado, el sistema intenta reiniciarse varias veces hasta que se detiene en suspensión.
Entonces, en su caso definitivamente tiene un error en el valor pasado al puntero, mire el proyecto de muestra de las publicaciones anteriores y clone el programa para su uso.
-
autorPublicación
- Debe iniciar sesión para responder a este tema.