Anda di halaman 1dari 11

Instituto de Tecnologas Educativas

PRIMITIVAS EN C PARA LA CONTROLADORA CNICE


Para poder manipular las entradas y salidas de la controladora CNICE se han desarrollado una serie de
funciones y procedimientos que forman parte de una librera dinmica para que el usuario que quiera
implementar un programa para manejarla no se tenga que preocupar por saber cmo mandar o recibir datos
por el puerto paralelo, qu rdenes tiene que escribir para activar/desactivar una salida o entrada, etc.
Es importante destacar que para poder utilizar los puertos del equipo en los sistemas operativos Windows
2000, XP y Vista se necesita la librera dinmica io.dll porque estos sistemas operativos limitan el acceso
directo al hardware de la mquina. Esta librera es exactamente la misma que se ha empleado para esta
misma funcin en el lenguaje MSWLogo.

LIBRERA DINMICA PARA ACCEDER A LOS PUERTOS DEL EQUIPO EN


LOS SISTEMAS OPERATIVOS WINDOWS 2000, XP Y VISTA: io.dll
Como ya se ha mencionado, para poder utilizar los puertos del equipo se necesita la librera dinmica
io.dll. Como ya se ha mencionado, esta librera es exactamente la misma que se ha empleado para esta
misma funcin en el lenguaje MSWLogo. Esta librera se ha obtenido en la direccin:
http://www.geekhideout.com/iodll.shtml
Para usar la librera io.dll con Dev C++, se tiene que usar las funciones de C LoadLibrary y
GetProcAddress. Estas funciones son bastante engorrosas de usar por lo que se una serie de funciones
auxiliares (disponibles en los ficheros io.h e io.cpp que se pueden obtener en la misma direccin que la
librera io.dll) que simplifican el trabajo al desarrollador. Simplemente hay que incluir estos 2 ficheros en
los proyectos que se desarrollen. Estos 2 ficheros se encargan de llamar a la funcin LoadLibrary y a todas
las llamadas a la funcin GetProcAddress necesarias, facilitando con ello el trabajo. De esta forma el nico
paso que se requiere es llamar a la funcin LoadIODLL al principio del programa del usuario. Es muy
importante no olvidar esto porque sino el programa no funcionara.
Resumiendo, donde se tenga el proyecto a desarrollar se deben dejar los ficheros io.h e io.cpp y agregarlos
al proyecto. La librera dinmica io.dll se debe dejar bien en la carpeta del sistema
C:\WINDOWS\System32 o bien en la carpeta donde se tenga el proyecto. Una vez hecho esto se debe
llamar desde el programa a la funcin LoadIODLL y de esta forma ya tendremos acceso a los puertos del
equipo.
Estos 3 archivos (io.dll, io.h e io.cpp) pueden encontrarse en la carpeta IODLL_ C del archivo comprimido
primiticas_c.zip.

Funcionamiento Programacin Primitivas C

Interfaz de control de dispositivos externos por ordenador a travs de puerto paralelo

POR QU SE UTILIZA UNA LIBRERA DINMICA PARA LAS


PRIMITIVAS?
Una librera dinmica o dll (Dinamic Link Library) es un archivo con cdigo ejecutable que se carga bajo
demanda del programa por parte del sistema operativo. Las ventajas que aporta el uso de las dlls son los
siguientes:
Reducen el tamao de los archivos ejecutables: gran parte del cdigo puede estar almacenado en
bibliotecas y no en el propio ejecutable lo que redunda en una mejor modulacin.
Pueden estar compartidas entre varias aplicaciones: si el cdigo es suficientemente genrico, puede
resultar de utilidad para mltiples aplicaciones.
Facilitan la gestin y aprovechamiento de la memoria del sistema: la carga dinmica permite al
sistema operativo aplicar algoritmos que mejoren el rendimiento del sistema cuando se carguen
estas bibliotecas. Adems, al estar compartidas, basta con mantener una copia en memoria para
todos los programas que la utilicen.
Brindan mayor flexibilidad frente a cambios: es posible mejorar el rendimiento o solucionar
pequeos errores distribuyendo nicamente una nueva versin de la biblioteca dinmica.
Nuevamente, esta correccin o mejora ser aprovechada por todas las aplicaciones que compartan
la biblioteca.
Por todo ello, se ha decidido crear una librera dinmica que contenga a las primitivas para manejar la
controladora CNICE.
Destacar que el proceso seguido para buscar el fichero .dll es siempre el mismo:
En el directorio que contiene el ejecutable (fichero .exe).
El directorio actual de la aplicacin.
El directorio de sistema de Windows (system32).
El directorio de Windows.
Los directorios incluidos en la variable de entorno PATH del Sistema.

LIBRERA DINMICA QUE CONTIENE A LAS PRIMITIVAS


