This is an old revision of the document!
Signal probe block
How the signal probe block works
The signalProbeBlock can be connected to signals like every other block. The signalProbeBlock saves the value and the timestamp of each connected signal after each call in a buffer. If the buffer is full, the oldest value will be overridden. The size of the buffer is about 10'000 values, which holds about 10 seconds of data. The size of the buffer can be defined at the declaration of the signalProbeBlock.
The measurement stops when the application is terminated or it can be stopped, when a certain safety level is reached. At the end, the measurements are written in a file with a csv compatible format.
The measured data is written in a buffer in RAM because writing in a file would influence the real time performance of the system.
How to implement the signalProbeBlock
To use the signalProbeBlock code has to be implemented at three different places. If the measurement should be stopped by a level change of the safety system, some lines of code have to be added to the safety system.
Declaration
Because only single signals and not vectors can be connected to the block, a DeMux block is also used in this example. For each signal type a different block has to be declared. In this example a block for 10 float-signals is declared.
In ControlSystem.hpp:
... eeros::control::DeMux<2,double> demux_SPB; parallelscara::SignalProbeBlock<10, double, bufferSize> signalProbeDouble; ...
Connection with signals
The signalProbeBlock can be connected like every other block. If a vector signal should be probed, a DeMux block is needed.
In ControlSystem.cpp:
.. // connect the signal to the DeMux demux_SPB.getIn().connect(robotController.get_dacOut()); // connect the DeMux to the signalProbeBlock signalProbeDouble.getIn(0).connect(demux_SPB.getOut(0)); signalProbeDouble.getIn(1).connect(demux_SPB.getOut(1)); // name the signals signalProbeDouble.setName(0, "Robot Controller DAC 0"); signalProbeDouble.setName(1, "Robot Controller DAC 1"); ... // run the blocks timedomain.addBlock(&demux_SPB); timedomain.addBlock(&signalProbeDouble);
Write the buffered data to a file
When the application is terminated, the data has to be written to a file.
In Main.cpp
... std::cout << "start writing file 'signalProbePC.csv'" << std::endl; std::ofstream fileSPPC; fileSPPC.open("/tmp/signalProbePC.csv"); fileSPPC << controlSystem.pendulumController.signalProbePC.getMetaInfoStr(); fileSPPC << controlSystem.pendulumController.signalProbePC.getDataStr(); fileSPPC.close(); std::cout << "file 'signalProbePC' written" << std::endl; while(safetySystem.getCurrentLevel().getId() == off) usleep(100000); log.trace() << "SCARA Robot Control Application finished"; return 0; }
If the signalProbeBlock is contained in an other block, following lines can be used:
... fileSPPC << controlSystem.pendulumController.signalProbePC.getMetaInfoStr(); fileSPPC << controlSystem.pendulumController.signalProbePC.getDataStr(); ...
Stop measurement in case of a level change
The measurement can be stopped, when a certain safety level is reached. This can be useful, to find a reason for a emergency stop. In this example 1'000 additional measuring points are safed, after the safety level emergency is called.
In SafetyProporties.cpp:
... level(emergency).setLevelAction([this](SafetyContext* privateContext) { static bool firstCall = true; if (firstCall) { firstCall = false; controlSys->signalProbeDouble.stopLogging(1000); // nrOfMeasurementsAfterStop = 1'000 } } ...
The csv file
The csv file is saved in a style, which easily can be opened with Excel or Matlab.
This is an example for two signals:
TS: Signal 0,Value: Signal 0,TS: Signal 0,Value: Signal 0, 1.0,3.66,1.0,5.812, 1.1002,3.72,1.1002,5.92, ...