s7-1200编程

2018年6月21日22:31:33 发表评论 115 阅读

设计 PLC 系统的指南

设计 PLC 系统时,可从若干方法和标准中进行选择。 下列常规指南可应用到许多设计项目中。 当然,必须遵守您自己公司程序的指令、自身培训以及当地已被接受的实践。

表格 6- 1 设计 PLC 系统的指南

建议步骤 任务
对过程或机器进行分区 将过程或机器划分为彼此独立的部分。 这些分区会确定控制器之间的边界,并影响功能描述规范和资源的分配。
创建功能规范 写下过程或机器的每一部分(如 I/O 点)的操作说明、操作的功能描述、在允许进行每个执行器(如螺线管、电机或驱动器)的操作之前必须实现的状态、操作员界

面的描述以及过程或机器其它部分的任何接口。

设计安全电路 出于安全考虑,标识任何可能需要硬接线逻辑的设备。 请记住,控制设备在不安全方式下可能会出现故障,可能会造成意外启动或机械运转变化。 其中意外或错误的机械运转可能会导致人员的身体伤害或重大的财产损失,请考虑实施机电替代装置

(其独立于 PLC 运行)以防止不安全的运行。 安全电路的设计中应包含以下任务:

标识任何可能造成危险的不正确或意外的执行器操作。

标识可确保操作不危险的条件,并确定如何独立于 PLC 检测这些条件。

标识上电和断电时 PLC 如何影响过程,并标识检测错误的方式和时间。 此信息仅用于设计正常和预期的异常操作。 出于安全考虑,不应依赖此“最佳情况”方案。

设计可独立于 PLC 来阻止危险运行的手动或机电安全替代装置。

从独立于 PLC 的电路提供相应状态信息,以便程序和任何操作员界面具有必要的信息。

标识针对过程安全运行的任何其它安全相关要求。

规划系统安全 确定访问相关过程所需的 保护 (页 166)级别。 可以对 CPU 和程序块进行密码保护,以防受到未经授权的访问。
指定操作员站 根据功能规范的要求,创建以下操作员站的绘图:

显示与过程或机器相关的每个操作员站的位置的总览图。

操作员站中设备的机械布局图,如显示屏、开关和灯。

包含 PLC 和信号模块中相关 I/O 的电气图。

构建用户程序

建议步骤 任务
创建组态图 根据功能规范的要求,创建控制设备的组态图:

显示与过程或机器相关的每个 PLC 位置的总览图。

每个 PLC 和任何 I/O 模块的机械布局图,其中包括任何控制柜及其它设备。

每个 PLC 和任何 I/O 模块的电气图,其中包括设备模型号、通信地址和 I/O 地址。

创建符号名称的列表 创建绝对地址的符号名称列表。 不仅包括物理 I/O 信号,也包括要在程序中使用的其它元素(如变量名)。

构建用户程序

创建用于自动化任务的用户程序时,需要将程序的指令插入代码块中:

组织块 (OB) 对应于 CPU 中的特定事件,并可中断用户程序的执行。 用于循环执行用户程序的默认组织块 (OB 1) 为用户程序提供基本结构,是唯一一个用户必需的代码块。 如果程序中包括其它 OB,这些 OB 会中断 OB 1 的执行。其它 OB 可执行特定功能,如用于启动任务、用于处理中断和错误或者用于按特定的时间间隔执行特定的程序代码。

功能块 (FB) 是从另一个代码块(OB、FB 或 FC)进行调用时执行的子例程。 调用块将参数传递到 FB,并标识可存储特定调用数据或该 FB 实例的特定数据块 (DB)。 更改背景 DB 可使通用 FB 控制一组设备的运行。例如,借助包含每个泵或阀门的特定运行参数的不同背景数据块,一个 FB 可控制多个泵或阀。

功能 (FC) 是从另一个代码块(OB、FB 或 FC)进行调用时执行的子例程。 FC 不具有相关的背景 DB。 调用块将参数传递给 FC。 FC 中的输出值必须写入存储器地址或全局 DB 中。

为用户程序选择结构类型

根据实际应用要求,可选择线性结构或模块化结构用于创建用户程序:

线性程序按顺序逐条执行用于自动化任务的所有指令。 通常,线性程序将所有程序指令都放入用于循环执行程序的 OB (OB 1) 中。

模块化程序调用可执行特定任务的特定代码块。 要创建模块化结构,需要将复杂的自动化任务划分为与过程的工艺功能相对应的更小的次级任务。 每个代码块都为每个次级任务提供程序段。 通过从另一个块中调用其中一个代码块来构建程序。

线性结构: 模块化结构:

通过创建可在用户程序中重复使用的通用代码块,可简化用户程序的设计和实现。 使用通用代码块具有许多优点:

可为标准任务创建能够重复使用的代码块,如用于控制泵或电机。 也可以将这些通用代码块存储在可由不同的应用或解决方案使用的库中。

将用户程序构建到与功能任务相关的模块化组件中,可使程序的设计更易于理解和管理。 模块化组件不仅有助于标准化程序设计,也有助于使更新或修改程序代码更加快速和容易。

创建模块化组件可简化程序的调试。 通过将整个程序构建为一组模块化程序段,可在开发每个代码块时测试其功能。

创建与特定工艺功能相关的模块化组件,有助于简化对已完成应用程序的调试,并减少调试过程中所用的时间。

