@[TOC]EPICS V7解析
EPICS V7协议的优势
EPICS V7通过PV Access协议和SOA架构解决了V3在复杂数据处理和分布式服务上的瓶颈,尤其适合高能物理、同步辐射光源等大规模科学装置。而V3仍在小规模实时控制场景保有优势。用户需根据数据复杂度、系统规模和资源条件选择版本,或采用混合架构过渡。
EPICS V7中的PV Access(PVA)协议相较于传统Channel Access(CA)协议,在功能、性能和适用场景上均有显著提升。以下是其核心优势总结:
一、结构化数据支持与高效序列化
-
复杂数据结构处理
PVA支持多维数组、嵌套结构(如科学实验中的图像流、设备状态集合),通过pvData
库实现动态自描述数据模型,避免传统CA协议仅能传输标量数据的局限。- 示例:高能物理实验中的GB级图像数据可通过PVA直接传输,无需拆分为多个标量字段。
-
二进制序列化优化
- 采用紧凑二进制编码(如字节对齐、增量更新),减少网络带宽消耗。
- 支持内存映射与零拷贝传输,提升实时性,实测在10G以太网下带宽利用率可达96-99%。
二、网络传输与服务架构优化
-
混合传输协议
- 主要依赖TCP保障可靠性,辅以UDP实现快速服务发现(默认端口5075/5076),平衡实时性与稳定性。
- 支持心跳机制和连接级QoS参数(如超时控制),避免因网络中断导致的数据丢失。
-
服务导向架构(SOA)
- 提供原生RPC(远程过程调用)支持,适用于分布式控制系统的参数化请求/响应场景。
- 扩展数据流服务(如持续监控、异步数据推送),满足实验装置对动态数据流的需求。
三、兼容性与系统扩展性
-
向后兼容设计
- PVA与CA协议可并行运行,允许V3和V7客户端/服务器混合部署,降低迁移成本。
- 提供
softIocPVA
等工具,支持传统IOC逐步过渡到PVA架构。
-
跨平台与工具链生态
- 支持多种操作系统(Linux、Windows、macOS)和硬件架构(x86、ARM)。
- 配套工具丰富,如
pvget
/pvput
命令行工具、PvaPy(Python绑定)和PVXS库(C++优化),提升开发效率。
四、安全与可维护性增强
-
协议版本协商
- 支持版本自动协商(如v1/v2),适应不同客户端需求,避免兼容性冲突。
-
调试与监控能力
- 提供环境变量(如
PVACCESS_DEBUG
)输出详细序列化日志,便于排查问题。 - 通过
casw
和Wireshark工具实现协议层监控,提升运维效率。
- 提供环境变量(如
五、适用场景扩展
- 科学装置与工业物联网:适用于高带宽、低延迟的大规模数据采集(如粒子加速器、同步辐射光源)。
- 实时控制系统:通过RPC和流式服务支持复杂控制逻辑,替代传统PLC通信协议。
EPICS V7与V3 协议比较
EPICS V7与V3版本的差异主要体现在协议架构、功能扩展和适用场景等方面。以下是基于历史对话和搜索结果的综合对比:
一、架构设计与核心协议
特性 | V3 | V7 |
---|---|---|
核心协议 | Channel Access (CA) | PV Access (PVA) + CA兼容 |
架构升级 | 基于UDP广播和TCP点对点通信的单层架构 | 引入中间件和服务层,形成面向服务的架构(SOA) |
数据模型 | 仅支持标量数据(数值、字符串) | 支持结构化数据(数组、图像、嵌套结构) |
二、功能扩展与性能优化
-
数据传输能力
- V3:标量数据传输效率高,但无法处理复杂结构(如多维数组)。
- V7:通过pvData实现结构化数据序列化,支持增量更新和零拷贝传输,带宽利用率可达96-99% 。
-
服务扩展性
- V3:仅支持基础监控功能,缺乏远程服务接口。
- V7:新增RPC(远程过程调用)、数据流服务,支持分布式系统集成。
-
实时性与资源消耗
- V3:低资源占用,适合小型控制系统。
- V7:需更高CPU/内存资源,但支持大规模科学装置。
三、兼容性与过渡策略
-
协议兼容性
- V7保留CA协议接口,允许V3设备与新系统混合运行。
- 提供并行运行模式(如同时支持
softIoc
和softIocPVA
)。
-
迁移路径
- 建议分阶段升级:优先在复杂数据传输场景引入PVA,逐步替换CA组件。
- 需配套工具链(如PVA Gateway)完善后方可全面替代。
四、应用场景对比
场景 | V3适用性 | V7优势 |
---|---|---|
小型实验室监控系统 | 低延迟、资源敏感场景 | 兼容但非最优 |
大型科学装置(如同步辐射光源) | 无法满足结构化数据需求 | 支持GB级图像流、RPC服务 |
工业实时控制 | 简单逻辑控制首选 | 需评估资源消耗与性能增益 |
五、开发与维护差异
-
开发复杂度
- V3:代码结构简单,但扩展性受限。
- V7:需掌握
pvData
和PVStructure
等新API,支持动态数据结构定义。
-
工具链支持
- V7提供
pvget
、pvput
等调试工具,并集成现代开发框架(如Ophyd与Bluesky Run Engine)。
- V7提供
EPICS V7 命令行工具说明
EPICS V7 的命令行工具在继承 V3 功能基础上,扩展了对 PV Access(PVA)协议 的支持,同时兼容传统 Channel Access(CA)协议 工具。以下是关键命令行工具的说明及用途分类:
一、传统 CA 协议工具(兼容 V7)
caget
- 功能:读取 PV(Process Variable)的当前值。
- 常用选项:
Usage: caget [options] <PV name> ...
-h: Help: Print this message
-V: Version: Show EPICS and CA versions
Channel Access options:
-w <sec>: Wait time, specifies CA timeout, default is 1.000000 second(s)
-c: Asynchronous get (use ca_get_callback and wait for completion)
-p <prio>: CA priority (0-99, default 0=lowest)
Format options:
Default output format is "name value"
-t: Terse mode - print only value, without name
-a: Wide mode "name timestamp value stat sevr" (read PVs as DBR_TIME_xxx)
-d <type>: Request specific dbr type; use string (DBR_ prefix may be omitted)
or number of one of the following types:
DBR_STRING 0 DBR_STS_FLOAT 9 DBR_TIME_LONG 19 DBR_CTRL_SHORT 29
DBR_INT 1 DBR_STS_ENUM 10 DBR_TIME_DOUBLE 20 DBR_CTRL_INT 29
DBR_SHORT 1 DBR_STS_CHAR 11 DBR_GR_STRING 21 DBR_CTRL_FLOAT 30
DBR_FLOAT 2 DBR_STS_LONG 12 DBR_GR_SHORT 22 DBR_CTRL_ENUM 31
DBR_ENUM 3 DBR_STS_DOUBLE 13 DBR_GR_INT 22 DBR_CTRL_CHAR 32
DBR_CHAR 4 DBR_TIME_STRING 14 DBR_GR_FLOAT 23 DBR_CTRL_LONG 33
DBR_LONG 5 DBR_TIME_INT 15 DBR_GR_ENUM 24 DBR_CTRL_DOUBLE 34
DBR_DOUBLE 6 DBR_TIME_SHORT 15 DBR_GR_CHAR 25 DBR_STSACK_STRING 37
DBR_STS_STRING 7 DBR_TIME_FLOAT 16 DBR_GR_LONG 26 DBR_CLASS_NAME 38
DBR_STS_SHORT 8 DBR_TIME_ENUM 17 DBR_GR_DOUBLE 27
DBR_STS_INT 8 DBR_TIME_CHAR 18 DBR_CTRL_STRING 28
Enum format:
-n: Print DBF_ENUM value as number (default is enum string)
Arrays: Value format: print number of requested values, then list of values
Default: Print all values
-# <count>: Print first <count> elements of an array
-S: Print array of char as a string (long string)
Floating point type format:
Default: Use %g format
-e <nr>: Use %e format, with a precision of <nr> digits
-f <nr>: Use %f format, with a precision of <nr> digits
-g <nr>: Use %g format, with a precision of <nr> digits
-s: Get value as string (honors server-side precision)
-lx: Round to long integer and print as hex number
-lo: Round to long integer and print as octal number
-lb: Round to long integer and print as binary number
Integer number format:
Default: Print as decimal number
-0x: Print as hex number
-0o: Print as octal number
-0b: Print as binary number
Alternate output field separator:
-F <ofs>: Use <ofs> as an alternate output field separator
Example: caget -a -f8 my_channel another_channel
(uses wide output format, doubles are printed as %f with precision of 8)
- 支持数据类型:标量、数组(需配合
-#
参数限制输出元素数量)。
caput
- 功能:向 PV 写入值。
- 示例:
Usage: caput [options] <PV name> <PV value> ...
caput -a [options] <PV name> <no of values> <PV value> ...
-h: Help: Print this message
-V: Version: Show EPICS and CA versions
Channel Access options:
-w <sec>: Wait time, specifies CA timeout, default is 1.000000 second(s)
-c: Asynchronous put (use ca_put_callback and wait for completion)
-p <prio>: CA priority (0-99, default 0=lowest)
Format options:
-t: Terse mode - print only sucessfully written value, without name
-l: Long mode "name timestamp value stat sevr" (read PVs as DBR_TIME_xxx)
Enum format:
Default: Auto - try value as ENUM string, then as index number
-n: Force interpretation of values as numbers
-s: Force interpretation of values as strings
Arrays:
Default: Put scalar
Value format: all value arguments concatenated with spaces
-S: Put string as an array of chars (long string)
-a: Put array
Value format: number of values, then list of values
Alternate output field separator:
-F <ofs>: Use <ofs> as an alternate output field separator
Example: caput my_channel 1.2
(puts 1.2 to my_channel)
ca_test
- 功能:该工具主要用于验证EPICS的Channel Access通信是否正常,例如测试进程变量(PV)的读写、监控和数据传输。
- 用法:
ca_test "PV名称" #读测试 ca_test "PV名称" "PV值" #写测试
- 示例:
PS C:\Users\Hanlf> ca_test.exe Hanlf:cirlce:x
Not Found Hanlf:cirlce:x #变量不存在
name: Hanlf:circle:x #变量名称
native type: DBR_DOUBLE #变量类型
native count: 1 #变量个数
DBR_STRING -0.985 #各种类型读值
DBR_SHORT 0
DBR_FLOAT -0.9848
DBR_ENUM 0
DBR_CHAR 0
DBR_LONG 0
DBR_DOUBLE -0.9848
DBR_STS_STRING 0 0 Value: -0.985
DBR_STS_SHORT 0 0 Value: 0
DBR_STS_FLOAT 0 0 Value: -0.9848
DBR_STS_ENUM 0 0 Value: 0
DBR_STS_CHAR 0 0 Value: 0
DBR_STS_LONG 0 0 Value: 0
DBR_STS_DOUBLE 0 0 Value: -0.9848
DBR_TIME_STRING 0 0 TimeStamp: 2025/03/25 10:30:07.366608 Value: -0.985
DBR_TIME_SHORT 0 0 TimeStamp: 2025/03/25 10:30:07.366608 Value: 0
DBR_TIME_FLOAT 0 0 TimeStamp: 2025/03/25 10:30:07.366608 Value: -0.9848
DBR_TIME_ENUM 0 0 TimeStamp: 2025/03/25 10:30:07.366608 Value: 0
DBR_TIME_CHAR 0 0 TimeStamp: 2025/03/25 10:30:07.366608 Value: 0
DBR_TIME_LONG 0 0 TimeStamp: 2025/03/25 10:30:07.366608 Value: 0
DBR_TIME_DOUBLE 0 0 TimeStamp: 2025/03/25 10:30:07.366608 Value: -0.9848
DBR_GR_STRING 0 0 Value: -0.985
DBR_GR_SHORT 0 0
0 0 0 0 0 0 Value: 0
DBR_GR_FLOAT 0 0 3
0.000 0.000 nan nan nan nan Value: -0.9848
DBR_GR_ENUM 0 0 Value: 0
DBR_GR_CHAR 0 0
0 0 0 0 0 0 Value: 0
DBR_GR_LONG 0 0
0 0 0 0 0 0 Value: 0
DBR_GR_DOUBLE 0 0 3
0.000 0.000 nan nan nan nan Value: -0.9848
DBR_CTRL_STRING 0 0 Value: -0.985
DBR_CTRL_SHORT 0 0
0 0 0 0 0 0 0 0 Value: 0
DBR_CTRL_FLOAT 0 0 3
0.000 0.000 nan nan nan nan 0.000 0.000 Value: -0.9848
DBR_CTRL_ENUM 0 0 Value: 0
DBR_CTRL_CHAR 0 0
0 0 0 0 0 0 0 0 Value: 0
DBR_CTRL_LONG 0 0
0 0 0 0 0 0 0 0 Value: 0
DBR_CTRL_DOUBLE 0 0 3
0.000 0.000 nan nan nan nan 0.000 0.000 Value: -0.984808
DBR_STSACK_STRING 0 0 1 0 -0.985
DBR_CLASS_NAME calc
PS C:\Users\Hanlf> ca_test.exe Hanlf:circle:period 2 #写测试
name: Hanlf:circle:period
native type: 6
native count: 1
DBR_STRING 2
DBR_SHORT 2
DBR_ENUM 2
DBR_CHAR 2
DBR_LONG 2
DBR_FLOAT 2.0000
DBR_DOUBLE 2.0000
caEventRate
- 功能:统计 PV 事件更新速率(适用于监控高频数据流)。
- 用法:
caEventRate "PV名称" 10 # 订阅10次
- 示例:
caEventRate.exe Hanlf:circle:x
Connecting to CA Channel "Hanlf:circle:x" 1 times. done(0.056113 sec). #链接时间
Subscribing 1 times. done(0.000047 sec). #订阅时间
Waiting for initial value events. done(0.013684 sec). #Value事件等待时间
CA Event Rate (Hz): current 0.99984 mean 0.99984 std dev 0 #事件率更新(当前值、平均值、偏差)
CA Event Rate (Hz): current 1.49232 mean 1.24608 std dev 0.246238
CA Event Rate (Hz): current 0.999591 mean 1.16392 std dev 0.232214
CA Event Rate (Hz): current 0.874057 mean 1.09145 std dev 0.237057
CA Event Rate (Hz): current 0.99972 mean 1.0731 std dev 0.215182
CA Event Rate (Hz): current 0.99944 mean 1.06083 std dev 0.198342
二、新增 PVA 协议终端工具(V7 核心)
pvget
- 功能:通过 PVA 协议获取结构化数据(支持嵌套字段和数组)。
- 用法:
Usage: pvget [options] <PV name>...
options:
-h: Help: Print this message
-V: Print version and exit
-r <pv request>: Request, specifies what fields to return and options, default is ''
-w <sec>: Wait time, specifies timeout, default is 5.000000 second(s)
-p <provider>: Set default provider name, default is 'pva'
-M <raw|nt|json>: Output mode. default is 'nt'
-v: Show entire structure (implies Raw mode)
-q: Quiet mode, print only error messages
-d: Enable debug output
deprecated options:
-q, -t, -i, -n, -F: ignored
-f <input file>: errors
Output details:
-m -v: Monitor in Raw mode. Print only fields marked as changed.
-m -vv: Monitor in Raw mode. Highlight fields marked as changed, show all valid fields.
-m -vvv: Monitor in Raw mode. Highlight fields marked as changed, show all fields.
-vv: Get in Raw mode. Highlight valid fields, show all fields.
example: pvget double01
- 用法:
PS C:\Users\Hanlf>pvget -M json Hanlf:circle:x #以json格式输出结果
Hanlf:circle:x {value:-0.89879404629916715,alarm:{severity:0,status:0,message:"NO_ALARM"},timeStamp:{secondsPastEpoch:1742881462,nanoseconds:977292228,userTag:0},display:{limitLow:0.0,limitHigh:0.0,description:"",units:"",precision:3,form:{index:0,choices:["Default","String","Binary","Decimal","Hex","Exponential","Engineering"]}},control:{limitLow:0.0,limitHigh:0.0,minStep:0.0},valueAlarm:{active:false,lowAlarmLimit:NaN,lowWarningLimit:NaN,highWarningLimit:NaN,highAlarmLimit:NaN,lowAlarmSeverity:0,lowWarningSeverity:0,highWarningSeverity:0,highAlarmSeverity:0,hysteresis:0}}
pvput
- 功能:向 PV 写入结构化数据,支持复杂数据类型(如 JSON 格式输入)。
- 用法:
Usage: pvput [options] <PV name> <value>
pvput [options] <PV name> <size/ignored> <value> [<value> ...]
pvput [options] <PV name> <field>=<value> ...
pvput [options] <PV name> <json_array>
pvput [options] <PV name> <json_map>
options:
-h: Help: Print this message
-V: Print version and exit
-r <pv request>: Request, specifies what fields to return and options, default is ''
-w <sec>: Wait time, specifies timeout, default is 5.000000 second(s)
-p <provider>: Set default provider name, default is 'pva'
-M <raw|nt|json>: Output mode. default is 'nt'
-v: Show entire structure (implies Raw mode)
-q: Quiet mode, print only error messages
-d: Enable debug output
Deprecated options:
default: Auto - try value as enum string, then as index number
-n, -s, -F, -t: ignored
-f <input file>: error
JSON support is present
Examples:
pvput double01 1.234 # shorthand
pvput double01 value=1.234
pvput arr:pv X 1.0 2.0 # shorthand (X is arbitrary and ignored)
pvput arr:pv "[1.0, 2.0]" # shorthand
pvput arr:pv value="[1.0, 2.0]"
Field values may be given with JSON syntax.
Complete structure
pvput double01 '{"value":1.234}'
Sub-structure(s)
pvput group:pv some='{"value":1.234}' other='{"value":"a string"}'
- 示例:
PS C:\Users\Hanlf> pvput Hanlf:circle:period '{"value":2}' # 写入JSON格式数据
Old : 2025-03-25 10:40:43.241 1
New : 2025-03-25 15:55:51.209 2
pvlist
- 功能:列出所有通过 PVA 协议发布的 PV。
- 用法:
options:
-h: Help: Print this message
-V: Print version and exit
-i Print server info (when server address list/GUID is given)
-w <sec>: Wait time, specifies timeout, default is 3.000000 second(s)
-q: Quiet mode, print only error messages
-d: Enable debug output
examples:
pvlist
pvlist ioc0001
pvlist 10.5.1.205:10000
pvlist 0x83DE3C540000000000BF351F
- 示例:
PS C:\Users\Hanlf> pvlist #网络内
GUID 0xA011E26700000000FC8FC724 version 2: tcp@[ 10.12.20.23:5075 169.254.23.42:5075 ]
PS C:\Users\Hanlf> pvlist 10.12.20.23
Hanlf:aSubExample
Hanlf:line:b
Hanlf:aiExample
Hanlf:aiExample1
Hanlf:ai1
Hanlf:aiExample2
Hanlf:ai2
Hanlf:aiExample3
Hanlf:ai3
Hanlf:circle:step
Hanlf:circle:period
Hanlf:circle:angle
Hanlf:line:a
Hanlf:circle:x
Hanlf:circle:y
Hanlf:calcExample
Hanlf:calcExample1
Hanlf:calc1
Hanlf:calcExample2
Hanlf:calc2
Hanlf:calcExample3
Hanlf:calc3
Hanlf:circle:tick
Hanlf:compressExample
Hanlf:example:version
Hanlf:subExample
Hanlf:xxxExample
Hanlf:circle
Hanlf:line
pvcall
- 功能:基于EPICS 7中引入的pvAccess协议实现的客户端工具,用于执行远程过程调用(ChannelRPC)。与传统的Channel Access相比,pvAccess支持更高效的结构化数据传输和原子化操作。主要用于向EPICS IOC(输入输出控制器)中的服务发送请求(Request)并接收响应(Response),例如执行数据库操作、设备校准等需要参数化交互的场景。
- 示例:
pvcall -r "服务名:方法名" "请求数据(JSON格式)"
三、调试与监控工具
casw
- 功能:监控 CA 服务器信标异常(如网络中断或服务器重启事件)。
- 用法:
casw -i 2 # 设置日志级别为2,输出详细信标信息
- 示例:
PS C:\Users\Hanlf> casw.exe -i 2
HANLF-PC:5064 2025-03-25 15:59:00.684570300
HANLF-PC:5064 2025-03-25 15:59:00.706658300
HANLF-PC:5064 2025-03-25 15:59:15.712367870
HANLF-PC:5064 2025-03-25 15:59:15.716828115
pvx
- 功能:交互式调试工具,支持动态查询和操作 PV 数据(类似 Python Shell)。
- 示例:
>>> pv = connect("PV名称") >>> pv.value # 读取数值字段
四、工具链对比(CA vs PVA)
工具 | 协议 | 数据类型支持 | 典型用途 |
---|---|---|---|
caget | CA | 标量、简单数组 | 传统控制系统监控 |
pvget | PVA | 嵌套结构、多维数组 | 科学实验数据流处理 |
caput | CA | 基础类型写入 | 设备参数配置 |
pvcall | PVA | 结构化请求/响应 | 分布式服务调用 |
五、使用建议
-
协议选择:
- 若需传输图像或复杂结构数据,优先使用 PVA 工具(如
pvget
)。 - 传统标量监控场景可沿用 CA 工具(如
caget
)。
- 若需传输图像或复杂结构数据,优先使用 PVA 工具(如
-
调试技巧:
- 设置环境变量
PVACCESS_DEBUG=3
可输出 PVA 协议详细交互日志。 - 使用
pvx
工具动态探索数据字段结构。
- 设置环境变量
更多完整命令参数可参考 EPICS 官方文档 ,或通过 工具名称 -h
查看帮助信息。