Una vez que ya se tiene acceso al puerto paralelo del equipo hay que desarrollar una serie de funciones y
procedimientos para manejar la controladora y construir la librera dinmica. Esta librera dinmica se
llama Primitivas_CNICE_C.dll. Al igual que ocurra con la librera para acceso a los puertos io.dll, se
han definido en los archivos Primitivas_CNICE_C.hpp y Primitivas_CNICE_C.cpp una serie de
funciones para facilitar el uso de esta librera.
El procedimiento para poder utilizar esta librera es similar al seguido para la librera io.dll. Es decir, lo
primero es llamar a la funcin de carga, en este caso LoadPrimitivasDLL al principio del programa.
Luego donde se tenga el proyecto a desarrollar se deben dejar los ficheros Primitivas_CNICE_C.hpp y
Primitivas_CNICE_C.cpp y agregarlos al proyecto. La librera dinmica Primitivas_CNICE_C.dll se debe
dejar bien en la carpeta del sistema C:\WINDOWS\System32 o bien en la carpeta donde se tenga el
proyecto. Luego se podrn utilizar las primitivas simplemente haciendo las llamadas a las funciones o
procedimientos con sus parmetros correspondientes.
Es importante destacar que al utilizar la librera dinmica que contiene a las primitivas ya se
realiza la carga de la librera io.dll, por tanto ya no es necesario que el usuario en su programa haga
la llamada a la funcin LoadIODLL. Solo tendr que llamar a la funcin LoadPrimitivasDLL.
Estos 3 archivos (Primitivas_cnice_C.dll, Primitivas_CNICE_C.hpp y Primitivas_CNICE_C.cpp) pueden
encontrarse en la carpeta DLL del archivo comprimido primiticas_c.zip.

El ordenador como elemento de control

Instituto de Tecnologas Educativas

CMO CREAR UN PROYECTO PARA GENERAR UNA LIBRERA


DINMICA. ARCHIVOS FUENTE.
A continuacin se va a explicar paso a paso cmo se ha creado el proyecto con el que se ha conseguido la
librera dinmica para las primitivas.
Se abre un proyecto nuevo en el men File New Proyect... Se elige el tipo de proyecto DLL [.dll], el
nombre para el proyecto (Primitivas_CNICE) y se pulsa el botn OK.

Se elige el directorio de destino donde se va a crear el proyecto y se pulsa el botn Guardar.

Funcionamiento Programacin Primitivas C

Interfaz de control de dispositivos externos por ordenador a travs de puerto paralelo

Los proyectos en Dev- C++ tienen la extensin .dev, en este caso se llamar Primitivas_CNICE.dev.
El proyecto se crea inicialmente con los archivos primitivas_cnice.cpp y primitivas_cnice.hpp vacos. Se
han tenido que crear los archivos primitivas_cnice.cpp y primitivas_cnice.hpp (el otro se deja como est).
El fichero primitivas_cnice.hpp contiene las definiciones de las funciones que exporta la librera dinmica
y el fichero primitivas_cnice.cpp contiene la implementacin de cada una de las funciones y
procedimientos de la librera.

Una vez creado el esqueleto del proyecto se deben aadir los archivos necesarios, en este caso el archivo
io.cpp para importar la librera dinmica que permite el acceso a los puertos del equipo (io.dll). Se
recomienda que los archivos que se van a aadir a un proyecto estn situados en la misma carpeta que el
proyecto.
Para aadir un archivo existente a un proyecto en Dev-C++ se debe seleccionar con el ratn cualquiera de
las archivos que ya forman parte del proyecto y pulsar el botn derecho para que aparezca un men
emergente. En este men se seleccionar la opcin de Add to Project.

El ordenador como elemento de control

Instituto de Tecnologas Educativas

Una vez hecho esto se nos mostrar una ventana en la que seleccionaremos el archivo que queremos aadir.

Funcionamiento Programacin Primitivas C

Interfaz de control de dispositivos externos por ordenador a travs de puerto paralelo

Ya solo queda dejar en la misma carpeta donde se tienen los ficheros del proyecto los archivos
Primitivas_CNICE.HPP e io.h que no se aaden al proyecto pero es necesario que estn accesibles.
Para generar la librera dinmica ya slo queda compilar y construir el proyecto.
Estos archivos se encuentran en la carpeta C\Codigo_Fuente_DLL.

UTILIZACIN DE LAS PRIMITIVAS DE LA CONTROLADORA CNICE CON


