Full text
DISEÑO,IMPLEMENTACIÓNY PUESTAAPUNTODEUNSISTEMA DECONTROL PARAUNMOTORDECORRIENTE CONTINUA ALUMNO:JESÚSBRUNCONEJOS DIRECTOR:JORGEMÁSESTELLES INGENIEROTÉCNICOENINFORMATICADESISTEMAS 25/08/2011
TABLA DE CONTENIDOS 1. RESUMEN 2. INTRODUCCIÓN 3. FUENTEDEALIMENTACIÓN 3.1Característicasdelafuente 3.2Conjuntodebotonesparalasfuncionesprincipales 3.3 Modificacióndeladireccióndelafuente 3.4ComandosSCPI 4 ADAPTADORGPIB‐USB 4.1 Adaptador 4.2Instalacióndelosdriversdeladaptador 4.3ConocerelpuertoCOMdondesehainstaladoeladaptador 5 BIORREACTOR 6 IEEE448 6.1Introducción 6.2BusGPIBnivelfísico(IEEE‐488.1) 6.3Modelooperativodelosequipos(IEEE‐488.2) 6.4SCPI 7 CONTROLMSCOMM 7.1Características 7.2Propiedades 7.3Propiedadespropiasdeltiempodeejecución 8 LAAPLICACIÓN 8.1Utilidad 8.2Diseño 8.3Ficherodedatosdelmuestreo
9 FASESDELDESARROLLODELPROYECTO 10 INSTRUCCIONESDEUSO 10.1 InstalacióndeladaptadorGPIB 10.2Conexióndelafuentedealimentación 10.3CopiadearchivosnecesariosparaelcontrolMSCOMM 10.4 Instalaciónprogramavisualstudio 10.5 Utilizacióndelprograma 11 CÓDIGOIMPLEMENTADO 11.1 Inicio.cs 11.2 Configuracion.cs 11.3 Ensayo.cs 11.4 Ensayo_ciclos.cs 12 CONCLUSIONES
1. RESUMEN Esteproyectoconsisteeneldiseñodeunsistemapararealizarelcontroldeunmotor decorrientecontinua.Elproyectosebasaprincipalmenteenlacreacióndeuna aplicación,queserálaencargadadecontrolarelmotordecorrientecontinua.Dicho motorsehaempleadoparacontrolarunbiorreactorutilizadoenlaregeneraciónde tejidosbiológicos.Laprincipalfuncióndeestaaplicaciónserárealizarunmuestreode laintensidadconsumidaporelmotor,alqueestaráconectada,paraconocerlafuerza quehaceelbiorreactor.Parallevaracaboelproyectocontaremosconunafuentede alimentación,queconectaremosalmotor,yunadaptadorparapuertoGPIB,conel queconectaremosnuestraaplicaciónalafuentedealimentación. Enestamemoriadescribiremosvariosconceptosempleadosparaeldesarrollo,así comoelmaterialutilizadoyelcódigoprogramadoparalacreacióndelaaplicación. PALABRASCLAVE: ControlMotorIntensidadFuerzaCorrienteGPIB
2. INTRODUCCIÓN Elproyectodesarrolladodebasaeneldiseñoeimplementacióndeunsistemaparael controldeunmotordecorrientecontinua,elcualseemplearáparacontrolarun biorreactorutilizadoenlaregeneracióndetejidosbiológicosparafinesterapéuticos. Estemotordecorrientecontinuaserácontroladoatravésdeunafuentede alimentación,quelesuministrarálacorrientenecesariasegúnlasnecesidades,así comotambiénserálaencargadadeconocerlosesfuerzosaplicadosporelbiorreactor. Paraconoceresteesfuerzo,elsistemadebesercapazdesaberencadamomentola intensidadconsumidaporelmotorparapoderobtenerlafuerzaejercida. LafuenteempleadaseráconectadaalsistemamedianteelbusGPIB,pordondefluirá lainformaciónnecesariaparaestablecerlacomunicación.Lafuenteutilizadaesuna fuenteprogramablemedianteelestándardeordenesSCPIempleadoenaparatosde medida. Laaplicación,quesehadiseñadoparallevaracaboestasacciones,debepermitir programarelfuncionamientodeseadosobreelbiorreactor,asícomolacorrectatoma dedatosdefuerzaaplicada,queseránalmacenadosenunficheroparaquepuedanser posteriormenteanalizados.Estaaplicaciónsedesarrollaráenellenguajede programaciónC#utilizandoelentornodedesarrolloMicrosoftVisualStudio2008. Enestamemoriaprimerorealizaremosunrepasoaloscomponentesyaparatos empleadosenelproyecto,comosonlafuenteyaladaptadorparalaconexióndedicha fuente. Luegoveremosenquésebasaelfuncionamientodelbiorreactor,aunqueestaparte noescompetenciadeesteproyectoyveremoscómofuncionaelestándarIEEE448, tantoanivelfísicocomoanivellógico.TambiénrepasaremoselcontrolMSCOMM empleadoenlacomunicaciónconlafuenteyexplicaremosenquésebasalaaplicación diseñadapararealizarelcontrol,asícomorealizaremosunaexplicacióndelasfasesdel desarrollollevadasacaboenlarealizacióndelproyecto. Porúltimo,explicaremoscómoseemplealaaplicacióndiseñadaytambién explicaremoselcódigoimplementadoparalacreacióndelaaplicación.
3. FUENTE DE ALIMENTACIÓN LafuentedealimentaciónempleaenelproyectoeselmodeloPPT‐1830delamarca GWINSTEK.EstaesunafuenteprogramableatravésdelpuertoGPIB(IEEE448) medianteSCPI,quesetratadeunestándardecomandosparainstrumentos programables.Másadelantehablaremossobreestosdosestándares. 3.1Característicasdelafuente: Lafuentedisponedetressalidas,dosdeellasnosproporcionande0Va18Vconhasta 3Ayunatercerasalidaqueproporciona0‐6Vconhasta5A. EnlapartetraseraencontramoselpuertoGPIB,dondeconectaremosnuestro adaptadorparacomunicarnosconlafuente. 1.ConectorGPIBtraserodelafuente Enlapartefrontaldelafuentevemosarribaunapantalladondesenosmuestrael voltaje,laintensidadyelcanalqueestamosutilizando.Aladerechatenemosun tecladonuméricoconelqueseespecificanalgunosparámetrosdeconfiguracióndela fuente.Alaizquierdavemosenverdeunbotónqueeselinterruptorparaapagary encenderlafuente.Enlaparteinferiorseencuentranlasconexionesdelas3salidasde lafuente.Enlapartecentraltenemosunconjuntode12botonesconalgunasdelas funcionesmásutilizadasyprincipalesqueacontinuaciónvamosaampliar.
2Frontaldelafuente Lafuentedisponede2modos:ellocalyelremoto.SiutilizamoselpuertoGPIBpara comunicarnosconlafuente,entoncesseactivaráautomáticamenteelmodoremotoy apareceráeneldisplaydelafuentelasletrasRMT.Conlafuente,enestemodo,si pulsamosalgúnbotóndelpanelfrontal,notendráningúnefecto.Paratrabajarconlos botonesdelpanelfrontallafuentedebeestarenmodolocal,quemásadelante veremoscómoseactiva.SinoapareceeneldisplaylasletrasRMT,esqueestamosen elmodolocal. 3Displayconelmodoremotoactivado.
3.2Conjuntodebotonesparalasfuncionesprincipales Vamosaverlasfuncionesdelosbotonesquenosseránnecesarios. OUTPUTON/OFF:Activaydesactivalassalidasdelafuente.Sinoactivamoslas salidas,aunquehayamosconfiguradoyalacorrienteyelvoltaje,nohabrásalidareal enlafuente.Estebotónsíquefuncionaaunqueestemosenmodoremoto. SHIFT:ElbotónSHIFTsirveparapoderactivarlasegundafunciónquetienenalgunos botonesdeestepanel.Estosbotonestienenlasegundafunciónindicadaenazul encima.ParaactivarestasfuncioneshayquepulsarprimeroSHIFTyluegoelbotón correspondiente. I:Estosdosbotonessirvenparamodificarellímitemáximodecorrientequepuede suministrarlafuente.Lavariaciónapareceráeneldisplaydelafuenteque correspondealaintensidad.Elbotónconlaflechahaciaarribaaumentalaintensidady conlaflechahaciaabajoladisminuye.SihemospulsadoantesSHIFT,elbotónconla flechahaciaarribaponealafuenteenelcanal1. V:Formadotambiénpor2botones,sirvenparamodificarelvoltajequesuministrarála fuente.Lavariaciónapareceráeneldisplaydelafuentequecorrespondealvoltaje. Elbotónconlaflechahaciaarribaaumentaelvoltajeyconlaflechahaciaabajola disminuye.SihemospulsadoSHIFTantesestosbotonesponenalafuenteenelcanal2 o3. LOCAL:Estebotónhacequelafuentevuelvaalmodolocal.Paraquetenganefectolos botonesdeestepanel,lafuentedebeestarenestemodo.SihemospulsadoSHIFT antes,activaremoslafunciónADDR,quesirveparacambiarladirecciónquetendrála fuenteenelbusGPIByqueserviráparacomunicarnosdeformaremota.
3.3Modificacióndeladireccióndelafuente ParamodificarladireccióndelafuentedentrodelbusGPIB,debemospulsarelbotón SHIFTyluegoelbotónLOCAL,osiestamostrabajandoenmodoLocal,conpulsar directamenteelbotónLOCALbastará.Unavezrealizadoesto,eneldisplaynos apareceráladirecciónenlaqueestáconfiguradalafuente. Nosotroshemosdetrabajarconlafuenteenladirección1,portantoparamodificar estevalortenemosquepulsarelbotón1deltecladonuméricodeladerechayluegola flechaqueaparecetambiénendichotecladonumérico.Conestospasosyatendremos configuradalafuenteenladirección1. Unavezconfigurada,noseránecesariovolveraconfigurarlacadavezquela encendamosporquelafuenteguardanuestraconfiguración.
4.3ConocerelpuertoCOMdondesehainstaladoeladaptador Comohemoscomentado,eladaptadorseinstalacomounpuertoserievirtual;por tantotieneunadirecciónCOM,lacualhemosdeconocerparadespuésintroducírsela alprograma. Paraconocerestadirección,primerotendremosquetenereladaptadorconectadoal ordenadoryconlosdriversyainstalados,yluegoira: Paneldecontrol Sistema Pestaña Administradordedispositivos Luego,dentrodeAdministradordedispositivos,hemosdeiralasección Puertos(COM&LPT)yahínosapareceráunaentradaconelnombredeladaptador. Endichaentradaaparecerá,alfinaldelnombreentreparéntesis,elnúmerodelpuerto COMqueenelcasodelaimagenesel5.
5. EL BIORREACTOR Aunquelaparterelacionadaconelbiorreactornoentraenesteproyecto,vamosa incluirlaexplicacióndecuálessufuncionamiento. ElbiorreactorconstruidoenelCBITdelaUPVconstadeunmotoreléctricode corrientecontinuadeimánpermanentealimentadoporunafuentedealimentacióna unatensiónVajustableentre0y12V.ElmotorconsumeunacorrienteIrelacionada conelparquedesarrollaencadainstante,Mm.Lacorrienteconsumidasinmuestra (corrienteenvacío,I0)eslacorrientenecesariaparavencertodoslosrozamientosde lacadenacinemática.Lavelocidaddegirodelmotorwmestárelacionadaconlafuerza contraelectromotrizdelmotor,e’.Laresistenciainternadelmotor,ennuestrocaso,es deRi=0,4Ω.Finalmente,elparámetrok’querelacionaparconcorrienteyvelocidad degiroconfuerzacontraelectromotrizesk’=0,0155Nm/AóVs. LosvaloresdeRiyk’hansidocalculadosdeformaexperimental. Lasecuacionesdelmotorson: Elmotormueveunreductor,cuyasalidavaconectadaaunaexcéntrica,quemuevela palancadetransmisión.Larelacióndereduccióndelreductoresder=104a1,porlo queelparylavelocidaddegirodelaexcéntricaserán: Lafrecuenciafdelmovimientoaplicadoalaprótesisdetendónes YelperíodoTededichomovimiento,
Lasdimensionesdelaexcéntricadeterminanlaamplituddel movimiento.Sisugeometríaesladeldibujo(valoresenmm), laamplituddelmovimientodelpuntodelapalancade transmisiónencontactoconella(A)esdee=4mm.La velocidaddedichomovimiento(asumiendounagráfica desplazamientofrenteatiempoenformadedientedesierra) es Siconsideramoslaconservacióndelapotenciaentreelmovimientodegirodela excéntricayelmovimientoalternativo,podemoscalcularlafuerzaFequelaexcéntrica produceenlapalancadetransmisiónenelpuntoA: Teniendoencuentalasdimensionesleylppodemoscalcularlafuerzaaplicadaala muestracolocadaenelbiorreactorFp: Asípues,lafuerzaaplicadaalaprótesissólodependedelacorrienteconsumidaporla fuentequealimentaelmotoryunaseriedeparámetrosgeométricosconocidos.Si consideramoslosvaloresconocidos entoncesresultaqueFp=2532(I‐0,8)N Silacorrienteenuninstantedadoes,porejemplo,de0,9A,lafuerzaaplicadaal biorreactorseríadeFp=253N;sihaycolocadasdosmuestras,cadaunadeellas soportaríaunos125N. Enrealidad,estosvaloresdebenserminoradosporquelacadenadetransmisiónno escompletamenterígida,yalexistirholguras,lafuerzarealmenteaplicadaala muestraesmenor.
6. IEEE 448 Comohemoscomentadoantes,lacomunicaciónconlafuentelarealizamosmediante elbusGPIB.Veamoslascaracterísticasdeesteestándar. 6.1INTRODUCCIÓN GPIBesunestándardeconexiónquepermitelacomunicacióndeunordenadorcon instrumentoselectrónicosdemedida,comopuedenserfuentesdealimentación, osciloscopios,etc.LassiglascorrespondenaGeneralPurposeInterfaceBus,peroa pesardeestenombre,fuediseñadoespecíficamenteparalaconexióndeinstrumentos demedida. LafuncionalidaddelestándarGPIBhaevolucionadoalolargodeltiempoyse encuentradescritoenlassiguientesespecificaciones: IEEE488.1(1975):Especificaciónquedefinelascaracterísticasdenivelfísico (mecánicoyeléctrico),asícomosuscaracterísticasfuncionalesbásicas. IEEE488.2(1987):Especificaciónquedefinelasconfiguracionesmínimas,los comandosyformatosdedatosbásicosycomunesatodoslosequipos,el manejodeerroresylosprotocolosquesesiguenenlascomunicaciones. SCPI(StandardCommandsforProgrammableInstrumentation):Especificación construidasobreelestándarIEEE488.2,quedefineunaestructurade comandosestándaraceptadospormúltiplesinstrumentosdemuchos fabricantes. ComponentesqueseutilizanenelcontroldelainstrumentaciónporGPIB Equipo:Instrumentodelentornoquesecontrola.Debeestardotadoconuna tarjetahardwaredeconexiónalbusGPIB.Parasucontroldisponedesoftware internodecontrolqueinterpretalosmensajesquerecibeporelbusGPIBe interaccionaconelfirmwarepropiodelequipo.El“Parser”eselthreadde gestióndelintercambiodemensajesporelbusGPIB. NivelFísico(IEEE488.1):Lacomunicaciónentrelosequipossebasaenunbus físico,compuestoporunconjuntodelíneasconniveleslógicosbiendefinidosy conprotocolosdecomunicaciónbasadosenlosestadoslógicosdelaslíneas.
NivelOperativo(IEEE488.2):Elprotocolooperativobásicodentrodelquese encuadraelintercambiodeinformación,datoseinstruccionesbásicasde control. DriverGPIB(SCPI):ElcomputadorinteraccionaconelbusGPIBatravésdeuna tarjetadecontrolhardwarequeresuelveyatiendelosdosprotocolos anteriores.Elpropiofabricanteofreceunainterfazsoftwareimplementadapor unconjuntodefuncionesquepermitenelaccesodelosprogramasala funcionalidaddelbus.Puedeofertarunainterfazconstituidaporunalibrería defuncionesquecorrespondeallenguajeSCPI. CaracterísticasdeBusGPIB LascaracterísticasmásrelevantesdeestebusGPIBsonlassiguientes: a) Permitelainterconexióndehasta15equipos,delosqueunodeellosesel controlador,queestablecelafunciónquedebeejercercadaunodelosotros. b) Undispositivoconectadoalbus,puedeenviarorecibirinformaciónhaciao desdecualquieradelosotros14equipos.Aveces,lapropianaturalezadeun equipohacequesóloestécapacitadopararecibir(p.e.unaimpresora),osólo capacitadoparaenviar(p.e.uncontador),oambascosas(p.e.un osciloscopio,ouncomputador) c) Ellímiteprácticodevelocidaddeintercambiodedatosesde500Kbytes/s(olo queeslomismo4Mbits/s). d) Lainterconexiónentreequiposserealizautilizandocablesde25hilos, finalizadosenconectoresdedobleboca(machoporunladoyhembraporel otro),quepermitelainterconexióndelosequiposencualquierconfiguración (estrella,línea,ocualquiercombinacióndeellas). e) Laslongitudesmáximaspermitidasenloscablesesde20metros.Loscables quesecomercializansonde1,2,4y8metros. 6.2BUSGPIBNIVELFISICO(IEEE‐488.1) EstructuradelBusGPIB ElbusGPIBestábasadoen16líneasactivas,ademásdelatierra.Estas16líneasse organizanentresbuses: BusdeDatos(DIO1‐DIO8)(Datainput/output):Esunbusbidireccionalde8 líneasorientadoalatransferenciadebytesodecaracteresASCII. Busdesincronizacióndelatransferenciadedatos:Esunconjuntodetres líneas(DAV:Datavalid,NRFD:NotReadyForDatayNDAC:NotDataACcepted)
queseutilizandeformacoordinadaparaasegurarlatransferenciadedatos entrelosequipos. Busdecontrol:Estáconstituidopor5líneas(ATN:ATteNtion,IFC:InterFace Clear,SRQ:ServiceReQuest,REN:RemoteENable,yEOI:EndOrIdentify)que seutilizanparatransferircomandosentrelosequipos,relativosalmodode interpretarlosdatosquesetransfieren,ocomandosbásicosdegobiernodela interfazdelbus. ConectorestándardeaccesoalBusGPIB
SignificadodelaslíneasdelBusGPIB DATALINE(DIO1‐DIO8): Las8líneasdedatospermitenqueelúnicoequipoestablecidocomo"talker"(o enotroscasosel"controller")envíeunbyteenparalelohaciatodosaquellos equiposqueeneseinstanteesténdefinidoscomo"listener". DATAVALID(DAV): Esunadelaslíneasdesincronizaciónquepermitelatransferenciadedatospor elbus,gobernadaporlosequiposestablecidoscomo“talker”.UnTRUElógico enestalíneasignificaqueelequipoestablecidocomo"talker"activoha establecidounosdatosválidossobreelbusdedatos,quedeberánserleídos portodoslosequiposestablecidoscomo"listener". NOTREADYFORDATA(NRFD): Esotradelaslíneasdesincronización,queesgobernadaporlosequipos establecidoscomo"listener".CuandoestalíneaestáenestadológicoTRUE, significaquealgúnequipodeentrelos"listener"noestáaúndispuestopara aceptarnuevosdatos.ElqueestalíneaseencuentreenestadológicoTRUE inhibealequipo"talker"aqueinicieelenvíodeunnuevodato.Elqueesta líneaestéenestadológicoFALSE,significaquetodoslosequipos"listener"se encuentranalaesperadeunnuevodato,momentoenelqueel“talker”puede establecereldatoenelbus. NODATAACCEPTED(NDAC): Eslaterceralíneadesincronizacióndedatos,yesgobernadaporlosequipos queestánestablecidoscomo"listener".Cuandoseencuentraenestadológico TRUE,significaquealgunodelosequiposestablecidoscomo"listener"aúnestá pendientedeleerundato,yenconsecuencia,el“talker“debeesperaraúnpara retirarlosdatos.CuandoestalíneaseencuentraenestadológicoFALSE significaqueyatodoslosequiposestablecidoscomo"listener"hanleídoeldato transferidoyportantoel“talker”puederetirareldatodelbus. ATTENTION(ATN): Esunaseñalqueestableceel"controller"paraestablecer,conunestadológico TRUEenella,queeldatoqueseenvíaporelbusdedatosesuncomando enviadoporel"controller”.CuandoestalíneatomaelestadológicoFALSE, indicaqueelbytedelbusdedatosdebeserconsideradocomoundato. INTERFACECLEAR(IFC): Estábajoelexclusivocontroldel"systemcontroller".Cuandoesestablecidoen estalíneaunestadológicoTRUE,todoslosequiposconectadosalbusdeben serreseteados,ytodosellosdebenpasarasuestadobase.
SERVICEREQUEST(SRQ): Esutilizadoporlosequiposconectadosalbusparacomunicaral"controller" querequierenseratendidosporalgunacausa(haconcluidounaactividad,se haproducidounerror,existealgúndatoparatransferir,etc.).Cuandoel "controller"detectaunestadológicoTRUEenestalínea,debeiniciaruna encuesta(polling)paradeterminarquéequipocausóelrequerimiento,yenel casodequeproceda,satisfacersudemanda. REMOTEENABLE(REN): Esunalíneaconlaqueel"controller",alestablecerlaaunestadológicoTRUE, habilitaatodoslosequiposconectadosalbusparaquerecibandatoso comandos. ENDORIDENTIFY(EOI): Estalíneatienedosfunciones: a)Enprimerlugar,el"talker"puedecomunicar,poniendoaestadológicoTRUE estalínea,queconcluyesuenvíodedatos. b)Ensegundolugar,estalíneaesutilizadaporel"controller"parainiciaruna encuestaparalela.Enestecasoel"controller"debeponersimultáneamentea estadológicoTRUElasseñalesATNyEOI,ycomorespuestaaello,losequipos quepreviamentehayansidoconfiguradosparaparticiparenlaencuesta paralela,transfierensubitdestatussobreelbus. Tiposdemensajesqueintercambianlosequipos EntrelosequiposconectadosalbusGPIBsetransfierenmensajesconstituidospor secuenciasdebyteportransacción.Deacuerdoconelestadodelaseñaldecontrol “ATN”,existendostiposdemensajes: “Data”:Mensajequecontieneinformaciónrelativaalafuncionalidadde unequipo.Ejemplosson:instruccióndeprogramación,resultado demedida,estatusdeunequipo,etc. “Command”:Mensajequetienecomofuncióncontrolarelmododeoperación delbus.Ejemplosson:Inicializacióndelbus,cambiodelmodode operacióndeunequipo,transferenciadelcontrol,etc. Modosdeoperacióndeunequipo Encadamomento,unequipoconectadoalbusGPIBpuedeestaroperandocomouno ovariosdelossiguientesmodosdecomportamiento: "Controller":Concapacidaddeestablecerquienenvíaorecibedatosyelmodo deoperacióndelbus(solounequipopuedeser"controller").
"Talker":Concapacidaddeenviardatosaotrosequipos. "Listener":Concapacidadderecibirdatosdeotrosequipos. "Idler":Sinningunacapacidadrespectodelbus. "CONTROLLER":EquipoconcapacidaddetransferirmensajesdetipoCommanda losotrosequipos.Existendostiposdecontroller: “SystemController”:Tienecapacidadhardwaredetomarelcontroldelbusentodo momento,atravésdelaslíneas“IFC”y“REN”.Enunbussólopuede existirunúnicoSystemControlleryestácaracterizadoportenerlas capacidadeshardwareespecialesdepoderestablecerelestadodelas líneas“IFC”y“REN”. "Activecontroller":TienelacapacidaddetransferirmensajesdetipoCommandpara: •Establecerlosmodosdeoperación“Listener”y“Talker”enlosrestantes equipos. •Enviarloscomandosdeinicializaciónysincronizacióndelbus. •Supervisarmedianteencuestaelstatusdelosequipos. Cadabuspuedetenerconectadounoomásdispositivoscapacesde asumirlafunciónde"activecontroller",aunqueencadamomento,solo unodeesosequipospuedeoperarcomotal. Enunasituaciónestándar,hayuncomputadorconectadoalbusque actúaalavezcomo"systemcontroller"ycomoúnico"active controller". Enalgúnmomento,unequipopuederequerirdelcontroladordel sistemasuinterésenconvertirseencontroladoractivo,afindellevara cabounaoperacióncompleja,talcomotransferirunosdatosal "plotter",oalmacenarunficheroenundisco,etc..Comorespuestaa esterequerimientoelcontroladordesistematransferiráelcontrolal equipoquelohasolicitado,elcualpasaaconstituirseencontrolador activodelbus.Cuandoconcluyesuoperación,retornadenuevoel controldelbus,alcontroladordesistema. Obsérvesequelascapacidadespropiasdecontroladordesistemano puedensertransferidas. UnsistemaconstruidosobreelbusGPIBpuedeserconfiguradoenunodelos siguientestresmodos: ‐ Sin"controller":Enestaconfiguración,unodelosequiposdebetener capacidadparaactuarsolocomo"talker",ylosrestantessolocomo"listener". Latransferenciadedatosposiblesesdesdeel"talker"atodoslos"listener" simultáneamente. ‐ Con"controller"único:Enestaconfiguraciónlastransferenciasdedatos posiblesson:Desdeel"controller"alosequiposenmodocomandoydatos,de
unequipoal"controller"soloenmododatos,ydeunequipoaotroequiposolo enmododatos. ‐Conmúltiples"controller":Enestecasotienelasmismascapacidadesquela configuraciónanterior,sóloqueenestatambiénesposiblelatransferencia entreequiposdelacapacidaddeoperarcomo"controlleractivo”. TALKER:EquipoconcapacidaddeenviarData. Encadabuspuedenexistirunoovariosequiposconcapacidaddeenviardatos aotrosequiposporelbus,peroencadainstantesólounodeellospuedeser establecidoporelcontrollerparaqueoperecomoTalker. Eselúnicoequipo(ademásdelActiveController)concapacidaddeestablecer elestadodelaslíneasDAV. ElequipoTalkersólopuedeenviarundatositodoslosequiposquese encuentranenmodoListenerestéendisposicióndeleerlo(LíneaNRFDavalor lógicoFALSE). LISTENER:EquipoquerecibeyleetodoslosDataquesetransfierenporelbus. Encadabuspuedenexistirunoovariosequiposconcapacidadderecibirdatos desdeelbus,yunoovariosdeellossepuedeencontrarsimultáneamenteen modo“Listen”.ElActiveControllereselqueestableceatravésdeuncomando queunequipopasaodejadeestarenmodoListen. TodoslosequiposqueseencuentranenestadoListenreciben simultáneamentetodoslosdatosquesontransferidosporelbus. IDLER:Estadobasesinningunarespuestarespectodelbus. ComandosdelBus Loscomandosdebus(mensajesCommand)sonsiempreenviadosdesdeelcontrollera losotrosequiposparasincronizarsuestadodeoperaciónoparaestablecersuestado deoperación. Enloscomandosdebusseenvíandatosporelbusdedatos(silaoperaciónlo requiere)deigualmodoqueenlatransferenciadedatos,sóloqueenestoscasosla señalATNesestablecidaaestadológicoTRUEporel"controller”.Conelloseindica queesuncomando,ytodoslosequiposconindependenciadequesean"talker"o "listener"recibenelcomando,manteniendoelprotocoloconel"controller". El"controller"puedeenviarcincotiposdecomandosdebusalosotrosequipos: "addressed","listen","talk","universal"y"secondary".Sólolos7bitsmenos significativosdelbussonutilizadosenloscomandosdebus.Lostresbitb7,b6yb5 definenlanaturalezadecadacomando:
ServiceRequestEnableRegister(SRER):Máscaradelosbitscorrespondientesdel registroSBRquevaadeterminarsiseestableceelRequestService(bitRQS). EventStatusRegister(ESR):Cadabitestáasociadoconuntipoespecíficodeevento. Cuandouneventoocurre,elinstrumentoestableceelcorrespondientebita1.Se puedehabilitaroinhibirloseventosquevanaserproyectadossobreelbitESB,a travésdeloscorrespondientesbitsdemáscaraderegistroESR. EventStatusEnableRegister(ESER):MáscaradelosbitsdelregistroESRquevana requerirelservicioatravésdelregistroSBR(bitESB). Porejemplo,sideseamosconocercuandoocurreunerrordeejecución,sedebería establecerelbit5delregistroESERafindequeeleventodeerrordeinterés(que estableceráelbit5delESRa1)seareportadoporelbitESBdelregistroSBR.
Ordenesbásicas EnelestándarIEEE‐488.2encontramosunconjuntodeórdenesbásicasquerealizan funcionescomunesatodoslosequipos,conindependenciadesunaturaleza.
6.4SCPI ApesardelosestándaresIEEE488.1y488.2,existíalibertadparaquecadafabricante eligieraloscomandosdesusinstrumentos,poresoen1990ungrupodeempresas fabricantesdeinstrumentosacordaroncrearunconjuntodeórdenesconunasintaxis común,quefuellamadaSCPI(ComandosEstándarparaInstrumentosProgramables). Lógicamente,SCPIseconstruyórespetandolosprincipiosdelanterior488.2. Sidosinstrumentos,defabricantesdistintos,seadhierenalestándarSCPI,es teóricamenteposibleintercambiarlosconmínimasmodificacionesenelprogramade control.LoscomandosSCPIseescribencomotextoASCII,ytienenunaestructura jerárquicaporniveles,separadospordospuntos: SOURce:VOLTage<valor> EnestainstrucciónSOURceeslaraízdelcomandoyVOLTageesnuestroprimernivel. Lasinstruccionespuedentenermásdeunnivel.Loscaracteresenmayúsculasson necesariosparaespecificarlaorden,mientrasquelosqueestánenminúsculaspueden suprimirse,sirviendosóloparafacilitarlalecturadeprogramasporusuario.El comandoanterioresequivalenteaSOUR:VOLT<valor>. Loscomandosensípuedenserescritosindistintamenteenmayúsculasominúsculas. UnaventajadelestándarSCPIesladefiniciónhomogéneadecomandosparatodoslos aparatosdeunamismaclase.
7. CONTROL MSCOMM ComohemoscomentadoenlaseccióndeladaptadorGPIB‐USB,desdeelordenador veremoseladaptadorcomounpuertoserie,portantoparalacomunicaciónentreel ordenadoryeladaptadordeberemosutilizarherramientasquetrabajenconelpuerto serie;ennuestrocasoemplearemoselcontrolMSCOMM. 7.1Características ElcontrolMSCommproporcionacomunicacionesserieparaquesuaplicaciónpueda transmitiryrecibirdatosatravésdeunpuertoserie. EsunaherramientaintegradaenentornosdedesarrollodeMicrosoft.Eliconoquelo representaenlacajadeherramientaseselsiguiente: Enelformulariosolamenteesvisibleentiempodediseño. ElcontrolMSCommproporcionadosformasdiferentesdetratamientodelas comunicaciones: ∙ Lascomunicacionescontroladasporeventos,enlasquecuandoapareceun evento,porejemplocuándollegaalgúncarácter,seproduceuneventodeltipo OnCommdelcontrolMSCommparainterceptarytratarlainformaciónsegúnel tipodeevento.EleventoOnCommtambiéndetectaytrataloserroresenlas comunicaciones.EnlapropiedadCommEventpuedeverunalistacompletade todosloseventosyerroresposiblesenlascomunicaciones.Estaeslaforma queutilizaremosparalaimplementación. ∙ Tambiénsepuedesondearloseventosyerroressicompruebaelvalordela propiedadCommEventdespuésdecadafuncióncríticadesuprograma. CadaunodeloscontrolesMSCommqueusecorrespondeaunpuertoserie.Sinecesita teneraccesoamásdeunpuertoserieensuaplicación,debeusarmásdeuncontrol MSComm. ElcontrolMSCommtienemuchaspropiedadesdelascualesdetallamosacontinuación lasmásimportantes.
7.2Propiedades Existenpropiedadesquepuedenestablecerseentiempodediseñooentiempode ejecución,yotrasquesolamentesepuedenejecutaroconsultarensolamenteen tiempodeejecución.Estaspropiedadestienenqueserconfiguradascorrectamente paraquelacomunicaciónseaposible. CommPort Indicaelnúmerodelpuertoserieusado.Admitelosvaloresde1a255.Cambiandoesa propiedad,podemoscambiarelpuertodecomunicaciónquevamosausar.Siledamos aestevalorunnúmerodepuertoinexistente,daráerror.Deberemossaberelpuerto denuestroadaptadorparaconfigurarestapropiedadennuestroprograma. Settings Susintaxises:Velocidad,Paridad,Bitsdeinformación,Bitsparada Indicalavelocidad,paridad,númerodebitsybitsdestop(parada)quesevanausar enlacomunicación. Losvaloresposiblesparavelocidad(enbaudios)son50,100,110,300,600,1200, 2400,4800,9600,14400,19200y28800 Losvaloresposiblesparaparidadson: N:Noenvíabitdeparidadnihacecomprobacióndeparidadenlarecepción. O:Envíaycompruebaparidad,conelcriteriodeparidadIMPAR E:Envíaycompruebaparidad,concriteriodeparidadPAR LosvaloresparaelparámetroBitsdeInformaciónpuedenser: 7:Seenvían/reciben7bitsportramadeinformación. 8:Seenvían/reciben8bitsportramadeinformación 5:Seenvían/reciben5bitsportramadeinformación.Estevalorde5bitseseltípico delsistemaBaudotparatransmisióntelegráfica(Teletipos)quesehaconservadoen lascomunicacionesinformáticasporpuratradición.Siseelige5bits,losbitsdeparada seponenautomáticamentea1,5(TípicotambiéndelsistemaBaudot.) LosvaloresparaelparámetroBitsdeparadapuedenser: 1:Seenvíaunbitdeparada 2:Seenvían2bitsdeparada Noesposibleprogramar1,5bitsdeparada.Sólolohacecuandoseprograman5bits deinformaciónylohaceautomáticamente. Nuestraconfiguraciónserá“9600,n,8,1" Handshaking Especificaelmétododecontrolsobreelflujodeinformación.Enunacomunicación seriesenecesitaconocersielpuertopuedeenviarinformaciónynecesitatambién
indicarlealafuentequeélestápreparadopararecibirinformación.Aesteprocesose ledenominaHandshaking.(ControldeFlujo) ElControldeFlujopuedehacersededosformas:unamediantelasseñalesauxiliares delpuerto(RTS,CTS,DSR,DTR),quesoncablesadicionalesquetendránunatensión positivarespectoalos0Vdelequiposiesaseñalestáactivada,ounatensiónnegativa sinoloestá. Existeotraformadecontrolarelflujodeinformación:medianteseñalesespecialesque seenvíanporlosdoscablesquetransportanlainformación.Medianteestasdos señalespodemoscontrolarqueelordenadorenvíeinformaciónodejedeenviarla.De igualforma,podemosindicarlealmódemqueenvíeonoenvíe.Estasseñales especialessedenominanX‐ONyX‐OFF. LapropiedadHandshakingcontrolalaformaderealizaresteproceso.Puedetomarlos siguientesvalores: 0:NoexisteControldeFlujo 1:ControldeFlujomedianteXON‐XOFF 2:ControldeFlujomedianteRequestToSend(RTS)yClearToSend(CTS) 3:ControldeFlujomedianteXON‐XOFFyRTS–CTS NosotrosutilizaremoselcontroldeflujomedianteRequestToSend(RTS)yClearTo Send(CTS). InBufferSize MedianteestapropiedadestablecemoseltamañodelBuffer(almacéndedatos)de entrada.EsteBuffersirveparapoderrecibirdatossinquetengaqueintervenirla aplicacióncontinuamenteparacontrolarelpuertodeentrada. PuedeconocerseelnúmerodecaracterespresentesenelBufferdeentrada consultandoelvalordelapropiedadInBufferCount.Nuestraaplicaciónnorecibeuna grancantidaddedatosportantocon1024bitsessuficiente. OutBufferSize MedianteestapropiedadcontrolamoseltamañodelBufferdesalida. Noenviamosmuchosbitsalavez;portantocon512bitsessuficiente. SepuedeconocerelnúmerodecaracterespresentesenelBufferdesalida(losque aúnestánportransmitir)consultandoelvalordelapropiedadOutBufferCount. RThreshold,SThreshold Estasdospropiedadesespecificanelnúmerodecaracteresquedebenestarpresentes enlosBuffersdeRecepciónyTransmisiónrespectivamente,paraqueseproduzcael eventoOnCommrelativoarecepciónytransmisióndecaracteres(EventosEvReceivey EvSend).Sielvalordeunadeestaspropiedadesestáa0,noseproduceelevento OnCommcorrespondiente. Elvalorquesedebedaraestasdospropiedadesdependedelaaplicaciónydeltiempo quequeramosquelaaplicaciónestáatendiendoalpuertodecomunicaciones.Si ponemosenRThresholdunvalorcorto(1eselmínimo),cadavezquerecibaun
carácterseproduciráeleventoOnComm.Alproducirseesteevento,ejecutaráel procedimientoasociadoaél,loqueharáperdertiempoalaaplicación,impidiéndole realizarotrasfunciones.Siseponeunvalormuyalto,elpuertonoavisaráquetiene caracteresrecibidoshastaquerecibaunnúmeroigualalprogramadoenesta propiedad,porloquenopodremosprocesarlosdatosrecibidoshastaqueelbuffer tengaesenúmerodecaracteresensuinterior.Elnúmeroadecuadoparanuestra aplicaciónseráde10caracteresenRThreshold,yaqueeselnúmerodecaracteresque envíalafuentecuandolepedimoslacorrienteconsumida,yun0enSThreshold. InputLen Pordefecto,cuandoseleeelBufferderecepción,seleentodosloscaracteres, quedandoelBuffervacío.Siseleasignaaestapropiedadunvalordistintode0,cada vezqueleamoselBufferderecepciónleeráunnúmerodecaracteresigualaesa cantidad,permaneciendoloscaracteresrestantesenelBufferalaesperadeuna nuevalectura.Asignándoleelvalor0(Valorpordefecto),elbufferseleecompletoque seráelvalorqueutilizaremosnosotros. RTSEnable Activa(Ponea1)laseñalRTS(RequestToSend‐Peticióndeenvío).Estaseñaldebe ponersea1paraindicaralafuentequevaarecibirnuestracomunicaciónque deseamosenviardatos.Debeestaractivadadurantetodalatransmisióndedatos. DTREnable Activa(Ponea1)lasalidaDTR(DataTerminalReady‐TerminaldeDatosListo).Esta señalseempleaparadecirlealafuentequeordenadorestápreparadopararecibir datos. 7.3Propiedadespropiasdeltiempodeejecución PortOpen Abreelpuertodecomunicación.PuedetenerlosvaloresTrue(Paraabrirlo)yFalse(Para cerrarlo).Ejemploaperturadelpuerto: puertoGPIB.PortOpen = true; InBufferCount NospermiteaveriguarcuántoscaracterestenemosenelBufferdeentrada. OutBufferCount NospermiteconocercuántoscaracteresquedanportransmitirenelBufferdesalida.
Output EnvíacaracteresalBufferdesalida.Debeexistirunsignoigual(=)entreOutputyloquese envíaalBuffer.Ejemplodeenvíodecomandoalafuente: puertoGPIB.Output = "MEAS:CURR?\r"; Input LeeelBufferderecepción.Elnúmerodecaracteresleídosdependerádelvalordelapropiedad InputLen.CuandolapropiedadInputLentieneelvalor0,elBufferseleecompleto.SiInputLen tieneunvalordistintode0,seleeráunnúmerodecaracteresigualalvalordeestapropiedad. Ejemplo: caracteresRecibidos=puertoGPIB.Input; CTSHolding DevuelveelestadodelalíneadecontrolCTS(Dispuestoparaenviar).SiesTrue,esaentrada estáactivada,siesFalse,laentradaestádesactivada.
8. LA APLICACIÓN 8.1Utilidad Elprogramadiseñadoesunaaplicaciónquesirvepararealizarelcontroldevarios parámetrosdelafuentedealimentaciónutilizada,ypararealizarunmuestreodela intensidadconsumidaporlafuentecadadeterminadotiempoyguardarlosenun fichero.Losparámetrosdelafuente,quepodemosmodificarmediantelaaplicación, sonelvoltajedesalidadelafuenteylaactivaciónodesactivacióndelasalidadela fuente. Sobreelmuestreo,sepermiterealizardostiposdemuestreo:unmuestreonormal,en elqueseprogramaeltiempototaldelmuestreoyelintervalodemuestreodela intensidad,ounmuestreoporciclos,dondepodemosiralternandounciclode funcionamientoconunciclodeparadaprogramandolosaspectosanterioresmásel tiempodefuncionamientoyeltiempodeparadaquequeramos.Tambiénlaaplicación permiterealizarunapequeñaconfiguracióndealgúnaspectodeladaptadorydel programa. 8.2Diseño ElprogramahasidodiseñadoenellenguajedeprogramaciónC#,utilizandoelentorno dedesarrolloVisualStudio2008deMicrosoft.Elproyectohasidocreadocomouna aplicacióndeWindowsForms,dondeparalacreacióndelasventanasseutilizanlas libreríasdeWindows. WindowsForms EldiseñomedianteWindowsFormspermitecrearelentornográficodeunaforma gráficasintenerqueescribirelcódigofuente.Paraellosetieneunconjuntode herramientascomosonbotones,textoplanoomenúsdesplegables,lascualesse insertanenlaventanaadiseñararrastrándolasysoltándolassobreella.Las herramientasocomponentesutilizadosenesteproyectoson: Button:Setratadeunsimplebotónenelcualalpulsarsobreélseasociauna acciónarealizar. ComboBox:Setratadeunmenúdesplegabledondeencadaentradase escribenlosdatospermitidos.
GroupBox:Muestraunmarcoconuntítuloalrededordeungrupodecontroles. TextBox:Recuadrodondesepermiteespecificaruntexto.Estetextosepuede emplearcomoentradadealgúndato. Label:Muestrauntextodescriptivo. ProgessBar:Muestraunabarraquesevacargandoparamostrarelprogreso. MicrosoftCommunicationsControl:SetratadelcontrolMSCOMMparala comunicaciónconelpuertoCOM. 8.3Ficherodedatosdelmuestreo Losdatossobreintensidadconsumida,recibidosdelafuente,sonalmacenadosenun fichero.Larutadondeseguardasepuedeespecificarenlaventanadeconfiguración quemásadelanteseexplicará.Laextensióndeesteficherosepuedeindicarcuandose especificalaruta,escribiéndolaacontinuacióndelnombredelarchivo. Porejemplo,siqueremosguardarloenunficherodetextonormalescribiremos: nombredelfichero.txt Sinosedefineformato,luegohabráqueponerlelaextensiónoabrirlodirectamente desdeunprogramaqueloleacorrectamente. Losdatosseguardanenelficherodelasiguienteforma: Intensidadconsumida(A)NúmerodemuestraTiempo(seg) Cadalíneaenelficheroesundatomuestreado.Laintensidadsealmacenaen amperiosyeltiempoensegundos.
Activar/Desactivarsalidafuente:Estosdosbotonessirvenparaactivaro desactivarlasalidadelafuente.Noseránecesarioactivarlasalidaantesdeiniciar elmuestreo,yaqueactivaautomáticamentealpulsarelbotónIniciarmuestreo. HacelamismafunciónqueelbotónOUTPUTON/OFFdelafuente. Corrientemáximaúltimahora:Muestralacorrientemáximaconsumidaporel dispositivoqueconectamosalafuente. Progreso:Labarramuestraelprogresodelmuestreoprogramadounavezlo iniciemos. Iniciarmuestreo:Conestebotóniniciaremoselmuestreo,esdecirseactivarála salidadelafuenteyempezaremosatomarvaloresdeintensidadconsumida. Finalizarmuestreo:Conestebotónfinalizaremoselmuestreoaunquenosehaya completadoeltiempoprogramado. Pasosaseguirpararealizarelensayosimple: ‐ Primeroseleccionaremoselvoltaje,yunavezseleccionadopulsaremosel botónEnviarvoltaje. ‐ Luegoescribiremosladuraciónenhorasyelperíododemuestreoen milisegundos. ‐ Acontinuación,pulsaremoselbotónIniciarmuestreoparacomenzarel muestreo. ‐ Sideseamosfinalizarelensayoantesdequesecumplaeltiempoestablecido anteriormente,pulsaremoselbotónFinalizarmuestreo.
4) Ventanadeensayoporciclos Podremosrealizarunensayoporciclosenelqueprogramaremosladuracióndeun primerciclo,dondeestaráactivadoelmuestreo,yunsegundociclodeinactividad, dondesepararáelmuestreoylasalidadelafuente.Esteciclodeactividadyluego inactividadseirárepitiendohastaquesecumplaladuraciónprogramada. Losdatosseránguardadosenunfichero,elcualdefiniremossuubicaciónenla ventanadeconfiguracióndelaventanadeinicio. Explicacióndecadabloqueobotón: Voltaje:Tenemosunmenúdesplegabledondeseleccionaremoselvoltajeque queremosquesuministrelafuente.Unavezseleccionado,hayqueenviarleala fuenteelvoltajepulsandoelbotónEnviarVoltaje. Duración1erciclo(Ciclodefuncionamiento):Indicaremosenelrecuadroel númerodehorasdelprimerciclo,queeselciclodefuncionamientodondese realizaelmuestreo. Duración2erciclo(Ciclodeparada):Indicaremoselnúmerodehorasdelsegundo ciclo,queeselciclodondenorealizamosningúnmuestreo.Sedesconectatambién lasalidadelafuentedealimentación.
Duracióndelmuestreo:Debemosescribir,enelrecuadro,elnúmerodehorasque queremosquedureelmuestreo.Debeestarentre1y596horas. Periododelmuestreo:Escribiremos,enelrecuadro,elperiododemuestreo,es decircadacuántosmilisegundosqueremosleerlaintensidadconsumida.El periodomínimodemuestreoesde200ms. Activar/Desactivarsalidafuente:Estosdosbotonessirvenparaactivaro desactivarlasalidadelafuente.Noseránecesarioactivarlasalidaantesdeiniciar elmuestreoyaqueactivaautomáticamentealpulsarelbotónIniciarmuestreo. HacelamismafunciónqueelbotónOUTPUTON/OFFdelafuente. Corrientemáximaúltimahora:Muestralacorrientemáximaconsumidaporel dispositivoqueconectamosalafuente. Progreso:Labarramuestraelprogresodelmuestreoprogramadounavezlo iniciemos. Iniciarmuestreo:Conestebotóniniciaremoselmuestreo,esdecirseactivarála salidadelafuenteyempezaremosatomarvaloresdeintensidadconsumida. Finalizarmuestreo:Conestebotónfinalizaremoselmuestreoaunquenosehaya completadoeltiempoprogramado. Pasosaseguirpararealizarelensayoporciclos: ‐ Primeroseleccionaremoselvoltajeyunavezseleccionadopulsaremoselbotón Enviarvoltaje. ‐ Luegoescribiremosladuracióndelciclodefuncionamiento,deparadayla duracióntotaldelmuestreo.Tambiénprogramaremoselperíododemuestreo enmilisegundos. ‐ AcontinuaciónpulsaremoselbotónIniciarmuestreoparacomenzarel muestreo. ‐ Sideseamosfinalizarelensayoantesdequesecumplaeltiempoestablecido anteriormentepulsaremoselbotónFinalizarmuestreo.
5) Ventanaconfiguraciónadaptador Enestaventanapodremosconfiguraraspectosimportantes,comoelpuertoCOM dondeestáconectadoeladaptadoryladireccióndondeguardarelficherodedatos leídosdelmuestreo. Explicacióndecadabloqueobotón: PuertoCOMdeladaptadorGPIB:Enestemenúdesplegabledebemos seleccionarelnúmerodelpuertoCOMdondehemosinstaladoyconectadoel adaptador.DeberemosconfigurarelpuertoCOMcorrectamenteparapoder accederalosensayos.Parasabercómoconocerelpuertodondeestáinstalado nuestroadaptadorhayqueiralapartado3.3sección3dondeseexplica. Direcciónficherodedatos:Enesterecuadrohayqueescribirlarutadonde queremosguardarelficherodedatos,asícomoelnombredelficheroquele queremosdar.Porejemplo,siqueremosguardarelficheroensayo1.txtenel discoduroCdentrodelacarpetadatos,queseencuentradentrodelacarpeta proyectoescribiremos:C:\proyecto\datos\ensayo1.txt
Hayquerecordarquesinoponemosextensiónalfichero,crearáunficheroque noseráreconocidoporningúnprogramayportanto,nolopodremosabrir directamentepulsandosobreél,porloquehabráqueponerleunaextensióno abrirlodesdeunprogramaquepuedatratareltextoalmacenadoenelfichero. Larutadebeexistir,porquesinoexistesemostraráunerror. DuracióndelmuestreoyPeriododelmuestreo:Enestosrecuadros escribiremosladuraciónyelperíododelmuestreoquequeremosqueaparezca cuandoabrimoslasventanasdeensayosimpleyporciclos.Cuandovayamosa realizarlosensayos,estosparámetrospodránsermodificados. Establecervalorespordefecto:Estebotónguardaenunficherollamado Parametros.txt,queseencuentraenlacarpeta /anexos/ControlGPIB/ControlGPIB/bin/Release,los4parámetrosquehemos explicadoanteriormenteparaquelasiguientevezqueseinicieelprograma carguelaconfiguracióndeesteficheroynotengamosqueescribirlacadavez queiniciemoselprograma.Luego,paraquelaconfiguracióntengaefectoenla sesiónabiertahabráquesalirpulsandoelbotónGuardarconfiguraciónysalir. Guardarconfiguraciónysalir:Estebotónguardalosparámetrosanteriormente explicadosenelprogramaycierralaventanadeconfiguración.Estebotón,a diferenciadelanterior,noguardalaconfiguraciónparalasiguientevezque iniciemoselprograma,solologuardaparalasesiónactualabiertadel programa. Pasosaseguir ‐ ConocerelpuertoCOMdondesehainstaladoeladaptador.Enelapartado3.3 delasección3seexplicacómoconocerelnúmerodepuerto. ‐ Escribiremosladireccióndondequeramosguardarnuestroficherodedatosdel muestreoymodificaremos,siqueremos,losparámetros. ‐ Modificaremos,siqueremos,laduraciónyelperíododemuestreoque queramosqueaparezcaenlapantalladelosensayos. ‐ Siqueremosqueestosparámetrosseguardenparacuandovolvamosautilizar elprograma,pulsaremoselbotónEstablecervalorespordefecto. ‐ Parasaliryguardarlaconfiguración,pulsarGuardarconfiguraciónysalir;sise quieresalirsinguardar,pulsarlacruzsuperior.
11. CODIGO IMPLEMENTADO EnestasecciónrepasaremoselcódigoimplementadoenlosficherosInicio.cs, Configuracion.cs,Ensayo.csyEnsayo_ciclos.cs,realizandopequeñasexplicaciones sobreelcódigo.Enestosficherossehaimplementadoelcódigodelasfuncionalidades decadaunadelasventanasquetieneelprograma. 11.1Inicio.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; Libreriasquesecarganaliniciarlascualessonnecesariasparalaejecución. namespace ControlGPIB { public partial class Inicio : Form { public static String dir="C:\\Prueba.txt"; public static int puerto=11; public static int tiempo_muestreo=10; public static int periodo_muestreo=200; Definicióndelasvariablesestáticasqueguardanladireccióndondeseguardael fichero,elpuertodeladaptadoryeltiempoyperíododemuestreo,quesemostraráal abrirlasventanasdeensayo. //------------------------------------------------------------------// public Inicio() { InitializeComponent(); obtener_configuracion_por_defecto("Parametros.txt"); } Inicializacióndelaventanadeinicioyllamadaalmétodo obtener_configuracion_por_defecto, pasándolecomoparámetroelnombredel ficherodondeestánguardadoslosdatosdelascuatrovariablesanteriores.
private void ConfiguracionAdaptador_Click(object sender, EventArgs e) { Configuracion c = new Configuracion(); ; c.ShowDialog(); } MétodoqueseejecutacuandosepulsaelbotónConfiguraciónAdaptador,queabrela ventanadeconfiguración. //------------------------------------------------------------------// private void prueba_Click(object sender, EventArgs e) { Ensayo p = new Ensayo(); try { p.ShowDialog(); } catch (Exception ex) { } } MétodoqueseejecutacuandosepulsaelbotónEnsayoSimpleyqueabrelaventana delensayosimple. //------------------------------------------------------------------// private void salir_Click(object sender, EventArgs e) { Application.Exit(); } MétodoqueseejecutacuandosepulsaelbotónSaliryquecierralaaplicación. //------------------------------------------------------------------// private void obtener_configuracion_por_defecto(String NombreFichero) { Boolean ok; String ruta; int port, tiemp_muestreo, frec_muestreo; Accesofichero fich = Accesofichero.accederFichero(NombreFichero); if (fich == null) {
MessageBox.Show(this, "No se encuentra el fichero Parametros.txt", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } else { ok = fich.ObtenerParametros(out ruta, out port, out tiemp_muestreo, out frec_muestreo); if (ok == false) { MessageBox.Show(this, "El fichero Parametros.txt no contiene los parametros correctamente", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } else { dir = ruta; puerto = port; tiempo_muestreo = tiemp_muestreo; periodo_muestreo = frec_muestreo; fich.cerrarFichero(); } } } Métodoqueabreelficheropasadocomoparámetro,queennuestrocasoeselfichero conlosparámetrosdeconfiguracióndelprograma. //------------------------------------------------------------------// private void ensayo_ciclico_Click(object sender, EventArgs e) { Ensayo_por_ciclos ec = new Ensayo_por_ciclos(); try { ec.ShowDialog(); } catch (Exception ex) { } } MétodoqueseejecutacuandosepulsaelbotónEnsayoPorCiclosyqueabrela ventanadelensayoporciclos.
private void salirToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } MétodoqueseejecutacuandoseabrelapestañaarchivoysepulsaelbotónSalir.Este métodocierralaaplicación. //------------------------------------------------------------------// private void simpleToolStripMenuItem_Click(object sender, EventArgs e) { Ensayo p = new Ensayo(); try { p.ShowDialog(); } catch (Exception ex) { } } Métodoqueseejecutacuandoseabrelapestañaarchivo,luegolapestañaensayoyse pulsaelbotónSimple.Estemétodoabrelaventanadeensayosimple. //------------------------------------------------------------------// private void porCiclosToolStripMenuItem_Click(object sender, EventArgs e) { Ensayo_por_ciclos ec = new Ensayo_por_ciclos(); try { ec.ShowDialog(); } catch (Exception ex) { } } Métodoqueseejecutacuandoseabrelapestañaarchivo,luegolapestañaensayoyse pulsaelbotónPorciclos.Estemétodoabrelaventanadeensayoporciclos.
private void configuraciónToolStripMenuItem_Click(object sender, EventArgs e) { Configuracion c = new Configuracion(); ; c.ShowDialog(); } Métodoqueseejecutacuandoseabrelapestañaarchivoysepulsaelbotón Configuracion.Estemétodoabrelaventanaconfiguracióndeladaptador. //------------------------------------------------------------------// private void acercaDeToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show(this, "Proyecto final de carrera \r Jesús Brun \r UPV", "Acerca de", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } MétodoqueseejecutacuandoseabrelapestañaAyudaysepulsaelbotónAcercade. } }
private void OnComm(object sender, EventArgs e) { if (puertoGPIB.CommEvent == (short)MSCommLib.OnCommConstants.comEvReceive) { dar_formato((string)puertoGPIB.Input); } } EstemétodoseejecutacadavezseproduzcauneventoenelpuertoCOM.Ennuestro casosólonosinteresaeleventodetipocomEvReceive,queseproducecuandollega algúncarácteralbufferdeentradadelpuerto,comoocurrecuandoserecibela intensidadquesehapedidoalafuente.Unavezcomprobadoqueeleventoseade estetipo,sepasaránloscaracteresrecibidosalmétododar_formato,dondese manipularánloscaracterespararepresentarloenelformatocorrecto. //------------------------------------------------------------------// private void guardar_en_fichero(String e) { double tiempo=(numero_muestra * ((Double)frecuenciaMuestreo / 1000)) - ((Double)frecuenciaMuestreo / 1000); sw.WriteLine(e + " " + numero_muestra + " " + tiempo); } Métodoencargadodeguardarenelficherolosdatosdeintensidadconsumidaque recibimosdelafuente.Paraelloutilizaeldescriptordeficheroswquesehadefinidoal principio.Elformatoenelqueseescribeenelficheroes: IntensidadconsumidaNumerodemuestraTiempo
private void dar_formato(String e) { if (e[7] == '+' || e[6] == '+') { int posicion_del_punto = e.IndexOf("."); int posicion_de_la_E = e.IndexOf("E"); double aux = double.Parse(e.Substring(posicion_del_punto + 1, (posicion_de_la_E - posicion_del_punto) - 1)); int exp = Int32.Parse(e[posicion_de_la_E + 2].ToString()); aux = aux / Math.Pow(10, ((posicion_de_la_E - posicion_del_punto) - 1) - exp); aux = (Int32.Parse(e[0].ToString()) * Math.Pow(10, exp)) + aux; guardar_en_fichero(aux.ToString()); if (aux > fuerza_max_hora) fuerza_max_hora = aux; } } Métodoencargadoderecibirloscaracteresquerepresentanlaintensidadenel formatoquelaenvíalafuentedealimentación;esteformatoesexponencial,ylopasa aunformatomáslegibleenamperios.Unavezqueyatieneeldatoenelformato correctoseloenvíaalmétodoguardar_en_ficheroparaqueloescribaenelfichero. //------------------------------------------------------------------// private void inicia_muestreo_Click(object sender, EventArgs e) { if (activo==false) { if (frecuenciaMuestreo >= 200) { try { sw = new StreamWriter(dir); } catch (Exception exc) { MessageBox.Show(this, "Ruta de fichero erronea", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); puertoGPIB.PortOpen = false; Close(); } tReloj = new Timer(); tReloj.Interval = frecuenciaMuestreo;
tReloj.Tick += new EventHandler(this.recibir_intensidad); final = new Timer(); final.Interval = tiempoMuestreo * 3600000; final.Tick += new EventHandler(this.finalizar_muestreo); fuerza_hora = new Timer(); fuerza_hora.Interval = 3600000; fuerza_hora.Tick += new EventHandler(this.borrar_fuerza_max); retraso_inicial_fuerza_hora = new Timer(); retraso_inicial_fuerza_hora.Interval = 3000; retraso_inicial_fuerza_hora.Tick += new EventHandler(this.iniciar_fuerza_hora); progreso.Value = 0; numero_muestra = 0; activo = true; puertoGPIB.Output = "REN\r"; puertoGPIB.Output = "OUTP:STAT 1\r"; retraso_inicial_fuerza_hora.Start(); tReloj.Start(); final.Start(); } else { MessageBox.Show(this, "El periodo de muestreo debe ser como mínimo de 200 ms\rA menor periodo mayor probabilidad de perdida de algun dato y \rmenor precisión en el tiempo de muestreo.", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } else { MessageBox.Show(this, "Ya se ha iniciado el muestreo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } SeejecutaalpulsarelbotónIniciarmuestreo.Estemétodoestáencargadodeiniciarel muestreo.Paraelloabreeldescriptordeficherodondeseguardaranlosdatos,activa lasalidadelafuente,configuralosrelojestReloj,fuerza_hora,finaly retraso_inicial_fuerza_horaeiniciatodoslosrelojesmenoselfuerza_hora,quese iniciaráen3scuandoquefinaliceelrelojretraso_inicial_fuerza_hora.
private void recibir_intensidad(object sender, EventArgs e) { puertoGPIB.Output = "a\r"; puertoGPIB.Output = "MEAS:CURR?\r"; numero_muestra++; try { progreso.Value = (int)(numero_muestra * 100) / (tiempoMuestreo * 3600000 / (frecuenciaMuestreo)); } catch (Exception exc) { progreso.Value = 100; } label_fuerza.Text = fuerza_max_hora.ToString() + " A"; } Envíalaordenalafuenteparaquelesuministrelacorrienteconsumidaenese instante.Muestratambién,medianteunlabel,lacorrientemáximaconsumidaenla últimahora,aumentalavariablequeguardaelnúmerodemuestrayactualizalabarra deprogreso. //------------------------------------------------------------------// private void finalizar_muestreo(object sender, EventArgs e) { if (activo == true) { tReloj.Stop(); final.Stop(); fuerza_hora.Stop(); puertoGPIB.Output = "REN\r"; puertoGPIB.Output = "OUTP:STAT 0\r"; progreso.Value = 100; activo = false; sw.Close(); puertoGPIB.Output = "REN\r"; puertoGPIB.Output = "SOUR:VOLT 0\r"; MessageBox.Show(this, "Muestreo finalizado", "OK", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } else { MessageBox.Show(this, "No hay ningun muestreo activo", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } Métodoquefinalizaelmuestreo.Paraelloparaelrelojdemuestreo,elrelojque controlaeltiempodemuestreoyelrelojdefuerzamáximadurantelaúltimahora. Tambiéncierraeldescriptordeficheroabierto,ponelavariableactivoafalseyenvíaa lafuentelaordendedesactivarlasalidaypongaa0elvoltaje.Luegomuestraun mensajediciendoquehafinalizadoelmuestreo. //------------------------------------------------------------------// private void envia_voltaje_Click(object sender, EventArgs e) { String volt = "0"; try { volt = comboBox1.SelectedItem.ToString(); int pos = volt.IndexOf("V"); volt = volt.Substring(0, pos); puertoGPIB.Output = "REN\r"; puertoGPIB.Output = "SOUR:VOLT " + volt + "\r"; } catch (Exception excp) { MessageBox.Show(this, "No ha indicado el voltaje", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } SeejecutaalpulsarelbotónEnviaVoltaje.EnvíaalafuenteatravésdelpuertoGPIBel voltajeindicadoparaquelosuministrelafuente. //------------------------------------------------------------------// private void activa_salida_Click(object sender, EventArgs e) { puertoGPIB.Output = "REN\r"; puertoGPIB.Output = "OUTP:STAT 1\r"; } Envíaalafuente,atravésdelpuertoGPIB,laordendeactivarlasalidadelafuentede alimentación.
private void desactiva_salida_Click(object sender, EventArgs e) { puertoGPIB.Output = "REN\r"; puertoGPIB.Output = "OUTP:STAT 0\r"; } Envíaalafuente,atravésdelpuertoGPIB,laordendedesactivarlasalidadelafuente dealimentación. //------------------------------------------------------------------// private void tiempo_muestreo_modificado(object sender, EventArgs e) { try { if (textBox1.Text == "") tiempoMuestreo = 0; else if (Int32.Parse(textBox1.Text) > 596 || Int32.Parse(textBox1.Text) < 1) throw new Exception(); else tiempoMuestreo = Int32.Parse(textBox1.Text); } catch (Exception ex) { MessageBox.Show(this, "Numero incorrecto\rEl numero debe estar entre 1 y 596\ry no puede contener caracteres que no sean numeros ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); tiempoMuestreo = Inicio.tiempo_muestreo; textBox1.Text = tiempoMuestreo.ToString(); } } Seejecutacuandosemodificaeltiempodemuestreoenlaventanadeconfiguración. Compruebaqueelnúmerodehorasestéentre1y596yquesólosehayanintroducido caracteresnuméricos.Mostraráunerrorsinosecumpleloanterior.
private void frecuencia_muestreo_modificada(object sender, EventArgs e) { try { if (textBox2.Text == "") frecuenciaMuestreo = 0; else if (Int32.Parse(textBox2.Text) < 1) throw new Exception(); else frecuenciaMuestreo = Int32.Parse(textBox2.Text); } catch (Exception ex) { MessageBox.Show(this, "Numero incorrecto\rEl numero debe estar entre 200 y 2147483647\ry no puede contener caracteres que no sean numeros ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); frecuenciaMuestreo = Inicio.periodo_muestreo; textBox2.Text = frecuenciaMuestreo.ToString(); } } Seejecutacuandosemodificalafrecuenciademuestreoenlaventanade configuración.Compruebaqueelnúmerodemilisegundosestéentre200y 2147483647yquesólosehayanintroducidocaracteresnuméricos.Mostraráunerror sinosecumpleloanterior. //------------------------------------------------------------------// private void iniciar_fuerza_hora(object sender, EventArgs e) { fuerza_hora.Start(); fuerza_max_hora = 0; retraso_inicial_fuerza_hora.Stop(); } Iniciaelrelojquecontrolalafuerzamáximadurantelaúltimahora,poneacerola variablefuerzamáximayparaelrelojdelretrasoinicial,utilizadoantesdeiniciarel relojfuerza_hora.
private void borrar_fuerza_max(object sender, EventArgs e) { fuerza_max_hora = 0; } Métodoqueborralafuerzamáximadurantelaúltimahora,almacenadaenlavariable fuerza_max_hora. //------------------------------------------------------------------// private void cierre_del_form(object sender, FormClosingEventArgs e) { try { if(activo==true) finalizar_muestreo(sender,e); puertoGPIB.PortOpen = false; } catch (Exception ex) { } } Métodoqueseejecutacuandosecierralaventana.Sielmuestreoestáactivado,llama almétodofinalizar_muestreoparafinalizarloypararlosrelojes.Tambiéncierrael puertoCOMquehemosabierto. //------------------------------------------------------------------// private void fin_muestreo_Click(object sender, EventArgs e) { finalizar_muestreo(sender,e); } } } SeejecutaalpulsarelbotónFinalizarmuestreo.Haceunallamadafinalizar_muestreo parafinalizarlo.
11.4Ensayo_ciclos.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace ControlGPIB { public partial class Ensayo_por_ciclos : Form { int tiempoMuestreo = Inicio.tiempo_muestreo; int frecuenciaMuestreo = Inicio.periodo_muestreo; int duracionCiclo1 = 1; int duracionCiclo2 = 1; private int puerto = Inicio.puerto; private String dir = Inicio.dir; private Boolean activo = false; int ciclo=1; double tiempo=0; double periodo_en_segundos; StreamWriter sw; Timer tReloj, final, fuerza_hora,ciclo1,ciclo2,retraso_inicial_fuerza_hora, barra_progreso; int numero_muestra = 0; double fuerza_max_hora = 0; Definicióndevariablesglobales,comosonlos“timers”queseutilizaránparacontrolar eltiempo,lavariablequeguardalafuerzamáximadurantelaúltimahora,eldescriptor deficheroconelqueseguardaranlosdatosylavariablequealmacenaelnúmerode muestra,eltiempoyelcicloenelqueseencuentra.Tambiénsepasanlos4 parámetrosdeconfiguracióndelaclaseinicioalaclaseactual. Timersorelojesutilizados: tReloj: Marcacadavezquesehadepedirlaintensidadalafuente.Seprogramacon elvalordelperíododemuestreointroducido.Cadavezquesecumpleeltiempollama almétodorecibir_intensidad. final: Marcaelfinaldelmuestreo.Eltiempoalcualseprogramaeseldelavariable tiempoMuestreo.Cadavezquesecumpleeltiempo,llamaalmétodo finalizar_muestreo.
fuerza_hora: Sirveparacontrolarcadahoralaintensidadmáximaconsumida.Llama almétodoborrar_fuerza_max. retraso_inicial_fuerza_hora: Seutilizaparaintroducirunretrasode3segundos alcomienzodelmuestreoantesdeactivarelrelojdefuerza_hora.Llamaalmétodo iniciar_fuerza_hora. ciclo1: Controlaladuracióndelprimerciclo,queeselcicloqueestáactivo.El tiempoalcualseprograma,eseltiempointroducidoenelrecuadroDuración1erciclo (Ciclodefuncionamiento).Llamaalmétodofin_Ciclo1. ciclo2:Controlaladuracióndelsegundociclo,queeselcicloqueestáactivo.El tiempoalcualseprograma,eseltiempointroducidoenelrecuadroDuración2erciclo (Ciclodeparada).Llamaalmétodofin_Ciclo2. barra_progreso:Sirveparaaumentarelvalordelabarraquemuestraelprogreso.El tiempo,alcualseprograma,esaunaveinteavapartedeltiempototaldelmuestreo. Llamaalmétodoaumentar_progreso. //------------------------------------------------------------------// public Ensayo_por_ciclos() { InitializeComponent(); textBox1.Text = tiempoMuestreo.ToString(); textBox2.Text = frecuenciaMuestreo.ToString(); textBox3.Text = duracionCiclo1.ToString(); textBox4.Text = duracionCiclo2.ToString(); iniciaPuerto(); } Inicializalaventanadeensayoporciclos,escribeenlostextBoxeltiempodemuestreo ylafrecuenciademuestreoyllamamétodoiniciaPuerto. //------------------------------------------------------------------// private void iniciaPuerto() { puertoGPIB.RTSEnable = true; puertoGPIB.CommPort = (short)puerto; puertoGPIB.RThreshold = 10; puertoGPIB.Settings = "9600,n,8,1"; puertoGPIB.DTREnable = true; puertoGPIB.Handshaking = MSCommLib.HandshakeConstants.comRTS; puertoGPIB.InputLen = 0; puertoGPIB.NullDiscard = false;
} catch (Exception excp) { MessageBox.Show(this, "No ha indicado el voltaje", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } SeejecutaalpulsarelbotónEnviaVoltaje.EnvíaalafuenteatravésdelpuertoGPIBel voltajeindicadoparaquelosuministrelafuente. //------------------------------------------------------------------// private void activa_salida_Click(object sender, EventArgs e) { puertoGPIB.Output = "REN\r"; puertoGPIB.Output = "OUTP:STAT 1\r"; } EnvíaalafuenteatravésdelpuertoGPIBlaordendeactivarlasalidadelafuentede alimentación. //------------------------------------------------------------------// private void desactiva_salida_Click(object sender, EventArgs e) { puertoGPIB.Output = "REN\r"; puertoGPIB.Output = "OUTP:STAT 0\r"; } EnvíaalafuenteatravésdelpuertoGPIBlaordendedesactivarlasalidadelafuente dealimentación. //------------------------------------------------------------------// private void tiempo_muestreo_modificado(object sender, EventArgs e) { try { if (textBox1.Text == "") tiempoMuestreo = 0; else if (Int32.Parse(textBox1.Text) > 596 || Int32.Parse(textBox1.Text) < 1) throw new Exception(); else tiempoMuestreo = Int32.Parse(textBox1.Text); } catch (Exception ex) {
MessageBox.Show(this, "Numero incorrecto\rEl numero debe estar entre 1 y 596\ry no puede contener caracteres que no sean numeros ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); tiempoMuestreo = Inicio.tiempo_muestreo; textBox1.Text = tiempoMuestreo.ToString(); } } Seejecutacuandosemodificaeltiempodemuestreoeneltextboxdelaventanade configuración.Compruebaqueelnúmerodehorasestéentre1y596yquesólose hayanintroducidocaracteresnuméricos.Mostraraunerrorsinosecumpleloanterior. //------------------------------------------------------------------// private void frecuencia_muestreo_modificada(object sender, EventArgs e) { try { if (textBox2.Text == "") frecuenciaMuestreo = 0; else if (Int32.Parse(textBox2.Text) < 1) throw new Exception(); else frecuenciaMuestreo = Int32.Parse(textBox2.Text); } catch (Exception ex) { MessageBox.Show(this, "Numero incorrecto\rEl numero debe estar entre 200 y 2147483647\ry no puede contener caracteres que no sean numeros ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); frecuenciaMuestreo = Inicio.periodo_muestreo; textBox2.Text = frecuenciaMuestreo.ToString(); } } Seejecutacuandosemodificalafrecuenciademuestreoeneltextboxdelaventana deconfiguración.Compruebaqueelnúmerodemilisegundosestéentre200y 2147483647yquesólosehayanintroducidocaracteresnuméricos.Mostraráunerror sinosecumpleloanterior.
private void duracion_ciclo1(object sender, EventArgs e) { try { if (textBox3.Text == "") duracionCiclo1 = 0; else if (Int32.Parse(textBox3.Text) > 596 || Int32.Parse(textBox3.Text) < 1) throw new Exception(); else duracionCiclo1 = Int32.Parse(textBox3.Text); } catch (Exception ex) { MessageBox.Show(this, "Numero incorrecto\rEl numero debe estar entre 1 y 596\ry no puede contener caracteres que no sean numeros ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); duracionCiclo1 = 10; textBox3.Text = duracionCiclo1.ToString(); } } Métodoqueseejecutacuandosemodificaladuracióndelprimercicloeneltextbox correspondientedelaventanadeconfiguración.Compruebaqueelnúmerodehoras estéentre1y596yquesólosehayanintroducidocaracteresnuméricos.Mostraráun mensajedeerrorsinosecumpleloanterior. //------------------------------------------------------------------// private void duracion_ciclo2(object sender, EventArgs e) { try { if (textBox4.Text == "") duracionCiclo2 = 0; else if (Int32.Parse(textBox4.Text) > 596 || Int32.Parse(textBox4.Text) < 1) throw new Exception(); else duracionCiclo2 = Int32.Parse(textBox4.Text); } catch (Exception ex) { MessageBox.Show(this, "Numero incorrecto\rEl numero debe estar entre 1 y 596\ry no puede contener caracteres que no sean numeros ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); duracionCiclo2 = 10; textBox4.Text = duracionCiclo2.ToString();
} } Métodoqueseejecutacuandosemodificaladuracióndelsegundocicloeneltextbox correspondientedelaventanadeconfiguración.Compruebaqueelnúmerodehoras estéentre1y596yquesólosehayanintroducidocaracteresnuméricos.Mostraráun mensajedeerrorsinosecumpleloanterior. //------------------------------------------------------------------// private void iniciar_fuerza_hora(object sender, EventArgs e) { fuerza_hora.Start(); fuerza_max_hora = 0; retraso_inicial_fuerza_hora.Stop(); } Iniciaelrelojquecontrolalafuerzamáximadurantelaúltimahora,poneacerola variablefuerzamáximayparaelrelojdelretrasoinicialutilizadoantesdeiniciarel relojfuerza_hora. //------------------------------------------------------------------// private void aumentar_progreso(object sender, EventArgs e) { try { progreso.Value = progreso.Value + 5; } catch (Exception ex) { progreso.Value = 100; } } Aumentalabarradebarradeprogresomostradaenlaventana. //------------------------------------------------------------------// private void borrar_fuerza_max(object sender, EventArgs e) { fuerza_max_hora = 0; } Métodoqueborralafuerzamáximadurantelaúltimahora,almacenadaenlavariable fuerza_max_hora.
private void cierre_del_form(object sender, FormClosingEventArgs e) { try { if (activo == true) finalizar_muestreo(sender, e); puertoGPIB.PortOpen = false; } catch (Exception ex) { } } Métodoqueseejecutacuandosecierralaventana.Sielmuestreoestáactivado,llama almétodofinalizar_muestreoparafinalizarloypararlosrelojes.Tambiéncierrael puertoCOMquehemosabierto. //------------------------------------------------------------------// private void fin_muestreo_Click(object sender, EventArgs e) { finalizar_muestreo(sender, e); } } } SeejecutaalpulsarelbotónFinalizarmuestreo.Haceunallamadafinalizar_muestreo parafinalizar.
12. CONCLUSIONES Eldesarrollodeesteproyectomehaservidoparamadurarenelmundodela informáticayampliarmisconocimientosendiversoscampos,comosonla programación,eldesarrollodesoftwareolamanipulaciónyprogramaciónde dispositivos.Tambiénhaampliadomiexperienciaaltenerqueenfrentarmeaun problemareal,yaquehabíaquedesarrollardesdecerounsistemaparalavidarealsin contarconcasiayuda. Estehasidoeltrabajomásamplioqueherealizadohastaelmomentoyelmás complejo,yaqueanteslostrabajosrealizadoshabíansidobastantesimplesyhabían sidoguiadoscontandoconbastanteinformación,peroeneste,elúnicomaterialconel quecontabaeraconelmanualdelafuenteydeladaptadoryhetenidoqueir buscandoinformaciónsintenerunaguíaqueseguir. AntesderealizaresteproyectonoconocíanadasobreelestándarGPIB,nisobrelos comandosSCPI,nisobrelaprogramacióndeaparatoscomofuentesosimilaresni sobremuchosconceptosutilizados.Anteriormente,miexperienciaenprogramación conaparatoshabíasidoconpequeñosysimplesdispositivoscomotecladosydisplays desegmentosdigitales. Estaexperienciamehaservidoparaverquecuandounoempiezaunproyectoparece quenovasasercapazderealizarlo,yaquealprincipionotienesideadecasinada, peroamedidaquevasinvestigandoyhaciendopruebasvascomprendiendolascosas yconsiguiendoelobjetivo.Tambiénhahabidomomentosenlosquepasasmucho tiempointentandoconseguiralgoynotesaleyparecequeesimposibleperoalfinal seconsigue. QuiereagradeceraJorgeMásEstelleselhaberofrecidoesteproyectoasícomo agradecerleelmaterialylaayudaprestada.TambiénagradeceraÁngelRodasJordá delDISCAquemehayaayudadoenalgúnaspectoenelquelehepedidoayuda.