pers€¦ · web viewpers

27
Page 1 of 27 Overzicht 1) Flow Start/ARM (timetronix) pag2 2) Types pag3 3) Vars pag4 4) Ruwdata Fileformaat pag5 (SaveFstEx enkel voor 4 startblokken: één USB1408FS kaart) 5) Startblokken kendata (via popupmenu ‘Refresh’) pag8 6) Startblokken data , Graph pag10 7) Startblokken data, vergelijken en verschuiven pag10 8) Laser data pag13 8a) Stockeren van laserdata tijdens meting 8b) Laser data Graph 8c) laserdata kengetallen (PopUpMenu>Refresh)

Upload: others

Post on 24-Oct-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: pers€¦ · Web viewpers

Page 1 of 21

Overzicht

1) Flow Start/ARM (timetronix) pag2

2) Types pag3

3) Vars pag4

4) Ruwdata Fileformaat pag5 (SaveFstEx enkel voor 4 startblokken: één USB1408FS kaart)

5) Startblokken kendata (via popupmenu ‘Refresh’) pag8

6) Startblokken data , Graph pag10

7) Startblokken data, vergelijken en verschuiven pag10

8) Laser data pag138a) Stockeren van laserdata tijdens meting8b) Laser data Graph8c) laserdata kengetallen (PopUpMenu>Refresh)

Page 2: pers€¦ · Web viewpers

Page 2 of 21

Overgagng van FastULS naar USBFastUNI

1) Flow Start/ARM (timetronix)

Btn [Start/Arm]- ArmStatus:= 0- if √ StartBlockEnabled >> DAQWin.ArmEx_COR >> Armstatus or ATOD_ARMED[ix]

SSB.Caption := 'A to D armed'; clGreen- if √ LSEnabled>> ULSWin.LSArmAll >> ComPortA[nr].WriteAnsiString('$GO' + CR)

>>enable LSTimer (100ms)SLS.Caption := 'Arming Lasers'; clBlue

- SSS.Caption := 'Waiting..till selection is armed..'; clGreen- Idle_XP := Idle_QueryAllArmedEx;

- - - - ▼▼▼ LSTimer if PraeCount[ix] reached >> ArmStatus or LS_ARMED[ix], disable LSTimer

Idle_QueryAllArmedEx- if √ StartBlockEnabled >> DaqWin.BusyEx >> ArmStatus or ATOD_BUSY[ix]

SSB.Caption := 'A to D Busy'; clGreen- if √ LSEnabled>> ULSWin.LSArmAll >> if AreLasersArmed >>

SLS.Caption := 'Lasers Armed'; clGreen

- if all armed >> SSS.Caption := 'All armed..waiting for shot..'; clMaroon- if Common.SBSensor = Timetronics then DaqWin.PB2_On; // TTx warning LED on- Idle_XP := Idle_WaitForShotEx;

Idle_WaitForShotEx- if Start (via clapper or Gun)

Yes: if √ StartBlockEnabled- TrigIndexA[0] := CurIndex[0], TrigCountA[0] := CurCount[0] ArmStatus or ATOD_TRIGD[ix]- if Common.SBSensor = Timetronics then

- DaqWin.PulseB(1); //TTx enable beep for TimerB(1).timeout- DaqWin.PB2_Off; //TTx warning LED off

if √ LSEnabled >> ULSWin.LSStartMeasurementAllSSS.Caption := '!SHOT!..measuring..'; clRedIdle_XP := Idle_WaitForEndEx;

No: DaqWin.SBTestStatus; //for SBMeasurementCountSSB.Caption := 'AD PraeTrig ' + IntToStr(DaqWin.SBMeasurementCount);

Idle_WaitForEndExif √ StartBlockEnabled >>- if DaqWin.SBPostTrigEnd // (Stop DAQ na (Common.SBMaxCnt - Common.SBPreCnt)/1000 milisec)

Yes: - EndIndexA[0] := CurIndex[0]; ArmStatus or ATOD_ENDED[0];- if DaqWin.SBPostEnd: DaqWin.ArmEx_CORRECT; clBtnFace

SSB.Caption := 'AD Ended Trig,End Index= ' + DaqWin.SBTrigIdxEndIdx;- if Common.SBSensor = Timetronics >>DaqWin.PB1_Off; ( Loudspeaker!!)

>>enable TimerMeasureOffset (2000ms)No: SSB.Caption := 'AD PostTrig ' + IntToStr(DaqWin.SBMeasurementNumber); clRed

if √ LSEnabled >>- if AreLasersEnded >>

Yes: SLS.Caption := 'Laser end'; clBtnFaceNo: SLS.Caption := 'LS Running ' + IntToStr(ULSWin.LSMeasurementNumber(0)); clRed

All Measurements Done? >> SSS.Caption := '..measuring done'; clBtnFace >> Idle_XP := Idle_Null; >> BSSStart.Caption := 'Arm';

- - - -▼▼▼ TimerMeasureOffset Disable TimerMeasureOffset StartBlockA[i+1].Offset_Left := DAQWin.AtoD(2*i, 0); StartBlockA[i+1].Offset_Right := DAQWin.AtoD(2*i+1, 0); MainWin.Memo1.Lines.Add('TTx MeasureOffset Done'); MainWin.BSSStart.Enabled := True;

Page 3: pers€¦ · Web viewpers

Page 3 of 21

2) Types unit A_Typen;TCommon = record Datum : TDateTime; //double FileName : String[80]; SCTime1 : integer; SCTime2 : integer; SCTime3 : integer; SCMode : integer; //0=Software, 1=Clapper, 2=Gun, 3=Ext.Sync, 4=Beeps SCOut : integer; //STARTBLOCKS + LASER + EXTSYNC //Common StartBlocks SBNmbr : integer; //aantal banen met startblokken SBMaxCnt : integer; //maximaal aantal metingen SBFreq : double; //metingen/sec SBResol : integer; //Resolutie: 0=8bit, 1=12bit, 2=13bit, 3=14bit SBBFS : double; //BFS=Building Force Slope, KOV=Kracht Opbouw Verschil, Nwt SBFTO : double; //FTO=Force Take Off, KEA=Kracht Einde Afstoot, Nwt SBPreCnt : integer; //aantal PreTrigger metingen EndIdxA : array [0..1] of integer; //end index USB1408 BOARD1&2 SBSensor : integer; // 0=KULeuven StatLoadCell TML-CLA-2KNA-AD1B3, start with clapper // 1=Timetronics DynForceCell Dytran 1054V, start with sounder SBVersion : integer; // SBReserv_int : array[0..4] of integer; //Reserve integer SBReserv_dbl : array[0..9] of double; //Reserve double //Common Laser LSNmbr : integer; //aantal banen met laser LSMaxCnt : integer; //maximaal aantal metingen LSFreq : double; //metingen/sec LSType : integer; //0=IBEO, 1=ULS (!! Voor iedere baan dezelfde) LSMode : integer; //0..8, igv. ULS verschillende instellingen (!! Voor iedere baan dezelfde) LSCom : integer; // LSComMax : integer; // LSReserv_int : array[0..7] of integer; //reserve integer; LSReserv_dbl : array[0..9] of double; //Reserve doubleend;

TStartBlock = record Name : String[15]; //atleet Naam SurName : String[10]; //atleet Voornaam Weight : double; //atleet Gewicht Height : integer; LegLenght : integer; SBNbr : integer; //werkelijk aantal metingen Offset_Left : integer; //Startblok links onbelast (bit-waarde) Offset_Right : integer; //Startblok rechts onbelast (bit-waarde) Gain_Left : double; //Startblok ykwaarde links (Nwt/bit) Gain_Right : double; //Startblok ykwaarde rechts (Nwt/bit) SBDist1 : integer; // SBDist2 : integer; Reserv_int : array[0..9] of integer; //Reserve integer Reserv_dbl : array[0..9] of double; //Reserve doubleend;

TLaser = record Name : String[15]; //atleet Naam SurName : String[10]; //atleet Voornaam LSNbr : integer; //werkelijk aantal metingen Position : integer; //laser positie tov. Startlijn PositionOffs : integer; // mm Reserv_int : array[0..9] of integer; //Reserve integer Reserv_dbl : array[0..9] of double; //Reserve doubleend;

PMeting = ^AMeting; //Laser metingAMeting = Record Waarde : single; Intensity : integer; Time : int64;end;

unit SB_DAQWindow; PData = ^AData; //Pointer voor aanspreken data in cbDAQ-buffer AData = word;

unit LS_ComWindow;

TCalibVal = Record state : integer; // 0=start calib 1=end calib -1=no calib nr : integer; // laser number val : double; n100 : integer; //% values with a deviation < 10 mm.. end;

Page 4: pers€¦ · Web viewpers

Page 4 of 21

3) Vars 3a) Global in unit A_GlobVars

Common: TCommon; CommonCmp: TCommon; StartBlockA: array[1..8] of TStartBlock; StartBlockCmpA: array[1..8] of TStartBlock; LaserA: array[1..8] of TLaser; LaserCmpA: array[1..8] of TLaser;