使用块来构建程序

通过设计 FB 和 FC 执行通用任务,可创建模块化代码块。 然后可通过由其它代码块调用这些可重复使用的模块来构建程序。 调用块将设备特定的参数传递给被调用块。

当一个代码块调用另一个代码块时,CPU 会执行被调用块中的程序代码。 执行完被调用块后,CPU 会继续执行调用块。 继续执行该块调用之后的指令。

调用块

被调用(或中断)块

① 程序执行

② 用于触发其它块执行的指令或事件

③ 程序执行

④ 块结束(返回到调用块)

可嵌套块调用以实现更加模块化的结构。 在以下示例中,嵌套深度为 4: 程序循环 OB

加 3 层对代码块的调用。

① 循环开始

② 嵌套深度

组织块 (OB)

组织块为程序提供结构。 它们充当操作系统和用户程序之间的接口。 OB 是由事件驱动的。 事件(如诊断中断或时间间隔)会使 CPU 执行 OB。某些 OB 预定义了起始事件和行为。

程序循环 OB 包含用户主程序。 用户程序中可包含多个程序循环 OB。 RUN 模式期间, 程序循环 OB 以最低优先级等级执行,可被其它各种类型的程序处理中断。 启动 OB 不会中断程序循环 OB,因为 CPU 在进入 RUN 模式之前将先执行启动 OB。

完成程序循环 OB 的处理后,CPU 会立即重新执行程序循环 OB。 该循环处理是用于可编程逻辑控制器的“正常”处理类型。 对于许多应用来说,整个用户程序位于一个程序循环OB 中。

可创建其它 OB 以执行特定的功能,如用于处理中断和错误或用于以特定的时间间隔执行特定程序代码。 这些 OB 会中断程序循环 OB 的执行。

使用“添加新块”(Add new block) 对话框在用户程序中创建新的 OB。

s7-1200编程-1 总是由事件驱动中断处理。 发生此类事件时,CPU 会中断用户程序的执行并调用已组态用于处理该事件的 OB。 完成中断 OB 的执行后,

CPU 会在中断点继续执行用户程序。

CPU 根据分配给各个 OB 的优先级来确定中断事件的处理顺序。每个事件都具有一个特定的处理优先级。 各 OB 的执行顺序取决于它们在优先等级中的相应优先级。 多个中断事件可合并为优先级等级。 更多相关信息,请参见 PLC 概念一章,执行用户程序小节 (页 69)。

在某等级的 OB 内创建附加 OB

可为用户程序,甚至为程序循环和启动 OB 等级创建多个 OB。 使用“添加新块”(Add new block) 对话框创建 OB。输入 OB 的名称并输入 200 或更大的数作为 OB 编号。

如果为用户程序创建了多个程序循环 OB,则 CPU 会按数字顺序从具有最小编号(例如OB 1)的程序循环 OB 开始执行每个程序循环 OB。 例如: 当第一个程序循环 OB(例如 OB 1)完成后,CPU 将执行下一个更高的程序循环 OB(例如 OB 200)。

组态 OB 的运行

s7-1200编程-2 可修改 OB 的运行参数。例如,可为延时 OB 或循环 OB 组态时间参数。

功能 (FC)

功能 (FC) 是通常用于对一组输入值执行特定运算的代码块。 FC 将此运算结果存储在存储器位置。 例如,可使用 FC 执行标准运算和可重复使用的运算(例如数学计算)或者执行工艺功能(如使用位逻辑运算执行独立的控制)。 FC 也可以在程序中的不同位置多次调用。 此重复使用简化了对经常重复发生的任务的编程。

FC 不具有相关的背景数据块 (DB)。 对于用于计算该运算的临时数据,FC 采用了局部数据堆栈。 不保存临时数据。 要长期存储数据,可将输出值赋给全局存储器位置,如 M 存储器或全局 DB。

功能块 (FB)

功能块 (FB) 是使用背景数据块保存其参数和静态数据的代码块。 FB 具有位于数据块

(DB) 或“背景”DB 中的变量存储器。 背景 DB 提供与 FB 的实例(或调用)关联的一块存储区并在 FB 完成后存储数据。 可将不同的背景 DB 与 FB 的不同调用进行关联。 通过背景 DB 可使用一个通用 FB 控制多个设备。 通过使一个代码块对 FB 和背景 DB 进行调用,来构建程序。 然后,CPU 执行该 FB 中的程序代码,并将块参数和静态局部数据存储在背景 DB 中。 FB 执行完成后,CPU 会返回到调用该 FB 的代码块中。 背景 DB 保留该 FB 实例的值。 随后在同一扫描周期或其它扫描周期中调用该功能块时可使用这些值。

可重复使用的代码块和关联的存储区

用户通常使用 FB 控制在一个扫描周期内未完成其运行的任务或设备的运行。 要存储运行参数以便从一个扫描快速访问到下一个扫描,用户程序中的每一个 FB 都具有一个或多个背景 DB。 调用 FB 时,也需要指定包含块参数以及用于该调用或 FB “实例”的静态局部数据的背景 DB。 FB 完成执行后,背景 DB 将保留这些值。

通过设计用于通用控制任务的 FB,可对多个设备重复使用 FB,方法是:为 FB 的不同调用选择不同的背景 DB。

FB 将 Input、Output 和 InOut 以及静态参数存储在背景数据块中。

