Files
frappy/doc/source/structure.rst
Markus Zolliker da15df076a fetched mlz version
- before some chamges in the gerrit pipline

Change-Id: I33eb2d75f83345a7039d0fb709e66defefb1c3e0
2023-05-02 15:25:11 +02:00

3.4 KiB

Structure

Node Structure

Before starting to write the code for drivers, you have to think about the node structure. What are the modules I want to create? What is to be represented as a SECoP module, what as a parameter? At this point you should not look what the hardware offers (e.g. channels A and B of a temperature controller), but on what you need for doing an experiment. Typically, each quantity you measure or control, has to be represented by a module. You need module parameters for influencing how you achieve or control the quantity. And you will need configurable internal properties to configure the access to the hardware.

Examples:

  • A temperature sensor, without an attached control loop, should inherit from Readable <frappy.modules.Readable>
  • A temperature sensor with a control loop should inherit from Drivable <frappy.modules.Drivable>. You will need to implement a criterion for deciding when the temperature is reached (e.g. tolerance and time window)
  • If the heater power is a quantity of interest, it should be its own module inheriting from Writable <frappy.modules.Writable>.
  • If it is a helium cryostat, you may want to implement a helium level reading module inheriting from Readable <frappy.modules.Readable>

Module Structure: Parameters

The next step is to determine which parameters we need in addition to the standard ones given by the inherited class. As a temperature sensor inherits from Readable <frappy.modules.Readable>, it has already a value parameter representing the measured temperature. It has also a status parameter, indicating whether the measured temperature is valid (IDLE), invalid (ERROR) or there might be a less critical issue (WARN). In addition you might want additional parameters, like an alarm threshold.

For the controlled temperature, in addition to above, inherited from Drivable <frappy.modules.Drivable> it has a writable target parameter. In addition we might need control parameters or a changeable target limits.

For the heater you might want to have a changeable power limit or power range.

Module Structure: Properties

For the access to the hardware, we will need internal properties for configuring the hardware access. This might the IP address of a LAN connection or the path of an internal serial device. In Frappy, when inheriting from the mixin HasIO <frappy.io.HasIO>, either the property io referring to an explicitly configured communicator or the uri property, generating a communicator with the given uri can be used for this.

In addition, depending on the hardware probably you need a property to configure the channel number or name assigned to the module.

For the heater output, you might need to configure the heater resistance.

Parameter Structure

A parameter also has properties, which have to be set when declaring the parameter. Even for the inherited parameters, often the properties have to be overriden. For example, the unit property of the value parameter on the temperature sensor will be set to 'K', and the max property of the target parameter should be set to the maximum possible value for the hardware. This value may then probably get more restricted by an entry in the configuration file.