areaDetector PCO driver

  February 24, 2016

Timothy J. Madden, Argonne National Laboratory


Table of Contents

Introduction

This is an EPICS areaDetector driver for detectors from PCO using raw serial communication to a Camera Link frame grabber. The driver is in use at the Advanced Photon Source to control the high speed Dimax and sCMOS Edge cameras from PCO.  The driver was commissioned by APS/XSD Imaging Group for x-ray micro-tomography application. It has been extensively been tested at APS 2-BM by Xianghui Xiao and Tim Madden. The driver is supported on 32-bit and 64- bit Linux and 32-bit and 64-bit Windows.

The driver currently provides access to most of the features of the PCO cameras:

The PCO driver consists of three parts. First, a driver called ADCameralink inherits from ADDriver provides functions for grabbing images from the Camera Link frame grabber. Second,  pco is a class that  inherits from ADCameralink and provides all serial port control over the RS-232 port built in to the Camera Link grabber card. (If one were to write a Camera Link driver for some camera other than PCO, one would inherit ADCameralink and add serial control code.) Last, camLinkSerial provides serial port I/O as an asynPortDriver similar to drvAsynSerialPort.  

PCO provides a Windows-based SDK for driving their cameras. Because this driver was developed largely before the PCO SDK was mature, this driver uses direct Camera Link serial port control. An advantage of this approach is that any Camera Link card can be supported. Also the driver can be run in a Linux system. (The PCO SDK is Windows-only. An EPICS driver using the PCO SDK was developed at Diamond Controls Group.)

The PCO parameters are documented in their Camera Link serial command manual available here. The Dimax parameters are documented here.The PCO AD Driver supports nearly all of the parameters documented in these manuals.


AD Parameters

Parameters for ADDriver are shown in the table below. Parameters not supported in ADPCO are greyed out. 

Reagarding the exposure time, the PCO has two modes:
1) Frame rate mode: In this mode, the frame rate is set in pco_frame_rate. ADAcquireTime, ADAcquirePeriod are ignored.
2) Expose mode: In this mode, ADAcquireTime, ADAcquirePeriod are used, and pco_frame_rate is ignored.