3b) Public in unit SB_DAQWindow, TDAQWin

Voor1ste file DataPtrA: array[0..1] of PData; //enkel [0] 1ste USB1408FS

//verwijst naar gealloceerde block voor cbWinBufAlloc MemHandleA: array[0..1] of integer; //enkel [0] 1ste USB1408FS, functiewaarde voor cbWinBufAlloc ADBfr_LenA: array[0..1] of integer; //enkel [0] 1ste USB1408FS, lengte gealloceerde block voor

//cbWinBufAlloc, ADBfr_LenA[ix] := NrChnls * Common.SBMaxCnt; NrChnls: integer; NrChnlsA: array[0..1] of integer; //enkel [0] 1ste USB1408FS EndIndexA: array[0..1] of integer; //enkel [0] 1ste USB1408FS Voor 2de file DataPtrCmpA: array[0..1] of PData; MemHandleCmpA: array[0..1] of integer; ADBfr_LenCmpA: array[0..1] of integer; NrChnlsCmp: integer; NrChnlsCmpA: array[0..1] of integer; EndIndexCmpA: array[0..1] of integer;

3c) Public in unit LS_ComWindow, TULSWin

Voor1ste file LaserBuffer: array[0..7] of TList; Meting: PMeting; PraeCount: array[0..7] of integer; //allowed to be read by LSDlg CalibValA: array[0..CCalibCount-1] of double; // every ULS calibrated in turn,

// ULS1..8 use the same Calibarray CalibVal: TCalibVal;Voor 2de file LaserBufferCmp : array[0..7] of TList;

Page 5: pers€¦ · Web viewpers

Page 5 of 21

4) Ruwdata Fileformaat ( SaveFstEx enkel voor 4 startblokken: één USB1408FS kaart)

4a) procedure SaveFstEx(naam : string);var size,i,j : integer; Fn : File of byte; //of byte: recordsize is 1begin naam := ExtractFilePath(naam) + IntToStr(YearOf(Common.Datum)) + '-' + IntToStr(MonthOf(Common.Datum)) + '-' + IntToStr(DayOf(Common.Datum)) + '_' + ExtractFileName(naam); AssignFile(Fn,naam); Rewrite(Fn); Common.FileName := ExtractFileName(Common.FileName); size := sizeof(Common); BlockWrite(Fn,size,sizeof(size)); BlockWrite(Fn,Common,size);

if (Common.SCOut and STARTBLOCKS) > 0 then for i := 1 to (Common.SBNmbr + 1) do begin size := sizeof(StartBlockA[i]); BlockWrite(Fn,size,sizeof(size)); BlockWrite(Fn,StartBlockA[i],size); end;

if (Common.SCOut and LASER) > 0 then for i := 1 to (Common.LSNmbr + 1) do begin size := sizeof(LaserA[i]); BlockWrite(Fn,size,sizeof(size)); BlockWrite(Fn,LaserA[i],size); end;

if (Common.SCOut and STARTBLOCKS) > 0 then begin DAQWin.DataPtrA[0] := PData(DAQWin.MemHandleA[0]); //StartBlock data, for all lanes in Data^ BlockWrite(Fn,DAQWin.DataPtrA[0]^,sizeof(smallint)); for i := 1 to (DaqWin.ADBfr_LenA[0] -1) do begin inc(DaqWin.DataPtrA[0]); BlockWrite(Fn,DAQWin.DataPtrA[0]^,sizeof(smallint)); end; end;

if (Common.SCOut and LASER) > 0 then for j := 0 to Common.LSNmbr do begin // Laser data, for each lane in separate LaserBuffer for i := 0 to (ULSWin.LaserBuffer[j].Count - 1) do begin // same as LaserA[Common.LSNmbr + 1].LSNbr - 1 ULSWin.Meting := ULSWin.LaserBuffer[j].Items[i]; BlockWrite(Fn,ULSWin.Meting^.Waarde, sizeof(ULSWin.Meting^.Waarde)); BlockWrite(Fn,ULSWin.Meting^.Intensity, sizeof(ULSWin.Meting^.Intensity)); BlockWrite(Fn,ULSWin.Meting^.Time, sizeof(ULSWin.Meting^.Time)); end; end; Closefile(Fn);end;

4b) function LoadFstEx(naam : string; MsrLdCmp : integer): integer;enkel voor 4 startblokken: één USB1408FS kaart

var size,i,j : integer; Fn : File of byte; //of byte: recordsize is 1begin Result := 0; AssignFile(Fn,Naam); Reset(Fn); BlockRead(Fn,size,sizeof(size)); if size = sizeof(TCommon) then begin //Indien niet >> slechte file case MsrLdCmp of ARMFORFILELOAD: begin //1ste file BlockRead(Fn,Common,size); //Common instellingen MainWin.SetMainWinAsCommon(ARMFORFILELOAD); for i := 0 to 1 do begin DaqWin.EndIndexA[i] := Common.EndIdxA[i]; MainWin.Memo1.Lines.Add('(DaqWin.EndIndexA= ' + IntToStr(DaqWin.EndIndexA[i])) end; if (Common.SCOut and STARTBLOCKS) > 0 then for i := 1 to (Common.SBNmbr + 1) do begin //StartBlok instellingen BlockRead(Fn,size,sizeof(size)); BlockRead(Fn,StartBlockA[i],size); end; if (Common.SCOut and LASER) > 0 then for i := 1 to (Common.LSNmbr + 1) do begin //Laser instellingen BlockRead(Fn,size,sizeof(size)); BlockRead(Fn,LaserA[i],size); end; if (Common.SCOut and STARTBLOCKS) > 0 then begin DAQWin.ArmEx(Common.SBNmbr + 1, ARMFORFILELOAD); // Zet NrChnls-A goed, Alloceert geheugen DaqWin.DataPtrA[0] := PData(DaqWin.MemHandleA[0]); //Set DataPtrA to start of memory area.. eigelijk niet nodig.. gebeurt in AtoDBuffer_Alloc BlockRead(Fn, DaqWin.DataPtrA[0]^, sizeof(smallint)); for i := 1 to (DaqWin.ADBfr_LenA[0] -1) do begin inc(DaqWin.DataPtrA[0]); BlockRead(Fn, DaqWin.DataPtrA[0]^, sizeof(smallint));

Page 6: pers€¦ · Web viewpers

Page 6 of 21

end;

end; if (Common.SCOut and LASER) > 0 then begin ULSWin.Adjust_LaserBuffers(ARMFORFILELOAD); for j := 1 to (Common.LSNmbr + 1) do begin // LaserA[1..8] for i := 0 to (LaserA[j].LSNbr - 1) do begin // Meting 1.. LSNbr New(ULSWin.Meting); BlockRead(Fn,ULSWin.Meting^.Waarde, sizeof(ULSWin.Meting^.Waarde)); BlockRead(Fn,ULSWin.Meting^.Intensity, sizeof(ULSWin.Meting^.Intensity)); BlockRead(Fn,ULSWin.Meting^.Time, sizeof(ULSWin.Meting^.Time)); ULSWin.LaserBuffer[j-1].Add(ULSWin.Meting); // LaserBuffer[0..7] end; end; ULSWin.SCount.Caption := IntTostr(ULSWin.LaserBuffer[0].Count); end; end;

ARMFORFILECOMPARE: begin BlockRead(Fn,CommonCmp,size); for i := 0 to 1 do begin DaqWin.EndIndexCmpA[i] := CommonCmp.EndIdxA[i]; MainWin.Memo1.Lines.Add('(DaqWin.EndIndexCmpA= ' + IntToStr(DaqWin.EndIndexCmpA[i])) end;

if (CommonCmp.SCOut and STARTBLOCKS) > 0 then MainWin.SetMainWinAsCommon(ARMFORFILECOMPARE); for i := 1 to (CommonCmp.SBNmbr + 1) do begin BlockRead(Fn,size,sizeof(size)); BlockRead(Fn,StartBlockCmpA[i],size); end; if (CommonCmp.SCOut and LASER) > 0 then for i := 1 to (CommonCmp.LSNmbr + 1) do begin BlockRead(Fn,size,sizeof(size)); BlockRead(Fn,LaserCmpA[i],size); end;

if (CommonCmp.SCOut and STARTBLOCKS) > 0 then begin DAQWin.ArmEx(CommonCmp.SBNmbr + 1, ARMFORFILECOMPARE); // Zet NrChnls-A goed, Alloceert geheugen DaqWin.DataPtrCmpA[0] := PData(DaqWin.MemHandleCmpA[0]); //Set DataPtrCmpA to start of memory area.. eigelijk niet nodig.. gebeurt in AtoDBuffer_Alloc BlockRead(Fn, DaqWin.DataPtrCmpA[0]^, sizeof(smallint)); for i := 1 to (DaqWin.ADBfr_LenCmpA[0] -1) do begin inc(DaqWin.DataPtrCmpA[0]); BlockRead(Fn, DaqWin.DataPtrCmpA[0]^, sizeof(smallint)); end; end;

