You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 10 Next »

Overview

Acronyms

Term

Description

ATCA

Advanced Telecommunications Computing Architecture

CPU

Central Processing Unit

EPICS

Experimental Physics and Industrial Control System

FPGA

Field Programmable Gate Array

IOC

Input Output Controller

RF

Radio Frequency

SHM

Shelf Manager

VCO

Voltage Controlled Oscillator

Linac Locking System-Level Description

A high-level description of the linac locking system is captured in the page linked below:

Linac Locking - A System Level Overview

IOC Description


Firmware Description


IOC Deployment

In this section, IOC deployment details are provided pertaining to the App hosting the phase locker IOC, as well as the IOC name and the assigned CPUs in both Dev and Production. 

IOC Repository

The IOC is housed by the masterSource App.  The intended released tag in Production is R2.2.3.

IOC App Name

App Version

masterSourceR2.2.3

Deployment In Production

The configuration used in Production is seen below.

IOC Name

CPU Name

sioc-sys0-ms09cpu-sys0-sp01

Deployment In Dev

The configuration used in Dev is seen below.  As of now, there is no designated test stand in Dev.

IOC Name

CPU Name (Intended)

sioc-b084-ms09cpu-b084-sp12

IOC Packages

List of required packages and associated versions.

Package Name

Package Version

cpsw/framework

R4.4.1

yaml-cpp

yaml-cpp-0.5.3_boost-1.64.0

boost

1.64.0

pcre

8.37

mrllrf/llrfLib

R1.1.0

timing/hpsTpr

R2.3.0

atca/commonATCA

R1.3.1

IOC Modules

List of required modules and associated versions.

Module Name

Module Version

Module Name

Module Version

ATCACommon

R7.0.3.1-1.0

agilent53220A

R1.0.6

asyn

R4.39-1.0.1

autosave

R5.10-1.1.0

bkhAsyn

R0.4.6

caPutLog

R4.0-1.0.0

iocAdmin

R3.1.16-1.3.2

miscUtils

R2.2.5

modbus

R3.2-1.0.1

seq

R2.2.4-1.2

std

R3.2-1.0.5

streamdevice

R2.8.9-1.2.1

timingApi

R0.9

tprTrigger

R2.5.3-4.0-2

yamlLoader

R2.3.5

ycpswasyn

R3.3.6-1.0

IOC Bootup

In this section, a detailed description of the IOC bootup process is laid out.

Generic variable definition

First, define the usual environment variables in the startup script.

# ===========================================
#            ENVIRONMENT VARIABLES
# ===========================================
epicsEnvSet("AREA",          "SYS0"                              )   
epicsEnvSet("UNIT",          "MS09"                              )   
epicsEnvSet("LOCATION",      ""                                  )   
epicsEnvSet("IOC_PV",        "SIOC:$(AREA):$(UNIT)"              )   
epicsEnvSet("TPR_PV",        "TPR:$(AREA):$(UNIT)"               )   
epicsEnvSet("IOC",           "sioc-sys0-ms09"                    )   
epicsEnvSet("HASH",          "58070ee"                           )   
epicsEnvSet("YAML_DIR",      "${TOP}/yaml/EvrCardG2-$(HASH).yaml")
epicsEnvSet("YAML_TOP_FILE", "${YAML_DIR}/000TopLevel.yaml"      )   

# Support Large Arrays/Waveforms; Number in Bytes
epicsEnvSet("EPICS_CA_MAX_ARRAY_BYTES", "2000000")

Common setup

Load dbd and IOC health/monitoring records.  Also, set up autosave and load the LCLS access configuration file.  Finally, copy the archive file in $IOC_DATA to enable record archiving.

## Load dbd
dbLoadDatabase("dbd/masterSource.dbd", 0, 0)
masterSource_registerRecordDeviceDriver(pdbbase)

## Environment variables
epicsEnvSet("ENGINEER", "")
epicsEnvSet("STREAM_PROTOCOL_PATH", "${TOP}/db")
## Tag log messages with IOC name
epicsEnvSet("EPICS_IOC_LOG_CLIENT_INET", "${IOC}")

## Load records
# **** Load iocAdmin databases to support IOC Health and monitoring ****
dbLoadRecords("db/iocAdminSoft.db", "IOC=${IOC_NAME}")
dbLoadRecords("db/iocAdminScanMon.db", "IOC=${IOC_NAME}")
dbLoadRecords("db/iocRelease.db", "IOC=${IOC_NAME}")

