# turboPmac ## Please read the documentation of sinqMotor first: https://git.psi.ch/sinq-epics-modules/sinqmotor ## Overview This is a driver for the Turbo PMAC motion controller with the SINQ communication protocol. It is based on the sinqMotor shared library (https://git.psi.ch/sinq-epics-modules/sinqmotor). The header files contain detailed documentation for all public functions. The headers themselves are exported when building the library to allow other drivers to depend on this one. ## User guide This driver is a standard sinqMotor-derived which however uses a special low level IP Port driver (`pmacAsynIPPortConfigure`) instead of the standard `drvAsynIPPortConfigure`. For the general configuration, please see https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md. The folder "utils" contains utility scripts for working with pmac motor controllers. To read their manual, run the scripts without any arguments. - writeRead.py: Allows sending commands to and receiving commands from a pmac controller over an ethernet connection. - analyzeTcpDump.py: Parse the TCP communication between an IOC and a MCU and format it into a dictionary. "demo.py" shows how this data can be easily visualized for analysis. ### IOC startup script turboPmac exports the following IOC shell functions: - `turboPmacController`: Create a new controller object. - `turboPmacAxis`: Create a new axis object. The full turboPmacX.cmd file looks like this: ``` # Define the name of the controller and the corresponding port epicsEnvSet("DRIVER_PORT","turboPmacX") epicsEnvSet("IP_PORT","p$(DRIVER_PORT)") # Create the TCP/IP socket used to talk with the controller. The socket can be adressed from within the IOC shell via the port name. # We do not use the standard asyn port driver here, but a PMAC-specific one which enables the usage of StreamDevices for # communicating with the controller directly. pmacAsynIPPortConfigure("$(IP_PORT)","172.28.101.24:1025") # Create the controller object with the defined name and connect it to the socket via the port name. # The other parameters are as follows: # 8: Maximum number of axes # 0.05: Busy poll period in seconds # 1: Idle poll period in seconds # 1: Socket communication timeout in seconds turboPmacController("$(DRIVER_PORT)", "$(IP_PORT)", 8, 0.05, 1, 1); # Define some axes for the specified MCU at the given slot (1, 2 and 5). No slot may be used twice! turboPmacAxis("$(DRIVER_PORT)",1); turboPmacAxis("$(DRIVER_PORT)",2); turboPmacAxis("$(DRIVER_PORT)",5); # Set the number of subsequent timeouts setMaxSubsequentTimeouts("$(DRIVER_PORT)", 20); # Configure the timeout frequency watchdog: A maximum of 10 timeouts are allowed in 300 seconds before an alarm message is sent. setThresholdComTimeout("$(DRIVER_PORT)", 300, 10); # Parametrize the EPICS record database with the substitution file named after the MCU. epicsEnvSet("SINQDBPATH","$(sinqMotor_DB)/sinqMotor.db") dbLoadTemplate("$(TOP)/$(DRIVER_PORT).substitutions", "INSTR=$(INSTR)$(DRIVER_PORT):,CONTROLLER=$(DRIVER_PORT)") epicsEnvSet("SINQDBPATH","$(turboPmac_DB)/turboPmac.db") dbLoadTemplate("$(TOP)/$(DRIVER_PORT).substitutions", "INSTR=$(INSTR)$(DRIVER_PORT):,CONTROLLER=$(DRIVER_PORT)") dbLoadRecords("$(sinqMotor_DB)/asynRecord.db","P=$(INSTR)$(DRIVER_PORT),PORT=$(IP_PORT)") ``` ### Additional records `turboPmac` provides a variety of additional records. See `db/turboPmac.db` for the complete list and the documentation. ## Developer guide ### Versioning Please see the documentation for the module sinqMotor: https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md. ### How to build it Please see the documentation for the module sinqMotor: https://git.psi.ch/sinq-epics-modules/sinqmotor/-/blob/main/README.md.