Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manuales Del Programador PDF
Manuales Del Programador PDF
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 -
- iii -
- iv -
-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:
Autor:
Fecha:
Junio 2005
Pgina 2 de 107
Puerto
Fichero
COM1
/dev/ttyS0
COM2
/dev/ttyS1
COM3
/dev/ttyS2
COM4
/dev/ttyS3
Pgina 3 de 107
strcpy(_puerto,"/dev/ttyS1");
_fd = open (_puerto, O_RDWR | O_NOCTTY);
if (_fd <
return _fd;
}
Pgina 4 de 107
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;
Pgina 5 de 107
Pgina 6 de 107
Miembro
Descripcin
c_cflag
Opciones de control
c_lflag
Opciones locales
c_iflag
Opciones de entrada
c_oflag
Opciones de salida
c_cc
Caracteres de control
c_ispeed
c_ospeed
Pgina 7 de 107
Las funciones que se utilizarn para llevar a cabo la configuracin del puerto
serie son:
estructura
termios
referenciada
por
termios_p.
El
argumento
Pgina 8 de 107
Pgina 9 de 107
//VARIABLES GLOBALES
char _puerto [15];
int _npuerto = -2;
int _velocidad = -2;
int _fd = -2;
struct termios _oldtio, _newtio;
switch(vel) {
case 300
: baud=B300;
_velocidad=vel; break;
case 1200
: baud=B1200;
_velocidad=vel; break;
case 2400
: baud=B2400;
_velocidad=vel; break;
case 9600
: baud=B9600;
_velocidad=vel; break;
case 19200
: baud=B19200;
_velocidad=vel; break;
case 38400
: baud=B38400;
_velocidad=vel; break;
case 57600
: baud=B57600;
_velocidad=vel; break;
: return -1;
cfsetospeed(&_newtio,baud);
cfsetispeed(&_newtio,baud);
if (tcsetattr(_fd,TCSANOW,&_newtio)==-1)
return -1;
return _velocidad;
}
Pgina 10 de 107
Pgina 11 de 107
Constante
Descripcin
CBAUD
B0
B50
50 baud
B75
75 baud
B110
110 baud
B134
134.5 baud
B150
150 baud
B200
200 baud
B300
300 baud
B600
600 baud
B1200
1200 baud
B1800
1800 baud
B2400
2400 baud
B4800
4800 baud
B9600
9600 baud
B19200
19200 baud
B38400
38400 baud
B57600
57,600 baud
B76800
76,800 baud
B115200
115,200 baud
EXTA
EXTB
CSIZE
CS5
5 data bits
CS6
6 data bits
CS7
7 data bits
CS8
8 data bits
CSTOPB
CREAD
Enable receiver
PARENB
PARODD
HUPCL
CLOCAL
LOBLK
CNEW_RTSCTS
CRTSCTS
Pgina 12 de 107
Constante
Descripcin
ICANON
XCASE
ECHO
ECHOE
ECHOK
ECHONL
Echo NL
NOFLSH
IEXTEN
ECHOCTL
ECHOPRT
ECHOKE
FLUSHO
PENDIN
TOSTOP
ISIG
and
Pgina 13 de 107
Constante
Descripcin
INPCK
IGNPAR
PARMRK
ISTRIP
IXON
IXOFF
IXANY
IGNBRK
BRKINT
INLCR
IGNCR
Ignore CR
ICRNL
Map CR to NL
IUCLC
IMAXBEL
Pgina 14 de 107
Constante
Descripcin
OPOST
OLCUC
ONLCR
Map NL to CRNL
OCRNL
Map CR to NL
NOCR
No CR output at column 0
ONLRET
NL performs CR function
OFILL
OFDEL
NLDLY
NL0
NL1
CRDLY
CR0
CR1
CR2
CR3
TABDLY
TAB0
TAB1
TAB2
TAB3
BSDLY
BS0
BS1
VTDLY
VT0
VT1
FFDLY
FF0
FF1
Pgina 15 de 107
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:
Descripcin
Clave
VINTR
Interrupt
CTRLC
VQUIT
Quit
CTRLZ
VERASE
Erase
Backspace (BS)
VKILL
Killline
CTRLU
VEOF
Endoffile
CTRLD
VEOL
Endofline
VEOL2
Second endofline
VMIN
VSTART
Start flow
CTRLQ (XON)
VSTOP
Stop flow
CTRLS (XOFF)
VTIME
Pgina 16 de 107
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.
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 serie del PC que se desea abrir. Se deben utilizar las
Puerto:
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);
Argumentos
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:
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);
Argumentos
Buffer:
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
Argumentos
Puntero al buffer en donde se almacenar la informacin leda.
Buffer:
Plazo:
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
National
Instruments,
mediante
el
documento
FP-1000/FP-1001
[start]
[address]
[command]
del
rango
A-Z
a-i).
Para
los
comandos
Pgina 24 de 107
[end]
Pgina 25 de 107
En el epgrafe 2.3 se ofrece la descripcin de los errores que pueden devolver los
dispositivos FieldPoint.
Pgina 26 de 107
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
Pgina 27 de 107
mdulos
de
E/S,
tendrn
como
direccin
fsica,
la
direccin
base
red
tendr
la
direccin
fsica
base+1,
el
siguiente
base+2
as
sucesivamente.
Direccin
fsica
Mdulo
Mdulo
Mdulo
Mdulo
FP-1000
FP-DI-301
FP-RLY-420
FP-RLY-420
base
base + 1
base + 2
base + 3
Posicin
en el bus
(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
0x0105
#define _FPRLY420
0x0108
Contienen los cdigos del fabricante para identificar los distintos mdulos. Este
identificador es nico para cada tipo de mdulo.
Error
Pgina 29 de 107
Valor
CORRECTO
Descripcin
En la ltima operacin no se produjo ningn error
ERROR_COM
-101
FD_INVALIDO
-102
TIMEOUT
-103
RESPUESTA_ERRONEA
-200
dispositivo
ha
devuelto
una
respuesta
considerada errnea
No hay memoria dinmica reservada. Se puede
producir por dos causas:
ERROR_MEM
-300
NO_MODULO
-400
NO_DINPUT
-401
NO_DOUTPUT
-402
NO_LINEA
-500
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;
int _deviceNumber;
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;
int _velocidad;
int _numModulos;
DEVICE * _bus;
Pgina 32 de 107
Variables internas
BUS DeviceBus = {0};
int _nerror;
char _serror[255]
int estado = 0;
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
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:
Pgina 38 de 107
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;
Argumentos
Puerto
Puerto:
serie
del
PC
que
se
va
ha
emplear
para
la
Valor retornado
0 si todo fue correcto.
-1 en caso de error.
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
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;
Valor retornado
0 si todo fue correcto.
-1 en caso de error.
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:
Valor retornado
0 si todo fue correcto.
-1 en caso de error.
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
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.
Entero donde estn codificados los valores de los ocho canales del
Valor:
mdulo.
Valor retornado
El nmero de canales del mdulo si todo fue correcto.
-1 en caso de error.
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.
Nmero del canal de entrada que se desea leer (entre 0 y 15).
Linea:
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.
Entero donde se codificar el estado de los diecisis canales de
Valor:
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;
Argumentos
Modulo: Posicin del mdulo en el bus local.
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 Syntax
Success Response
Utility Commands:
Power Up Clear
Reset
A[type]
Configure Positions
G[positions]
Configure As Inputs
H[positions]
Configure As Outputs
I[positions]
A[config]
D[positions][wdgTmo]
m[positions][data]
m[positions][wdgTmo]
Write Outputs
J[positions]
Activate Outputs
K[positions]
Deactivate Outputs
L[positions]
A[data]
J[positions][data]
K[positions]
A[data]
L[positions]
A[data]
S[positions][data]
Configuration Commands:
Watchdog Commands:
Discrete Commands:
Analog Commands:
Pgina 47 de 107
Command Syntax
Success Response
Utility Commands:
Read Module ID
!A
A[modID]
!B
A[number][modarray]
!b[flag]
!c
!e
!N
A[mod_status]
!O[positions]
A[chnl_status]
!P
A[bank_status]
Reset Module
!Z
!n[positions]{[command
type][command] pairs}
Set Attributes
!D[positions]{[attrMask]
[rangeMask][settings] triplets}
Get Attributes
!E[positions]{[attrMask]
[rangeMask] pairs}
A{[settings] array}
Read Discrete
!J
A[data]
!K
A[status][data]
Write Discrete
!L[positions][data]
!M[positions][data]
A[status]
!F[positions]
A[data]
!G[positions]
A[status][data]
!H[positions][data]
A[positions][data]
!I[positions][data]
A[status]
Configuration Commands:
Discrete Commands:
Analog Commands:
Pgina 48 de 107
Command Syntax
Success Response
Watchdog Commands:
Set Watchdog Delay
!Q[wdgTmo]
A[wdgTmo]
!R[positions][wdgData]
!S[positions][wdgData]
!T[positions][mask]
!U
A[moduleInfo] [chnlEnable]
[chnlWdgData]
Store Attributes
!f[positions]{[attrMask]
[rangeMask][settings] triplets}
!g[positions][data]
Store Discrete
!h[positions][data]
!i[positions][wdgData]
!j[positions][wdgData]
!k[positions][mask]
!l[wdgTmo]
!V[wdgTmo]
Store SnapShot
!W
Use SnapShot
!X[flag]
A[flag]
!Y
A[status]
SnapShot/Programmable
Power-Up
Commands:
Pgina 49 de 107
Comandos utilizados
Power Up Clear
[cmdchars] = A
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.
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
Description
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.
Module Name
0001
FP-1000
0002
FP-1001
0101
FP-AI-110
0102
FP-AO-200
0103
FP-DI-330
0104
FP-DO-400
0105
FP-DI-301
0106
FP-DO-401
0107
FP-TC-120
0108
FP-RLY-420
0109
FP-DI-300
010A
FP-AI-100
010B
FP-RTD-122
010C
FP-AI-111
010D
FP-CTR-500
[modID] Value
Pgina 51 de 107
Module Name
010E
FP-PWM-520
010F
FP-AO-210
0110
FP-DO-410
0111
FP-DO-403
FFFF
Empty Base
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
Description
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]
Four ASCII-hex characters, specifying the status of the channels targeted by this
[status]
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.
Four ASCII-hex characters, specifying the channel levels. A 1 in any bit means that
[data]
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
Description
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
Description
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
Reset Module
Pgina 55 de 107
[cmdchars] = !Z
Description
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
02
E_BAD_CHECKSUM
03
E_INBUF_OVRFLO
04
E_ILLEGAL_CHAR
05
E_INSUFF_CHARS
06
E_WATCHDOG_TMO
07
E_INV_LIMS_GOT
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
82
E_INBUF_FRMERR
83
E_NO_MODULE
84
E_INV_CHNL
85
E_INV_RANGE
86
E_INV_ATTR
88
E_HOTSWAP
89
E_ADDR_NOT_SAME
8A
E_NO_RESEND_BUF
8B
E_HW_FAILURE
8C
E_UNKNOWN
Pgina 59 de 107
(Leading Code)
(Addr)
(Command)
[Data]
[Checksum]
Dos
caracteres
ASCII
en
hexadecimal.
Este
campo
es
Pgina 60 de 107
<CR>
Pgina 61 de 107
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
Pgina 62 de 107
Direccin
fsica
Posicin
en el bus
Mdulo
Mdulo
Mdulo
ND-6053
ND-6058
ND-6053
105
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.
Error
Pgina 64 de 107
Valor
0
CORRECTO
Descripcin
En la ltima operacin no se produjo ningn error
ERROR_COM
-101
FD_INVALIDO
-102
TIMEOUT
-103
RESPUESTA_ERRONEA
-200
dispositivo
ha
devuelto
una
respuesta
considerada errnea
No hay memoria dinmica reservada. Se puede
producir por dos causas:
Si
-300
ERROR_MEM
no
se
ha
llamado
la
funcin
de
NO_MODULO
-400
NO_DINPUT
-401
NO_DOUTPUT
-402
NO_LINEA
-500
NO_PORT
-600
BUS_VACIO
-700
Macros internas
#define _ND6053
6053
#define _ND6058
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;
int _deviceNumber;
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;
int _velocidad;
int _numModulos;
DEVICE * _bus;
Variables internas
BUS DeviceBus = {0};
int _nerror;
char _serror[255]
Pgina 67 de 107
int estado = 0;
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);
Descripcin
Esta funcin inicializa todos los mdulos del bus.
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
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
Pgina 72 de 107
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;
Argumentos
Puerto
Puerto:
serie
del
PC
que
se
va
ha
emplear
para
la
Valor retornado
0 si todo fue correcto.
-1 en caso de error.
Conjunto de drivers para tarjetas de adquisicin de seales bajo Linux
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;
Valor retornado
0 si todo fue correcto.
-1 en caso de error.
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 de la tarjeta donde se encuentra la lnea a actualizar (utilizar
Puerto:
Valor:
Valor retornado
0 si todo fue correcto.
-1 en caso de error.
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:
Entero donde estn codificados los valores de los ocho canales del
puerto.
Valor retornado
El nmero de canales del puerto si todo fue correcto.
-1 en caso de error.
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
Entero donde estn codificados los valores de las ocho canales del
Entero donde estn codificados los valores de las ocho canales del
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:
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.
Entero donde se codificar el estado de los diecisis canales de
Valor:
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
Syntax
Module
General Commands
Set Configuration
%(OldAddr)(NewAddr)(TypeCode)
ALL
(BaudRate)(CheckSumFlag)
Read Configuration
$(Addr)2
ALL
$(Addr)M
ALL
$(Addr)F
ALL
Reset Status
$(Addr)5
ALL
Functional Commands
Synchronized Sampling
#**
6050, 6052,
6053, 6054,
6058, 6060
$(Addr)4
6050, 6052,
6053, 6054,
6058, 6060
Digital Output
#(Addr)(ChannelNo)(OutData)
6050, 6060,
6063
#(Addr)(Port)(Odata)
6056, 6058
#(Addr)(Port)(ChannelNo)(BitData)
6056,6058
#(Addr)T(OdataA)(OdataB)(OdataC)
6058
Digital Input
$(Addr)6
ALL
$(Addr)S(IOSts)
6058
Special Commands
Read Command Leading Code Setting
~(Addr)0
ALL
~(Addr)10(C1)(C2)(C3)(C4)(C5)(C6)
ALL
~(Addr)2(Flag)(TimeOut)(SafeValue)
ALL
~(Addr)3
ALL
Change Polarity
~(Addr)CP(Status)
ALL
Read Polarity
~(Addr)CR
ALL
Host is OK
~**
ALL
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>
!
Command is valid.
Command is invalid.
(Addr)
Address ID.
Example
User command: $302<CR>
Response: !30400600<CR>
!
Command is valid.
30
Address ID.
40
06
00
checksum is disable.
Pgina 86 de 107
Syntax
$(Addr)M<CR>
(Addr)
Address ID.
Response
!(Addr)(ModuleName) <CR> or ?(Addr)<CR>
!
Command is valid.
Command is invalid.
Example
User command: $30M<CR>
Response: !306050<CR>
!
Command is valid
30
Address.
6050
Pgina 87 de 107
Digital Output
Description
Set digital output port channel value at specified address. This command is only available to modules
involving the multiport digital output function.
Syntax
#(Addr)(Port)(OutData)<CR> (6056, 6058 only)
#
(Addr)
Address ID (2-character)
(Port)
(OutData)
* 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
Pgina 88 de 107
Digital Input
Description
Read the digital input channel value and readback the digital output
channel value.
Syntax
$(Addr)6<CR>
(Addr) Address ID
Digital data input command.
Response
ND-6053 module response : !(DataInH)(DataInL)00<CR>
or
?(Addr)<CR>
Command is valid.
Command is invalid.
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>
**
Host is OK.
Response
Note: Host is OK command has NO response.
Pgina 89 de 107
Syntax
$(Addr)S(IOFlag)<CR> (6058 only)
$
(Addr)
Address ID
(IOFlag)
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)
(Flag)
(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)
(SafeL)
(SafeA)
(SafeB)
Pgina 91 de 107
(SafeC)
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
Address ID
12
1C
1C (00011100) Digital output channel DO2, DO3 and DO4 are high, the others are
low.
Address ID
12
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;
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.
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
Pgina 97 de 107
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:
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:
Valor retornado
0 si todo fue correcto.
-1 en caso de error.
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.
Entero donde estn codificados los valores de los diecisis canales
Valor:
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:
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.
Entero donde se codificar el estado de los diecisis canales de la
Valor:
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:
Valor retornado
0 si todo fue correcto.
-1 en caso de error.
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:
trisIO:
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:
state:
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:
state:
Valor retornado
0 si todo fue correcto.
Un cdigo de error (Labjack errorcodes) si se produjo algn error.
0 No error.
1 Unknown error.
29 PC buffer overflow.
2 No LabJacks found.
40 Illegal input.
7 Invalid ID.
41 Echo error.
43 Response error.
12 Read error.
14 Write error.
48 Caps error.
15 Turbo error.
49 Caps error.
50 Caps error.
18 Illegal AI command.
19 Illegal AO command.
24 AI response error.
26 AI sequence error.
error.
80 Synchronous CS state or
direction error.
error.
error.