在背景数据块中分配起始值

背景数据块存储每个参数的默认值和起始值。 起始值提供在执行 FB 时使用的值。 然后可在用户程序执行期间修改起始值。

FB 接口还提供一个“默认值”(Default value) 列,使您能够在编写程序代码时为参数分配新的起始值。 然后将 FB 中的这个默认值传给关联背景数据块中的起始值。 如果不在 FB 接口中为参数分配新的起始值,则将背景数据块中的默认值复制到起始值。

使用带多个 DB 的单个 FB

下图显示了三次调用同一个 FB 的 OB,方法是针对每次调用使用一个不同的数据块。 该结构使一个通用 FB 可以控制多个相似的设备(如电机),方法是在每次调用时为各设备分配不同的背景数据块。 每个背景 DB 存储单个设备的数据(如速度、加速时间和总运行时间)。

在此实例中,FB 22 控制三个独立的设备,其中 DB 201 用于存储第一个设备的运行数

据,DB 202 用于存储第二个设备的运行数据,DB 203 用于存储第三个设备的运行数据。

数据块 (DB)

在用户程序中创建数据块 (DB) 以存储代码块的数据。 用户程序中的所有程序块都可访问全局 DB 中的数据,而背景 DB 仅存储特定功能块 (FB) 的数据。

了解数据一致性

相关代码块执行完成后,DB 中存储的数据不会被删除。 有两种类型的 DB:

全局 DB 存储程序中代码块的数据。 任何 OB、FB 或 FC 都可访问全局 DB 中的数据。

背景 DB 存储特定 FB 的数据。 背景 DB 中数据的结构反映了 FB 的参数(Input、

Output 和 InOut)和静态数据。 (FB 的临时存储器不存储在背景 DB 中。)

说明

尽管背景 DB 反映特定 FB 的数据,然而任何代码块都可访问背景 DB 中的数据。

可将 DB 组态为只读:

在项目浏览器中右键单击相应 DB,然后在右键快捷菜单中选择“属性”(Properties)。

在“属性”(Properties) 对话框中选择“特性”(Attributes)。

选择“在设备中写保护数据块”(Data block write-protected in the device) 选项并单击“确定”(OK)。

创建可重复使用的代码块

s7-1200编程-3 使用项目浏览器中“程序

块”(Program blocks) 下的“添加新块”(Add new block) 对话框创建

OB、FB、FC 和全局 DB。

创建代码块时,需要为块选择编程语言。 无需为 DB 选择语言,因为它仅用于存储数据。

了解数据一致性

CPU 为所有基本数据类型(例如 Word 或 DWord)和所有系统定义的结构(例如IEC_TIMERS 或 DTL)保持数据一致性。 值的读/写操作无法中断。 (例如,在读写四

字节的 DWord 之前,CPU 会防止对该 DWord 值进行访问。) 为确保程序循环 OB 和中断 OB 无法同时写入同一个存储单元,在程序循环 OB 中的读/写操作完成之前,CPU 不会执行中断 OB。

如果用户程序共享存储器中在程序循环 OB 和中断 OB 之间生成的多个值,用户程序还必须确保在修改或读取这些值时保持一致性。 可以在程序循环 OB 中使用 DIS_AIRT(禁用报警中断)和 EN_AIRT(启用报警中断)指令,以防止对共享值进行访问。

在代码块中插入 DIS_AIRT 指令,以确保在读/写操作期间无法执行中断 OB。

插入读/写能够被中断 OB 更改的值的指令。

在顺序结尾插入 EN_AIRT 指令,以取消 DIS_AIRT,并允许执行中断 OB。

HMI 设备或另一个 CPU 发出的通信请求也能够中断程序循环 OB 的执行。通信请求也会导致与数据一致性相关的问题。 CPU 确保基本数据类型始终由用户程序指令执行一致地读取和写入。 由于通信会周期性地中断用户程序,因而不能保证 HMI 能够同时更新 CPU 中的多个值。 例如,给定 HMI 画面上显示的值可能来自 CPU 的不同扫描周期。

PtP(Point-to-Point,点到点)指令、PROFINET 指令(例如,TSEND_C 和 TRCV_C) 和 PROFINETS 分布式 I/O 指令和 PROFIBUS 分布式 I/O 指令 (页 290)可用于传送被中断的数据缓冲区。 通过避免对程序循环 OB 和中断 OB 中的缓冲区进行任何读/写操作, 可以确保数据缓冲区的数据一致性。如果需要在中断 OB 中修改这些指令的缓冲区值,请使用 DIS_AIRT 指令延迟所有中断(中断 OB 或源自 HMI 或另一个 CPU 的通信中断), 直到执行了 EN_AIRT 指令。

说明

使用 DIS_AIRT 指令延迟中断 OB 的处理,直到执行了 EN_AIRT 指令,以此影响用户程序的中断等待时间(从事件发生到执行中断 OB 的时间)。

编程语言

STEP 7 为 S7-1200 提供以下标准编程语言:

LAD(梯形图逻辑)是一种图形编程语言。 它使用基于电路 图 (页 156)的表示法。

FBD(功能块图)是基于布尔 代数 (页 157)中使用的图形逻辑符号的编程语言。

SCL(结构化控制语言)是一种 基于文本的高级编程语言 (页 157)。创建代码块时,应选择该块要使用的编程语言。