if (CommonCmp.SCOut and LASER) > 0 then ULSWin.Adjust_LaserBuffers(ARMFORFILECOMPARE); for j := 1 to (CommonCmp.LSNmbr + 1) do begin for i := 0 to (LaserCmpA[j].LSNbr - 1) do begin // LaserA[1..8] New(ULSWin.Meting); BlockRead(Fn,ULSWin.Meting^.Waarde, sizeof(ULSWin.Meting^.Waarde)); BlockRead(Fn,ULSWin.Meting^.Intensity, sizeof(ULSWin.Meting^.Intensity)); BlockRead(Fn,ULSWin.Meting^.Time, sizeof(ULSWin.Meting^.Time)); ULSWin.LaserBufferCmp[j-1].Add(ULSWin.Meting); // LaserBuffer[0..7] end; end;

end; // of ARMFORFILECOMPARE

end; // of case ARMFORFILELOAD, ARMFORFILECOMPARE end else begin Result := -1; CloseFile(Fn); exit; end; CloseFile(Fn);end;

4c) Routines gebruikt in LoadFstEx

function TDAQWin.ArmEx(nmbr: integer; MsrLdCmp : integer): integer; // nmbr = number of startblocks; MsrLd: 0=ARMFORMEASURE,1=ARMFORFILELOAD (*.stx,*.fst)var options : array[0..1] of integer; // options : integer; freq : integer; ErrorCode : integer; ix : integer;begin Result := 0; ValidateNumberOfChannels(2 * nmbr, MsrLdCmp); //!!! 2 kanalen per startblok //Enkel dit gebruikt vanuit LoadFstEx AtoDBuffer_Init(MsrLdCmp); //Enkel dit gebruikt vanuit LoadFstEx if MsrLdCmp = ARMFORMEASURE then begin for ix := 0 to 1 do begin EndIndexA[ix] := 0; TrigIndexA[ix] := 0; TrigCountA[ix] := 0; EndCountA[ix] := 0; end; options[0] := BLOCKIO + BACKGROUND + CONTINUOUS; options[1] := BLOCKIO + BACKGROUND + CONTINUOUS + EXTCLOCK;

Page 7: pers€¦ · Web viewpers

Page 7 of 21

freq := 1000; for ix := 1 downto 0 do begin if NrChnlsA[ix] > 0 then begin // If Board2 active always 8 channels, same as board1 memo1.Lines.Add('NrChnlsA[' + intTostr(ix) + ']= ' + IntToStr(NrChnlsA[ix])); ErrorCode := cbAInScan(BoardNum[ix],0,(NrChnlsA[0] - 1),ADBfr_LenA[ix],freq,BIP10VOLTS,MemHandleA[ix],options[ix]); //returns in var freq actual freq if Errorcode = 0 then ArmStatus := ArmStatus or ATOD_ARMED[ix] else Result := -1; end; end; end;end;

procedure TDAQWin.ValidateNumberOfChannels(nmbr: integer; MsrLdCmp : integer);var ix : integer;begin case MsrLdCmp of ARMFORMEASURE,ARMFORFILELOAD: begin //if ARMFORFILELOAD and NrChnls > 8, 2 1408FS must be installed.. NrChnls := nmbr; if NrChnls < 0 then NrChnls := NrChnls_Def; if (NrChnls mod 2 <> 0) then NrChnls := NrChnls_Def; if (BoardNum[0] <> -1) and (BoardNum[1] = -1) then if NrChnls > 8 then NrChnls := NrChnls_Def; if (BoardNum[0] <> -1) and (BoardNum[1] <> -1) then if NrChnls > 16 then NrChnls := NrChnls_Def; ENrChnls.Text := IntToStr(NrChnls); if NrChnls < 9 then begin NrChnlsA[0] := NrChnls; NrChnlsA[1] := 0; end else begin NrChnlsA[0] := 8; NrChnlsA[1] := NrChnls - 8; end; //Bufferlengte voor 2 kaarten bij master-slave moet dezelfde zijn... bij slave ook 8 kanalen, enkel de nodige tellen.. for ix := 0 to 1 do begin if NrChnls < 9 then ADBfr_LenA[ix] := NrChnls * Common.SBMaxCnt else ADBfr_LenA[ix] := NrChnlsA[0] * Common.SBMaxCnt; StADBfr_LenA[ix].Caption := IntToStr(ADBfr_LenA[ix]); end; if NrChnls < 9 then Post_Len := ADBfr_LenA[0] - NrChnls * Common.SBPreCnt else Post_Len := ADBfr_LenA[0] - NrChnlsA[0] * Common.SBPreCnt ; memo1.Lines.Add('NrChnls= ' + IntToStr(NrChnls)); memo1.Lines.Add('NrChnlsA[0]= ' + IntToStr(NrChnlsA[0])); memo1.Lines.Add('NrChnlsA[1]= ' + IntToStr(NrChnlsA[1]));

memo1.Lines.Add('ADBfr_LenA[0]= ' + IntToStr(ADBfr_LenA[0])); memo1.Lines.Add('ADBfr_LenA[1]= ' + IntToStr(ADBfr_LenA[1])); end;

ARMFORFILECOMPARE: begin NrChnlsCmp := nmbr; if NrChnlsCmp < 9 then begin NrChnlsCmpA[0] := NrChnlsCmp; NrChnlsCmpA[1] := 0; end else begin NrChnlsCmpA[0] := 8; NrChnlsCmpA[1] := NrChnlsCmp - 8; end; //Bufferlengte voor 2 kaarten bij master-slave moet dezelfde zijn... bij slave ook 8 kanalen, enkel de nodige tellen.. for ix := 0 to 1 do if NrChnlsCmp < 9 then ADBfr_LenCmpA[ix] := NrChnlsCmp * CommonCmp.SBMaxCnt else ADBfr_LenCmpA[ix] := NrChnlsCmpA[0] * CommonCmp.SBMaxCnt; memo1.Lines.Add('NrChnlsCmp= ' + IntToStr(NrChnls)); memo1.Lines.Add('NrChnlsCmpA[0]= ' + IntToStr(NrChnlsCmpA[0])); memo1.Lines.Add('NrChnlsCmpA[1]= ' + IntToStr(NrChnlsCmpA[1])); memo1.Lines.Add('ADBfr_LenCmpA[0]= ' + IntToStr(ADBfr_LenCmpA[0])); memo1.Lines.Add('ADBfr_LenCmpA[1]= ' + IntToStr(ADBfr_LenCmpA[1])); end;

end;end;

Page 8: pers€¦ · Web viewpers

Page 8 of 21

5) Startblokken kengetallen (via popupmenu ‘Refresh’) const LSBData = 4; // voor 2 keer startblokken TRANS_SHOW = 0; TRANS_COMPARE = 1; TRANS_FIRST = 0; TRANS_SECOND = 1;

type TJumpPrty = record PreTension_L,PreTension_R : integer; Reac_L,Reac_R : integer; Ende_L,Ende_R : integer; Puls_L,Puls_R : integer; Max_L,Max_R : integer; StartTime : integer; Speed,Acceleration : single; FirstSecond : integer; SBnr : integer; Offset : integer; end; JumpPrty : array[0..1] of TJumpPrty;

//private in TStartBFormEx

PSBData = ^ASBData; ASBData = array[0..1] of array[0..LSBData-1] of integer;

SBDataBuffer : TList; SBData : PSBData;

