Examen Informática Industrial â Septiembre 2011 ... - PoliformaT
Examen Informática Industrial â Septiembre 2011 ... - PoliformaT
Examen Informática Industrial â Septiembre 2011 ... - PoliformaT
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Examen</strong> Informática <strong>Industrial</strong> – <strong>Septiembre</strong> <strong>2011</strong><br />
Primera parcial (PC)<br />
Apellidos, nombre:<br />
Intrucciones:<br />
1. Rellenar “apellidos, nombre” en esta página.<br />
2. Rellenar “apellidos, nombre” y firmar en las hojas en blanco para contestar el<br />
examen.<br />
3. Entregar cada problema en hojas separadas.<br />
Problema 1: Módulo de datos y descomposición modular (3 ptos.).<br />
En una aplicación industrial para PC se desea compartir entre los distintos módulos la<br />
información de temperatura de 50 depósitos de líquidos.<br />
Se pide: Desarrollar el código adecuado para el módulo de datos que tiene que ver con<br />
almacenar y recuperar esta información y las funciones asociadas. Indica también el<br />
código contenido en el fichero de cabecera que permite el correcto acceso a estas<br />
funciones desde otros módulos.<br />
Problema 2: Módulo de proceso y salida digital (3,5 ptos.).<br />
Una electroválvula se conecta en la línea P0.4 de la tarjeta de adquisición de datos NI<br />
USB6008. Un valor alto abre la válvula.<br />
Se pide: Desarrollar una función con el prototipo void proceso_escribir_valvula (int<br />
estado) que maneje adecuadamente la válvula sin modificar el resto de líneas (utilizar<br />
una variable espejo). Desarrolla también la función void proceso_iniciar (void) que<br />
prepara la tarjeta de adquisición de datos para ser usada por la función desarrollada. El<br />
código propuesto debe comprobar el código de error en las llamadas a las funciones de la<br />
tarjeta.<br />
Problema 3 Módulo de proceso y entrada analógica (3,5 ptos.).<br />
Para conocer el nivel de un depósito de líquidos se emplea un sensor de comportamiento<br />
lineal que entrega 4 voltios cuando el depósito está vacío y 1 voltio cuando el depósito<br />
está lleno con 2000 litros. La salida del sensor se conecta a la entrada analógica AI0 de<br />
una tarjeta de adquisición de datos NI USB6008.<br />
Se pide: Desarrollar la función con prototipo double proceso_leer_nivel (void) que<br />
devuelve el nivel en litros del depósito utilizando esta configuración y con la mayor<br />
precisión posible. Desarrolla también la función void proceso_iniciar (void) que prepara<br />
la tarjeta de adquisición de datos para ser usada por la función desarrollada.
Información adicional: Lista de funciones de la tarjeta NI USB6008<br />
int32 DAQmxCreateTask (const char taskName[], TaskHandle *taskHandle);<br />
Ejemplo: daqerr = DAQmxCreateTask("mi primera tarea",&tarea);<br />
int32 DAQmxStartTask (TaskHandle taskHandle);<br />
Ejemplo: daqerr = DAQmxStartTask(tarea);<br />
int32 DAQmxStopTask (TaskHandle taskHandle);<br />
Ejemplo: daqerr = DAQmxStopTask(tarea);<br />
int32 DAQmxClearTask (TaskHandle taskHandle);<br />
Ejemplo: daqerr = DAQmxClearTask(tarea);<br />
int32 DAQmxCreateDOChan (TaskHandle taskHandle, const char lines[], const char<br />
nameToAssignToLines[], int32 lineGrouping);<br />
Ejemplo: daq_error = DAQmxCreateDOChan (actuators_task, “Dev0/port0”,"",<br />
DAQmx_Val_ChanForAllLines);<br />
int32 DAQmxCreateDIChan (TaskHandle taskHandle, const char lines[], const char<br />
nameToAssignToLines[], int32 lineGrouping);<br />
Ejemplo: errdaq = DAQmxCreateDIChan(mi_primera_tarea,”Dev0/port1“, “”,<br />
DAQmx_Val_ChanForAllLines);<br />
int32 DAQmxCreateAOVoltageChan (TaskHandle taskHandle, const char physicalChannel[],<br />
const char nameToAssignToChannel[], float64 minVal, float64 maxVal, int32 units, const char<br />
customScaleName[]);<br />
Ejemplo: daq_error = DAQmxCreateAOVoltageChan (pump_actuator_task, “Dev0/ao0”, "", 0.0,<br />
5.0, DAQmx_Val_Volts, NULL);<br />
int32 DAQmxCreateAIVoltageChan (TaskHandle taskHandle, const char physicalChannel[],<br />
const char nameToAssignToChannel[], int32 terminalConfig, float64 minVal, float64 maxVal,<br />
int32 units, const char customScaleName[]);<br />
Ejemplo: daq_error = DAQmxCreateAIVoltageChan (temperature_sensor_task, “Dev0/ai0”,<br />
"", DAQmx_Val_RSE, 0.0, 10.0, DAQmx_Val_Volts, NULL);<br />
int32 DAQmxWriteDigitalScalarU32 (TaskHandle taskHandle, bool32 autoStart, float64 timeout,<br />
uInt32 value, bool32 *reserved);<br />
Ejemplo: daq_error = DAQmxWriteDigitalScalarU32 (actuators_task, true, 0.0, mirror_DO,<br />
NULL);<br />
int32 DAQmxReadDigitalScalarU32 (TaskHandle taskHandle, float64 timeout, uInt32 *value,<br />
bool32 *reserved);<br />
Ejemplo: errdaq = DAQmxReadDigitalScalarU32(mi_primera_tarea,0.0,&data,NULL);<br />
int32 DAQmxWriteAnalogScalarF64 (TaskHandle taskHandle, bool32 autoStart, float64 timeout,<br />
float64 value, bool32 *reserved);<br />
Ejemplo: daq_error = DAQmxWriteAnalogScalarF64 (pump_actuator_task, true, 1.0, volts,<br />
NULL);<br />
int32 DAQmxReadAnalogScalarF64 (TaskHandle taskHandle, float64 timeout, float64 *value,<br />
bool32 *reserved);<br />
Ejemplo: daq_error = DAQmxReadAnalogScalarF64 (temperature_sensor_task, 1.0, &volts,<br />
NULL);