简介
在以下示例中,可通过 rdrec 读取 io 设备的诊断数据记录“16#e00a”。触发断路时,系统将错误信息输出为一条诊断数据记录。
说明
诊断数据记录的数目
对于该 io 设备,模块上每个触发错误的插槽都将生成自己的数据记录。因此,诊断信息中可包含多条记录。
在该示例中,将读取多个模块的多个硬件错误(通道错误),并将这些错误复制到存储器数组的相应结构中。根据指定的设置,存储器数组(“recorda”、“recordb”)最多可包含 6 条数据记录、16 个通道。
要求
安装的硬件
需安装以下硬件设备:
一个 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) 中:
读取 io 设备前端模块的硬件标识符,并使用“id”变量进行存储。通过“plc 变量 > 系统常量”(plc tags > system constants) 以及 等条目,可查找到前端模块的硬件标识符。所用的数据类型为“hw_submodule”。
函数“sli_fc_start_rdiag”:参数互连
要启动“rdrec”指令,可根据硬件故障创建函数“sli_fc_start_rdiag”。
在 fc 中创建以下互连。
在诊断中断 ob (ob82) 中,调用函数“sli_fc_start_rdiag”。
函数“sli_fc_reset_rdiag”:参数互连
要在发生错误后复位过程值,需创建函数“sli_fc_reset_rdiag”。
在 fc 中创建以下局部变量。
在 fc 中创建以下互连。
程序段 1:要复位过程值,需创建以下互连。第 1 部分:
第 2 部分:
第 3 部分:
第 4 部分:
程序段 2:要复位“reset”变量,需创建以下互连。
函数块“sli_fb_choosestruct_rdiag”:参数互连
创建函数块“sli_fb_choosestruct_rdiag”,选择相应的数据记录结构,并将数据复制到数组中的指定位置。
更多信息,请参见“程序段 6”的“结果”(result) 部分或该程序段的注释字段(参见“程序代码”)。
函数块“sli_fb_rdrec_diag”:参数互连
创建函数块“sli_fc_start_rdiag”,调用并处理“rdrec”指令以及所有其它后续进程。
在该函数块中创建以下局部变量。
在该 fb 中创建以下互连:
程序段 1:调用函数“sli_fc_reset_rdiag”并创建名为“rdrec”的“label”指令。
程序段 2:互连“rdrec”指令的参数,如下所示:
程序段 3:发生 rdrec 错误时,如果要保存该状态,则需进行参数互连,如下所示
程序段 4:要结束 rdrec 的执行,需创建以下互连。
程序段 5:要跳转回程序段 1,需创建以下互连。
程序段 6:调用函数块“sli_fb_choosestruct_rdiag”,如下所示。
在循环 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”)处,显示该块的状态。在本示例中,该过程成功执行且无任何错误。
程序段 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”)。
下图中显示了位置“0”(“recordb[0]”)处,结构为“b”/“0101”的数据记录。
“channellocation”的值“16#8000”显示了子模块级的诊断信息。基于“channelerrortype”的值“16#0006”,插槽 2 处(参见“slotnumber”)模块上子模块 1(“subslotnumber”)的通道 0 和 1(参见“channelnumber”)发生断路。
“a”/“0100”的结构体:
“b”/“0101”的结构体:
类型 1 的结构,与“userstructureidentifier”中的值相同:
类型 1 的结构用于基本通道诊断。
类型 2 的结构,与“userstructureidentifier”中的值相同:
类型 2 的结构用于扩展通道诊断。
类型 3 的结构,与“userstructureidentifier”中的值相同:
类型 3 的结构用于制造商特定的通道诊断。在本示例中,结构的组态未定义,并假定类型 3 的长度为 28 个字节。
“a”/“0100”结构的汇总信息:
“b”/“0101”结构的汇总信息:
以太坊在未来有希望成为下一代交易网络
基于LM35和LM3914的室温温度计的制作
博泰车联网荣获“2021-2022年度(第五届)中国IC独角兽”称号
iPhone8什么时候上市?iPhone8最新消息:iPhone8外观确定,Phone8配件钢化膜现5孔?iPhone8命名三大揭秘
基于Arria 10 SoC的控制模块设计和开发事项
使用RDREC读取诊断数据记录的编程示例
西门子发布新型物联网网关:用于过程工业、独立于控制系统
AI助手让输入更智能
裸板介绍及裸板测试的重要性
Nano Dimension与东欧AMTEST GROUP签订代理协议
食用油过氧化值检测仪的产品特点是怎样的
建博会完美收官 | 罗曼斯全面升级,绽放品牌实力!
汽车存储市场的国产机遇
盘古大模型是干什么的,一文浅谈盘古大模型
美国银行认为数字货币和区块链技术对其构成了行业风险
如何设计保护这些系统的电路
人们能否生活在一个AI和量子计算运行模拟的宇宙中?
小米6和荣耀9哪个好?釉白PK炫黑谁更胜一筹?小米店前门庭若市,华为冷冷清清,究竟为何?
新能源汽车整车动力总成系统的测试
ASML警告美国升级出口管制将加速中国开发***技术