procedure TStartBFormEx.ProcJumpPrty(nr,Show_Compare,First_Second: integer);//nr > wich startblock number within file //Show_Compare > Show or Compare pressed? //First_Second > 1st loaded or 2nd loaded file?label ReacLabelL,ReacLabelR,EndLabelL,EndLabelR;var ix,jx : integer; acc : longint; accreal : single; curve : array[1..200] of integer; BFSbit : array[0..1] of integer; //Bitwaarde voor Building Force slope FTObit : array[0..1] of integer; //Bitwaarde voor Force Take Off start: integer; PraeTrigger : Boolean; rekenpunt : integer; // ================= inner procedures..Biggest,Smallest =========================================== function Biggest(Frst,Scnd:integer):integer; begin if Frst > Scnd then Biggest := Frst else Biggest := Scnd; end; function Smallest(Frst,Scnd:integer):integer; begin if Frst < Scnd then Smallest := Frst else Smallest := Scnd; end; // ================= Main procedure..JumpPrties.. ====================================begin case First_Second of //ofwel kengetallen van 1ste file-load ofwel van 2de file-load TRANS_FIRST: begin BFSbit[0] := Round(Common.SBBFS / StartBlockA[nr + 1].Gain_Left); BFSbit[1] := Round(Common.SBBFS / StartBlockA[nr + 1].Gain_Right); FTObit[0] := Round(Common.SBFTO / StartBlockA[nr + 1].Gain_Left); FTObit[1] := Round(Common.SBFTO / StartBlockA[nr + 1].Gain_Right); if Common.SBPreCnt <> 0 then PraeTrigger := True else PraeTrigger := False; end; TRANS_SECOND: begin BFSbit[0] := Round(CommonCmp.SBBFS / StartBlockCmpA[nr + 1].Gain_Left); BFSbit[1] := Round(CommonCmp.SBBFS / StartBlockCmpA[nr + 1].Gain_Right); FTObit[0] := Round(CommonCmp.SBFTO / StartBlockCmpA[nr + 1].Gain_Left); FTObit[1] := Round(CommonCmp.SBFTO / StartBlockCmpA[nr + 1].Gain_Right); if CommonCmp.SBPreCnt <> 0 then PraeTrigger := True else PraeTrigger := False; end; end; //Interprete Reaction_Calculation_offset_as_offset in buffer and save in JumpPrty[ix].Offset if not PraeTrigger then if ReacOffs > 2000 then JumpPrty[Show_Compare].Offset := ReacOffs - 2000 else JumpPrty[Show_Compare].Offset := 0 else begin if ReacOffs < 1000 then JumpPrty[Show_Compare].Offset := 0 else if ReacOffs < 2000 then JumpPrty[Show_Compare].Offset := ReacOffs - 1000 else case First_Second of TRANS_FIRST: JumpPrty[Show_Compare].Offset := Common.SBPreCnt + ReacOffs - 2000; TRANS_SECOND: JumpPrty[Show_Compare].Offset := CommonCmp.SBPreCnt + ReacOffs - 2000; end; end; if JumpPrty[Show_Compare].Offset = 0 then rekenpunt := 1 else rekenpunt := JumpPrty[Show_Compare].Offset div 5; //ReactionTime Left ------------------------------------------------------------------------------------------------------ //no distinction between TRANS_FIRST of TRANS_SECOND.. reaction normaly within 1ste 1000 samples for ix := 0 to 198 do begin // test[1..1000] --> mean:5 --> Curve[1..200] --> criterion > BFSbit acc := 0; //1 98 because 199 * 5 + 5 = 2000 could be out of bound. for jx := 1 to 5 do begin SBData := SBDataBuffer.Items[(ix*5)+jx]; acc := acc + SBData^[0,Show_Compare*2]; end; acc := acc div 5; curve[ix+1] := acc;

Page 9: pers€¦ · Web viewpers

Page 9 of 21

end; for ix := rekenpunt to 199 do if curve[ix+1] - curve[ix] > BFSbit[0] then goto ReacLabelL; ReacLabelL: if ix < 199 then JumpPrty[Show_Compare].Reac_L := ix * 5 else JumpPrty[Show_Compare].Reac_L := 1; //1=markering voor geen reactietijd

//ReactionTime Right ----------------------------------------------------------------------------------------------------- for ix := 0 to 198 do begin acc := 0; for jx := 1 to 5 do begin SBData := SBDataBuffer.Items[(ix*5) + jx]; acc := acc + SBData^[0,Show_Compare*2+1]; end; acc := acc div 5; curve[ix+1] := acc; end; for ix := rekenpunt to 199 do if curve[ix+1] - curve[ix] > BFSbit[1] then goto ReacLabelR; ReacLabelR: if ix < 199 then JumpPrty[Show_Compare].Reac_R := ix * 5 else JumpPrty[Show_Compare].Reac_R := 1; //1=markering voor geen reactietijd

//PreTension Left -------------------------------------------------------------------------------------------------------- // geen onderscheid tussen TRANS_FIRST of TRANS_SECOND .. CommonCmp, Common, StartBlockA of StartBlockCmpA wordt niet gebruikt.. acc := 0; start := JumpPrty[Show_Compare].Reac_L - 100; if start < 0 then start := 0; for ix := start to JumpPrty[Show_Compare].Reac_L do begin // Christophe houdt aan 100!!! SBData := SBDataBuffer.Items[ix]; acc := acc + SBData^[0,Show_Compare * 2]; end; acc := acc div (JumpPrty[Show_Compare].Reac_L - start); JumpPrty[Show_Compare].PreTension_L := acc;

//PreTension Right ------------------------------------------------------------------------------------------------------- acc := 0; start := JumpPrty[Show_Compare].Reac_R - 100; if start < 0 then start := 0;

for ix := start to JumpPrty[Show_Compare].Reac_R do begin // Christophe houdt aan 100!!! SBData := SBDataBuffer.Items[ix]; acc := acc + SBData^[0,Show_Compare * 2 + 1]; end; acc := acc div (JumpPrty[Show_Compare].Reac_R - start); JumpPrty[Show_Compare].PreTension_R := acc;

//End Left --------------------------------------------------------------------------------------------------------------- // wel onderscheid tussen TRANS_FIRST of TRANS_SECOND .. einde tijde zou tussen 1000ste en 1023de meting kunnen liggen !!praetriggering!! case First_Second of TRANS_FIRST: for ix := JumpPrty[Show_Compare].Reac_L to Common.SBMaxCnt - 1 do begin SBData := SBDataBuffer.Items[ix]; if SBData^[0,2*Show_Compare] < FTOBit[0] then goto EndLabelL; end; TRANS_SECOND: for ix := JumpPrty[Show_Compare].Reac_L to CommonCmp.SBMaxCnt - 1 do begin SBData := SBDataBuffer.Items[ix]; if SBData^[0,2*Show_Compare] < FTOBit[0] then goto EndLabelL; end; end; EndLabelL: case First_Second of TRANS_FIRST: if ix < Common.SBMaxCnt - 1 then JumpPrty[Show_Compare].Ende_L := ix else JumpPrty[Show_Compare].Ende_L := 2; // 2=markering voor geen eindtijd TRANS_SECOND: if ix < CommonCmp.SBMaxCnt - 1 then JumpPrty[Show_Compare].Ende_L := ix else JumpPrty[Show_Compare].Ende_L := 2; end;

//End Right ------------------------------------------------------------------------------------------------------------ case First_Second of TRANS_FIRST: for ix := JumpPrty[Show_Compare].Reac_R to Common.SBMaxCnt - 1 do begin SBData := SBDataBuffer.Items[ix]; if SBData^[0,2*Show_Compare+1] < FTOBit[1] then goto EndLabelR; end; TRANS_SECOND: for ix := JumpPrty[Show_Compare].Reac_R to CommonCmp.SBMaxCnt - 1 do begin SBData := SBDataBuffer.Items[ix]; if SBData^[0,2*Show_Compare+1] < FTOBit[1] then goto EndLabelR; end; end; EndLabelR: case First_Second of TRANS_FIRST: if ix < Common.SBMaxCnt - 1 then JumpPrty[Show_Compare].Ende_R := ix else JumpPrty[Show_Compare].Ende_R := 2; //// 2=markering voor geen eindtijd TRANS_SECOND: if ix < CommonCmp.SBMaxCnt - 1 then JumpPrty[Show_Compare].Ende_R := ix else JumpPrty[Show_Compare].Ende_R := 2; end;

//Impuls Left ----------------------------------------------------------------------------------------------------------- if (JumpPrty[Show_Compare].Ende_L - JumpPrty[Show_Compare].Reac_L) > 0 then begin acc := 0; for ix := JumpPrty[Show_Compare].Reac_L to JumpPrty[Show_Compare].Ende_L do begin SBData := SBDataBuffer.Items[ix]; acc := acc + SBData^[0,Show_Compare*2]; end; //Memo1.Lines.Add('Impuls acc Left = ' + IntTostr(acc)); JumpPrty[Show_Compare].Puls_L := Round(acc/1000); end else JumpPrty[Show_Compare].Puls_L := 0;

//Impuls Right ----------------------------------------------------------------------------------------------------------- if (JumpPrty[Show_Compare].Ende_R - JumpPrty[Show_Compare].Reac_R) > 0 then begin

Page 10: pers€¦ · Web viewpers

Page 10 of 21

acc := 0; for ix := JumpPrty[Show_Compare].Reac_R to JumpPrty[Show_Compare].Ende_R do begin SBData := SBDataBuffer.Items[ix]; acc := acc + SBData^[0,Show_Compare*2+1]; end; //Memo1.Lines.Add('Impuls acc Right = ' + IntTostr(acc)); JumpPrty[Show_Compare].Puls_R:= Round(acc/1000); end else JumpPrty[Show_Compare].Puls_R := 0;

//Max Force Left ----------------------------------------------------------------------------------------------------------- JumpPrty[Show_Compare].Max_L := 0; case First_Second of TRANS_FIRST: for ix := 0 to Common.SBMaxCnt - 1 do begin SBData := SBDataBuffer.Items[ix]; if SBData^[0,Show_Compare*2] > JumpPrty[Show_Compare].Max_L then JumpPrty[Show_Compare].Max_L := SBData^[0,Show_Compare*2]; end; TRANS_SECOND: for ix := 0 to CommonCmp.SBMaxCnt - 1 do begin SBData := SBDataBuffer.Items[ix]; if SBData^[0,Show_Compare*2] > JumpPrty[Show_Compare].Max_L then JumpPrty[Show_Compare].Max_L := SBData^[0,Show_Compare*2]; end; end;