Parameter Definitions in ADDriver.h and EPICS Record Definitions in ADBase.template
Parameter index variable asyn interface Access Description drvInfo string EPICS record name EPICS record type
Information about the detector
ADManufacturer asynOctet r/o Detector manufacturer name MANUFACTURER $(P)$(R)Manufacturer_RBV stringin
ADModel asynOctet r/o Detector model name MODEL $(P)$(R)Model_RBV stringin
ADMaxSizeX asynInt32 r/o Maximum (sensor) size in the X direction MAX_SIZE_X $(P)$(R)MaxSizeX_RBV longin
ADMaxSizeY asynInt32 r/o Maximum (sensor) size in the Y direction MAX_SIZE_Y $(P)$(R)MaxSizeY_RBV longin
ADTemperature asynFloat64 r/w Detector temperature TEMPERATURE $(P)$(R)Temperature
$(P)$(R)Temperature_RBV
ao
ai
ADTemperatureActual asynFloat64 r/o Actual detector temperature TEMPERATURE_ACTUAL $(P)$(R)Temperature_Actual ai
Detector readout control including gain, binning, region start and size, reversal
ADGain asynFloat64 r/w Detector gain GAIN $(P)$(R)Gain
$(P)$(R)Gain_RBV
ao
ai
ADBinX asynInt32 r/w Binning in the X direction. Always 1
BIN_X $(P)$(R)BinX
$(P)$(R)BinX_RBV
longout
longin
ADBinY asynInt32 r/w Binning in the Y direction, Always 1.
BIN_Y $(P)$(R)BinY
$(P)$(R)BinY_RBV
longout
longin
ADMinX asynInt32 r/w First pixel to read in the X direction.
0 is the first pixel on the detector.Always 1.
MIN_X $(P)$(R)MinX
$(P)$(R)MinX_RBV
longout
longin
ADMinY asynInt32 r/w First pixel to read in the Y direction.
0 is the first pixel on the detector. Always 1.
MIN_Y $(P)$(R)MinY
$(P)$(R)MinY_RBV
longout
longin
ADSizeX asynInt32 r/w Size of the region to read in the X direction SIZE_X $(P)$(R)SizeX
$(P)$(R)SizeX_RBV
longout
longin
ADSizeY asynInt32 r/w Size of the region to read in the Y direction SIZE_Y $(P)$(R)SizeY
$(P)$(R)SizeY_RBV
longout
longin
ADReverseX asynInt32 r/w Reverse array in the X direction
(0=No, 1=Yes)
REVERSE_X $(P)$(R)ReverseX
$(P)$(R)ReverseX_RBV
longout
longin
ADReverseY asynInt32 r/w Reverse array in the Y direction
(0=No, 1=Yes)
REVERSE_Y $(P)$(R)ReverseY
$(P)$(R)ReverseY_RBV
longout
longin
Image and trigger modes
ADImageMode asynInt32 r/w Image mode (ADImageMode_t). IMAGE_MODE $(P)$(R)ImageMode
$(P)$(R)ImageMode_RBV
mbbo
mbbi
ADTriggerMode asynInt32 r/w Trigger mode (ADTriggerMode_t). TRIGGER_MODE $(P)$(R)TriggerMode
$(P)$(R)TriggerMode_RBV
mbbo
mbbi
Frame type
ADFrameType asynInt32 r/w Frame type (ADFrameType_t). FRAME_TYPE $(P)$(R)FrameType
$(P)$(R)FrameType_RBV
mbbo
mbbi
Acquisition time and period
ADAcquireTime asynFloat64 r/w Acquisition time per image ACQ_TIME $(P)$(R)AcquireTime
$(P)$(R)AcquireTime_RBV
ao
ai
ADAcquirePeriod asynFloat64 r/w Acquisition period between images ACQ_PERIOD $(P)$(R)AcquirePeriod
$(P)$(R)AcquirePeriod_RBV
ao
ai
Number of exposures and number of images
ADNumExposures asynInt32 r/w Number of exposures per image to acquire NEXPOSURES $(P)$(R)NumExposures
$(P)$(R)NumExposures_RBV
longout
longin
ADNumImages asynInt32 r/w Number of images to acquire in one acquisition sequence NIMAGES $(P)$(R)NumImages
$(P)$(R)NumImages_RBV
longout
longin
Acquisition control
ADAcquire asynInt32 r/w Start (1) or stop (0) image acquisition. This is an EPICS busy record that does not process its forward link until acquisition is complete. Clients should write 1 to the Acquire record to start acquisition, and wait for Acquire to go to 0 to know that acquisition is complete. ACQUIRE $(P)$(R)Acquire
$(P)$(R)Acquire_RBV
busy
bi
Status information
ADStatus asynInt32 r/o Acquisition status (ADStatus_t) STATUS $(P)$(R)DetectorState_RBV mbbi
ADStatusMessage asynOctet r/o Status message string STATUS_MESSAGE $(P)$(R)StatusMessage_RBV waveform
ADStringToServer asynOctet r/o String from driver to string-based vendor server STRING_TO_SERVER $(P)$(R)StringToServer_RBV waveform
ADStringFromServer asynOctet r/o String from string-based vendor server to driver STRING_FROM_SERVER $(P)$(R)StringFromServer_RBV waveform
ADNumExposuresCounter asynInt32 r/o Counter that increments by 1 each time an exposure is acquired for the current image. Driver resets to 0 when acquisition is started. NUM_EXPOSURES_COUNTER $(P)$(R)NumExposuresCounter_RBV longin
ADNumImagesCounter asynInt32 r/o Counter that increments by 1 each time an image is acquired in the current acquisition sequence. Driver resets to 0 when acquisition is started. Drivers can use this as the loop counter when ADImageMode=ADImageMultiple. NUM_IMAGES_COUNTER $(P)$(R)NumImagesCounter_RBV longin
ADTimeRemaining asynFloat64 r/o Time remaining for current image. Drivers should update this value if they are doing the exposure timing internally, rather than in the detector hardware. TIME_REMAINING $(P)$(R)TimeRemaining_RBV ai
ADReadStatus asynInt32 r/w Write a 1 to this parameter to force a read of the detector status. Detector drivers normally read the status as required, so this is usually not necessary, but there may be some circumstances under which forcing a status read may be needed. READ_STATUS $(P)$(R)ReadStatus bo
Shutter control
ADShutterMode asynInt32 r/w Shutter mode (None, detector-controlled or EPICS-controlled) (ADShutterMode_t) SHUTTER_MODE $(P)$(R)ShutterMode
$(P)$(R)ShutterMode_RBV
mbbo
mbbi
ADShutterControl asynInt32 r/w Shutter control for the selected (detector or EPICS) shutter (ADShutterStatus_t) SHUTTER_CONTROL $(P)$(R)ShutterControl
$(P)$(R)ShutterControl_RBV
bo
bi
ADShutterControlEPICS asynInt32 r/w This record processes when it receives a callback from the driver to open or close the EPICS shutter. It triggers the records below to actually open or close the EPICS shutter. SHUTTER_CONTROL_EPICS $(P)$(R)ShutterControlEPICS bi














