0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用RDREC读取诊断数据记录的编程示例

机器人及PLC自动化应用 来源:机器人及PLC自动化应用 2023-07-24 15:59 次阅读

简介

在以下示例中,可通过 RDREC 读取 IO 设备的诊断数据记录“16#E00A”。触发断路时,系统将错误信息输出为一条诊断数据记录。

说明
诊断数据记录的数目
对于该 IO 设备,模块上每个触发错误的插槽都将生成自己的数据记录。因此,诊断信息中可包含多条记录。
在该示例中,将读取多个模块的多个硬件错误(通道错误),并将这些错误复制到存储器数组的相应结构中。根据指定的设置,存储器数组(“recordA”、“recordB”)最多可包含 6 条数据记录、16 个通道。

77eb862e-29f6-11ee-a368-dac502259ad0.png

要求

安装的硬件

需安装以下硬件设备:

一个 IO 控制器(如,S7-1513-1 PN)

一个 IO 设备(如,ET 200MP IM 155-5 PN HF)

一个或多个高性能型的数字量输出模块(如,DQ 4x24VDC HF)

说明
触发断路
确保触发断路的 DQ 模块通道未接线。
说明
硬件配置的操作步骤
要进行硬件配置,请按以下步骤操作:
通过 PROFINET 连接 CPU 和 IO,并将 CPU 分配给 IO 设备作为 IO 控制器。
打开相应 DQ 模块的路径“属性 > 输出 0-x > 输出 > 通道 0-y”(Properties > Output 0-x > Outputs > Channel 0-y)。
选择待组态的每个通道,然后在“诊断”("Diagnostics) 区域中选中“断路”(Wire break) 选项。

创建 PLC 数据类型

要传输和存储数据,需要以下 PLC 数据类型:

说明
数组的大小
如果要更改数组的大小(用于读取存储器、数据记录或通道),则需执行以下操作:
通道:在 PLC 数据类型(“RECdiag_0100”、“RECdiag_0101”)中修改数组的大小(“Array[0..y] of USI_v..”)。在 gDB 中修改“maxChannelPos”值。
数据记录:在 gDB 中修改数组的大小(“recordA”、“recordB”)。在 gDB 中修改“maxRecordPos”值。
读取存储器(“recordBYTE”):在 gDB 中修改数组的大小(“recordBYTE”)和“maxPosition”的值。请注意,诊断数据记录“16#E00A”的最大总长度为 4176 个字节。

创建监控表

要触发断路,需使用监控表的“强制”(Force) 功能。

例如,如果要将输出“%QW0”的值强制为“16#FFFF”,则所有组态有断路的通道可使用该输出触发一个硬件错误。

数据的存储

创建以下变量和结构,将数据存储在一个全局数据块 (gDB) 中:

78976d04-29f6-11ee-a368-dac502259ad0.png

读取 IO 设备前端模块的硬件标识符,并使用“id”变量进行存储。通过“PLC 变量 > 系统常量”(PLC tags > System constants) 以及 等条目,可查找到前端模块的硬件标识符。所用的数据类型为“HW_SubModule”。

函数“SLI_FC_start_RDiag”:参数互连

要启动“RDREC”指令,可根据硬件故障创建函数“SLI_FC_start_RDiag”。

在 FC 中创建以下互连。

78b436aa-29f6-11ee-a368-dac502259ad0.png

在诊断中断 OB (OB82) 中,调用函数“SLI_FC_start_RDiag”。

函数“SLI_FC_reset_RDiag”:参数互连

要在发生错误后复位过程值,需创建函数“SLI_FC_reset_RDiag”。

在 FC 中创建以下局部变量。

78c5beac-29f6-11ee-a368-dac502259ad0.png

在 FC 中创建以下互连。

程序段 1:要复位过程值,需创建以下互连。第 1 部分:

78d62ecc-29f6-11ee-a368-dac502259ad0.png

第 2 部分:

78efc5d0-29f6-11ee-a368-dac502259ad0.png

第 3 部分:

7908c2f6-29f6-11ee-a368-dac502259ad0.png

第 4 部分:

7923ecf2-29f6-11ee-a368-dac502259ad0.png

程序段 2:要复位“reset”变量,需创建以下互连。

7931f496-29f6-11ee-a368-dac502259ad0.png

函数块“SLI_FB_chooseStruct_RDiag”:参数互连

创建函数块“SLI_FB_chooseStruct_RDiag”,选择相应的数据记录结构,并将数据复制到数组中的指定位置。

更多信息,请参见“程序段 6”的“结果”(Result) 部分或该程序段的注释字段(参见“程序代码”)。

函数块“SLI_FB_RDREC_Diag”:参数互连

创建函数块“SLI_FC_start_RDiag”,调用并处理“RDREC”指令以及所有其它后续进程。

在该函数块中创建以下局部变量。

793f0e38-29f6-11ee-a368-dac502259ad0.png

在该 FB 中创建以下互连:

程序段 1:调用函数“SLI_FC_reset_RDiag”并创建名为“RDREC”的“Label”指令。

7951fcf0-29f6-11ee-a368-dac502259ad0.png

程序段 2:互连“RDREC”指令的参数,如下所示:

7964c81c-29f6-11ee-a368-dac502259ad0.png

程序段 3:发生 RDREC 错误时,如果要保存该状态,则需进行参数互连,如下所示

7979a994-29f6-11ee-a368-dac502259ad0.png

程序段 4:要结束 RDREC 的执行,需创建以下互连。

7991d10e-29f6-11ee-a368-dac502259ad0.png

程序段 5:要跳转回程序段 1,需创建以下互连。

79a446f4-29f6-11ee-a368-dac502259ad0.png

程序段 6:调用函数块“SLI_FB_chooseStruct_RDiag”,如下所示。

79b166f4-29f6-11ee-a368-dac502259ad0.png

在循环 OB (OB1) 中调用函数块“SLI_FB_RDREC_Diag”。

事件 FB“SLI_FB_RDREC_Diag”

程序段 1:

如果常开触点(“reset”)的信号状态为“TRUE”,则系统将复位 FB“SLI_FB_chooseStruct_RDiag”的过程值和全局数据块的过程值。

程序段 2:

输入参数 REQ(“startRead”)返回信号状态“TRUE”时,启动指令“RDREC”。

说明
调用“startRead”
根据 OB82 的调用结果,每次检测到硬件错误时,“startRead”将复位为“TRUE”。通过变量“countCalls”,可计数 RDREC 成功调用的次数。触发三个通道错误后,“countCalls”值将为“3”。

“RDREC”指令将通过输入参数 ID(“id”)调用 IO 设备的前端模块。输入参数 INDEX(“dataRecNbr”)用于调用 IO 设备的诊断数据记录“16#E00A”。

“RDREC”指令将通过多次调用读取诊断数据,并使用 RECORD 参数(“recordBYTE”)保存所读取的数据(x 条数据记录)。读取的数据长度记录在 LEN 输出参数(“#lengthOut”)中,并使用变量“readLength”进行保存进行进一步处理。根据输入参数 MLEN 的值(“maxLength”的值为“0”),待读取的数据长度无限制。

在执行过程中,输出参数 BUSY(“busy”)将置位为“TRUE”;VALID(“checkedValid”)将置位为“FALSE”。仅当执行完成后,才会输出成功读取的结果(“checkedValid”置位为“TRUE”);函数块“SLI_FB_chooseStruct_RDiag”将该结果用作一个起始条件。要结束函数块“SLI_FB_chooseStruct_RDiag”的执行,系统将变量“checkedValid”置位为“FALSE”。

并在输出参数 STATUS(“#statusExe”)处,显示该块的状态。在本示例中,该过程成功执行且无任何错误。

79bfd7e8-29f6-11ee-a368-dac502259ad0.png

程序段 3:

当常开触点(“error”)的信号状态为“TRUE”时,如果发生错误(“memErrStatus”),则系统保存该状态(“#statusExe”)。同时复位变量“checkedValid”和“startRead”,并停止 RDREC 的执行。函数块“SLI_FB_chooseStruct_RDiag”的执行将无法启动。

程序段 4:

RDREC 完全执行后(“#statusExe”的值为“16#0070_0200”),“startRead”将置位为“FALSE”。并停止 RDREC 的执行。

程序段 5:

如果常开触点(“startRead”)的信号状态为“TRUE”,则将跳转到程序段 1 的“RDREC”标签处(使用 "JMP" 指令)。

程序段 6:

如果变量“checkedValid”的信号状态为“TRUE”,且变量“reset”的信号状态为“FALSE”,则在函数块“SLI_FB_chooseStruct_RDiag”中启动排序过程。

在函数块“SLI_FB_chooseStruct_RDiag”中,将选择相应数据记录的结构类型以及与 UserStructureIdentifier 相匹配的结构类型。系统将数据记录的数据复制到相应数组中的正确位置中。之后,将根据相应数据记录的大小多次重复执行以上操作。此时,系统将读取一个或多个通道的信息。

如果对数据记录内容进行操作后,“数据记录的长度 + 前置长度”(“#allRecLEN”)小于所有读取的数据长度(“readLength”),则将从顶部重新开始函数块的执行。此时,系统将读取另一个数据记录、进行内容比较,并将该数据记录的数据复制到相应数组的正确位置处。

通过将局部变量(“#readComplete”、“#dbComplete”、“#limitReach”)和全局变量“checkedValid”设置为“FALSE”,可完成排序过程。

基于以下变量,可记录该排序过程:

“data_sorting_done”:该变量用于指示函数块“SLI_FB_chooseStruct_RDiag”的执行已结束。同时变量“checkedValid”复位,表示该函数块无法重新执行。

“outputOverflow”:该结构中包含三个变量,每个变量分别记录不同的数组超出限值错误。例如,读取的数据记录数量超出相应数组(“recordA”或“recordB”)可存储的最大数量。

“different_structs_used”:如果使用“recordA”和“recordB”存储诊断数据记录,则变量“different_structs_used”将返回值“TRUE”。

“countRecs”:该变量用于计数复制的数据数目。

“chooseStruct”:该变量用于指示上一次所用的结构。值“4”用于指示“recordB”结构中上一次以“USI Type 1”形式存储的数据记录。

“posForRec”:该变量将存储数据记录(“recordA”或“recordB”)的数组中最近使用的位置。值“1”用于指示“recordB[1]”中上一次存储的数据记录(参见“chooseStruct”)。

“posForChannel”:该变量将存储通道(“USI_DetailsType[x]”)的数组中最近使用的位置。值“0”用于指示“recordB[1]/USI_DetailsType[0]”中存储的通道(参见“chooseStruct”和“posForRec”)。

79e3d45e-29f6-11ee-a368-dac502259ad0.png

下图中显示了位置“0”(“recordB[0]”)处,结构为“B”/“0101”的数据记录。

“ChannelLocation”的值“16#8000”显示了子模块级的诊断信息。基于“ChannelErrorType”的值“16#0006”,插槽 2 处(参见“SlotNumber”)模块上子模块 1(“SubSlotNumber”)的通道 0 和 1(参见“ChannelNumber”)发生断路。

79f72bda-29f6-11ee-a368-dac502259ad0.png

“A”/“0100”的结构体:

7817d0d0-29f6-11ee-a368-dac502259ad0.png

“B”/“0101”的结构体:

78307ee6-29f6-11ee-a368-dac502259ad0.png

类型 1 的结构,与“UserStructureIdentifier”中的值相同:

类型 1 的结构用于基本通道诊断。

783d4568-29f6-11ee-a368-dac502259ad0.png

类型 2 的结构,与“UserStructureIdentifier”中的值相同:

类型 2 的结构用于扩展通道诊断。

784982ec-29f6-11ee-a368-dac502259ad0.png

类型 3 的结构,与“UserStructureIdentifier”中的值相同:

类型 3 的结构用于制造商特定的通道诊断。在本示例中,结构的组态未定义,并假定类型 3 的长度为 28 个字节。

7858f86c-29f6-11ee-a368-dac502259ad0.png

“A”/“0100”结构的汇总信息:

786b02c8-29f6-11ee-a368-dac502259ad0.png

“B”/“0101”结构的汇总信息:

787a1772-29f6-11ee-a368-dac502259ad0.png






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16064

    浏览量

    176919
  • 存储器
    +关注

    关注

    38

    文章

    7413

    浏览量

    163466
  • PLC控制
    +关注

    关注

    9

    文章

    251

    浏览量

    27228
  • 触发器
    +关注

    关注

    14

    文章

    1994

    浏览量

    60999

原文标题:西门子PLC:使用 RDREC 读取诊断数据记录的编程示例

文章出处:【微信号:gh_a8b121171b08,微信公众号:机器人及PLC自动化应用】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    读取数据时间记录问题,小弟着急啊,求大神相助。

    从数组读取一段数据到文件中,并记录读取的时间,精度到秒,怎么设计啊,本人刚刚接触这个软件,求大神相助!
    发表于 09-05 09:47

    LabVIEW 数据记录文件读取,读回来是空数组

    在使用LabVIEW数据记录文件存储时,偶尔想查看之前的数据,所以读取全部数据记录文件,但是读回
    发表于 03-28 14:48

    LabVIEW 数据记录文件读取问题

    在使用LabVIEW数据记录文件存储时,偶尔想查看之前的数据,所以读取全部数据记录文件,但是读回
    发表于 03-28 14:55

    LabVIEW数据记录

    数据记录文件是LabVIEW特有的以二进制存储,适合存储簇类型的数据块,位于文件IO-高级-数据记录,如下图同理配置其他文件,打开对应关闭,
    发表于 07-14 08:43

    labview设置数据记录位置问题

    请教为什么读取数据时设置了数据记录位置,每次读出的数据都是上次设置的位置记录,也就是说
    发表于 11-02 16:02

    基于Labview的数据记录编程

    短时间内记录一些热电偶单元的数据 一个基本的数据记录系统包含着数据记录器的所有要素,只不过i/o
    的头像 发表于 04-09 16:29 4680次阅读
    基于Labview的<b class='flag-5'>数据</b><b class='flag-5'>记录</b><b class='flag-5'>编程</b>

    温湿度记录仪如何读取,温湿度记录仪的操作介绍

    在运输过程中的温度状况进行实时自动监测。 那么温湿度记录仪到底怎么读取数据? 一、显示屏读取数据 温湿度
    发表于 06-28 16:31 3846次阅读

    LTC2512-24的分布式读取示例

    本文提供了其他示例,以更全面地解释具有可配置平坦通带数字滤波器的 LTC2512-24 24 位过采样 ADC 中使用的分布式读取功能。数据手册解释说,数据可以通过多次转换
    的头像 发表于 01-05 14:52 807次阅读
    LTC2512-24的分布式<b class='flag-5'>读取</b><b class='flag-5'>示例</b>

    labview数据记录和监控模块

    数据记录文件是labview特有的以二进制存储,适合存储簇类型的数据块,位于文件IO-高级-数据记录,如下图同理配置其他文件,打开对应关闭,
    发表于 01-15 11:42 0次下载

    运动编程示例:定时按压操作

    运动编程示例:定时按压操作
    的头像 发表于 03-14 14:42 803次阅读
    运动<b class='flag-5'>编程</b><b class='flag-5'>示例</b>:定时按压操作

    运动编程示例:重复运动的循环功能

    运动编程示例:重复运动的循环功能
    的头像 发表于 03-13 16:59 1151次阅读
    运动<b class='flag-5'>编程</b><b class='flag-5'>示例</b>:重复运动的循环功能

    TCON、TDISCON、TSEND和TRCV的编程示例

    在以下示例中,将在 S7-1500 系列的两个 CPU 间创建一个编程连接,并将数据记录从 CPU 1 发送到 CPU 2 中。
    的头像 发表于 07-08 17:16 7293次阅读
    TCON、TDISCON、TSEND和TRCV的<b class='flag-5'>编程</b><b class='flag-5'>示例</b>

    三菱fx5u用什么软件编程读取多台仪表数据

    示例以 FX5U-32MR/ES 为例读取 ModbusTCP 网口仪表数据,本示例采用 ModbusTCP 协议实现,对 ModbusTCP 从站协议的仪表,FX5U 可直接
    的头像 发表于 07-25 08:59 1643次阅读
    三菱fx5u用什么软件<b class='flag-5'>编程</b><b class='flag-5'>读取</b>多台仪表<b class='flag-5'>数据</b>

    移动数据编程示例

    编程示例 在此编程示例中,将移动在生产班次期间为示例收集的数据值以作进一步处理。收集的
    的头像 发表于 08-23 10:10 1283次阅读
    移动<b class='flag-5'>数据</b>的<b class='flag-5'>编程</b><b class='flag-5'>示例</b>

    时间中断函数的编程示例

    在以下示例中,将读取延时中断 OB (OB20) 的状态,设置新的延时并启动或禁用 OB20。
    的头像 发表于 09-01 09:47 1027次阅读
    时间中断函数的<b class='flag-5'>编程</b><b class='flag-5'>示例</b>