//Max Force Right ---------------------------------------------------------------------------------------------------------- JumpPrty[Show_Compare].Max_R := 0; case First_Second of TRANS_FIRST: for ix := 0 to Common.SBMaxCnt - 1 do begin SBData := SBDataBuffer.Items[ix]; if SBData^[0,Show_Compare*2+1] > JumpPrty[Show_Compare].Max_R then JumpPrty[Show_Compare].Max_R := SBData^[0,Show_Compare*2+1]; end; TRANS_SECOND: for ix := 0 to CommonCmp.SBMaxCnt - 1 do begin SBData := SBDataBuffer.Items[ix]; if SBData^[0,Show_Compare*2+1] > JumpPrty[Show_Compare].Max_R then JumpPrty[Show_Compare].Max_R := SBData^[0,Show_Compare*2+1]; end; end;

//StartTime ----------------------------------------------------------------------------------------------------------------- JumpPrty[Show_Compare].StartTime := Biggest(JumpPrty[Show_Compare].Ende_L,JumpPrty[Show_Compare].Ende_R) - Smallest(JumpPrty[Show_Compare].Reac_L,JumpPrty[Show_Compare].Reac_R);

//Memo1.Lines.Add('Show_Compare= ' + IntToStr(Show_Compare)); //Memo1.Lines.Add('JumpPrty[' + IntToStr(Show_Compare) + '].Ende_L= ' + IntToStr(JumpPrty[Show_Compare].Ende_L)); //Memo1.Lines.Add('JumpPrty[' + IntToStr(Show_Compare) + '].Ende_R= ' + IntToStr(JumpPrty[Show_Compare].Ende_R));end;

6) Startblokken data , Graph Data van de startblokken zit in een formaat eigen aan Computerboards en wordt overgebracht naar een linked list..Niet van toepassing voor USB-FAST-interface

7) Startblokken, vergelijken en verschuiven unit SB_ShiftDialog;

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ExtCtrls;

type TShiftExDlg = class(TForm) OKBtn: TButton; CancelBtn: TButton; R1st: TRadioGroup; R2nd: TRadioGroup; Chkshift: TCheckBox; private { Private declarations } public { Public declarations } end;

var ShiftExDlg: TShiftExDlg;

implementation

{$R *.dfm}

end.=======================================================================================procedure TStartBFormEx.BShiftClick(Sender: TObject);begin if JumpPrty[1].SBnr = -1 then Memo1.Lines.Add('2 files have to be loaded') else begin ShiftExDlg.R1st.Caption := StartBlockA[JumpPrty[0].SBnr + 1].Name + ' ' + StartBlockA[JumpPrty[0].SBnr + 1].SurName; ShiftExDlg.R1st.Items[0] := 'Left : Reaction[' + IntToStr(JumpPrty[0].Reac_L) + '], Duration[' + IntToStr(JumpPrty[0].Ende_L - JumpPrty[0].Reac_L); ShiftExDlg.R1st.Items[1] := 'Right: Reaction[' + IntToStr(JumpPrty[0].Reac_R) + '], Duration[' + IntToStr(JumpPrty[0].Ende_R - JumpPrty[0].Reac_R); ShiftExDlg.R2nd.Caption := StartBlockCmpA[JumpPrty[1].SBnr + 1].Name + ' ' + StartBlockCmpA[JumpPrty[1].SBnr + 1].SurName;

Page 11: pers€¦ · Web viewpers

Page 11 of 21

ShiftExDlg.R2nd.Items[0] := 'Left : Reaction[' + IntToStr(JumpPrty[1].Reac_L) + '], Duration[' + IntToStr(JumpPrty[1].Ende_L - JumpPrty[1].Reac_L); ShiftExDlg.R2nd.Items[1] := 'Right: Reaction[' + IntToStr(JumpPrty[1].Reac_R) + '], Duration[' + IntToStr(JumpPrty[1].Ende_R - JumpPrty[1].Reac_R); if ShiftExDlg.ShowModal = mrCancel then Memo1.Lines.Add('Shift canceled') else begin if ShiftExDlg.Chkshift.Checked then begin ShiftEx; ShiftToGraph; ShiftBackEx end else ShiftBackToGraph; end; end;end;---------procedure TStartBFormEx.ShiftEx;var ix,int1 : integer;begin ClearWerkbuffer; //all SBData^[0,0..3] cleared

case ShiftExDlg.R1st.ItemIndex of

0: begin for ix := JumpPrty[0].Reac_L to JumpPrty[0].Ende_L do begin SBData := SBDataBuffer.Items[ix]; int1 := SBData^[1,0]; SBData := SBDataBuffer.Items[ix - JumpPrty[0].Reac_L]; SBData^[0,0] := int1; end; for ix := JumpPrty[0].Ende_L + 1 to SBDataBuffer.Count - 1 do begin SBData := SBDataBuffer.Items[ix]; SBData^[0,0] := int1; end; end;

1: begin for ix := JumpPrty[0].Reac_R to JumpPrty[0].Ende_R do begin SBData := SBDataBuffer.Items[ix]; int1 := SBData^[1,1]; SBData := SBDataBuffer.Items[ix - JumpPrty[0].Reac_R]; SBData^[0,1] := int1; end; for ix := JumpPrty[0].Ende_R + 1 to SBDataBuffer.Count - 1 do begin SBData := SBDataBuffer.Items[ix]; SBData^[0,1] := int1; end; end;

end; // of case

case ShiftExDlg.R2nd.ItemIndex of

0: begin for ix := JumpPrty[1].Reac_L to JumpPrty[1].Ende_L do begin SBData := SBDataBuffer.Items[ix]; int1 := SBData^[1,2]; SBData := SBDataBuffer.Items[ix - JumpPrty[1].Reac_L]; SBData^[0,2] := int1; end; for ix := JumpPrty[1].Ende_L + 1 to SBDataBuffer.Count - 1 do begin SBData := SBDataBuffer.Items[ix]; SBData^[0,2] := int1; end; end;

1: begin for ix := JumpPrty[1].Reac_R to JumpPrty[1].Ende_R do begin SBData := SBDataBuffer.Items[ix]; int1 := SBData^[1,3]; SBData := SBDataBuffer.Items[ix - JumpPrty[1].Reac_R]; SBData^[0,3] := int1; end; for ix := JumpPrty[1].Ende_R + 1 to SBDataBuffer.Count - 1 do begin SBData := SBDataBuffer.Items[ix]; SBData^[0,3] := int1; end; end;

end; // end of case

end;-----------procedure TStartBFormEx.ShiftToGraph;var ix : integer;begin SBChartClear(TRANS_SHOW); SBChartMake(TRANS_SHOW); SBChartMake(TRANS_COMPARE); for ix := 0 to SBDataBuffer.Count - 1 do begin

Page 12: pers€¦ · Web viewpers

Page 12 of 21

SBData := SBDataBuffer.Items[ix]; ChartSB.Series[0].AddY(SBData^[0,0] * StartBlockA[JumpPrty[0].SBnr + 1].Gain_Left); ChartSB.Series[1].AddY(SBData^[0,1] * StartBlockA[JumpPrty[0].SBnr + 1].Gain_Right); ChartSB.Series[2].AddY(SBData^[0,2] * StartBlockCmpA[JumpPrty[1].SBnr + 1].Gain_Left); ChartSB.Series[3].AddY(SBData^[0,3] * StartBlockCmpA[JumpPrty[1].SBnr + 1].Gain_Right); end;end;----------procedure TStartBFormEx.ShiftBackEx;var ix,jx : integer;begin for ix := 0 to SBDataBuffer.Count - 1 do begin SBData := SBDataBuffer.Items[ix]; for jx := 0 to 3 do SBData^[0,jx] := SBData^[1,jx]; end;end;-----------procedure TStartBFormEx.SBChartClear(Show_Compare: integer); // !! alleen met 2 kanalen, vanaf 4 is er een probleem..var ix : integer;begin case Show_Compare of TRANS_SHOW: if ChartSB.SeriesCount > 0 then begin for ix := ChartSB.SeriesCount - 1 downto 0 do begin ChartSB.Series[ix].Clear; ChartSB.Series[ix].Free; end; ChartSB.RemoveAllSeries; end;

TRANS_COMPARE: if ChartSB.SeriesCount = 4 then begin for ix := ChartSB.SeriesCount - 1 downto 2 do begin ChartSB.Series[ix].Clear; ChartSB.Series[ix].Free; ChartSB.RemoveSeries(ChartSB.Series[ix]); end; end; end;end;-------procedure TStartBFormEx.SBChartMake(Show_Compare: integer);var ix : integer;begin for ix := 0 to 1 do begin ChartSB.AddSeries(TLineSeries.Create(Self)); ChartSB.Series[ChartSB.SeriesCount -1].Title := 'Chnl-' + IntToStr(2 * JumpPrty[Show_Compare].SBnr + 1 + ix); end;end;--------

