Documentation

Data AQuisition Programming

List of programmable equipment:

  1. Multimeter Keithley Sourcemeter 2400
  2. Monochromator CVI Digikrom DK240
  3. Lock-in Amplifier Stanford Research SR830
  4. Temperature controller Cryocon CC-32 (docs)
  5. Temperature controller Brainchild C-21
  6. Temperature controller Eurotherm 3200
  7. Film evaporation thickness monitor Inficon SQM-160
  8. Arbitrary function generator Tektronix AFG3100
  9. Digital oscilloscope Lecroy WavePro 7
  10. Solar simulator PET SS50AAA
  11. Programmable high voltage supply Caen  N1470
  12. Thorlabs power meter PM120
  13. Spectrometer Tristan USB High Resolution minispectrometer
  14. Ellipsometer with HUBER stepper motors (docs).
  15. Thorlabs power and energy meter PM320 (webpage)

Please contact the owner for programming documentation.¬† We provide an open-source software development kit – daq (the latest version is 0.170.24). This development kit offers complete set of classes, which can be used to establish connection to equipment using different protocols (RS232, modbus, gpib, vxi,…). Use of these clasess is as simple as this example code (example.cc), which reads the temperature from the temperature controller:

#include <daq/TLSerial.h>
using namespace std;

Int_t main(Int_t argc, Char_t* argv[]){

int debug=100;

TLconnect* port=TLSerial::OpenPort("serial:/dev/ttyS0",debug);
if (!port) return -1;//error

port->fstop="\n";

double value;
port->Query("INPUT A:TEMP?");
if (!sscanf(port->GetBuffer(),"%le",&value)) value=0.0;

printf("Temperature A:%f\n",value);

delete port;

return 0;
}

Compilation and linking is performed by issuing the following command:

g++ example.cc -I/usr/include/root -L/usr/lib/daq -lTLdevice

And voila!

Alternative possibility to control above devices is by using the
following code. Remember that this code requires ROOT toolkit.

#include <iostream>
using namespace std;

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <termios.h>
#include <unistd.h>
#include <cstdio>
#include <cstring>

#include <time.h>

#include <TROOT.h>
#include <TApplication.h>
#include <TCanvas.h>
#include <TGraph.h>
#include <TH1F.h>
#include <TSystem.h>

bool serwrite(int fd, const char* ukaz, const char termination = '\n')
{

  int nwrite=strlen(ukaz)+1;
  char buf[1024];
  strcpy(buf,ukaz);
  strncat(buf,&termination,1);

  int nc = write(fd, buf ,nwrite ); 

  if (nc != nwrite )
    return false;

  return true;
}

bool serread(int fd, char* buf) {

  char c;
  int i = 0;
  while ( true ) {
    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(fd,&readfds);
    struct timeval timeout;
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
    select(fd+1,&readfds,0,0,&timeout);

    int nc = read(fd,&c,1);
    if ( nc < 1)
      continue;
    buf[i] = c;
    i++;
    if ( c == '\n' ) {
      break;
    }
  }
  buf[i-2]=0;
  return true;

}

int main(int argc, char ** argv) {

        //cout << "stevilo argumentov" << argc << endl;
        //cout << argv[1] << endl ;

        if (argc < 2 ) {
          cout <<"Usage: "<<argv[0]<<" <serialport>" << endl;
          return -1;
        }

        //int fd = open ("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NONBLOCK );
        char* sport=argv[1];
        int fd = open (sport, O_RDWR|O_NOCTTY|O_NONBLOCK );
        if ( fd < 0 ) {
          cout << "Serijska vrata niso bila uspesno odprta" << endl;
          return -1;
        }

        termios term;
        term.c_iflag = 0;
        term.c_oflag = 0;
        // nastavitev lastnosti serijskih vrat
        term.c_cflag = B9600|CS8|CRTSCTS|CREAD;
        term.c_lflag = 0;

        int rc = tcsetattr ( fd, TCSANOW, &term);
        if ( rc < 0 ) {
          cout << "Napaka pri nastavitvi serijskih vrat" << endl;
          return -1;
        }

        char buf[1023];
        // while (true) {

        int nmeritev = 10 ;
        double x[nmeritev];
        double y[nmeritev];

       TApplication app("App", &argc, argv);
       TCanvas canvas;
       TGraph g(nmeritev);

        long t0=time(0);

        for ( int i=0 ; i<nmeritev ; i++) {
          g.SetPoint(i,i,0);
        }
        for ( int i=0 ; i<nmeritev ; i++) {

        bool rcukaz = serwrite(fd,":POWER?");

        usleep(1000000); // spimo 1 sec

        serread(fd,buf);
        // cout << buf << endl;

        double power;
        sscanf(buf,"%lf",&power);
        cout << time(0) << " " << power << endl;

        x[i] = time(0) - t0 ;
        y[i] = power;

        g.SetPoint(i,x[i],y[i]);
        g.Draw("ALP");
        canvas.Modified();
        canvas.Update();
        }

       //TGraph g(nmeritev,x,y);
       app.Run();

}