...
 
Commits (2)
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#include "HPStickController.h"
#include "Utilities/Counter.h"
using namespace std;
namespace sampletemperature {
const string HPStickController::TYPE = "hpstick";
/*
* Constructor
*/
HPStickController::HPStickController(const string& name) :
SampleTemperatureController(name) {
stickTemp.init(this, NOSAVE | SPY, "sticktemp", "stickTemp");
vacuum.init(this, NOSAVE | SPY, "vacuum", "Vacuum");
vacuum.setUnit("mbar");
registerFunction(TYPE);
}
/*
* Destructor
*/
HPStickController::~HPStickController() {
// Empty
}
/*
* postConfiguration
*/
void HPStickController::postConfiguration() {
SampleTemperatureController::postConfiguration();
stickTemp.setUnit(temperatureUnit());
registerUpdater(m_SampleDriver->vacuum, &HPStickController::updateVacuum, this);
registerUpdater(m_SampleDriver->temp3, &HPStickController::updatestickTemp, this);
updateVacuum();
updatestickTemp();
}
/*
* updateTemp3
*/
void HPStickController::updatestickTemp() {
SampleTemperatureController::updateTemp3();
stickTemp.update(temp3Temperature());
}
/*
* updateColdValvePressure
*/
void HPStickController::updateVacuum() {
vacuum.update(m_SampleDriver->vacuum());
}
}
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef HPStickCONTROLLER_H
#define HPStickCONTROLLER_H
#include "SampleTemperatureController.h"
namespace sampletemperature {
/*!
* \class
* \brief Class described
*/
class HPStickController: public SampleTemperatureController {
public:
//! Type of controller
static const std::string TYPE;
/*!
* \brief Constructor
* \param[in] name the name of the experiment controller
*/
HPStickController(const std::string& name);
/*!
* \brief Destructor
*/
virtual ~HPStickController();
/*!
* \brief Method called before changing the property value
*
* This method is called after setting configuration during the creation of controller.
*/
virtual void postConfiguration();
/*!
* Properties
*/
Property<float64> stickTemp;
Property<float64> vacuum;
private:
void updateVacuum();
void updatestickTemp();
};
}
#endif //CRYOSTATORANGECONTROLLER_H
......@@ -5,6 +5,7 @@
<controller class="sampletemperature::DisplexPlusController"/>
<controller class="sampletemperature::FurnaceController"/>
<controller class="sampletemperature::GhsdiController"/>
<controller class="sampletemperature::HPStickController"/>
<controller class="sampletemperature::SampleTemperatureController"/>
<controller class="sampletemperature::CryostatOrangeDualExchanger"/>
</module>
# Spy
hpstick.SamplePrefix=Sample
hpstick.RegulationPrefix=Regulation
hpstick.SetPointPrefix=SetPoint
hpstick.WantedPrefix=Wanted
hpstick.temperatureSwitcher=Temperatures
# Command
hpstick.wantedTemperaturePrefix=Temperature
##########
# Settings
hpstick.second=s
# Status
hpstick.setPointTempPrefix=SetPoint Temperature
hpstick.regulationTempPrefix=Regulation Temperature
hpstick.sampleTempPrefix=Sample Temperature
hpstick.cryostatRegulationTempPrefix=Cryostat Temperature
hpstick.stickTempPrefix=Stick Temperature
hpstick.vacuumPrefix=Vacuum
# Temperature group
hpstick.temperatureTitle=Temperature Control
hpstick.wantedTempPrefix=Temperature Setpoint
hpstick.rampModePrefix=Ramp Mode
hpstick.deltaPrefix=~Delta
# Ramp mode
hpstick.noneRampValue=none
hpstick.setpointRampValue=setpoint
hpstick.regulationRampValue=regulation
hpstick.sampleRampValue=sample
hpstick.noneRampLabel=None
hpstick.setpointRampLabel=SetPoint
hpstick.regulationRampLabel=Regulation
hpstick.sampleRampLabel=Sample
# Temperature Param group
hpstick.tempParamTitle=Temperature Parameters
hpstick.maxTempPrefix=Maximum Temperature
hpstick.minTempPrefix=Minimum Temperature
hpstick.tolerancePrefix=Tolerance (+/-)
hpstick.tolModePrefix=on
hpstick.sampleTolLabel=Sample sensor
hpstick.sampleTolValue=sample
hpstick.regulationTolLabel=Regulation sensor
hpstick.regulationTolValue=regulation
hpstick.timeoutPrefix=Time Out
hpstick.stabilisationPrefix=Stabilisation
# Check Button
hpstick.timeoutCheckedValue=true
hpstick.timeoutUncheckedValue=false
hpstick.stabilisationCheckedValue=true
hpstick.stabilisationUncheckedValue=false
# Radio buttons h/m/s
hpstick.hValue=h
hpstick.hLabel=h
hpstick.mValue=m
hpstick.mLabel=m
hpstick.sValue=s
hpstick.sLabel=s
<plugin>
<controller type="hpstick" role="hpstick1"/>
<number_of_lines nb_lines="3"/>
<!-- Force set values order (PID2 requirement) -->
<property role="hpstick1" property="wanted_temperature" save_value="true"/>
<property role="hpstick1" property="sample_temperature"/>
<property role="hpstick1" property="ramp_mode" save_value="true"/>
<property role="hpstick1" property="ramp_speed" save_value="true"/>
<property role="hpstick1" property="ramp_time" save_value="true"/>
<property role="hpstick1" property="use_timeout" save_value="true"/>
<property role="hpstick1" property="timeout" save_value="true"/>
<property role="hpstick1" property="timeout_type" save_value="true"/>
<property role="hpstick1" property="use_stabilisation" save_value="true"/>
<property role="hpstick1" property="stabilisation" save_value="true"/>
<property role="hpstick1" property="stabilisation_type" save_value="true"/>
<property role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin"/>
<property role="hpstick1" property="tolerance"/>
<property role="hpstick1" property="allow_user_tolerance"/>
<property role="hpstick1" property="user_tolerance" save_value="true"/>
<property role="hpstick1" property="use_pid2"/>
<property role="hpstick1" property="pid2_active" save_value="true"/>
<property role="hpstick1" property="use_fastmode" save_value="true"/>
<property_switcher role="hpstick1" property="ramp_mode" switcher_key="ramp_modeSwitcher"/>
<property_switcher role="hpstick1" property="allow_user_tolerance" switcher_key="allow_user_toleranceSwitcher"/>
<text role="hpstick1" property="wanted_temperature" prefix="hpstick.wantedTemperaturePrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<switchable_composite switcher_key="allow_user_toleranceSwitcher" switch_values="true">
<text role="hpstick1" property="user_tolerance" prefix="hpstick.tolerancePrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
</switchable_composite>
<newLine/>
<switchable_composite switcher_key="pid2ActiveSwitcher" switch_values="false">
<combo role="hpstick1" property="ramp_mode" prefix="hpstick.rampModePrefix" valuesAndLabels="hpstick.noneRamp,hpstick.setpointRamp,hpstick.regulationRamp,hpstick.sampleRamp"/>
<switchable_composite switch_values="regulation,sample,setpoint" switcher_key="ramp_modeSwitcher">
<text role="hpstick1" property="ramp_speed" prefix="hpstick.deltaPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<text role="hpstick1" property="ramp_time" suffix="hpstick.second"/>
</switchable_composite>
</switchable_composite>
<newLine/>
<property_switcher role="hpstick1" property="use_stabilisation" switcher_key="stabilisationSwitcher"/>
<check role="hpstick1" property="use_stabilisation" prefix="hpstick.stabilisationPrefix" checkBoxValues="hpstick.stabilisation"/>
<switchable_composite switcher_key="stabilisationSwitcher" switch_values="true">
<text role="hpstick1" property="stabilisation"/>
<radio role="hpstick1" property="stabilisation_type" valuesAndLabels="hpstick.h,hpstick.m,hpstick.s" spaceBefore="false"/>
</switchable_composite>
<property_switcher role="hpstick1" property="use_timeout" switcher_key="timeoutSwitcher"/>
<check role="hpstick1" property="use_timeout" prefix="hpstick.timeoutPrefix" checkBoxValues="hpstick.timeout"/>
<switchable_composite switcher_key="timeoutSwitcher" switch_values="true">
<text role="hpstick1" property="timeout"/>
<radio role="hpstick1" property="timeout_type" valuesAndLabels="hpstick.h,hpstick.m,hpstick.s" spaceBefore="false"/>
</switchable_composite>
<construction>
<simple_image prefix="LEFT_TO_RIGHT_ARROW"/>
<label role="hpstick1" property="wanted_temperature"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
</construction>
<running>
<label role="hpstick1" property="sample_temperature"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<simple_image prefix="LEFT_TO_RIGHT_ARROW"/>
<label role="hpstick1" property="wanted_temperature"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
</running>
<finished>
<simple_image prefix="TICK"/>
<label role="hpstick1" property="wanted_temperature"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
</finished>
</plugin>
<controller_plugin_config type="hpstick">
<image key="CRYOSTAT_ORANGE"/>
<settings view="hpstickView.xml"/>
<command view="hpstickCommandView.xml" backgroundable="true"/>
</controller_plugin_config>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<controller type="hpstick">
<property name="use_timeout" type="Boolean">
</property>
<property name="timeout" type="int32" max_length="6">
<strictly_positive/>
</property>
<property name="timeout_type" type="String">
<specific_values values="h,m,s"/>
</property>
<property name="use_stabilisation" type="Boolean">
</property>
<property name="stabilisation" type="int32" max_length="6">
<strictly_positive/>
</property>
<property name="stabilisation_type" type="String">
<specific_values values="h,m,s"/>
</property>
<property name="regulation_temperature" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="sticktemp" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="vacuum" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="wanted_temperature" type="float64" max_length="7">
<property_range min_property="min_temperature" max_property="max_temperature"/>
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="temperature_unit" type="String" max_length="2">
</property>
<property name="sample_temperature" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="max_temperature" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="min_temperature" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="tolerance" type="float64" max_length="6">
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="tolerance_mode" type="String">
</property>
<property name="ramp_speed" type="float64" max_length="6">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="ramp_time" type="float64" max_length="6">
<decimal_format nb_decimal_places="0"/>
</property>
<property name="setpoint_temperature" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="commandStatus" type="int32">
</property>
<property name="ramp_mode" type="String">
</property>
<property name="allow_user_tolerance" type="Boolean">
</property>
<property name="user_tolerance" type="float64" max_length="5">
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="controller_id" type="String" max_length="15">
</property>
<property name="controller_description" type="String" max_length="30">
</property>
</controller>
<plugin>
<controller type="hpstick" role="hpstick1"/>
<property_switcher role="hpstick1" property="ramp_mode" switcher_key="rampModeSwitcher"/>
<property_switcher role="hpstick1" property="use_timeout" switcher_key="timeoutSwitcher"/>
<property_switcher role="hpstick1" property="use_stabilisation" switcher_key="stabilisationSwitcher"/>
<label role="hpstick1" property="controller_id"/>
<label role="hpstick1" property="controller_description"/>
<newLine/>
<group title="hpstick.temperatureTitle">
<text role="hpstick1" property="wanted_temperature" prefix="hpstick.wantedTempPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<newLine/>
<combo role="hpstick1" property="ramp_mode" prefix="hpstick.rampModePrefix" valuesAndLabels="hpstick.noneRamp,hpstick.setpointRamp,hpstick.regulationRamp,hpstick.sampleRamp"/>
<switchable_composite switcher_key="rampModeSwitcher" switch_values="setpoint,regulation,sample">
<text role="hpstick1" property="ramp_speed" prefix="hpstick.deltaPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<text role="hpstick1" property="ramp_time" suffix="hpstick.second"/>
</switchable_composite>
<newLine/>
<check role="hpstick1" property="use_timeout" prefix="hpstick.timeoutPrefix" checkBoxValues="hpstick.timeout"/>
<switchable_composite switcher_key="timeoutSwitcher" switch_values="true">
<text role="hpstick1" property="timeout" spaceBefore="false"/>
<radio role="hpstick1" property="timeout_type" valuesAndLabels="hpstick.h,hpstick.m,hpstick.s" spaceBefore="false"/>
</switchable_composite>
<newLine/>
<check role="hpstick1" property="use_stabilisation" prefix="hpstick.stabilisationPrefix" checkBoxValues="hpstick.stabilisation"/>
<switchable_composite switcher_key="stabilisationSwitcher" switch_values="true">
<text role="hpstick1" property="stabilisation" spaceBefore="false"/>
<radio role="hpstick1" property="stabilisation_type" valuesAndLabels="hpstick.h,hpstick.m,hpstick.s" spaceBefore="false"/>
</switchable_composite>
</group>
<newLine/>
<switchable_composite switcher_key="simpleAdvancedModeSwitcher" switch_values="MORE_OPTIONS_BUTTON"/>
<switchable_composite switcher_key="simpleAdvancedModeSwitcher" switch_values="LESS_OPTIONS_BUTTON">
<group title="hpstick.tempParamTitle">
<text role="hpstick1" property="max_temperature" prefix="hpstick.maxTempPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<text role="hpstick1" property="min_temperature" prefix="hpstick.minTempPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<newLine/>
<text role="hpstick1" property="tolerance" prefix="hpstick.tolerancePrefix"/>
</group>
<newLine/>
</switchable_composite>
<title>
<graphical_switcher switcher_key="simpleAdvancedModeSwitcher" switcher_type="button"/>
</title>
<summary>
<summary_content>
<label role="hpstick1" property="regulation_temperature" prefix="hpstick.regulationTempPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<newLine/>
<label role="hpstick1" property="sample_temperature" prefix="hpstick.sampleTempPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<newLine/>
<label role="hpstick1" property="setpoint_temperature" prefix="hpstick.setPointTempPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<newLine/>
<label role="hpstick1" property="sticktemp" prefix="hpstick.stickTempPrefix"/>
<label role="hpstick1" property="temperature_unit" valuesAndLabels="temperature.celsius,temperature.kelvin" spaceBefore="false"/>
<newLine/>
<label role="hpstick1" property="vacuum" prefix="hpstick.vacuumPrefix"/>
<newLine/>
<status role="hpstick1" property="commandStatus" valuesImagesAndLabels="commandStatusUnknown,commandStatusIdle,commandStatusRunning,commandStatusWarning,commandStatusError"/>
</summary_content>
</summary>
</plugin>
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef HPSTICKCTRLDEF_H
#define HPSTICKCTRLDEF_H
#include "common/base/BaseTypes.h"
namespace hpstickctrl {
// Cryostat regulation temperature - Read only - float -
static const int32 CRYOSTAT_REGULATION_TEMPERATURE_REGISTER = 1;
// CRYOSTAT setpoint - Read/Write - float -
static const int32 CRYOSTAT_SETPOINT_REGISTER = 3;
// stick regulation temperature - Read only - float -
static const int32 STICK_REGULATION_TEMPERATURE_REGISTER = 5;
// vaccum - Read only - float -
static const int32 VACUUM_REGISTER = 7;
// Sample temperature - Read only - float -
static const int32 SAMPLE_TEMPERATURE_REGISTER = 9;
// nomad flag- Read /write - float -
static const int32 NOMAD_FLAG_REGISTER = 11;
// Equipment status - Read/Write - word 16-bit - %MW550
// bit 0 - Idle -> physical parameter between the tolerance range
// bit 1 - Running -> physical parameter out of the tolerance range
// bit 2 - Remote/local -> remote(false)/local(true)
// bit 3 - Fault -> défaut bloquant pour la manip
static const int32 STATUS_REGISTER = 551;
// Tolerance for idle and running status - Read/Write - float 32-bit - %MW552
static const int32 TOLERANCE_REGISTER = 553;
/*!
* Status
*/
static const int32 HPSTICKCTRL_NO_STATUS = 0;
static const int32 HPSTICKCTRL_IDLE_STATUS = 1;
static const int32 HPSTICKCTRL_RUNNING_STATUS = 2;
static const int32 HPSTICKCTRL_REMOTE_LOCAL_STATUS = 4;
static const int32 HPSTICKCTRL_FAULT_STATUS = 8;
}
#endif //HPSTICKCTRLDEF_H
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDef.h>
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDriver.h>
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlState.h>
#include <drivers/ill/sane/hpctickctrl/PerfectHPStickCtrlDriver.h>
#include <drivers/ill/sane/hpctickctrl/RealHPStickCtrlDriver.h>
#include <drivers/ill/sane/hpctickctrl/SimulatedHPStickCtrlDriver.h>
// Trace include
using namespace boost;
namespace hpstickctrl {
const std::string HPStickCtrlDriver::TYPE = "HPStickCtrl";
/*
* Constructor
*/
HPStickCtrlDriver::HPStickCtrlDriver(const std::string& name) :
sampletemperature::SampleTemperatureCommon(name) {
driver::ModBusTCP::init(name);
simulatedLocalMode.init(this, SAVE, "simulated_localmode");
registerStates(new RealHPStickCtrlDriver(this), new PerfectHPStickCtrlDriver(this), new SimulatedHPStickCtrlDriver(this));
// Init functions
registerFunction(NONE_FUNCTION);
deviceType = LEAF_DEVICE_TYPE_DEVICE_CONTAINER;
sampletemperature::SampleTemperatureCommon::typePwr = PERCENT_PWR;
registerSpyCommand(driver::READ_COMMAND, 1);
registerSpyCommand(driver::STATUS_COMMAND, 1);
registerObserverCommand(driver::READ_COMMAND, 100);
registerObserverCommand(driver::STATUS_COMMAND, 100);
}
/*
* Destructor
*/
HPStickCtrlDriver::~HPStickCtrlDriver() {
}
/*
* execute
*/
void HPStickCtrlDriver::execute(const std::string& aCommand) {
if ((aCommand != driver::STOP_COMMAND) && (aCommand != driver::STATUS_COMMAND) && (aCommand != driver::READ_COMMAND)
&& (aCommand != SET_COMMAND)) {
commandProgression = PROGRESSION_UNKNOWNSTATE_DEVICE_CONTAINER;
}
HPStickCtrlState* currentState = dynamic_cast<HPStickCtrlState*>(getCurrentState());
if (aCommand == driver::INIT_COMMAND) {
currentState->init();
} else if (aCommand == driver::READ_COMMAND) {
currentState->read();
// Update average
if (noSampletemp() == true) {
histogramSampleAverage = (histogramSampleAverage() + regulationTemp()) / 2.;
} else {
histogramSampleAverage = (histogramSampleAverage() + sampleTemp()) / 2.;
}
} else if (aCommand == driver::START_COMMAND) {
startActivated = true;
if (noSampletemp() == true) {
m_StartedTemp = regulationTemp();
} else {
m_StartedTemp = sampleTemp();
}
histogramSampleAverage = m_StartedTemp;
currentState->start();
currentState->readStatus();
} else if (aCommand == driver::STOP_COMMAND) {
// Stop command
startActivated = false;
m_RampActivated = false;
currentState->stop();
} else if (aCommand == driver::STATUS_COMMAND) {
// Status command
currentState->readStatus();
} else if (aCommand == driver::READ_INFOS_COMMAND) {
currentState->readInfos();
} else if (aCommand == SampleTemperatureCommon::RAMP_COMMAND) {
m_RampActivated = true;
if (noSampletemp() == true) {
m_StartedTemp = regulationTemp();
} else {
m_StartedTemp = sampleTemp();
}
histogramSampleAverage = m_StartedTemp;
currentState->start();
currentState->readStatus();
} else if (aCommand == SampleTemperatureCommon::CHANGE_TEMP_COMMAND) {
currentState->start();
} else if (aCommand == SET_COMMAND) {
currentState->start();
} else {
//Error bad command
//Todo , normaly it will be detect it device action driver
}
}
/*
* computeSampleTemperatureStatus
*/
void HPStickCtrlDriver::computeSampleTemperatureStatus(int32 value) {
int32 valueout = 0;
if (value & HPSTICKCTRL_FAULT_STATUS) {
valueout |= SampleTemperatureCommon::ALARM;
commandStatus.setRunning();
} else if (value & HPSTICKCTRL_REMOTE_LOCAL_STATUS) {
valueout |= SampleTemperatureCommon::LOCAL;
commandStatus.setWarning();
} else if (value & HPSTICKCTRL_RUNNING_STATUS) {
valueout |= SampleTemperatureCommon::CHANGING;
commandStatus.setRunning();
} else if (value & HPSTICKCTRL_IDLE_STATUS) {
valueout |= SampleTemperatureCommon::IN_TOLERANCE;
commandStatus.setIdle();
}
status = value;
sampletempStatus = valueout;
}
}
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef HPSTICKCTRLDRIVER_H
#define HPSTICKCTRLDRIVER_H
#include "controllers/common/sample_environment/sample_temperature/SampleTemperatureCommon.h"
#include "drivers/global/modbus/ModBusTCP.h"
namespace hpstickctrl {
/*!
* Global Implementation of the lakeshore 336
*/
class HPStickCtrlDriver: public driver::ModBusTCP,
public sampletemperature::SampleTemperatureCommon {
friend class RealHPStickCtrlDriver;
friend class PerfectHPStickCtrlDriver;
friend class SimulatedHPStickCtrlDriver;
public:
//! Driver type value
static const std::string TYPE;
/*!
* \brief Constructor
* \param[in] name the name of the device driver
*/
HPStickCtrlDriver(const std::string& name);
/*!
* \brief Destructor
*/
virtual ~HPStickCtrlDriver();
/*!
* \brief Method called for executing a command
*
* \param[in] command the command to apply on the controller
*/
virtual void execute(const std::string& aCommand);
Property<bool> simulatedLocalMode;
private:
/*!
* \brief compute global voltage status
* \param[in] value the driver status
*/
virtual void computeSampleTemperatureStatus(int32 value);
};
}
#endif //HPSTICKCTRLDRIVER_H
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef HPStickCtrlSTATE_H
#define HPStickCtrlSTATE_H
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDriver.h>
#include <Driver.h>
namespace hpstickctrl {
/*!
* \class HPStickCtrlState
* \brief Virtual class for implement State pattern
*
* Define all methods that perfect, simulated and real classes have to implement
*/
class HPStickCtrlState: public DriverState<HPStickCtrlDriver> {
public:
/*!
* \brief Constructor
* \param[in] owner The device driver main class link
*/
HPStickCtrlState(HPStickCtrlDriver* owner) :
DriverState<HPStickCtrlDriver>(owner) {
}
/*!
* \brief Destructor
*/
virtual ~HPStickCtrlState() {
}
/*!
* \brief Read command implementation
*/
virtual void read() = 0;
/*!
* \brief Start command implementation
*/
virtual void start() = 0;
/*!
* \brief Stop command implementation
*/
virtual void stop() = 0;
/*!
* \brief Read status command implementation
*/
virtual void readStatus() = 0;
/*!
* \brief Read Infos command implementation
*/
virtual void readInfos() = 0;
};
}
#endif //HPStickCtrlSTATE_H
<module name="hpstickctrl">
<driver class="hpstickctrl::HPStickCtrlDriver"/>
</module>
\ No newline at end of file
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDef.h>
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDriver.h>
#include <drivers/ill/sane/hpctickctrl/PerfectHPStickCtrlDriver.h>
namespace hpstickctrl {
/*
* Constructor
*/
PerfectHPStickCtrlDriver::PerfectHPStickCtrlDriver(HPStickCtrlDriver* owner) :
HPStickCtrlState(owner) {
/* Empty */
}
/*
* Destructor
*/
PerfectHPStickCtrlDriver::~PerfectHPStickCtrlDriver() {
/* Empty */
}
void PerfectHPStickCtrlDriver::init() {
}
/*
* read
*/
void PerfectHPStickCtrlDriver::read() {
}
/*
* readInfos
*/
void PerfectHPStickCtrlDriver::readInfos() {
}
/*
* start
*/
void PerfectHPStickCtrlDriver::start() {
float64 setpoint = owner()->wantedTemp();
owner()->setpointTemp = setpoint;
owner()->regulationTemp = setpoint;
owner()->sampleTemp = setpoint;
owner()->temp3 = setpoint;
owner()->temp4 = setpoint;
owner()->vacuum = 12.3;
}
/*
* stop
*/
void PerfectHPStickCtrlDriver::stop() {
}
/*
* readStatus
*/
void PerfectHPStickCtrlDriver::readStatus() {
owner()->startActivated = false;
owner()->computeSampleTemperatureStatus(HPSTICKCTRL_IDLE_STATUS);
m_owner->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
}
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef PERFECTHPSTICKCTRLDRIVER_H
#define PERFECTHPSTICKCTRLDRIVER_H
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlState.h>
namespace hpstickctrl {
/*!
* \class PerfectHPStickCtrlDriver
* \brief Perfect implementation class for the generic rs232 device driver
*
* On start command, all actual values become target's ones.
*/
class PerfectHPStickCtrlDriver: public HPStickCtrlState {
public:
/*!
* \brief Constructor
* \param[in] owner The device driver main class link
*/
PerfectHPStickCtrlDriver(HPStickCtrlDriver* owner);
/*!
* \brief Destructor
*/
virtual ~PerfectHPStickCtrlDriver();
/*!
* \brief Init command implementation
*/
virtual void init();
/*!
* \brief Read command implementation
*/
virtual void read();
/*!
* \brief Start command implementation
*/
virtual void start();
/*!
* \brief Stop command implementation
*/
virtual void stop();
/*!
* \brief Read status command implementation
*/
virtual void readStatus();
/*!
* \brief Read Infos command implementation
*/
virtual void readInfos();
};
}
#endif //PERFECTHPSTICKCTRLDRIVER_H
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDef.h>
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDriver.h>
#include <drivers/ill/sane/hpctickctrl/RealHPStickCtrlDriver.h>
#include "controllers/common/sample_environment/sample_temperature/SampleTemperatureCommon.h"
namespace hpstickctrl {
using namespace boost;
using namespace std;
/*
* Constructor
*/
RealHPStickCtrlDriver::RealHPStickCtrlDriver(HPStickCtrlDriver* owner) :
HPStickCtrlState(owner) {
m_IsStopped = false;
}
/*
* Destructor
*/
RealHPStickCtrlDriver::~RealHPStickCtrlDriver() {
}
/*
* init
*/
void RealHPStickCtrlDriver::init() {
owner()->openModBus(owner()->leafChannel());
owner()->writeSingleRegister(NOMAD_FLAG_REGISTER, 1);
read();
readStatus();
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
/*
* readInfos
*/
void RealHPStickCtrlDriver::readInfos() {
}
/*
* read
*/
void RealHPStickCtrlDriver::read() {
owner()->setpointTemp.update(owner()->readFloat32HoldingRegister(CRYOSTAT_SETPOINT_REGISTER));
owner()->sampleTemp.update(owner()->readFloat32HoldingRegister(SAMPLE_TEMPERATURE_REGISTER));
owner()->regulationTemp.update(owner()->readFloat32HoldingRegister(CRYOSTAT_REGULATION_TEMPERATURE_REGISTER));
owner()->temp3.update(owner()->readFloat32HoldingRegister(STICK_REGULATION_TEMPERATURE_REGISTER));
owner()->vacuum.update(owner()->readFloat32HoldingRegister(VACUUM_REGISTER));
}
/*
* start
*/
void RealHPStickCtrlDriver::start() {
float32 val32 = static_cast<float32>(owner()->tolerance());
owner()->writeMultipleRegister(TOLERANCE_REGISTER, val32);
val32 = static_cast<float32>(owner()->wantedTemp());
owner()->writeMultipleRegister(CRYOSTAT_SETPOINT_REGISTER, val32);
}
/*
* stop
*/
void RealHPStickCtrlDriver::stop() {
owner()->startActivated = false;
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
/*
* readStatus
*/
void RealHPStickCtrlDriver::readStatus() {
int16 status = owner()->readHoldingRegister(STATUS_REGISTER);
// Getting and testing status
if (owner()->startActivated() == true) {
if (status & HPSTICKCTRL_IDLE_STATUS) {
owner()->startActivated = false;
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
} else {
owner()->SampleTemperatureCommon::calculateProgression();
}
} else if (owner()->m_RampActivated == true) {
owner()->SampleTemperatureCommon::calculateProgression();
} else {
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
owner()->computeSampleTemperatureStatus(status);
}
}
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef REALHPSTICKCTRLDRIVER_H
#define REALHPSTICKCTRLDRIVER_H
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlState.h>
namespace hpstickctrl {
/*!
* Real Implementation part of the device called HPStickCtrl.
*/
class RealHPStickCtrlDriver: public HPStickCtrlState {
public:
/*!
* \brief Constructor
* \param[in] owner The device driver main class link
*/
RealHPStickCtrlDriver(HPStickCtrlDriver* owner);
/*!
* \brief Destructor
*/
virtual ~RealHPStickCtrlDriver();
/*!
* \brief Init command implementation
*/
virtual void init();
/*!
* \brief Read command implementation
*/
virtual void read();
/*!
* \brief Start command implementation
*/
virtual void start();
/*!
* \brief Stop command implementation
*/
virtual void stop();
/*!
* \brief Read status command implementation
*/
virtual void readStatus();
/*!
* \brief Read Infos command implementation
*/
virtual void readInfos();
private:
/**
* Reset Mode for the doppler
*/
bool m_IsStopped;
};
}
#endif //REALHPSTICKCTRLDRIVER_H
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDef.h>
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlDriver.h>
#include <drivers/ill/sane/hpctickctrl/SimulatedHPStickCtrlDriver.h>
#include "controllers/common/sample_environment/sample_temperature/SampleTemperatureCommon.h"
namespace hpstickctrl {
/*
* Constructor
*/
SimulatedHPStickCtrlDriver::SimulatedHPStickCtrlDriver(HPStickCtrlDriver* owner) :
HPStickCtrlState(owner), m_regulation(50.0), m_sample(50.0), m_SetTemp(false) {
m_vacuum = 0;
}
/*
* Destructor
*/
SimulatedHPStickCtrlDriver::~SimulatedHPStickCtrlDriver() {
/* Empty */
}
/*
* init
*/
void SimulatedHPStickCtrlDriver::init() {
read();
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
/*
* readStatus
*/
void SimulatedHPStickCtrlDriver::readStatus() {
if (owner()->startActivated() == true) {
float64 wanted = 0;
wanted = owner()->wantedTemp();
float64 val;
int32 sign;
// Regulation
if ((wanted - m_regulation) >= 0)
sign = 1;
else
sign = -1;
val = m_regulation + sign * difftime(time(0), m_lastTime) / 5.0 * 2.;
if (sign >= 0) {
if (val > wanted)
val = wanted;
} else {
if (val < wanted)
val = wanted;
}
m_regulation = val;
// Sample
if ((wanted - m_sample) >= 0)
sign = 1;
else
sign = -1;
val = m_sample + sign * difftime(time(0), m_lastTime) / 6.0 * 2.;
if (sign >= 0) {
if (val > wanted)
val = wanted;
} else {
if (val < wanted)
val = wanted;
}
m_sample = val;
m_vacuum = m_vacuum + 0.5;
if (m_vacuum > 100) {
m_vacuum = 0;
}
owner()->regulationTemp = m_regulation;
owner()->sampleTemp = m_sample;
owner()->temp3 = m_sample;
owner()->temp4 = m_sample;
owner()->vacuum = m_vacuum;
owner()->SampleTemperatureCommon::calculateProgression();
if (owner()->toleranceMode() == sampletemperature::SampleTemperatureCommon::SAMPLETOL_MODE) {
if (m_sample == wanted) {
owner()->startActivated = false;
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
} else {
if (m_regulation == wanted) {
owner()->startActivated = false;
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
}
} else {
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
// Set status
int32 status = 0;
// Test tolerance
if (owner()->toleranceMode() == sampletemperature::SampleTemperatureCommon::SAMPLETOL_MODE) {
float64 delta = owner()->wantedTemp() - owner()->sampleTemp();
if (fabs(delta) <= owner()->tolerance()) {
status |= HPSTICKCTRL_IDLE_STATUS;
}
} else {
float64 delta = owner()->wantedTemp() - owner()->regulationTemp();
if (fabs(delta) <= owner()->tolerance()) {
status |= HPSTICKCTRL_IDLE_STATUS;
}
}
if (owner()->startActivated() == true) {
status |= HPSTICKCTRL_RUNNING_STATUS;
}
if (owner()->simulatedLocalMode() == true) {
status |= HPSTICKCTRL_REMOTE_LOCAL_STATUS;
}
owner()->computeSampleTemperatureStatus(status);
}
/*
* stop
*/
void SimulatedHPStickCtrlDriver::stop() {
owner()->commandProgression = PROGRESSION_END_DEVICE_CONTAINER;
}
/*
* readInfos
*/
void SimulatedHPStickCtrlDriver::readInfos() {
}
/*
* read
*/
void SimulatedHPStickCtrlDriver::read() {
if (m_SetTemp == true) {
float64 wanted = 0;
wanted = owner()->wantedTemp();
float64 val;
int32 sign;
// Regulation
if ((wanted - m_regulation) >= 0)
sign = 1;
else
sign = -1;
val = m_regulation + sign * difftime(time(0), m_lastTime) / 5.0 * 2.;
if (sign >= 0) {
if (val > wanted)
val = wanted;
} else {
if (val < wanted)
val = wanted;
}
m_regulation = val;
// Sample
if ((wanted - m_sample) >= 0)
sign = 1;
else
sign = -1;
val = m_sample + sign * difftime(time(0), m_lastTime) / 6.0 * 2.;
if (sign >= 0) {
if (val > wanted)
val = wanted;
} else {
if (val < wanted)
val = wanted;
}
m_sample = val;
owner()->regulationTemp = m_regulation;
owner()->sampleTemp = m_sample;
}
}
/*
* start
*/
void SimulatedHPStickCtrlDriver::start() {
if (owner()->startActivated() == true) {
m_SetTemp = false;
} else {
m_SetTemp = true;
}
owner()->setpointTemp = owner()->wantedTemp();
m_lastTime = time(0);
}
}
/*
* Nomad Instrument Control Software
*
* Copyright 2011 Institut Laue-Langevin
*
* Licensed under the EUPL, Version 1.1 only (the "License");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://joinup.ec.europa.eu/software/page/eupl
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*/
#ifndef SIMULATEDHPSTICKCTRLDRIVER_H
#define SIMULATEDHPSTICKCTRLDRIVER_H
#include <drivers/ill/sane/hpctickctrl/HPStickCtrlState.h>
namespace hpstickctrl {
/*!
* Simulated implementation of the HPStickCtrl.
*/
class SimulatedHPStickCtrlDriver: public HPStickCtrlState {
public:
/*!
* \brief Constructor
* \param[in] owner The device driver main class link
*/
SimulatedHPStickCtrlDriver(HPStickCtrlDriver* owner);
/*!
* \brief Destructor
*/
virtual ~SimulatedHPStickCtrlDriver();
/*!
* \brief Init command implementation
*/
virtual void init();
/*!
* \brief Read command implementation
*/
virtual void read();
/*!
* \brief Start command implementation
*/
virtual void start();
/*!
* \brief Stop command implementation
*/
virtual void stop();
/*!
* \brief Read status command implementation
*/
virtual void readStatus();
/*!
* \brief Read Infos command implementation
*/
virtual void readInfos();
private:
/**
* Last sample reading time
*/
time_t m_lastTime;
float64 m_regulation;
float64 m_sample;
float64 m_vacuum;
bool m_SetTemp;
};
}
#endif //SIMULATEDHPSTICKCTRLDRIVER_H
#Group Temperature
HPStickCtrl.setPointPrefix=Cryostat SetPoint
HPStickCtrl.regulationPrefix=Cryostat Regulation
HPStickCtrl.samplePrefix=Sample
HPStickCtrl.temp3Prefix=Stick Regulation
HPStickCtrl.vacuumPrefix=Vacuum
HPStickCtrl.wanted=Wanted
HPStickCtrl.purcent=%
HPStickCtrl.mbar=mbar
HPStickCtrl.status=Status
HPStickCtrl.idleValue=1
HPStickCtrl.idleLabel=Idle
HPStickCtrl.idleImage=FINISHED_STATUS
HPStickCtrl.runningValue=2
HPStickCtrl.runningLabel=Running
HPStickCtrl.runningImage=RUNNING_STATUS
HPStickCtrl.localValue=4
HPStickCtrl.localLabel=Local Mode
HPStickCtrl.localImage=WARNING_STATUS
HPStickCtrl.faultValue=8
HPStickCtrl.faultLabel=Fault
HPStickCtrl.faultImage=ALARM_STATUS
HPStickCtrl.tolerancePrefix=Tolerance
HPStickCtrl.tolModePrefix=on
HPStickCtrl.noSampleTempPrefix=No sample temperature
#Group Limits
HPStickCtrl.maxTempPrefix=High
HPStickCtrl.maxTempSuffix=K
HPStickCtrl.minTempPrefix=Low
HPStickCtrl.minTempSuffix=K
HPStickCtrl.ipGroup=Ip parameters
HPStickCtrl.ipaddressPrefix=IP Address
HPStickCtrl.portPrefix=Port
HPStickCtrl.simulated_localmodePrefix=Simulated Local Mode
HPStickCtrl.simulated_localmodeCheckedValue=true
HPStickCtrl.simulated_localmodeUncheckedValue=false
\ No newline at end of file
<controller_plugin_config type="HPStickCtrl">
<image key="HARDWARE_THERMOMETER"/>
<settings view="HPStickCtrlView.xml"/>
</controller_plugin_config>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<controller type="HPStickCtrl">
<property name="ipaddress" type="String" max_length="15">
</property>
<property name="port" type="String" max_length="5">
</property>
<property name="tolerance_mode" type="String">
</property>
<property name="temp_unit" type="String" max_length="1">
</property>
<property name="wanted_temp" type="float64" max_length="7">
<property_range min_property="min_temp" max_property="max_temp"/>
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="setpoint_temp" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="regulation_temp" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="sample_temp" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="temp3" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
</property>
<property name="vacuum" type="float64" max_length="6">
<decimal_format nb_decimal_places="2"/>
</property>
<property name="max_temp" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="min_temp" type="float64" max_length="7">
<decimal_format nb_decimal_places="3"/>
<positive/>
</property>
<property name="tolerance" type="float64" max_length="5">
</property>
<property name="simulated_localmode" type="boolean">
</property>
<property name="status" type="int32">
</property>
</controller>
<plugin>
<controller type="HPStickCtrl" role="HPStickCtrl1"/>
<property_switcher role="HPStickCtrl1" property="state" switcher_key="HPStickCtrl.state"/>
<text role="HPStickCtrl1" property="tolerance" prefix="HPStickCtrl.tolerancePrefix"/>
<label role="HPStickCtrl1" property="temp_unit"/>
<label role="HPStickCtrl1" property="tolerance_mode" prefix="HPStickCtrl.tolModePrefix"/>
<newLine/>
<text role="HPStickCtrl1" property="min_temp" prefix="HPStickCtrl.minTempPrefix"/>