Program R6871Logger;                  // Программа для сбора данных с мультиметра Advantest

const MakeModel='R6871';              // Указать модель прибора
const GPIB_address = 1;               // Указать адрес прибора на шине GPIB
const Duration = 5000;                // Длительность измерения, мин. (+выход по нажатию клавиши)
const Directory = 'C:\Incoming';      // Путь для сохранения файла CSV
const Temperature = 'Temp1';          // Температура
const Sampling = 10;                  // Интервал измерения, сек

var Maker : TDateTime;                // Дата/время создания файла
var Filename : String;
var t_start_datetime: TDateTime;           
var t_acq_datetime: TDateTime;             
var tmp_str:String;
var elapsed_time:longint;
var Answer:String;
var i:longint;
var Temp1:String;
var Make : String;
var Humidity : String;

procedure Init_File; 
begin;
   Maker := EZGPIB_TimeNow;                          // Дата/время создания файла
   EZGPIB_FileClearBuffer;
   tmp_str:='date';                                  // First column
   EZGPIB_ConvertAddToString(tmp_str,';');           
   EZGPIB_ConvertAddToString(tmp_str,'DCV');         // Second column
   EZGPIB_ConvertAddToString(tmp_str,';');
   EZGPIB_ConvertAddToString(tmp_str,'Temp °C');     // Third column  
   EZGPIB_ConvertAddToString(tmp_str,';');
   EZGPIB_ConvertAddToString(tmp_str,'Humidity %'+#13+#10);     // 4 column  + пустую строку для более простого выделения столбца в Excel
   EZGPIB_FileAddToBuffer(tmp_str);                  
   Filename := Directory+'\';
   EZGPIB_ConvertAddToString(Make,Maker);
   Make := AnsiReplaceText ( Make, ':', '_');        //Замена недопустимых символов в имени файла
   EZGPIB_ConvertAddToString(Filename,Make);
   EZGPIB_ConvertAddToString(Filename,' '+MakeModel);
   EZGPIB_ConvertAddToString(Filename,'.csv');       
   EZGPIB_FileWrite(Filename);                       // Save File
end;

procedure Save_File;
begin;
   EZGPIB_FileClearBuffer; 
   tmp_str :='';   
   EZGPIB_ConvertAddToString(tmp_str,t_acq_datetime);// First column            
   EZGPIB_ConvertAddToString(tmp_str,';');            
   EZGPIB_ConvertAddToString(tmp_str,Answer);        // Second column
   EZGPIB_ConvertAddToString(tmp_str,';');            
   EZGPIB_ConvertAddToString(tmp_str,Temp1);         // Third column
   EZGPIB_ConvertAddToString(tmp_str,';');
   EZGPIB_ConvertAddToString(tmp_str,Humidity);         // 4 column
   EZGPIB_FileAddToBuffer(tmp_str);                  // Add to file buffer
   EZGPIB_FileWrite(Filename);                       // Save File
end;  

procedure Init_Device;
begin;
   EZGPIB_BusAutoOff; // Эквивалент команды ++auto 0
   EZGPIB_BusWriteData(gpib_address,'Z');            // Reset to defaults
   EZGPIB_TimeSleep(5);
   EZGPIB_BusWriteData(gpib_address,'ac');           // Acal execute
   EZGPIB_TimeSleep(3);
   EZGPIB_BusWriteData(gpib_address,'++read_tmo_ms 10000'); // установка таймаута 10 сек
   EZGPIB_BusIFC; // Perform an Interface Clear
   EZGPIB_BusEnableEoi; 
   EZGPIB_BusSetEos(0);            
   EZGPIB_TimeSleep(1);
    
    // IT8	100 PLC
    // IT7	50 PLC
    // IT6	20 PLC
    // IT5	10 PLC
    // IT4	5 PLC
    // IT3	1 PLC
    // IT2	10 msec
    // IT1	1 msec
    // IT0	100 usec
   
   EZGPIB_BusWriteData(gpib_address,'F1,R5,M1,IT6,SI0,TD0,AZ1,RE7,CI0');
   EZGPIB_TimeSleep(2);
   EZGPIB_BusWriteData(gpib_address,'H0,S0,SL2,DL0,CS');
   EZGPIB_TimeSleep(5);
   EZGPIB_BusAutoOn;

end;                           

// Main procedure  
begin;
   EZGPIB_screenclear;                            // Clear the Output Console
   Init_Device;                                   // Send command strings to meter
   Init_File;                                     // Look for file, delete it if it exists. Create new file with headers
   t_start_datetime :=EZGPIB_TimeNow;             // Get time at beginning of each cycle
   elapsed_time:=0;  
      
   while (elapsed_time < duration) and (not ezgpib_kbdKeyPressed) do begin;
     EZGPIB_TimeWaitForMultipleOf (Sampling);     // Интервал измерения
     repeat
     Answer:='';                                  // Clear previous reading
     EZGPIB_BusWriteData(gpib_address,'E'); 
     i:=0;
       repeat
        EZGPIB_TimeSleep(0.0001);                              
        i:=i+1;
       until (EZGPIB_BusDataAvailable or (i>200000));   //ответ от R6871E 20PLC составляет 0,406 сек  
      Answer:=EZGPIB_BusGetData;
     until Length(Answer)>1;
        
     Answer := AnsiReplaceText ( Answer, '.', ','); // переделка ответа под стандарт с цифровым разделителем запятой
     t_acq_datetime := EZGPIB_TimeNow;
     elapsed_time:=MinutesBetween(t_start_datetime,t_acq_datetime);// Calculate elapsed time since start of acquisition

     repeat
     Temp1:='';                                     // Clear previous reading
     EZGPIB_BusWriteData(gpib_address,'++temp3');   // ответ от Arduino Uno R488 BME280 составляет xx мсек
     i:=0;
       repeat
        EZGPIB_TimeSleep(0.001);                              
        i:=i+1;
       until (EZGPIB_BusDataAvailable or (i>200));     
      Temp1:=EZGPIB_BusGetData;
     until Length(Temp1)>1;
        
     Temp1 := AnsiReplaceText ( Temp1, '.', ',');   // переделка ответа под стандарт с цифровым разделителем запятой 
     Temp1 := AnsiReplaceText ( Temp1, #13, '');   // 
     Temp1 := AnsiReplaceText ( Temp1, #10, '');   // 
     
     repeat
     Humidity:='';                                     // Clear previous reading
     EZGPIB_BusWriteData(gpib_address,'++humi');   // ответ от Arduino Uno R488 BME280 составляет xx мсек
     i:=0;
       repeat
        EZGPIB_TimeSleep(0.001);                              
        i:=i+1;
       until (EZGPIB_BusDataAvailable or (i>200));     
      Humidity:=EZGPIB_BusGetData;
     until Length(Humidity)>1;
        
     Humidity := AnsiReplaceText ( Humidity, '.', ',');   // переделка ответа под стандарт с цифровым разделителем запятой
     
     EZGPIB_ScreenWrite(t_acq_datetime);
     EZGPIB_ScreenWrite('  ');         
     EZGPIB_ScreenWrite(Answer);
     EZGPIB_ScreenWrite('  ');  
     EZGPIB_ScreenWrite(Temp1);
     EZGPIB_ScreenWrite('  ');  
     EZGPIB_ScreenWriteLn(Humidity);   
     Save_File;                                     // If result contains data, write data to the file
     
   end;
end.                                             