• 字符串输出记录(stringout/lso)


    这个stringout记录用于写一个最长40个字符的任意ASCII串到其它记录或者软件变量。

    参数字段

    以下描述了记录特定的字段,按功能分组。

    扫描参数

    字符串输出记录有用于指定在什么情况下运行它的标准字段。这些字段在Scan Fields中列出。

    所需输出参数

    字符输出记录必须指定它从哪个获取其输出的字符串。决定所需输出源自哪里的第一个字段是输出模式选择(OMSL)字段,它可以有两个可能的值:closed_loop或supervisory。如果指定supervisory,忽略DOL,写VAL的当前值,并且在运行时通过dbPuts外部地修改这个VAL。如果指定closed_loop,从在所需输出链接字段(DOL)中指定的地址获取VAL字段的值,其可以是一个数据库链接或者一个通道访问链接。

    DOL也可以是一个常数,在此情况下,VAL将被初始化成这个常数值。但要被解析成一个常数而不是一个CA链接,这个常数只能是数值,因此最好通过直接设置VAL字段初始化字符串输出记录。注意:如果DOL是一个常数,OMSL不能是closed_loop。

    输出格式

    在OUT字段中指定的输出链接指定了字符串输出记录要写它的字符串到哪里。这个链接可以是数据库或通道访问链接。如果OUT字段是一个常数,将不写输出。

    另外,必须在DTYP字段中输入合适的设备支持模块。

    用于监视的参数

     这些参数用于指定monitor()例程合适应该发送monitor post。有两种可能的选择:

    菜单stringoutPOST

     APST用于存档monitors,而MPST用于所有其它类型monitors。

    操作显示参数

    这些参数用于向操作者显示有意思数据。这些字段用于以文本或图形显示这个字符串输出记录的值和其它参数。

    有关记录名(NAME)和描述(DESC)字段的更多信息见Fields Common to All Record Types。

    运行时参数

    这个字符串输出记录的老值字段(OVAL)用于为VAL实现值变化monitors。如果VAL不等于OVAL,则触发monitors。

    仿真模拟参数

     以下字段用于在仿真模式中操作这个记录。

    如果SIMM(通过SIML获取)是YES,记录被置入SIMS严重性并且通过SIOL写这个值。SSCN设置一个在仿真模式中使用的不同SCAN机制。SDLY设置一个延时,其用于异步仿真运行。

    有关仿真模式和其字段的更多信息见Output Simulation Fields。

    警报参数

    用于字符串输出记录的可能警报条件是SCAN, READ和INVALID警报。前两个警报的严重性总是MAJOR,并且是不可配置的。

    IVOA字段指定了在触发INVALID警报时要采取的操作。当Set output to IVOV,在一个警报状况时,在IVOV字段中包含的值被写到输出链接。有关IOVA和IVOV字段的更多信息见Invalid Output Action Fields。

    记录支持

    记录支持例程

     1) init_record

     long (*init_record)(struct dbCommon *precord, int pass)

    如果SIML是一个常数,初始化SIMM,或者如果SIML是PV_LINK,创建一个通道访问链接。如果SIOL是PV_LINK,创建一个通道访问链接。

    这个例程接着检查设备支持是否存在。这个例程接着检查设备支持写例程是否被定义。如果二者中有一个不存在,发出一条错误消息并且终止运行的process。

    如果DOL是一个常数,则类型double常数,如果非零,被转换成一个字符串并且被存储到VAL并且UDF被设置成FALSE。如果DOL类型是PV_LINK,则调用dbCaAddInlink创建要给通道访问链接。

    如果设备支持包含init_record,调用它。

    2) process

    long (*process)(struct dbCommon *precord)

    记录运行

    例程process实现了以下算法:

    1) 检查合适的设备支持模块是否存在。如果它不存在,发出一条错误消息并且用PACT仍然设置为TRUE,终止正在运行的process。这确保了不再为这个记录调用process。因而将不发生错误风暴。

    2) 如果PACT是FALSE,并且OSML是CLOSED_LOOP,调用recGblGetLinkValue读取VAL当前值。如果recGblGetLinkValue的返回状态是0,则UDF被设置成FALSE。

    3) 检查严重性并且写这个新值。

    4) 如果PACT已经被更改为TRUE,设备支持写输出例程已经启动,但还未结束写这个新值。在这种情况中,运行的process仅返回,保留PACT为TRUE。

    5) 检查是否应该调用monitors

    • 如果警报状态或严重性已经变化,调用警报monitors。
    • 如果OVAL不等于VAL,存档和值变量monitors被调用。
    • 重置NSEV和NSTA为0。

    6) 如果需要,扫描forward链接,设置PACT为FASLE,并且返回。

    设备支持

    与设备支持有关的字段

    每个字符串输出记录必须有一个相关联的设备支持例程集。设备支持的首要功能是在调用write_stringout时要写一个新值。设置支持例程主要使用以下字段:

    设备支持例程

    设备支持由以下例程组成:

    1) report

      long report(int level)

    这个可选的例程被IOC命令dbior调用,并且被传递由使用者请求的报告等级。它应该打印设备支持的状态到stdout。level参数可以用于用更高级别输出更详细的信息,或者用不同级别选择不同信息类型。级别0应该只打印一小段概述。 

    2) init

      long init(int after)

    这个可选例程在IOC初始化时被调用两次。第一次调用用整数参数after设为0在进行任何init_record()调用前发生。第二次调用在after设置为1在进行完所有init_record()调用后发生。

    3) init_record

     long init_record(dbCommon *prec)

    这个例程是可选的。如果提供了,它被记录支持init_record()例程调用。

    4) get_ioint_info

    long get_ioint_info(int cmd, dbCommon *precord, IOSCANPVT *ppvt)

    在这个记录每次被添加到一个I/O事件扫描列表或者被从此扫描列表中删除时,此例程被ioEventScan系统调用。根据这个记录是被添加到或者被从一个I/O事件列表删除,cmd有值(0,1)。必须为使用ioEvent扫描器的任何设备类型提供它。 

    5) write_stringout

      long write_stringout(stringoutRecord *prec)

    这个例程必须输出一个新值。它返回以下值:

    • 0:成功
    • 其它:错误

    软记录的设备支持

    Soft Channel设备支持模块写VAL的当前值。

    为写值到stdout, stderr或errlog流提供了DTYP为stdio的设备支持。在OUT链接字段使用@stdout, @stderr或@errlog来选取所需的流。

    长字符串输出记录(lso)

    长字符串输出记录用于写一个最大长度为65535个字符的任意ASCII串。

    所需输出参数

    在VAL中字符最大数目是由SIVZ指定,并且不能大于65536.

    运行时参数

     长字符串输出记录的旧值字段(OVAL)用于实现VAL的值变化monitors。如果VAL不等于OVAL,则触发monitors。LEN包含了在VAL中字符串的长度,OLEN包含在OVAL字段中字符串长度。

    示例:

    数据库文件:

    1. record(stringin, "$(USER):ReadString")
    2. {
    3. field(SCAN, "Passive")
    4. field(DTYP, "Soft Channel")
    5. field(INP, "Hello World")
    6. field(FLNK, "$(USER):WriteString.PROC")
    7. }
    8. record(stringout, "$(USER):WriteString")
    9. {
    10. field(SCAN, "Passive")
    11. field(DOL, "$(USER):ReadString.VAL")
    12. field(OMSL, "closed_loop")
    13. field(DTYP, "stdio")
    14. field(OUT, "@stdout")
    15. }
    16. record(lsi, "$(USER):ReadLString")
    17. {
    18. field(SCAN, "Passive")
    19. field(DTYP, "Soft Channel")
    20. field(INP, "Hello World")
    21. field(SIZV, "100")
    22. field(FLNK, "$(USER):WriteLString.PROC")
    23. }
    24. record(lso, "$(USER):WriteLString")
    25. {
    26. field(SCAN, "Passive")
    27. field(DOL, "$(USER):ReadLString.VAL")
    28. field(OMSL, "closed_loop")
    29. field(SIZV, "100")
    30. field(DTYP, "stdio")
    31. field(OUT, "@stdout")
    32. }

    加载以上数据库文件,另开一个终端进行测试:

    1) 测试类型为stringout的记录:

    1. [blctrl@main-machine ~]$ caput -s blctrl:ReadString "Good morning"
    2. Old : blctrl:ReadString Hello World
    3. New : blctrl:ReadString Good morning

    EPICS IOC提示符窗口中,输出Hello EPICS

    2) 测试类型为lso的记录:

    [blctrl@main-machine ~]$ caput -s blctrl:ReadLString "Hello EPICS Hello EPICS Hello EPICS Hello EPICS Hello EPICS Hello EPICS blctrl:ReadString"
    

    EPICS IOC提示符窗口中,输出如下:Hello EPICS Hello EPICS Hello EPICS Hel

    没有输出写入的完整字符串,再查看SIZV和LEN字段,结果如下:

    1. [blctrl@main-machine ~]$ caget blctrl:ReadLString.SIZV
    2. blctrl:ReadLString.SIZV 100
    3. [blctrl@main-machine ~]$ caget blctrl:ReadLString.LEN
    4. blctrl:ReadLString.LEN 40

    发现从命令行中lsi记录的字符串长度为40,它只读入了40个字符。

    lsi和lso中字符串长度受限的问题出在哪里?

  • 相关阅读:
    GPU驱动安装,CUDA安装相关问题
    AI艺术的背后:详解文本生成图像模型【基于GAN】
    8.6 枚举类型
    深入解析Python执行定时任务:从基础到高级
    2万字带你从0到1搭建一套企业级微服务安全框架
    垃圾分类热词获取易语言代码
    Django后台忘记管理员的账号
    零基础自学黑客【网络安全】啃完这些足够了
    行测-图形推理-2-黑白格类
    基于SSM养老院管理系统毕业设计-附源码221609
  • 原文地址:https://blog.csdn.net/yuyuyuliang00/article/details/127590857