Page 13: pers€¦ · Web viewpers

Page 13 of 21

8) Laser data 8a) Stockeren van laserdata tijdens meting

type

PMeting = ^AMeting;AMeting = Record Waarde : single; Intensity : integer; Time : int64;end;

TULSWin public LaserBuffer : array[0..7] of TList; Meting : PMeting;

Toestand van FireState wordt bepaald door:1) Na onCreate, TULSWin.LSStopMeasurementAll; FireState[ix] := CArmed_No;2) Na TULSWin.LSArm(nr); FireState[nr] := CArmed_Prae;

in TransLate zelf na Praecount FireState[nr] := CArmed; ButtonStart enabled3) ULSWin.LSStartMeasurementAll; FireState[nr] := Fired;4) BpositionClick>ULSWin.Calib(nr) FireState[nr] := CCalib;

Received LaserData wordt in function TULSWin.TransLate(nr: integer; Str : String): integer; onderzocht.Str wordt onderzocht op “$BM,xxx.yyy<CR>.Naargelang FireState (Ccalib, CArmed_Prae, Carmed, Fired)

Ccalib: AddCalib(nr, Copy(Str,1,Length(Str)-1));Fired: AddMeting(nr,Copy(Str,1,Length(Str)-1));

procedure TULSWin.AddMeting(nr : integer; Str : String);begin New(Meting); QueryPerformanceCounter(QueryCntNow); if Pos(',',Copy(Str,5,22)) = 0 then begin //if "Range and intensity" max 21 characters SDistance.Caption := Copy(Str,5,10); Meting^.Waarde := StrToFloat(Copy(Str,5,10)); Meting^.Intensity := -1; Meting^.Time := QueryCntNow - QueryCntPrev; //QueryCntPrev in LSStartmeasurement.. LaserBuffer[nr].add(Meting); // if BFlag then SCount.Caption := IntTostr(LaserBuffer[nr].Count); SCount.Caption := IntTostr(LaserBuffer[nr].Count); if LaserBuffer[nr].Count = Common.LSMaxCnt then LSStopMeasurement(nr); end else begin end;end;

Voor wegschrijven ruwe datafile, zie pag 5:4) Ruwdata Fileformaat (SaveFstEx enkel voor 4 startblokken: één USB1408FS kaart)4a) procedure SaveFstEx(naam : string);

8b) Laser data Graph

Button Show on MainWindow:if MsrDone then begin if LaserForm.Visible then LaserForm.Visible := False; ULSWin.TransferToGraph(cmb_LSShow.ItemIndex); // of .ItemIndex + 1 LaserForm.Show;end else Memo1.Lines.Add('No Measurement in memory.. ');

In unit LS_GraphUnit (TlaserForm)type TCorrection = record indxs : array[0..1] of integer; //2*4= 8bytes dstcs : array[0..1] of single; //2*4= 8bytes tot 16bytes. end;

Page 14: pers€¦ · Web viewpers

Page 14 of 21

PIbeoBuf = ^AIbeoBuf; AIbeoBuf = record //IntRow: array[0..LIbeoBuf-1] of integer; //bij LIbeoBuf =2 : 2 x 4 = 8bytes IntRow : array[0..1] of integer; // 2 x 4 = 8bytes IntRow[0]=werk IntRow[1]=copy RealRow : array[0..9] of single; //10 x 4 = 40bytes TimeRow : single; // 1 x 4 = 4bytes DistRow : single; end;

TPiek = record Piekval : single; Piektick : integer; Piekdist : single; Piektime : single; end; TPiekarray = array[0..PasRecL] of TPiek;

TDal = record Dalval : single; Daltick : integer; Daldist : single; Daltime : single; end;

TDalarray = array[0..PasRecL] of TDal; TAfstdat_laser = record laserpositie : integer; //position of meter before start-line meterbereik : integer; //range of lasermeter afstandsec1 : integer; //calculated/entered distance after 1sec or 312 ticks cafstandsec1 : boolean; //if checked -> calculated maxstap : integer; //max distance deviation between 2 3.2msticks tijdvenster : integer; //timewindow in 3.2 ticks afstand : integer; //dostamce window in meters afstandvenster : integer; //distance window in 3.2ticks afstandvenster_ruim : integer; //extended(+Afstandover) distance window filtervenster : integer; //filter time-window (nr of 3.2msticks) filteraantal : integer; //nr of filters totalstep : integer; //button identification between speedfilter,stepfilter speedfilter : integer; // within speedfilter stepfilter : integer; // within stepfiler LIbeoBuffer : integer; Piek : TPiekarray; // array to save Topvalues Dal : TDalarray; // array to save Valleyvalues dist_array : array[0..Lendist_array-1] of integer; // array to save 3.2msticks every 10m5m meter Offset : integer; //Brussel Om10m5m : integer; //nieuw na invoeren van ULS, Meetfrequentie : integer; Reserve : array[0..98] of integer; end;

public Points,TimeLaser,Diep : integer; //Points= LaserBuffer[nr].Count; Diep=stappenteller IbeoBuffer : TLIst; IbeoBuf : PIbeoBuf; CorrStuk : array[0..2] of TCorrection; // 3 * 16 bytes = 48 bytes..

globvar Afstdat_laser : TAfstdat_laser;

procedure TULSWin.TransferToGraph(nr: integer); //LaserA[1..8],LaserBuffer[0..7]var ix : integer;begin Afstdat_laser.laserpositie := LaserA[nr+1].Position; // LaserA[1].Position; LaserForm.IbeoFlush; LaserForm.Points := LaserBuffer[nr].Count; LaserForm.CorrStukClear; for ix := 0 to LaserBuffer[nr].Count - 1 do begin Meting := LaserBuffer[nr].Items[ix]; New(LaserForm.IbeoBuf); LaserForm.IbeoBuf^.IntRow[0] := Round(Meting^.Waarde * 1000); // overgang naar milimeter... LaserForm.IbeoBuf^.IntRow[1] := LaserForm.IbeoBuf^.IntRow[0]; // werk -> copy LaserForm.IbeoBuffer.Add(LaserForm.IbeoBuf); end;

Page 15: pers€¦ · Web viewpers

Page 15 of 21

LaserForm.Diep := 0; // zonder bewerking naar Grafiek Step0 LaserForm.BStap.Caption := stappenrij[LaserForm.Diep]; AfstDlg_laser.properlei; // no values for top/valley LaserForm.RenewLaser;end;-----procedure TLaserForm.IBEOFlush;var i : integer; str1 : string;begin str1 := 'IbeoBuffer.Count(vorig)= ' + IntToStr(IbeoBuffer.Count); for i := IbeoBuffer.Count - 1 downto 0 do begin // vrijgeven van geheugenruimte toegekend aan iedere IbeoBuf-pointer IbeoBuf := IbeoBuffer.Items[i]; Dispose(IbeoBuf); end; IbeoBuffer.Clear; //empty the Items array and set the Count to 0 IbeoBuffer.Capacity := Afstdat_laser.LIbeoBuffer + 10; str1 := str1 + ' ..(na)= ' + IntToStr(IbeoBuffer.Count); //Memo1.Lines.Add(str1);end;------procedure TLaserForm.CorrStukClear;var i,j : integer;begin for i := 0 to 2 do for j := 0 to 1 do begin CorrStuk[i].indxs[j] := 0; CorrStuk[i].dstcs[j] := 0; end; CorrToets := 0;end;-----procedure TLaserForm.RenewLaser;begin ActivateSeries(1); NaarLaserForm;end;-----procedure TLaserForm.ActivateSeries(nr : integer); //alleen nodige visible en leegmaken.var i,lim : integer;begin if nr > Chart1.SeriesList.Count then lim := Chart1.SeriesList.Count else lim := nr; for i := 0 to Chart1.SeriesList.Count - 1 do Chart1.Series[i].Active := False; for i := 0 to (lim -1) do begin Chart1.Series[i].Active := True; Chart1.Series[i].Clear; end;end;-----procedure TLaserForm.NaarLaserForm;var i : integer; einde : integer;begin if IbeoBuffer.Count > 0 then with afstdat_laser do begin ActivateSeries(1); case totalstep of 0: if diep > 0 then Caption := captionstr_laser + ' after ' + stappenrij[diep-1] else Caption := captionstr_laser; 1: Caption := captionstr_laser + ' after StepFilter'; 2: Caption := captionstr_laser + ' after SpeedFilter'; end; case diep of

0: begin for i := 0 to (Points - 1) do begin IbeoBuf := IbeoBuffer.Items[i]; IbeoBuf^.RealRow[0] := IbeoBuf^.IntRow[0]; Chart1.Series[0].AddY(IbeoBuf^.Realrow[0]); end; Chart1.LeftAxis.Title.Caption := 'Distance in milimeters'; Chart1.BottomAxis.Title.Caption := 'Timeticks in 3.2ms'; end;

