Skip to content

IOC Finishing Touches

Alexandru Dascalu edited this page Apr 3, 2020 · 55 revisions

Wiki > The Backend System > IOCs > IOC Finishing Touches

This page documents the finishing touches to make to your IOC to make it function within the IBEX environment.

1. Interesting PVs

To have a PV appear in the interest list in IBEX Configurations add the following to the PV record:

info(INTEREST, "<LEVEL>")

where the level is HIGH, MEDIUM, LOW.

For records that are of no "interest" do not add an interest info field. For example, intermediate CALC records, SIM records etc.

Any calc record which is interesting needs field(ASG, "READONLY") added so it cannot be set by accident.

2. Archive PVs

To have a PV automatically archived add the following to the PV record

info(archive, "VAL")

This will archive the value of the VAL field once per second. The general form is

info(archive, "<period> <field>")

Where

* period (defaults to 1):
    * when +ve - sign up to monitor the pv use the period field to determine a typical delay between samples in seconds 
    * when -ve - monitor the value the value is the deadband for the system
* field: the field to monitor on the record

3. Alarm PVs

If you want a PV to appear in the alarm view (and there should be at least one per IOC so that it can show disconnected) then add:

info(alarm, "<name of IOC (not including _0X)>")

4. Autosave PVs

PVs can be autosaved so that they save their values and are reloaded when the IOC starts. The value is set before the record is initialised so is only processed using this value if PINI is Yes; although waveform records do this differently and will process the record. To do this mark the field with the following info line:

info(autosaveFields, "VAL")

The second argument is the field which is autosaved within the record.

5. PVs Have Essential Fields

All PVs should have if appropriate:

  • Description (DESC field)
  • Unit fields if representing a value (EGU field) which may be blank
    • Units must be in ...
  • Precision (PREC) for records with floating point numbers - is this set correctly for what a user/technician requires

6. Compliance with DBUnitChecker

The build in Jenkins will fail if the rules of the DBUnitChecker script are not satisfied. You might as well check them beforehand to save yourself time later. From an epics terminal:

cd C:\Instrument\Apps\EPICS\ISIS\DbUnitChecker\master
python run_tests.py -i <directory to check>

To check it will not fail the build.

7. Macros and Details

Macros where possible should follow the standard names. If a macro can be set as part of the IOC (and can be reasonably set in the GUI) then a config file should be added to the run directory which contains a list of macros (i.e. ..\EPICS\ioc\master\<IOC Name>\iocBoot\<IOC Instance Name>\config.xml). The file is of the form:

<?xml version="1.0" ?>
<ioc_config xmlns:xi="http://www.w3.org/2001/XInclude">
<config_part>
<ioc_desc>Eurotherm temperature controller</ioc_desc>
<macros>
  <macro name="PORT" pattern="^COM[0-9]+$" description="Serial COM Port" hasDefault="NO" />
  <macro name="BAUD" pattern="^[0-9]+$" description="Serial communication baud rate, defaults to 9600." defaultValue="9600" hasDefault="YES" />
  <macro name="BITS" pattern="^[0-9]$" description="Serial communication number of bits, defaults to 7." defaultValue="7" hasDefault="YES" />
  <macro name="PARITY" pattern="^(even)|(odd)|(none)$" description="Serial communication parity, defaults to even." defaultValue="even" hasDefault="YES" />
  <macro name="STOP" pattern="^[0-9]$" description="Serial communication stop bit, defaults to 1." defaultValue="1" hasDefault="YES" />

  <macro name="ADDR_1" pattern="^[0-9]{1,2}$" description="Address for the 1st Eurotherm on this port e.g. 01. Blank for do not use." hasDefault="UNKNOWN" />

  <macro name="LOCAL_CALIB" pattern="^(yes)|(no)$" description="Use local instrument calibration directory instead of common one? Default is no." defaultValue="no" hasDefault="YES" />
</macros>
</config_part>
</ioc_config>

where

  • ioc_desc is a short description of the IOC e.g Lakeshore 218 for LKSH218. This field is shown alongside the IOC name in the GUI when adding or editing IOCs.
  • ioc_details is more details about the IOC, e.g. link to docs.
  • macro describes a macro settable by a user.
    • containing name, is the name of the macro;
    • pattern, the regex for the macro's value; Useful regex for macros:
      • ^-?[0-9]+\.?[0-9]*$: float with sign
      • ^[0-9]+\.?[0-9]*$: float no sign
      • ^[0-9]+$: integer no sign
    • description, a plain text description which is shown to the user.
    • defaultValue, the default value of the macro, if it exists (this attribute is not required)
    • hasDefault, if the macro has a default, either "YES", "NO", or "UNKNOWN"

config.xml support include so if you have several iocs with the same set of macros you don't need to repeat the file contents. Example GALIL02 (see below) uses GALIL01's config:

<?xml version="1.0" ?>
<ioc_config xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="../iocGALIL-IOC-01/config.xml"  />
</ioc_config>

Either a full make of the server or running make iocstartups from the EPICS folder will then make the contents of these XML files available to the GUI (after restarting the instrument).

Tips

  • If you want a macro that restricts input to be a byte, so 0-255, then you can use ^$|^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ . You can change this so it allows any range of integers of you desire. This website is a good resource for checking regexes.

8. PV Limits

If a limit on a set point is well defined (i.e., given by a device manual) then the fields DRVH "Drive High" and DRVL "Drive Low" should be used to constrain the PV set point. The behaviour of these fields is that if a limit is 10.0 and a user inputs 11.0, then the PV will constrain the input to 10.0 and process that value. Records that use limits should also be robustly tested to ensure the behave as expected. An example test:

    @parameterized.expand([
        ("lt_low_limit", CURR_LOW_LIMIT-1, "low_limit", CURR_LOW_LIMIT),
        ("gt_high_limit", CURR_HIGH_LIMIT+1, "high_limit", CURR_HIGH_LIMIT)])
    @skip_if_recsim("Behaviour cannot be simulated in Recsim")
    def test_WHEN_voltage_setpoint_is_set_outside_max_limits_THEN_setpoint_within(self, case, case_value, limit, limit_value):
        self.ca.set_pv_value("CURRENT:SP", case_value)
        self.ca.assert_that_pv_is("CURRENT:SP", limit_value)

9. Directories added to Makefiles

Type

make checkdirs

at EPICS top level and make sure it completes ok

10. Add IOC to EPICS hardware list

Once the IOC is reviewed and tested with hardware, add it to the EPICS hardware list

Clone this wiki locally