ADShutterStatus asynInt32 r/o Status of the detector-controlled shutter (ADShutterStatus_t) SHUTTER_STATUS $(P)$(R)ShutterStatus_RBV bi
N/A N/A r/o Status of the EPICS-controlled shutter. This record should have its input link (INP) set to a record that contains the open/close status information for the shutter. The link should have the "CP" attribute, so this record processes when the input changes. The ZRVL field should be set to the value of the input link when the shutter is closed, and the ONVL field should be set to the value of the input link when the shutter is open. N/A $(P)$(R)ShutterStatusEPICS_RBV mbbi
ADShutterOpenDelay asynFloat64 r/w Time required for the shutter to actually open (ADShutterStatus_t) SHUTTER_OPEN_DELAY $(P)$(R)ShutterOpenDelay
$(P)$(R)ShutterOpenDelay_RBV
ao
ai
ADShutterCloseDelay asynFloat64 r/w Time required for the shutter to actually close (ADShutterStatus_t) SHUTTER_CLOSE_DELAY $(P)$(R)ShutterCloseDelay
$(P)$(R)ShutterCloseDelay_RBV
ao
ai



PCO Specific Parameters

The following parameters are found in pco.h.


Parameter Definitions in pco.h and EPICS Record Definitions in pco.template
Parameter index variable asyn interface Access Description drvInfo string EPICS record name EPICS record type
pco_ready2acquire
asynInt32 WR 1 if camera is ready.
pco_ready2acquire
$(P)$(R)pco_ready2acquire $(P)$(R)pco_ready2acquire_RBV longout longin
pco_com_err_max
asynInt32 W 1 if error on serial port.
pco_com_err_max
$(P)$(R)pco_com_err_max longout
pco_global_shutter
asynInt32 WR 1 if Edge global shutter mode
pco_global_shutter
$(P)$(R)pco_global_shutter $(P)$(R)pco_global_shutter_RBV mbbo mbbi
pco_dimax_nimgs_fudge
asynInt32 WR fudge factor in calc'ing dimax memory size.
pco_dimax_nimgs_fudge
$(P)$(R)pco_dimax_nimgs_fudge $(P)$(R)pco_dimax_nimgs_fudge_RBV longout longin
pco_disable_descramble
asynInt32 WR 1 to disable descramble plugin
pco_disable_descramble
$(P)$(R)pco_disable_descramble $(P)$(R)pco_disable_descramble_RBV longout longin
w_open_com
asynInt32 W open serial port
w_open_com
$(P)$(R)w_open_com longout
w_close_com
asynInt32 W close serial port
w_close_com
$(P)$(R)w_close_com longout
w_is_com_open
asynInt32 R 1 if serial port open
w_is_com_open
$(P)$(R)w_is_com_open longin
pco_run_counter
asynInt32 R increments when pco thread runs next loop.
pco_run_counter
$(P)$(R)w_run_counter longin
pco_kill_ioc
asynInt32 W 1 to call exit()
pco_kill_ioc
$(P)$(R)pco_kill_ioc longout
pco_is_running
asynInt32 W 1 if pco thread is runing
pco_is_running
$(P)$(R)pco_is_running longout
w_is_sleep
asynInt32 W 1 to make pco thread sleep between loops
w_is_sleep
$(P)$(R)w_is_sleep longout
w_sleep_ms
asynInt32 W how long pco thread sleeps.
w_sleep_ms
$(P)$(R)w_sleep_ms longout
pco_comport_number
asynInt32 WR COM0, 1... the number.
pco_comport_number
$(P)$(R)pco_comport_number_RBV $(P)$(R)pco_comport_number longin longout
pco_check_time
asynInt32 W HOw often in ms we check pco camera parameters.
pco_check_time
$(P)$(R)pco_check_time longout
pco_force_check
asynInt32 W 1 to force a check of pco camera parameters. 
pco_force_check
$(P)$(R)pco_force_check longout
pco_reset_default_settings
asynInt32 W reset camera to default
pco_reset_default_settings
$(P)$(R)pco_reset_default_settings longout
pco_init_selftest
asynInt32 W self test camera
pco_init_selftest
$(P)$(R)pco_init_selftest longout
pco_health_warning
asynInt32 R Warning codes from camera.
pco_health_warning
$(P)$(R)pco_health_warning_RBV longin
pco_health_error
asynInt32 R Error codes from camera
pco_health_error
$(P)$(R)pco_health_error_RBV longin
pco_health_status
asynInt32 R Health code from camera
pco_health_status
$(P)$(R)pco_health_status_RBV longin
pco_is_frame_rate_mode
asynInt32 WR 1 for framereate, 0 for exp time/delay  mode.
pco_is_frame_rate_mode
$(P)$(R)pco_is_frame_rate_mode $(P)$(R)pco_is_frame_rate_mode_RBV mbbo mbbi
pco_sensor_format
asynInt32 WR sensor specs
pco_sensor_format
$(P)$(R)pco_sensor_format $(P)$(R)pco_sensor_format_RBV mbbo mbbi
pco_pixelrate
asynInt32 WR sensor readout speed.
pco_pixelrate
$(P)$(R)pco_pixelrate $(P)$(R)pco_pixelrate_RBV longout longin
pco_doub_img_mode
asynInt32 WR camera in doub. corr. iamge mode.
pco_doub_img_mode
$(P)$(R)pco_doub_img_mode $(P)$(R)pco_doub_img_mode_RBV mbbo mbbi
pco_adc_mode
asynInt32 WR Mode of ADC on camera
pco_adc_mode
$(P)$(R)pco_adc_mode $(P)$(R)pco_adc_mode_RBV longout longin
pco_temp_setpt
asynInt32 WR sensor temp setpoint.
pco_temp_setpt
$(P)$(R)pco_temp_setpt $(P)$(R)pco_temp_setpt_RBV longout longin
pco_offset_mode
asynInt32 WR  low level camera setting
pco_offset_mode
$(P)$(R)pco_offset_mode $(P)$(R)pco_offset_mode_RBV mbbo mbbi
pco_noise_filt_mode
asynInt32 WR low level camera setting  pco_noise_filt_mode
$(P)$(R)pco_noise_filt_mode $(P)$(R)pco_noise_filt_mode_RBV mbbo mbbi
pco_exp_timebase
asynInt32 WR ms, us, ns time base for frame rate and exp time.
pco_exp_timebase
$(P)$(R)pco_exp_timebase $(P)$(R)pco_exp_timebase_RBV mbbo mbbi
pco_dly_timebase
asynInt32 WR ms, us, ns time base for frame rate and exp time.   pco_dly_timebase
$(P)$(R)pco_dly_timebase $(P)$(R)pco_dly_timebase_RBV mbbo mbbi
pco_fps_mode
asynInt32 WR frame per sec mode
pco_fps_mode
$(P)$(R)pco_fps_mode $(P)$(R)pco_fps_mode_RBV mbbo mbbi
pco_trigger_mode
asynInt32 WR trigger mode, low level camera spec. 
pco_trigger_mode
$(P)$(R)pco_trigger_mode $(P)$(R)pco_trigger_mode_RBV mbbo mbbi
pco_busy
asynInt32 R 1 of camera bisy
pco_busy
$(P)$(R)pco_busy_RBV mbbi
pco_exp_trig_stat
asynInt32 R trigger status
pco_exp_trig_stat
$(P)$(R)pco_exp_trig_stat_RBV mbbi
pco_camera_ram_npages
asynInt32 R Num pages of RAM in dimax
pco_camera_ram_npages
$(P)$(R)pco_camera_ram_npages_RBV longin
pco_camera_ram_page_size
asynInt32 R page size in dimax
pco_camera_ram_page_size
$(P)$(R)pco_camera_ram_page_size_RBV longin
pco_camera_seg_size0
asynInt32 WR ram segment size in dimax
pco_camera_seg_size0
$(P)$(R)pco_camera_seg_size0_RBV $(P)$(R)pco_camera_seg_size0 longin longout
pco_camera_seg_size1
asynInt32 WR   ram segment size in dimax pco_camera_seg_size1
$(P)$(R)pco_camera_seg_size1_RBV $(P)$(R)pco_camera_seg_size1 longin longout
pco_camera_seg_size2
asynInt32 WR   ram segment size in dimax pco_camera_seg_size2
$(P)$(R)pco_camera_seg_size2_RBV $(P)$(R)pco_camera_seg_size2 longin longout
pco_camera_seg_size3
asynInt32 WR   ram segment size in dimax pco_camera_seg_size3
$(P)$(R)pco_camera_seg_size3_RBV $(P)$(R)pco_camera_seg_size3 longin longout
pco_clear_ram_seg
asynInt32 W clear current segment in dimax ram
pco_clear_ram_seg
$(P)$(R)pco_clear_ram_seg longout
pco_active_seg
asynInt32 WR which ram seg is active in dimax
pco_active_seg
$(P)$(R)pco_active_seg_RBV $(P)$(R)pco_active_seg longin longout
pco_storage_mode
asynInt32 WR fifo or non fifo ram storage mode on dimax
pco_storage_mode
$(P)$(R)pco_storage_mode $(P)$(R)pco_storage_mode_RBV mbbo mbbi
pco_rec_submode
asynInt32 WR low level param
pco_rec_submode
$(P)$(R)pco_rec_submode $(P)$(R)pco_rec_submode_RBV mbbo mbbi
pco_rec_status
asynInt32 WR low level param   pco_rec_status
$(P)$(R)pco_rec_status $(P)$(R)pco_rec_status_RBV mbbo mbbi
pco_acq_mode
asynInt32 WR low level param   pco_acq_mode
$(P)$(R)pco_acq_mode $(P)$(R)pco_acq_mode_RBV mbbo mbbi
pco_acqen_sig_stat
asynInt32 R low level param   pco_acqen_sig_stat
$(P)$(R)pco_acqen_sig_stat_RBV mbbi
pco_timestamp_mode
asynInt32 WR put timestmpas into images that can be seen as text. pco_timestamp_mode
$(P)$(R)pco_timestamp_mode $(P)$(R)pco_timestamp_mode_RBV mbbo mbbi
pco_arm_camera
asynInt32 W 1 to arm camera pco_arm_camera
$(P)$(R)pco_arm_camera longout
pco_rec_stop_event_mode
asynInt32 WR low level param   pco_rec_stop_event_mode
$(P)$(R)pco_rec_stop_event_mode $(P)$(R)pco_rec_stop_event_mode_RBV mbbo mbbi
pco_rec_stop_event_nimgs
asynInt32 WR low level param   pco_rec_stop_event_nimgs
$(P)$(R)pco_rec_stop_event_nimgs $(P)$(R)pco_rec_stop_event_nimgs_RBV longout longin
pco_stop_record
asynInt32 W 1 to stop recording
pco_stop_record
$(P)$(R)pco_stop_record longout
pco_read_which_seg
asynInt32 WR which ram we read in dimax.
pco_read_which_seg
$(P)$(R)pco_read_which_seg $(P)$(R)pco_read_which_seg_RBV longout longin
pco_read_st_img
asynInt32 WR dimax does not support
pco_read_st_img
$(P)$(R)pco_read_st_img $(P)$(R)pco_read_st_img_RBV longout longin
pco_read_end_img
asynInt32 WR dimax does not support   pco_read_end_img
$(P)$(R)pco_read_end_img $(P)$(R)pco_read_end_img_RBV longout longin
pco_do_read_imgs
asynInt32 W dimax does not support   pco_do_read_imgs
$(P)$(R)pco_do_read_imgs longout
pco_req_img
asynInt32 W read one image from dimax
pco_req_img
$(P)$(R)pco_req_img longout
pco_rpt_img
asynInt32 W low level param
pco_rpt_img
$(P)$(R)pco_rpt_img longout
pco_cancel_img
asynInt32 W low level param   pco_cancel_img
$(P)$(R)pco_cancel_img longout
pco_bit_alignment
asynInt32 WR low level param   pco_bit_alignment
$(P)$(R)pco_bit_alignment $(P)$(R)pco_bit_alignment_RBV mbbo mbbi
pco_num_imgs_seg0
asynInt32 R Number of images in RAM segment
pco_num_imgs_seg0
$(P)$(R)pco_num_imgs_seg0_RBV longin
pco_num_imgs_seg1
asynInt32 R Number of images in RAM segment  pco_num_imgs_seg1
$(P)$(R)pco_num_imgs_seg1_RBV longin
pco_num_imgs_seg2
asynInt32 R Number of images in RAM segment  pco_num_imgs_seg2
$(P)$(R)pco_num_imgs_seg2_RBV longin
pco_num_imgs_seg3
asynInt32 R Number of images in RAM segment  pco_num_imgs_seg3
$(P)$(R)pco_num_imgs_seg3_RBV longin
pco_max_imgs_seg0
asynInt32 R MAx Number of images in RAM segment  pco_max_imgs_seg0
$(P)$(R)pco_max_imgs_seg0_RBV longin
pco_max_imgs_seg1
asynInt32 R Max Number of images in RAM segment  pco_max_imgs_seg1
$(P)$(R)pco_max_imgs_seg1_RBV longin
pco_max_imgs_seg2
asynInt32 R Max Number of images in RAM segment  pco_max_imgs_seg2
$(P)$(R)pco_max_imgs_seg2_RBV longin
pco_max_imgs_seg3
asynInt32 R MAx Number of images in RAM segment  pco_max_imgs_seg3
$(P)$(R)pco_max_imgs_seg3_RBV longin
pco_camlink_pixfreq
asynInt32 WR Camera Link clock speed.
pco_camlink_pixfreq
$(P)$(R)pco_camlink_pixfreq $(P)$(R)pco_camlink_pixfreq_RBV longout longin
pco_cclines
asynInt32 WR CC lines on cam link card.
pco_cclines
$(P)$(R)pco_cclines $(P)$(R)pco_cclines_RBV longout longin
pco_camlink_pixperclk
asynInt32 WR pixels per clock. has to do with data format on Camera Link.
pco_camlink_pixperclk
$(P)$(R)pco_camlink_pixperclk $(P)$(R)pco_camlink_pixperclk_RBV longout longin
pco_camlink_cont
asynInt32 WR add delay between images in camlink interface
pco_camlink_cont
$(P)$(R)pco_camlink_cont $(P)$(R)pco_camlink_cont_RBV longout longin
pco_baudrate
asynInt32 WR baudrate for serial port
pco_baudrate
$(P)$(R)pco_baudrate $(P)$(R)pco_baudrate_RBV longout longin
pco_reset_memory
asynInt32 W reset dimax memory
pco_reset_memory
$(P)$(R)pco_reset_memory longout
pco_play_slow
asynInt32 W not supported by pco
pco_play_slow
$(P)$(R)pco_play_slow longout
pco_play_stop
asynInt32 W not supported by pco   pco_play_stop
$(P)$(R)pco_play_stop longout
pco_dump_counter
asynInt32 WR counts images dumped from camera
pco_dump_counter
$(P)$(R)pco_dump_counter $(P)$(R)pco_dump_counter_RBV longout longin
pco_imgs2dump
asynInt32 WR number of images to red from dimax
pco_imgs2dump
$(P)$(R)pco_imgs2dump $(P)$(R)pco_imgs2dump_RBV longout longin
pco_dump_waitms
asynInt32 WR wait time between readout iamges on dimax
pco_dump_waitms
$(P)$(R)pco_dump_waitms $(P)$(R)pco_dump_waitms_RBV longout longin
pco_check_time2
asynInt32 W  timer for 2nd param check in pco.
pco_check_time2
$(P)$(R)pco_check_time2 longout
pco_dump_camera_memory
asynInt32 WR 1 to dump frames from dimax ram
pco_dump_camera_memory
$(P)$(R)pco_dump_camera_memory $(P)$(R)pco_dump_camera_memory_RBV longout longin
pco_cancel_dump
asynInt32 W 1 to stop dump.
pco_cancel_dump
$(P)$(R)pco_cancel_dump longout
pco_live_view
asynInt32 WR 1 for live view from edge and dimax. 
pco_live_view
$(P)$(R)pco_live_view $(P)$(R)pco_live_view_RBV mbbo mbbi
N/A
None W  
N/A
$(P)$(R)pco_lview2_fr_rate scalcout
pco_frame_rate
asynFloat64 R frame rate register on pco camera
pco_frame_rate
$(P)$(R)pco_frame_rate_RBV ai
pco_cdi_mode
asynInt32 WR low level param
pco_cdi_mode
$(P)$(R)pco_cdi_mode $(P)$(R)pco_cdi_mode_RBV mbbo mbbi
pco_dnsu_mode
asynInt32 WR low level param   pco_dnsu_mode
$(P)$(R)pco_dnsu_mode $(P)$(R)pco_dnsu_mode_RBV longout longin
pco_dnsu_init_mode
asynInt32 WR low level param   pco_dnsu_init_mode
$(P)$(R)pco_dnsu_init_mode $(P)$(R)pco_dnsu_init_mode_RBV longout longin
pco_reconfig_grabber
asynInt32 W 1 to reconfig frae grabber. 
pco_reconfig_grabber
$(P)$(R)pco_reconfig_grabber longout
pco_set_frame_rate
asynFloat64 WR  frame ratge for pco
pco_set_frame_rate
$(P)$(R)pco_set_frame_rate_RBV $(P)$(R)pco_set_frame_rate ai ao
pco_delay_time
asynFloat64 WR  tiem betwen images on pco exposire
pco_delay_time
$(P)$(R)pco_delay_time_RBV $(P)$(R)pco_delay_time ai ao
pco_dump_maxdatarate
asynInt32 WR max data rate for image memory dump from dimax
pco_dump_maxdatarate
$(P)$(R)pco_dump_maxdatarate_RBV $(P)$(R)pco_dump_maxdatarate longin longout
pco_test_pixels
asynInt32 WR add test pixels to image
pco_test_pixels
$(P)$(R)pco_test_pixels $(P)$(R)pco_test_pixels_RBV longout longin
pco_double_image_error
asynInt32 WR 1 if we have repeated frames on dump 
pco_double_image_error
$(P)$(R)pco_double_image_error $(P)$(R)pco_double_image_error_RBV longout longin
pco_which_camera
asynInt32 R integer for edge or dimax. 
pco_which_camera
$(P)$(R)pco_which_camera_RBV longin
pco_hotpix_corr
asynInt32 WR low level
pco_hotpix_corr
$(P)$(R)pco_hotpix_corr $(P)$(R)pco_hotpix_corr_RBV longout longin
pco_1612_lookup
asynInt32 WR low level
pco_1612_lookup
$(P)$(R)pco_1612_lookup $(P)$(R)pco_1612_lookup_RBV longout longin
pco_edge_fastscan
asynInt32 WR fast or slow scan for edge sensor
pco_edge_fastscan
$(P)$(R)pco_edge_fastscan $(P)$(R)pco_edge_fastscan_RBV mbbo mbbi
pco_conv_12to16
asynInt32 WR 12 bit to 16 bit format comversion for edge
pco_conv_12to16
$(P)$(R)pco_conv_12to16 $(P)$(R)pco_conv_12to16_RBV mbbo mbbi
pco_descramble
asynInt32 WR enavle SW descramble of iamges. 
pco_descramble
$(P)$(R)pco_descramble $(P)$(R)pco_descramble_RBV mbbo mbbi
pco_dbg_serprint
asynInt32 W debugging serial port. deprecated
pco_dbg_serprint
$(P)$(R)pco_dbg_serprint longout
pco_do_camcontrol
asynInt32 W deprecated
pco_do_camcontrol
$(P)$(R)pco_do_camcontrol longout
pco_ser_waitms
asynInt32 W wait time for serial port
pco_ser_waitms
$(P)$(R)pco_ser_waitms longout
pco_dbg_serwrite
asynInt32 W debrecated 
pco_dbg_serwrite
$(P)$(R)pco_dbg_serwrite longout
pco_dbg_serread
asynInt32 W debrecated  pco_dbg_serread
$(P)$(R)pco_dbg_serread longout
pco_dbg_serstr
asynOctetWrite WR debrecated  pco_dbg_serstr
$(P)$(R)pco_dbg_serstr $(P)$(R)pco_dbg_serstr_RBV waveform waveform
N/A
None W  
N/A
$(P)$(R)pco_dumpcanceller calcout
pco_grab_waittime
asynFloat64 WR wait tiem between image grabs
pco_grab_waittime
$(P)$(R)pco_grab_waittime_RBV $(P)$(R)pco_grab_waittime ai ao
pco_rollshut_mcfname
asynOctetWrite WR rolling shutter edge config file name
pco_rollshut_mcfname
$(P)$(R)pco_rollshut_mcfname $(P)$(R)pco_rollshut_mcfname_RBV waveform waveform
pco_globshut_mcfname
asynOctetWrite WR global chutter edge config file name
pco_globshut_mcfname
$(P)$(R)pco_globshut_mcfname $(P)$(R)pco_globshut_mcfname_RBV waveform waveform