1: begin for i := 0 to (IbeoBuffer.Count - 1) do begin IbeoBuf := IbeoBuffer.Items[i]; Chart1.Series[0].AddY(IbeoBuf^.Realrow[0]);

Page 16: pers€¦ · Web viewpers

Page 16 of 21

end; Chart1.LeftAxis.Title.Caption := 'Distance in milimeters'; Chart1.BottomAxis.Title.Caption := 'Timeticks in 3.2ms'; end;

2: begin if tijdvenster < Points then einde := tijdvenster else einde := (Points -1); for i := 0 to einde do begin IbeoBuf := IbeoBuffer.Items[i]; Chart1.Series[0].AddXY(IbeoBuf^.TimeRow,IbeoBuf^.Realrow[1]); end; Chart1.LeftAxis.Title.Caption := 'Distance in meters'; Chart1.BottomAxis.Title.Caption := 'Time in seconds'; end;

3: begin if tijdvenster < Points then einde := tijdvenster else einde := (Points -1); for i := 0 to einde do begin IbeoBuf := IbeoBuffer.Items[i]; Chart1.Series[0].AddXY(IbeoBuf^.TimeRow,IbeoBuf^.Realrow[2]); end; Chart1.LeftAxis.Title.Caption := 'Distance in meters'; Chart1.BottomAxis.Title.Caption := 'Time in seconds'; end;

4: begin if afstandvenster < Points then einde := afstandvenster else einde := (Points -1); for i := 0 to einde do begin IbeoBuf := IbeoBuffer.Items[i]; Chart1.Series[0].AddXY(IbeoBuf^.TimeRow,IbeoBuf^.Realrow[3]); end; Chart1.LeftAxis.Title.Caption := 'Distance in meters'; Chart1.BottomAxis.Title.Caption := 'Time in seconds , timeticks needed: ' + IntToStr(afstandvenster); end;

5: begin if afstandvenster < Points then einde := afstandvenster else einde := (Points -1); for i := 0 to einde do begin IbeoBuf := IbeoBuffer.Items[i]; Chart1.Series[0].AddXY(IbeoBuf^.DistRow,IbeoBuf^.Realrow[4]); end; Chart1.LeftAxis.Title.Caption := 'Speed in meters/sec'; Chart1.BottomAxis.Title.Caption := 'Distance in meters , timeticks needed ' + IntToStr(afstandvenster); end;

end; Chart1.Series[0].Title := kurverij3[0]; // 'abcd'; end;end;

=========================================================================================================

unit LS_AdjustDialog;

const //========= default_ Afstdat__laser (for processing..) ======================================== laserpositieDef = 2110; //2.11 meter meterbereikDef = 100000; // 100 meter afstandsec1Def = 1900; cafstandsec1Def = true; maxstapDef = 10000; tijdvensterDef = 2031; //2031 x 3.2 = 6,5 sec afstandvensterDef = tijdvensterDef; afstandDef = 40000; //40 meter filtervensterDef = 3; filteraantalDef = 2; totalstepDef = 0; //0=niks 1=stepfilter 2=speedfilter speedfilterDef = 0; // welke speedfilter stepfilterDef = 0; // welke stepfilter LIbeoBufferDef = 5000; OffsetDef = 0; //Brussel Om10m5mDef = 0;

Page 17: pers€¦ · Web viewpers

Page 17 of 21

procedure TAfstDlg_laser.properlei;begin with afstdat_laser do begin totalstep := totalstepDef; //geen knop binnen speed of step filter speedfilter := speedfilterDef; //geen knop binnen speedfilterknop stepfilter := stepfilterDef; //geen knop binnen stepfilterknop end; LaserForm.setPasRecNul; setDistArrNul; //properlei;end;

procedure TAfstDlg_laser.setDistArrNul;var j : integer;begin for j := 0 to (Lendist_array - 1) do afstdat_laser.dist_array[j] := 0; //setDistArrNul;end;

procedure TAfstDlg_laser.FormCreate(Sender: TObject);begin with Afstdat_laser do begin laserpositie := laserpositieDef; meterbereik := meterbereikDef; afstandsec1 := afstandsec1Def; cafstandsec1 := cafstandsec1Def; maxstap := maxstapDef; tijdvenster := tijdvensterDef; afstandvenster := afstandvensterDef; afstand := afstandDef; filtervenster := filtervensterDef; filteraantal := filteraantalDef; totalstep := totalstepDef; speedfilter := speedfilterDef; stepfilter := stepfilterDef; LIbeoBuffer := LIbeoBufferDef; Offset := OffsetDef; Om10m5m := Om10m5mDef; end; LaserForm.setPasRecNul; setDistArrNul; //AfstDlg_laser.FormCreate LaserForm.Diep := 0; LaserForm.BStap.Caption := stappenrij[LaserForm.diep];end;

8b) laserdata kengetallen (PopUpMenu>Refresh)

Page 18: pers€¦ · Web viewpers

Page 18 of 21

Button

procedure TLaserForm.ResetLaser;begin afstdat_laser.totalstep := 0; //0=niks 1=stepfilter 2=speedfilter Diep := 0; BStap.Caption := stappenrij[diep]; UitLeg(0,False); NaarLaserForm; //maakt gebruik van Diep!!! Chart1.UndoZoom; Enablemenu;end;

Button

procedure TLaserForm.BStapClick(Sender: TObject);var res : integer;begin afstdat_laser.totalstep := 0; //0=niks 1=stepfilter 2=speedfilter case diep of 0: begin Uitleg(1,false); Bewerk(1); //Diep=1 >>RealRow[0] /// corr. startlijn en meetbereik end; 1: begin Uitleg(2,false); Bewerk(2); //Diep=2 >>RealRow[1] /// corr. eerste seconde, Y in meters, X in seconden end; 2: begin Uitleg(3,false); Bewerk(3); //Diep=3 >>RealRow[2] /// corr. > meetbereik = 2xinc. vorige 2, > vorige+10m = vorige end; 3: begin Uitleg(4,false); Bewerk(4); //Diep=4 >>RealRow[3] na Filter: lopendgemiddelde (venster, aantal keer); Binnen tijdsvemster,afstandsvenster end; 4: begin Uitleg(5,false); Bewerk(5); //Diep=5 >>RealRow[4]corr. overgang van s=f(t) naar v=f(s) over afstandsvenster_ruim Vnstr := Afstdat_laser.filtervenster; end; end; NaarLaserForm; //maakt gebruik van Diep!!! BStap.Caption := stappenrij[diep]; Enablemenu;end;

Page 19: pers€¦ · Web viewpers

Page 19 of 21

procedure TLaserform.Uitleg(nr: integer; how: boolean);begin if how then Memo1.lines.Add('------') else Memo1.Clear; with afstdat_laser,Memo1.lines do begin case nr of 0: begin Add('=== Done after Reset ====='); Add('All points shifted left with ' + IntToStr(Offset) + 'ticks'); Add(''); Add('=== Step1: To Do ========='); Add('Substraction of meterposition.'); Add('Values limited to 110% of range.'); end; 1: begin Add('=== Step1: Done ========='); Add('Substraction of meterposition.'); Add('Values limited to 110% of range.'); if not how then begin Add(''); Add('== Step2: To Do ========='); Add('Y-AXIS:'); Add(' Transition milimeters >> meters.'); Add(' 1st second distance linear[' + IntToStr(afstandsec1) + ' mm]'); Add('TIME-AXIS:'); Add(' Transition 3.2milisec ticks >> sec.'); end; end; 2: begin Add('=== Step2: Done ========='); Add('Y-AXIS:'); Add(' Transition milimeters >> meters.'); Add(' 1st second distance linear[' + IntToStr(afstandsec1) + ' mm]'); Add('TIME-AXIS:'); Add(' Transition 3.2milisec ticks >> sec.'); Add(' TimeWindow: ' + IntToStr(tijdvenster) + 'ticks [' + IntToStr(afstand) +'mm]'); if not how then begin Add(''); Add('== Step3: To Do ========='); Add('All OUTRANGE DISTANCES ..'); Add(' replaced by previous + Delta.'); Add('All DISTANCES>previous+' + IntToStr(maxstap) + 'mm'); Add(' replaced by previous.'); end; end; 3: begin Add('=== Step3: Done ========='); Add('All OUTRANGE DISTANCES ..'); Add(' replaced by previous + Delta.'); Add('All DISTANCES>previous+' + IntToStr(maxstap) + 'mm'); Add(' replaced by previous.'); if not how then begin Add(''); Add('== Step4: To Do ========='); Add('Filter: currentmean, with: window[' + IntToStr(filtervenster) + ']ticks, times[' + IntToStr(filteraantal) + ']' ); Add('Within timewindow(' + IntToStr(tijdvenster) + ' ticks), only distancewindow(' + IntToStr(afstandvenster) + ' ticks) is displayed.'); end; end; 4: begin Add('=== Step4: Done ========='); Add('Filter: currentmean, with: window[' + IntToStr(filtervenster) + ']ticks, times[' + IntToStr(filteraantal) + ']' ); Add('Within timewindow(' + IntToStr(tijdvenster) + ' ticks), only distancewindow(' + IntToStr(afstandvenster) + ' ticks) is displayed.'); if not how then begin Add(''); Add('== Step5: To Do ========='); Add('Transition from s=f(t) to v=f(s)'); Add('Within timewindow(' + IntToStr(tijdvenster) + ' ticks),'); Add(' only distancewindow(' + IntToStr(afstandvenster) + 'ticks) will be displayed.'); end; end; 5: begin Add('=== Step5: Done ========='); Add('Transition from s=f(t) to v=f(s)'); Add('Within timewindow(' + IntToStr(tijdvenster) + ' ticks),'); Add(' only distancewindow(' + IntToStr(afstandvenster) + 'ticks) is displayed.'); end; end; end;end;

