Programacion en Ipos
Programacion en Ipos
I. INTRODUCCION.
IPOS® es una potente herramienta de trabajo para expandir las capacidades de un variador de
frecuencia sin llegar a la necesidad de usar un PLC. Al estar basado en un lenguaje de
programación de texto y no de un entorno grafico requiere: acumular experiencia, tener
paciencia, ser ordenado al escribir los códigos y perder el miedo a programar ☺ ¡!.
Con IPOS® y los modelos de variadores MOVITRAC® 07B y MOVIDRIVE® MDX61B podemos
hacer trabajos de control de velocidad, de posición o de torque con los motores o 1
servomotores AC que requieran ejecutar un trabajo, “función” o secuencia especial más allá
de lo que se puede conseguir con los parámetros normales de un variador. Con IPOS® somos
los “artistas” que creamos algo desde la nada.
Antes de empezar a programar un variador debemos identificar QUÉ debe hacer el eje de
nuestro motor o servomotor que asociado -en muchos casos- a una transmisión mecánica
(acople a un cuerpo, una caja reductora, cadenas, poleas o fajas de cualquier tipo, etc.) logra
hacer el movimiento del cuerpo que nos interesa mover.
NOTA1: Con el eje de un motor podemos controlar tres cosas: velocidad, posición o torque. El
truco es identificar cuál de esas tres es lo que se requiere para la aplicación del motor que será
controlado por nuestro variador de frecuencia.
En CONTROL DE VELOCIDAD nos interesa hacer que el cuerpo que vamos a controlar mantenga
una referencia de velocidad (que puede ser m/mit, RPM o cualquier unidad de proceso), esto
implica que el eje del motor o servomotor girara los RPM que sean necesarios hasta alcanzar el
valor indicado por la referencia y mantenerse en ese valor. La referencia puede ser una señal
analógica, una señal de comunicación (Process data) desde un PLC o una consigna fija de
velocidad prefijada. Según la precisión que necesitemos para “aceptar que nuestro control de
velocidad es bueno” se debe considerar el uso de un encoder que valide que el motor o
servomotor alcanzo la velocidad objetivo dado por la referencia.
En CONTROL DE POSICION nos interesa hacer que el cuerpo que vamos a controlar mantenga o 2
alcance una posición fija. Estas posiciones de referencia pueden ser angulares (grados) o
longitudinales (mm, cm o metros). Dependerá mucho de la calidad de como el eje del motor
este acoplado al mecanismo, que hará mover al cuerpo que debe ser posicionado, para decir
que el posicionamiento es bueno. En control de posición la referencia por lo general es un dato
de entrada que el usuario debe definir. Para SEW EURODRIVE el control de posición siempre
será con el uso de sensores como encoder o resolver que deben ir instalados en el eje del
motor. El encoder o resolver envían PULSOS al eje variador de frecuencia quien interpretara
esos pulsos y mediante IPOS los podremos utilizar para el programa que debemos realizar.
En CONTROL DE TORQUE nos interesa hacer que el cuerpo que vamos a controlar trabaje con
un torque mecánico determinado. Sabemos que al girar el motor o servomotor este aparte de
entregarnos RPM también nos entrega una “fuerza” que permite que el cuerpo que está
asociado al eje del motor también gire. De nada nos servirá tener una altísima velocidad en el
eje del motor si no tenemos la capacidad de “mover” el cuerpo que queremos, para ello
necesitamos TORQUE. Hay un grupo de aplicaciones donde “activar” o “controlar” o “regular”
el torque disponible en el motor nos es conveniente. Aplicaciones como el proceso de bobinar
o de-bobinar son ejemplos típicos, ya que la masa del cuerpo que estamos bobinando o de-
bobinando va cambiando en el tiempo y por tanto el mismo torque que se requiere para la
aplicación cambia. Al igual que sucede con el control de velocidad, en el control de torque
también necesitamos una “referencia de torque” que haga que el eje del motor o servomotor
entregue el torque mecánico que necesitamos hasta el TORQUE MAXIMO disponible en el
diseño del mismo motor o servomotor.
NOTA3: En IPOS®, la aplicación de control de torque solo es posible con los variadores
MOVIDRIVE® MDX61B y es obligatorio el uso de encoder o resolver en nuestros motores y
servomotores.
Paso2. Una vez activa la plataforma MOVITOOLS MOTION STUDIO, se nos consultará si
queremos abrir un proyecto que hayamos trabajado o si queremos crear un proyecto
nuevo. Según sea el caso escogemos cualquiera de las 2 opciones. Si creamos un proyecto
nuevo debemos asignarle un nombre y una ruta dentro de nuestra PC.
Figura 7. Hacer click en el icono resaltado en color rojo para configurar el canal de
comunicación entre la PC y el variador.
Figura 8. En el menú emergente escoger SERIAL como puerto de enlace entre nuestra PC
de programación y el variador al que vamos a programar, luego aceptar con el botón OK.
5
Figura 9. Hacer click en el icono resaltado para ”buscar - escanear” al variador con el
puerto que hemos configurado.
Paso 4: Antes de activar el programa IPOS®, es conveniente hacer el START-UP del motor o
servomotor que vamos a trabajar y dejar configurado el modo de operación (Control de
Velocidad, de Posición o de Torque) que necesitamos dentro de árbol de parámetros del
variador.
Figuras 11 y 12. Haciendo click derecho en el icono del variador aparecerá un menú
emergente, dentro de la opción Startup encontramos un sub-menú para realizar la puesta
en marcha del motor o servomotor y para acceder al árbol de parámetros del variador.
Figura 13. Vista del árbol de parámetros del variador, en la figura se muestran dos
ventanas: para configurar las entradas digitales (P600 al P606) y para configurar el modo
de operación en control de velocidad, en control de posición o control de torque (P700).
Figura 14. Haciendo click derecho en el icono del variador y en la opción PROGRAMMING
accedemos al entorno de programación IPOS®.
Figura 15. Pantalla típica de IPOS®, aquí se programara en un lenguaje de texto que usara
variables y comandos especiales propios de los variadores SEW EURODRIVE.
Figura 17. Al proyecto que estamos creando hay que asignarle un nombre (p.e.
CLASE_IPOS) y una dirección donde se guardará el proyecto.
Figura 18. El proyecto creado aparecerá como una raíz dentro del entorno IPOS®.
Figura 19. En el menú FILE escoger NEW y luego SOURCE FILE, con esto estamos añadiendo
“paginas” a nuestro proyecto donde empezaremos a escribir los códigos de programación.
Figura 19. El programa nos pide confirmar si deseamos añadir un SOURCE FILE al proyecto,
aceptamos con el botón SI.
Figura 20. Al SOURCE FILE que se está añadiendo al proyecto le asignamos un nombre.
Figura 21. Tras asignar un nombre al SOURCE FILE, nos aparecerá una ventana que nos
sugiere la creación de una estructura base (“un esqueleto”) para el programa con el que
trabajaremos, en esta venta una hay 4 opciones: Inicialización, Tarea 2 (TASK #2), Tarea 3
(TASK #3) e Interrupción (INTERRUPT). Para nuestros primeros programas solo activaremos
la opción INITIALIZATION PART.
ZONA I: Cabecera
Figura 23. Finalmente nos aparecerá el SOURCE FILE o “pagina” donde empezaremos a 9
programar. En los recuadros de color rojo se han identificado tres zonas.
ZONA 1 – ZONA DE CABECERA: Aquí aparecerá siempre por defecto dos archivos:
“constb.h” y “iob.h”. El archivo “constb.h” agrupa internamente todas las palabras claves
propia para programar los variadores de SEW EURODRIVE, sin ese archivo sería imposible
invocar alguna instrucción especial que ya existe dentro de IPOS®. El archivo “iob.h”
agrupa internamente la designación para el programa de las entradas y salidas digitales del
variador de frecuencia. Adicionalmente en la zona de cabecera se acostumbra a designar
las variables disponibles y dar nombre a las entradas y salidas digitales o asignar
constantes.
IPOS® trabaja con un total de 1024 variables, dentro de los cuales existen un grupo de
variables no volátiles que no perderán su valor si se dejase de alimentar eléctricamente al
variador. Existe otro grupo de variables (H453 a la H580) que son variables que IPOS® ya
asignó una función específica (como por ejemplo obtener información de los encoder, del
estado de las entradas y salidas digitales, etc.)
NOTA4: Cuando se trabaja con el variador MOVITRAC® 07B se debe modificar los archivos
de cabecera “constb.h” y “iob.h” borrando la letra “b”, es decir en ese modelo de variador
los archicos de cabecera deben quedar de la siguiente forma: “const.h” y “io.h”
ZONA 2 – ZONA DE INICIALIZACION: Esta zona fue creada al momento de aceptar las
opciones que nos dio el programa en la figura 21. Aquí se acostumbra pre-cargar algunos
datos de inicio a variables o salidas digitales, todo eso como una medida de seguridad
básica para evitar movimientos inesperados del motor o servomotor al energizar al
variador de frecuencia.
ZONA 3 – ZONA DE TRABAJO: Esta zona es donde por lo general se agrega los códigos o
rutinas especiales que necesitamos para lograr el tipo de control (velocidad, posición o
torque) que necesitamos para nuestro motor o servomotor. Esta zona empieza desde la
línea con el texto while (1) { … y terminara con una llave de cierre }. Se debe tener mucho
cuidado en respetar las llaves de apertura { y las llaves de cierre } en las instrucciones que
las ameriten para evitar problemas en la ejecución del programa que estemos trabajando.
10
Figura 24. Icono que nos permitirá acceder al editor de los comandos especiales de IPOS®.
Figura 25. Ventana del editor de comando, en la sección SYSTEM FUNCTION se escogen los
comandos clave que vamos a utilizar en nuestro programa y en la sección SYSTEM
FUNCTION ARGUMENTS escogemos un dato adicional que acompaña al comando que
vamos a utilizar.
Con la plataforma de IPOS® ya lista - ver figura 23- empezaremos a conocer los códigos
básicos de programación para ello se ha listado 16 objetivos y dentro de los mismos cuatro
programas con tareas específicas que irán combinando lo que se va ir aprendiendo.
Figura 26. Botón para compilar el código escrito. Con este botón sabremos si
hemos cometido algún error al momento de escribir el programa.
11
Figura 27. Botón para descargar el código escrito en el variador de frecuencia,
también sirve para compilar el programa.
Figura 28. Botón para dejar al variador en modo RUN, al hacer esto el código que
se ha creado queda activo en el variador de frecuencia.
Definición de variables
Definición de constantes
Con la instrucción #define asignamos nombres a las variables, estas a su vez deben
12
direccionarse a una zona de las variables H disponibles tal como se muestra en el
código, por ejemplo el texto #define VELOCIDAD H1 significa que hemos creado la
variable llamada velocidad cuyo valor se alojara en la variable H1. Con la misma
instrucción #define ZERO 0 hemos “asignado” el valor de “0” a la constante llamada
ZERO. Luego debemos compilar, descargar el código creado y dejar en modo RUN al
variador, para esos seguimos la secuencia de las figuras 26 a la 28.
Para visualizar las variables que vamos creando y poder escribirle o leer los valores que
queremos podemos usar el editor de variables.
Figura 30. Hechos los pasos de la figura 29, tendremos luego el visualizador de
variables, aquí podemos leer o asignarles un valor.
NOTA5: Las variables que se usan en IPOS® son todas de tipo entero pudiendo ser
un entero positivo o negativo, NO SE PUEDE asignar valores con puntos decimales
a las variables IPOS®, pero si existen artificios de programación para poder trabajar
con decimales. Las variables pueden cambiar su lectura de número entero a
número binario.
Figura 32. Asignación de las entradas y salidas digitales como entradas y salidas de
programación tipo IPOS INPUT e IPOS OUTPUT en el grupo de parámetros P600 al
P606 para las entradas digitales y P620 al P624 para las salidas digitales.
NOTA6: Así como hemos asignado una entrada digital con la instrucción #define
estamos simulando una entrada con un estado ON/OFF tal como si fuera un
selector. En el siguiente código definiremos las entradas como si fueran botones
normalmente abiertos o cerrados.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
#define VELOCIDAD H1
#define TIEMPO H2
#define ZERO 0
//Rutina de enclavamiento ①
#define BITS H100
#define START (H100 & 0b1)
#define STOP (H100 & 0b10)
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{ if(ARRANQUE){ //Enclavamiento Botón de ARRANQUE ②
15
Rst_STOP;
Set_START; //Paso al estado START
}
if(START){
//Aquí deben ir las instrucciones asociadas al START ③
}
if(STOP){
//Aquí deben ir las instrucciones asociadas al STOP
}
} // fin de while(1)
} //fin de main()
①El código anterior nos presentó dos comandos nuevos: _BitSet que funciona para
colocar en “1” un bit de una variable, en nuestro caso con _BitSet (H100,0) estamos
colocando un “1” en el bit 0 de esa variable. _BitClear funciona para colocar en “0” un
bit de una variable, en nuestro caso con _BitClear (H100,0) estamos colocando un “0”
en el bit 0 de esa variable.
La rutina de enclavamiento funciona junto a una variable auxiliar – BITS H100 en
nuestro código- , es en esta variable donde hacemos operaciones lógicas de bits para
crear “estados” que se relacionen con la entrada digital de tipo botón normalmente
abierto o normalmente cerrado. ② Si tenemos un botón de ARRANQUE lo lógico es
pensar que al oprimirlo el motor entrará al estado de START, y si oprimimos el botón
de PARADA el motor entrara al estado de STOP, estos “estados” – START y STOP – se
van activar o desactivar según el botón que oprimamos ③.
El siguiente código muestra cómo trabajar con una entrada análoga y una salida
análoga.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
#define VELOCIDAD H1
#define TIEMPO H2
#define REFERENCIA H3 // ①
#define ZERO 0
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{ _GetSys( SenalAnaloga,GS_ANINPUTS ); //Se lee las 02 entradas análogas ③
_GetSys( SalidaAnaloga,GS_ANOUTPUTS); //Se lee las 02 entradas análogas
REFERENCIA = SenalAnaloga.Input1; //Se guarda el valor de entrada análoga 1 en H3
SalidaAnaloga.Output1 = 1000; //Se Asigna un valor de 1 voltios a la salida análoga 1
17
if(START){
if(STOP){
}
} //fin de while(1)
} //fin de main()
#define VELOCIDAD H1
#define TIEMPO H2
#define REFERENCIA H3
#define ZERO 0
//Rutina de enclavamiento
#define BITS H100
#define START (H100 & 0b1)
#define STOP (H100 & 0b10)
GSAINPUT SenalAnaloga;
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*-------------------------------------
Initialisation
--------------------------------------*/
ControlWord = 2; // Motor detenido ①
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{ _GetSys( SenalAnaloga,GS_ANINPUTS );
REFERENCIA = SenalAnaloga.Input1;
if(ARRANQUE){ //Enclavamiento Boton de ARRANQUE
Rst_STOP;
Set_START; //Paso al estado START
}
if(STOP){
ControlWord = 0; //Motor deshabilitado ③
}
}
}
La suma ponderada de cada bit (el valor de la potencia al cual es elevado el número 2)
activa directamente los bits que requerimos para nuestra aplicación. En la siguiente
imagen se muestra todos los bits y su asignación en la variable ControlWord.
Figura 35. La variable H484 = ControlWord y los bits que tiene asignados. Para que un
motor gire es necesario asignarle una velocidad - eso es posible con la instrucción
_SetSys(N11,…)- y además se debe indicar el sentido de giro para la velocidad deseada,
por eso para hacer que nuestro motor se mueva en sentido horario u anti horario
debemos activar dos bits: el del sentido de giro (CW o CCW) y el de asignación de
velocidad (N11 o N12). Para detener el giro del motor podemos usar los bits 0 u 1, con
el primero el eje quedara libre y sin torque, con el bit 1 el eje quedara detenido pero
en velocidad cero (es equivalente a estar frenado).
6. Uso de Temporizadores.
20
IPOS® dispone de algunos comandos que nos permiten generar el mismo efecto de un
retardo con tiempo fijo, un retardo con tiempo variable, un temporizado ascendente y
temporizado descendente.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
//Rutina de enclavamiento
#define BITS H100
#define START (H100 & 0b1)
#define STOP (H100 & 0b10)
GSAINPUT SenalAnaloga;
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
ControlWord = 2; //Instrucción para mantener al motor detenido "rígidamente"
/*-------------------------------------
Main Loop
--------------------------------------*/
21
while(1)
{ _GetSys( SenalAnaloga,GS_ANINPUTS );
REFERENCIA = SenalAnaloga.Input1;
if(ARRANQUE){ //Enclavamiento botón de ARRANQUE
Rst_STOP;
Set_START; //Paso al estado START
}
if(START){
_SetSys( SS_N11,VELOCIDAD );
ControlWord = 20;
_Wait( 2000); // Retardo de 2000 ms = 2s ①
_SetSys( SS_N11, (2*VELOCIDAD) ); //Asigno una nueva velocidad
ControlWord = 20;
Timer_0 = TIEMPO; //El retardo dependerá del valor que en H2: TIEMPO
while(Timer_0) {}; //Retardo el código en una tiempo variable ②
}
if(STOP){
ControlWord = 0; //mantener al motor detenido "libremente"
}
} // fin de while (1)
} // fin de main()
En el código anterior se han agregado los dos tipos de retardos: uno con un tiempo fijo
con la instrucción _wait() y el otro con un retardo variable usando la variable H489:
Timer_0.
El código escrito nos permitirá que cuando se active el botón de ARRANQUE el
variador entre en el estado “START”, ① entonces por 2 segundos el motor girará con
la velocidad de referencia de la variable H1: VELOCIDAD y luego automáticamente el
motor girará al doble de la velocidad de referencia por un “tiempo modificable”
②que asignemos en la variable H2: TIEMPO.
En el programa que hemos venido trabajando añadiremos una instrucción para que en
forma automática si se activa la entrada INVERSION el giro del motor se invierta y
tomando como referencia un escalamiento de velocidad según el valor de la señal
análoga de un potenciómetro. A su vez si el motor se encuentra en giro horario CW las
salidas digitales 1 y 2 del variador se encenderán y si el motor se encuentra en giro
antihorario CCW las salidas digitales 3 y 4 se encenderán.
La variable H481: StdOutpIPOS nos permite activar o desactivar las salidas digitales de
nuestro variador. Podemos usar las instrucciones _BitSet y _BitClear para activar una
salida especifica o usamos la “suma ponderada” como en el caso de ControlWord para
activar las salidas que necesitemos.
22
Figura 36. Variable H481 con la que podemos activar o desactivar las salidas digitales
de nuestro variador. Para que las salidas digitales funcionen con nuestro código
debemos configurarlas en el árbol de parámetros del variables como IPOS OUTPUT.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
//Rutina de enclavamiento
#define BITS H100
#define START (H100 & 0b1)
#define STOP (H100 & 0b10)
#define Set_START _BitSet(H100,0)
#define Set_STOP _BitSet(H100,1)
#define Rst_START _BitClear(H100,0)
#define Rst_STOP _BitClear(H100,1)
GSAINPUT SenalAnaloga;
/*-------------------------------------
Initialisation
--------------------------------------*/
ControlWord = 2; //Instrucción para mantener al motor detenido "rígidamente"
StdOutpIPOS = 0; //Inicializo (Apago) todas las salidas digitales del variador ②
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{ _GetSys( SenalAnaloga,GS_ANINPUTS ); //Capturo la señal análoga
REFERENCIA = SenalAnaloga.Input1;
VEL_CCW = ((VEL_MAX * REFERENCIA)/ 10000)); //Escalando la velocidad ③
23
_SetSys( SS_N11, (VEL_CCW*10) ); //Velocidad para el giro anti-horario
ControlWord = 24; //Comando para la inversión de giro ⑥
StdOutpIPOS = 24; //Activo las salidas digitales del variador 3 y 4, se apaga 1 y 2
Timer_0 = TIEMPO;
while(Timer_0) {}; //Retardo el código en una tiempo variable
}
else{ //Si no se activó la entrada INVERSION
ControlWord = 20; //El giro del motor se mantiene CW
StdOutpIPOS = 6; //Activo las salidas digitales del variador 1 y 2
}
}
if(STOP){
ControlWord = 0;
StdOutpIPOS = 0; //Todas las salidas apagadas
}
} // fin de while(1)
} // fin de main()
Figura 37. Asignación de parámetros para que el programa que hemos preparado para
control de velocidad funcione correctamente.
Figura 38: Variables H509, H510 y H511 para tener acceso a la lectura de encoder vía
pulsos por revolución.
Figura 39: Vía el visualizador de variables podemos leer las variables H509, H510 y
H511. La variable H511 lee en tiempo real los pulsos de encoder o resolver.
Figura 40: Otra forma de leer los valores de los encoder y resolver es vía los
parámetros del mismo variador MOVIDRIVE MDX61B en el P003 Actual position.
Figura 41: Una última forma de leer los valores de los encoder y resolver es vía la
instrucción _GetSys con el argumento GS_ACTPOS, esta información debe ser
guardada en una variable, en el ejemplo de la imagen se usó la variable H2.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{ if(START) {
_AxisStop( AS_ENABLE ); //liberar al eje ②
_GoRel( GO_WAIT,POSI ); //ir a la posición objetivo
_Wait(1000); //esperar 1 segundo
_GoRel( GO_WAIT,(-2*POSI)); //ir a la nueva posición objetivo
_Wait(1000);
_GetSys( H2,GS_ACTPOS );
27
}
else{
_AxisStop( AS_RSTOP ); //Servo detenido ③
}
} //fin de while(1)
} //fin de main()
Figura 42: Ventana que aparece durante la secuencia del start-up del motor o
servomotor, aquí se nos pregunta sobre el modo de operación: CONTROL DE
VELOCIDAD, CONTROL DE POSICION O CONTROL DE TORQUE. La opción “POSITIONING
with IPOS” es la correcta para el control de posición.
28
Figura 43: Parámetro P700, después del start-up se cargará el modo de operación de
control de posición y este será identificado con la extensión “…&IPOS”.
10. Interrupciones.
Las interrupciones son comandos que “detienen” la ejecución de un código debido a
que se presenta uno de los siguientes 03 eventos:
• Ante la presencia de un error en el variador.
• Ante un sobreflujo en el Timer_0 del variador.
• Ante la activación de la función TouchProbe en una de las dos entradas
“rápidas” del variador Movidrive MDX61B (entradas DIO2 y DI03).
NOTA9: TouchProbe es un nombre especial para definir a una de las dos entradas
destinadas para que apenas se detecte un cambio de estado (de ON a OFF o viceversa)
se capture la posición del motor o servomotor en el instante en que se activó la
entrada TouchProbe; esto es útil para la lectura de sensores en sistemas de corrección
en máquinas donde el margen de error en el posicionamiento es muy exigente.
El siguiente código nos muestra el uso de una interrupción con el evento TouchProbe.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
29
#include <iob.h>
#define START DI01
#define POSI H1
/*=============================================
Interrupt Service Routine
===============================================*/
Interrupt()
{ ①
_AxisStop( AS_PSTOP );
TargetPos = TpPos1_Mot;
_AxisStop( AS_ENABLE );
}
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{ /*-------------------------------------
Initialisation
--------------------------------------*/
_AxisStop( AS_RSTOP );
H492 = 0;
H511 = 0;
H507 = 0;
// activate interrupt service routine
_SetInterrupt(SI_TOUCHP1, Interrupt); ②
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{
if(START){
_TouchProbe( TP_EN1_HI); ③
_AxisStop( AS_ENABLE );
_GoRel( GO_WAIT,POSI );
_Wait(100);
}
else{
_AxisStop( AS_RSTOP );
}
}
}
Programa 9: Control de Posición con Interrupciones.
Figura 45. En la imagen se aprecia que el valor que capturó el TouchProbe fue de
25093 pulsos, este valor es consecuencia de la activación de la entrada DI02 y por
tanto se ingresó a la rutina de interrupción deteniendo al motor o servo y
reescribiendo el valor de la variable H492 TargetPos con el mismo valor de la posición
de la variable H507 TpPos1_Mot. Recordar que H492 es el valor que se debe alcanzar
desde la posición actual (H511), cuando ambos valores se igualan H511=H492
30
entonces el posicionamiento se cumplió. En el caso de la interrupción se está
cumpliendo que H492=H507=H511.
31
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Task2
===============================================*/
Task2()
{
POSI = (LONG* FACTOR); ①
}
/*=============================================
Interrupt Service Routine
===============================================*/
Interrupt()
{
_AxisStop( AS_PSTOP ); //Detengo al eje del servo
TargetPos = TpPos1_Mot; //Reescribo el TargetPos
_AxisStop( AS_ENABLE ); //Se habilita el eje del servo
}
/*=============================================
Función Lámpara
===============================================*/
Lamparas()
{
StdOutpIPOS = 2; //Activar la salida DO01
_Wait(2000); //Espera 2 segundos ②
StdOutpIPOS = 0; //Se apagan todas las salidas digitales
}
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
_AxisStop( AS_RSTOP ); //servo detenido
TargetPos = 0; //Inicializar la posición objetivo
ActPos_Mot = 0; //Inicializar la posición actual del motor
H507 = 0; //Inicializo el valor capturado del TouchProbe
Dato 1
Dato 1 Dato 2
(se aloja en
(obtenido (se aloja en
una variable
desde una Dato 2 será tomado una variable
Dato 1 será tomado del variador)
variable H o SOLO por los equipos del variador)
SOLO por los equipos
parámetro del que estén programados
que estén programados Dato 2
variador) para recibir la “etiqueta”
para recibir la “etiqueta” (obtenido
desde una
variable H o
parámetro del
variador)
Variador 1 Variador 3
Variador 2
La imagen anterior nos da a entender que un “dato” debe ser tomado desde un
variador emisor y para que se propague por la red S-BUS debe asignársele una
“etiqueta”. Todos los variadores que formen parte de la red S-BUS recibirán esa
información pero SOLAMENTE los variadores que se hayan programado para recibir
ese “dato con la etiqueta” podrán guardarlo enviándolo a una zona de memoria que
normalmente es una variable H del variador receptor. Hay que precisar que un mismo
variador puede ser emisor y receptor de varios datos, pero debemos tener cuidado
que cada dato cuente con una única “etiqueta” en la red de comunicación.
Con cada estructura creada se reservarán un grupo de variables para alojar los valores
que permitirán que la comunicación sea posible (por ejemplo: la asignación de la
“etiqueta”, de dónde vamos a sacar el “dato” a enviar y en donde lo vamos a guardar).
33
Figura 48. Si usamos los comandos SCTRCYCL y SCREC y cada uno le asignamos un
nombre, dentro de la zona de variables del variador se crearán una estructura para
enviar y/o recibir datos.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
ENVIAR.ObjectNo = 1000; //Etiqueta con el valor "1000" como identificador ②
ENVIAR.CycleTime = 10; //Envio datos cada 10 ms
ENVIAR.Offset = 0; //Retardo de 0 ms
ENVIAR.Format = 4; //Envio solo 1 dato
ENVIAR.DPointer = numof(H2); //Envio el dato q se coloque en H2
}
Programa 11: Intercambio de datos por red S-BUS entre dos variadores.
② En el código anterior los datos que existan en la variable H2 serán etiquetados con
el numero “1000” y se enviaran por la red S-BUS cada 10ms, además desde otro
variador recibiremos dos datos con una única etiqueta “1001” y serán guardados de
forma correlativa en las variables H5 y H6.
De forma similar se presenta el código para enviar datos desde otro variador donde el
dato de envió tendrá la etiqueta “1001” y el dato de recepción tendrá la etiqueta
“1000”.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
ENVIAR2.ObjectNo = 1001; //Etiqueta "1001"
ENVIAR2.CycleTime = 10; //Envio datos cada 10 ms
ENVIAR2.Offset = 0; //Retardo de 0 ms
ENVIAR2.Format = 8; //Envio 2 datos
ENVIAR2.DPointer = numof(H0); //Envio datos q existen en H0 y H1
_SBusCommDef( SCD_TRCYCL,ENVIAR2 );
35
_SBusCommDef( SCD_REC,RECIBO );
_SBusCommState( SCS_START1 );
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1) {
}
Programa 12: Intercambio de datos por red S-BUS entre dos variadores.
Para probar el programa debemos colocar algún valor en la variable H2 del variador 1 y
ver su lectura en la variable H3 del variador 2. De igual forma debemos escribir algún
valor en las variables H0 y H1 del variador 2 y ver su lectura en las variables H5 y H6
del variador 1.
Para que exista la comunicación los dos variadores deben estar conectados a través de
su puerto S-BUS. En el caso del variador Movidrive MDX61B la conexión física se
muestra en la siguiente figura:
13. Proyecto de Control de movimiento de dos ejes simulando una etiquetadora vertical.
Hasta este punto se conocieron los suficientes códigos para poder crear un programa
que pueda simular el funcionamiento de una maquina con un cierto grado de
dificultad. El proyecto que se propone es “sincronizar” el funcionamiento de una
máquina de etiquetado vertical con dos ejes de movimiento como la mostrada en la
siguiente imagen.
36
2 6
t2
t4
Duración del ciclo del producto
Nota10: Para saber por IPOS® que el servomotor alcanzó la posición de referencia
utilizamos la variable H473 StatusWord e interrogamos al bit 19 quien se activa cuando
el motor o servo alcanzó la posición objetivo.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
38
--------------------------------------*/
ENVIAR.ObjectNo = 1000; //Se crea la etiqueta "1000"
ENVIAR.CycleTime = 10; //Dato enviado cada 10 ms
ENVIAR.Offset = 0; //Retardo de 0 ms
ENVIAR.Format = 4; //Se envía solo 1 dato
ENVIAR.DPointer = numof(en_posi); //Se envía el valor de la variable H2
Programa 13: Código para el SERVO jalador del film formador del empaque (variador 1)
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
ENVIAR2.ObjectNo = 1001; //Se crea la etiqueta "1001"
ENVIAR2.CycleTime = 10; //Dato enviado cada 10 ms
ENVIAR2.Offset
ENVIAR2.Format
= 0;
= 4;
//Retardo de 0 ms
//Se envía solo 1 dato
ENVIAR2.DPointer = numof(en_posi2); //Se envía el valor de la variable H2
39
RECIBO.ObjectNo = 1000; //Se recibe la etiqueta "1000"
RECIBO.Format = 4; //Se recibe solo 1 dato
RECIBO.DPointer = numof(H4); //Se guarda el dato recibido en la variable H4
} //fin de while(1)
} //fin de main()
Programa 14: Código para el SERVO dosificador que llena de producto al empaque
(variador 2).
Hasta ahora los datos que hemos ingresado en control de posición son números que
representan directamente la cantidad de pulsos que requerimos. En una situación
verdadera lo que ingresamos ya sea vía una pantalla HMI o vía un teclado es una
posición física real: milímetros, centímetros, metros o grados y no pulsos por lo que
debemos escalar o “transformar” esos datos de ingreso a pulsos de encoder/resolver.
El siguiente ejemplo ayudará a ilustrar cómo hacerlo:
40
Asumamos los siguientes datos:
El carro debe moverse una longitud de 2 metros
El diámetro de las ruedas y de las poleas con la correa sincrónica son de: 250 mm
El ratio (i) de la caja reductora es de: 10
Sabemos que la longitud lineal L = GIRO x RADIO 2m = GIRO x (0,25/2) m
GIRO = 16 radianes
Es decir, para lograr la distancia de 2 metros ha tenido que darse un GIRO de 16
radianes. También sabemos que una revolución de la rueda representa 2π radianes =
6,2832 radianes, por tanto si dividimos 16/6,2832 tendremos que la rueda debió girar
aproximadamente 2,55 revoluciones (~ 2,5 veces).
Como la rueda y la polea acoplada a la caja reductora tienen el mismo diámetro eso
quiere decir que giraron iguales (~ 2,5 veces). Según la imagen la polea es solidaria al
eje de salida de la caja reductora que acciona al carro, y esta caja tiene una reducción
de i:10, por tanto la cantidad de veces que giro el servo fue reducida en 10 a la salida
de la caja reductora, esto quiere decir que si a la salida de la caja reductora hubo un
giro de 2,5 veces en el eje del servo el giro fue de 25 veces (2,5 x 10 = 2,5 x i) para
poder lograr los 2 metros de recorrido del carro.
Para IPOS® un giro de 360° de motor o servo tiene un valor de 4096 pulsos y si 2
metros representa 25 giros de eje del motor o servo, la cantidad de pulsos que
debemos ingresar por programación seria de 25 x 4096 = 102400.
Figura 53. Configuración del modo control de torque para un servo, en el caso de un
motor la opción sería CFC & torque control. Solo en el variador Movidrive® MDX61B es
posible este modo de trabajo y es obligatorio que el motor o servo tenga un
encoder/resolver para poder trabajar, el modo de control usado es el llamado control
vectorial de corriente.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
#define START DI01 //Arranque
#define REFERENCIA H1 //Referencia Torque
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
ControlWord = 2;
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{ if(START){
_SetSys( SS_N11,REFERENCIA );
ControlWord = 20; //Arranque del motor o servo
}
else{
ControlWord = 2; //Detiene al motor o servo
}
} //fin de while(1)
}//fin de main()
42
Programa 15: Control de Torque.
Figura 54. El valor de referencia 40.0 del parámetro P160 es escalado internamente
como una referencia de torque/corriente de 2.0 en el mismo parámetro P160, por
tanto ese valor es lo que el motor/servo está siguiendo como referencia (y no a la
velocidad), este control se ve reflejado en el consumo de la corriente activa del motor
en el parámetro P005, si aumentamos la referencia el valor del parámetro P005
también aumentará permitiendo que el eje del motor/servo manifieste más torque en
su eje.
Figura 56. Tarjetas que sirven como Gateways para trabajar buses de campo (Fieldbus:
Profibus DP, Devicenet, Ethernet, Ethercat, Can-Bus, Profinet, etc.) con los variadores
de SEW EURODRIVE (Movidrive® MDX61B, Movitrac® 07B). Se debe tener cuidado en
el límite de datos de proceso (process data) que se debe utilizar en la comunicación.
Datos enviados desde el PLC hacia el VDF Datos recibidos por el PLC desde el VDF
PD01.0 Habilitación VDF PDI1.0 VDF en falla
PD01.1 Girar sentido CW PDI1.1 VDF listo
PD01.2 Girar sentido CCW PDI1.2 Motor girando
PD02 Velocidad referencia PDI2 Velocidad Actual
PD03 PDI3 Corriente Actual
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
#define Habilitar H0 //Habilita al variador para el giro del motor
#define Giro_CW H1 //Giro Horario
#define Giro_CCW H2 //Giro Anti-horario
44
#define Vel_Ref H3 //Velocidad de Referencia desde el PLC
#define Estado H5 //Estado actual VDF
#define Vel_Act H6 //Velocidad actual motor
#define I_Act H7 //Porcentaje de corriente del variador
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Task2
===============================================*/
Task2()
{ _GetSys(Vel_Act ,GS_ACTSPEED ); //Obtener del VDF la velocidad actual
_GetSys(I_Act ,GS_ACTCUR ); //Obtener del VDF el % de corriente de consumo
//c. Preparando los bits de "ESTADO" del variador en el primer dato de envio al PLC
if(StatusWord & 0b10){ //Compara en H473 si EL VDF NO ESTA EN FALLA
_BitClear(Estado,0); //Pongo 0 avisando que el VDF no está en falla
}
else{
_BitSet(Estado,0); //Pongo 1 avisando que el VDF SI ESTA en FALLA
}
if(StatusWord & 0b100){ //Compara en H473 si EL VDF NO ESTA listo
_BitSet(Estado,1); //Pongo 1 avisando que el VDF SI ESTA listo
}
else{
_BitClear(Estado,1); //Pongo 0 avisando que el VDF NO ESTA listo
}
if(StatusWord & 0b10000){ //Compara en H473 si MOTOR está girando
_BitSet(Estado,2); //Pongo 1 avisando que el motor está girando
}
else{
_BitClear(Estado,2); //Pongo 0 avisando que el motor no está girando
}
//k. Valores de los PI de salida del VDF al PLC
PI_bus3.PI1 = Estado;
PI_bus3.PI2 = (Vel_Act*10);
PI_bus3.PI3 = (I_Act*100);
_SetSys( SS_PIDATA,PI_bus3 );
}
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{ //Estructuras para recibir los PO desde el PLC
PO_bus3.BusType = 3; //Tipo de bus fieldbus ③
PO_bus3.Len = PI_bus3.Len = 3; //Se manejaran 3 process data de tipo PO y PI
45
/*-------------------------------------
Initialisation
--------------------------------------*/
// activate task 2
_SetTask(ST2_START, Task2);
//Inicializo los PO
PO_bus3.PO1 = PO_bus3.PO2 = PO_bus3.PO3 = 0;
//Inicializo los PI
PI_bus3.PI1 = PI_bus3.PI2 = PI_bus3.PI3 = 0;
//Estado del Control al inicializar
ControlWord = 2; //Mantengo al motor detenido
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{ if((Habilitar == 0) && (Giro_CW == 0) && (Giro_CCW == 0)){
ControlWord = 0; //Motor deshabilitado
}
if((Habilitar == 0) && (Giro_CW == 0) && (Giro_CCW == 1)){
ControlWord = 0; //Motor deshabilitado
}
if((Habilitar == 0) && (Giro_CW == 1) && (Giro_CCW == 0)){
ControlWord = 0; //Motor deshabilitado
}
if((Habilitar == 0) && (Giro_CW == 1) && (Giro_CCW == 1)){
ControlWord = 0; //Motor deshabilitado
}
if((Habilitar == 1) && (Giro_CW == 0) && (Giro_CCW == 0)){
ControlWord = 2; //Motor detenido
}
if((Habilitar == 1) && (Giro_CW == 0) && (Giro_CCW == 1)){
_SetSys( SS_N11,(10*Vel_Ref)); //Se carga la velocidad enviada por el PLC en PO2
ControlWord = 24; //Motor gira en sentido CCW
}
if((Habilitar == 1) && (Giro_CW == 1) && (Giro_CCW == 0)){
_SetSys( SS_N11,(10*Vel_Ref)); //Se carga la velocidad enviada por el PLC en PO2
ControlWord = 20; //Motor gira en sentido CW
}
if((Habilitar == 1) && (Giro_CW == 1) && (Giro_CCW == 1)){
ControlWord = 2; //Motor detenido
}
} //fin del while(1)
} //fin del main()
En el código anterior, usando los comandos GSPODATA3 y GSPIDATA3 ①se crean las
estructuras para los Process data de recepción desde el PLC (los que se conocerán
como PO) y Process data de envio hacia el PLC (los que se conocerán como PI),
técnicamente en IPOS podemos trabajar hasta con 10 PO y 10 PI escribiendo la
estructuras GSPODATA10 y GSPIDATA10.
Creadas las estructuras utilizamos los comandos _GetSys(PO_bus3, GS_PODATA) y
_SetSys( SS_PIDATA,PI_bus3 ) ② para asignar valores a cada uno de los PO y PI
creados con las estructuras, aquí es útil usar la tabla de asignación de datos que
definimos antes de mostrar el código del programa; con esa tabla sabremos en donde
colocar cada valor que nos envía el PLC hacia los PO que recibe el variador y desde
donde sacar cada datos desde el variador hacia el PLC usando los PI.
Las siguientes dos líneas de código que siempre se deben incluir en el programa
aseguran que la comunicación de datos será vía el intercambio de información con
fieldbus y la cantidad de datos a manejar ③:
NOTA 11. Hay que indicar que el programa que hemos presentado es válido para
cualquier fieldbus de comunicación: Profibus DP, Devicente, Profinet, Ethernet,
Modbus, Can-Bus, etc. El variador reconocerá automáticamente el tipo de tarjeta
Gateway que se este utilizando para poder trabajar con los PO y PI, por tanto en IPOS®
no es necesario configurar el tipo de fieldbus que estemos usando, solamente
configuramos la recepción, el envio, asignación y utilización de los datos de los PI y PO.
Lo que si es necesario es asignar en el variador los parámetros P100 y P101 que la
referencia de velocidad y el control del variador será hecho vía fieldbus.
Figura 57. Vía los parámetros del variador este es configurado para recibir la referencia
de velocidad y los datos de control para encenderse o apagarse usando fieldbus.
Finalmente para que siempre exista un refrescamiento de los datos que se reciben
como PO desde el PLC, el parámetro P876 del variador DEBE estar en la opción ON.
Con la instrucción switch –case hacemos una pre-evaluación de una condición que
luego asumirá un identificador (p.e. un número) que será nuestro “caso” o “case”.
Luego dentro del switch cuando solo un “caso” o “case” sea el que se encuentre activo
se leerá y ejecutará solamente las instrucciones contendidas dentro del “caso” o
“case”, dejando sin leer y ejecutar las otras alternativas de los otros casos. Con esto
ahorramos tiempo en la lectura del programa y no descuidamos otras funciones que
47
requieran ser atendidas por el programa.
/*=============================================
IPOS Source File
===============================================*/
#include <constb.h>
#include <iob.h>
#define MODO H0 //Modo de operación (0: Manual con JOG, 1: Control Velocidad ①
//2:Control de Posición, 3: Control Torque)
#define VEL_MAN H1 //Referencia en control manual con JOG
#define VEL H2 //Referencia en control velocidad
#define POSI H3 //Referencia en control posición
#define TORQ H4 //Referencia en control torque
#define MODOCTRL H5 //Asignación del modo de control
//Note:
//Movidrive inverters with activated technology function "ISYNCH" or "Cam"
//do not support variables H360 an higher.
/*=============================================
Task2
===============================================*/
Task2()
{ if(!DI01 && !DI02){ // DIO1: OFF y DIO2: OFF ②
MODO = 0; //Control manual por JOG
}
if(DI01 && !DI02){ // DIO1: ON y DIO2: OFF
MODO = 1; //Control de velocidad
}
if(DI01 && DI02){ // DIO1: OFF y DIO2: ON
MODO = 2; //Control de posición
}
if(DI01 && DI02){ // DIO1: ON y DIO2: ON
48
MODO = 3; //Control de torque
}
/*=============================================
Main Function (IPOS Entry Function)
===============================================*/
main()
{
/*-------------------------------------
Initialisation
--------------------------------------*/
ControlWord = 2; //Servo Detenido
ActPos_Mot = 0; //Se resetea posición actual servo
TargetPos = 0; //Se resetea posición objetivo
StdOutpIPOS = 0; //Se apagan salidas digitales
MODOCTRL = 0; //Se inicializa modo de control servo
// activate task 2
_SetTask(ST2_START, Task2);
/*-------------------------------------
Main Loop
--------------------------------------*/
while(1)
{
switch (MODO){
case 0:{ //Control Manual con JOG ③
MODOCTRL = 16; // Por IPOS al asignar 16 a esta variable habilitamos control velocidad
_SetSys( SS_OPMODE, MODOCTRL );
if(!JOG_POS && !JOG_NEG){
ControlWord = 2; //Servo detenido
}
if(JOG_POS && !JOG_NEG){
_SetSys( SS_N11,(10*VEL_MAN));
ControlWord = 20; //Giro servo en CW
}
if(!JOG_POS && JOG_NEG){
_SetSys( SS_N11,(10*VEL_MAN));
ControlWord = 24; //Giro servo en CCW
}
if(JOG_POS && JOG_NEG){
ControlWord = 2; //Servo detenido
}
} //fin case:0
} //fin switch(MODO)
} //fin while(1)
} //fin main()
INDICE
• Introducción pag.01
• Diferencia entre control de velocidad, control de posición y control de torque pag.02
• Cómo ingresar al entorno de programación de IPOS® pag.04
• Dentro del entorno de programación de IPOS® pag.07
• Lo necesario para programar pag.11
• Definir Variables y Constantes pag.11
• Definir Entradas y Salidas Digitales pag.13
• Definir una Entrada digital como un botón normalmente abierto y normalmente
cerrado pag.14
• Trabajando con una señal análoga (entrada y salida) pag.16
• Como asignar velocidades a un motor pag.18
• Uso de Temporizadores pag.20
• Programa de Control de Velocidad pag.22
• Lectura de Encoder pag.24
• Programa de Control de Posición pag.26
•
50
Interrupciones pag.29
• Activación de Tareas paralelas y creación de Funciones pag.30
• Comunicación entre un grupo de variadores vía programación IPOS® pag.32
• Control de movimiento de dos ejes simulando una etiquetadora vertical pag.36
• Programa de Control de Torque pag.41
• Trabajando con Redes Industriales: Profibus-DP, Ethernet, Devicenet, etc pag.43
• Trabajando con opciones múltiples tipo switch-case pag.47