|
Size: 5893
Comment:
|
Size: 6109
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 52: | Line 52: |
| # unsigned int priority, # used for priority management with multiple devices, so far not tested | # unsigned int priority, # |
| Line 54: | Line 54: |
| # int noProcessEos); # | # int noProcessEos); # |
| Line 56: | Line 56: |
| # Example: | # Examples: # drvAsynIPPortConfigure("<TCP_PORT_NAME>","<UNIT_IP_ADDRESS>:502",0,0,1) |
| Line 68: | Line 69: |
| # modbusInterposeConfig("<TCP_PORT_NAME>",0,5000,0) | |
| Line 80: | Line 82: |
| # plcType); # | # plcType); # # # Example: # drvModbusAsynConfigure("<PORT_NAME>","<TCP_PORT_NAME>",0,<modbusFunction>,<modbusStartAddress>,<modbusLength>,<dataType>,<pollMsec>,"Acromag") |
| Line 84: | Line 89: |
| ===== XT1221 ===== | ==== XT1221 ==== |
| Line 90: | Line 95: |
| ===== XT1541 ===== | ==== XT1541 ==== |
| Line 97: | Line 102: |
| ===== XT1111 & 1121 ===== | ==== XT1111 & 1121 ==== |
| Line 111: | Line 116: |
| field(INP,"@asynMask(C1AUXEX_XT1221A_ADC 0 -16)MODBUS_DATA") | field(INP,"@asynMask(<ADC_UNIT_PORT_NAME> 0 -16)MODBUS_DATA") |
Slow Controls
Old Slow Controls Machines (Pre-2017)
Contents
Slow DAQ Modules
The new slow DAQ system uses the Acromag XT series DIN-rail mounted A/D, D/A and BIO modules. The model numbers are in the format XTYYY1, where "XT" is a static prefix, "YYY" determines the function, and the "1" denotes the ModBus/TCP version of the model. The 1 at the end is important, as the other variations will not interface with CDS through EPICS properly.
Module |
Function |
# Channels |
Notes |
XT1111 |
Binary I/O |
16 |
Sinking outputs |
XT1121 |
Binary I/O |
16 |
Sourcing outputs |
XT1221 |
ADC |
8 |
Differential inputs |
XT1541 |
DAC |
8 |
4 additional sourcing output BIO channels |
Documentation
HowTo
Configure Acromag XT modules
Initial configuration via USB is required before the units can be used on the network. This requires a USB-to-miniUSB cable, a Microsoft Windows (Version?) (virtual) machine, and the configuration utilities which can be downloaded from the Acromag website (login required). Each model requires a different flavor of the utility to be run. Virtual machines work with USB2.0 ports, but have issues when using USB3.0+ ports. The to-be-configured device needs to be powered by a 12-32V DC voltage source.
Configure slow controls server machine
The following has proven to work with Debian Jessie running on a Supermicro SYS-5015A-H (Intel Atom processor without 64-bit support). This guide was written after-the-fact, so some steps may be missing. When configuring the next machine the gaps will be filled.
- Fresh install of Debian Jessie (x86) with lightweight desktop environment
- Set desired SSH privileges
- Set up remote file system access
- (Optional) Add LIGO repositories
Download EPICS-base distribution, Modbus package, and Asyn drivers, install & build (if not pre-built). The (only attempted) combination of EPICS base version 3.15.5 with ASyn 4-32 and Modbus R2-10-1 has been found to work (in combination with base 3.14.12.2_long on the rest of the machines)
- Set up systemd service for automatic start of the Modbus IOC
Configure XT unit Modbus driver
# Use the following commands for TCP/IP
# drvAsynIPPortConfigure(const char *portName, # user-defined: used for subsequent referencing,
# const char *hostInfo, # format: "IP-Address:Port". Standard port for Modbus is 502
# unsigned int priority, #
# int noAutoConnect, #
# int noProcessEos); #
#
# Examples:
# drvAsynIPPortConfigure("<TCP_PORT_NAME>","<UNIT_IP_ADDRESS>:502",0,0,1)
# drvAsynIPPortConfigure("c1auxex_xt1221a","192.168.114.11:502",0,0,1)# modbusInterposeConfig(const char *portName, # reference to portName created with drvAsynIPPortConfigure command
# modbusLinkType linkType, #
# int timeoutMsec, # define timeout for waiting for response from unit
# int writeDelayMsec) #
#
# Example:
# modbusInterposeConfig("<TCP_PORT_NAME>",0,5000,0)
# modbusInterposeConfig("c1auxex_xt1221a",0,5000,0)#drvModbusAsynConfigure(portName, # used by channel definitions in .db file to reference this unit)
# tcpPortName, # reference to portName created with drvAsynIPPortConfigure command
# slaveAddress, #
# modbusFunction, # defines driver function for the unit (read register = 4, write register = 6, write single coil = 5) - see examples in next section
# modbusStartAddress, # ADC and binary channel numbering starts with 0, DAC channel numbering with 1
# modbusLength, # length in dataType units - see examples in next section
# dataType, # 4 = 16-bit signed integers (for A/D and D/A), 0 = binary (for BIO, duh)
# pollMsec, # how frequently to request a value in [ms]
# plcType); #
#
# Example:
# drvModbusAsynConfigure("<PORT_NAME>","<TCP_PORT_NAME>",0,<modbusFunction>,<modbusStartAddress>,<modbusLength>,<dataType>,<pollMsec>,"Acromag")
XT1221
drvModbusAsynConfigure("C1AUXEX_XT1221A_ADC","c1auxex_xt1221a",0,4,0,8,4,32,"Acromag")
XT1541
drvModbusAsynConfigure("C1AUXEX_XT1541A_DAC","c1auxex_xt1541a",0,6,1,8,4,32,"Acromag")
drvModbusAsynConfigure("C1AUXEX_XT1541A_BIO","c1auxex_xt1541a",0,5,0,4,0,32,"Acromag")
XT1111 & 1121
drvModbusAsynConfigure("C1AUXEX_XT1111A_BIO","c1auxex_xt1111a",0,6,0,4,0,32,"Acromag")
Define EPICS channels
Note: Modbus/TCP is simply a protocol for sending commands via TCP that the XT units can interpret, as in read/write the correct register values to/from the channels. There may be multiple ways to define the channels have the same effect. The settings reported here have been found to work as intended.
Many of the fields in the EPICS records are somewhat supplemental and not required for the channel definitions, but some have real effect in MEDM screens, such as upper limits on slider bars and the such.
XT1221
field(INP,"@asynMask(<ADC_UNIT_PORT_NAME> 0 -16)MODBUS_DATA")
XT1541
record(ao, "<AO_CHANNEL_NAME>")
{
field(DTYP,"asynInt32")
field(OUT,"@asynMask(<DAC_UNIT_PORT_NAME>, 0, -16)MODBUS_DATA")
}record(bo, "<BO_CHANNEL_NAME>")
{
field(DTYP,"asynUInt32Digital")
field(OUT,"@asynMask(<DAC_UNIT_PORT_NAME>, 3, 0x1)")
}
XT1111 & 1121
record( bo, "CHANNEL_NAME")
{
field(DTYP,"asynUInt32Digital")
field(OUT,"@asynMask(BIO0_Reg, 0, 0x1)")
}