- PUT PV is the name of the PV appended to the prefix (e.g. 25idAustin:dashboard:play).
- PUT cmd is the command that is sent over the wire to the robot (i.e. dashboard command).
- GET PV is the corresponding PV for retrieving the value the value.
- Scan cmd is the command that is sent over the wire periodically
(e.g. 0.5 sec) to check for new values.
✓ T PUT PV PUT cmd GET PV Scan cmd dtype ✓ :play play bool ✓ :stop stop bool ✓ :pause pause bool ✓ :quit quit bool ✓ :shutdown shutdown bool ✓ :release_brake brake release bool ✓ :close_safety_popup close safety popup bool ✓ :operational_mode set operational mode <value> :operational_mode_rbv get operational mode enum (manual/automatic) ✓ :power power on / power off :power_rbv [check robot mode?] bool ✓ :unlock_protective_stop unlock protective stop bool ✓ :restart_safety restart safety bool ✓ :installation load installation <value> str ✓ :program load <value> :program_rbv get loaded program str ✓ :program_state programState enum ✓ :robot_mode robotmode enum ✓ :safety_status* safetystatus enum ✓ :program_saved isProgramSaved bool ✓ :program_running running bool ✓ :remote_control is in remote control bool ✓ :software_version PolyscopeVersion str ✓ T :serial_number get serial number str ✓ T :model_number get robot model str - This :safety_status PV should use the SafetyStatus enum, but some of the strings are longer than the 26 character limit, and so this will need to be factored.
- close popup
- popup
- addToLog
- safetymode
- clear operational mode
- generate flight report
- generate support file
- version (unrecognized)
Joint and position PV are set to mimic the EPICS motor records. Currently the following features are supported:
- Setting the position directly (.VAL)
- Readback value (.RBV)
- Jog forward and backward (.TWV, .TWF, .TWR)
- Jog velocity and acceleration (.JVEL, .JAR)
- Moving status, and done moving (.MOVN, .DMOV)
PV Suffix | Has .RBV field? | Read-only | Putter | Dtype | Desc |
---|---|---|---|---|---|
:i | .RBV | Y | float | Position of the first joint | |
:j | .RBV | Y | float | Position of the second joint | |
:k | .RBV | Y | float | Position of the third joint | |
:l | .RBV | Y | float | Position of the fourth joint | |
:m | .RBV | Y | float | Position of the fifth joint | |
:n | .RBV | Y | float | Position of the sixth joint | |
:x | .RBV | Y | float | Cartesion position x | |
:y | .RBV | Y | float | Cartesion position y | |
:z | .RBV | Y | float | Cartesion position z | |
:rx | .RBV | Y | float | Rotation around the x axis | |
:ry | .RBV | Y | float | Rotation around the y axis | |
:rz | .RBV | Y | float | Rotation around the z axis | |
:busy | Y | bool | Whether the run lock is acquired | ||
:acceleration | float | Acceleration setting for robot movements | |||
:velocity | float | Velocity setting for robot movements |
- [ ] Should we assume the driver will handle threads
- [ ] Sort out the busy signal
PV Suffix | dtype | Read-only | Putter | Scan | Desc |
---|---|---|---|---|---|
.ACT | bool | Y | Request to activate the gripper | ||
.ACR | enum | Y | Y | Whether the gripper is activate | |
.CLS | float | Y | Y | Calibrated “closed” position | |
.OPN | float | Y | Y | Calibrated “open” position | |
.CAL | bool | Y | Calibrate the robot’s open/closed range | ||
.RBV | float | Y | Y | Current gripper position readback value | |
.VAL | float | Y | Desired position set point | ||
.VEL | float | How fast the gripper should move | |||
.FRC | float | How much force the gripper may apply |
- Can we caput the calibrated open/close gripper positions?
- Are scanned parameters correct?
- How does “calibrate” relate to the calibrated positions?
- Do we need a global lock for comms via urx?
Each action represents a python function.
The IOC get PVs for the typed arguments to the function, plus PVs to run the function (:Process), report busy status (:Status), and return a value (:Retval).
async def pick(i: float, j:float, k: float, l: float, m: float, n: float) -> int
25idAustin:pick:i 25idAustin:pick:j … 25idAustin:pick:n 25idAustin:pick:Process 25idAustin:pick:RetVal 25idAustin:pick:Status
async def place(i: float, j:float, k: float, l: float, m: float, n: float) -> int
async def home(i: float, j:float, k: float, l: float, m: float, n: float) -> int
Each sample position has a PV group (record). This pv group executes pick and place to and from the given sample position.
For example, for 25idcAustin:sample0
PV Suffix | dtype | Read-only | Putter | Scan | Desc |
---|---|---|---|---|---|
:present | bool | Y | Y | Whether the sensor detects a sample stage is present | |
:load | bool | Y | Direct the robot to load this sample to the stage | ||
:x | float | Y | Translation coordinate of the sample pick position | ||
:y | float | Y | Translation coordinate of the sample pick position | ||
:z | float | Y | Translation coordinate of the sample pick position | ||
:rx | float | Y | Rotation coordinate of the sample pick position | ||
:ry | float | Y | Rotation coordinate of the sample pick position | ||
:rz | float | Y | Rotation coordinate of the sample pick position |
There are also several overall sample PVs. For example, relative to for 25idcAustin
PV Suffix | dtype | Read-only | Putter | Scan | Desc |
---|---|---|---|---|---|
:current_sample | str | Sample number for the currently loaded sample, or “None” | |||
:unload_current_sample | bool | Y | Return the current sample to its board position | ||
:current_sample_reset | bool | Y | Reset the current_sample PV to it’s default value (“None”) | ||
:home | bool | Y | Instruct the robot to return to the first waypoint position | ||
:cal_stage | bool | Y | Instruct the robot to calibrate the stage position |