Page 20: pers€¦ · Web viewpers

Page 20 of 21

function TLaserForm.Bewerk(nr: integer): integer;var i : integer; //used from 1 on accsec1 : single; // 2 on IbeoBuf1,IbeoBuf2 : PIbeoBuf; // 3 on hv,onder,boven,n,j,k : integer; // 4 on Acc2 : toekomst: indien 2 kurves geladen sgl,Acc1,last : single;label volgend,volgend1;begin if IbeoBuffer.Count > 0 then with Afstdat_laser do begin Result := 0; case nr of 1: begin for i := 0 to (Points - 1) do begin IbeoBuf := IbeoBuffer.Items[i]; IbeoBuf^.RealRow[0] := IbeoBuf^.IntRow[0] - laserpositie; if IbeoBuf^.RealRow[0] < 0 then IbeoBuf^.RealRow[0] := 0; if IbeoBuf^.RealRow[0] > (meterbereik + meterbereik div 100) then IbeoBuf^.RealRow[0] := meterbereik + meterbereik/100; end; Diep := 1; end; 2: begin if cafstandsec1 then begin //het gemiddelde van 4 samples na 1 seconde nemen we als afgelegde weg na 1 seconde... accsec1 := 0; for i := sec_1 to (sec_1 + sec_1sam - 1) do begin Ibeobuf := IbeoBuffer.Items[i]; accsec1 := accsec1 + Ibeobuf^.RealRow[0]; //.intRow[0]; end; afstandsec1 := Round(accsec1/sec_1sam); end; for i := 0 to Points - 1 do begin IbeoBuf := IbeoBuffer.Items[i]; IbeoBuf^.RealRow[1] := IbeoBuf^.RealRow[0]/1000; //overgang naar meter IbeoBuf^.TimeRow := i * tijdsincrement; if i < sec_1 then IBeoBuf^.RealRow[1] := i * afstandsec1/ (1000 * sec_1); //weg per tijd; end; Diep := 2; end; 3: begin //overbrengen van 1 naar 2 for i := 0 to IbeoBuffer.Count - 1 do begin IbeoBuf := IbeoBuffer.Items[i]; Ibeobuf^.RealRow[2] := Ibeobuf^.RealRow[1]; end; //alles > meetbereik vervangen door vorige waarde + verschil vorige 2 for i := 100 to IbeoBuffer.Count - 1 do begin //voor 100 toch alles lineair IbeoBuf := IbeoBuffer.Items[i]; IbeoBuf1 := IbeoBuffer.Items[i-1]; IbeoBuf2 := IbeoBuffer.Items[i-2]; if IbeoBuf^.RealRow[2] * 1000 > meterbereik then begin //Mainwin.Memo1.Lines.Add(' i = ' + IntToStr(i) + // ' val at i= ' + FloatToStr(Ibeobuf^.RealRow[2]) + // ' val at i-1= ' + FloatToStr(Ibeobuf1^.RealRow[2]) + // ' val at i-2= ' + FloatToStr(Ibeobuf2^.RealRow[2]) + // ' nval at i= ' + FloatToStr(2 * IbeoBuf1^.RealRow[2] - IbeoBuf2^.RealRow[2]) ); Ibeobuf^.RealRow[2] := 2 * IbeoBuf1^.RealRow[2] - IbeoBuf2^.RealRow[2]; end; end; //alle stappen groter dan 10m eruit // for i := 100 to IbeoBuffer.Count - 1 do begin for i := 100 to Points - 1 do begin IbeoBuf := IbeoBuffer.Items[i]; IbeoBuf1 := IbeoBuffer.Items[i-1]; if Ibeobuf^.RealRow[2] >= IbeoBuf1^.RealRow[2] + maxstap then Ibeobuf^.RealRow[2] := IbeoBuf1^.RealRow[2]; //10.000mm=10m end; Diep := 3; end; 4: begin for i := 0 to Points - 1 do begin //bepaal afstandsvenster (voor de grafiek) IbeoBuf := IbeoBuffer.Items[i]; if Ibeobuf^.RealRow[2] * 1000 > afstand then begin afstandvenster := i; goto volgend; end; end; volgend: sgl := Ibeobuf^.RealRow[2]; for i := 0 to Points - 1 do begin //bepaal afstandsvensterruim (voor de filter)

Page 21: pers€¦ · Web viewpers

Page 21 of 21

IbeoBuf := IbeoBuffer.Items[i]; if (Ibeobuf^.RealRow[2] * 1000) > (afstand + Afstandover) then begin afstandvenster_ruim := i; goto volgend1; end; end; volgend1: MainWin.Memo1.Lines.Add('index = ' + IntToStr(i) + '/' + IntToStr(IbeoBuffer.Count)); MainWin.Memo1.Lines.Add('Ibeobuf^.RealRow[3] = ' + FloatToStrF(Ibeobuf^.RealRow[2],ffFixed,7,4) + ' --- ' + FloatToStrF(sgl,ffFixed,7,4) + ' op ' + IntToStr(afstand) ); MainWin.Memo1.Lines.Add(' timewindow= ' + IntToStr(tijdvenster) + ' distancewindow = ' + IntToStr(afstandvenster)+ ' distancewindow_extended = ' + IntToStr(afstandvenster_ruim) ); for i := 0 to Points - 1 do begin //filter, overbrengen van 2 naar 9 als we meerdere keren filteren IbeoBuf := IbeoBuffer.Items[i]; Ibeobuf^.RealRow[9] := Ibeobuf^.RealRow[2]; end; for k := 0 to filteraantal do begin hv := filtervenster div 2; for i := 0 to afstandvenster_ruim do begin if (i - hv >= 0) and (i + hv <= afstandvenster_ruim) then begin //venster valt binnen gebied. onder := i - hv; boven := i + hv; n := filtervenster; end else begin if (i - hv) < 0 then begin //venster onder buiten gebied onder := 0; boven := 2 * i; n := 2 * i + 1; end; if (i + hv) > afstandvenster_ruim then begin //venster boven buiten gebied onder := 2*i - afstandvenster_ruim; boven := afstandvenster_ruim; n := 2 * (afstandvenster_ruim - i) + 1; end; end; Acc1 := 0; for j := onder to boven do begin IbeoBuf := IbeoBuffer.Items[j]; Acc1 := Acc1 + IbeoBuf^.RealRow[9] end; IbeoBuf := IbeoBuffer.Items[i]; IbeoBuf^.RealRow[3] := Acc1/n; end; for i := 0 to Points - 1 do begin //overbrengen van 3 naar 9 als we meerdere keren filteren IbeoBuf := IbeoBuffer.Items[i]; Ibeobuf^.RealRow[9] := Ibeobuf^.RealRow[3]; end; end; // of for k := 0 to filteraantal //mochten we alle waarden op grafiek zetten >> buiten filtergebied = last IbeoBuf := Ibeobuffer.Items[afstandvenster_ruim]; last := Ibeobuf^.RealRow[3]; for i := afstandvenster_ruim to Points - 1 do begin IbeoBuf := IbeoBuffer.Items[i]; IbeoBuf^.RealRow[3] := last; end; Diep := 4; end; 5: begin IBeoBuf := Ibeobuffer.Items[0]; Ibeobuf^.RealRow[4] := 0; //Ibeobuf^.DistRow := IbeoBuf^.RealRow[3]; Ibeobuf^.DistRow := 0; for i := 1 to afstandvenster_ruim do begin IbeoBuf := IbeoBuffer.Items[i]; IbeoBuf1 := IbeoBuffer.Items[i+1]; //nooit tever .. afstandsvenster < Ibeobuffer.count IbeoBuf^.RealRow[4] := (IbeoBuf1^.RealRow[3] - IbeoBuf^.RealRow[3]) / (IbeoBuf1^.TimeRow - IbeoBuf^.TimeRow); IbeoBuf^.DistRow := IbeoBuf^.RealRow[3]; end; Diep := 5; end;

end; end else begin Result := -1; MainWin.Memo1.Lines.Add('No values in memory.'); end;end;