EPICS V7解析(一)

@[TOC]EPICS V7解析

EPICS V7协议的优势

EPICS V7通过PV Access协议和SOA架构解决了V3在复杂数据处理和分布式服务上的瓶颈,尤其适合高能物理、同步辐射光源等大规模科学装置。而V3仍在小规模实时控制场景保有优势。用户需根据数据复杂度、系统规模和资源条件选择版本,或采用混合架构过渡。

EPICS V7中的PV Access(PVA)协议相较于传统Channel Access(CA)协议,在功能、性能和适用场景上均有显著提升。以下是其核心优势总结:


一、结构化数据支持与高效序列化

  1. 复杂数据结构处理
    PVA支持多维数组、嵌套结构(如科学实验中的图像流、设备状态集合),通过pvData库实现动态自描述数据模型,避免传统CA协议仅能传输标量数据的局限。

    • 示例:高能物理实验中的GB级图像数据可通过PVA直接传输,无需拆分为多个标量字段。
  2. 二进制序列化优化

    • 采用紧凑二进制编码(如字节对齐、增量更新),减少网络带宽消耗。
    • 支持内存映射与零拷贝传输,提升实时性,实测在10G以太网下带宽利用率可达96-99%。

二、网络传输与服务架构优化

  1. 混合传输协议

    • 主要依赖TCP保障可靠性,辅以UDP实现快速服务发现(默认端口5075/5076),平衡实时性与稳定性。
    • 支持心跳机制和连接级QoS参数(如超时控制),避免因网络中断导致的数据丢失。
  2. 服务导向架构(SOA)

    • 提供原生RPC(远程过程调用)支持,适用于分布式控制系统的参数化请求/响应场景。
    • 扩展数据流服务(如持续监控、异步数据推送),满足实验装置对动态数据流的需求。

三、兼容性与系统扩展性

  1. 向后兼容设计

    • PVA与CA协议可并行运行,允许V3和V7客户端/服务器混合部署,降低迁移成本。
    • 提供softIocPVA等工具,支持传统IOC逐步过渡到PVA架构。
  2. 跨平台与工具链生态

    • 支持多种操作系统(Linux、Windows、macOS)和硬件架构(x86、ARM)。
    • 配套工具丰富,如pvget/pvput命令行工具、PvaPy(Python绑定)和PVXS库(C++优化),提升开发效率。

四、安全与可维护性增强

  1. 协议版本协商

    • 支持版本自动协商(如v1/v2),适应不同客户端需求,避免兼容性冲突。
  2. 调试与监控能力

    • 提供环境变量(如PVACCESS_DEBUG)输出详细序列化日志,便于排查问题。
    • 通过casw和Wireshark工具实现协议层监控,提升运维效率。

五、适用场景扩展

  • 科学装置与工业物联网:适用于高带宽、低延迟的大规模数据采集(如粒子加速器、同步辐射光源)。
  • 实时控制系统:通过RPC和流式服务支持复杂控制逻辑,替代传统PLC通信协议。

EPICS V7与V3 协议比较

EPICS V7与V3版本的差异主要体现在协议架构、功能扩展和适用场景等方面。以下是基于历史对话和搜索结果的综合对比:


一、架构设计与核心协议

特性V3V7
核心协议Channel Access (CA)PV Access (PVA) + CA兼容
架构升级基于UDP广播和TCP点对点通信的单层架构引入中间件和服务层,形成面向服务的架构(SOA)
数据模型仅支持标量数据(数值、字符串)支持结构化数据(数组、图像、嵌套结构)

二、功能扩展与性能优化

  1. 数据传输能力

    • V3:标量数据传输效率高,但无法处理复杂结构(如多维数组)。
    • V7:通过pvData实现结构化数据序列化,支持增量更新和零拷贝传输,带宽利用率可达96-99% 。
  2. 服务扩展性

    • V3:仅支持基础监控功能,缺乏远程服务接口。
    • V7:新增RPC(远程过程调用)、数据流服务,支持分布式系统集成。
  3. 实时性与资源消耗

    • V3:低资源占用,适合小型控制系统。
    • V7:需更高CPU/内存资源,但支持大规模科学装置。

三、兼容性与过渡策略

  1. 协议兼容性

    • V7保留CA协议接口,允许V3设备与新系统混合运行。
    • 提供并行运行模式(如同时支持softIocsoftIocPVA)。
  2. 迁移路径

    • 建议分阶段升级:优先在复杂数据传输场景引入PVA,逐步替换CA组件。
    • 需配套工具链(如PVA Gateway)完善后方可全面替代。

四、应用场景对比

场景V3适用性V7优势
小型实验室监控系统低延迟、资源敏感场景兼容但非最优
大型科学装置(如同步辐射光源)无法满足结构化数据需求支持GB级图像流、RPC服务
工业实时控制简单逻辑控制首选需评估资源消耗与性能增益

五、开发与维护差异

  1. 开发复杂度

    • V3:代码结构简单,但扩展性受限。
    • V7:需掌握pvDataPVStructure等新API,支持动态数据结构定义。
  2. 工具链支持

    • V7提供pvgetpvput等调试工具,并集成现代开发框架(如Ophyd与Bluesky Run Engine)。

EPICS V7 命令行工具说明

EPICS V7 的命令行工具在继承 V3 功能基础上,扩展了对 PV Access(PVA)协议 的支持,同时兼容传统 Channel Access(CA)协议 工具。以下是关键命令行工具的说明及用途分类:


一、传统 CA 协议工具(兼容 V7)

  1. 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)
  • 支持数据类型:标量、数组(需配合 -# 参数限制输出元素数量)。
  1. 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)
  1. 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
  1. 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 核心)

  1. 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}}
  1. 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
  1. 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
  1. pvcall
    • 功能:基于EPICS 7中引入的pvAccess协议实现的客户端工具,用于执行远程过程调用(ChannelRPC)。与传统的Channel Access相比,pvAccess支持更高效的结构化数据传输和原子化操作。主要用于向EPICS IOC(输入输出控制器)中的服务发送请求(Request)并接收响应(Response),例如执行数据库操作、设备校准等需要参数化交互的场景。
    • 示例:
  pvcall -r "服务名:方法名" "请求数据(JSON格式)"

三、调试与监控工具

  1. 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
  1. pvx
    • 功能:交互式调试工具,支持动态查询和操作 PV 数据(类似 Python Shell)。
    • 示例:
      >>> pv = connect("PV名称")  
      >>> pv.value  # 读取数值字段  
      

四、工具链对比(CA vs PVA)

工具协议数据类型支持典型用途
cagetCA标量、简单数组传统控制系统监控
pvgetPVA嵌套结构、多维数组科学实验数据流处理
caputCA基础类型写入设备参数配置
pvcallPVA结构化请求/响应分布式服务调用

五、使用建议

  1. 协议选择:

    • 若需传输图像或复杂结构数据,优先使用 PVA 工具(如 pvget)。
    • 传统标量监控场景可沿用 CA 工具(如 caget)。
  2. 调试技巧:

    • 设置环境变量 PVACCESS_DEBUG=3 可输出 PVA 协议详细交互日志。
    • 使用 pvx 工具动态探索数据字段结构。

更多完整命令参数可参考 EPICS 官方文档 ,或通过 工具名称 -h 查看帮助信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值