用户程序可以使用由任意或所有编程语言创建的代码块。

梯形图 (LAD)

电路图的元件(如常闭触点、常开触点和线圈)相互连接构成程序段。

s7-1200编程-4

要创建复杂运算逻辑,可插入分支以创建并行电路的逻辑。 并行分支向下打开或直接连接到电源线。 用户可向上终止分支。

LAD 向多种功能(如数学、定时器、计数器和移动)提供“功能框”指令。

STEP 7 不限制 LAD 程序段中的指令(行和列)数。

说明

每个 LAD 程序段都必须使用线圈或功能框指令来终止。

创建 LAD 程序段时请注意以下规则:

不能创建可能导致反向能流的分支。

$ % & ' =

( )

+ *

不能创建可能导致短路的分支。

$ % & =

功能块图 (FBD)

与 LAD 一样,FBD 也是一种图形编程语言。 逻辑表示法以布尔代数中使用的图形逻辑符号为基础。

s7-1200编程-5 要创建复杂运算的逻辑,在功能框之间插入并行分支。

算术功能和其它复杂功能可直接结合逻辑框表示。

STEP 7 不限制 FBD 程序段中的指令(行和列)数。

SCL

结构化控制语言 (SCL, Structured Control Language) 是用于 SIMATIC S7 CPU 的基于PASCAL 的高级编程语言。 SCL 支持 STEP 7 的块结构 (页 149)。 还可以在用 SCL 编写的程序块中包括用 LAD 和 FBD 编写的程序块。

SCL 指令使用标准编程运算符,例如,用 (:=) 表示赋值,算术功能(+ 表示相加,- 表示相减,* 表示相乘,/ 表示相除)。 SCL 也使用标准的 PASCAL 程序控制操作,如 IF- THEN-ELSE、CASE、REPEAT-UNTIL、GOTO 和 RETURN。 SCL 编程语言中的语法

元素还可以使用所有的 PASCAL 参考。 许多 SCL 的其它指令(如定时器和计数器)与

LAD 和 FBD 指令匹配。 有关特定指令的更多信息,请参见 基本指令 (页 177)和 扩展指令 (页 257)章节中的特定指令。

可以在创建该块时指定任何块类型(OB、FB 或 FC)以便使用 SCL 编程语言。 STEP 7

提供包含以下元素的 SCL 程序编辑器:

用于定义代码块参数的接口部分

用于程序代码的代码部分

包含 CPU 支持的 SCL 指令的指令树

可以直接在代码部分输入指令的 SCL 代码。 要了解更复杂的指令,只需从指令树拖动SCL 指令并将其放入程序中。 也可以使用任意文本编辑器创建 SCL 程序,然后将相应文件导入 STEP 7 中。

s7-1200编程-6

在 SCL 代码块部分,可以声明下列类型的参数:

Input、Output、InOut 和 Ret_Val: 这些参数定义代码块的输入变量、输出变量和返回值。 执行代码块期间局部使用此处输入的变量名称。 通常不会使用变量表中的全局变量名称。

静态(仅适用于 FB,上述示例适用于 FC): 静态变量用于在背景数据块中存储静态中间结果。 静态数据会一直保留,直到多个周期后被覆盖。 块的名称(在此代码块中作为多重背景调用)也存储在静态局部数据中。

温度: 这些参数是执行代码块期间使用的临时变量。

如果从其它代码块调用 SCL 代码块,该 SCL 代码块的参数会显示为输入或输出。

s7-1200编程-7

本示例中,“Start”和“On”变量(来自项目变量表)相当于 SCL 程序声明表中的

“StartStopSwitch”和“RunYesNo”。

构造 SCL 表达式

SCL 表达式是用于计算值的公式。 表达式由操作数和运算符(如 *、/、+ 或 -)组成。操作数可以是变量、常量或表达式。

表达式的计算按一定的顺序进行,具体由以下因素决定:

每个运算符均具有预定义的优先级,首先执行优先级最高的运算。

按从左至右的顺序处理优先级相同的运算符。

可使用圆括号指定要一起计算的一系列运算符。

表达式的结果可用于将值分配给程序使用的变量、用作由控制语句使用的条件、用作其它

SCL 指令的参数或者用于调用代码块。

表格 6- 2 SCL 中的运算符

类型 操作 操作员 优先级
圆括号 (表达式) ( , ) 1
数学 乘方 ** 2
符号(一元加号) + 3
符号(一元减号) - 3
倍增 * 4
除法 / 4
取模 MOD 4
加法 + 5
减法 - 5
比较 小于 < 6
小于或等于 <= 6
大于 > 6
大于或等于 >= 6
等于 = 7
不等于 <> 7
位逻辑 取反(一元) NOT 3
AND 逻辑运算 AND 或 & 8
异或逻辑运算 XOR 9
OR 逻辑运算 OR 10
赋值 赋值 := 11

作为一种高级编程语言,SCL 使用标准语句实现基本任务:

赋值语句: :=

算术功能: +、-、* 和 /

全局变量的寻址: "<变量名称>"(变量名称或数据块名称括在双引号内)

局部变量的寻址: #<变量名称>(在变量名称前加“#”符号) 以下示例显示了用法不同的各种表达式。

"C" := #A+#B; 将两个局部变量之和赋值给一个变量

"Data_block_1".Tag := #A; 为数据块变量赋值

