Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manuales Referencial Del Programador de FielPoint
Manuales Referencial Del Programador de FielPoint
DOCUMENTO N 2
JUNIO 2005
-i-
ndice
1 .- Introduccin ................................................................................... 1 1.1 .- Identificacin del proyecto ...................................................... 1 1.2 .- Visin general del documento .................................................. 1 1.3 .- El puerto serie en Linux .......................................................... 2 1.3.1 .- Conceptos de entrada para dispositivos serie ................... 5 1.3.1.1 .- Proceso de entrada cannico................................ 5 1.3.1.2 .- Proceso de entrada no cannico ........................... 5 1.3.1.3 .- Entrada asncrona .............................................. 5 1.3.1.4 .- Espera de entradas de origen mltiple................... 6 1.3.2 .- Configuracin del puerto serie en Linux ........................... 6 1.3.2.1 .- Opciones de control ...........................................10 1.3.2.2 .- Opciones locales ...............................................12 1.3.2.3 .- Opciones de entrada..........................................13 1.3.2.4 .- Opciones de salida ............................................14 1.3.2.5 .- Caracteres de control.........................................15 1.3.3 .- Implementacin realizada ............................................16 1.3.3.1 .- Abrir_Puerto_Serie ............................................18 1.3.3.2 .- Cerrar_Puerto_Serie ..........................................19 1.3.3.3 .- Baudios ...........................................................19 1.3.3.4 .- Enviar_Datos ....................................................20 1.3.3.5 .- Leer_Datos ......................................................20 1.3.3.6 .- Leer_Datos_Plazo..............................................21 1.3.3.7 .- Get_fd .............................................................21 1.3.3.8 .- Get_Velocidad ..................................................22 1.3.3.9 .- Get_Puerto.......................................................22 2 .- FieldPoint, manual del programador ..................................................23 2.1 .- Protocolo de comunicacin .....................................................23 2.1.1 .- Formato de las tramas FieldPoint...................................23 2.1.2 .- Respuestas de los mdulos FieldPoint ............................25 2.1.2.1 .- Respuestas de xito ..........................................25 2.1.2.2 .- Respuestas de error ..........................................25
- ii -
2.2 .- Implementacin del driver .....................................................26 2.2.1 .- Conceptos previos: el bus local .....................................27 2.2.2 .- Cdigo C....................................................................28 2.2.2.1 .- Estructuras y variables utilizadas.........................28 2.2.2.2 .- Funciones locales ..............................................33 2.2.2.3 .- Funciones globales ............................................35 2.2.3 .- Cdigo Ada ................................................................37 2.2.4 .- Descripcin de las funciones .........................................38 NI_Inicializar ..................................................................38 NI_Liberar......................................................................39 NI_EscribeLinea_DO ........................................................39 NI_EscribeModulo_DO......................................................40 NI_LeeLinea_DI ..............................................................40 NI_LeeModulo_DI............................................................41 ObtenerError ..................................................................42 ObtenerErrorString ..........................................................42 Num_Lineas ...................................................................43 Num_Modulos.................................................................43 Get_Tipo ........................................................................44 Get_Nombre...................................................................44 Get_Id...........................................................................45 Get_Direccion .................................................................45 2.3 .- Anexo A: FieldPoint Commands ..............................................46 Comandos utilizados ...............................................................49 2.4 .- Anexo B: FieldPoint Responses ...............................................56 3 .- NuDAM, manual del programador .....................................................59 3.1 .- Protocolo de comunicacin .....................................................59 3.1.1 .- Formato de las tramas.................................................59 3.1.2 .- Respuestas de los mdulos NuDAM................................60 3.2 .- Implementacin del driver .....................................................61 3.2.1 .- Conceptos previos: el bus local .....................................62 3.2.2 .- Cdigo C....................................................................63 3.2.2.1 .- Estructuras y variables utilizadas.........................63 3.2.2.2 .- Funciones locales ..............................................67
- iii -
3.2.2.3 .- Funciones globales ............................................69 3.2.3 .- Cdigo Ada ................................................................71 3.2.4 .- Descripcin de las funciones .........................................72 ND_Inicializar .................................................................72 ND_Liberar.....................................................................73 ND_EscribeLinea_DO .......................................................73 ND_EscribePuerto_DO......................................................74 ND_EscribeModulo_DO.....................................................75 ND_LeeLinea_DI .............................................................76 ND_LeeModulo_DI...........................................................77 ObtenerError ..................................................................78 ObtenerErrorString ..........................................................78 Num_Lineas ...................................................................79 Num_Modulos.................................................................79 Get_Tipo ........................................................................80 Get_Nombre...................................................................81 Get_Id...........................................................................81 Get_Direccion .................................................................82 3.3 .- Anexo A: Command Set (digital I/O modules)...........................83 Comandos utilizados ...............................................................85 4 .- LabJack U12, manual del programador ..............................................92 4.1 .- Implementacin del driver .....................................................92 4.1.1 .- Conceptos previos.......................................................92 4.1.2 .- Cdigo C....................................................................92 4.1.2.1 .- Estructuras y variables utilizadas.........................92 4.1.2.2 .- Funciones locales ..............................................94 4.1.2.3 .- Funciones globales ............................................94 4.1.3 .- Cdigo Ada ................................................................96 4.1.4 .- Descripcin de las funciones .........................................97 LJ_Inicializar ..................................................................97 LJ_EscribeLinea_DO.........................................................98 LJ_EscribeModulo_DO ......................................................98 LJ_LeeLinea_DI...............................................................99 LJ_LeeModulo_DI .......................................................... 100
- iv -
LJ_EscribeLinea_AO ....................................................... 101 ObtenerError ................................................................ 101 ObtenerErrorString ........................................................ 102 4.2 .- Anexo A: Descripcin de las funciones propias del fabricante .... 103 4.3 .- Anexo B: Description of errorcodes ....................................... 106
-v-
Listado de Tablas
Tabla 1.1 Asociacin de puertos serie a ficheros de dispositivo .................... 2 Tabla 1.2 Miembros de la estructura termios ............................................ 6 Tabla 1.3 Constantes para el miembro c_cflag .........................................11 Tabla 1.4 Constantes para el miembro c_lflag..........................................12 Tabla 1.5 Constantes para el miembro c_iflag..........................................13 Tabla 1.6 Constantes para el miembro c_oflag.........................................14 Tabla 1.7 Caracteres de control para el miembro c_cc ..............................15 Tabla 2.1 Ejemplo de asignacin de direcciones en el bus local ..................27 Tabla 2.2 Variables de error ..................................................................29 Tabla 2.3 Standard FieldPoint Commands and Syntax ...............................46 Tabla 2.4 Extended FieldPoint Commands and Syntax...............................47 Tabla 2.5 Standard Error Responses.......................................................57 Tabla 2.6 Extended Error Responses ......................................................58 Tabla 3.1 Ejemplo de asignacin de direcciones en el bus local ..................62 Tabla 3.2 Variables de error ..................................................................64 Tabla 3.3 Command set of digital I/O modules.........................................84
- vi -
Listado de ejemplos
Ejemplo 1.1 Utilizacin de la llamada al sistema open ................................ 3 Ejemplo 1.2 Utilizacin de la llamada al sistema write................................ 4 Ejemplo 1.3 Utilizacin de la llamada al sistema read ................................ 4 Ejemplo 1.4 Utilizacin de las funciones de configuracin del puerto ............ 9 Ejemplo 2.1 Interfaz C-Ada ...................................................................37 Ejemplo 3.1 Interfaz C-Ada ...................................................................71 Ejemplo 4.1 Interfaz C-Ada ...................................................................96
Pgina 1 de 107
1.- Introduccin
1.1.- Identificacin del proyecto
Ttulo: Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
Autor:
Fecha:
Junio 2005
Previamente al desarrollo de cada uno de los manuales, se muestra en la Introduccin los conceptos necesarios sobre programacin del puerto serie en Linux. Dado que la implementacin realizada para acceder al puerto serie es prcticamente igual para los mdulos FieldPoint y NuDAM, tambin se incluye en la Introduccin la explicacin de sta, as como las diferencias que existen entre ambos sistemas cuando se desea realizar la configuracin del puerto.
Pgina 2 de 107
Se incluyen en el documento tres manuales: FieldPoint, manual del programador (epgrafe 2) Manual del programador de la librera desarrollada para el sistema FieldPoint de la empresa National Instruments.
NuDAM, manual del programador (epgrafe 3) Manual del programador de la librera desarrollada para el sistema NuDAM de la empresa ADLink Technology.
LabJack U12, manual de usuario (epgrafe 4) Manual del programador de la librera desarrollada para la Tarjeta de Adquisicin de Datos LabJack U12 de la empresa LabJack.
Para acceder al puerto nicamente es necesario abrir el fichero asociado mediante la llamada al sistema open. Se debe tener en cuenta que, en Linux, los ficheros asociados a los dispositivos no suelen tener permiso de acceso para los usuarios.
Pgina 3 de 107
Para evitar este problema existen varias soluciones: Cambiar los permisos del fichero/s asociado al dispositivo y dar permisos de lectura y escritura a los usuarios.
Se debe indicar el fichero que se desea abrir y las opciones de apertura necesarias. Estas opciones se indican mediante el uso de constantes definidas por el operativo. Para obtener una descripcin detallada de todas las opciones existentes ejecute man 2 open en su consola. La funcin retorna un nmero negativo si no se pudo abrir el fichero indicado. Si el fichero se abri correctamente, se retorna un descriptor de fichero (un entero no negativo que se utiliza en las operaciones de E/S posteriores, como en read, write, etc.).
En el Ejemplo 1.1 se muestra el uso de la llamada al sistema open. La opcin O_RDWR indica que el fichero /dev/ttyS1 (fichero asociado al puerto COM2) se debe abrir en modo lectura y escritura. La opcin O_NOCTTY indica que el fichero no se abrir como controlador de terminal tty. Si no se especifica esta opcin una seal de finalizacin (abort) enviada por la lnea finalizara la ejecucin.
strcpy(_puerto,"/dev/ttyS1"); _fd = open (_puerto, O_RDWR | O_NOCTTY); if (_fd < 0) { // No se pudo abrir el puerto
return _fd; }
Pgina 4 de 107
Escribe hasta num bytes en el fichero referenciado por el descriptor de fichero fd desde el bfer que comienza en buf. En el Ejemplo 1.2 se puede ver una forma de uso. Para obtener ms informacin sobre esta llamada al sistema, acuda a la ayuda en lnea de su operativo: man 2 write.
int Enviar_Datos(const char * comando){ ssize_t escribo; //comprobamos que existe un descriptor de fichero valido if (_fd < 0) return (-2);
Intenta leer hasta nbytes bytes del fichero cuyo descriptor de fichero es fd y guardarlos en la zona de memoria que empieza en buf. En el Ejemplo 1.2 se puede ver una forma de uso. La llamada al sistema read, no finaliza el buffer donde deposita los datos con el ASCII nulo. Es por ello, que esta tarea se hace explcitamente: buffer[leo]='\0'; . Para obtener ms informacin sobre esta llamada al sistema, acuda a la ayuda en lnea de su operativo: man 2 read.
int Leer_Datos(char * buffer, int length){ ssize_t leo;
//comprobamos que existe un descriptor de fichero valido if (_fd < 0) return (-2);
leo = read (_fd, buffer, length); buffer[leo]='\0'; //ponemos el caracter nulo de final return leo; }
Pgina 5 de 107
El proceso de entrada cannica tambin puede manejar los caracteres borrado, borrado de palabra, reimprimir carcter, traducir CR a NL, etc.
Modo asncrono: la sentencia read devolver inmediatamente y enviar una seal al programa llamador cuando est completa. Esta seal puede ser recibida por un manejador de seales que la tratar adecuadamente.
Pgina 6 de 107
En el epgrafe 3.4 del documento Cmo programar el puerto serie en Linux se puede obtener ms informacin sobre este modo de entrada.
En el archivo de cabecera <termios.h> se definen las estructuras y funciones necesarias para llevar a cabo la configuracin del puerto serie. La estructura ms importante es la estructura termios formada por los miembros mostrados en la Tabla 1.2.
Descripcin Opciones de control Opciones locales Opciones de entrada Opciones de salida Caracteres de control Velocidad (baudios) de entrada Velocidad (baudios) de salida
Pgina 7 de 107
Las funciones que se utilizarn para llevar a cabo la configuracin del puerto serie son: tcgetattr: Se utiliza para obtener los parmetros actuales del puerto. int tcgetattr ( int fd, struct termios *termios_p ); Obtiene los parmetros asociados con el objeto referido por fd y los guarda en la estructura termios referenciada por termios_p.
Establece los parmetros de la terminal con descriptor de fichero fd, desde la estructura termios referenciada por termios_p. El argumento
optional_actions especifica cundo tienen efecto los cambios: TCSANOW: El cambio ocurre inmediatamente. TCSADRAIN: El cambio ocurre despus de que toda la salida escrita a fd haya sido transmitida. Esta funcin debera emplearse cuando se cambien parmetros que afecten a la salida. TCSAFLUSH: El cambio ocurre despus de que toda la salida escrita al objeto referenciado por fd haya sido transmitida, y toda la entrada que se haya recibido pero no ledo ser descartada antes de que se haga el cambio.
Descarta datos escritos al objeto referido por fd pero no transmitidos, o datos recibidos pero no ledos, dependiendo del valor de queue_selector: TCIFLUSH: Vuelca datos recibidos pero no ledos. TCOFLUSH: Vuelca datos escritos pero no transmitidos. TCIOFLUSH: Vuelca tanto los datos recibidos pero no ledos, como los escritos pero no transmitidos.
Pgina 8 de 107
Establece la velocidad de salida, guardada en la estructura termios apuntada por termios_p, a speed, que debe ser una de estas constantes: B0, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400. Los nuevos valores no hacen efecto hasta que se llame con xito a tcsetattr().
Establece la velocidad de entrada, guardada en la estructura termios apuntada por termios_p, a speed, que debe ser una de estas constantes: B0, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400. Si la velocidad de entrada se pone a cero, entonces ser igual a la de salida. Los nuevos valores no hacen efecto hasta que se llame con xito a tcsetattr().
En el Ejemplo 1.4 se puede ver un fragmento de cdigo que muestra la utilizacin de alguna de las funciones comentadas.
Manuales del programador //VARIABLES GLOBALES char _puerto [15]; int _npuerto = -2; int _velocidad = -2; int _fd = -2; struct termios _oldtio, _newtio; int Baudios (int vel) { speed_t baud;
Pgina 9 de 107
//comprobamos que existe un descriptor de fichero valido if (_fd < 0) return (-2);
switch(vel) { case 300 case 1200 case 2400 case 9600 case 19200 case 38400 case 57600 : baud=B300; : baud=B1200; : baud=B2400; : baud=B9600; : baud=B19200; : baud=B38400; : baud=B57600; _velocidad=vel; break; _velocidad=vel; break; _velocidad=vel; break; _velocidad=vel; break; _velocidad=vel; break; _velocidad=vel; break; _velocidad=vel; break;
cfsetospeed(&_newtio,baud); cfsetispeed(&_newtio,baud);
Pgina 10 de 107
La velocidad de comunicacin admite varias posibilidades de configuracin, que dependen del sistema operativo. En implementaciones antiguas se emplea el miembro c_cflag mediante las constantes definidas en la Tabla 1.3. En las nuevas implementaciones, se han definido dos miembros nuevos, c_ispeed y c_ospeed. Como ya se ha visto, existen dos llamadas al sistema operativo que permiten llevar a cabo la configuracin de la velocidad de comunicacin, cfsetospeed y cfsetispeed (Ejemplo 1.4).
Pgina 11 de 107
Constante CBAUD B0 B50 B75 B110 B134 B150 B200 B300 B600 B1200 B1800 B2400 B4800 B9600 B19200 B38400 B57600 B76800 B115200 EXTA EXTB CSIZE CS5 CS6 CS7 CS8 CSTOPB CREAD PARENB PARODD HUPCL CLOCAL LOBLK CNEW_RTSCTS CRTSCTS
Descripcin Bit mask for baud rate 0 baud (drop DTR) 50 baud 75 baud 110 baud 134.5 baud 150 baud 200 baud 300 baud 600 baud 1200 baud 1800 baud 2400 baud 4800 baud 9600 baud 19200 baud 38400 baud 57,600 baud 76,800 baud 115,200 baud External rate clock External rate clock Bit mask for data bits 5 data bits 6 data bits 7 data bits 8 data bits 2 stop bits (1 otherwise) Enable receiver Enable parity bit Use odd parity instead of even Hangup (drop DTR) on last close Local line do not change "owner" of port Block job control output Enable hardware flow control (not supported on all platforms)
Pgina 12 de 107
Constante ISIG ICANON XCASE ECHO ECHOE ECHOK ECHONL NOFLSH IEXTEN ECHOCTL ECHOPRT ECHOKE FLUSHO PENDIN TOSTOP
Descripcin Enable SIGINTR, SIGSUSP, SIGDSUSP, SIGQUIT signals Enable canonical input (else raw) Map uppercase \lowercase (obsolete) Enable echoing of input characters Echo erase character as BSSPBS Echo NL after kill character Echo NL Disable flushing of input buffers after interrupt or quit characters Enable extended functions Echo control characters as ^char and delete as ~? Echo erased character as character erased BSSPBS entire line on line kill Output being flushed Retype pending input at next read or input char Send SIGTTOU for background output and
Pgina 13 de 107
Constante INPCK IGNPAR PARMRK ISTRIP IXON IXOFF IXANY IGNBRK BRKINT INLCR IGNCR ICRNL IUCLC IMAXBEL
Descripcin Enable parity check Ignore parity errors Mark parity errors Strip parity bits Enable software flow control (outgoing) Enable software flow control (incoming) Allow any character to start flow again Ignore break condition Send a SIGINT when a break condition is detected Map NL to CR Ignore CR Map CR to NL Map uppercase to lowercase Echo BEL on input line too long
Pgina 14 de 107
Constante OPOST OLCUC ONLCR OCRNL NOCR ONLRET OFILL OFDEL NLDLY NL0 NL1 CRDLY CR0 CR1 CR2 CR3 TABDLY TAB0 TAB1 TAB2 TAB3 BSDLY BS0 BS1 VTDLY VT0 VT1 FFDLY FF0 FF1
Descripcin Postprocess output (not set = raw output) Map lowercase to uppercase Map NL to CRNL Map CR to NL No CR output at column 0 NL performs CR function Use fill characters for delay Fill character is DEL Mask for delay time needed between lines No delay for NLs Delay further output after newline for 100 milliseconds Mask for delay time needed to return carriage to left column No delay for CRs Delay after CRs depending on current column position Delay 100 milliseconds after sending CRs Delay 150 milliseconds after sending CRs Mask for delay time needed after TABs No delay for TABs Delay after TABs depending on current column position Delay 100 milliseconds after sending TABs Expand TAB characters to spaces Mask for delay time needed after BSs No delay for BSs Delay 50 milliseconds after sending BSs Mask for delay time needed after VTs No delay for VTs Delay 2 seconds after sending VTs Mask for delay time needed after FFs No delay for FFs Delay 2 seconds after sending FFs
Pgina 15 de 107
Los elementos VSTART y VSTOP contienen los caracteres utilizados para el control de flujo de datos por software. Normalmente se emplean DC1 (021 octal) y DC3 (023 octal) que representan los caracteres XON y XOFF en el estndar ASCII.
Para establecer los timeouts se utilizan los elementos VMIN y VTIME. Mediante VMIN se especifica el nmero mnimo de caracteres a leer. En funcin del valor de VMIN, VTIME tiene uno u otro significado: Si VMIN es cero, el valor de VTIME especifica el tiempo que se ha de esperar para todas las lecturas. Si VMIN es distinto de cero, el valor de VTIME especifica el tiempo que se ha de esperar hasta la llegada del primer carcter. Si un carcter llega antes de cumplirse el tiempo, la lectura se bloquear hasta que lleguen el nmero de caracteres indicados en VMIN. Si no llega ningn carcter en el tiempo especifico, la llamada a la funcin de lectura retornar cero. Esta forma de utilizar los elementos VMIN y VTIME permite indicarle al driver que deseamos hacer lecturas de N bytes, de manera que un llamada a la funcin read retornar cero o los N bytes indicados en VMIN.
Constante VINTR VQUIT VERASE VKILL VEOF VEOL VEOL2 VMIN VSTART VSTOP VTIME Interrupt Quit Erase Killline Endoffile Endofline Second endofline Minimum number of characters to read Start flow Stop flow Time to wait for data (tenths of seconds) Descripcin Clave CTRLC CTRLZ Backspace (BS) CTRLU CTRLD Carriage return (CR) Line feed (LF) CTRLQ (XON) CTRLS (XOFF)
Pgina 16 de 107
Este cdigo se ha desarrollado para poder comunicarse con los dispositivos FieldPoint y NuDAM. La implementacin realizada es prcticamente comn para ambos. nicamente se diferencia en los parmetros de configuracin del puerto serie: Los parmetros de configuracin ms importantes a tener en cuenta para los mdulos FieldPoint son: El formato de las tramas: 8 bits de datos, 1 bit de parada, sin paridad. El control del flujo de datos: control por hardware.
Los parmetros de configuracin ms importantes a tener en cuenta para los mdulos NuDAM son: El formato de las tramas: 8 bits de datos, 1 bit de parada, sin paridad. El control del flujo de datos: NO existe control por hardware.
Nmero del puerto identificado por las macros COM1 y COM2. Estas macros estn definidas en el archivo ComPort.h y deben ser utilizadas para llamar a la funcin Abrir_Puerto_Serie () y para comprobar el valor devuelto por Get_Puerto ().
Pgina 17 de 107
Descriptor del fichero asociado al puerto una vez que se ha abierto. Para ejecutar gran parte de las funciones se comprueba previamente que exista un descriptor de fichero vlido. Es por ello que se inicializa con un valor negativo.
A continuacin se ofrece una descripcin detallada de cada una de las funciones, incluyendo la estructura interna de cada una de ellas.
Pgina 18 de 107
1.3.3.1.- Abrir_Puerto_Serie
Descripcin Esta funcin abre el puerto serie con la configuracin adecuada. La estructura de la funcin es la siguiente: Se abre el fichero asociado al puerto. Se obtiene la configuracin actual del puerto. Este valor se utilizar para restaurar el puerto a su estado original cuando se cierre. Se configura el puerto mediante los distintos miembros de la estructura termios. La configuracin ha de ser acorde con las caractersticas de los mdulos. En este punto es donde se diferencian las dos implementaciones de acceso al puerto serie para los sistemas FieldPoint y NuDAM. Se activa la configuracin del puerto realizada. Se establece la velocidad de comunicacin. Si falla alguno de los pasos anteriores, se retornar un estado de error. Sintaxis
int Abrir_Puerto_Serie (int puerto, int velocidad);
Argumentos Puerto: Puerto serie del PC que se desea abrir. Se deben utilizar las
macros COM1 y COM2 definidas. Velocidad: Velocidad del puerto serie a la que se va a llevar a cabo la
comunicacin. Los valores permitidos son: 300, 1200, 2400, 9600, 19200, 28400, 57600, 115200. Si se indica un valor distinto a estos se producir un error. Valor retornado -1 en caso de error. El valor del descriptor de fichero retornado por la funcin open si todo fue correcto.
Pgina 19 de 107
1.3.3.2.- Cerrar_Puerto_Serie
Descripcin Esta funcin cierra el puerto serie. La estructura de la funcin es la siguiente: Se restaura la configuracin original del puerto. Se cierra el fichero asociado al puerto. Si falla alguno de los pasos anteriores se retornar un estado de error. Sintaxis
int Cerrar_Puerto_Serie (void);
Valor retornado 0 si todo fue correcto. -1 en caso de error. -2 si no existe un descriptor de fichero vlido.
1.3.3.3.- Baudios
Descripcin Esta funcin configura la velocidad de comunicacin del puerto. Sintaxis
int Baudios (int vel);
comunicacin. Los valores permitidos son: 300, 1200, 2400, 9600, 19200, 28400, 57600, 115200. Si se indica un valor distinto a estos se producir un error. Valor retornado La velocidad a la que se ha configurado el puerto si todo fue correcto. -1 en caso de error. -2 si no existe un descriptor de fichero vlido.
Pgina 20 de 107
1.3.3.4.- Enviar_Datos
Descripcin Enva el comando que se le pasa como argumento al puerto serie. Sintaxis
int Enviar_Datos (const char * comando);
Argumentos Comando: Cadena que contiene la informacin a enviar a travs del puerto.
Valor retornado El nmero de bytes enviados si todo fue correcto. -1 en caso de error. -2 si no existe un descriptor de fichero vlido.
1.3.3.5.- Leer_Datos
Descripcin Esta funcin lee length caracteres del puerto serie y los retorna en la cadena apuntada por buffer. Si no existen datos para leer en el puerto, esta funcin se quedar bloqueada. Sintaxis
int Leer_Datos(char * buffer, int length);
Length: Numero de caracteres que se desean leer. Valor retornado El nmero de bytes ledos si todo fue correcto. -1 en caso de error. -2 si no existe un descriptor de fichero vlido.
Pgina 21 de 107
1.3.3.6.- Leer_Datos_Plazo
Descripcin Esta funcin lee length caracteres del puerto serie y los retorna en la cadena apuntada por buffer. Si en el momento de la llamada no existen caracteres a leer en el puerto, la funcin se quedar bloqueada durante plazo
microsegundos. Transcurrido este tiempo, si no se ha llevado a cabo la lectura retornar un cdigo de error. Sintaxis
int Leer_Datos_Plazo (char * buffer, int length, int plazo);
Length: Nmero de caracteres que se desean leer. Plazo: El tiempo de plazo para leer la informacin (en microsegundos).
Valor retornado El nmero de bytes ledos si se ley con xito en el plazo indicado. -3 si no se ha podido leer ningn byte en el plazo indicado. -2 si no existe un descriptor de fichero vlido.
1.3.3.7.- Get_fd
Descripcin Esta funcin retorna el valor del descriptor de fichero asociado al puerto. Sintaxis
int Get_fd (void);
Valor retornado El descriptor de fichero asociado. Un valor negativo indica que el descriptor de fichero no es vlido.
Pgina 22 de 107
1.3.3.8.- Get_Velocidad
Descripcin Esta funcin retorna la velocidad de comunicacin del puerto. Sintaxis
int Get_Velocidad (void);
Valor retornado La velocidad de comunicacin a la que est configurado el puerto. Un valor negativo indica una configuracin errnea del puerto.
1.3.3.9.- Get_Puerto
Descripcin Esta funcin retorna el nmero que identifica el puerto utilizado. Sintaxis
int Get_Puerto (void);
Valor retornado El puerto utilizado identificado por las macros COM1 y COM2 definidas. Un valor negativo indica que no se ha inicializado el puerto.
Pgina 23 de 107
Programmer Reference Manual, explica en detalle el protocolo que siguen los mdulos FieldPoint.
En el epgrafe 2.3, se pueden consultar las tablas resumen de todos los comandos que soportan los mdulos FieldPoint y los detalles de los comandos utilizados para implementar el driver.
[start]
[address]
Dos caracteres ASCII en hexadecimal. Tras el campo [start], todas las tramas deben especificar la direccin del mdulo a quien va dirigido. Este campo ha de tener un valor entre 00 y F9 para redes construidas con los mdulos de red FP-1000 y FP-1001.
[command]
Este campo es el cuerpo de la trama. Se subdivide en cuatro campos, algunos de los cuales no se utilizan siempre. [cmdchars] Uno o dos caracteres ASCII en hexadecimal. Todas las tramas contienen este campo. Indica el cdigo de la operacin a llevar a cabo. Para los comandos estndar est formado por un nico carcter (dentro del rango A-Z o a-i). Para los comandos
Pgina 24 de 107
extendidos est formado por dos caracteres, siendo el primero el carcter ! (ASCII 33) y el segundo el carcter que identifica la operacin (dentro del rango A-Z o a-z). [position] De cero a cuatro caracteres ASCII en hexadecimal. Algunas tramas no contienen este campo. Este campo especifica los canales del mdulo que se vern afectados por el comando. Cada bit representa un canal, con un mximo de 16 canales por mdulo FieldPoint. El bit 15 representa el canal 15 y el bit 0 representa el canal 0. [modifier]
Algunas tramas no contienen este campo. Este campo es utilizado por comandos que realizan acciones distintas en funcin de un valor. [data]
tramas no contienen este campo. Este campo contiene caracteres especficos del comando.
[checksum] Dos caracteres ASCII en hexadecimal. Este campo activa el control de paridad para la trama. Este valor se calcula de la siguiente manera: se suman los valores numricos de los caracteres de los campos [address] y [command] y se haya el resto de dividir este valor por 256 (mdulo-256 de la suma). Este resto se convierte a dos caracteres ASCII en hexadecimal para formar el campo. Si no se desea controlar el error de paridad, este campo ha de contener dos interrogaciones, ??.
[end]
Un carcter ASCII en hexadecimal. Este campo indica el final de la trama. Se puede utilizar un retorno de carro (ASCII 13) o un . (ASCII 46).
Pgina 25 de 107
A[response data][checksum][cr] Este tipo de respuesta, se obtiene de los comandos que han solicitado informacin al mdulo. El campo [checksum] se obtiene sumando los valores numricos de todos los caracteres del campo [response data] y calculando el mdulo-256 de la suma. El mdulo de la divisin se convierte a dos caracteres ASCII en hexadecimal.
En el epgrafe 2.3 se ofrece la descripcin de los errores que pueden devolver los dispositivos FieldPoint.
Pgina 26 de 107
La implementacin realizada se divide en dos partes: El driver, que permite utilizar los dispositivos en sistemas operativos Linux, junto con la interfaz en lenguaje C, para que el usuario pueda realizar sus programas de control en este lenguaje. Esta parte est programada en lenguaje C y consta de los siguientes ficheros: o El fichero DriverC_NI.h: Contiene la especificacin de los tipos y funciones desarrolladas para manejar los mdulos.
El fichero DriverC_NI.c: Contiene la implementacin de las funciones desarrolladas para manejar los mdulos.
Una interfaz en lenguaje Ada, para que el usuario pueda realizar los programas de control en este lenguaje. Esta parte est programada en lenguaje Ada y se basa en la facilidad que proporciona el propio lenguaje para realizar llamadas a funciones programadas en otros lenguajes de programacin (como por ejemplo C). Los ficheros involucrados son: o El fichero driverada_ni.ads: Contiene la especificacin de los tipos y funciones desarrolladas para manejar los mdulos.
El fichero driverada_ni.adb: Contiene la implementacin de las funciones desarrolladas para manejar los mdulos.
Pgina 27 de 107
incrementada segn su posicin en el bus. El mdulo de E/S contiguo al mdulo de red tendr la direccin fsica base+1, el siguiente base+2 y as
sucesivamente.
La implementacin del driver, se ha realizado para que el usuario no necesite conocer en ningn momento las direcciones fsicas de los mdulos conectados al bus. El dato que ha de manejar es la direccin del mdulo en el bus local. Este bus local, est formado nicamente por los mdulos de E/S y se asignan las direcciones comenzando en cero a partir del primer mdulo de E/S, el contiguo al mdulo de red. De esta forma, el mdulo contiguo al mdulo de red tendr la direccin cero, el siguiente la uno y as sucesivamente. En la Tabla 2.1 podemos ver un ejemplo.
La deteccin de los mdulos que componen el bus local y la asignacin de direcciones se hacen de forma dinmica. No es necesario que los mdulos estn dispuestos fsicamente siempre en el mismo orden. Podemos obtener tantas configuraciones hardware como posibilidades de conexin. Algunos ejemplos se muestran a continuacin: (FP-1000) (FP-DI-301) (FP-RLY-420) (FP-RLY-420)
Pgina 28 de 107
2.2.2.- Cdigo C
2.2.2.1.- Estructuras y variables utilizadas
En el cdigo fuente, se definen una serie de macros, estructuras y variables que se utilizan para realizar la implementacin del driver.
Variables globales
COM1 y COM2: Indican el puerto serie a utilizar para la comunicacin. _Digital_IN y _Digital_OUT: Indican el tipo de mdulo: entradas digitales y salidas digitales respectivamente. Variables de error: Proporcionan informacin sobre el estado en que finaliz la ltima operacin. En la Tabla 2.2 se muestran las variables de error utilizadas, el valor que toman cada una de ellas y la descripcin.
Macros internas
#define _FPDI301 #define _FPRLY420 0x0105 0x0108
Contienen los cdigos del fabricante para identificar los distintos mdulos. Este identificador es nico para cada tipo de mdulo.
Pgina 29 de 107
Error
CORRECTO ERROR_COM FD_INVALIDO TIMEOUT
Valor
0 -101 -102 -103
Descripcin
En la ltima operacin no se produjo ningn error Error en la comunicacin con el puerto serie Descriptor del puerto invlido Timeout al leer del puerto. El dispositivo no ha respondido en el tiempo esperado El dispositivo ha devuelto una respuesta
RESPUESTA_ERRONEA
-200
considerada errnea No hay memoria dinmica reservada. Se puede producir por dos causas: Si no se ha llamado a la funcin de inicializacin antes de llamar a cualquier otra funcin Si ha fallado la reserva dinmica de memoria durante la inicializacin
ERROR_MEM
-300
El nmero de mdulo al que se quiere acceder no existe en el bus local El mdulo no es un mdulo de entradas digitales El mdulo no es un mdulo de salidas digitales La lnea a la que se quiere acceder no existe
Pgina 30 de 107
Estructuras
typedef struct _Tdevice { } DEVICE;
Esta estructura contiene los campos que identifican a cada uno de los mdulos:
int _direccion;
Contiene la direccin fsica del mdulo, necesaria para enviar las tramas al bus.
int _deviceType;
Identifica el tipo de mdulo. Para ello se utilizan las macros _Digital_IN y _Digital_OUT definidas en el fichero de cabecera. Estas dos macros identifican los mdulos de entradas y de salidas digitales respectivamente.
int _deviceNumber;
Contiene la identificacin del dispositivo. Este identificador es nico y se corresponde con las macros _FPDI301 y _FPRLY420.
float * _lineas;
Contiene el valor de cada uno de los canales que tiene el mdulo. Esta variable es un array dinmico de flotantes. Una vez que se conoce el nmero de canales que forman el mdulo se reserva la memoria necesaria.
int _numLineas;
Pgina 31 de 107
Esta estructura contiene los campos con las propiedades del bus:
int _dirBase;
int _puerto;
Identifica el puerto serie utilizado. Se deben utilizar las variables COM1 y COM2 definidas en el fichero de cabecera.
int _velocidad;
int _numModulos;
DEVICE * _bus;
Contiene la informacin de cada uno de los mdulos que forman el bus. Esta variable es un array dinmico de estructuras DEVICE que, como vimos anteriormente, contienen la informacin de cada mdulo. Se reserva dinmicamente la memoria tras conocer el nmero de mdulos que forman el bus.
Pgina 32 de 107
Variables internas
BUS DeviceBus = {0};
int _nerror;
char _serror[255]
Cadena que contiene la descripcin del estado en que finaliz la ltima funcin. Si la operacin finaliz correctamente la cadena estar vaca. En caso contrario, contendr una descripcin del error producido. Esta cadena incluye una traza de las funciones en que ha sucedido el error.
int estado = 0;
Indica si en algn momento se ha producido un error al asignar memoria dinmica. Se inicializa a cero y en el momento de asignar memoria dinmica se actualiza a uno si se hizo correctamente la asignacin. Si no se asign memoria dinmica correctamente, no se permitir realizar ninguna operacin. Por lo tanto, en toda funcin se debe comprobar, antes de nada, el valor de esta variable y, si fuera cero, retornar error.
Pgina 33 de 107
expon
Sintaxis
int expon (int base, int exp);
Descripcin Realiza la operacin base elevado a exp y retorna el resultado. Aunque existe la funcin pow en C que realiza la misma operacin, se decidi implementar aqu esta funcin para evitar problemas de libreras en la implementacin en Ada.
Reset_bus
Sintaxis
int Reset_bus (void);
Descripcin Esta funcin inicializa el mdulo de red. Para ello se siguen los siguientes pasos: Se enva el comando Reset Module (!Z) al mdulo. Tras enviar este comando los mdulos pasan a estar un tiempo inaccesibles. Es por ello, que se ha de esperar un tiempo prudencial para continuar. Se enva el comando Power Up Clear (A) al mdulo. Se desactiva el watchdog. Para ello se utiliza el comando Set Watchdog Delay (!Q). Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror) y se retornar -1.
Pgina 34 de 107
Reset_modulo
Sintaxis
int Reset_modulo (int modulo);
Descripcin Esta funcin inicializa el mdulo que se le indica como argumento. Para ello se enva el comando Power Up Clear (A) al mdulo indicado. Si se produce algn fallo durante la ejecucin se actualizarn convenientemente las variables de error (_nerror y _serror) y se retornar -1.
BuscaModulos
Sintaxis
int BuscaModulos (void);
Descripcin Esta funcin lee todos los dispositivos que estn conectados al bus e inicializa correctamente todas las estructuras de datos y variables utilizadas. Para ello sigue los siguientes pasos: Se inicializa el bus mediante la funcin Reset_bus. Se hace una lectura de los mdulos que forman el bus. Si la lectura anterior tuvo xito, se reserva memoria para el vector que contendr los mdulos que forman el bus (DeviceBus._bus). Se contina la inicializacin de cada una de las variables que identifican los mdulos. Actualmente slo se soportan los mdulos FP-DI-301 y
FP-RLY-420. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror) y se retornar -1.
Pgina 35 de 107
NI_Inicializar
Se inicializan los componentes _dirBase, _puerto y _velocidad de la variable DeviceBus con lo parmetros de la funcin. Se abre el puerto serie. Se buscan los mdulos en el bus mediante la funcin BuscaModulos. Se resetean cada uno de los mdulos de E/S que forman el bus local. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
NI_Liberar
Se cierra el puerto serie. Se libera la memoria asignada dinmicamente durante la inicializacin. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
NI_LeeModulo_DI
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se enva al mdulo el comando Read Discrete with Status (!K) para leer el estado de todos los canales. Se actualizan los valores locales de los canales del mdulo. Se retorna codificado en un entero el estado de todas las lneas. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
Pgina 36 de 107
NI_EscribeModulo_DO
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se enva al mdulo el comando Write Discrete with Status (!M) para escribir el estado de todos los canales. Se actualizan los valores locales de los canales del mdulo. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
NI_LeeLinea_DI
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se llama a la funcin NI_LeeModulo_DI. Se retorna el valor del canal solicitado. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
NI_EscribeLinea_DO
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se actualiza el valor del canal en las variables locales. Se codifica el valor de los canales del mdulo para enviar el comando Write Discrete with Status (!M). Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
Pgina 37 de 107
Para llevar a cabo la utilizacin de las funciones escritas en C se hace uso del pragma import: Primero se declara la funcin como si se fuera a implementar en lenguaje Ada. Luego se utiliza pragma import para utilizar la funcin escrita en C en nuestra implementacin en Ada. Este pragma necesita tres parmetros: El lenguaje en que est implementada la funcin a importar. El nombre que tendr la funcin en nuestra implementacin en Ada. El nombre de la funcin en lenguaje C.
En el Ejemplo 2.1 se muestra la utilizacin de este pragma. La llamada a la funcin NI_EscribeLinea_DO en la interfaz en Ada, hace uso de la funcin definida en lenguaje C con el mismo nombre.
function NI_EscribeLinea_DO (Modulo: Integer; Linea: Num_Linea_Salida; Valor: U1) return Integer is function NI_Ada_EscribeLinea_DO (Modulo: Integer; Linea: Integer; Valor: Integer) return Integer; pragma Import (C, NI_Ada_EscribeLinea_DO, "NI_EscribeLinea_DO"); begin return NI_Ada_EscribeLinea_DO (Modulo, Linea, Valor); end NI_EscribeLinea_DO;
Ejemplo 2.1 Interfaz C-Ada La definicin de las variables de acceso al puerto serie, variables de error y de identificacin del tipo de mdulo, se definen como valores enumerados. Tambin se definen nuevos tipos, derivados del tipo Integer y con el rango de valores limitado. En las funciones que utilicen estos tipos, si se realiza una llamada con un valor fuera del rango, se producir una excepcin en tiempo de ejecucin.
Pgina 38 de 107
Si la ejecucin de una funcin da lugar a un error, se devuelve un valor negativo y se actualizan las variables internas de error. Se recomienda utilizar las funciones ObtenerError y ObtenerErrorString para obtener el cdigo de error y una descripcin de ste respectivamente.
NI_Inicializar
Descripcin Esta funcin sirve para inicializar el bus de comunicaciones de los mdulos FieldPoint. Se debe invocar esta funcin antes de llamar a cualquier otra. Sintaxis C/C++
int NI_Inicializar (int puerto, int velocidad, int dir_modulo);
Ada
function NI_Inicializar (Puerto: Puerto_Serie; Velocidad: Integer; Dir_Modulo: Integer) return Integer;
comunicacin. Se deben utilizar las variables COM1 y COM2 definidas. Velocidad: Velocidad del puerto serie a la que se va a llevar a cabo la
comunicacin. Este valor ha de coincidir con el valor fijado en el mdulo de red. Los valores permitidos son: 300, 1200, 2400, 9600, 19200, 28400, 57600, 115200. Si se indica un valor distinto a estos se producir un error. Dir_Modulo: Direccin fsica que se ha asignado al mdulo de red.
Pgina 39 de 107
NI_Liberar
Descripcin Esta funcin libera el bus de comunicaciones y los recursos comprometidos durante la inicializacin. Sintaxis C/C++
int NI_Liberar (void);
Ada
function NI_Liberar return Integer;
NI_EscribeLinea_DO
Descripcin Esta funcin actualiza el valor de un canal de salida de un mdulo de salidas digitales FP-RLY-420. Sintaxis C/C++
int NI_EscribeLinea_DO (const int modulo, const int linea, const int valor);
Ada
function NI_EscribeLinea_DO (Modulo: Integer; Linea: Num_Linea_Salida; Valor: U1) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Linea: Valor: Nmero del canal de salida que se desea actualizar (entre 0 y 7). Valor de la lnea a actualizar (1: activar; 0: desactivar).
Pgina 40 de 107
NI_EscribeModulo_DO
Descripcin Esta funcin actualiza los ocho canales del mdulo de salidas digitales FP-RLY-420. Sintaxis C/C++
int NI_EscribeModulo_DO (const int modulo, const U8 valor);
Ada
function NI_EscribeModulo_DO (Modulo: Integer; Valor: U8) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor: mdulo. Valor retornado El nmero de canales del mdulo si todo fue correcto. -1 en caso de error. Entero donde estn codificados los valores de los ocho canales del
NI_LeeLinea_DI
Descripcin Esta funcin lee el estado de un canal de entrada de un mdulo de entradas digitales FP-DI-301. Sintaxis C/C++
int NI_LeeLinea_DI (const int modulo, const int linea);
Ada
function NI_LeeLinea_DI (Modulo: Integer; Linea: Num_Linea_Entrada) return Integer;
Pgina 41 de 107
Argumentos Modulo: Posicin del mdulo en el bus local. Linea: Nmero del canal de entrada que se desea leer (entre 0 y 15).
Valor retornado El estado del canal de entrada (1: activo; 0: inactivo) si todo fue correcto. Un nmero negativo si hubo algn error.
NI_LeeModulo_DI
Descripcin Esta funcin lee el estado de los diecisis canales de entrada del mdulo de entradas digitales FP-DI-301. El estado de las entradas se devuelve codificado en un entero que se ha de pasar a la funcin como argumento. Sintaxis C/C++
int NI_LeeModulo_DI (int modulo, U16 * valor);
Ada
procedure NI_LeeModulo_DI (Modulo: in Integer; Valor: in out U16; Retorno: out Integer);
Argumentos Modulo: Posicin del mdulo en el bus local. Valor: Entero donde se codificar el estado de los diecisis canales de
entrada del mdulo. Valor retornado El nmero de lneas del mdulo si todo fue correcto. -1 en caso de error. La implementacin de esta funcin en Ada se hace a travs de un procedimiento. El valor de retorno se devuelve a travs de la variable Retorno.
Pgina 42 de 107
ObtenerError
Descripcin Esta funcin sirve para obtener el estado en que finaliz la ltima operacin que se ha realizado. Sintaxis C/C++
int ObtenerError (void);
Ada
function ObtenerError return Var_Error;
Valor retornado C/C++ Un entero que identifica la situacin en que finaliz la ltima operacin. Los posibles valores estn definidos en las variables de error. Ada Una variable de tipo Var_Error (valor enumerado donde se definen los errores).
ObtenerErrorString
Descripcin Esta funcin sirve para obtener una descripcin del estado en que finaliz la ltima operacin realizada. Si en la ltima llamada a una funcin se ha producido un error, mediante una llamada a esta funcin se obtendr una descripcin de ste. Sintaxis C/C++
char * ObtenerErrorString (void);
Ada
function ObtenerErrorString return string;
Valor retornado Una cadena con la descripcin del estado en que finaliz la ltima operacin realizada. Si en la ltima operacin no se produjo ningn error se retornar una cadena vaca.
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
Pgina 43 de 107
Num_Lineas
Descripcin Esta funcin proporciona informacin sobre el nmero de canales que forman un mdulo. Sintaxis C/C++
int Num_Lineas (int modulo);
Ada
function Num_Lineas (Modulo: Integer) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado El nmero de canales del mdulo si todo fue correcto. -1 en caso de error.
Num_Modulos
Descripcin Esta funcin proporciona informacin sobre el nmero de mdulos que se han detectado en el bus local. Sintaxis C/C++
int Num_Modulos (void);
Ada
function Num_Modulos return Integer;
Valor retornado El nmero de mdulos que forman el bus local si todo fue correcto. -1 en caso de error.
Pgina 44 de 107
Get_Tipo
Descripcin Esta funcin retorna informacin sobre el tipo del mdulo (entradas digitales, salidas digitales,). Sintaxis C/C++
int Get_Tipo (int modulo);
Ada
function Get_Tipo (Modulo: Integer) return Device_Type;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado C/C++ El nmero que identifica el tipo de mdulo (variables _Digital_IN y _Digital_OUT). -1 en caso de error. Ada Una variable de tipo Device_Type (valor enumerado donde estn definidos los tipos de dispositivos). En caso de error el valor del enumerado retornado ser ERROR.
Get_Nombre
Descripcin Esta funcin permite obtener el nombre de un mdulo. Sintaxis C/C++
char * Get_Nombre (int modulo);
Ada
function Get_Nombre (Modulo: Integer) return String;
Pgina 45 de 107
Valor retornado Una cadena con el nombre del mdulo si todo fue correcto. Una cadena con la descripcin del error sucedido en caso de error.
Get_Id
Descripcin Esta funcin permite obtener el identificador de un mdulo. Este identificador es nico para cada tipo de mdulo y se corresponde con el valor asignado por el fabricante. Sintaxis C/C++
int Get_Id (int modulo);
Ada
function Get_Id (Modulo: Integer) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado El nmero del fabricante que identifica el mdulo si todo fue correcto. -1 en caso de error.
Get_Direccion
Descripcin Esta funcin permite obtener la direccin fsica que tiene asignada un mdulo. Sintaxis C/C++
int Get_Direccion (int modulo);
Ada
function Get_Direccion (Modulo: Integer) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado La direccin fsica que tiene asignada el mdulo si todo fue correcto. -1 en caso de error.
Pgina 46 de 107
Command Type and Name Utility Commands: Power Up Clear Reset Configuration Commands: Set Turn-around Delay Identify Optomux Type Configure Positions Configure As Inputs Configure As Outputs Read Module Configuration Watchdog Commands: Set Analog Watchdog Delay Set Analog Watchdog Data Enhanced Discrete Watchdog Discrete Commands: Write Outputs Activate Outputs Deactivate Outputs Read ON/OFF Status Analog Commands: Write Analog Outputs Read Analog Outputs Read Analog Inputs Update Analog Outputs
C F A B
Command Syntax
Success Response
G[positions] H[positions] I[positions] j D[positions][wdgTmo] m[positions][data] m[positions][wdgTmo] J[positions] K[positions] L[positions] M J[positions][data] K[positions] L[positions] S[positions][data]
Pgina 47 de 107
Command Type and Name Utility Commands: Read Module ID Read All Module IDs HotSwap Reporting Mode Resend Last Response Read Firmware Revision Read Module Status Read Channel Status Read Bank Status Reset Module Execute Channel Command Configuration Commands: Set Attributes Get Attributes Discrete Commands: Read Discrete Read Discrete with Status Write Discrete Write Discrete with Status Analog Commands: Read 16-bit Data Read 16-bit Data with Status Write 16-bit Data Write 16-bit Data with Status
!J !K !A !B
Command Syntax
Success Response
A[modID] A[number][modarray] A A
!b[flag] !c !e !N !O[positions] !P !Z !n[positions]{[command type][command] pairs} !D[positions]{[attrMask] [rangeMask][settings] triplets} !E[positions]{[attrMask] [rangeMask] pairs}
A A{[settings] array}
!L[positions][data] !M[positions][data]
Pgina 48 de 107
Command Type and Name Watchdog Commands: Set Watchdog Delay Set Discrete Watchdog Data Set 16-bit Watchdog Data Set Watchdog Data Status Get Watchdog Info SnapShot/Programmable Commands: Store Attributes Store 16-bit Data Store Discrete Store Discrete Watchdog Data Store 16-bit Watchdog Data Store Watchdog Data Status Store Watchdog Enable Store Watchdog Delay Store SnapShot Use SnapShot Read SnapShot Status Power-Up
Command Syntax
Success Response
!f[positions]{[attrMask] [rangeMask][settings] triplets} !g[positions][data] !h[positions][data] !i[positions][wdgData] !j[positions][wdgData] !k[positions][mask] !l[wdgTmo] !V[wdgTmo] !W !X[flag] !Y
A A A A A A A A A A[flag] A[status]
Pgina 49 de 107
Comandos utilizados
Power Up Clear Description
Power Up Clear should be the first command issued to a FieldPoint module. This command prevents the FieldPoint module from returning a power-up clear expected error (E_PONCLR_EXP) message in response to the first command following application of power.
[cmdchars] = A
This command functions only if it is the first command sent after power-up. If this command is sent to a module after the first command has been sent, the module responds with a success response. A power-up clear expected error is returned if any other command is sent first. After a power-up clear expected error is returned this command does not need to be sent; the next command executes normally.
This command has no effect on the FieldPoint module operation or setup; the power-up clear expected error provides an indication to the host that there has been a power failure and that the FieldPoint module has been reset to power-up configuration.
Syntax
A
Success Response
A
Example
>33A??[cr]
This example sends Power Up Clear to the FieldPoint module at address 51 (0x33). ?? is the [checksum] field.
Pgina 50 de 107
[cmdchars] = !B
The Read All Module IDs command reads the number of modules in the bank, and the module IDs for the network module and all the modules in the bank. This command should be sent to a network module only. Use the Read Module ID command (!A) to read the module ID for a single module.
Syntax
!B
Success Response
A[number][mod array]
[number]
Two ASCII-hex characters representing the number of modules in the bank, including the network module.
[mod array]Four ASCII-hex characters per module in the bank representing the module ID. The first entry (four characters) is the ID of the network module that was addressed. Each subsequent entry corresponds to the module at the next higher address in the bank.
Each module ID is four ASCII-hex characters. It is a 16-bit number representing the module ID as shown in the following table. [modID] Value 0001 0002 0101 0102 0103 0104 0105 0106 0107 0108 0109 010A 010B 010C 010D Module Name FP-1000 FP-1001 FP-AI-110 FP-AO-200 FP-DI-330 FP-DO-400 FP-DI-301 FP-DO-401 FP-TC-120 FP-RLY-420 FP-DI-300 FP-AI-100 FP-RTD-122 FP-AI-111 FP-CTR-500
Pgina 51 de 107
Example
>00!B??[cr]
This command requests the FieldPoint network module at address 0x00 to return the IDs of all the modules in its bank.
A03000101020103[cs][cr]
This response from the network module indicates that there are three modules in the bank with module IDs 0x0001(FP-1000 module), 0x0102 (FP-AO-200 module), and 0x0103 (FP-DI-330 module).
Pgina 52 de 107
[cmdchars] = !K
The Read Discrete with Status command reads discrete data from all discrete input and output channels of the addressed module. In addition, the status of the targeted channels is reported, to enable additional error checking. Use the Read Module Status or Read Channel Status commands for details on the error condition of a bad channel.
Syntax
!K
Success Response
A[status][data]
[status]
Four ASCII-hex characters, specifying the status of the channels targeted by this command. The most significant bit represents channel 15, the least significant bit represents channel 0. A 1 in any bit means that the corresponding channels status is bad. A zero in any bit means that the corresponding channels status is good. Channels that do not exist return a zero in the corresponding status bit. Channels that are not discrete return a zero in the corresponding status bit.
[data]
Four ASCII-hex characters, specifying the channel levels. A 1 in any bit means that the corresponding channel is ON. A zero in any bit means that the corresponding channel is OFF. Channels that do not exist return a zero in the corresponding data bit. Channels that are not discrete return a zero in the corresponding data bit.
Note: Even if a channel has a bad status, a value is returned for that channel in [data].
Example
>33!K??[cr]
This command tells the FieldPoint module at address 51 (0x33) to return the status of all its channels.
A000000FF[cs][cr]
This response from a 16-channel discrete FieldPoint module indicates that all channels have a good status, channels 15 through 8 are OFF, and channels 7 through 0 are ON.
Pgina 53 de 107
[cmdchars] = !M
The Write Discrete with Status command drives outputs ON or OFF on targeted channels of the addressed FieldPoint module. In addition, the status of the targeted channels is reported, to enable additional error checking. Use the !O command for more information on a channels status. Use the Read Module Status or Read Channel Status commands for details on the error condition of a bad channel.
Syntax
!M[positions][data]
[positions] Four ASCII-hex characters, specifying the channels targeted by this command. A 1 in any bit means that the corresponding channels data is to be written. A zero in any bit means that the corresponding channel is not targeted by this command. Targeting channels that are inputs returns an error. Targeting channels that do not exist returns an error. [data] Four ASCII-hex characters, specifying the channel levels. A 1 in any bit means that the corresponding channel is to be driven ON. A zero in any bit means that the corresponding channel is to be driven OFF.
Success Response
A[status]
[status]
Four ASCII-hex characters, specifying the status of the channels targeted by this command. The most significant bit represents channel 15, the least significant bit represents channel 0. A 1 in any bit means that the corresponding channels status is bad. A zero in any bit means that the corresponding channels status is good. Channels that are not targeted return a zero in the corresponding status bit.
Example
>33!M00010000??[cr]
This command tells the FieldPoint module at address 51 (0x33) to turn channel 0 to OFF. This command also tells the module to return the channel status.
A0000[cs][cr]
This response from the FieldPoint module indicates that the channel status is good.
Pgina 54 de 107
[cmdchars] = !Q
If a network module is addressed, the Set Watchdog Delay command sets up the timeout value for the FieldPoint banks watchdog timer. If a module other than a network module is addressed, the addressed module is enabled or disabled for watchdog timer expiration, but the banks watchdog timeout value is not affected. You should set the watchdog data before you issue this command.
Syntax
!Q[wdgTmo]
[wdgTmo]
Four ASCII-hex characters, specifying the watchdog timeout value. The result of this command depends on the type of module that is addressed.
Success Response
A
Example
>00!Q0015??[cr]
This command tells the FieldPoint module at address 0x00 to set its watchdog timeout value to 210 ms, and to start the watchdog timer.
>33!Q0021??[cr]
This command tells the FieldPoint module at address 51 (0x33) to enable itself to react to watchdog timer expiration.
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
Pgina 55 de 107
[cmdchars] = !Z
If a network module is addressed, the Reset Module command resets all the I/O modules in the bank and resets the turn-around delay for all modules to zero. If a module other than a network module is addressed, the addressed module is reconfigured and the turn-around delay for the addressed module is set to zero. In both cases, the FieldPoint modules are configured to factory default settings (if the SnapShot feature is disabled) or to stored SnapShot information (if the SnapShot feature is enabled).
Syntax
!Z
Success Response
A
Example
>33!Z??[cr]
This command tells the FieldPoint module at address 51 (0x33) to return to its power-up state.
Pgina 56 de 107
A FieldPoint module returns an error response when an erroneous condition is detected during the reception or execution of a command. FieldPoint modules return only the Standard errors (N00 through N07) in response to all standard commands, which enables FieldPoint modules to work with host software that is written for the Optomux protocol. In response to the extended commands, FieldPoint modules return either standard or extended errors, depending on which is most appropriate. The error response to a FieldPoint command (standard or extended) has the following form: N[error number][cr] where [error number] is two ASCII-hex characters.
Pgina 57 de 107
Error Number (Hex) 00 Error Tag E_PUCLR_EXP Description Power Up Clear expected. The command was ignored. A command other than Power Up Clear was attempted after power-up or power failure. Once the error is received by the host, it is unnecessary to send the Power Up Clear command, because the next command is executed normally. If this error message is received, the FieldPoint network module has gone through its power-up sequence and has reset all characteristics to defaults. If SnapShot is enabled, the module is configured in accordance with the stored SnapShot information. 01 E_INVALID_CMD Undefined command. The command character was not a legal command character, or the addressed module does not support this command. The command was ignored. 02 E_BAD_CHECKSUM Checksum error. The checksum received in the command did not match the calculated checksum of the characters in the command. The command was ignored. 03 E_INBUF_OVRFLO Input buffer overrun. The received command was too long. The command was ignored. 04 E_ILLEGAL_CHAR Non-printable ASCII character received. Only characters from ASCII value 33 to 127 are permitted within commands. The command was ignored. 05 E_INSUFF_CHARS Data field error. An insufficient or incorrect number of characters were received for the specified command. 06 E_WATCHDOG_TMO Communications link network watchdog timed out. The command was ignored. 07 E_INV_LIMS_GOT Specified limits invalid for the command. This incluyes notification that an invalid digit (hex or decimal) was received. Tabla 2.5 Standard Error Responses
Pgina 58 de 107
Error Number (Hex) 80 Error Tag E_ILLEGAL_DIGIT Description One or more characters sent in the command could not be correctly converted to a digit (hex or decimal). 81 E_BAD_ADDRESS The command is valid, but the addressed module does not support the command received. 82 E_INBUF_FRMERR The FieldPoint network module detected a serial framing error in the command. The command was ignored. 83 84 E_NO_MODULE E_INV_CHNL The addressed module does not exist. One or more channels specified in the command either do not exist or do not support the operation specified. The command was ignored. 85 E_INV_RANGE One or more ranges specified in the command either do not exist or do not support the setting specified. The command was ignored. 86 E_INV_ATTR One or more attributes specified in the command either do not exist or do not support the setting specified. The command was ignored. 88 E_HOTSWAP The module has been hot-swapped since it was last sent a command. This response is sent only if the network module is enabled to report hot-swaps, and if the hot-swap occurred after hot-swap reporting mode was enabled. The command was ignored. This error number can be sent in response to a standard command if you have enabled hot-swap reporting for the bank. 89 E_ADDR_NOT_SAME The module addressed by the Resend Last Response is not the same as the module addressed by the previous command. 8A 8B 8C E_NO_RESEND_BUF E_HW_FAILURE E_UNKNOWN The response to the last command is unavailable An irrecoverable fault has occurred. An unidentifiable error condition has occurred.
Pgina 59 de 107
(Leading Code)
(Addr)
Dos caracteres ASCII en hexadecimal. Direccin del mdulo a quien va dirigida la trama. El rango de valores posibles est comprendido entre 00 y FF.
(Command)
[Data]
Longitud variable. Es un campo opcional. Utilizado por algunos comandos para indicar valores de datos.
[Checksum]
Dos
caracteres
ASCII
en
hexadecimal.
Este
campo
es
opcional. Este campo activa el control de paridad para la trama. Este valor se calcula segn la siguiente frmula:
[Checksum] = ((LeadingCode)+(Addr)+(Command)+[Data]) MOD 0x100 Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
Pgina 60 de 107
<CR>
Un carcter ASCII en hexadecimal. Indica el final de la trama. Para finalizar las tramas se ha de utilizar el carcter de retorno de carro (CR: ASCII 13).
Existen condiciones en las que un comando no producir un mensaje de respuesta: La direccin especificada no existe. La sintaxis del comando es incorrecta. Se produjo un error en la comunicacin. Algunos comandos especiales no producen mensajes de respuesta.
Pgina 61 de 107
La implementacin realizada se divide en dos partes: El driver, que permite utilizar los dispositivos en sistemas operativos Linux, junto con la interfaz en lenguaje C, para que el usuario pueda realizar sus programas de control en este lenguaje. Esta parte est programada en lenguaje C y consta de los siguientes ficheros: o El fichero DriverC_ND.h: Contiene la especificacin de los tipos y funciones desarrolladas para manejar los mdulos.
El fichero DriverC_ND.c: Contiene la implementacin de las funciones desarrolladas para manejar los mdulos.
Una interfaz en lenguaje Ada, para que el usuario pueda realizar los programas de control en este lenguaje. Esta parte est programada en lenguaje Ada y se basa en la facilidad que proporciona el propio lenguaje para realizar llamadas a funciones programadas en otros lenguajes de programacin (como por ejemplo C). Los ficheros involucrados son: o El fichero driverada_nd.ads: Contiene la especificacin de los tipos y funciones desarrolladas para manejar los mdulos.
El fichero driverada_nd.adb: Contiene la implementacin de las funciones desarrolladas para manejar los mdulos.
Pgina 62 de 107
La implementacin del driver, se ha realizado para que el usuario no necesite conocer en ningn momento las direcciones fsicas de los mdulos conectados al bus. El dato que ha de manejar es la direccin del mdulo en el bus local. Este bus local, est formado nicamente por los mdulos de E/S.
La deteccin de los mdulos que componen el bus local y la asignacin de direcciones se hacen de forma dinmica durante la fase de inicializacin. En esta fase se buscan mdulos en el bus entre las direcciones cero y limite, siendo limite un valor indicado por el usuario. Se comprueba que exista el mdulo con direccin x en el bus y, en caso afirmativo, se le asigna una posicin en un bus local. Estas posiciones son correlativas y se asignan, empezando por cero, segn se van encontrando mdulos. De esta forma podramos tener conectados al bus tres mdulos con direcciones fsicas cinco, ciento cinco y noventa y durante la fase de inicializacin se les asignara las direcciones cero, dos y uno en el bus local respectivamente (Tabla 3.1).
Mdulo ND-6053 90
Pgina 63 de 107
3.2.2.- Cdigo C
3.2.2.1.- Estructuras y variables utilizadas
En el cdigo fuente, se definen una serie de macros, estructuras y variables que se utilizan para realizar la implementacin del driver.
Variables globales
COM1 y COM2: Indican el puerto serie a utilizar para la comunicacin. PUERTO_A, PUERTO_B y PUERTO_C: indican el puerto de la tarjeta DIN-24R sobre el que actuar. _Digital_IN y _Digital_OUT: Indican el tipo de mdulo: entradas digitales y salidas digitales respectivamente. Variables de error: Proporcionan informacin sobre el estado en que finaliz la ltima operacin. En la Tabla 3.2 se muestran las variables de error utilizadas, el valor que toman cada una de ellas y la descripcin.
Pgina 64 de 107
Error
CORRECTO ERROR_COM FD_INVALIDO TIMEOUT
Valor
0 -101 -102 -103
Descripcin
En la ltima operacin no se produjo ningn error Error en la comunicacin con el puerto serie Descriptor del puerto invlido Timeout al leer del puerto. El dispositivo no ha respondido en el tiempo esperado El dispositivo ha devuelto una respuesta
RESPUESTA_ERRONEA
-200
considerada errnea No hay memoria dinmica reservada. Se puede producir por dos causas: Si no se ha llamado a la funcin de
ERROR_MEM
-300
inicializacin antes de llamar a cualquier otra funcin Si ha fallado la reserva dinmica de memoria durante la inicializacin
El nmero de mdulo al que se quiere acceder no existe en el bus local El mdulo no es un mdulo de entradas digitales El mdulo no es un mdulo de salidas digitales La lnea a la que se quiere acceder no existe El puerto especificado no es un puerto vlido para la tarjeta DIN-24R No se ha encontrado ningn mdulo en el bus
Macros internas
#define _ND6053 #define _ND6058 6053 6058
Contienen los cdigos del fabricante para identificar los distintos mdulos. Este identificador es nico para cada tipo de mdulo.
Pgina 65 de 107
Estructuras
typedef struct _Tdevice { } DEVICE;
Esta estructura contiene los campos que identifican a cada uno de los mdulos:
int _direccion;
Contiene la direccin fsica del mdulo, necesaria para enviar las tramas al bus.
int _deviceType;
Identifica el tipo de mdulo. Para ello se utilizan las macros _Digital_IN y _Digital_OUT definidas en el fichero de cabecera.
int _deviceNumber;
Contiene la identificacin del dispositivo. Este identificador es nico y se corresponde con las macros _ND6053 y _ND6058.
float * _lineas;
Contiene el valor de cada uno de los canales que tiene el mdulo. Esta variable es un array dinmico de flotantes. Una vez que se conoce el nmero de canales que forman el mdulo se reserva la memoria necesaria.
int _numLineas;
Pgina 66 de 107
Esta estructura contiene los campos con las propiedades del bus:
int _puerto;
Identifica el puerto serie utilizado. Se deben utilizar las macros COM1 y COM2 definidas en el fichero de cabecera.
int _velocidad;
int _numModulos;
DEVICE * _bus;
Contiene la informacin de cada uno de los mdulos que forman el bus. Esta variable es un array dinmico de estructuras DEVICE que, como vimos anteriormente, contienen la informacin de cada mdulo. Se reserva dinmicamente la memoria tras conocer el nmero de mdulos que forman el bus.
Variables internas
BUS DeviceBus = {0};
int _nerror;
char _serror[255]
Cadena que contiene la descripcin del estado en que finaliz la ltima funcin. Si la operacin finaliz correctamente la cadena estar vaca. En caso contrario, contendr una descripcin del error producido. Esta cadena incluye una traza de las funciones en que ha sucedido el error.
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
Pgina 67 de 107
Indica si en algn momento se ha producido un error al asignar memoria dinmica. Se inicializa a cero y en el momento de asignar memoria dinmica se actualiza a uno si se hizo correctamente la asignacin. Si no se asign memoria dinmica correctamente, no se permitir realizar ninguna operacin. Por lo tanto, en toda funcin se debe comprobar, antes de nada, el valor de esta variable y, si fuera cero, retornar error.
expon
Sintaxis
int expon (int base, int exp);
Descripcin Realiza la operacin base elevado a exp y retorna el resultado. Aunque existe la funcin pow en C que realiza la misma operacin, se decidi implementar aqu esta funcin para evitar problemas de libreras en la implementacin en Ada.
Init_bus
Sintaxis
int Init_bus (void);
Pgina 68 de 107
Init_modulo
Sintaxis
int Init_modulo (int modulo);
Descripcin Esta funcin inicializa el mdulo que se le indica como argumento. Para ello se siguen los siguientes pasos: Se desactiva el watchdog en el mdulo mediante el comando Set Host Watchdog/Safety Value. Si el mdulo a inicializar es el ND-6058, se configuran las 24 lneas de E/S programables como salidas, mediante el comando Set Programmable I/O Mode, y se inicializan a cero. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror) y se retornar -1.
BuscaModulos
Sintaxis
int BuscaModulos (int limite);
Descripcin Esta funcin busca los mdulos que forman el bus, entre las direcciones fsicas cero y limite, e inicializa correctamente todas las estructuras de datos y variables utilizadas. Para ello sigue los siguientes pasos: Comprueba que existan en el bus los mdulos con direccin fsica entre cero y limite. Para ello se enva el comando Read Configuration a todos los mdulos. Tras conocer el nmero de mdulos que forman el bus, se reserva memoria para el vector DeviceBus._bus, que contendr la informacin de todos ellos. Se contina la inicializacin de cada una de las variables que identifican los mdulos. Para inicializar las variables correctamente es necesario conocer la identidad de los mdulos. Para ello, se enva el comando Read Module Name a cada uno de ellos. Actualmente slo se soportan los mdulos ND-6053 y ND-6058.
Pgina 69 de 107
Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror) y se retornar -1.
ND_Inicializar
Se inicializan los componentes _puerto y _velocidad de la variable DeviceBus con lo parmetros de la funcin. Se abre el puerto serie. Se buscan los mdulos que forman el bus local mediante la funcin BuscaModulos. Se inicializa el bus. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
ND_Liberar
Se cierra el puerto serie. Se libera la memoria asignada dinmicamente durante la inicializacin. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
ND_LeeModulo_DI
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se enva al mdulo el comando Digital Input para leer el estado de todos los canales. Se actualizan los valores locales de los canales del mdulo. Se retorna codificado en un entero el estado de todas las lneas. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
Pgina 70 de 107
ND_EscribePuerto_DO
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se enva al mdulo el comando Digital Output para escribir el estado de todos los canales del puerto indicado. Se actualizan los valores locales de los canales del mdulo. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
ND_EscribeModulo_DO
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se llama a la funcin ND_EscribePuerto_DO para establecer los valores de cada uno de los puertos. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
ND_LeeLinea_DI
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se llama a la funcin ND_LeeModulo_DI. Se retorna el valor del canal solicitado. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
ND_EscribeLinea_DO
Se hacen las comprobaciones previas a la ejecucin de la funcin. Se actualiza el valor del canal en las variables locales. Se codifica el valor de los canales del mdulo para enviar el comando Digital Output para escribir el estado de todos los canales del puerto al que pertenece la lnea. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
Pgina 71 de 107
En el Ejemplo 3.1 se muestra la utilizacin de este pragma. La llamada a la funcin ND_LeeLinea_DI en la interfaz en Ada, hace uso de la funcin definida en lenguaje C con el mismo nombre.
function ND_LeeLinea_DI (Modulo: Num_Modulo; Linea: Num_Linea_Entrada) return Integer is function ND_Ada_LeeLinea_DI (Modulo: Integer; Linea: Integer) return Integer; pragma Import (C, ND_Ada_LeeLinea_DI, "ND_LeeLinea_DI"); begin return ND_Ada_LeeLinea_DI (Modulo, Linea); end ND_LeeLinea_DI;
La definicin de las variables de acceso al puerto serie, variables de error, de identificacin del tipo de mdulo y del puerto de la tarjeta DIN-24R, se definen como valores enumerados. Tambin se definen nuevos tipos, derivados del tipo Integer y con el rango de valores limitado. En las funciones que utilicen estos tipos, si se realiza una llamada con un valor fuera del rango, se producir una excepcin en tiempo de ejecucin.
Pgina 72 de 107
Si la ejecucin de una funcin da lugar a un error, se devuelve un valor negativo y se actualizan las variables internas de error. Se recomienda utilizar las funciones ObtenerError y ObtenerErrorString para obtener el cdigo de error y una descripcin de ste respectivamente.
ND_Inicializar
Descripcin Esta funcin sirve para inicializar el bus de comunicaciones de los mdulos NuDAM. Se debe invocar esta funcin antes de llamar a cualquier otra. Sintaxis C/C++
int ND_Inicializar (int puerto, int velocidad, int limite);
Ada
function ND_Inicializar (Puerto: Puerto_Serie; Velocidad: Integer; Limite: Num_Modulo) return Integer;
comunicacin. Se deben utilizar las variables COM1 y COM2 definidas. Velocidad: Velocidad del puerto serie a la que se va a llevar a cabo la
comunicacin. Este valor ha de coincidir con el valor fijado en los mdulos. Los valores permitidos son: 300, 1200, 2400, 9600, 19200, 28400, 57600, 115200. Si se indica un valor distinto a estos se producir un error. Limite: Direccin fsica hasta la que se buscarn mdulos en el bus.
Pgina 73 de 107
ND_Liberar
Descripcin Esta funcin libera el bus de comunicaciones y los recursos comprometidos durante la inicializacin. Sintaxis C/C++
int ND_Liberar (void);
Ada
function ND_Liberar return Integer;
ND_EscribeLinea_DO
Descripcin Esta funcin actualiza el valor de una lnea de salida de uno de los puertos de la tarjeta DIN-24R, conectada al mdulo ND-6058. Sintaxis C/C++
int ND_EscribeLinea_DO (const int modulo, const int puerto, const int linea, const int valor);
Ada
function ND_EscribeLinea_DO (Modulo: Num_Modulo; Puerto: Puerto_Tarjeta; Linea: Num_Linea_Salida; Valor: U1) return Integer;
Pgina 74 de 107
Argumentos Modulo: Posicin del mdulo en el bus local. Puerto: Puerto de la tarjeta donde se encuentra la lnea a actualizar (utilizar
las variables PUERTO_A, PUERTO_B o PUERTO_C). Linea: Valor: Nmero de lnea del puerto que se desea actualizar (entre 0 y 7). Valor de la lnea a actualizar (1: activar; 0: desactivar).
ND_EscribePuerto_DO
Descripcin Esta funcin actualiza los ocho canales de uno de los puertos de la tarjeta DIN-24R, conectada al mdulo ND-6058. Sintaxis C/C++
int ND_EscribePuerto_DO (const int modulo, const int puerto, const U8 valor);
Ada
function ND_EscribePuerto_DO (Modulo: Num_Modulo; Puerto: Puerto_Tarjeta; Valor: U8) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Puerto: Puerto de la tarjeta que se desea actualizar (utilizar las variables
PUERTO_A, PUERTO_B o PUERTO_C). Valor: puerto. Valor retornado El nmero de canales del puerto si todo fue correcto. -1 en caso de error. Entero donde estn codificados los valores de los ocho canales del
Pgina 75 de 107
ND_EscribeModulo_DO
Descripcin Esta funcin actualiza los 3 puertos de la tarjeta DIN-24R, conectada al mdulo ND-6058. Sintaxis C/C++
int ND_EscribeModulo_DO (const int modulo, const U8 valorA, const U8 valorB, const U8 valorC);
Ada
function ND_EscribeModulo_DO (Modulo: Num_Modulo; ValorA: U8; ValorB: U8; ValorC: U8) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. ValorA: Entero donde estn codificados los valores de los ocho canales del
puerto A de la tarjeta DIN-24R. ValorB: Entero donde estn codificados los valores de las ocho canales del
puerto B de la tarjeta DIN-24R. ValorC: Entero donde estn codificados los valores de las ocho canales del
puerto C de la tarjeta DIN-24R. Valor retornado El nmero de lneas del mdulo si todo fue correcto. -1 en caso de error.
Pgina 76 de 107
ND_LeeLinea_DI
Descripcin Esta funcin lee el estado de un canal de entrada de un mdulo de entradas digitales ND-6053. Sintaxis C/C++
int ND_LeeLinea_DI (const int modulo, const int linea);
Ada
function ND_LeeLinea_DI (Modulo: Num_Modulo; Linea: Num_Linea_Entrada) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Linea: Nmero del canal de entrada que se desea leer (entre 0 y 15).
Valor retornado El estado del canal de entrada (1: activo; 0: inactivo) si todo fue correcto. Un nmero negativo si hubo algn error.
Pgina 77 de 107
ND_LeeModulo_DI
Descripcin Esta funcin lee el estado de los diecisis canales de entrada del mdulo de entradas digitales ND-6053. El estado de las entradas se devuelve codificado en un entero que se ha de pasar a la funcin como argumento. Sintaxis C/C++
int ND_LeeModulo_DI (const int modulo, U16 * valor);
Ada
procedure ND_LeeModulo_DI (Modulo: in Num_Modulo; Valor: in out U16; Retorno: out Integer);
Argumentos Modulo: Posicin del mdulo en el bus local. Valor: Entero donde se codificar el estado de los diecisis canales de
entrada del mdulo. Valor retornado El nmero de lneas del mdulo si todo fue correcto. -1 en caso de error. La implementacin de esta funcin en Ada se hace a travs de un procedimiento. El valor de retorno se devuelve a travs de la variable Retorno.
Pgina 78 de 107
ObtenerError
Descripcin Esta funcin sirve para obtener el estado en que finaliz la ltima operacin que se ha realizado. Sintaxis C/C++
int ObtenerError (void);
Ada
function ObtenerError return Var_Error;
Valor retornado C/C++ Un entero que identifica la situacin en que finaliz la ltima operacin. Los posibles valores estn definidos en las variables de error. Ada Una variable de tipo Var_Error (valor enumerado donde se definen los errores).
ObtenerErrorString
Descripcin Esta funcin sirve para obtener una descripcin del estado en que finaliz la ltima operacin realizada. Si en la ltima llamada a una funcin se ha producido un error, mediante una llamada a esta funcin se obtendr una descripcin de ste. Sintaxis C/C++
char * ObtenerErrorString (void);
Ada
function ObtenerErrorString return string;
Valor retornado Una cadena con la descripcin del estado en que finaliz la ltima operacin realizada. Si en la ltima operacin no se produjo ningn error se retornar una cadena vaca.
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
Pgina 79 de 107
Num_Lineas
Descripcin Esta funcin proporciona el nmero de canales que forman el mdulo. Sintaxis C/C++
int Num_Lineas (int modulo);
Ada
function Num_Lineas (Modulo: Integer) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado El nmero de canales del mdulo si todo fue correcto. -1 en caso de error.
Num_Modulos
Descripcin Esta funcin proporciona el nmero de mdulos que se han detectado en el bus local. Sintaxis C/C++
int Num_Modulos (void);
Ada
function Num_Modulos return Integer;
Valor retornado El nmero de mdulos que forman el bus local si todo fue correcto. -1 en caso de error.
Pgina 80 de 107
Get_Tipo
Descripcin Esta funcin retorna informacin sobre el tipo del mdulo (entradas digitales, salidas digitales,). Sintaxis C/C++
int Get_Tipo (int modulo);
Ada
function Get_Tipo (Modulo: Integer) return Device_Type;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado C/C++ El nmero que identifica el tipo de mdulo (variables _Digital_IN y _Digital_OUT). -1 en caso de error. Ada Una variable de tipo Device_Type (valor enumerado donde estn definidos los tipos de dispositivos). En caso de error el valor del enumerado retornado ser ERROR.
Pgina 81 de 107
Get_Nombre
Descripcin Esta funcin permite obtener el nombre de un mdulo. Sintaxis C/C++
char * Get_Nombre (int modulo);
Ada
function Get_Nombre (Modulo: Integer) return String;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado Una cadena con el nombre del mdulo si todo fue correcto. Una cadena con la descripcin del error sucedido en caso de error.
Get_Id
Descripcin Esta funcin permite obtener el identificador de un mdulo. Este identificador es nico para cada tipo de mdulo y se corresponde con el valor asignado por el fabricante. Sintaxis C/C++
int Get_Id (int modulo);
Ada
function Get_Id (Modulo: Integer) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado El nmero del fabricante que identifica el mdulo si todo fue correcto. -1 en caso de error.
Pgina 82 de 107
Get_Direccion
Descripcin Esta funcin permite obtener la direccin fsica que tiene asignada un mdulo. Sintaxis C/C++
int Get_Direccion (int modulo);
Ada
function Get_Direccion (Modulo: Integer) return Integer;
Argumentos Modulo: Posicin del mdulo en el bus local. Valor retornado La direccin fsica que tiene asignada el mdulo si todo fue correcto. -1 en caso de error.
Pgina 83 de 107
Pgina 84 de 107
Command Set of Digital I/O Modules Command General Commands Set Configuration %(OldAddr)(NewAddr)(TypeCode) (BaudRate)(CheckSumFlag) Read Configuration Read Module Name Read Firmware Version Reset Status $(Addr)2 $(Addr)M $(Addr)F $(Addr)5 Functional Commands Synchronized Sampling #** 6050, 6052, 6053, 6054, 6058, 6060 Read Synchronized Data $(Addr)4 6050, 6052, 6053, 6054, 6058, 6060 Digital Output #(Addr)(ChannelNo)(OutData) 6050, 6060, 6063 #(Addr)(Port)(Odata) #(Addr)(Port)(ChannelNo)(BitData) #(Addr)T(OdataA)(OdataB)(OdataC) Digital Input Set Programmable I/O Mode $(Addr)6 $(Addr)S(IOSts) Special Commands Read Command Leading Code Setting Change Command Leading Code Setting Set Host Watchdog / Safety Value Read Host WatchDog / Safe Value Change Polarity Read Polarity Host is OK ~(Addr)0 ~(Addr)10(C1)(C2)(C3)(C4)(C5)(C6) ~(Addr)2(Flag)(TimeOut)(SafeValue) ~(Addr)3 ~(Addr)CP(Status) ~(Addr)CR ~** Tabla 3.3 Command set of digital I/O modules ALL ALL ALL ALL ALL ALL ALL 6056, 6058 6056,6058 6058 ALL 6058 ALL ALL ALL ALL ALL Syntax Module
Pgina 85 de 107
Comandos utilizados
Read Configuration Description
Read the configuration of module on a specified address ID.
Syntax
$(Addr)2<CR>
Response
!(Addr)(TypeCode)(BaudRate)(CheckSumFalg)<CR> or ?(Addr)<CR> ! ? (Addr) Command is valid. Command is invalid. Address ID.
(TypeCode) It always be 40 (Hex) for digital I/O modules. (BaudRate) Current setting of communication baud rate, refer to Table 0-1 for details. (CheckSumFlag) Current setting of check-sum flag, refer to Table 0-3. for details.
Example
User command: $302<CR> Response: !30400600<CR> ! 30 40 06 00 Command is valid. Address ID. Digital I/O module. Baud rate is 9600 bps. checksum is disable.
Pgina 86 de 107
Syntax
$(Addr)M<CR>
$ (Addr) M
Response
!(Addr)(ModuleName) <CR> or ?(Addr)<CR> ! ? Command is valid. Command is invalid.
Example
User command: $30M<CR> Response: !306050<CR> ! 30 6050 Command is valid Address. ND-6050 (Digital I/O module).
Pgina 87 de 107
Syntax
#(Addr)(Port)(OutData)<CR> (6056, 6058 only) # (Addr) (Port) Command leading code. (1-character) Address ID (2-character) Set value to indivisual port 0H: for 6056 channel 14 to 8 0L: for 6056 channel 7 to 0 0A: for 6058 port A 0B: for 6058 port B 0C: for 6058 port C (2-character) (OutData) Each bit is mapping to each channel number (2-character)
* if the port of ND-6058 is in input mode, output data to this port will beignore.
Response
<CR> or ?(Addr)<CR> > ? Command is valid. Command is invalid.
Example
User command: #2F0A10<CR> Response: <CR> 2F Address ID 0A Set output to port A 10 Set channel 4 of port A ON
Pgina 88 de 107
Syntax
$(Addr)6<CR>
Response
ND-6053 module response : !(DataInH)(DataInL)00<CR> or
?(Addr)<CR>
! ?
(DataInH) Value of digital input channel 15-8. (2-character) (DataInL) Value of digital input channel 7-0.(2-character)
Host is OK Description
When host watchdog timer is enable, host computer must send this command to every module before timeout otherwise host watchdog timer enable modules output value will go to safety state output value. Timeout value and safety state output value is defined Set Host Watchdog Timer & Safety Value.
Syntax
~**<CR>
~ **
Response
Note: Host is OK command has NO response.
Pgina 89 de 107
Syntax
$(Addr)S(IOFlag)<CR> (6058 only) $ (Addr) S (IOFlag) Command leading code. Address ID Set programmable I/O mode Status of programmable I/O 0x00: A(O/P) B(O/P) CH(O/P) CL(O/P) 0x01: A(O/P) B(O/P) CH(O/P) CL(I/P) 0x02: A(O/P) B(O/P) CH(I/P) CL(O/P) 0x03: A(O/P) B(O/P) CH(I/P) CL(I/P) 0x04: A(O/P) B(I/P) CH(O/P) CL(O/P) 0x05: A(O/P) B(I/P) CH(O/P) CL(I/P) 0x06: A(O/P) B(I/P) CH(I/P) CL(O/P) 0x07: A(O/P) B(I/P) CH(I/P) CL(I/P) 0x08: A(I/P) B(O/P) CH(O/P) CL(O/P) 0x09: A(I/P) B(O/P) CH(O/P) CL(I/P) 0x0A: A(I/P) B(O/P) CH(I/P) CL(O/P) 0x0B: A(I/P) B(O/P) CH(I/P) CL(I/P) 0x0C: A(I/P) B(I/P) CH(O/P) CL(O/P) 0x0D: A(I/P) B(I/P) CH(O/P) CL(I/P) 0x0E: A(I/P) B(I/P) CH(I/P) CL(O/P) 0x0F: A(I/P) B(I/P) CH(I/P) CL(I/P) *I/P input mode, O/P output mode.
Response
!(Addr)<CR> or ?(Addr)<CR> ! Command is valid. ? Command is invalid. (Addr) Address ID
Pgina 90 de 107
Example
User command: $06S0C<CR> Response: !06<CR> ! Command is valid. 0C Port A and B are input mode, high and low half byte of port C are output mode.
Syntax
~(Addr)2(Flag)(TimeOut)(SafeValue)<CR> ~(Addr)2(Flag)(TimeOut)(SafeH)(SafeL)<CR> (6056 only) ~(Addr)2(Flag)(TimeOut)(SafeA)(SafeB)(SafeC)<CR> (6058 only)
~ (Addr) 2 (Flag)
Command leading code. Address ID, range (00 - FF). Set host watchdog timer and safe state value. 0: Disable host watchdog timer 1: Enable host watchdog timer (1-character)
(TimeOut)
Host timeout value, between this time period host must send (Host is OK) command to module, otherwise module will change to safety state. Range 01 - FF. (2-character) One unit is 100 ms 01 = 1 * 100 = 100 ms FF = 255 * 100 = 25.5 sec
(SafeValue) 8 channels safety value of digital output channels when host is failure. (2character) (SafeH) Safety value of digital output channels 14 ~ 8 when host is failure. (2character) (SafeL) (SafeA) Safety value of digital output channels 7 ~ 0 when host is failure. (2-character) Safety value of port A channels 7 ~ 0 when host is failure while A in output mode. (2-character)
Pgina 91 de 107
(SafeB)
Safety value of port B channels 7 ~ 0 when host is failure while B in output mode. (2-character)
(SafeC)
Safety value of port C channels 7 ~ 0 when host is failure while C in output mode. (2-character)
Response
!(Addr)<CR> or ?(Addr)<CR> ! ? Command is valid. Command is invalid.
(Addr) Address ID
Example
Example for NuDAM-6050 : User command: ~0621121C<CR> Response: !06<CR> 06 2 1 12 Address ID Set host watchdog timer and safe state value. Enable host watchdog timer. Timeout value. 0x12 = 18 18 * 100 = 1800 ms 1C 1C (00011100) Digital output channel DO2, DO3 and DO4 are high, the others are low. Example for NuDAM-6058 : User command: ~0621121C1C1C<CR> Response: !06<CR> 06 2 1 12 Address ID Set host watchdog timer and safe state value. Enable host watchdog timer. Timeout value. 0x12 = 18 18 * 100 = 1800 ms 1C1C1C 1C (00011100) port A, B and C channel 2, 3 and 4 are high, the other are low.
Pgina 92 de 107
4.1.2.- Cdigo C
4.1.2.1.- Estructuras y variables utilizadas
En el cdigo fuente, se definen una serie de variables y funciones que se utilizan para realizar la implementacin del driver.
Variables globales
INPUT y OUTPUT: Indican la configuracin de la tarjeta RB16, como entradas y salidas respectivamente.
Variables internas
Int _numLineas = 16;
Cadena que contiene la descripcin del estado en que finaliz la ltima funcin. Si la operacin finaliz correctamente la cadena estar vaca. En caso contrario, contendr una descripcin del error producido.
Pgina 93 de 107
Estas dos ltimas variables, son las variables de error que identifican el estado en que finaliz una operacin. Si la ejecucin de una funcin da lugar a un error, se devuelve un valor negativo y se actualizan estas variables. El driver proporcionado por el fabricante define sus propios cdigos de error. En el epgrafe 4.3 se encuentra un listado de todos los posibles errores.
Pgina 94 de 107
Descripcin Realiza la operacin base elevado a exp y retorna el resultado. Aunque existe la funcin pow en C que realiza la misma operacin, se decidi implementar aqu esta funcin para evitar problemas de libreras en la implementacin en Ada.
Las funciones definidas, utilizan internamente la librera proporcionada por el fabricante. En el epgrafe 4.2.- Anexo A, se puede encontrar la descripcin detallada de aquellas funciones de la librera del fabricante que se han utilizado para realizar nuestra propia interfaz.
Las funciones de la librera del fabricante se representan con el siguiente formanto: InitLabjack().
LJ_Inicializar
Se invoca a la funcin InitLabjack() (de la librera del fabricante) para inicializar el mdulo. Se configura la tarjeta RB16, en funcin del valor del parmetro tipo, utilizando la funcin DigitalIO(). Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
Pgina 95 de 107
LJ_EscribeLinea_DO
Se tratan adecuadamente los valores, pues la tarjeta trabaja con lgica invertida. Se llama a la funcin EDigitalOut() para actualizar el valor de la lnea. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
LJ_LeeLinea_DI
Se llama a la funcin EDigitalIn() para obtener el valor de la lnea. Se retorna el valor adecuado, teniendo en cuenta que la tarjeta trabaja con lgica invertida. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
LJ_EscribeModulo_DO
Se tratan adecuadamente los valores, pues la tarjeta trabaja con lgica invertida. Se llama a la funcin DigitalIO() para actualizar los valores de las diecisis lneas de la tarjeta RB16. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
LJ_LeeModulo_DI
Se llama a la funcin DigitalIO() para obtener los valores de las diecisis lneas de la tarjeta RB16. Se tratan adecuadamente los valores, pues la tarjeta trabaja con lgica invertida, para retornar en un entero la codificacin de las diecisis lneas. Si falla alguno de los pasos anteriores se actualizarn convenientemente las variables de error (_nerror y _serror).
Pgina 96 de 107
function LJ_LeeLinea_DI (Modulo: Integer; Linea: Num_Linea) return Integer is function LJ_Ada_LeeLinea_DI (Modulo: Integer; Linea: Integer) return Integer; pragma Import (C, LJ_Ada_LeeLinea_DI, "LJ_LeeLinea_DI"); begin return LJ_Ada_LeeLinea_DI (Modulo, Linea); end LJ_LeeLinea_DI;
Las variables de identificacin del tipo de mdulo, se definen como valores enumerados. Tambin se definen nuevos tipos, derivados del tipo Integer y del tipo Float, con el rango de valores limitado. En las funciones que utilicen estos tipos, si se realiza una llamada con un valor fuera del rango, se producir una excepcin en tiempo de ejecucin.
Pgina 97 de 107
Si la ejecucin de una funcin da lugar a un error, se devuelve un valor negativo. Se recomienda utilizar las funciones ObtenerError y ObtenerErrorString para obtener el cdigo de error y una descripcin de este respectivamente.
LJ_Inicializar
Descripcin Esta funcin sirve para inicializar el mdulo y configurarlo para manejar las entradas o salidas del proceso. Se debe invocar esta funcin antes de llamar a cualquier otra. Sintaxis C/C++
int LJ_Inicializar (int modulo, int tipo);
Ada
function LJ_Inicializar (Modulo: Integer; Tipo: Device_Type) return Integer;
Argumentos Modulo: Nmero de serie o Local ID. Tipo: Configuracin que se desea otorgar a la tarjeta RB16 conectada al
mdulo, como entradas o salidas. Utilizar las variables INPUT y OUTPUT. Valor retornado 0 si todo fue correcto. -1 en caso de error durante la inicializacin. Slo para la versin en C/C++: -2 si la variable tipo no se corresponde con ninguna de las macros definidas.
Pgina 98 de 107
LJ_EscribeLinea_DO
Descripcin Esta funcin actualiza el valor de un canal de salida de la tarjeta RB16 conectada al mdulo LabJack U12 correspondiente. Sintaxis C/C++
int LJ_EscribeLinea_DO (int modulo, int linea, int valor);
Ada
function LJ_EscribeLinea_DO (Modulo: Integer; Linea: Num_Linea; Valor: U1) return Integer;
Argumentos Modulo: Nmero de serie del mdulo o Local ID. Linea: Valor: Nmero del canal de salida que se desea actualizar (entre 0 y 15). Valor de la lnea a actualizar (1: activar; 0: desactivar).
LJ_EscribeModulo_DO
Descripcin Esta funcin actualiza los diecisis canales de salida de la tarjeta RB16 conectada al mdulo LabJack U12 correspondiente. Sintaxis C/C++
int LJ_EscribeModulo_DO (int modulo, U16 valor);
Ada
function LJ_EscribeModulo_DO (Modulo: Integer; Valor: U16) return Integer;
Pgina 99 de 107
Argumentos Modulo: Nmero de serie o Local ID del mdulo. Valor: Entero donde estn codificados los valores de los diecisis canales
de la tarjeta RB16. Valor retornado El nmero de canales de la tarjeta RB16 si todo fue correcto. -1 en caso de error.
LJ_LeeLinea_DI
Descripcin Esta funcin lee el estado de un canal de entrada de la tarjeta RB16 conectada al mdulo LabJack U12 correspondiente. Sintaxis C/C++
int LJ_LeeLinea_DI (int modulo, int linea);
Ada
function LJ_LeeLinea_DI (Modulo: Integer; Linea: Num_Linea) return Integer;
Argumentos Modulo: Nmero de serie o Local ID del mdulo. Linea: Nmero del canal de entrada que se desea leer (entre 0 y 15).
Valor retornado El estado del canal de entrada (1: activo; 0: inactivo) si todo fue correcto. Un nmero negativo si hubo algn error.
LJ_LeeModulo_DI
Descripcin Esta funcin lee el estado de los diecisis canales de entrada de la tarjeta RB16 conectada al mdulo LabJack U12 correspondiente. El estado de las entradas se devuelve codificado en un entero que se ha de pasar a la funcin como argumento. Sintaxis C/C++
int LJ_LeeModulo_DI (int modulo, U16 * valor);
Ada
procedure LJ_LeeModulo_DI (Modulo: in Integer; Valor: in out U16; Retorno: out Integer);
Argumentos Modulo: Nmero de serie del mdulo o Local ID. Valor: Entero donde se codificar el estado de los diecisis canales de la
tarjeta RB16. Valor retornado 0 si todo fue correcto. -1 en caso de error. La implementacin de esta funcin en Ada se hace a travs de un procedimiento. El valor de retorno se devuelve a travs de la variable Retorno.
LJ_EscribeLinea_AO
Descripcin Esta funcin actualiza el valor de uno de los dos canales de salida analgicos de los que dispone el mdulo LabJack U12 (AO0-AO1). Sintaxis C/C++
int LJ_LeeModulo_DI (int modulo, U16 * valor);
Ada
function LJ_EscribeLinea_AO (Modulo: Integer; Linea: Num_Linea_Salida_Analog; Valor: Valor_Salida_Analog) return Integer;
Argumentos Modulo: Nmero de serie o Local ID del mdulo. Linea: Valor: Nmero del canal de salida analgico que se desea actualizar (0 1). Valor de la lnea a actualizar (entre 0.0 y 5.0).
ObtenerError
Descripcin Esta funcin sirve para obtener el estado en que finaliz la ltima operacin que se ha realizado. En el epgrafe 4.3.- Anexo C se pueden consultar todos los cdigos de error que puede devolver la funcin ObtenerError. Sintaxis C/C++
int ObtenerError (void);
Ada
function ObtenerError return Integer;
Valor retornado Un entero que identifica la situacin en que finaliz la ltima operacin.
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
ObtenerErrorString
Descripcin Esta funcin sirve para obtener una descripcin del estado en que finaliz la ltima operacin realizada. Si en la ltima llamada a una funcin se ha producido un error, mediante una llamada a esta funcin se obtendr una descripcin de ste. Sintaxis C/C++
char * ObtenerErrorString (void);
Ada
function ObtenerErrorString return string;
Valor retornado Una cadena con la descripcin del estado en que finaliz la ltima operacin realizada. Si en la ltima operacin no se produjo ningn error, se retornar una cadena vaca.
DigitalIO
Descripcin Lee y escribe los veinte canales de entrada/salida digitales. Sintaxis
long DigitalIO (long *idnum, long demo, long *trisD, long trisIO, long *stateD, long *stateIO, long updateDigital, long *outputD);
Argumentos *idnum: Nmero de serie, Local ID -1 para el primer mdulo encontrado. Identifica el mdulo sobre el que hay que ejecutar la operacin. demo: Permite emplear la funcin sin necesidad de tener conectados los
mdulos LabJack. Se debe indicar cero para operar normalmente y un valor mayor que cero para operar en modo demo. *trisD: trisIO: Configuracin de las direcciones D0-D15. 0=Input, 1=Output. Configuracin de las direcciones IO0-IO3. 0=Input, 1=Output.
*stateD: Estado de las lneas D0-D15. *stateIO: Estado de las lneas IO0-IO3.
updateDigital: Si es mayor que cero se escribirn los valores de las variables tris y state. En caso contrario, se realizar una lectura de los canales y se retornar en estas variables. Valor retornado 0 si todo fue correcto. Un cdigo de error (Labjack errorcodes) si se produjo algn error.
EDigitalOut
Descripcin Esta funcin es una versin simplificada de la funcin DigitalIO, que acta sobre un solo canal de entrada/salida. Sintaxis
long EDigitalOut ( long *idnum, long demo, long channel, long writeD, long state );
Argumentos *idnum: Nmero de serie, Local ID -1 para el primer mdulo encontrado. Identifica el mdulo sobre el que hay que ejecutar la operacin. demo: Permite emplear la funcin sin necesidad de tener conectados los
mdulos LabJack. Se debe indicar cero para operar normalmente y un valor mayor que cero para operar en modo demo. channel: Canal a actualizar. 0-3 para los canales IO, 0-15 para los canales D. writeD: state: Si es mayor que cero se actualiza un canal D, sino un canal IO. Si es cero el canal se activa, sino se desactiva.
Valor retornado 0 si todo fue correcto. Un cdigo de error (Labjack errorcodes) si se produjo algn error.
EDigitalIn
Descripcin Esta funcin es una versin simplificada de la funcin DigitalIO, que lee un canal de entrada/salida. Sintaxis
long EDigitalIn ( long *idnum, long demo, long channel, long readD, long *state );
Argumentos *idnum: Nmero de serie, Local ID -1 para el primer mdulo encontrado. Identifica el mdulo sobre el que hay que ejecutar la operacin. demo: Permite emplear la funcin sin necesidad de tener conectados los
mdulos LabJack. Se debe indicar cero para operar normalmente y un valor mayor que cero para operar en modo demo. channel: Canal a leer. 0-3 para los canales IO, 0-15 para los canales D. readD: state: Si es mayor que cero se lee un canal D, sino un canal IO. Variable en la que se retorna el estado del canal ledo.
Valor retornado 0 si todo fue correcto. Un cdigo de error (Labjack errorcodes) si se produjo algn error.
0 No error. 1 Unknown error. 2 No LabJacks found. 3 LabJack n not found. 4 Set USB buffer error. 5 Open handle error. 6 Close handle error. 7 Invalid ID. 8 Invalid array size or value. 9 Invalid power index. 10 FCDD size too big. 11 HVC size too big. 12 Read error. 13 Read timeout error. 14 Write error. 15 Turbo error. 16 Illegal channel index. 17 Illegal gain index. 18 Illegal AI command. 19 Illegal AO command. 20 Bits out of range. 21 Illegal number of channels. 22 Illegal scan rate. 23 Illegal number of samples. 24 AI response error. 25 LabJack RAM checksum error. 26 AI sequence error. 27 Maximum number of streams.
28 AI stream start error. 29 PC buffer overflow. 30 LabJack buffer overflow. 31 Stream read timeout. 32 Illegal number of scans. 33 No stream was found. 40 Illegal input. 41 Echo error. 42 Data echo error. 43 Response error. 44 Asynch read timeout error. 45 Asynch read start bit error. 46 Asynch read framing error. 47 Asynch DIO config error. 48 Caps error. 49 Caps error. 50 Caps error. 51 HID number caps error. 52 HID get attributes warning. 57 Wrong firmware version error. 58 DIO config error. 64 Could not claim all LabJacks. 65 Error releasing all LabJacks. 66 Could not claim LabJack. 67 Error releasing LabJack. 68 Claimed abandoned LabJack. 69 Local ID 1 thread stopped. 70 Stop thread timeout.
71 Thread termination failed. 72 Feature handle creation error. 73 Create mutex error. 80 Synchronous CS state or direction error. 81 Synchronous SCK direction error. 82 Synchronous MISO direction error.
83 Synchronous MOSI direction error. 89 SHT1X CRC error. 90 SHT1X measurement ready error. 91 SHT1X ack error. 92 SHT1X serial reset error.