// #!/opt/kde/bin/SampLin Don't work yet //******************************************************************************************* //*** T E K R E A D *** //*** *** //*** Sampling Data from Tektronix TDS 210 / TDS 220 *** //*** Revision: 1.02 *** //*** Written for SampLin Rev. 1.5.0 *** //*** Parameters for serial Device TEKPORT: 9600,8,2,NONE / Little Endian, EOS: 0x0d *** //*** *** //*** *** //*** *** //******************************************************************************************* //******************************************************************************************* //*** Wartezeit sollte an den Rechner angepasst werden *** DELAYTIME = 300 //*** *** //******************************************************************************************* DIM PDATA_CH1[2500] DIM PDATA_CH2[2500] DIM PDATA_MAT[2500] DIM PDATA_RFA[2500] DIM PDATA_RFB[2500] DIM POFS_CH1[2] DIM POFS_CH2[2] DIM POFS_MAT[2] DIM POFS_RFA[2] DIM POFS_RFB[2] DIM POFS_X[2] DIM TEMP_DATA[2500] DIM TRACEDATA[5,2500] DIM MSG$[20] DIM CHANEL$[20] DIM COMMEND$[80] DIM a$[5] DIM b$[10] DIM FILENAME$[80] POFS_X[1] = 0 POFS_X[2] = 2500 POFS_CH1[1] = 100 POFS_CH1[2] = 100 dim oldtrce[5] // Horiz. Ablenkung in [s/Digit] / Bildschirmaufloesung x: [250 Digit/cm] DIM HD_TIME[5] // Vert. Verstaerkung in [V/Digit] / Bildschirmaufloesung y: [25 Digit/cm] DIM HD_VOLT[5] // Vert. Offset in [Digit] DIM HD_OFFSET[5] // Festlegung, ob Kanal auf dem Plot DIM DRAWTRCE[5] aqu_state=0 // Auswahlmenu X1 .. X20 DIM SELECT$[5] // HiRes Auswahlmenu DIM H_SELECT$[5] // X - Zoomfaktor DIM X_RANGE_VAL[5] // Darstellung der Kanaele DIM CHANNEL$[5] // Y - Zoomfaktor X1 .. X20 DIM Y_ZOOM_VAL[5] // Festlegung vom Zoombereiich des jew. Kanals DIM Y_ZOOM_[5] // Festlegung vom Offset des jew. Kanals DIM Y_OFFSET_[5] // Festlegung vom Hires betrieb des jew. Kanals DIM Y_HIRES_[5] SELECT$[1] = "X1" SELECT$[2] = "X2" SELECT$[3] = "X5" SELECT$[4] = "X10" SELECT$[5] = "X20" H_SELECT$[0] = "1 Pt" H_SELECT$[1] = "3 Pt" H_SELECT$[2] = "5 Pt" H_SELECT$[3] = "7 Pt" H_SELECT$[4] = "9 Pt" H_SELECT$[5] = "11 Pt" // Anzahl der dargestellen Meßpunkte im Zoom-Modus X_RANGE_VAL[1] = 2500 X_RANGE_VAL[2] = 1250 X_RANGE_VAL[3] = 500 X_RANGE_VAL[4] = 250 X_RANGE_VAL[5] = 125 // Auswahl der einzustellenden Kanaele CHANNEL$[1] = "CH1" CHANNEL$[2] = "CH2" CHANNEL$[3] = "MATH" CHANNEL$[4] = "REFA" CHANNEL$[5] = "REFB" // Festlegung der moeglichen Zoomfaktoren Y_ZOOM_VAL[1] = 1 Y_ZOOM_VAL[2] = 2 Y_ZOOM_VAL[3] = 5 Y_ZOOM_VAL[4] = 10 Y_ZOOM_VAL[5] = 20 x_range = 1 x_offset = 0 x_offset_percent = 0 y_select = 1 y_zoom = 1 y_old_zoom = 1 y_hires = 0 y_old_hires = 0 // By default, instrument is in single-shot mode looping_trigger = 0 // Changeval gibt an, wenn die Bildschirmanzeige aktualisiert werden muß changeval = 1 FILENAME$ = "File001" AUTOFILENAME$ = "" AUTOFILEINDEX = 0 ADDDLG a, "TEKREAD Rev 1.02" ADDWIDGET a, GRAPH, 220, 10, 600,480, "graph1" ADDWIDGET a, BUTTON,10,10,80,30,"Aquire", aquire ADDWIDGET a, BUTTON,10,50,80,30,"Load", do_load ADDWIDGET a, BUTTON,120,50,80,30,"Save", do_save ADDWIDGET a, BUTTON,10,90,80,30,"AutoTrig", toggle_loop ADDWIDGET a, BUTTON,120,90,80,30,"AutoSave", auto_save ADDWIDGET a, LED, 120,15,100,20,aqu_state,"AQU", "green" ADDWIDGET a, TEXT,85,140,90,30, "Y-AXIS" ADDWIDGET a, TEXT,10,170,90,30, "Channel" ADDWIDGET a, SELECT,120,170,80,30,CHANNEL$[], y_select ADDWIDGET a, TEXT,10,210,90,30, "Y-Zoom" ADDWIDGET a, SELECT,120,210,80,30,SELECT$[], y_zoom ADDWIDGET a, BUTTON,10,250,80,30,"Up", y_up ADDWIDGET a, BUTTON,120,250,80,30,"Down", y_down ADDWIDGET a, TEXT,10,290,90,30, "High Y-Resol." ADDWIDGET a, SELECT,120,290,80,30, H_SELECT$[], y_hires ADDWIDGET a, TEXT,85,330,90,30, "X-AXIS" ADDWIDGET a, TEXT,10,360,90,30, "X-Zoom" ADDWIDGET a, SELECT,120,360,80,30,SELECT$[], x_range ADDWIDGET a, SLIDER,10,400,190,30, 0, 100, 1, x_offset_percent, 20 ADDWIDGET a, BUTTON,10,460,80,30,"Exit", do_exit ADDWIDGET a, BUTTON,120,460,80,30,"Print", printtrace SHOWDLG a //SETGRAPHTITLE "graph1","Ausdruck" SETGRAPHLEGEND "graph1", Bottom //SETAXISTITLE "graph1", LEFT,"left axis" //SETAXISTITLE "graph1", Bottom,"bottom axis" SETAXISSCALE "graph1", LEFT, 0, 255, 25, 128 SETAXISSCALE "graph1", Bottom, 0, 2500, 250 SETAXISSTYLE "graph1", LEFT, None SETAXISSTYLE "graph1", Bottom, None label loop if (x_range <> x_old_range) { x_old_range = x_range ; changeval = 1; } if (x_offset_percent <> x_old_offset_percent) { x_old_offset_percent = x_offset_percent; changeval = 1; } if (y_select <> y_old_select) { y_old_select = y_select; gosub y_changesettings; } if (y_zoom <> y_old_zoom) { y_old_zoom = y_zoom; gosub y_changezoom;} if (changeval == 1) { changeval = 0; gosub redraw;} if (y_hires <> y_old_hires) { y_old_hires = y_hires; gosub set_hires;} if (looping_trigger == 1) {gosub aquire;} IDLE //SLEEP 1 goto loop label toggle_loop looping_trigger = 1 - looping_trigger; return label y_changesettings y_zoom = Y_ZOOM_[y_select] y_hires = Y_HIRES_[y_select] changeval = 1 return label y_changezoom Y_ZOOM_[y_select] = y_old_zoom changeval = 1 return label set_hires Y_HIRES_[y_select] = y_hires changeval = 1 return label y_up Y_OFFSET_[y_select] = Y_OFFSET_[y_select]+5 changeval = 1 return label y_down Y_OFFSET_[y_select] = Y_OFFSET_[y_select]-5 changeval = 1 return label auto_save INPUTDLG "AutoSave Filename Prefix (null to disable)", AUTOFILENAME$ if (LEN(AUTOFILENAME$) > 0) {AUTOFILEINDEX = 0; print "autosaving...";} else {print "autosave disabled";} return // *********************** Save ****************** label do_save FILENAME$ = "File001"; INPUTDLG "Save File", FILENAME$; print "Saving: ", FILENAME$ // Datenkopf ausgeben open 1,FILENAME$+".header.dat","w" for i=1 to 5 ; print #1, HD_TIME[i] ; next i for i=1 to 5 ; print #1, HD_VOLT[i] ; next i for i=1 to 5 ; print #1, HD_OFFSET[i] ; next i for i=1 to 5 ; print #1, DRAWTRCE[i] ; next i close 1 restore // Einzelne Datensaetze ausgeben restore for i=1 to 5 read a$ if (DRAWTRCE[i]==1) { open 1, FILENAME$+"."+a$+".dat", "w" for k=0 to 2499 print #1, TRACEDATA[i,k] next k close 1 } next i return label printtrace PRINTGRAPH "graph1" return // *********************** DISPLAY Initialisieren ****************** label display_traces restore COMMEND$ = "" y_select = 1 x_range = 1 x_start = 1 x_old_range = 1 x_offset_percent = 0 x_old_offset_percent = 0 y_select = 1 y_old_select = 1 y_zoom = 1 y_old_zoom = 1 y_hires = 0 for i = 1 to 5 // Festlegung vom Zoombereiich des jew. Kanals Y_ZOOM_[i] = 1 // Festlegung vom Offset des jew. Kanals Y_OFFSET_[i] = 0 // Festlegung vom Hires betreib des jew. Kanals Y_HIRES_[i] = 0 next i restore for i=1 to 5 read a$ if (DRAWTRCE[i]==1) then ADDPLOT "graph1", a$ fi next i restore for i=1 to 5 read a$ if (DRAWTRCE[i]==1) ADDPLOT "graph1", a$+"R" next i // Main Zeitbasis festlegen. Prioritaet: CH1 - REFB for i=1 to 5 if (DRAWTRCE[6-i]==1) maintimebase=HD_TIME[6-i]*250000 next i gosub redraw return // *********************** DISPLAY aktualisieren ****************** label redraw // Legende berechnen COMMEND$ = "" restore for i=1 to 5 read a$ if (DRAWTRCE[i]==1) COMMEND$=COMMEND$+LEFT$(STR$(HD_VOLT[i]*25/Y_ZOOM_VAL[Y_ZOOM_[i]])+"V ",27) next i COMMEND$=COMMEND$+LEFT$(STR$(maintimebase)+"ms ",27) SETGRAPHCOMMENT "graph1", Bottom, COMMEND$ // Umsetzung der Trace Daten in die Plot Daten // Skalierung vom relativen zum absoluten Offset // Verwendung von x_old_range anst. von x_range, weil sich x_range asynchron aendern kann x_offset = INT((2500 - X_RANGE_VAL[x_old_range]) * (x_offset_percent/100)) // X-Ende fuer die Nullpunktanzeige POFS_X[2] = X_RANGE_VAL[x_old_range] for i=1 to 5 if (DRAWTRCE[i]==1) { y_zoomval=Y_ZOOM_VAL[Y_ZOOM_[i]] // Kopieren der TRACE Daten in die Plot Daten mit Mittelwertbildung (HiRes) for k=0 to X_RANGE_VAL[x_old_range]-1 temp = 0 for m = 0 to Y_HIRES_[i] if ((k+x_offset+m)<2500) iptr = m else iptr = 0 // Werte rechts vom Meßwert hinzunehmen, wenn moeglich; sonst Originalwert hinzunehmen temp += (TRACEDATA[i, k+x_offset+iptr]-HD_OFFSET[i])*y_zoomval+HD_OFFSET[i] + Y_OFFSET_[i] // Den originalwert nur einmal hernehmen deshalb ueberspringen, wenn m=0 if (m) { if ((k+x_offset-m)<0) iptr = 0 else iptr = -m // Werte links vom Meßwert hinzunehmen, wenn moeglich; sonst Originalwert hinzunehmen temp += (TRACEDATA[i, k+x_offset+iptr]-HD_OFFSET[i])*y_zoomval+HD_OFFSET[i] + Y_OFFSET_[i] } next m temp = temp/(2*Y_HIRES_[i]+1) on i goto calc_set_ch1, calc_set_ch2, calc_set_mat, calc_set_refa, calc_set_refb label calc_set_return next k } next i SETAXISSCALE "graph1", Bottom, 0, X_RANGE_VAL[x_old_range], 250 restore for i=1 to 5 read a$ // Aktive Graphen if (DRAWTRCE[i]==1) { on i goto dt_ch1, dt_ch2, dt_mat, dt_refa, dt_refb label dt_return } next i return label calc_set_ch1 ; PDATA_CH1[k] = temp ; goto calc_set_return label calc_set_ch2 ; PDATA_CH2[k] = temp ; goto calc_set_return label calc_set_mat ; PDATA_MAT[k] = temp ; goto calc_set_return label calc_set_refa ; PDATA_RFA[k] = temp ; goto calc_set_return label calc_set_refb ; PDATA_RFB[k] = temp ; goto calc_set_return label dt_ch1 ; SETPLOTDATA "graph1",a$,0,1,PDATA_CH1[], X_RANGE_VAL[x_old_range] POFS_CH1[1] = HD_OFFSET[i] + Y_OFFSET_[i] ; POFS_CH1[2] = POFS_CH1[1] SETPLOTDATA "graph1",a$+"R", POFS_X[], POFS_CH1[] goto dt_return label dt_ch2 ; SETPLOTDATA "graph1",a$,0,1,PDATA_CH2[], X_RANGE_VAL[x_old_range] POFS_CH2[1] = HD_OFFSET[i] + Y_OFFSET_[i] ; POFS_CH2[2] = POFS_CH2[1] SETPLOTDATA "graph1",a$+"R", POFS_X[], POFS_CH2[] goto dt_return label dt_mat ; SETPLOTDATA "graph1",a$,0,1,PDATA_MAT[], X_RANGE_VAL[x_old_range] POFS_MAT[1] = HD_OFFSET[i] + Y_OFFSET_[i] ; POFS_MAT[2] = POFS_MAT[1] SETPLOTDATA "graph1",a$+"R", POFS_X[], POFS_MAT[] goto dt_return label dt_refa ; SETPLOTDATA "graph1",a$,0,1,PDATA_RFA[], X_RANGE_VAL[x_old_range] POFS_RFA[1] = HD_OFFSET[i] + Y_OFFSET_[i] ; POFS_RFA[2] = POFS_RFA[1] SETPLOTDATA "graph1",a$+"R", POFS_X[], POFS_RFA[] goto dt_return label dt_refb ; SETPLOTDATA "graph1",a$,0,1,PDATA_RFB[], X_RANGE_VAL[x_old_range] POFS_RFB[1] = HD_OFFSET[i] + Y_OFFSET_[i] ; POFS_RFB[2] = POFS_RFB[1] SETPLOTDATA "graph1",a$+"R", POFS_X[], POFS_RFB[] goto dt_return // *********************** LOAD ****************** label do_load FILENAME$ = "File001" INPUTDLG "Load File", FILENAME$ print "Loading: ", FILENAME$ // Bisherige Traces loeschen restore for i=1 to 5 read a$ if (DRAWTRCE[i]==1) { DELPLOT "graph1", a$ DELPLOT "graph1", a$+"R" DRAWTRCE[i] = 0 } next i // Datenkopf ausgeben open 2,FILENAME$+".header.dat","r" for i=1 to 5 ; input #2, b$ ; HD_TIME[i]=VAL(b$) ; next i for i=1 to 5 ; input #2, b$ ; HD_VOLT[i]=VAL(b$) ; next i for i=1 to 5 ; input #2, b$ ; HD_OFFSET[i]=VAL(b$) ; next i for i=1 to 5 ; input #2, b$ ; DRAWTRCE[i]=VAL(b$) ; next i close 2 restore // Einzelne Datensaetze einlesen restore for i=1 to 5 read a$ if (DRAWTRCE[i]==1) { open 2, FILENAME$+"."+a$+".dat", "r" for k=0 to 2499 input #2, b$ ; TRACEDATA[i,k]=VAL(b$) next k close 2 } next i gosub display_traces return // *********************** Datenerfassung ****************** label aquire aqu_state=1 IDLE for i=1 to 5 oldtrce[i] = DRAWTRCE[i] DRAWTRCE[i] = 0 next i DEVOPEN TEKPORT // Oszi in Defaulteinstellung DEVWRITE TEKPORT, "DATA INIT" SLEEP DELAYTIME // Kurze Ausgaben (Kein Header) DEVWRITE TEKPORT, "HEAD 0" SLEEP DELAYTIME // Abfrage der aktiven Kanaele DEVWRITE TEKPORT, "SEL?" SLEEP DELAYTIME DEVREAD TEKPORT, CHANEL$ SLEEP DELAYTIME //print "Meldung: ", CHANEL$ //COMMEND$ ="" restore // **************** CH 1 - REFB ********************* for i=1 to 5 read a$ if (VAL(MID$(CHANEL$,2*i-1,1))==1) { print a$ DEVWRITE TEKPORT, "DATA:SOURCE "+a$ SLEEP DELAYTIME DEVWRITE TEKPORT, "WFMP:XIN?" SLEEP DELAYTIME DEVREAD TEKPORT, MSG$ HD_TIME[i]=VAL(MSG$) // print "X-Ablenkung: ", HD_TIME[i]*250 SLEEP DELAYTIME DEVWRITE TEKPORT, "WFMP:YMU?" SLEEP DELAYTIME DEVREAD TEKPORT, MSG$ HD_VOLT[i]=VAL(MSG$) // print a$, ": ", HD_VOLT[i]*25, " V" SLEEP DELAYTIME DEVWRITE TEKPORT, "WFMP:YOF?" SLEEP DELAYTIME DEVREAD TEKPORT, MSG$ HD_OFFSET[i]=VAL(MSG$)+128 // print a$, " OFS:", HD_OFFSET[1], "[Digit]" SLEEP DELAYTIME DEVWRITE TEKPORT, "CURVE?" SLEEP DELAYTIME // Muell auslesen. Ich weiss nicht, wo der her kommt... DEVREAD TEKPORT, MSG$, 7 // print "Muell:", MSG$ SLEEP DELAYTIME DEVREAD TEKPORT, TEMP_DATA[], 2500, 1 // Muell auslesen. SLEEP DELAYTIME while ((DEVREADY (TEKPORT))>0) DEVREAD TEKPORT, MSG$ ,1 // Konvertierung von signed in unsigned for k=0 to 2499 if (TEMP_DATA[k]>128) TRACEDATA[i, k]=TEMP_DATA[k]-128 else TRACEDATA[i, k]=TEMP_DATA[k]+128 next k DRAWTRCE[i]=1 } next i restore for i=1 to 5 read a$ if (oldtrce[i]==1) { DELPLOT "graph1", a$ DELPLOT "graph1", a$+"R" } next i gosub display_traces if (LEN(AUTOFILENAME$) > 0) { AUTOFILEINDEX = AUTOFILEINDEX + 1 open 1,AUTOFILENAME$+STR$(AUTOFILEINDEX)+".header.dat","w" for i=1 to 5 ; print #1, HD_TIME[i] ; next i for i=1 to 5 ; print #1, HD_VOLT[i] ; next i for i=1 to 5 ; print #1, HD_OFFSET[i] ; next i for i=1 to 5 ; print #1, DRAWTRCE[i] ; next i close 1 restore for i=1 to 5 read a$ if (DRAWTRCE[i]==1) { open 1,AUTOFILENAME$+STR$(AUTOFILEINDEX)+"."+a$+".dat", "w" for k=0 to 2499 print #1, TRACEDATA[i,k] next k close 1 } next i } print ("Done") DEVCLOSE TEKPORT aqu_state=0 return label do_exit END data "CH1", "CH2", "MATH", "REFA", "REFB"