EL LENGUAJE C EN UN PROYECTO
Aunque ya se ha explicado anteriormente, por si todava no ha quedado claro para utilizar en un programa
la librera dinmica que contiene a las primitivas se deben seguir los siguientes pasos:
1. Lo primero es crear un proyecto nuevo en el men File New Proyect... Se elige el tipo de proyecto
Console Application, el modo consola o aplicacin grfica (Windows Application), se marca C
Project, se pone el nombre del proyecto y se pulsa el botn OK. Se busca la ruta donde se quiere
almacenar el proyecto y por ltimo se pulsa el botn Guardar.
2. Una vez hecho lo anterior se generar un archivo con extensin .dev (proyecto) y otro con extensin .c
que es el main de nuestro proyecto.
3. Dejar en la carpeta donde se est generando el proyecto los archivos:
Primitivas_CNICE_C.hpp
Primitivas_CNICE_C.cpp
Primitivas_CNICE_C.dll (este archivo opcionalmente puede estar en C:\WINDOWS\system32)
io.h
io.cpp
io.dll (esta librera opcionalmente puede estar en C:\WINDOWS\system32)
4. Agregar al proyecto los archivos Primitivas_CNICE_C.cpp e io.cpp.
5. Implementar el programa de usuario. No olvidar que lo primero que se debe hacer es llamar a la funcin
LoadPrimitivasDLL y en los ficheros en los que se utilice las primitivas, incluido el programa principal, se
debe incluir el fichero de cabecera Primitivas_CNICE_C.hpp con la instruccin:
#include "Primitivas_CNICE_C.hpp"

El ordenador como elemento de control

Instituto de Tecnologas Educativas

DESCRIPCIN DE LAS PRIMITIVAS


Salidas digitales
M1(cadena);
Procedimiento que hace girar o para un motor conectado a las salidas digitales S0-S1. El parmetro cadena
es un carcter que indica en qu sentido debe girar el motor (izquierda -I- o derecha -D-) o si debe parar
(P).
M1 ('I');
M1 ('D');
M1 ('P');
M_INT((char*)vector_m);
Procedimiento que rellena el vector de 4 elementos vector_m con el estado de los 4 actuadores/motores (I,
D P). Para emplear este procedimiento se debe haber reservado memoria para el valor devuelto.
char vector_motores[4];
M_INT((char*)vector_motores);
printf("v[0] v[1] v[2] v[3]: %c %c %c %c\n",
vector_motores[0],
vector_motores[1],
vector_motores[2],
vector_motores[3]);
M((char*) vector_motores);
Procedimiento que permite activar/desactivar todos los motores simultneamente. El
parmetro vector_motores tiene que ser un vector de 4 elementos.
char v_motor[4];
v_motor[0] = 'I';
v_motor[1] = 'D';
v_motor[2] = 'P';
v_motor[3] = 'D';
M((char*)v_motor);
CONECTADO_INT((char*)vector_motores);
Procedimiento que rellena el vector de 4 elementos vector_motores con el estado de los 4
actuadores/motores (1 si el motor est activado 0 si est desactivado). Para emplear este procedimiento se
debe haber reservado memoria para el valor devuelto.
char v_motores[4];
CONECTADO_INT((char*)v_motores);
printf("v[0] v[1] v[2] v[3]: %i %i %i %i\n",
v_motores[0],
v_motores[1],
v_motores[2],
v_motores[3]);

Funcionamiento Programacin Primitivas C

Interfaz de control de dispositivos externos por ordenador a travs de puerto paralelo

SALIDA(num);
Procedimiento que activa/desactiva individualmente o en conjunto cada una de las 8 salidas digitales.
El parmetro num es un nmero decimal equivalente al nmero binario que se enva a las salidas
digitales.
SALIDA(170);
EnviaOcteto(dato);
Procedimiento similar a la primitiva SALIDA.
EnviaOcteto(85);
APAGA(n);
Procedimiento que desconecta la salida digital que se le indique en el parmetro n que ser un nmero
comprendido entre 1 y 8.
APAGA(2);
SALIDA_INT((int*)v_salidas);
Procedimiento que rellena el vector v_salidas con el estado de las ocho salidas digitales (1s 0s). Para
emplear este procedimiento se debe haber reservado memoria para el valor devuelto .
SALIDA_INT((int*)v_salidas);
printf("v[0] v[1] v[2] v[3] v[4] v[5] v[6] v[7]: %i %i %i %i %i %i %i %i\n",
v_salidas[0],
v_salidas[1],
v_salidas[2],
v_salidas[3],
v_salidas[4],
v_salidas[5],
v_salidas[6],
v_salidas[7]);
CONECTA(num);
Procedimiento que conecta la salida digital indicada en el parmetro num.
CONECTA(8);
DESCONECTA(num);
Procedimiento que desconecta la salida digital indicada en el parmetro num.
DESCONECTA(8);
CONECTAR();
Procedimiento que conecta las
CONECTAR
DESCONECTAR();
Procedimiento que desconecta
DESCONECTAR

las

salidas digitales.

salidas

