ARRAY 元素的间接寻址(S7-300, S7-400) 说明 要寻址 ARRAY 元素,可以输入整型变量以及常量作为下标。使用变量时,将在运行时计算下标。例如,在程序循环中,每次循环都使用不同的下标。 说明 下标变量 [i]在开始块调用时读取一次,无法在处理期间由被调用的块进行更改。 在调用块并将间接索引的 ARRAY 元素 ("".["i"])作为输入/输出参数 (InOut) 传输到块时,无法在处理块时更改下标变量的值。值必须写入到与读取值时相 同的 ARRAY元素中。该语法包含以下部分: 部分 说明 数据块 ARRAY 所在数据块的名称 ARRAY ARRAY 数据类型的变量 i, j用作指针的整型 PLC 变量 a 结构的附加局部变量 示例 下面以 SCL 为例,举例说明了对 ARRAY元素进行的间接索引。MOTOR 是一个包含三行的一 维 ARRAY_of_INT。VALUES 是一个整型的 PLC 变量。
在 STL 中间接寻址(S7-300, S7-400) 地址寄存器的基本知识 (S7-300, S7-400) 简介两种地址寄存器可用于操作数的间接寻址:地址寄存器 1 (AR1) 和地址寄存器 2 (AR2)。地 址寄存器长度相等,有 32位。可以在地址寄存器中存储内部区域指针和跨区域指针。要定 义操作数的地址,可以在程序中调用存储的数据。通过加载和传递指令可以在寄存器和其它可用存储区之间交换数据。在 STL 中间接寻址 (S7-300, S7-400) 在 STL中,以下选项可用于间接寻址: • 存储器间接寻址 • 寄存器间接内部区域寻址 • 寄存器间接跨区域寻址 存储器间接寻址对于存储器间接寻址,可以在变量中存储地址。变量可以是 WORD 或 DWORD 数据类型。变 量可以位于存储器区域“数据”(DB 或DI)、“位存储器” (M) 或“临时本地数据” (L) 中。 下列示例显示的是存储器间接寻址的应用:寄存器间接内部区域寻址寄存器间接寻址使用其中一个地址寄存器(AR1 或 AR2)来获取操作数的地址。如果是寄存器间接内部区域寻址,那么仅通过地址寄存器索引位地址和字节地址(如 P#10.0)。在编写指令之前,不输入地址寄存器中的地址所应用到的存储区。 地址寄存器 中的地址随后移动到指令中指定的存储区。可能的存储区有“输入”(I)、“输出” (Q)、“I/O”(PI 或 PQ)、“位存储器” (M)、“临时本地 数据” (L)和“数据”(DB 或 DI)。 输入寄存器间接内部区域寻址时,在指定地址寄存器之后指定偏移量。 这一偏移量被添加到地址寄存器的内容中,而不会改变地址寄存器。 该偏移量还具有指针的格式。 必须指定 指针,必须作为常量输入(如 P#0.0 或P#2.0)。 下列示例显示的是寄存器间接内部区域寻址的应用:寄存器间接跨区域寻址如果是寄存器间接跨区域寻址,请使用地址寄存器来建立操作数全部地址的索引,即,位地 址和字节地址,以及存储区。可能的存储区有“输入”(I)、“输出” (Q)、“I/O” (P)、“位存储 器” (M)、“临时本地数据” (L) 和“数据”(DB或 DI)。 在指令中,仅编写操作数宽度。 可 能的操作数宽度为位、字节、字和双字。下列示例显示的是寄存器间接跨区域寻址的应用:使用结构化数据类型时填充字节 非优化存储区中的填充字节在非优化存储区中,结构化数据类型将与偶数起始地址(可被 2 整除)对齐。如果先前的数据类型导致结构化数据类型的起始地址处于奇数地址或结束地址处于偶数地址, 则填充字节将自动插入到相应位置。举例来说,如果长度为七个字节的数组在数据块中跟随三个单字节,则会在数组前后均自动插入一个填充字节。例如,前三个字节位于地址“0.0”到“2.0”。后续数组位于地址“4.0”到“10.0”。随后的单个字节将获得地址“12.0”。 填充字节对于数据存储不可见(例如在 DB 中),但在复制结构时将发挥作用。如果要在 SIMATIC CPU 和外部设备之间传输预定义形式和大小的结构化数据类型,则遵循非优化数据存储的规则。优化存储区中的填充字节 优化存储区中所用的填充字节的计算规则各不相同,具体规则与目标系统相关。 说明有关优化数据存储和非优化数据存储的更多信息,请参见西门子工业在线支持网站中的以下 文章: 编程指南复制结构化数据类型时的填充字节复制由基本数据类型组成的结构化数据类型时,要区分用于计算填充字节的同一规则集是否 适用于源和目标系统。 •如果规则集适用于源和目标,则存储区将作为一个整体进行复制,这意味着变量之 间的所有填充位和填充字节也将被复制。 •否则,必须单独复制每个基本变量。在这种情况下,目标系统中的填充位和填充字节的 值保持不变。只有布尔型数组的填充位会被复制。填充字节可见的示例场景 下表显示了填充字节可见的一些场景: 数据类型 指令示例 示例场景 • Struct • PLC 数据类型 •数组 • Serialize (页 926)、 Deserialize (页 920)、 • WRREC(页 2798)、RDREC (页 2778)、 • TSEND_C (页 5519)、TRCV_C(页5535)、PUT (页5486)、GET (页 5480) • MoveResovledSymbolsToBuff e(页 2204)r、 MoveResolvedSymbolsFromB uffer (页 2209) •具有结构化元素的结构 • I/O(制造商特定数据记录) • I/O 设备地址空间中的结构 • 与其它制造商的 I/O 进行通信 • 在Linux 下使用硬件 • 设备的驱动程序。标准存储区中的问题示例 已创建以下嵌套结构作为“typeHARTrequest”PLC数据类型,以作为数据记录发送到外部设 备。(见绿色边框。) 问题:PLC 数据类型“typeHARTrequest”的实际长度为 11个字节。以字节为单位的几个奇数 长度也会导致在 PLC 数据类型中填充字节。(见红色标记。)包括所有填充字节在内,PLC 数据类型有14 个字节的长度用于数据交换。SIMATIC CPU 的寻址地址范围将与外部 设备用于数据交换的地址范围不匹配。解决方法:将标记为蓝色的数组更改为五个单字节。新“typeHARTrequest”PLC 数据类 型的长度为 12个字节(包括末尾的填充字节)。错误原因 简介 在 TIA Portal中,可根据不同的错误类型和原因,确定相应的响应机制,对错误相应可采用各种不同的编程语言。但具体的响应机制显示则取决于所有的编程语言。错误的确定需视具体情况而定。例如,加法运算过程中发生溢出可能是因为返回错误值而导致的错误。但在某些情况下,加法溢出是系统预定义的且可以接受,不再认为一种错误。在创建程序代码时,必须充分了解可能会发生的各种状况。例如,在编程通信连接时,就必须意识到所创建的连接随时可能会被中断。为了防止这一状况的发生,必须在程序中设置相 应的的故障响应。这是因为发生连接中断时将导致T_SEND 程序块无法进行消息传输。只有 采取了相应措施,在连接中断时系统才能发送信号通知操作员消息无法传输。由于指令 T_SEND无法防止连接中断,可通过 T_SEND 的输出错误信息加以提示。程序员不应该 忽略该指令的输出。在下文中,我们将其统称为错误,该错误在系统中为预定义的行为。 导致错误的不同原因 我们可以将错误原因分为以下几类: 参数值错误编程错误 资源错误 说明 指令处理直接中发生的 错误。 可导致指令执行中止的 编程或访问错误。 由操作系统处理的错误,在程序代码中可编 程该错误的响应措施。 错误类型 处理错误 同步错误 异步错误 示例 算术指令中的溢出错误 编程错误 •查询一个不存在的 外设输入 • 通过变量下标访问 ARRAY 时,下标值 超出有效的 ARRAY 限值 发生了程序代码外的特定事件。参数值错误 编程错误 资源错误 程序或操作系统 的响应 不执行由使能输出 ENO 关联的指令。 如果没有编程错误OB,则操作系统将根 据所使用的 CPU 进行响 应。 1. 如果未向该事件分 配组织块 (OB),则 在事件发生时,操作系统执行默认的 系统响应。 2. 如果为该事件分配 有组织块 (OB),则 调用该组织块。 程序中的错误处 理机制根据具体的指令,可采 取不同的本地错误处理 方式 2): • EN/ENO 机制 • 输出参数: – RET_VAL – STATUS– ERROR 全局错误处理 1): • 程序执行错误 OB • 编程错误 OB • I/O 访问错误 OB 使用以下指令,进行本地错误处理 2): • GET_ERROR • GET_ERR_ID 错误组织块 (OB): • 时间错误 (OB 80) •诊断中断 (OB 82) • 插入/移除模块中断 (OB 83) • 机架错误 (OB 86) 未分配错误 OB 时可能的系统响应: • 操作系统忽略该事 件。 • CPU 切换为 STOP 模 式。 • 如有可能,在本地 执行错误处理。 如果分配有错误OB, 则在发生相应事件时将 调用该 OB。 有关用户程序中诊断功 能的应用示例,请访问 评估错误 OB 中的错误。异步错误处理 对于S7-1500 系列的 CPU,错误 OB 采用异步调用方式。这也就意味着,在发生错误时不会 立即处理 I/O 访问错误或编程错误OB,而是根据设定的优先级进行相应的延时处理。如果 在完成 I/O 访问错误或编程错误 OB处理之前又发生了其它错误,则系统也不会调用其它 I/O 访问错误或编程错误 OB。如果要防止系统忽略这些 I/O 访问或编程错误OB,需设置较高优 先级。错误处理机制概览 概览 可通过以下几种不同的错误处理机制进行参数跟踪或编程或访问错误: 机制 任务 错误处理使能输入 EN 或 IF 指令 阻止程序代码的执行 本地 使能输出 ENO 或二进制结果位 指示一个错误 参数输出RET_VAL、STATUS 和 ERROR GET_ERROR 和 GET_ERR_ID 指令 响应一个错误 组织块 全局参数值错误时的本地错误处理 错误发生后,除了通过本地错误处理机制立即进行响应,也可通过程序代码内进行特定响应。此时,可以在程序块(OB、FB 或 FC)中直接编写本地错误处理方式,但系统仅对发生在该 程序块中的错误进行处理。