Configuration

When using ADPCO, first open the serial port on the frame grabber using drvCamlinkSerial. The two arguments are the name of the asyn port, "SERIAL," and the name of the serial port, "COM2." The com port name depends on the type of grabber. The Dalsa grabber maps its serial port to a COM port in the Windows system. The Silicon Software grabber does no such mapping, and the com port name "COM2" below is actually ignored. The reason is that when the driver is built, it is linked against the grabber vendor libraries.

drvCamlinkSerialConfigure("SERIAL","COM2");

Once the serial port is configured, its asyn port is passed to the PCO driver.

int PCOConfig(const char *portName, const char *serverPort, int maxBuffers,
              size_t maxMemory, int priority, int stackSize),

where:
portName: asyn port of the PCO camera
serverPort: serial port passed to the driver
maxBuffers: max number of NDArrays in the queue.
maxMemory: -1, for no max limit.
priority: thread priority between 0 and 100. 50 is in the middle.
stackSize: stack size for asynPort thread in "Can block mode." See ADDriver docs for more info.

For example:
PCOConfig("PCOIOC", "SERIAL",$(QSIZE), -1,50,100)

Additionally, if running the edge camera, the descrambler plugin must be run.

drvpcoEdgePluginConfigure(
    const char *portName,
    int frame_queue_size,
    int blocking_callbacks,
    const char *NDArray_port,
    int NDArray_address,
    int priority,
    int stacksize)

where:
    portName: asyn port of the PCO camera
    serverPort: serial port passed to the driver
    frame_queue_size: max number of NDArrays in the queue.
    NDArray_port: Name of asyn port supplying images to callback.
    blocking_callbacks: Use 0 for non-blocking mode.
    priority: thread priority between 0 and 100. 50 is in the middle.
    stackSize: stack size for asynPort thread in "Can block mode." See ADDriver docs for more info.


 
Example:
drvpcoEdgePluginConfigure("EDGEDSC",$(QSIZE),0,"PCOIOC",0,50,0);


MEDM screens

Screens are shown below. Main screens exist for Edge and Dimax. Generally only main screens are used. Other screens are for debugging or for parameters rarely tweaked by users.

Main Dimax Control Screen

User generally needs only this screen for Dimax. Memory control at botton of screen.


Main Edge Control Screen

User generally only uses this screen.





Infrequently used screens are below.


              
Above is the PCO parameters screen. This screens is rarely used in general data acquisition.



  
Above are screens for Dimax memory low level parameters, and Edge plugin controls. Neither screen is used on a routine basis. The Edge plugin is used for descrambling and reformatting images, and is controlled not by the MEDM screen, but by attributes attached to the images sent from ADPCO driver.