ip330 Release Notes
Release 2-8 Dec. 5, 2014
- Changes to allow operation on 64-bit systems
- Build on Linux, in addition to RTEMS and vxWorks
- Print values of more registers in report()
- Improved legibility of code by using more symbolic constants for the control registers
- Updated .opi display files for CSS-BOY
- Added .ui display files for caQtDM
Release 2-7 Sept 9, 2011
- Fixed bug: if SecondsBetweenCalibrate was negative, it was never enabling interrupts;
now the calibrate() function is called once at initialization even if SecondsBetweenCalibrate
is negative. However, the calibration values are not used in the conversion if SecondsBetweenCalibrate
- Documentation improvements
- Minor change to ip330Scan.substitutions
- Modified RELEASE; deleted RELEASE.arch
- Improved asynTrace calls; use ASYN_TRACEIO_DRIVER, not ASYN_TRACE_FLOW; improve
output in calibration function
- Added .opi display files for CSS-BOY
Release 2-6 Mar. 20, 2010
- Fixes to build with EPICS 3.14.11.
- Fixes for parallel make.
Release 2-5 October 18, 2007
- Added support for RTEMS to Makefile.
- Fixed problem with soft reboots by adding epicsAtExit call to driver to disable
- Fixed bug with single-ended mode (thanks to Peter Denison at Diamond).
- Eliminated vxWorks dependencies, so it will work on any system with drvIpac and
devLib (thanks to Wayne Lewis at the Australian Synchrotron).
- Support for changing "scan mode" at run time. Thanks to Pete Leicester at Diamond.
Release 2-4 Sept. 5, 2006
Release 2-3 March 23, 2005
- Converted from MPF to ASYN.
- Converted from specialized device support to generic device support from ASYN,
MCA and STD.
- Converted from C++ to C
Release 2-2 March 4, 2004
- Documentation updated, renamed, and moved to documentation directory.
- Added new medm .adl files
Release 2-1 November 3, 2003
- Converted to EPICS 3.14.
- Removed vxWorks dependencies, converted to OSI
- Added iocsh configuration commands
- Configuration routine registers server name, no longer return class pointer
Release 1-7 April 25, 2003
- Changed the way averaging is done in the ip330Scan class again. Removed
completely the concept of milliSecondsToAverage. Now the act of reading the
value for a channel computes the average, and then resets the averaging process
by setting the sum and number of samples back to 0. This has several advantages
over the way things were done in Release 1-6:
- It makes things much simpler, there is no need for device support to send its
scan time to the server, nor any need for the server to keep track of individual
averaging times for each channel. Device support does not then need to know about
EPICS scan rates at all.
- The periodically scanned records work exactly as they did in Release 1-6, since
the average will be over the interval since the record was previously processed.
Thus, a record scanned at 1 second will average for 1 second, etc.
- There is now a clean way to use it with EPICS scanning, i.e. to start averaging
after changing an independent variable, and to average for a user-controlled period
of time. Simply do the following with an ai record that is "Passive"
This release requires modifying the call to initIp330Scan() in the startup script,
since the milliSecondsToAverage parameter no longer exists.
- Change the independent variable
- Process the ai record: this resets the average
- Wait for the period of time you want to average for
- Process the ai record again, and read the value
- Made two new abstract C++ base classes, fastSweep and fastPID. Ip330Sweep and
Ip330PID are subclasses of these abstract base classes. The reason for doing this
is that my support for Steve Ross' quad electrometer (in a new App called quadEM)
has the same types of support (quadEMScan, quadEMSweep and quadEMPID). Using the
abstract base classes reduces the amount of code to implement the device specific
features to less than 2 pages each. devEpidIp330.dbd was replaced with devEpidMpf.dbd.
- Modified Ip330Sweep and Ip330PID. Previously if they were running at an integer
divisor N of the Ip330 clock (N=2, 3, 4 ...) then they would simply ignore the intervening
readings from the Ip330. In the new version they average the intervening readings.
This avoids aliasing of high frequency components.
- Eliminated the function configIp330PID. This function did not work on the
PowerPC and is not necessary. This may require modifications to existing startup
- Reduced number of source files, by combining ip330ScanServer.cc and Ip330Scan.h
into ip300Scan.cc, etc.
- Eliminated the library file ip330ServLib, all code that needs to run on the MPF
server is now in ip330Lib.
Release 1-6 March 31, 2003
- Changed the way averaging is done in the ip330Scan class. Previously there
was a single averaging time for all input channels, that was set at boot time with
the milliSecondsToAverage parameter in the call to initIp330Scan(). This was
not the best way to do it, since if an ai record was set to process every 2 seconds,
but milliSecondsToAverage was 100 msec, then the ai record would just be sampling
every 20'th average. A much better way to do it is to have the averaging time
be equal to the scan time of the record, so that if the scan time is 2 seconds then
the averaging is done for 2 seconds, greatly improving signal to noise. This
has now been implemented by making the averaging time be independent for each input
channel, and passing the scan time in the "extra" field of the message
from device support to the server. Note that there is a limitation in the
way this is presently implemented: it only works if the "standard"
EPICS scan times of 10, 5, 2, 1, .5, .2 and .1 seconds are used. If a site
changes these scan times it will not work correctly, because there is no API available
to determine the actual scan time of a record.
Release 1-5 July 31, 2002 (Carl Lionberger and Eric Snow at SNS)
- Moved interrupt enable to end of config. It was generating lots of interrupts
before being fully configured.
- Properly masked mode control bits in setScanMode, was not working in modes other
- Adjusted mailBoxOffset for uniformSingle and burstSingle scan modes in intFunc.
Release 1-4 October 12, 2001
- Added code to handle soft reboots.
Release 1-3 August 28, 2001
- Removed calls to intClear and intDisable. These were not necessary and did not
work on dumb IP carrier.
Release 1-2 January 16, 2001
- Fixed a bug which caused the IOC to crash if the external trigger line was asserted
during a hardware reboot.
- Fixed bugs which caused the IOC to crash if the IP330 hardware was not installed
but server configuration commands were present in the startup file.
Release 1-1 November 1, 2000 (Marty Kraimer)
- Added the configuration server.
- Added a lock that protects adj_slope and adj_offset from being changed while corrected
values are computed.
- Force two data acquisition cycles during calibration. This is necessary to allow
ADC to settle.
- After calibration set mailBoxOffset=16. Caused a bad reading.
- If secondsBetween Calibrate<0 then return raw value.
Release 1-02 September 10, 2000
Changed ip330SweepServer.cc, removed Ip330SweepServer.h, and replaced devMcaIp330.cc
with a device-independent layer, devMcaMpf.cc. devMcaMpf.cc is part of mcaApp, not
part of Ip330, since it is no longer specific to the Ip330. The messages accepted
by Ip330SweepServer have been changed to accommodate the new device-independent
Changes to the PID algorithm in ip330PID.cc to improve its operation. See the comments
in ip330PID.cc for details.
Release 1-01 April 20, 2000
Changed the timing logic. See the discussion in Restrictions
on Scan Timing.
Release 1-0 November 15, 1999
This support replaces the previous ip330ScanApp. That support did the following:
- Digitized channels 0 to 15 in differential mode, or 0 to 31 in single-ended mode
- Took a complete set of readings every millisecond. Actually the complete set of
readings was taken every 1.240 milliseconds in diffential mode and every 1.480 milliseconds
in single ended mode, because the 15 microseconds to convert each channel was not
taken into account when programming the interval timer.
- Averaged 200 samples for each channel. However, there was a bug in the software
when running in differential mode. The data were always read from the lower mailbox
registers (0-15) rather than alternating the reads between the lower and upper mailbox
registers. Thus, only 100 unique values were being averaged in this mode, rather
- Returned the average value to device support, thus every 0.2 seconds a 200 sample
average was supposed to be available.
- Once a minute calibration was done automatically.
The new support can be configured to function exactly as the previous support was
intended to function with commands like the following in the MPF server startup
pIp330 = initIp330("c-Ip330",carrier,"IP_c","D","-5to5",0,15,10,120)
The initIp330 command creates a task called "c-Ip330", with the following
- differential mode
- -5 to 5 volt range
- convert channels 0 to 15,
- 10 clients (Ip330 application-specific servers) maximum
- interrupt vector = 120
The configIp330 command configures Ip330 with the following settings:
- scanMode = 3 = Burst Continuous
- external trigger = input
- 1000 microseconds = 1 millisecond per scan
- 60 seconds between calibrations
The initIp330Scan command creates a server called "c-Ip330Scan" with the
- connected to the Ip330 object created by the initIp330 command
- convert channels 0 to 15
- average readings for 200 milliseconds
- create an output queue for 20 MPF messages
Suggestions and Comments to:
Mark Rivers : (email@example.com)