IF #A > #B THEN "C" := #A; IF-THEN 语句的条件

"C" := SQRT (SQR (#A) + SQR (#B)); SQRT 指令的参数

算术运算符可以处理各种数值数据类型。 结果的数据类型取决于最高有效操作数的数据类型。 例如,使用 INT 操作数和 REAL 操作数的乘法运算会产生 REAL 结果值。

控制语句

控制语句是 SCL 表达式的一种专用类型,可用于执行以下任务:

程序分支

重复 SCL 编程代码的某些部分

跳转到 SCL 程序的其它部分

按条件执行

SCL 控制语句包括 IF-THEN、CASE-OF、FOR-TO-DO、WHILE-DO、REPEAT-

UNTIL、CONTINUE、GOTO 和 RETURN。

一条语句通常占一行代码。 可以在一行中输入多条语句,或者可将一条语句断开成多行代码以使代码易于阅读。 分隔符(如制表符、换行符和多余空格)在语法检查期间会被忽略。 END 语句可终止控制语句。

以下示例显示的是 FOR-TO-DO 控制语句。 (两种形式的代码在语法上均有效。)

FOR x := 0 TO max DO sum := sum + value(x); END_FOR;

FOR x := 0 TO max DO

sum := sum + value(x); END_FOR;

还可以为控制语句提供标签。 用语句前的逗点将标签隔开:

Label: <语句>;

有关完整的 SCL 编程语言参考,请参见 STEP 7 在线帮助。

条件

条件是一个比较表达式或逻辑表达式,其结果为 BOOL 类型(值为 TRUE 或 FALSE)。以下示例显示了各种类型的条件。

#Temperature > 50

#Counter <= 100

#CHAR1 < 'S'

关系表达式

(#Alpha <> 12) AND NOT #Beta 比较和逻辑表达式

5 + #Alpha 算术表达式

条件可以使用算术表达式:

如果结果是非零的任何值,则表达式的条件为 TRUE。

如果结果为零,则表达式的条件为 FALSE。

寻址

与 LAD 和 FBD 一样,SCL 允许用户在用户程序中使用变量地址(符号寻址)或绝对地址。 SCL 还允许使用变量作为数组索引。

绝对寻址I0.0 MB100

符号寻址

"PLC_Tag_1" PLC 变量表中的变量

"Data_block_1".Tag_1 数据块中的变量

"Data_block_1".MyArray[#i] 数据块数组中的数组元素

使用 PEEK 和 POKE 指令进行索引寻址

SCL 提供 PEEK 和 POKE 指令,可以用来读取或写入数据块、I/O 或存储器。 而您提供操作中具体字节偏移量或位偏移量的参数。

说明

与数据块一起使用 PEEK 和 POKE 指令时,必须使用标准(未优化的)数据块。 同时需要注意 PEEK 和 POKE 指令仅用于传输数据。 它们无法识别地址中的数据类型。

PEEK(area:=_in_,

dbNumber:=_in_, byteOffset:=_in_);

PEEK_WORD(area:=_in_,

dbNumber:=_in_, byteOffset:=_in_);

PEEK_DWORD(area:=_in_,

dbNumber:=_in_, byteOffset:=_in_);

PEEK_BOOL(area:=_in_,

dbNumber:=_in_, byteOffset:=_in_, bitOffset:=_in_);

读取引用数据块、I/O 或存储区中由

byteOffset 引用的字节。引用数据块示例:

%MB100 := PEEK(area:=16#84,

dbNumber:=1, byteOffset:=#i);

引用 IB3 输入示例:

%MB100 := PEEK(area:=16#81,

dbNumber:=0, byteOffset:=#i); // when

#i = 3

读取引用数据块、I/O 或存储区中由

byteOffset 引用的字。示例:

%MW200 := PEEK_WORD(area:=16#84,

dbNumber:=1, byteOffset:=#i);

读取引用数据块、I/O 或存储区中由

byteOffset 引用的双字。示例:

%MD300 := PEEK_DWORD(area:=16#84,

dbNumber:=1, byteOffset:=#i);

读取引用数据块、I/O 或存储区中由

bitOffset 和 byteOffset 引用的布尔值。示例:

%MB100.0 := PEEK_BOOL(area:=16#84,

dbNumber:=1, byteOffset:=#ii, bitOffset:=#j);

POKE(area:=_in_,

dbNumber:=_in_, byteOffset:=_in_, value:=_in_);

POKE_BOOL(area:=_in_,

dbNumber:=_in_, byteOffset:=_in_, bitOffset:=_in_, value:=_in_);

POKE_BLK(area_src:=_in_,

dbNumber_src:=_in_, byteOffset_src:=_in_, area_dest:=_in_, dbNumber_dest:=_in_, byteOffset_dest:=_in_, count:=_in_);

向由 byteOffset 引用的引用数据块、I/O 或存储区中写入值(Byte、Word 或 DWord)

引用数据块示例:

POKE(area:=16#84, dbNumber:=2, byteOffset:=3, value:="Tag_1");

引 用 QB3 输 出 示 例 : POKE(area:=16#82, dbNumber:=0, byteOffset:=3, value:="Tag_1");

向由 bitOffset 和 byteOffset 引用的引用数据块、I/O 或存储区中写入布尔值

示例:

POKE_BOOL(area:=16#84, dbNumber:=2, byteOffset:=3, bitOffset:=5, value:=0);

将引用源数据块、I/O 或存储区从引用字节偏移量开始的共“count”个字节,写入引用目标数据块、I/O 或存储区中引用的 byteOffset 区域

示 例 : POKE_BLK(area_src:=16#84, dbNumber_src:=#src_db, byteOffset_src:=#src_byte, area_dest:=16#84, dbNumber_dest:=#src_db, byteOffset_dest:=#src_byte, count:=10);

对于 PEEK 和 POKE 指令,“area”、“area_src”和“area_dest”参数可以使用以下值。 对于数据块以外的其它区域,dbNumber 参数必须为 0。

16#81 I
16#82 Q
16#83 M
16#84 DB

从 SCL 程序中调用其它代码块

要调用用户程序中的其它代码块,只需使用参数输入 FB 或 FC 的名称(或绝对地址)。对于 FB,还必须提供 FB 待调用的背景数据块。

<DB 名称> (参数列表) 作为单个背景调用

<#背景名称> (参数列表) 作为多重背景调用

"MyDB"(MyInput:=10, MyInOut:="Tag1");

<FC 名称> (参数列表) 标准调用

<操作数>:=<FC 名称> (参数列表) 在表达式中调用

"MyFC"(MyInput:=10, MyInOut:="Tag1");

还可将块从导航树中拖动到 SCL 程序编辑器中,然后完成参数分配。

LAD、FBD 和 SCL 的 EN 和 ENO

确定指令的“能流”(EN 和 ENO)

特定指令(如数学和移动指令)为 EN 和 ENO 提供参数。 这些参数与 LAD 或 FBD 中的能流有关并确定在该扫描期间是否执行指令。 SCL 还允许用户为代码块设置 ENO 参

数。

EN(使能输入)是布尔输入。 要执行功能框指令,能流 (EN = 1) 必须出现在此输入端。 如果 LAD 框的 EN 输入直接连接到左侧电源线,将始终执行该指令。

ENO(使能输出)是布尔输出。 如果该功能框在 EN 输入端有能流且正确执行了其功能,则 ENO 输出会将能流 (ENO = 1) 传递到下一个元素。 如果执行功能框指令时检测到错误,则在产生该错误的功能框指令处终止该能流 (ENO = 0)。

表格 6- 3 EN 和 ENO 的操作数

程序编辑器 输入/输出 操作数 数据类型
LAD EN, ENO 能流 Bool
FBD EN I、I:P、Q、M、DB、Temp、能流 Bool
ENO 能流 Bool
程序编辑器 输入/输出 操作数 数据类型
SCL EN1 TRUE, FALSE Bool
ENO2 TRUE, FALSE Bool

1 EN 仅适用于 FB。

2 ENO 可以与 SCL 代码块一起使用。 代码块完成时,用户必须组态 SCL 编译器来设置 ENO。

通过组态 SCL 来设置 ENO

要组态 SCL 编译器以设置 ENO,请按以下步骤操作:

从“选项”(Options) 菜单中选择“设置”(Settings) 命令。

展开“PLC 编程”(PLC programming) 属性并选择“SCL(结构化控制语言)”(SCL (Structured Control Language))。

选择“自动设置 ENO”(Set ENO automatically) 选项。

Ret_Val 或 Status 参数对 ENO 的影响

某些指令(如通信指令或字符串转换指令)提供一个输出参数,其中包含有关指令处理的信息。 例如,某些指令提供通常为 Int 数据类型的 Ret_Val(返回值)参数,其中包含 - 32768 到 +32767 范围内的状态信息。还有些指令提供通常为 Word 数据类型的 Status 参数,其中存储十六进制值 16#0000 到 16#FFFF 范围内的状态信息。 Ret_Val 或

Status 参数中存储的数字值确定该指令的 ENO 状态。

Ret_Val:介于 0 至 32767 的值通常设置 ENO = 1(即 TRUE)。 介于 -32768 至 -1

的值通常设置 ENO = 0(即 FALSE)。 要评估 Ret_Val,将表示法更改为十六进制。

Status:介于 16#0000 至 16#7FFF 的值通常设置 ENO = 1(即 TRUE)。 介于

16#8000 至 16#FFFF 的值通常设置 ENO = 0(即 FALSE)。

需要多次扫描才能执行的指令通常提供 Busy 参数 (Bool),用于表示指令处于活动状态, 但尚未完成执行。 此类指令通常还提供 Done 参数 (Bool) 和 Error 参数 (Bool)。Done 表示指令已完成且无错误,而 Error 表示指令已完成,但存在错误情况。

Busy = 1(即 TRUE)时,ENO = 1(即 TRUE)。

Done = 1(即 TRUE)时,ENO = 1(即 TRUE)。

Error = 1(即 TRUE)时,ENO = 0(即 FALSE)。

参见

OK 和 Not OK 指令 (页 202)

保护

CPU 的访问保护

CPU 提供了三个安全等级,用于限制对特定功能的访问。 为 CPU 组态安全等级和密码时,可以对那些不输入密码就能访问的功能和存储区进行限制。

密码区分大小写。

s7-1200编程-8 要组态密码,请按以下步骤操作:

在“设备配置”(Device

configuration) 中,选择

CPU。

在巡视窗口中,选择“属性”(Properties) 选项卡。

选择“保护”(Protection) 属性以选择保护等级和输入密 码。

每个等级都允许在访问某些功能时不使用密码。 CPU 的默认状态是没有任何限制,也没有密码保护。 要限制 CPU 的访问,可以对 CPU 的属性进行组态并输入密码。

通过网络输入密码并不会使 CPU 的密码保护受到威胁。 密码保护不适用于用户程序指令的执行,包括通信功能。 输入正确的密码便可访问所有功能。

PLC 到 PLC 通信(使用代码块中的通信指令)不受 CPU 中安全等级的限制。 HMI 功能同样也不受限制。

6.6 保护

表格 6- 4 CPU 的安全级别

安全等级 访问限制
无保护 允许完全访问,没有密码保护。
写保护 允许 HMI 访问和各种形式的 PLC 到 PLC 通信,没有密码保护。

以下情况下需要密码:修改(写入)CPU 以及更改 CPU 模式 (RUN/STOP)。

读/写保护 允许 HMI 访问和各种形式的 PLC 到 PLC 通信,没有密码保护。

以下情况下需要密码:读取 CPU 中的数据、修改(写入)CPU 以及更改 CPU 模式

(RUN/STOP)。

专有技术保护

专有技术保护可防止程序中的一个或多个代码块(OB、FB、FC 或 DB)受到未经授权的访问。 用户创建密码以限制对代码块的访问。 密码保护会防止对代码块进行未授权的读取或修改。 如果没有密码,只能读取有关代码块的以下信息:

块标题、块注释和块属性

传送参数(IN、OUT、IN_OUT、Return)

程序的调用结构

交叉引用中的全局变量(不带使用时的信息),但局部变量已隐藏 将块组态为“专有技术”保护时,只有在输入密码后才能访问块内的代码。

使用代码块的“属性”(Properties) 任务卡组态该块的专有技术保护。 打开代码块后,从“属性”(Properties) 中选择“保护”(Protection)。

s7-1200编程-9

s7-1200编程-10 在代码块的“属性”(Properties) 中,单击

“保护”(Protection) 按钮显示“专有技术保护”(Know-how protection) 对话框。

单击“定义”(Define) 按钮输入密码。

s7-1200编程-11 输入并确认密码后,单击“确定”(OK)。

复制保护

附加安全特性允许捆绑程序或代码块,以用于特定存储卡或 CPU。 该特性对于保护您的知识产权特别有用。 当您将程序或块与特定设备捆绑在一起时,就会将程序或代码块限制为仅用于特定存储卡或 CPU。 该特性允许您以电子方式(如通过 Internet 或通过电子邮件)或通过发送内存匣分布程序或代码块。

使用代码块的“属性”(Properties) 任务卡将块捆绑到特定 CPU 或存储卡。

打开代码块之后选择“保护”(Protection)。

6.7 下载程序的元素

s7-1200编程-12

在“复制保护”(Copy protection) 任务下的下拉列表中,选择将代码块捆绑到存储卡或特定 CPU 的相应选项。

s7-1200编程-13

选择复制保护的类型并输入存储卡或 CPU 的序列号。说明

序列号区分大小写。

下载程序的元素

可将项目的元素从编程设备下载到 CPU。 下载项目时,CPU 会将用户程序(OB、FC、

FB 和 DB)存储在永久存储器中。

s7-1200编程-14

从 CPU 上传

可从以下任何位置将项目从编程设备下载到 CPU:

“项目树”(Project tree): 右键单击程序元素,然后单击上下文相关的“下载”(Download) 选择项。

“在线”(Online) 菜单: 单击“下载到设备”(Download to device) 选择项。

工具栏: 单击“下载到设备”(Download to device) 图标。

从 CPU 上传

复制项目元素

还可以由在线 CPU 或连接到编程设备的存储卡复制程序块。

s7-1200编程-15 为复制的程序块准备离线项目:

添加一个与在线 CPU 匹配的 CPU 设备。

展开该 CPU 节点一次,以便“程序块”(Program

blocks) 文件夹可见。

要从在线 CPU 向离线项目上传程序块,请按照以下步骤操作:

s7-1200编程-16 s7-1200编程-17

在离线项目中,单击“程序块”(Program blocks) 文件夹。

单击“转到在线”(Go online) 按钮。

单击“上传”(Upload) 按钮。

在 “上传”(Upload) 对话框 (页 731)中,确认所选项。

6.8 从 CPU 上传

s7-1200编程-18 此外,还可以按照以下步骤操作:

在项目浏览器中展开“在线访问”(Online access) 的节点,以选择在线 CPU 中的程序块:

展开网络节点并双击“更新可访问设备”(Update accessible devices)。

展开 CPU 的节点。

从在线 CPU 中拖动“程序块”(Program blocks) 文件夹,然后放入您离线项目的“程序块”(Program

blocks) 文件夹中。

在“上传预览”(Upload preview) 对话框中选择“继续”(Continue) 框,然后单击“从设备上传”(Upload from device) 按钮。

s7-1200编程-19 完成上传后,将在离线区域中显示所有程序块、工艺块和变量。

说明

可以将在线 CPU 中的程序块复制到现有程序中。 离线项目的“程序块”(Program-blocks) 文件夹不需要为空。 但是,现有程序将被删除并用在线 CPU 中的用户程序替代。

使用比较功能

使用 STEP 7 中的“比较”编辑器 (页 737),可以查找在线和离线项目之间的差异。 此功能在从 CPU 进行上传之前非常有用。

调试和测试程序

监视和修改 CPU 中的数据

如下表所示,可以监视和修改在线 CPU 中的值。

表格 6- 5 使用 STEP 7 监视和修改数据

编辑器 监视 修改 强制
监视表格 支持 支持
强制表格 支持 不支持 支持
程序编辑器 支持 支持 不支持
变量表 支持 不支持 不支持
DB 编辑器 支持 不支持 不支持

s7-1200编程-20 通过监视表格监视

s7-1200编程-21 通过 LAD 编辑器监视

有关 监视和修改 CPU 中的数据 (页 738)的更多信息,请参见“在线和诊断”一章。

监视表格和强制表格

使用“监视表格”监视和修改正在由在线 CPU 执行的用户程序的值。 可在项目中创建并保存不同的监视表格以支持各种测试环境。 这使得用户可以在调试期间或出于维修和维护目的重新进行测试。

通过监视表格,可监视 CPU 并与 CPU 交互,如同 CPU 执行用户程序一样。 不仅可以显示或更改代码块和数据块的变量值,还可以显示或更改 CPU 存储区的值,包括输入和输出(I 和 Q)、外围设备输入 (I:P)、位存储器 (M) 和数据块 (DB)。

通过监视表格,可在 STOP 模式下启用 CPU 的物理输出 (Q:P)。 例如,测试 CPU 的接线时可为输出端赋特定值。

STEP 7 还提供强制表格,用于将变量“强制”设为特定值。 有关强制的更多信息,请参见

“在线和诊断”一章的 CPU 中的强制值 (页 745)一节。

说明

强制值存储在 CPU 中,而不是监视表格中。

无法强制输入(或“I”地址)。 但是,可以强制外围设备输入。 要强制外围设备输入,请在地址后面添加一个“:P”(例如:“On:P”)。

用于显示使用情况的交叉引用

巡视窗口可显示有关所选对象在整个项目中使用情况的交叉引用信息,例如用户程序、CPU 以及任何 HMI 设备。 “交叉引用”(Cross-reference) 选项卡显示使用了所选对象的实例和使用该对象的其它对象。 巡视窗口还包括交叉引用中仅在线可用的块。 要显示交叉引用,请选择“显示交叉引用”(Show cross-references) 命令。 (在项目视图中,可在“工具”(Tools) 菜单中找到交叉引用。)

说明

不必关闭编辑器即可看到交叉引用信息。

可以对交叉引用中的条目进行排序。 交叉引用列表提供用户程序中存储器地址和变量的使用概况。

创建和更改程序时,用户始终能够掌握所使用的操作数、变量和块调用情况。

从交叉引用可直接跳转到操作数和变量的使用位置。

在程序测试或故障排除期间,系统会通知您哪个块中的哪条命令在处理哪个存储单元、哪个画面在使用哪个变量,以及哪个块被其它哪个块调用。

表格 6- 6 交叉引用的元素

说明
对象

(Object)

使用下级对象或被下级对象使用的对象的名称
数量

(Quantity)

使用数量
说明
位置

(Location)

每个使用位置,例如,程序段
属性

(Property)

被引用对象的特定属性,例如,多重背景声明中的变量名称
作为 (as) 显示对象的更多相关信息,例如,背景数据块用作模板还是用作多重背景
访问

(Access)

访问类型,对操作数的访问是读访问 (R)、写访问 (W) 还是二者的组合。
地址

(Address)

操作数的地址
类型 (Type) 有关创建对象所使用的类型和语言的信息
路径 (Path) 对象在项目树中的路径

用于检查调用层级的调用结构

调用结构描述了用户程序中块的调用层级。 其提供了以下几个方面的概要信息:所用的块、对其它块的调用、各个块之间的关系、每个块的数据要求以及块的状态。 可从调用结构打开程序编辑器并对块进行编辑。

显示调用结构时会显示用户程序中使用的块的列表。 STEP 7 高亮显示调用结构的第一 级,并显示未被程序中的其它任何块调用的所有块。 调用结构的第显示 OB 以及未被 OB 调用的所有 FC、FB 和 DB。如果某个代码块调用了其它块,则被调用块将以缩进方式显示在调用块的下方。 调用结构仅显示被代码块调用的那些块。

可以选择在调用结构中仅显示导致冲突的块。 下列情况会导致冲突:

块执行的任何调用具有更旧或更新代码时间戳

块所调用块的接口已更改

块所使用变量的地址和/或数据类型已更改

块未被 OB 直接或间接调用

块调用了不存在的块或缺失的块

可以将多个块调用和数据块分为一组。 可使用下拉列表来查看指向各个调用位置的链接。

还可执行一致性检查以显示时间戳冲突。 若在生成程序期间或之后更改块的时间戳,将导致时间戳冲突,而这又会导致调用块和被调用块间出现不一致。

通过重新编译代码块可纠正大多数时间戳和接口冲突。

如果通过编译无法解决不一致问题,可使用“详细资料”(Details) 列中的链接转到程序编辑器中的问题源。 然后可手动消除任何不一致情况。

必须重新编译所有以红色标记的块

weinxin
plc入门知识问答
每一个PLC工程师都应该关注的微信公众账号,只需输入您的问题,就会有答案

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: