Logging Signals in the Control System

Usually the control system runs with a rather high frequency, that is, its period is low. If you want to log signals in the control system it is advisable to use a much lower frequency in order not to clog the output stream. This can be accomplished by defining a periodic function with the desired frequency and add it to the executor.

  eeros::task::Lambda l1 ([&] () { });
  eeros::task::Periodic perLog("periodic log", 1, l1);
  perLog.monitors.push_back([&](PeriodicCounter &pc, Logger &log){
    log.info() << controlSystem.myBlock.getOut().getSignal();
  });
 
  // and further down the code
  executor.add(perLog);

This will output the output of a chosen block once per second. The lambda function is necessary so that the periodic task knows what to do, though it actually does nothing, as the function is empty.
For more complete examples see examples/controlsystem/BlockTest2 and examples/controlsystem/BlockTest3.

Log in a Subsequent Task

One must keep in mind that the periodic task which runs the control system and the periodic task which does the logging are actually running in parallel. This might lead to complication as soon as more complex signals are involved. For this reason, it might be preferable to choose the following solution.

  eeros::control::TimeDomain td("time domain CS", 0.001, true);  // time domain for the control system running with 1kHz
  eeros::task::Periodic perCS("periodic CS", 0.001, td);      // periodic task running the time domain
  executor.add(perCS);                           // add the control system task to the executor.
  perCS.after.push_back(perLog);                 // add the logging task to the task list running after the control system task

Now, the logging will be done after the control system task has finished running.

Log in the Task of the Time Domain

It is also possible to add the logging to the monitors of one of the currently running task of the control system. This could be done as follows:

  double period = 0.001;
  eeros:: control::TimeDomain td("time domain CS", period, true);  // time domain for the control system running with 1kHz
  eeros::task::Periodic perCS("periodic CS", period, td);      // periodic task running the time domain
  perCS.monitors.push_back([&](PeriodicCounter &pc, Logger &log){
    static int ticks = 0;
    if ((++ticks * period) < 1) return;
    ticks = 0;
    log.info() << controlSystem.myBlock.getOut().getSignal();
  });
 
  // and further down the code
  executor.add(perCS);

Please note that you usually want the logging to happen at a much smaller frequency than the time domain. For this, you have to reduce this frequency as shown in the example above.