-
Martin Christoph Hierholzer authored
Introduced the DeviceModule class which provides an interface to obtain VariableNetworkNodes for device registers
Martin Christoph Hierholzer authoredIntroduced the DeviceModule class which provides an interface to obtain VariableNetworkNodes for device registers
demoApp.cc 3.40 KiB
/*
* demoApp.cc
*
* Created on: Jun 9, 2016
* Author: Martin Hierholzer
*/
#include <iostream>
#include <mtca4u/BackendFactory.h>
#include "ApplicationCore.h"
namespace ctk = ChimeraTK;
class AutomationModule : public ctk::ApplicationModule {
public:
SCALAR_INPUT(double, operatorSetpoint, "MV/m", ctk::UpdateMode::poll);
SCALAR_OUTPUT(double, loopSetpoint, "MV/m");
void mainLoop() {
loopSetpoint = 0;
loopSetpoint.write();
while(true) {
operatorSetpoint.read();
if(operatorSetpoint > loopSetpoint) loopSetpoint++;
if(operatorSetpoint < loopSetpoint) loopSetpoint--;
std::cout << "AutomationModule: operatorSetpoint = " << operatorSetpoint << std::endl;
std::cout << "AutomationModule: loopSetpoint = " << loopSetpoint << std::endl;
loopSetpoint.write();
usleep(200000);
}
}
};
class ControlLoopModule : public ctk::ApplicationModule {
public:
SCALAR_INPUT(double, setpoint, "MV/m", ctk::UpdateMode::push);
SCALAR_INPUT(double, readback, "MV/m", ctk::UpdateMode::push);
SCALAR_OUTPUT(double, actuator, "MV/m");
void mainLoop() {
actuator = 0;
actuator.write();
while(true) {
readback.read();
setpoint.read();
actuator = 10.*(setpoint-readback);
std::cout << "ControlLoopModule: setpoint = " << setpoint << std::endl;
std::cout << "ControlLoopModule: readback = " << readback << std::endl;
std::cout << "ControlLoopModule: actuator = " << actuator << std::endl;
actuator.write();
usleep(200000);
}
}
};
class SimulatorModule : public ctk::ApplicationModule {
public:
SCALAR_INPUT(double, actuator, "MV/m", ctk::UpdateMode::push);
SCALAR_OUTPUT(double, readback, "MV/m");
double lastValue{0};
void mainLoop() {
while(true) {
actuator.read();
readback = (100*lastValue + actuator)/100.;
lastValue = readback;
std::cout << "SimulatorModule: actuator = " << actuator << std::endl;
std::cout << "SimulatorModule: readback = " << readback << std::endl;
readback.write();
usleep(200000);
}
}
};
class MyApp : public ctk::Application {
public:
MyApp() : Application("demoApp") {}
AutomationModule automation;
ControlLoopModule controlLoop;
SimulatorModule simulator;
ctk::DeviceModule dev{"Dummy0", "MyModule"};
void initialise() {
mtca4u::BackendFactory::getInstance().setDMapFilePath("dummy.dmap");
ctrlVar("MyLocation/setpoint") >> automation.operatorSetpoint;
automation.loopSetpoint >> controlLoop.setpoint
>> ctrlVar("MyLocation/setpoint_automation");
controlLoop.actuator >> dev("Variable")
>> ctrlVar("MyLocation/actuatorLoop");
dev("Variable") [ controlLoop.actuator ] >> simulator.actuator
>> ctrlVar("MyLocation/actuatorSimulator");
// this will create an independent variable network, thus also another accessor to the device
dev("Variable", typeid(double)) [ controlLoop.actuator ] >> ctrlVar("MyLocation/actuatorSimulator_direct");
simulator.readback >> controlLoop.readback
>> ctrlVar("MyLocation/readback")
>> ctrlVar("MyLocation/readback_another_time");
dumpConnections();
}
};
MyApp myApp;