## Autosave initialization
< $(TOP)/iocBoot/common/autosave_init.cmd

## Channel Access Security:
# This is required if you use caPutLog.
# Set access security file
# Load common LCLS Access Configuration File
< ${ACF_INIT}

## Update archive pv list in ${IOC_DATA}
system("cp $(TOP)/archive/${IOC}.archive ${IOC_DATA}/${IOC}/archive/")

Autosave initialization

Tell the IOC where to find the list of record names and where they will be autosaved.  Also, restore previously autosaved values.

# =====================================================================
# Load database for autosave status
# =====================================================================
dbLoadRecords("db/save_restoreStatus.db", "P=${IOC_NAME}:")

# ============================================================
# If all PVs don't connect continue anyway
# ============================================================
save_restoreSet_IncompleteSetsOk(1)

# ============================================================
# created save/restore backup files with date string
# useful for recovery.
# ============================================================
save_restoreSet_DatedBackupFiles(1)

# ============================================================
# Where to find the list of PVs to save
# ============================================================
set_requestfile_path("${IOC_DATA}/${IOC}/autosave-req")

# ============================================================
# Where to write the save files that will be used to restore
# ============================================================
set_savefile_path("${IOC_DATA}/${IOC}/autosave")

# ============================================================
# Prefix that is use to update save/restore status database
# records
# ============================================================
save_restoreSet_status_prefix("${IOC_NAME}:")

## Restore datasets
set_pass0_restoreFile("info_positions.sav")
set_pass1_restoreFile("info_positions.sav")

set_pass0_restoreFile("info_settings.sav")
set_pass1_restoreFile("info_settings.sav")


Besides the auto-generated record names for autosave, copy the manually generated list of records to be autosaved and restore their previously autosaved values.

# Copy over the manual settings request file
system("cp $(TOP)/autosave/${IOC}.req ${IOC_DATA}/${IOC}/autosave-req/")

# Load manual settings from autosave
set_pass0_restoreFile("${IOC}.sav")
set_pass1_restoreFile("${IOC}.sav")

Yaml initialization

Load the YAML hierarchy and register configuration.

# Use slot A pcie tpr for root_0, override to use slot_a
cpswLoadYamlFile("${YAML_TOP_FILE}", "MemDev", "", "/dev/tpra", "root_0")

Database loading

Load the phase locker records.

# ===========================================
#               DB LOADING
# ===========================================
# TPR driver DB
dbLoadRecords("db/pcie_tprTrig.db",     "DEV=${IOC_PV}:0,LOCA=$(AREA),IOC_UNIT=$(UNIT),INST=0,PORT=trig0")

# Load database for autosave status
dbLoadRecords("db/save_restoreStatus.db", "P=${IOC_PV}:")

Asyn driver configuration

Create the ycpswAsynDriver with a dictionary option, i.e. use a limited number of interfaces to the FPGA registers.

# ===========================================
#              DRIVER SETUP
# ===========================================
# Configure crossbarControlAsynDriver
crossbarControlAsynDriverConfigure("crossbar0", "PCIe:/mmio/SfpXbar", "root_0")

# Setup tprTrigger Driver
tprTriggerAsynDriverConfigure("trig0", "PCIe:/mmio", "root_0")

Archiver list

A complete list of the records to archive is provided below.
(base) skoufis@aird-b50-srv01  (master) $ cat archive/sioc-sys0-ms09.archive 
# archive_iocAdmin Archive template
# Format:
# <PVNAME> <PERIOD> [ monitor ]

# Archive these values only when they change
SIOC:SYS0:MS09:APP_DIR 30 monitor 
SIOC:SYS0:MS09:APP_DIR1 30 monitor 
SIOC:SYS0:MS09:APP_DIR2 30 monitor 
SIOC:SYS0:MS09:CA_CLNT_CNT 1 monitor 
SIOC:SYS0:MS09:CA_CONN_CNT 1 monitor 
SIOC:SYS0:MS09:EPICS_VERS 30 monitor
SIOC:SYS0:MS09:FD_CNT 1 monitor 
SIOC:SYS0:MS09:FD_FREE 1 monitor 
SIOC:SYS0:MS09:FD_MAX 1 monitor 
SIOC:SYS0:MS09:HOSTNAME 30 monitor
SIOC:SYS0:MS09:KERNEL_VERS 30 monitor
SIOC:SYS0:MS09:RECORD_CNT 10 monitor
SIOC:SYS0:MS09:START_CNT 30 monitor
SIOC:SYS0:MS09:STARTTOD 30 monitor
SIOC:SYS0:MS09:ST_SCRIPT 30 monitor 
SIOC:SYS0:MS09:ST_SCRIPT1 30 monitor 
SIOC:SYS0:MS09:ST_SCRIPT2 30 monitor 
SIOC:SYS0:MS09:SUSP_TASK_CNT 30 monitor 
SIOC:SYS0:MS09:SYSRESET 30 monitor 

# Archive these values at the specified rate
SIOC:SYS0:MS09:SYS_CPU_LOAD 10
SIOC:SYS0:MS09:LOAD 10 
SIOC:SYS0:MS09:MEM_BLK_FREE 10 
SIOC:SYS0:MS09:MEM_FREE 10 
SIOC:SYS0:MS09:MEM_USED 10 
SIOC:SYS0:MS09:UPTIME 3600 

IOC initialization

Initialize the IOC and logging capability.

# ===========================================
#               IOC INIT
# ===========================================
iocInit()

# ===========================================
#               CAPUTLOG
# ===========================================
# Turn on caPutLogging:
# Log values only on change to the iocLogServer:
caPutLogInit("${EPICS_CA_PUT_LOG_ADDR}")
caPutLogShow(2)

Autosave start

Start the autosave process. 

# ===========================================
#              AUTOSAVE START 
# ===========================================
# Autosave start
< $(TOP)/iocBoot/common/autosave_start.cmd
create_monitor_set("${IOC}.req", 5, "")

EPICS Records

For a complete list of the Resynch Trigger IOC Process Variables (PVs), please check out the corresponding database file (i.e. pcie_tprTrig.db) in directory db/ of the masterSource project.


(base) skoufis@aird-b50-srv01  (master) $ cat db/pcie_tprTrig.db
record(longin, "TPR:$(LOCA):$(IOC_UNIT):$(INST):FPGAVER")
{
    field(DESC, "TimingCore FPGA version")
    field(DTYP, "asynInt32")
    field(INP,  "@asyn($(PORT),0) fpgaVersion")
    field(SCAN, "I/O Intr")
}
record(longin, "TPR:$(LOCA):$(IOC_UNIT):$(INST):UPTIME")
{
    field(DESC, "TimingCore Uptime")
    field(DTYP, "asynInt32")
    field(INP,  "@asyn($(PORT),0) uptime")
    field(SCAN, "I/O Intr")
}
...
record(bo, "TPR:$(LOCA):$(IOC_UNIT):$(INST):EVSOFT07_TCTL")
{
    field(DESC, "Soft Event 07 Enable/Disable")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn($(PORT),0) softEvEnable_07")
    field(OMSL, "supervisory")
    field(ZNAM, "Disabled")
    field(ONAM, "Enabled")
    field(PINI, "YES")
    info(autosaveFields, "VAL")
}
record(longout, "TPR:$(LOCA):$(IOC_UNIT):$(INST):EVSOFT07") {
   field(DESC, "Soft Event 07")
   field(DTYP, "asynInt32")
   field(OUT,  "@asyn($(PORT),0) softEv_07")
   field(OMSL, "supervisory")
   field(PINI, "YES")
   info(autosaveFields, "VAL")
}

Displays

To set the triggers and corresponding channels in Production, follow the instructions below.



[softegr@lcls-srv01 skoufis]$ cd $EPICS_IOCS/sioc-sys0-ms09/iocSpecificRelease/masterSourceApp/srcDisplay/
[softegr@lcls-srv01 srcDisplay]$ ./sioc-sys0-ms09_gui.sh


This should launch the main display, from which we can invoke the needed channel and trigger screens for setup.  See an example of those scenes below.


Production

To access and launch the display in Production, follow the steps outlined below. 

Deliverables

The released software will be made available in the main IOC release area post-deployment (Dev: /afs/slac/g/lcls/epics/iocTop/masterSource/, Production:/usr/local/lcls/epics/iocTop/masterSource/).  See below for the specific repositories and tags.

Software Release

See software release details below.

Repository

Version

IOC Name

masterSourceR2.2.3sioc-sys0-ms09

Firmware Release

See firmware release details below.

Repository

Version



References 


  • No labels