1、分布式EPICS设置
1) 操作界面:包括shell命令行方式(caget, caput, camonitor等)和图形界面方式(medm, edm, css等)。
2)输入输出控制器(IOC)
2、IOC
1) 数据库:数据流,基本上周期运行
2)sequencer:基本上按需的状态机
"硬"IOCs运行vxWorks并且直接连接了A/D, D/A, LLRF等硬件。
"软"IOCs运行在linux等上并且除了串口或网络设备外没有I/O硬件。
3、IOC数据库
1)'IOCcore'软件装载并且执行'记录(records)'-记录配置替代了编写自定义代码。
2)所有控制系统控制箱有:GUI工具; 网络协议;硬件驱动,但基本上没有一个相当的数据库。
4、示例:基本的温度控制
任务:
1)从设备读取温度
2)根据需要接通/断开开关
3)重复
一个温控数据库:
使用VisualDCT设计的由四个记录组成的数据库:
1)模拟输入记录(ai:$(TANK)TEMPERATURE)从设备读取温度值,并且把温度值写入到calcout($(TANK)CHECK)记录。
2)calcout($(TANK)CHECK)记录是通过通道访问从$(TANK)TEMPERATURE获取当前温度和通过数据库访问从模拟输入记录ai($(TANK)SETPOINT)获取了设定温度,并且把二者进行比较,并且把比较结果写入到二进制输出记录bo($(TANK)SWITCH)。
3)二进制输出记录bo($(TANK)SWITCH)根据写入的值是0或1,向设备发出断开或者闭合开关的指令。
以下是文本数据库:
1)$(TANK)TEMPERATURE:模拟输入记录ai用于读取设备的输入。
2)$(TANK)CHECK:calcout记录用于比较输入和设定值,并且在比较结果发生变化时,输出比较结果。
3)$(TANK)SWITCH:二进制输出记录bo,向设备输出向其写入的值。
4)$(TANK)SWITCH_RBV:二进制输入记录bi,用于读取设备的开关状态。
5)$(TANK)SETPOINT:模拟输入记录ai,提供给用户设置温度设定值。
record(ai, "$(TANK)TEMPERATURE") {
field(DESC, "Read Temperature")
field(SCAN, "I/O Intr")
field(DTYP,"asynFloat64")
field(INP,"@asyn($(PT1), 0,1000)FLOAT32_BE")
field(PREC, "1")
field(LINR, "NO CONVERSION")
field(EGU, "Celsius")
field(HOPR, "100")
field(LOPR, "0")
field(SMOO, "0.5")
field(HIGH, "15")
field(HSV, "MINOR")
field(PINI, "NO")
}
record(calcout, "$(TANK)CHECK") {
field(DESC, "Control Heater")
field(CALC, "A<B")
field(INPA, "$(TANK)TEMPERATURE CP MS")
field(OUT, "$(TANK)SWITCH PP")
field(OOPT, "On Change")
field(DOPT, "Use CALC")
field(INPB, "$(TANK)SETPOINT")
}
record(bo, "$(TANK)SWITCH") {
field(DESC, "Heater Switch")
field(SCAN, "Passive")
field(DTYP,"asynUInt32Digital")
field(OUT,"@asynMask($(PT2) 0 0x1)")
field(OMSL, "supervisory")
field(ZNAM, "Open")
field(ONAM, "Closed")
field(IVOA, "Set output to IVOV")
field(IVOV, "0")
}
record(bi, "$(TANK)SWITCH_RBV") {
field(DESC, "Heater Switch Readback")
field(SCAN, "I/O Intr")
field(DTYP,"asynUInt32Digital")
field(INP,"@asynMask($(PT3) 0 0x1)")
field(ZNAM, "Open")
field(ONAM, "Closed")
}
record(ai, "$(TANK)SETPOINT") {
field(DESC, "Temperature Setpoint")
field(SCAN, "Passive")
field(INP, "10")
field(HOPR, "100")
field(LOPR, "0")
}
使用modbus-slave软件模拟设备端:
1)温度定义如下:用两个字组成一个32位大端浮点数
2) 开关定义如下:用一个线圈位模拟一个开关
启动脚本设定如下:
#!../../bin/linux-aarch64/tank
#- You may have to change tank to something else
#- everywhere it appears in this file
< envPaths
cd "${TOP}"
## Register all support components
dbLoadDatabase "dbd/tank.dbd"
tank_registerRecordDeviceDriver pdbbase
drvAsynIPPortConfigure("TANK","192.168.50.252:502",0,0,1)
#modbusInterposeConfig(const char *portName,
# modbusLinkType linkType,
# int timeoutMsec,
# int writeDelayMsec)
modbusInterposeConfig("TANK",0, 5000,0)
# one float32 input read
drvModbusAsynConfigure("PT1", "TANK&#