draft of extra sanity checking when placing a beamstop
Test And Build / Build (push) Successful in 4s

This commit is contained in:
2026-04-23 17:33:23 +02:00
parent 5ceec94f96
commit a5dbfb7805
10 changed files with 314 additions and 12 deletions
+35
View File
@@ -0,0 +1,35 @@
# s7plcFWConfigure(
# # Alias,
# # IP,
# # fetchPort,fetchOrg,fetchDb,fetchOffsetInDb,fetchSizeOfDb,
# # writePort,writeOrg,writeDb,writeOffsetInDb,writeSizeOfDb,
# # 0 == big endian, 1 == little endian,
# # receive timeout,
# # receive delay,
# # out IO Interrupt Delay (if 0 then only reacts on a change)
# )
epicsEnvSet("SPS_REGISTER_NAME", "SPS-SHUTTER")
epicsEnvSet("SPS_FETCH_SIZE", "154")
# Seems that 1 doesn't work
epicsEnvSet("SPS_WRITE_SIZE", "2")
$(SET_SIM_MODE=#) $(SET_SIM_MODE) require misc
$(SET_SIM_MODE=#) $(SET_SIM_MODE) epicsEnvSet("SPS_IP", "127.0.0.1")
$(SET_SIM_MODE=#) $(SET_SIM_MODE) system "$(sinqSPS_DIR)shutter_sim.py $(FETCH_PORT=2000) $(WRITE_PORT=2001) &"
# starting the python socket seems to take a while
# and need misc to use built in sleep command
$(SET_SIM_MODE=#) $(SET_SIM_MODE) sleep 3
s7plcFWConfigure("$(SPS_REGISTER_NAME)", "$(SPS_IP)", "$(FETCH_PORT=2000),1,$(FETCH_DB),0,$(SPS_FETCH_SIZE)", "$(WRITE_PORT=2001),1,$(WRITE_DB=$(FETCH_DB)),0,$(SPS_WRITE_SIZE)", "$(SPS_ENDIANNESS=1)", "$(SPS_RECEIVE_TIMEOUT=1000)", "$(SPS_RECEIVE_DELAY=200)", "0")
# Provides Connection Status PVs
dbLoadRecords("$(sinqSPS_DB)/sps_status.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)")
# Shutter PVs
dbLoadTemplate("$(sinqSPS_DB)/shutter.substitutions", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME), STATUS_FLNK=$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS")
# Additional Mapping PVs
dbLoadRecords("$(sinqSPS_DB)/shutter.db", "INSTR=$(INSTR), SPS_REGISTER_NAME=$(SPS_REGISTER_NAME)")
+204
View File
@@ -0,0 +1,204 @@
record(longout, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-INIT")
{
field(DESC, "Initialises SHUTTER PV")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER NPP")
field(DOL, "$(INSTR)$(SPS_REGISTER_NAME):OPEN NPP")
field(OMSL, "closed_loop")
field(PINI, "YES")
}
record(bo, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER")
{
field(DESC, "Open or close the shutter")
field(DTYP, "Soft Channel")
field(OMSL, "supervisory")
field(ZNAM, "Closed")
field(ONAM, "Open")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY")
}
record(longout, "$(INSTR)$(SPS_REGISTER_NAME):SET-BUSY")
{
field(DESC, "Trigger Internal Busy Status")
# This determines the number of max retry ticks
field(VAL, 5)
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL")
}
# Reset status
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):RESET")
{
field(DESC, "Try to reset status")
# Set the shutter setpoint to same as readback
# in case they are out of sync, i.e. retry error.
field(DOL0, "$(INSTR)$(SPS_REGISTER_NAME):OPEN NPP")
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER NPP")
field(DOL1, 0)
field(LNK1, "$(INSTR)$(SPS_REGISTER_NAME):STATUS PP")
field(SELM, "All")
}
record(bi, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
{
field(DESC, "Internal Busy State")
field(VAL, 0)
field(ZNAM, "Ready")
field(ONAM, "Busy")
}
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL")
{
field(SELM, "Specified")
field(SELL, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER.VAL NPP")
field(DO0, 0x02)
field(DO1, 0x01)
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-TRIGGER PP")
field(LNK1, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-TRIGGER PP")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS")
}
# This is a hack, the SPS sometimes doesn't registers the open/close
# command.
#
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):RETRY")
{
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):OPEN")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):MOVES")
field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):STATUS")
field(CALC, "A#B&&C#0&&D=0&&E=0?1:0")
field(DOPT, "Use CALC")
field(OOPT, "When Non-zero")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-CONTROL.PROC PP")
field(SCAN, "1 second")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):DECREASE-BUSY-TICK")
}
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):DECREASE-BUSY-TICK")
{
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
field(CALC, "A")
field(OOPT, "When Non-zero")
field(DOPT, "Use OCAL")
field(OCAL, "A-1")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):DELAY-RETRY-ERROR")
}
# Delay check for retry error, not this happens after each retry.
# But we gate the retry error wih checking if busy is 0
record(seq, "$(INSTR)$(SPS_REGISTER_NAME):DELAY-RETRY-ERROR")
{
field(DESC, "Delays checking if retry error occurred")
field(DOL0, 1)
field(LNK0, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR.PROC PP")
field(DLY0, 0.5)
field(SELM, "All")
}
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR")
{
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):OPEN")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):BUSY")
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):MOVES")
field(CALC, "A#B&&C=0&&D=0?1:0")
field(OOPT, "When Non-zero")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS PP")
}
# We can't just compare the Write and Readback values, as the readback
# seems to change instantly, and doesn't wait for the shutter to
# actually be open.
# This record has a FLNK from MOVES bit, processing it when all
# Status bits are freshly arrived.
record(calc, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS")
{
field(DESC, "Maps Status Variables to singular status")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-READY NPP")
field(INPB, "$(INSTR)$(SPS_REGISTER_NAME):NOT-LOCKED NPP")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):REMOTE-OKAY NPP")
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):PSYS-OK NPP")
field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):EMERGENCY-STOP-OFF NPP")
field(INPF, "$(INSTR)$(SPS_REGISTER_NAME):MOVES NPP")
field(INPG, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusFetch NPP")
field(INPH, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusWrite NPP")
field(INPI, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP")
field(CALC, "(G=0||H=0||E=0||B=0||I=1)?3:(A=0||D=0)?2:(F=1)?1:C=0?3:0")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS")
}
record(mbbi, "$(INSTR)$(SPS_REGISTER_NAME):STATUS")
{
field(DESC, "Status of Shutter")
field(INP, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-STATUS NPP")
field(ZRVL, "0")
field(ZRST, "Okay")
field(ONVL, "1")
field(ONST, "Busy")
field(TWVL, "2")
field(TWST, "Warning")
field(THVL, "3")
field(THST, "Error")
field(FRST, "4")
field(FRST, "Unknown")
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg PP")
}
record(stringout, "$(INSTR)$(SPS_REGISTER_NAME):MOTION-Msg")
{
field(DESC, "Shutter opening/closing message")
field(VAL, "Shutter in motion")
}
record(stringout, "$(INSTR)$(SPS_REGISTER_NAME):Connection-Msg")
{
field(DESC, "Shutter connection disrupted message")
field(VAL, "Connection to SPS Disrupted")
}
record(stringout, "$(INSTR)$(SPS_REGISTER_NAME):Retry-Error-Msg")
{
field(DESC, "Shutter max retries failed message")
field(VAL, "Failure while retrying to change state")
}
record(scalcout, "$(INSTR)$(SPS_REGISTER_NAME):STATUS-Msg")
{
field(DESC, "Status Message")
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):OPEN NPP")
field(INPC, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-READY NPP")
field(INPD, "$(INSTR)$(SPS_REGISTER_NAME):NOT-LOCKED NPP")
field(INPE, "$(INSTR)$(SPS_REGISTER_NAME):REMOTE-OKAY NPP")
field(INPF, "$(INSTR)$(SPS_REGISTER_NAME):PSYS-OK NPP")
field(INPG, "$(INSTR)$(SPS_REGISTER_NAME):EMERGENCY-STOP-OFF NPP")
field(INPH, "$(INSTR)$(SPS_REGISTER_NAME):MOVES NPP")
field(INPI, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusFetch NPP")
field(INPJ, "$(INSTR)$(SPS_REGISTER_NAME):ConnStatusWrite NPP")
field(INPK, "$(INSTR)$(SPS_REGISTER_NAME):BUSY NPP")
field(INPL, "$(INSTR)$(SPS_REGISTER_NAME):RETRY-ERROR NPP")
field(INAA, "$(INSTR)$(SPS_REGISTER_NAME):OPEN-Msg NPP")
field(INBB, "$(INSTR)$(SPS_REGISTER_NAME):REMOTE-Msg NPP")
field(INCC, "$(INSTR)$(SPS_REGISTER_NAME):SHUTTER-READY-Msg NPP")
field(INDD, "$(INSTR)$(SPS_REGISTER_NAME):EMERGENCY-STOP-Msg NPP")
field(INEE, "$(INSTR)$(SPS_REGISTER_NAME):BLOCKED-Msg NPP")
field(INFF, "$(INSTR)$(SPS_REGISTER_NAME):BLOCKED-REASON-Msg NPP")
field(INGG, "$(INSTR)$(SPS_REGISTER_NAME):PSYS-OK-Msg NPP")
field(INHH, "$(INSTR)$(SPS_REGISTER_NAME):MOTION-Msg NPP")
field(INII, "$(INSTR)$(SPS_REGISTER_NAME):Connection-Msg NPP")
field(INJJ, "$(INSTR)$(SPS_REGISTER_NAME):Retry-Error-Msg NPP")
field(CALC, 'I=0||J=0?II:H=1||K=1?HH:G=0?DD:D=0?(EE+": "+FF):F=0?GG:L=1?JJ:C=0?CC:E=0?BB:AA')
field(FLNK, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
}
record(calcout, "$(INSTR)$(SPS_REGISTER_NAME):SET-READY")
{
field(INPA, "$(INSTR)$(SPS_REGISTER_NAME):MOVES")
field(CALC, "A")
field(OOPT, "Transition To Zero")
field(DOPT, "Use OCAL")
field(OCAL, "0")
field(OUT, "$(INSTR)$(SPS_REGISTER_NAME):BUSY PP")
}
+37
View File
@@ -0,0 +1,37 @@
file "$(sinqSPS_DB)/writeusint.db"
{
pattern
{OFFSET, UINT_NAME, DESC }
{0 , "SHUTTER-TRIGGER" , "Trigger Shutter" }
}
file "$(sinqSPS_DB)/readbit.db"
{
pattern
{OFFSET, BIT, BIT_NAME , ZNAM , ONAM , DESC, FLNK}
{1 , 0 , "PSYS-OK" , "" , "" , "", ""}
{1 , 1 , "SHUTTER-READY" , "No" , "Yes" , "", ""}
{1 , 2 , "EMERGENCY-STOP-OFF", "" , "" , "", ""}
{1 , 3 , "NOT-LOCKED" , "" , "" , "", ""}
{1 , 4 , "CLOSED" , "Open" , "Closed" , "", ""}
{1 , 5 , "OPEN" , "Closed" , "Open" , "", ""}
{1 , 6 , "REMOTE-OKAY" , "" , "" , "", ""}
{1 , 7 , "MOVES" , "Stationary" , "Moving" , "", ""}
}
# The way that the strings are currently implemented in the SPS, the first two
# bytes are the maximum length of the string and the size of the current string
# in the register.
file "$(sinqSPS_DB)/readstring.db"
{
pattern
{OFFSET, LENGTH, STRING_NAME FLNK}
{4 , 14 , "PSYS-OK", ""}
{20 , 17 , "SHUTTER-READY", ""}
{40 , 17 , "EMERGENCY-STOP", ""}
{60 , 19 , "BLOCKED", ""}
{82 , 24 , "BLOCKED-REASON", ""}
{108 , 14 , "OPEN", ""}
{124 , 27 , "REMOTE", "$(STATUS_FLNK)"}
}