digitales.

VS_INT();
Funcin que devuelve un nmero decimal que indica qu salidas digitales estn activadas.
int resultado;
resultado = VS_INT();
printf(Valor de las salidas digitales: %i\n, resultado);

El ordenador como elemento de control

Instituto de Tecnologas Educativas

segundos(tiempo);
Procedimiento que produce un retardo o espera de tantos segundos como se le indique en el parmetro
tiempo.
segundos(5.5);

Entradas digitales
entrada(n);
Funcin que devuelve True si la entrada digital indicada en n est conectada o False en caso contrario.
bool ent;
ent = entrada(1);
printf("Valor de la entrada digital 1: %b\n",ent);
VE_INT();
Funcin que devuelve un nmero decimal que indica qu entradas digitales estn activadas.
int entradas; entradas = VE_INT();
printf("Valor de las entradas digitales: %i\n",entradas);
SD(entrada);
Funcin que devuelve el valor del sensor digital expresado en el parmetro entrada (0 1).
int entrada;
entrada = SD(1);
printf("Valor de la entrada digital 1: %i\n",entrada);
SD_INT((int*)v_entradas);
Procedimiento que rellena el vector v_entradas con el estado de los ocho sensores digitales (0s 1s). Para
emplear este procedimiento se debe haber reservado memoria para el valor devuelto.
int v_entradas[8];
SD_INT((int*)v_entradas);
printf("v[0] v[1] v[2] v[3] v[4] v[5] v[6] v[7]: %i %i %i %i %i %i %i %i\n",
v_entradas[0], v_entradas[1], v_entradas[2], v_entradas[3], v_entradas[4], v_entradas[5],
v_entradas[6], v_entradas[7]);
EsperaOn(entrada);
Procedimiento que deja el programa a la espera de que se active la entrada digital indicada en el parmetro
entrada.
EsperaOn(1);
EsperaOff(entrada);
Procedimiento que deja el programa a la espera de que se desactive la entrada digital indicada en el
parmetro entrada.
EsperaOff(1);

Entradas analgicas
leeanalogica(dato);
Funcin que devuelve el valor de 8 bits de la entrada analgica especificada en el nmero
dato (1, 2, 3 4). El valor devuelto oscila entre 0 y 255.

Funcionamiento Programacin Primitivas C

Interfaz de control de dispositivos externos por ordenador a travs de puerto paralelo

int entanalog;
entanalog = leeanalogica(1);
printf("Valor de la entrada analogica 1: %i\n", entanalog);
SAW();
Funcin que devuelve el valor en voltios del sensor analgico conectado a la entrada
analgica IN0.
int entanalog;
entanalog = SAW();
printf("Valor de la entrada analogica 1: %i\n", entanalog);
SAX();
Funcin que devuelve el valor en voltios del sensor analgico conectado a la entrada
analgica IN1.
int entanalog;
entanalog = SAX();
printf("Valor de la entrada analogica 2: %i\n", entanalog);
SAY();
Funcin que devuelve el valor en voltios del sensor analgico conectado a la entrada
analgica IN2.
int entanalog;
entanalog = SAY();
printf("Valor de la entrada analogica 3: %i\n", entanalog);
SAZ();
Funcin que devuelve el valor en voltios del sensor analgico conectado a la entrada
analgica IN3.
int entanalog;
entanalog = SAZ();
printf("Valor de la entrada analogica 4: %i\n", entanalog);

SA_INT((int*)v_analogicas);
Procedimiento que rellena el vector v_analogicas con el valor (voltios) de los 4 sensores analgicos.
Para emplear este procedimiento se debe haber reservado memoria para el valor devuelto.
int v_analogicas[4];
SA_INT((int*)v_analogicas);
printf("v[0] v[1] v[2] v[3]: %i %i %i %i\n",
v_analogicas[0],
v_analogicas[1],
v_analogicas[2],
v_analogicas[3]);

El ordenador como elemento de control

10

Instituto de Tecnologas Educativas

DIFERENCIAS ENTRE LAS PRIMITIVAS EN MSWLOGO Y C

MSWLogo
M1 I
M?
M :lista
CONECTADO?
SALIDA?
VS?
SALIDA num APAGA n
CONECTAR . . .

C
M1(I);
M_INT((char*)vector_m);
M((char*)vector);
CONECTADO_INT((char*)vector_m) ;
SALIDA_INT((int*)vector_s);
VS_INT();
SALIDA(num); APAGA(n);
CONECTAR(); . . .

entrada :n
VE?
SD :entrada
SD?

entrada(n);
VE_INT();
SD(entrada);
SD_INT((int*)vector_e);

leeanalogica :dato
SA?

leeanalogica(dato);
SA_INT((int*)vector_a);

Funcionamiento Programacin Primitivas C

11