/* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ File : DVM/DVM.C Erstellungsdatum : 9.88 บ บ Autor : MIWE Version : 1.2 บ บ บ บ Dieses File enth„lt die Routinen fr das Ansprechen des DigitalVolt- บ บ Meters. Diese sind : บ บ บ บ UWORD dvm_init( NULL_PARA ) บ บ - Initialisieren des angeschlossenen DVMs. Muแ vor Aufruf บ บ der anderen Routinen aufgerufen werden. บ บ บ บ UWORD dvm_read( DOUBLE FAR *value ) บ บ - Lesen eines Wertes vom DVM nach value บ บ บ บ UWORD dvm_function( UBYTE func ) บ บ - Einstellen der Messfunktion des DVM. บ บ บ บ UWORD dvm_rate( UBYTE rate ) บ บ - Einstellen der Messrate บ บ บ บ UWORD dvm_range( UBYTE range ) บ บ - Einstellen des Messbereichs บ บ บ บ UWORD dvm_trials( UWORD trials_no ) บ บ - Setzen der Anzahl der Messversuche bei . Wird บ บ berschritten liefert DVM_E_NOVAL. บ บ Der angegebene Wert muแ positiv sein. บ บ Default-Wert ist DVM_DEFTRIALS (s.unten). บ บ บ บ UWORD dvm_offset( FLOAT off ) บ บ - Setzen der m”glichen Abweichung dreier aufeinanderfolgender บ บ Messwert bei . Diese Angabe erfolgt in Prozent, บ บ d.h. 0.0 < <= 100.0 บ บ Default-Wert ist DVM_DEFOFFSET (s.unten) . บ บ บ บ Alle Funktionen liefern bei Erfolg OK als Funktionswert, sonst บ บ einen der folgenden Fehlercodes : บ บ บ บ DVM_E_PARA - Falsche Parameter บ บ DVM_E_IEEE - Fehler von IEEE-Busroutinen บ บ DVM_E_NODVM - Kein DVM angeschlossen บ บ DVM_E_NOVAL - Kein Messwert gltig => Messung schwankt บ บ บ บ Ver„nderungen : ( Datum Autor - Erl„uterungen ) บ บ บ บ 1.2.89 Ver 1.1 MiWe - Neue DEBUG- u. ERROR- Behandlung eingesetzt. บ บ บ บ 19.5.89 Ver 1.2 MiWe - chk_abort in dvm_read eingesetzt. บ บ บ บ 14.3.90 MiWe - Nur noch PA.H mit #include einbinden. บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ #include /* * PROC : fabs */ #include /* * PROC : strcmp */ #include /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ KONSTANTEN บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ #define NO_DVM NO_IEEE_DEVICE #define MAX_INIT 3 /* max. Init-Versuche */ #define MAX_READ 100 /* max. Wiederholung Lesen */ /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ TYPEN บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ typedef enum { FLUKE_8840A, FLUKE_8860A, FLUKE_8842A } DVM_TYPE; /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ VARIABLEN บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ intern UWORD trials = DVM_DEFTRIALS; /* MESSVERSUCHE */ intern FLOAT offset = DVM_DEFOFFSET; /* %-ABWEICHUNG */ intern DVM_TYPE typ; intern IEEE_DEVICE *dvm = NO_DVM; intern UBYTE last_func = CLEAR; intern UBYTE last_rate = DIGIT_5_5; intern UBYTE last_range = AUTO_RANGE; /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ INTERNE FUNKTIONEN บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ intern UWORD send( CHAR FAR *str ); /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ dvm_init บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ UWORD dvm_init( NULL_PARA ) { UWORD init_cnt = 0; while( (init_cnt++ < MAX_INIT) && (dvm == NO_DVM) ) dvm = ieee_open( DVM ); if( dvm == NO_DVM ) return ERROR_2( DVM_E_NODVM, "Kein DVM erkannt" ); else { if( strcmp( dvm->id_name, "Fluke 8840A" ) == 0 ) typ = FLUKE_8840A; if( strcmp( dvm->id_name, "Fluke 8860A" ) == 0 ) typ = FLUKE_8860A; if( strcmp( dvm->id_name, "Fluke 8842A" ) == 0 ) typ = FLUKE_8842A; DBUG_2( "%s DVM erkannt\n", dvm->id_name ); dvm_function( CLEAR ); return OK; } } /* dvm_init() */ /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ dvm_read บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ UWORD dvm_read( DOUBLE FAR *value ) { extern UWORD FAR dvm_init( NULL_PARA ); UWORD i = 0, j; DOUBLE first, second, t; if( dvm == NO_DVM ) dvm_init(); while( i < trials ) { for( j=0 ; (ieee_readr( dvm, value ) != OK) && j <= MAX_READ ; j++ ) chk_abort(); if( messwert ) wprintf( messwert, "%d. %f\n", i, *value ); if( j > MAX_READ ) return ERROR_2( DVM_E_IEEE, "Fehler beim Lesen vom DVM\n" ); t = fabs((*value * offset) / 100); if( (i >= 2) && (fabs(*value - first) <= t) && (fabs(*value - second) <= t) ) break; first = second; second = *value; i++; chk_abort(); }/* while */ if( i >= trials ) return ERROR_2( DVM_E_NOVAL, "Messung schwankt zu sehr\n" ); else return OK; } /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ dvm_function บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ UWORD dvm_function( UBYTE func ) { if( dvm == NO_DVM ) dvm_init(); if( func != last_func ) { last_func = func; /* THAT IS GOOD FOR FLUKE DVM'S */ switch( func ) { case CLEAR : return send( "*" ); case VDC : return send( "F1" ); case VAC : return send( "F2" ); case OHM_2T : return send( typ == FLUKE_8860A ? "F4" : "F3" ); case OHM_4T : return send( typ == FLUKE_8860A ? "F5" : "F4" ); case mADC : if( typ != FLUKE_8860A ) return send( "F5" ); else return ERROR_2( DVM_E_WPARA, "Fluke 8860 A kann keinen Strom messen\n" ); case mAAC : if( typ != FLUKE_8860A ) return send( "F6" ); else return ERROR_2( DVM_E_WPARA, "Fluke 8860 A kann keinen Wechselstrom messen\n" ); default : return ERROR_3( DVM_E_PARA, "Unbekannte Funktion : %d", func ); }/* switch */ }/* if */ else return OK; }/* dvm_function */ /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ dvm_rate บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ UWORD dvm_rate( UBYTE rate ) { if( dvm == NO_DVM ) dvm_init(); if( rate != last_rate ) { last_rate = rate; switch( rate ) { case DIGIT_5_5 : case LOW_RATE : return send( "S0" ); case DIGIT_4_5 : return send( "S1" ); case DIGIT_3_5 : case HIGH_RATE : return send( "S2" ); default : return ERROR_3( DVM_E_PARA, "Unbekannte Rate : %d", rate ); }/* switch */ }/* if */ }/* dvm_rate */ /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ dvm_range บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ UWORD dvm_range( UBYTE range ) { if( dvm == NO_DVM ) dvm_init(); if( range != last_range ) { last_range = range; switch( range ) { case LOW_RANGE : case OHM_200 : case mVOLT_200 : return send( "R1" ); case OHM_2K : case VOLT_2 : return send( "R2" ); case OHM_20K : case VOLT_20 : return send( "R3" ); case OHM_200K : case VOLT_200 : return send( "R4" ); case HIGH_RANGE : case OHM_2M : case VDC_1000 : case VAC_700 : case mA_2000 : return send( "R5" ); case OHM_20M : return send( "R6" ); case OHM_20 : case mVOLT_20 : if( typ == FLUKE_8842A ) return send( "R8" ); else return ERROR_3( DVM_E_WPARA, "DVM (%s) kann den Bereich nicht", dvm->id_name ); case AUTO_RANGE : return send( "R0" ); default : return ERROR_3( DVM_E_PARA, "Unbekannter Bereich : %d", range ); }/* switch */ }/* if */ }/* dvm_range */ /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ dvm_trials บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ UWORD dvm_trials( UWORD trials_no ) { if( trials_no == 0 ) return ERROR_2( DVM_E_PARA, "Null Versuche geht nicht." ); trials = trials_no; return OK; } /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ dvm_offset บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ UWORD dvm_offset( FLOAT off ) { if( ((FLOAT) 0.0 < off) && (off <= (FLOAT)100.0) ) { offset = off; return OK; } return ERROR_3( DVM_E_PARA, "Ungltiger Parameter : %f\n", off ); } /* ษออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออป บ บ บ send บ บ บ ศออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออผ */ intern UWORD send( CHAR FAR *str ) { UWORD ret; DBUG_3( "Sende \"%s\" zum %s\n", str, dvm->id_name ); if( (ret = ieee_writes( dvm, str )) != OK ) return ERROR_3( DVM_E_IEEE, "Fehler beim Aufruf von IEEE-Routine ieee_writes: %d\n", ret ); return OK; }