s7一1200功能指令表 基本指令

2018年6月21日22:46:20 发表评论 1,510 阅读

基本指令

基本指令 7

位逻辑

位逻辑触点和线圈

使用 LAD 和 FBD 处理布尔逻辑非常高效。 SCL 不但非常适合处理复杂的数学计算和项目控制结构,而且也可以使用 SCL 处理布尔逻辑。

LAD 触点

表格 7- 1 常开触点和常闭触点

LAD SCL 说明
s7一1200功能指令表 基本指令-1 IF in THEN

Statement;

ELSE

Statement; END_IF;

常开触点和常闭触点: 可将触点相互连接并创建用户自己的组合逻辑。 如果用户指定的输入位使用存储器标识符 I(输入)或

Q(输出),则从过程映像寄存器中读取位值。 控制过程中的物理触点信号会连接到 PLC 上的 I 端子。 CPU 扫描已连接的输入信号并持续更新过程映像输入寄存器中的相应状态值。

通过在 I 偏移量后追加“:P”,可指定立即读取物理输入(例如:

“%I3.4:P”)。 对于立即读取,直接从物理输入读取位数据值, 而非从过程映像中读取。 立即读取不会更新过程映像。

s7一1200功能指令表 基本指令-2 IF NOT (in) THEN

Statement;

ELSE

Statement; END_IF;

表格 7- 2 参数的数据类型

参数 数据类型 说明
IN Bool 分配位

在赋的位值为 1 时,常开触点将闭合 (ON)。

在赋的位值为 0 时,常闭触点将闭合 (ON)。

以串联方式连接的触点创建 AND 逻辑程序段。

以并联方式连接的触点创建 OR 逻辑程序段。

FBD、AND、OR 和 XOR 功能框

在 FBD 编程中,LAD 触点程序段变为与 (&)、或 (>=1) 和异或 (x) 功能框程序段,可在其中为功能框输入和输出指定位值。 也可以连接到其它逻辑框并创建用户自己的逻辑组

合。 在程序段中放置功能框后,可从“收藏夹”(Favorites) 工具栏或指令树中拖动“插入输

入”(Insert input) 工具,然后将其放置在功能框的输入侧以添加更多输入。 也可以右键单击功能框输入连接器并选择“插入输入”(Insert input)。

功能框输入和输出可连接到其它逻辑框,也可输入未连接输入的位地址或位符号名称。 执行功能框指令时,当前输入状态会应用到二进制功能框逻辑,如果为真,功能框输出将为真。

表格 7- 3 AND、OR 和 XOR 功能框

FBD SCL1 说明
s7一1200功能指令表 基本指令-3 out := in1 AND in2; AND 功能框的所有输入必须都为“真”,输出才为“真”。
s7一1200功能指令表 基本指令-4 out := in1 OR in2; OR 功能框只要有一个输入为“真”,输出就为“真”。
s7一1200功能指令表 基本指令-5 out := in1 XOR in2; XOR 功能框必须有奇数个输入为“真”,输出才为“真”。

1 对于 SCL: 必须将运算的结果赋给要用于其它语句的变量。

表格 7- 4 参数的数据类型

参数 数据类型 说明
IN1, IN2 Bool 输入位

NOT 逻辑反相器

表格 7- 5 NOT 逻辑反相器

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-6 s7一1200功能指令表 基本指令-7 NOT 对于 FBD 编程,可从“收藏夹”(Favorites) 工具栏或指令树中拖动“取反二进制输入”(Negate binary input) 工具,然后将其
放置在输入或输出端以在该功能框连接器上创建逻辑反相
s7一1200功能指令表 基本指令-8
器。
LAD NOT 触点取反能流输入的逻辑状态。
如果没有能流流入 NOT 触点,则会有能流流出。
如果有能流流入 NOT 触点,则没有能流流出。

输出线圈和赋值功能框

线圈输出指令写入输出位的值。 如果用户指定的输出位使用存储器标识符 Q,则 CPU 接通或断开过程映像寄存器中的输出位,同时将指定的位设置为等于能流状态。 控制执行器的输出信号连接到 CPU 的 Q 端子。 在 RUN 模式下,CPU 系统将连续扫描输入信

号,并根据程序逻辑处理输入状态,然后通过在过程映像输出寄存器中设置新的输出状态值进行响应。 在每个程序执行循环之后,CPU 系统会将存储在过程映像寄存器中的新的输出状态响应传送到已连接的输出端子。

表格 7- 6 输出线圈 (LAD) 和输出赋值功能框 (FBD)

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-9 s7一1200功能指令表 基本指令-10 out := <布尔表达式

>;

在 FBD 编程中,LAD 线圈变为分配(= 和 /=)功能框,可在其中为功能框输出指定位地址。 功能
框输入和输出可连接到其它功能框逻辑,用户也可

以输入位地址。

s7一1200功能指令表 基本指令-11 s7一1200功能指令表 基本指令-12 out := NOT <布尔表达式>;
通过在 Q 偏移量后加上“:P”,可指定立即写入物理输出(例如: “%Q3.4:P”)。 对于立即写入,将
s7一1200功能指令表 基本指令-13
位数据值写入过程映像输出并直接写入物理输出。

表格 7- 7 参数的数据类型

参数 数据类型 说明
OUT Bool 分配位

如果有能流通过输出线圈或启用了 FBD“=”功能框,则输出位设置为 1。

如果没有能流通过输出线圈或未启用 FBD“=”赋值功能框,则输出位设置为 0。

如果有能流通过反向输出线圈或启用了 FBD“/=”功能框,则输出位设置为 0。

如果没有能流通过反向输出线圈或未启用 FBD“/=”功能框,则输出位设置为 1。

置位和复位指令

置位和复位 1 位

表格 7- 8 S 和 R 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-14 s7一1200功能指令表 基本指令-15 不提供 S(置位)激活时,OUT 地址处的数据值设置为 1。S

未激活时,OUT 不变。

s7一1200功能指令表 基本指令-16 s7一1200功能指令表 基本指令-17 不提供 R(复位)激活时,OUT 地址处的数据值设置为 0。R

未激活时,OUT 不变。

1 对于 LAD 和 FBD: 这些指令可放置在程序段的任何位置。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 9 参数的数据类型

参数 数据类型 说明
IN(或连接到触点/门逻辑) Bool 要监视的位位置
OUT Bool 要置位或复位的位位置

置位和复位位域

表格 7- 10 SET_BF 和 RESET_BF 指令

LAD1 FBD SCL 说明
s7一1200功能指令表 基本指令-18 s7一1200功能指令表 基本指令-19 不提供 SET_BF 激活时,为从地址 OUT 处开始的“n”位分配数据值 1。 SET_BF 未激活时,OUT 不变。
s7一1200功能指令表 基本指令-20 s7一1200功能指令表 基本指令-21 不提供 RESET_BF 为从地址 OUT 处开始的“n”位写入数据值

0。 RESET_BF 未激活时,OUT 不变。

1 对于 LAD 和 FBD: 这些指令必须是分支中最右端的指令。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 11 参数的数据类型

参数 数据类型 说明
OUT Bool 要置位或复位的位域的起始元素(例如 #MyArray[3])
n 常数 (UInt) 要写入的位数

置位优先和复位优先位锁存

表格 7- 12 RS 和 SR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-22 不提供 RS 是置位优先锁存,其中置位优先。 如果置位 (S1) 和复位 (R) 信号都为真,则输出地址 OUT 将为 1。
s7一1200功能指令表 基本指令-23 不提供 SR 是复位优先锁存,其中复位优先。 如果置位 (S) 和复位 (R1) 信号都为真,则输出地址 OUT 将为 0。

1 对于 LAD 和 FBD: 这些指令必须是分支中最右端的指令。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 13 参数的数据类型

参数 数据类型 说明
S, S1 Bool 置位输入;1 表示优先
R, R1 Bool 复位输入;1 表示优先
OUT Bool 分配的位输出“OUT”
Q Bool 遵循“OUT”位的状态

OUT 参数指定置位或复位的位地址。 可选 OUT 输出 Q 反映“OUT”地址的信号状态。

指令 S1 R “OUT”位
RS 0 0 先前状态
0 1 0
1 0 1
1 1 1
S R1
SR 0 0 先前状态
0 1 0
1 0 1
1 1 0

上升沿和下降沿指令

表格 7- 14 上升沿和下降沿跳变检测

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-24 s7一1200功能指令表 基本指令-25 不提供 LAD: 在分配的“IN”位上检测到正跳变(断到通)时,该触点的状态为 TRUE。 该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。 P 触点可以放置在程序段中除分支结尾外的任何位置。

FBD: 在分配的输入位上检测到正跳变(关到开)时,输出逻辑状态为 TRUE。 P 功能框只能放置在分支的开头。

s7一1200功能指令表 基本指令-26 s7一1200功能指令表 基本指令-27 不提供 LAD: 在分配的输入位上检测到负跳变(开到关)时,该触点的状态为 TRUE。 该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。 N 触点可以放置在程序段中除分支结尾外的任何位置。

FBD: 在分配的输入位上检测到负跳变(开到关)时,输出逻辑状态为 TRUE。 N 功能框只能放置在分支的开头。

s7一1200功能指令表 基本指令-28 s7一1200功能指令表 基本指令-29 不提供 LAD: 在进入线圈的能流中检测到正跳变(关到开)时,分配的位“OUT”为 TRUE。 能流输入状态总是通过线圈后变为能流输出状态。 P 线圈可以放置在程序段中的任何位置。

FBD: 在功能框输入连接的逻辑状态中或输入位赋值中(如果该功能框位于分支开头)检测到正跳变(关到开)时,分配的位“OUT”为 TRUE。 输入逻辑状态总是通过功能框后变为输

出逻辑状态。 P= 功能框可以放置在分支中的任何位置。

s7一1200功能指令表 基本指令-30 s7一1200功能指令表 基本指令-31 不提供 LAD: 在进入线圈的能流中检测到负跳变(开到关)时,分配的位“OUT”为 TRUE。 能流输入状态总是通过线圈后变为能流输出状态。 N 线圈可以放置在程序段中的任何位置。

FBD: 在功能框输入连接的逻辑状态中或在输入位赋值中

(如果该功能框位于分支开头)检测到负跳变(通到断)时,

分配的位“OUT”为 TRUE。 输入逻辑状态总是通过功能框后变为输出逻辑状态。 N= 功能框可以放置在分支中的任何位置。

1 对于 SCL: 必须在应用程序内编写代码来复制该函数。

表格 7- 15 P_TRIG 和 N_TRIG 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-32 不提供 在 CLK 输入状态 (FBD) 或 CLK 能流输入 (LAD) 中检测到正跳变(断到通)时,Q 输出能流或逻辑状态为 TRUE。

在 LAD 中,P_TRIG 指令不能放置在程序段的开头或结尾。 在

FBD 中,P_TRIG 指令可以放置在除分支结尾外的任何位置。

s7一1200功能指令表 基本指令-33 不提供 在 CLK 输入状态 (FBD) 或 CLK 能流输入 (LAD) 中检测到负跳变(通到断)时,Q 输出能流或逻辑状态为 TRUE。

在 LAD 中,N_TRIG 指令不能放置在程序段的开头或结尾。 在

FBD 中,N_TRIG 指令可以放置在除分支结尾外的任何位置。

1 对于 SCL: 必须在应用程序内编写代码来复制该函数。

表格 7- 16 参数的数据类型(P 和 N 触点/线圈、P=、N=、P_TRIG 和 N_TRIG)

参数 数据类型 说明
M_BIT Bool 保存输入的前一个状态的存储器位
IN Bool 要检测其跳变沿的输入位
OUT Bool 指示检测到跳变沿的输出位
CLK Bool 要检测其跳变沿的能流或输入位
Q Bool 指示检测到沿的输出

所有沿指令均使用存储器位 (M_BIT) 存储要监视的输入信号的前一个状态。 通过将输入的状态与存储器位的状态进行比较来检测沿。 如果状态指示在关注的方向上有输入变化,则会在输出写入 TRUE 来报告沿。 否则,输出会写入 FALSE。

说明

沿指令每次执行时都会对输入和存储器位值进行评估,包括第一次执行。 在程序设计期间必须考虑输入和存储器位的初始状态,以允许或避免在第一次扫描时进行沿检测。

由于存储器位必须从一次执行保留到下一次执行,所以应该对每个沿指令都使用唯一的位,并且不应在程序中的任何其它位置使用该位。 还应避免使用临时存储器和可受其它系统功能(例如 I/O 更新)影响的存储器。 仅将 M、全局 DB 或静态存储器(在背景 DB 中)用于 M_BIT 存储器分配。

定时器

使用定时器指令可创建编程的时间延时。 用户程序中可以使用的定时器数仅受 CPU 存储器容量限制。 每个定时器均使用 16 字节的 IEC_Timer 数据类型的 DB 结构来存储功能框或线圈指令顶部指定的定时器数据。 STEP 7 会在插入指令时自动创建该 DB。

表格 7- 17 定时器指令

LAD/FBD 功能框 LAD 线圈 SCL 说明
s7一1200功能指令表 基本指令-34 s7一1200功能指令表 基本指令-35 "IEC_Timer_0_DB".TP( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_, ET=>_time_out_); TP 定时器可生成具有预设宽度时间的脉冲。
s7一1200功能指令表 基本指令-36 s7一1200功能指令表 基本指令-37 "IEC_Timer_0_DB".TON ( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_,

ET=>_time_out_);

TON 定时器在预设的延时过后将输出 Q 设置为 ON。
s7一1200功能指令表 基本指令-38 s7一1200功能指令表 基本指令-39 "IEC_Timer_0_DB".TOF ( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_, ET=>_time_out_); TOF 定时器在预设的延时过后将输出 Q 重设为 OFF。
s7一1200功能指令表 基本指令-40 s7一1200功能指令表 基本指令-41 "IEC_Timer_0_DB".TONR ( IN:=_bool_in_, R:=_bool_in_ PT:=_time_in_, Q=>_bool_out_,

ET=>_time_out_);

TONR 定时器在预设的延时过后将输出 Q 设置为 ON。 在使用 R 输入重置经过的时间之前,会跨越多个定时时段一直累加经过的时间。
仅 FBD:

s7一1200功能指令表 基本指令-42

s7一1200功能指令表 基本指令-43 (无对应的 SCL 指令) PT(预设定时器)线圈会在指定的

IEC_Timer 中装载新的 PRESET 时间值。

仅 FBD:

s7一1200功能指令表 基本指令-44

s7一1200功能指令表 基本指令-45 (无对应的 SCL 指令) RT(复位定时器)线圈会复位指定的

IEC_Timer。

1 STEP 7 会在插入指令时自动创建 DB。

2 在 SCL 示例中,“IEC_Timer_0_DB”是背景 DB 的名称。

表格 7- 18 参数的数据类型

参数 数据类型 说明
功能框: IN

线圈: 能流

Bool TP、TON 和 TONR:

功能框: 0=禁用定时器,1=启用定时器

线圈: 无能流=禁用定时器,能流=启用定时器

TOF:

功能框: 0=启用定时器,1=禁用定时器

线圈: 无能流=启用定时器,能流=禁用定时器

R Bool 仅 TONR 功能框:

0=不重置

1= 将经过的时间和 Q 位重置为 0

功能框: PT

线圈: "PRESET_Tag"

Time 定时器功能框或线圈: 预设的时间输入
功能框: Q

线圈: DBdata.Q

Bool 定时器功能框: Q 功能框输出或定时器 DB 数据中的 Q 位定时器线圈: 仅可寻址定时器 DB 数据中的 Q 位
功能框: ET

线圈: DBdata.ET

Time 定时器功能框: ET(经历的时间)功能框输出或定时器 DB 数据中的 ET 时间值

定时器线圈: 仅可寻址定时器 DB 数据中的 ET 时间值。

表格 7- 19 PT 和 IN 参数值变化的影响

定时器 PT 和 IN 功能框参数和相应线圈参数的变化
TP 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,更改 IN 没有任何影响。

TON 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,将 IN 更改为 FALSE 会复位并停止定时器。

TOF 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,将 IN 更改为 TRUE 会复位并停止定时器。

TONR 定时器运行期间更改 PT 没有任何影响,但对定时器中断后继续运行会有影响。

定时器运行期间将 IN 更改为 FALSE 会停止定时器但不会复位定时器。 将 IN 改回

TRUE 将使定时器从累积的时间值开始定时。

PT(预设时间)和 ET(经过的时间)值以表示毫秒时间的有符号双精度整数形式存储在指定的 IEC_TIMER DB 数据中。 TIME 数据使用 T# 标识符,可以简单时间单元

(T#200ms 或 200)和复合时间单元(如 T#2s_200ms)的形式输入。

表格 7- 20 TIME 数据类型的大小和范围

数据类型 大小 有效数值范围 1
TIME 32 位,以

DInt 数据的形式存储

T#-24d_20h_31m_23s_648ms 到 T#24d_20h_31m_23s_647ms

以 -2,147,483,648 ms 到 +2,147,483,647 ms 的形式存储

1 在定时器指令中,无法使用上面所示 TIME 数据类型的负数范围。 负的 PT(预设时间)值在定时器指令执行时被设置为 0。 ET(经过的时间)始终为正值。

定时器线圈示例

-(TP)-、-(TON)-、-(TOF)- 和 -(TONR)- 定时器线圈必须是 LAD 网络中的最后一个指令。如定时器示例中所示,后面网络中的触点指令会求出定时器线圈 IEC_Timer DB 数据中的

Q 位值。 同样,如果要在程序中使用经过的时间值,必须访问 IEC_timer DB 数据中的

ELAPSED 元素。

s7一1200功能指令表 基本指令-46

当 Tag_Input 位的值由 0 转换为 1 时,脉冲定时器启动。 定时器开始运行并持续

Tag_Time 时间值指定的时间。

s7一1200功能指令表 基本指令-47

只要定时器运行,就存在 DB1.MyIEC_Timer.Q 状态=1 且 Tag_Output 值=1。当经过

Tag_Time 值后,DB1.MyIEC_Timer.Q=0 且 Tag_Output 值=0。

37 37 37
37 37

重置定时器 -(RT)- 和预设定时器 -(PT)- 线圈

这些线圈指令可与功能框或线圈定时器一起使用并可放置在中间位置。 线圈输出能流状态始终与线圈输入状态相同。 若 -(RT)- 线圈激活,指定 IEC_Timer DB 数据中的

ELAPSED 时间元素将重置为 0。若 -(PT)- 线圈激活,指定 IEC_Timer DB 数据中的

PRESET 时间元素将重置为 0。

说明

在 FB 中放置定时器指令时,可以选择“多重背景数据块”(Multi-instance data block) 选项。 各定时器结构名称可以对应不同的数据结构,但定时器数据包含在同一个数据块 中,无需为每个定时器都使用一个独立的数据块。 这样可减少处理定时器所需的处理时间和数据存储空间。 在共享的多重背景数据块中的定时器数据结构之间不存在交互作 用。

定时器的运行

表格 7- 21 IEC 定时器的类型

定时器 时序图
TP: 脉冲定时器 ,1
TP 定时器可生成具有预设宽度时间的脉冲。
(7
37
4
TON: 接通延迟定时器 ,1
TON 定时器在预设的延时过后将输出 Q 设置为

ON。

(7 37
4
37 37
定时器 时序图
TOF: 关断延迟定时器 ,1
TOF 定时器在预设的延时过后将输出 Q 重置为
OFF。 (7 37
4
TONR: 保持型接通延迟定时器 ,1
TONR 定时器在预设的延时过后将输出 Q 设置
为 ON。 在使用 R 输入重置经过的时间之前,会 (7 37
跨越多个定时时段一直累加经过的时间。
4
5

说明

在 CPU 中,没有给任何特定的定时器指令分配专门的资源。 每个定时器使用 DB 存储器中其自身的结构和一个连续运行的内部 CPU 定时器来执行定时。

当由于 TP、TON、TOF 或 TONR 指令的输入上出现沿跳变而启动定时器时,连续运行的内部 CPU 定时器的值将被复制到为该定时器指令分配的 DB 结构的 START 成员中。该起始值在定时器继续运行期间将保持不变,随后将在每次更新定时器时使用。 每次启动定时器时,都会从内部 CPU 定时器将一个新的起始值加载到定时器结构中。

更新定时器时,将从内部 CPU 定时器的当前值中减去上述起始值以确定经过的时间。 再将经过的时间与预设值进行比较以确定定时器 Q 位的状态。 然后在为该定时器分配的

DB 结构中,更新 ELAPSED 和 Q 成员。 注意,经过的时间将停留在预设值上(达到预设值后定时器便不会继续累加经过的时间)。

当且仅当满足以下条件时才会执行定时器更新:

已执行定时器指令(TP、TON、TOF 或 TONR)

某个指令直接引用 DB 中定时器结构的“ELAPSED”成员

某个指令直接引用 DB 中定时器结构的“Q”成员

定时器编程

规划和创建用户程序时应考虑以下定时器运行说明:

可在同一个扫描周期内多次更新定时器。 每次执行定时器指令(TP、TON、TOF、

TONR)和每次将定时器结构的 ELAPSED 或 Q 成员用作其它已执行指令的参数时, 都会更新定时器。 这在需要最新时间数据(本质上是立即读取定时器)时会是一项优点。 但是,如果希望在整个程序扫描周期内保持一致的值,则请将定时器指令放置在需要这些值的其它所有指令之前,并使用定时器指令的 Q 和 ET 输出中的变量而不是定时器 DB 结构的 ELAPSED 和 Q 成员。

扫描期间可以不执行定时器更新。 可以在函数中启动定时器,然后在一个或多个扫描周期内不再调用该函数。 如果没有执行引用定时器结构中 ELAPSED 或 Q 成员的其它指令,则不会更新定时器。 直到再次执行定时器指令或执行将定时器结构的

ELAPSED 或 Q 用作参数的其它指令时,才会再次更新定时器。

尽管并不常见,但可以将同一个 DB 定时器结构分配给多个定时器指令。 通常,为避免意外交互作用,应当使每个 DB 定时器结构仅对应一个定时器指令(TP、TON、

TOF、TONR)。

自复位定时器适合用于触发需要周期性发生的动作。 通常,将引用定时器位的常闭触点放置在定时器指令前面可创建自复位定时器。 该定时器网络通常位于使用该定时器位来触发动作的一个或多个依赖型网络上面。 当定时器时间已到(经过的时间达到预设值)时,定时器位将在一个扫描周期内为 ON,因而可执行由该定时器位控制的依赖型网络逻辑。 下次执行定时器网络时,常闭触点将为 OFF,从而复位定时器并清除定时器位。 下次扫描期间,常闭触点将为 ON,因此将重启定时器。 创建此类自复位定时器时,请勿将定时器 DB 结构的“Q”成员用作该定时器指令前面常闭触点的参数。 而是要使用与该定时器指令的“Q”输出相连的变量。 如果访问定时器 DB 结构的

Q 成员,将导致定时器更新,且如果因常闭触点而更新定时器,该触点将立即复位该定时器。 定时器指令的 Q 输出将在一个扫描周期内不为 ON,并且依赖型网络不会执行。

RUN-STOP-RUN 切换或 CPU 循环上电后保留时间数据

如果从运行模式阶段切换到停止模式或 CPU 循环上电并启动了新运行模式阶段,则存储在之前运行模式阶段中的定时器数据将丢失,除非将定时器数据结构指定为具有保持性

(TP、TON、TOF 和 TONR 定时器)。

将定时器指令放到程序编辑器中后,如果接受调用选项对话框中的默认设置,则将自动分配一个无法实现具有保持性的背景数据块。 要使定时器数据具有保持性,必须使用全局数据块或多重背景数据块。

指定全局数据块将定时器数据存储为保持性数据

无论将定时器放在什么位置(OB、FC 或 FB),该选项都有效。

创建一个全局数据块:

在项目树中双击“添加新块”(Add new block)。

单击数据块 (DB) 图标

对于“类型”(Type),选择“全局数据块”(global DB)。

如果希望能够将该数据块中各数据元素选择为具有保持性,则确保选中数据块类型

“优化”(Optimized) 框。 另一个数据块类型选项“标准 - 与 S7-300/400 兼

容”(Standard - compatible with S7-300/400) 仅允许将所有 DB 数据元素都设置为具有保持性或没有保持性。

单击“确定”(OK)

向该数据块中添加定时器结构:

在新的全局数据块中,添加 IEC_Timer 数据类型的静态变量。

在“保持性”(Retain) 列中,选中相应框以使该结构具有保持性。

重复此过程为要存储在该数据块中的所有定时器创建结构。 可以将每个定时器结构放置在独立的全局数据块中,也可以将多个定时器结构放置在同一个全局数据块 中。 除定时器外,还可以将其它静态变量放置在该全局数据块中。 将多个定时器结构放置在同一个全局数据块中可减少总的块数。

可根据需要重命名定时器结构。

打开程序块来选择保持性定时器的放置位置(OB、FC 或 FB)。

将定时器指令放置在所需位置。

在调用选项对话框出现后,单击“取消”按钮。

在新的定时器指令上方,输入上面所创建全局数据块和定时器结构的名称(请勿使用助手浏览)(例如:“Data_block_3.Static_1”)。

指定多重背景数据块以将定时器数据存储为保持性数据

该选项仅对于将定时器放置在 FB 中有效。

该选项取决于创建 FB 时是否选中了“优化”块访问(仅允许符号访问)。 创建 FB 后,便无法将复选框设置更改为“优化”(Optimized);必须在创建 FB 时,在从树中选择“添加新块”(Add new block) 后出现的第一个屏幕上正确选择该复选框。 要检查现有 FB 访问属性的组态情况,请在项目树中右键单击该 FB,选择“属性”(Properties),然后选择“特

性”(Attributes)。

如果创建 FB 时选中了“优化”(Optimized) 框(仅允许符号访问):

打开 FB 进行编辑。

将定时器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名定时器。

单击“确定”(OK)。 定时器指令将出现在编辑器中,而 IEC_TIMER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有必要,打开 FB 接口编辑器(可能需要单击小箭头以展开视图)。

在“静态”(Static) 下,找到刚刚创建的定时器结构。

在此定时器结构的“保持性”(Retain) 列中,改为选择“保持性”(Retain)。 此后只要从另一程序块调用此 FB,都将利用此接口定义(包含标有保持性的定时器结构)创建背景数据块。

如果创建 FB 时选中了“标准 - 与 S7-300/400 兼容”(Standard - compatible with S7-

300/400) 框(允许符号访问和直接访问):

打开 FB 进行编辑。

将定时器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名定时器。

单击“确定”(OK)。 定时器指令将出现在编辑器中,而 IEC_TIMER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

打开将使用此 FB 的块。

将此 FB 置于所需的位置。 如此将为该 FB 创建一个背景数据块。

打开将 FB 放入编辑器时创建的背景数据块。

在“静态”(Static) 下,找到所需的定时器结构。 在此定时器结构的“保持性”(Retain) 列中,选中相应框使该结构具有保持性。

计数器

表格 7- 22 计数器指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-48 "IEC_Counter_0_DB".CTU( CU:=_bool_in, R:=_bool_in, PV:=_int_in, Q=>_bool_out, CV=>_int_out); 可使用计数器指令对内部程序事件和外部过程事件进行计
数。 每个计数器都使用数据块中存储的结构来保存计数器数
据。 用户在编辑器中放置计数器指令时分配相应的数据块。
CTU 是加计数器
s7一1200功能指令表 基本指令-49 "IEC_Counter_0_DB".CTD( CD:=_bool_in, LD:=_bool_in, PV:=_int_in, Q=>_bool_out,

CV=>_int_out);

CTD 是减计数器
CTUD 是加减计数器
s7一1200功能指令表 基本指令-50 "IEC_Counter_0_DB".CTUD( CU:=_bool_in, CD:=_bool_in, R:=_bool_in, LD:=_bool_in, PV:=_int_in, QU=>_bool_out, QD=>_bool_out, CV=>_int_out);

1 对于 LAD 和 FBD: 从指令名称下的下拉列表中选择计数值数据类型。

2 STEP 7 会在插入指令时自动创建 DB。

3 在 SCL 示例中,“IEC_Counter_0_DB”是背景 DB 的名称。

表格 7- 23 参数的数据类型

参数 数据类型 1 说明
CU, CD Bool 加计数或减计数,按加或减一计数
R (CTU, CTUD) Bool 将计数值重置为零
LD (CTD, CTUD) Bool 预设值的装载控制
PV SInt, Int, DInt, USInt, UInt, UDInt 预设计数值
Q, QU Bool CV >= PV 时为真
QD Bool CV <= 0 时为真
CV SInt, Int, DInt, USInt, UInt, UDInt 当前计数值

1 计数值的数值范围取决于所选的数据类型。 如果计数值是无符号整型数,则可以减计数到零或加计数到范围限值。 如果计数值是有符号整数,则可以减计数到负整数限值或加计数到正整数限值。

用户程序中可以使用的计数器数仅受 CPU 存储器容量限制。 计数器占用以下存储器空间:

对于 SInt 或 USInt 数据类型,计数器指令占用 3 个字节。

对于 Int 或 UInt 数据类型,计数器指令占用 6 个字节。

对于 DInt 或 UDInt 数据类型,计数器指令占用 12 个字节。

这些指令使用软件计数器,软件计数器的最大计数速率受其所在的 OB 的执行速率限制。指令所在的 OB 的执行频率必须足够高,以检测 CU 或 CD 输入的所有跳变。 要了解更快的计数操作,请参见 CTRL_HSC 指令 (页 363)。

说明

在 FB 中放置计数器指令后,可以选择多重背景数据块选项,各计数器结构名称可以对应不同的数据结构,但计数器数据包含在同一个数据块中,从而无需每个计数器都使用一个单独的数据块。 这减少了计数器所需的处理时间和数据存储空间。 在共享的多重背景数据块中的计数器数据结构之间不存在交互作用。

计数器的运行

表格 7- 24 CTU 计数器的运行

计数器 运行
当参数 CU 的值从 0 变为 1 时,CTU 计数器会使计数值加 1。 &8 5

&9 4

0 1 2 3 4 0
CTU 时序图显示了计数值为无符号整数时的运行(其中,PV =
3)。
如果参数 CV(当前计数值)的值大于或等于参数 PV(预
设计数值)的值,则计数器输出参数 Q = 1。
如果复位参数 R 的值从 0 变为 1,则当前计数值重置为 0。

表格 7- 25 CTD 计数器的运行

计数器 运行
当参数 CD 的值从 0 变为 1 时,CTD 计数器会使计数 &'
值减 1。CTD 时序图显示了计数值为无符号整数时的
/2$'
运行(其中,PV = 3)。
&9 0 3 2 1 0 3 2
如果参数 CV(当前计数值)的值等于或小于 0,则
计数器输出参数 Q = 1。
如果参数 LOAD 的值从 0 变为 1,则参数 PV(预 4
设值)的值将作为新的 CV(当前计数值)装载到
计数器。

表格 7- 26 CTUD 计数器的运行

计数器 运行
当加计数 (CU) 输入或减计 &8
数 (CD) 输入从 0 转换为 1 &'
时,CTUD 计数器将加 1 或
减 1。 CTUD 时序图显示了 5
计数值为无符号整数时的运
行(其中 PV = 4)。 /2$'

&9

0 1 2 3 4 5 4 3 4 5 0
如果参数 CV 的值大于等
于参数 PV 的值,则计数
器输出参数 QU = 1。
如果参数 CV 的值小于或
等于零,则计数器输出参
数 QD = 1。 48
如果参数 LOAD 的值从 0 4'
变为 1,则参数 PV 的值
将作为新的 CV 装载到计
数器。
如果复位参数 R 的值从 0
变为 1,则当前计数值重
置为 0。

RUN-STOP-RUN 切换或 CPU 循环上电后保留计数器数据

如果从运行模式阶段切换到停止模式或 CPU 循环上电并启动了新运行模式阶段,则存储在之前运行模式阶段中的计数器数据将丢失,除非将定时器数据结构指定为具有保持性

(CTU、CTD 和 CTUD 计数器)。

将计数器指令放到程序编辑器中后,如果接受调用选项对话框中的默认设置,则将自动分配一个无法实现具有保持性的背景数据块。 要使计数器数据具有保持性,必须使用全局数据块或多重背景数据块。

指定全局数据块将计数器数据存储为保持性数据

无论将计数器放在什么位置(OB、FC 或 FB),该选项都有效。

创建一个全局数据块:

在项目树中双击“添加新块”(Add new block)。

单击数据块 (DB) 图标

对于“类型”(Type),选择“全局数据块”(global DB)。

如果希望能够将该数据块中的各个项选择为具有保持性,则确保选中“仅符号访 问”(symbolic-access-only) 框。

单击“确定”(OK)

向该数据块添加计数器结构:

在新的全局数据块中,添加使用以下计数器数据类型之一的新静态变量。 务必要考虑到想要用于预设值和计数值的类型。

计数器数据类型 预设值和计数值的相应类型

IEC_Counter INT

IEC_SCounter SINT

IEC_DCounter DINT

IEC_UCounter UINT

IEC_USCounter USINT

IEC_UDCounter UDINT

在“保持性”(Retain) 列中,选中相应框以使该结构具有保持性。

重复此过程为要存储在该数据块中的所有计数器创建结构。 可以将每个计数器结构放置在独立的全局数据块中,也可以将多个计数器结构放置在同一个全局数据块 中。 除计数器外,还可以将其它静态变量放置在该全局数据块中。 将多个计数器结构放置在同一个全局数据块中可减少总的块数。

可根据需要重命名计数器结构。

打开程序块来选择保持性计数器的放置位置(OB、FC 或 FB)。

将计数器指令放置在所需位置。

在调用选项对话框出现后,单击“取消”按钮。 您现在应该看到新的计数器指令,在指令名称的上面和下面均显示“???”。

在新的计数器指令上方,输入上面所创建全局数据块和计数器结构的名称(请勿使用助手浏览)(例如: “Data_block_3.Static_1”)。 这需要填入对应的预设值和计数值类型(例如: UInt 对应于 IEC_UCounter 结构)。

指定多重背景数据块以将计数器数据存储为保持性数据

该选项仅对于将计数器放置在 FB 中有效。

该选项取决于是否将 FB 创建为仅符号访问。 创建 FB 后,便无法更改“仅符号访

问”(Symbolic access only) 复选框的设置;必须在创建 FB 时,在从树中选择“添加新

块”(Add new block) 后出现的第一个屏幕上正确选择该复选框。 要查看此框针对现有 FB

的组态情况,请在项目树中右键单击该 FB,选择“属性”(properties),然后选择“特性”(Attributes)。

如果创建 FB 时选中了“仅符号访问”(Symbolic access only) 框:

打开 FB 进行编辑。

将计数器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名计数器。

单击“确定”(OK)。 计数器指令将出现在编辑器中并且预设值和计数值的类型为 INT, 而 IEC_COUNTER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有需要,请在计数器指令中将类型从 INT 更改为其它类型之一。 计数器结构将相应更改。

计数器指令中显示的类型(对于预设值和计数值)

FB 接口中显示的对应的结构类型

INT IEC_Counter

SINT IEC_SCounter

DINT IEC_DCounter

UINT IEC_UCounter

USINT IEC_USCounter

UDINT IEC_UDCounter

如有必要,打开 FB 接口编辑器(可能需要单击小箭头以展开视图)。

在“静态”(Static) 下,找到刚刚创建的计数器结构。

在此计数器结构的“保持性”(Retain) 列中,改为选择“保持性”(Retain)。 此后只要从另一程序块调用此 FB,都将利用此接口定义(包含标有保持性的计数器结构)创建背景数据块。

如果创建 FB 时未选中“仅符号访问”(Symbolic access only) 框:

打开 FB 进行编辑。

将计数器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名计数器。

单击“确定”(OK)。 计数器指令将出现在编辑器中并且预设值和计数值的类型为 INT, 而 IEC_COUNTER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有需要,请在计数器指令中将类型从 INT 更改为其它类型之一。 计数器结构将相应更改。

计数器指令中显示的类型(对于预设值和计数值)

FB 接口中显示的对应的结构类型

INT IEC_Counter

SINT IEC_SCounter

DINT IEC_DCounter

UINT IEC_UCounter

USINT IEC_USCounter

UDINT IEC_UDCounter

打开将使用此 FB 的块。

将此 FB 置于所需的位置。 如此将为该 FB 创建一个背景数据块。

打开将 FB 放入编辑器时创建的背景数据块。

在“静态”(Static) 下,找到所需的计数器结构。 在此计数器结构的“保持性”(Retain) 列中,选中相应框使该结构具有保持性。

比较

比较

表格 7- 27 比较指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-51 s7一1200功能指令表 基本指令-52 out := in1 = in2;

or

IF in1 = in2

THEN out := 1; ELSE out := 0; END_IF;

比较数据类型相同的两个值。 该 LAD 触点比较结果为 TRUE 时,则该触点会被激活。 如果该

FBD 功能框比较结果为 TRUE,则功能框输出为 TRUE。

1 对于 LAD 和 FBD: 单击指令名称(如“==”),以从下拉列表中更改比较类型。 单击“???”并从下拉列表中选择数据类型。

表格 7- 28 参数的数据类型

参数 数据类型 说明
IN1, IN2 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, String, Char, Time, DTL, 常数 要比较的值

表格 7- 29 比较说明

关系类型 满足以下条件时比较结果为真 ...
= IN1 等于 IN2
<> IN1 不等于 IN2
>= IN1 大于或等于 IN2
<= IN1 小于或等于 IN2
> IN1 大于 IN2
< IN1 小于 IN2

7.4 比较

范围内和范围外指令

表格 7- 30 范围内和范围外指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-53 out := IN_RANGE(min, val, max); 测试输入值是在指定的值范围之内还是之外。

如果比较结果为 TRUE,则功能框输出为 TRUE。

s7一1200功能指令表 基本指令-54 out := OUT_RANGE(min, val, max);

1 对于 LAD 和 FBD: 单击“???”并从下拉列表中选择数据类型。

表格 7- 31 参数的数据类型

参数 数据类型 1 说明
MIN, VAL, MAX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 比较器输入

1 输入参数 MIN、VAL 和 MAX 的数据类型必须相同。

满足以下条件时 IN_RANGE 比较结果为真: MIN <= VAL <= MAX

满足以下条件时 OUT_RANGE 比较结果为真: VAL < MIN 或 VAL > MAX

OK 和 Not OK 指令

表格 7- 32 OK 和 Not OK 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-55 s7一1200功能指令表 基本指令-56 不提供 测试输入数据参考是否为符合 IEEE 规范 754 的有效实数。
s7一1200功能指令表 基本指令-57 s7一1200功能指令表 基本指令-58 不提供

1 对于 LAD 和 FBD: 如果该 LAD 触点为 TRUE,则激活该触点并传递能流。 如果该 FBD 功能框为 TRUE, 则功能框输出为 TRUE。

表格 7- 33 参数的数据类型

参数 数据类型 说明
IN Real, LReal 输入数据

表格 7- 34 操作

指令 满足以下条件时 REAL 数测试结果为 TRUE:
OK 输入值为有效实数 1
NOT_OK 输入值不是有效实数 1

1 如果 Real 或 LReal 类型的值为 +/- INF(无穷大)、NaN(不是数字)或者非标准化的值,则其无效。 非标准化的值是非常接近于 0 的数字。 CPU 在计算中用 0 替换非标准化的值。

参见

LAD、FBD 和 SCL 的 EN 和 ENO (页 164)

数学

计算指令

表格 7- 35 CALCULATE 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-59 使用标准 SCL 数学表达式创建等式。 CALCULATE 指令可用于创建作用于多个输入上的数学函数

(IN1,IN2,.. INn),并根据您定义的等式在 OUT 处生成结果。

首先选择数据类型。 所有输入和输出的数据类型必须相同。

要添加其它输入,请单击最后一个输入处的图标。

表格 7- 36 参数的数据类型

参数 数据类型 1
IN1, IN2, ..INn SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord

1 IN 和 OUT 参数必须具有相同的数据类型(通过对输入参数进行隐式转换)。 例如: 如果 OUT 是 INT 或

REAL,则 SINT 输入值将转换为 INT 或 REAL 值

单击计算器图标可打开对话框,在其中定义数学函数。 输入等式作为输入(如 IN1 和

IN2)和操作数。 单击“确定”(OK) 保存函数时,对话框会自动生成 CALCULATE 指令的输入。

编辑器底部显示有一个示例及可包含的数学运算列表。

s7一1200功能指令表 基本指令-60

说明

还必须为函数中的任何常量生成输入。 然后会在指令 CALCULATE 的相关输入中输入该常量值。

通过输入常量作为输入,可将 CALCULATE 指令复制到用户程序的其它位置,从而无需更改函数。 之后,不需要修改函数,就可以更改指令输入的值或变量。

当执行 CALCULATE 并成功完成计算中的所有单个运算时,ENO = 1,否则 ENO = 0。

加法、减法、乘法和除法指令

表格 7- 37 加法、减法、乘法和除法指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-61 out out out out :=

:=

:=

:=

in1 in1 in1 in1 + in2;

- in2;

* in2;

/ in2;

ADD: 加法 (IN1 + IN2 = OUT)

SUB: 减法 (IN1 - IN2 = OUT)

MUL: 乘法 (IN1 * IN2 = OUT)

DIV: 除法 (IN1 / IN2 = OUT)
整数除法运算会截去商的小数部分以生成整数输出。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 38 参数的数据类型(LAD 和 FBD)

参数 数据类型 1 说明
IN1, IN2 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 参数 IN1、IN2 和 OUT 的数据类型必须相同。

s7一1200功能指令表 基本指令-62 要添加 ADD 或 MUL 输入,请单击“创建”(Create) 图标,或在其中一个现有

IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

启用数学指令 (EN = 1) 后,指令会对输入值(IN1 和 IN2)执行指定的运算并将结果存储在通过输出参数 (OUT) 指定的存储器地址中。 运算成功完成后,指令会设置 ENO = 1。

表格 7- 39 ENO 状态

ENO 说明
1 无错误
0 数学运算结果值可能超出所选数据类型的有效数值范围。 返回适合目标大小的结果的最低有效部分。
0 除数为 0 (IN2 = 0): 结果未定义,返回 0。
0 Real/LReal: 如果其中一个输入值为 NaN(不是数字),则返回 NaN。
0 ADD Real/LReal: 如果两个 IN 值均为 INF,但符号不同,则这是非法运算并返回 NaN。
0 SUB Real/LReal: 如果两个 IN 值均为 INF,且符号相同,则这是非法运算并返回 NaN。
0 MUL Real/LReal: 如果一个 IN 值为零而另一个为 INF,则这是非法运算并返回 NaN。
0 DIV Real/LReal: 如果两个 IN 值均为零或 INF,则这是非法运算并返回 NaN。

求模指令

表格 7- 40 MOD 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-63 out := in1 MOD in2; 可以使用 MOD 指令返回整数除法运算的余数。 用输入 IN1 的值除以输入 IN2 的值,在输出 OUT 中返回余数。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 41 参数的数据类型

参数 数据类型 1 说明
IN1 和 IN2 SInt, Int, DInt, USInt, UInt, UDInt, 常数 求模输入
OUT SInt, Int, DInt, USInt, UInt, UDInt 求模输出

1 IN1、IN2 和 OUT 参数的数据类型必须相同。

表格 7- 42 ENO 值

ENO 说明
1 无错误
0 值 IN2 = 0,OUT 被赋以零值

取反指令

表格 7- 43 NEG 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-64 -(in); 使用 NEG 指令可将参数 IN 的值的算术符号取反并将结果存储在参数 OUT

中。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 44 参数的数据类型

参数 数据类型 1 说明
IN SInt, Int, DInt, Real, LReal, Constant 数学运算输入
OUT SInt, Int, DInt, Real, LReal 数学运算输出

1 参数 IN 和 OUT 的数据类型必须相同。

表格 7- 45 ENO 状态

ENO 说明
1 无错误
0 结果值超出所选数据类型的有效数值范围。

以 SInt 为例: NEG (-128) 的结果为 +128,超出该数据类型的最大值。

递增和递减指令

表格 7- 46 INC 和 DEC 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-65 in_out := in_out + 1; 递增有符号或无符号整数值:

IN_OUT 值 +1 = IN_OUT 值

s7一1200功能指令表 基本指令-66 in_out := in_out - 1; 递减有符号或无符号整数值:

IN_OUT 值 - 1 = IN_OUT 值

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 47 参数的数据类型

参数 数据类型 说明
IN/OUT SInt, Int, DInt, USInt, UInt, UDInt 数学运算输入和输出

表格 7- 48 ENO 状态

ENO 说明
1 无错误
0 结果值超出所选数据类型的有效数值范围。

以 SInt 为例: INC (+127) 的结果为 +128,超出该数据类型的最大值。

绝对值指令

表格 7- 49 ABS 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-67 out := ABS(in); 计算参数 IN 的有符号整数或实数的绝对值并将结果存储在参数 OUT

中。

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 50 参数的数据类型

参数 数据类型 1 说明
IN SInt, Int, DInt, Real, LReal 数学运算输入
OUT SInt, Int, DInt, Real, LReal 数学运算输出

1 参数 IN 和 OUT 的数据类型必须相同。

表格 7- 51 ENO 状态

ENO 说明
1 无错误
0 数学运算结果值超出所选数据类型的有效数值范围。

以 SInt 为例: ABS (-128) 的结果为 +128,超出该数据类型最大值。

最小值和最大值指令

表格 7- 52 MIN 和 MAX 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-68 out:= MIN(

in1:=_variant_in_, in2:=_variant_in_

[,...in32]);

MIN 指令用于比较两个参数 IN1 和 IN2 的值并将最小

(较小)值分配给参数 OUT。

s7一1200功能指令表 基本指令-69 out:= MAX(

in1:=_variant_in_, in2:=_variant_in_

[,...in32]);

MAX 指令用于比较两个参数 IN1 和 IN2 的值并将最大

(较大)值分配给参数 OUT。

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 53 参数的数据类型

参数 数据类型 1 说明
IN1, IN2 [...IN32] SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入(最多 32 个输入)
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 IN1、IN2 和 OUT 参数的数据类型必须相同。

s7一1200功能指令表 基本指令-70 要添加输入,请单击“创建”(Create) 图标,或在其中一个现有 IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 54 ENO 状态

ENO 说明
1 无错误
0 仅适用于 Real 数据类型:

一个或多个输入不是实数 (NaN)。

结果 OUT 为 +/- INF(无穷大)。

Limit 指令

表格 7- 55 LIMIT 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-71 LIMIT(MN:=_variant_in_, IN:=_variant_in_, MX:=_variant_in_, OUT:=_variant_out_); Limit 指令用于测试参数 IN 的值是否在参数 MIN 和 MAX and if not, clamps the value at MIN or MAX. 指定的值范围内

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 56 参数的数据类型

参数 数据类型 1 说明
MN, IN 和 MX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 参数 MN、IN、MX 和 OUT 的数据类型必须相同。

如果参数 IN 的值在指定的范围内,则 IN 的值将存储在参数 OUT 中。 如果参数 IN 的值超出指定的范围,则 OUT 值为参数 MIN 的值(如果 IN 值小于 MIN 值)或参数 MAX 的值(如果 IN 值大于 MAX 值)。

表格 7- 57 ENO 状态

ENO 说明
1 无错误
0 Real: 如果 MIN、IN 和 MAX 的一个或多个值是 NaN(不是数字),则返回 NaN。
0 如果 MIN 大于 MAX,则将值 IN 分配给 OUT。

SCL 示例:

MyVal := LIMIT(MN:=10,IN:=53, MX:=40); //结果: MyVal = 40

MyVal := LIMIT(MN:=10,IN:=37, MX:=40); //结果: MyVal = 37

MyVal := LIMIT(MN:=10,IN:=8, MX:=40); //结果: MyVal = 10

浮点型算术运算指令

使用浮点指令可编写使用 Real 或 LReal 数据类型的数学运算程序:

SQR: 平方 (IN 2 = OUT)

SQRT: 平方根 (√IN = OUT)

LN: 自然对数 (LN(IN) = OUT)

EXP: 自然指数 (e IN =OUT),其中底数 e = 2.71828182845904523536

EXPT: 一般指数 (IN1 IN2 = OUT)

EXPT 参数 IN1 和 OUT 的数据类型始终相同,必须为其选择 Real 或 LReal 类型。 可以从众多数据类型中为指数参数 IN2 选择数据类型。

FRAC: 分数(浮点数 IN 的小数部分 = OUT)

SIN: 正弦 (sin(IN 弧度) = OUT)

ASIN: 反正弦 (arcsine(IN) = OUT 弧度),其中 sin(OUT 弧度) = IN

COS: 余弦 (cos(IN 弧度) = OUT)

ACOS: 反余弦 (arccos(IN) = OUT 弧度),其中 cos(OUT 弧度) = IN

TAN: 正切 (tan(IN 弧度) = OUT)

ATAN: 反正切 (arctan(IN) = OUT 弧度),其中 tan(OUT 弧度) = IN

表格 7- 58 浮点型数学运算指令示例

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-72 out

out

:=

:=

SQR(in);

in * in;

平方: IN 2 = OUT

例如: 如果 IN = 9,则 OUT = 81。

s7一1200功能指令表 基本指令-73 out := in1 ** in2; 普通指数: IN1 IN2 = OUT

例如: 如果 IN1 = 3 且 IN2 = 2,则 OUT = 9。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

2 对于 SCL: 还可以使用基本的 SCL 数学运算符来创建数学表达式。

表格 7- 59 参数的数据类型

参数 数据类型 说明
IN, IN1 Real, LReal, Constant 输入
IN2 SInt, Int, DInt, USInt, UInt,UDInt, Real, LReal, Constant EXPT 指数输入
OUT Real, LReal 输出

表格 7- 60 ENO 状态

ENO 指令 条件 结果 (OUT)
1 全部 无错误 有效结果
0 SQR 结果超出有效 Real/LReal 范围 +INF
IN 为 +/- NaN(不是数字) +NaN
SQRT IN 为负数 -NaN
ENO 指令 条件 结果 (OUT)
IN 为 +/- INF(无穷大)或 +/- NaN +/- INF 或 +/- NaN
LN IN 为 0.0、负数、-INF 或 -NaN -NaN
IN 为 +INF 或 +NaN +INF 或 +NaN
EXP 结果超出有效 Real/LReal 范围 +INF
IN 为 +/- NaN +/- NaN
SIN, COS, TAN IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN
ASIN, ACOS IN 超出 -1.0 到 +1.0 的有效范围 +NaN
IN 为 +/- NaN +/- NaN
ATAN IN 为 +/- NaN +/- NaN
FRAC IN 为 +/- INF 或 +/- NaN +NaN
EXPT IN1 为 +INF 且 IN2 不是 -INF +INF
IN1 为负数或 -INF 如果 IN2 为 Real/LReal, 则为 +NaN,

否则为 -INF

IN1 或 IN2 为 +/- NaN +NaN
IN1 为 0.0 且 IN2 为 Real/LReal(只能为Real/LReal) +NaN

移动

移动和块移动指令

使用移动指令可将数据元素复制到新的存储器地址并从一种数据类型转换为另一种数据类型。 移动过程不会更改源数据。

MOVE 指令用于将单个数据元素从参数 IN 指定的源地址复制到参数 OUT 指定的目标地址。

MOVE_BLK 和 UMOVE_BLK 指令具有附加的 COUNT 参数。 COUNT 指定要复制的数据元素个数。 每个被复制元素的字节数取决于 PLC 变量表中分配给 IN 和 OUT 参数变量名称的数据类型。

表格 7- 61 MOVE、MOVE_BLK 和 UMOVE_BLK 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-74 out1 := in; 将存储在指定地址的数据元素复制到新地址或多个地址。1
s7一1200功能指令表 基本指令-75 MOVE_BLK(

in:=_variant_in, count:=_uint_in,

out=>_variant_out);

将数据元素块复制到新地址的可中断移动。
s7一1200功能指令表 基本指令-76 UMOVE_BLK(

in:=_variant_in, count:=_uint_in,

out=>_variant_out);

将数据元素块复制到新地址的不可中断移动。

1 MOVE 指令: 要在 LAD 或 FBD 中添加其它输出,请单击输出参数旁的“创建”(Create) 图标。 对于 SCL,请使用多个赋值语句。 还可以使用任一循环结构。

表格 7- 62 MOVE 指令的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Char, Array, Struct, DTL, Time 源地址
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Char, Array, Struct, DTL, Time 目标地址

s7一1200功能指令表 基本指令-77 要添加 MOVE 输出,请单击“创建”(Create) 图标,或右键单击现有 OUT 参数之一的输出短线,并选择“插入输出”(Insert output) 命令。

要删除输出,请在其中一个现有 OUT 参数(多于两个原始输出时)的输出短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 63 MOVE_BLK 和 UMOVE_BLK 指令的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal Byte, Word, DWord 源起始地址
COUNT UInt 要复制的数据元素数
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 目标起始地址

说明

数据复制操作规则

要复制 Bool 数据类型,请使用 SET_BF、RESET_BF、R、S 或 输出线圈 (LAD)

(页 180)

要复制单个基本数据类型,请使用 MOVE

要复制基本数据类型数组,请使用 MOVE_BLK 或 UMOVE_BLK

要复制结构,请使用 MOVE

要复制字符串,请使用 S_MOVE (页 266)

要复制字符串中的单个字符,请使用 MOVE

MOVE_BLK 和 UMOVE_BLK 指令不能用于将数组或结构复制到 I、Q 或 M 存储区。

MOVE_BLK 和 UMOVE_BLK 指令在处理中断的方式上有所不同:

在 MOVE_BLK 执行期间排队并处理中断事件。 在中断 OB 子程序中未使用移动目标地址的数据时,或者虽然使用了该数据,但目标数据不必一致时,使用 MOVE_BLK 指令。 如果 MOVE_BLK 操作被中断,则最后移动的一个数据元素在目标地址中是完整并且一致的。 MOVE_BLK 操作会在中断 OB 执行完成后继续执行。

在 UMOVE_BLK 完成执行前排队但不处理中断事件。 如果在执行中断 OB 子程序前移动操作必须完成且目标数据必须一致,则使用 UMOVE_BLK 指令。 更多信息,请参阅 数据一致性 (页 154)部分。

执行 MOVE 指令之后,ENO 始终为真。

表格 7- 64 ENO 状态

ENO 条件 结果
1 无错误 成功复制了全部的 COUNT 个元素。
0 源 (IN) 范围或目标 (OUT) 范围超出可用存储区。 复制适当的元素。 不复制部分元素。

FieldRead 和 FieldWrite 指令

说明

STEP 7 V10.5 不支持数组索引或多维数组形式的变量引用。 FieldRead 和 FieldWrite 指令曾用于为一维数组提供变量数组索引操作。 STEP 7 V11 支持数组索引和多维数组形式的变量。 STEP 7 V11 中包含了 FieldRead 和 FieldWrite,以便向后兼容使用了这两个指令的程序。

表格 7- 65 FieldRead 和 FieldWrite 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-78 value := member[index]; FieldRead 用于从第一个元素由 MEMBER 参数指定的数组中读取索引值为 INDEX 的数组元素。 数组元素的值将传送到 VALUE 参数指定的位置。
s7一1200功能指令表 基本指令-79 member[index] :

= value;

WriteField 用于将 VALUE 参数指定的位置上的值传送给第一个元素由 MEMBER 参数指定的数组。 该值将传送给由 INDEX 参数指定数组索引的数组元素。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 66 参数的数据类型

参数和类型 数据类型 说明
Index 输入 DInt 要读取或写入的数组元素的索引号
Member 1 输入 数组元素类型:

Bool、Byte、Word、DWord、

Char、SInt、Int、Dint、USInt、UInt、UDInt、Real、LReal

在全局数据块或块接口中定义的一维数组的第一个元素的位置。

例如: 如果将数组索引指定为 [-2..4], 则第一个元素的索引为 -2,而不是 0。

值 1 输出 Bool、Byte、Word、DWord、

Char、SInt、Int、Dint、USInt、

UInt、UDInt、Real、LReal

将指定的数组元素复制到的位置

(FieldRead)

被复制到指定的数组元素的值的位置

(FieldWrite)

1 MEMBER 参数和 VALUE 参数指定的数组元素的数据类型必须相同。

如果满足下列条件之一,则使能输出 ENO = 0:

EN 输入的信号状态为“0”

在 MEMBER 参数引用的数组中未定义 INDEX 参数指定的数组元素

处理过程中发生溢出之类的错误

通过数组索引访问数据

要通过变量访问数组中的元素,仅需在程序逻辑中将该变量用作数组索引即可。 例如, 以下程序段中通过 PLC 变量“Index”引用的“Data_block_1”内布尔数组的布尔值来设置输出。

s7一1200功能指令表 基本指令-80

使用变量数组索引的逻辑结构与之前使用 FieldRead 指令的方法相同:

s7一1200功能指令表 基本指令-81

可以使用变量数组索引逻辑替换 FieldWrite 和 FieldRead 指令。

SCL 中没有 FieldRead 或 FieldWrite 指令,但支持通过变量对数组进行间接寻址:

#Tag_1 := "Data_block_1".Bool_Array[#Index];

填充指令

表格 7- 67 FILL_BLK 和 UFILL_BLK 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-82 FILL_BLK(

in:=_variant_in, count:=int,

out=>_variant_out);

可中断填充指令: 使用指定数据元素的副本填充地址范围
s7一1200功能指令表 基本指令-83 UFILL_BLK(

in:=_variant_in, count:=int out

=>_variant_out);

不中断填充指令: 使用指定数据元素的副本填充地址范围

表格 7- 68 参数的数据类型

参数 数据类型 说明
IN SInt, Int, DIntT, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 数据源地址
COUNT USInt, UInt 要复制的数据元素数
OUT SInt, Int, DIntT, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 数据目标地址

说明

数据填充操作规则

要使用 BOOL 数据类型填充,请使用 SET_BF、RESET_BF、R、S 或输出线圈

(LAD)

要使用单个基本数据类型填充,请使用 MOVE

要使用基本数据类型填充数组,请使用 FILL_BLK 或 UFILL_BLK

要填充字符串中的单个字符,请使用 MOVE

FILL_BLK 和 UFILL_BLK 指令不能用于将数组填充到 I、Q 或 M 存储区。

FILL_BLK 和 UFILL_BLK 指令可将源数据元素 IN 复制到通过参数 OUT 指定初始地址的目标中。 复制过程不断重复并填充相邻的一组地址,直到副本数等于 COUNT 参数。

FILL_BLK 和 UFILL_BLK 指令在处理中断的方式上有所不同:

在 FILL_BLK 执行期间排队并处理中断事件。 在中断 OB 子程序中未使用移动目标地址的数据时,或者虽然使用了该数据,但目标数据不必一致时,使用 FILL_BLK 指令。

在 UFILL_BLK 完成执行前排队但不处理中断事件。 如果在执行中断 OB 子程序前移动操作必须完成且目标数据必须一致,则使用 UFILL_BLK 指令。

表格 7- 69 ENO 状态

ENO 条件 结果
1 无错误 IN 元素成功复制到全部的 COUNT 个目标中。
0 目标 (OUT) 范围超出可用存储区 复制适当的元素。 不复制部分元素。

交换指令

表格 7- 70 SWAP 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-84 out := SWAP(in); 用于反转二字节和四字节数据元素的字节顺序。 不改变每个字节中的位顺序。 执行 SWAP 指令之后,ENO 始终为 TRUE。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 71 参数的数据类型

参数 数据类型 说明
IN Word, DWord 有序数据字节 IN
OUT Word, DWord 反转有序数据字节 OUT
示例 1 参数 IN = MB0

(执行前)

参数 OUT = MB4,

(执行后)

地址 MB0 MB1 MB4 MB5
W#16#1234 12 34 34 12
WORD MSB LSB MSB LSB

示例 2 参数 IN = MB0

(执行前)

参数 OUT = MB4,

(执行后)

地址 MB0 MB1 MB2 MB3 MB4 MB5 MB6 MB7
DW#16# 12345678 12 34 56 78 78 56 34 12
DWORD MSB LSB MSB LSB

转换

CONV 指令

表格 7- 72 转换 (CONV) 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-85 out := <data type in>_TO_<data type out>(in); 将数据元素从一种数据类型转换为另一种数据类型。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

2 对于 SCL:通过识别输入参数 (in) 和输出参数 (out) 的数据类型来构造转换指令。例如,DWORD_TO_REAL 将 DWord 值转换为 Real 值。

表格 7- 73 参数的数据类型

参数 数据类型 说明
IN 位串 1,SInt, USInt, Int, UInt, DInt, UDInt, Real, LReal, BCD16, BCD32 输入值
OUT 位串 1,SInt, USInt, Int, UInt, DInt, UDInt, Real, LReal, BCD16, BCE32 转换为新数据类型的输入值

1 该指令不允许您选择位串(Byte、Word、DWord)。 要为指令参数输入数据类型 Byte、Word 或 DWord 的操作数,选择位长度相同的无符号整型。 例如 为 Byte 选择 USInt、为 Word 选择 UInt 或为 DWord 选择

UDInt。

选择(转换源)数据类型之后,(转换目标)下拉列表中将显示可能的转换项列表。 与

BCD16 进行转换仅限于 Int 数据类型。 与 BCD32 进行转换仅限于 DInt 数据类型。

表格 7- 74 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN
0 结果超出 OUT 数据类型的有效范围 OUT 被设置为 IN 的最低有效字节

SCL 的转换指令

SCL 的转换指令

表格 7- 75 从 Bool、Byte、Word 或 DWord 进行转换

数据类型 指令 结果
Bool BOOL_TO_BYTE, BOOL_TO_WORD, BOOL_TO_DWORD, BOOL_TO_INT, BOOL_TO_DINT 值被传送到目标数据类型的最低有效位。
Byte BYTE_TO_BOOL 最低位被传送到目标数据类型。
BYTE_TO_WORD, BYTE_TO_DWORD 值被传送到目标数据类型的低位字节。
BYTE_TO_SINT, BYTE_TO_USINT 值被传送到目标数据类型。
BYTE_TO_INT, BYTE_TO_UINT, BYTE_TO_DINT, BYTE_TO_UDINT 值被传送到目标数据类型的最低有效字节。
Word WORD_TO_BOOL 最低位被传送到目标数据类型。
WORD_TO_BYTE 源值的低位字节被传送到目标数据类型。
WORD _TO_DWORD 值被传送到目标数据类型的低位字节。
WORD _TO_SINT, WORD _TO_USINT 源值的低位字节被传送到目标数据类型。
WORD _TO_INT, WORD _TO_UINT 值被传送到目标数据类型。
WORD _TO_DINT, WORD _TO_UDINT 值被传送到目标数据类型的低位字节。
DWord DWORD_TO_BOOL 最低位被传送到目标数据类型。
DWORD_TO_BYTE, DWORD_TO_WORD, DWORD_TO_SINT, DWORD_TO_USINT, DWORD_TO_INT, DWORD_TO_UINT 源值的低位字节被传送到目标数据类型。
DWORD_TO_DINT, DWORD_TO_UDINT,

DWORD_TO_REAL

值被传送到目标数据类型。

表格 7- 76 从短整型(SInt 或 USInt)进行转换

数据类型 指令 结果
SInt SINT_TO_BOOL 最低位被传送到目标数据类型。
SINT_TO_BYTE 值被传送到目标数据类型
SINT_TO_WORD, SINT_TO_DWORD, SINT_TO_INT, SINT_TO_DINT 值被传送到目标数据类型的低位字节。
数据类型 指令 结果
SINT_TO_USINT, SINT_TO_UINT, SINT_TO_UDINT, SINT_TO_REAL, SINT_TO_LREAL, SINT_TO_CHAR, SINT_TO_STRING 值被转换。
USInt USINT_TO_BOOL 最低位被传送到目标数据类型。
USINT_TO_BYTE 值被传送到目标数据类型
USINT_TO_WORD, USINT_TO_DWORD, USINT_TO_INT, USINT_TO_UINT, USINT_TO_DINT, USINT_TO_UDINT 值被传送到目标数据类型的低位字节。
USINT_TO_SINT, USINT_TO_REAL,

USINT_TO_LREAL, USINT_TO_CHAR, USINT_TO_STRING

值被转换。

表格 7- 77 从整型(Int 或 UInt)进行转换

数据类型 指令 结果
Int INT_TO_BOOL 最低位被传送到目标数据类型。
INT_TO_BYTE, INT_TO_DWORD, INT_TO_SINT, INT_TO_USINT, INT_TO_UINT, INT_TO_UDINT, INT_TO_REAL, INT_TO_LREAL, INT_TO_CHAR, INT_TO_STRING 值被转换。
INT_TO_WORD 值被传送到目标数据类型。
INT_TO_DINT 值被传送到目标数据类型的低位字节。
UInt UINT_TO_BOOL 最低位被传送到目标数据类型。
UINT_TO_BYTE, UINT_TO_SINT, UINT_TO_USINT, UINT_TO_INT, UINT_TO_REAL, UINT_TO_LREAL, UINT_TO_CHAR, UINT_TO_STRING 值被转换。
UINT_TO_WORD, UINT_TO_DATE 值被传送到目标数据类型。
UINT_TO_DWORD, UINT_TO_DINT, UINT_TO_UDINT 值被传送到目标数据类型的低位字节。

表格 7- 78 从双整型(Dint 或 UDInt)进行转换

数据类型 指令 结果
DInt DINT_TO_BOOL 最低位被传送到目标数据类型。
DINT_TO_BYTE, DINT_TO_WORD, DINT_TO_SINT, DINT_TO_USINT, DINT_TO_INT, DINT_TO_UINT, DINT_TO_UDINT, DINT_TO_REAL, DINT_TO_LREAL, DINT_TO_CHAR, DINT_TO_STRING 值被转换。
DINT_TO_DWORD, DINT_TO_TIME 值被传送到目标数据类型。
UDInt UDINT_TO_BOOL 最低位被传送到目标数据类型。
UDINT_TO_BYTE, UDINT_TO_WORD, UDINT_TO_SINT, UDINT_TO_USINT, UDINT_TO_INT, UDINT_TO_UINT, UDINT_TO_DINT, UDINT_TO_REAL, UDINT_TO_LREAL, UDINT_TO_CHAR, UDINT_TO_STRING 值被转换。
UDINT_TO_DWORD, UDINT_TO_TOD 值被传送到目标数据类型。

表格 7- 79 从实数(Real 或 LReal)进行转换

数据类型 指令 结果
Real REAL_TO_DWORD, REAL_TO_LREAL 值被传送到目标数据类型。
REAL_TO_SINT, REAL_TO_USINT, REAL_TO_INT, REAL_TO_UINT, REAL_TO_DINT, REAL_TO_UDINT, REAL_TO_STRING 值被转换。
LReal LREAL_TO_SINT, LREAL_TO_USINT, LREAL_TO_INT, LREAL_TO_UINT, LREAL_TO_DINT, LREAL_TO_UDINT, LREAL_TO_REAL, LREAL_TO_STRING 值被转换。

表格 7- 80 从 Time、DTL、TOD 或 Date 进行转换

数据类型 指令 结果
Time TIME_TO_DINT 值被传送到目标数据类型。
DTL DTL_TO_DATE, DTL_TO_TOD 值被转换。
TOD TOD_TO_UDINT 值被转换。
Date DATE_TO_UINT 值被转换。

表格 7- 81 从 Char 或 String 进行转换

数据类型 指令 结果
Char CHAR_TO_SINT, CHAR_TO_USINT, CHAR_TO_INT, CHAR_TO_UINT, CHAR_TO_DINT, CHAR_TO_UDINT 值被转换。
CHAR_TO_STRING 值被传送到字符串的第一个字符。
String STRING_TO_SINT, STRING_TO_USINT, STRING_TO_INT, STRING_TO_UINT, STRING_TO_DINT, STRING_TO_UDINT, STRING_TO_REAL, STRING_TO_LREAL 值被转换。
STRING_TO_CHAR 字符串的第一个字符被复制到 Char。

取整和截取指令

表格 7- 82 ROUND 和 TRUNC 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-86 out := ROUND (in); 将实数转换为整数。 默认数据类型为 DINT。 当输出为除 DINT 以外的有效数据类型时,必须显式声明;例如,ROUND_REAL 或 ROUND_LREAL。

实数的小数部分舍入为最接近的整数值(IEEE - 舍入为最接近值)。 如果该数值刚好是两个连续整数的一半(例如,10.5), 则将其取整为偶数。 例如:

ROUND (10.5) = 10

ROUND (11.5) = 12

s7一1200功能指令表 基本指令-87 out := TRUNC(in); TRUNC 用于将实数转换为整数。 实数的小数部分被截成零

(IEEE - 取整为零)。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

表格 7- 83 参数的数据类型

参数 数据类型 说明
IN Real, LReal 浮点型输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 取整或截取后的输出

表格 7- 84 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN

上取整和下取整指令

表格 7- 85 CEIL 和 FLOOR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-88 out := CEIL(in); 将实数(Real 或 LReal)转换为大于或等于所选实数的最小整数(IEEE“向正无穷取整”)。
s7一1200功能指令表 基本指令-89 out := FLOOR(in); 将实数(Real 或 LReal)转换为小于或等于所选实数的最大整数(IEEE“向负无穷取整”)。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

表格 7- 86 参数的数据类型

参数 数据类型 说明
IN Real, LReal 浮点型输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 转换后的输出

表格 7- 87 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN

标定和标准化指令

表格 7- 88 SCALE_X 和 NORM_X 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-90 out :=SCALE_X(min:=_in_,

value:=_in_, max:=_in_);

按参数 MIN 和 MAX 所指定的数据类型和值范围对标准化的实参数 VALUE(其中,

0.0 <= VALUE <= 1.0)进行标定:

OUT = VALUE (MAX - MIN) + MIN

s7一1200功能指令表 基本指令-91 out :=NORM_X(min:=_in_,

value:=_in_, max:=_in_);

标准化通过参数 MIN 和 MAX 指定的值范围内的参数 VALUE:

OUT = (VALUE - MIN) / (MAX - MIN), 其中 (0.0 <= OUT <= 1.0)

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 89 参数的数据类型

参数 数据类型 1 说明
MIN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 输入范围的最小值
VALUE SCALE_X: Real, LReal

NORM_X: SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal

要标定或标准化的输入值
MAX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 输入范围的最大值
OUT SCALE_X: SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal

NORM_X: Real, LReal

标定或标准化后的输出值

1 对于 SCALE_X: 参数 MIN、MAX 和 OUT 的数据类型必须相同。对于 NORM_X: 参数 MIN、VALUE 和 MAX 的数据类型必须相同。

说明

SCALE_X 参数 VALUE 应限制为 (0.0 <= VALUE <= 1.0)

如果参数 VALUE 小于 0.0 或大于 1.0:

线性标定运算会生成一些小于 MIN 参数值或大于 MAX 参数值的 OUT 值,作为 OUT

值,这些数值在 OUT 数据类型值范围内。此时,SCALE_X 执行会设置 ENO =

TRUE。

还可能会生成一些不在 OUT 数据类型值范围内的标定数值。 此时,OUT 参数值会被设置为一个中间值,该中间值等于被标定实数在最终转换为 OUT 数据类型之前的最低有效部分。在这种情况下,SCALE_X 执行会设置 ENO = FALSE。

NORM_X 参数 VALUE 应限制为 (MIN <= VALUE <= MAX)

如果参数 VALUE 小于 MIN 或大于 MAX,线性标定运算会生成小于 0.0 或大于 1.0 的标准化 OUT 值。 在这种情况下,NORM_X 执行会设置 ENO = TRUE。

表格 7- 90 ENO 状态

ENO 条件 结果 (OUT)
1 无错误 有效结果
0 结果超出 OUT 数据类型的有效范围 中间结果: 实数在最终转换为 OUT 数据类型前的最低有效部分。
0 参数 MAX <= MIN SCALE_X:用实数 VALUE 的最低有效部分填充

OUT 大小。

NORM_X:扩展 VALUE 数据类型的 VALUE 来填充双字大小。

0 参数 VALUE = +/- INF 或 +/- NaN VALUE 写入 OUT

示例 (LAD): 标准化和标定模拟量输入值

来自电流输入型模拟量信号模块或信号板的模拟量输入的有效值在 0 到 27648 范围内。

假设模拟量输入代表温度,其中模拟量输入值 0 表示 -30.0 摄氏度,27648 表示 70.0 摄氏度。

要将模拟值转换为对应的工程单位,应将输入标准化为 0.0 到 1.0 之间的值,然后再将其

标定为 -30.0 到 70.0 之间的值。 结果值是用模拟量输入(以摄氏度为单位)表示的温度:

s7一1200功能指令表 基本指令-92

请注意,如果模拟量输入来自电压型模拟量信号模块或信号板,则 NORM_X 指令的 MIN

值是 -27648,而不是 0。

示例 (LAD): 标准化和标定模拟量输出值

要在电流输出型模拟量信号模块或信号板中设置的模拟量输出的有效值必须在 0 到

27648 范围内。 假设模拟量输出表示温度设置,其中模拟量输入值 0 表示 -30.0 摄氏

度,27648 表示 70.0 摄氏度。要将存储器中的温度值(范围是 -30.0 到 70.0)转换为 0

到 27648 范围内的模拟量输出值,必须将以工程单位表示的值标准化为 0.0 到 1.0 之间

的值,然后将其标定为 0 到 27648 范围内的模拟量输出值:

s7一1200功能指令表 基本指令-93

请注意,如果模拟量输出应用到电压型模拟量信号模块或信号板,则 SCALE_X 指令的

MIN 值是 -27648,而不是 0。

有关电压和电流形式的 模拟量输出表示法 (页 845)和 模拟量输出表示法 (页 846)的详细信息,请参见技术规范。

程序控制

SCL 程序控制语句概述

结构化控制语言 (SCL, Structured Control Language) 提供三类用于结构化用户程序的程序控制语句:

选择语句: 选择语句可将程序执行转移到备选语句序列。

循环: 可以使用迭代语句控制循环执行。 迭代语句指定应根据某些条件重复执行的程序部分。

程序跳转: 程序跳转是指立刻跳转到特定的跳转目标,因而跳转到同一块内的其它语句。

这些程序控制语句都使用 PASCAL 编程语言的语法。

表格 7- 91 SCL 程序控制语句类型

程序控制语句 说明
选择 IF-THEN 语句

(页 230)

用将程序执行转移到两个备选分支之一(取决于条件为 TRUE

还是 FALSE)

CASE 语句 (页 231) 用于选择执行 n 个备选分支之一(取决于变量值)
循环 FOR 语句 (页 232) 只要控制变量在指定值范围内,就重复执行某一语句序列
WHILE-DO 语句

(页 233)

只要仍满足执行条件,就重复执行某一语句序列
REPEAT-UNTIL 语句

(页 234)

重复执行某一语句序列,直到满足终止条件为止
程序跳转 CONTINUE 语句

(页 235)

停止执行当前循环迭代
EXIT 语句 (页 236) 无论是否满足终止条件,都会随时退出循环
GOTO 语句 (页 236) 使程序立即跳转到指定标签
IF-THEN 语句

(页 230)

使程序立刻退出正在执行的块,返回到调用块

参见

RETURN 语句 (页 237)

IF-THEN 语句

IF-THEN 语句是条件语句,可控制程序流,根据逻辑表达式的 Bool 值的结果决定是否执行一组语句。 您还可以使用括号嵌套或结构化多条 IF-THEN 语句的执行。

表格 7- 92 IF-THEN 语句的元素

SCL 说明
IF "condition" THEN statement_A; statement_B; statement_C;

;

如果“condition”为 TRUE 或 1,则执行后面的语句,直到遇到

END_IF 语句为止。

如果“condition”为 FALSE 或 0,则跳转到 END_IF 语句(除非程序包含可选的 ELSIF 或 ELSE 语句)。

[ELSIF "condition-n" THEN statement_N;

;]

可选的 ELSEIF1 语句提供其它要评估的条件。 例如: 如果 IF-

THEN 语句中的“condition”为 FALSE,则程序将评估“condition-

n”。 如果“condition-n”为 TRUE,则执行“statement_N”。

[ELSE

statement_X;

;]

可选的 ELSE 语句提供 IF-THEN 语句的“condition”为 FALSE 时将要执行的语句。
END_IF; END_IF 语句用于终止 IF-THEN 指令。

1 可以在一条 IF-THEN 语句中包含多条 ELSIF 语句。

表格 7- 93 IF-THEN 语句的变量

变量 说明
“condition” 必需。 逻辑表达式为 TRUE (1) 或 FALSE (0)。
“statement_A” 可选。 “condition”为 TRUE 时要执行的一条或多条语句。
“condition-n” 可选。 可选 ELSIF 语句要评估的逻辑表达式。
“statement_N” 可选。 ELSIF 语句的“condition-n”为 TRUE 时要执行的一条或多条语句。
“statement_X” 可选。 IF-THEN 语句的“condition”为 FALSE 时要执行的一条或多条语句。

IF 语句按照下列规则执行:

执行第一个逻辑表达式为 TRUE 的语句序列。 不执行其余语句序列。

如果无布尔型表达式为 TRUE,则执行 ELSE 引入的语句序列(或者,如果 ELSE 分支不存在,则不执行语句序列)。

不限制 ELSIF 语句的数量。

说明

与 IF 语句相比,使用一个或多个 ELSIF 分支存在一定的优势,就是不用再评估有效表达式后面的逻辑表达式。 从而,可缩短程序的运行时间。

CASE 语句

表格 7- 94 CASE 语句的元素

SCL 说明
CASE "Test_Value" OF

"ValueList": Statement[; Statement, ...] "ValueList": Statement[; Statement, ...]

[ELSE

Else-statement[; Else-statement, ...]] END_CASE;

CASE 语句根据表达式的值来选择执行多组语句中的一组。

表格 7- 95 参数

参数 说明
“Test_Value” 必需。 任何 Int 数据类型的数字表达式
“ValueList” 必需。 单个值、或逗号分隔的值或值范围的列表。 (使用两个句点定义值范围: 2..8)下例说明了不同变型的值列表:

1: Statement_A;

2, 4: Statement _B;

3, 5..7,9: Statement _C;

Statement 必需。 “Test_Value”与值列表中任何一个值匹配时执行的一条或多条语句
Else-statement 可选。 与“ValueList”中的任何一个值都不匹配时执行的一条或多条语句

CASE 语句按照下列规则执行:

选择表达式必须返回一个 Int 类型的值。

处理 CASE 语句时,程序会检查选择表达式的值是否包含在指定的值列表中。 如果找到匹配项,则执行分配给该列表的语句成分。

如果未找到匹配项,则执行 ELSE 后面的程序段,如果不存在 ELSE 分支,则不执行任何语句。

CASE 语句可以嵌套使用。 每个嵌套的 CASE 语句必须具有相关联的 END_CASE 语句。

CASE var1 OF

1 : var2 := "A";

2 : var2 := "B";

ELSE

CASE var3 OF

65..90: var2 := "UpperCase"; 97..122: var2 := "LowerCase";

ELSE

var2:= "SpecialCharacter";

END_CASE; END_CASE;

FOR 语句

表格 7- 96 FOR 语句的元素

SCL 说明
FOR "control_variable" := "begin" TO "end" [BY "increment"] DO

statement;

; END_FOR;

FOR 语句用于在控制变量处于指定的值范围内时重复执行某一语句序列。 使用 FOR 定义循环时需要指定初始值和最终值。 这

两个值的数据类型必须与控制变量的相同。

表格 7- 97 参数

参数 说明
“control_variable” 必需。 整型(Int 或 DInt),用作循环计数器
“begin” 必需。 指定控制变量初始值的简单表达式
参数 说明
“end” 必需。 确定控制变量最终值的简单表达式
“increment” 可选。 每次循环后“control variable”的变化量。 “increment”与“control variable”

具有相同的数据类型。 如果未指定“increment”的值,则每次循环之后,运行变量的值加 1。不能在执行 FOR 语句期间更改“increment”。

FOR 语句的执行方式如下:

循环开始时,控制变量设置为初始值(初始分配),每次重复进行循环时,控制变量会增加指定增量(正增量)或减少指定增量(负增量),直至达到最终值。

每次执行完循环之后,会检查该条件(达到最终值)以确定是否满足该条件。 如果满足条件,则执行语句序列,否则将跳过该循环及其语句序列。

定义 FOR 语句的规则:

控制变量的数据类型只能是 Int 或 DInt。

可以省略语句 BY [increment]。 如果未指定增量,则自动默认为 +1。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句将执行紧随 END_FOR 语句之后的语句。

使用 CONTINUE 语句 (页 235) 可跳过某个 FOR 循环的后续语句,并继续执行循环,同时检查是否满足终止条件。

WHILE-DO 语句

表格 7- 98 WHILE 语句

SCL 说明
WHILE "condition" DO Statement; Statement;

...;

END_WHILE;

WHILE 语句执行一系列语句,直到给定条件为 TRUE。

可以嵌套使用 WHILE 循环。 END_WHILE 语句与最后执行的 WHILE 指令配对。

表格 7- 99 参数

参数 说明
“condition” 必需。 值为 TRUE 或 FALSE 的逻辑表达式。 (“null”条件被视为 FALSE。)
Statement 可选。 在条件值为 TRUE 之前执行的一条或多条语句。

说明

WHILE 语句先评估“condition”的状态,然后执行语句。 要执行语句一次或多次而不考虑

“condition”的状态,请使用 REPEAT 语句。

WHILE 语句按照下列规则执行:

每次循环执行循环体之前,评估执行条件。

只要执行条件的值为 TRUE,就重复执行 DO 后面的循环体。

一旦值变为 FALSE,则立即跳过循环,去执行循环后面的语句。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句执行紧跟 END_WHILE 语句的语句

使用 CONTINUE 语句可跳过 WHILE 循环后面的语句,并在检查是否满足终止条件后决定是否继续执行循环。

REPEAT-UNTIL 语句

表格 7- 100 REPEAT 指令

SCL 说明
REPEAT

Statement;

;

UNTIL “condition” END_REPEAT;

REPEAT 语句执行一组语句,直到给定条件为 TRUE。

可以嵌套使用 REPEAT 循环。 END_REPEAT 语句始终与最后执行的

Repeat 指令配对。

表格 7- 101 参数

参数 说明
Statement 可选。 在条件值为 TRUE 之前执行的一条或多条语句。
“condition” 必需。 一个或多个用以下两种方式表达的表达式: 值为 TRUE 或 FALSE 的数字表达式或字符串表达式。 “null”条件被视为 FALSE。

说明

在循环的首次迭代过程中,REPEAT 语句在执行相关语句(即使“condition”为 FALSE) 后评估“condition”的状态。 要在执行这些语句前查看“condition”的状态,请使用 WHILE 语句。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句执行紧跟 END_REPEAT 语句的语句

使用 CONTINUE 语句 (页 235) 可跳过某个 REPEAT 循环的后续语句,并继续执行循环,同时检查是否满足终止条件。

CONTINUE 语句

表格 7- 102 CONTINUE 语句

SCL 说明
CONTINUE

Statement;

;

CONTINUE 语句跳过程序循环(FOR、WHILE、REPEAT)后面的语句,并在检查是否满足终止条件后决定是否继续执行循环。 如果不满足,则继续执

行循环。

CONTINUE 语句按照下列规则执行:

该语句立即终止循环体的执行。

根据是否满足重复执行循环的条件,决定是再次执行循环体还是退出迭代语句而去执行紧随其后的语句。

在 FOR 语句中,在执行 CONTINUE 语句后控制变量立即增加指定的增量。

只能在循环中使用 CONTINUE 语句。 在嵌套循环中,CONTINUE 总是立即指向包含它的循环。 CONTINUE 通常与 IF 语句一起使用。

如果要退出循环而不考虑终止测试情况,请使用 EXIT 语句。

下例说明了使用 CONTINUE 语句来避免计算值的百分数时发生被 0 除的错误:

FOR x = 0 TO 10 DO

IF value[i] = 0 THEN CONTINUE; END_IF;

p := part / value[i] * 100; s := INT_TO_STRING(p);

percent=CONCAT(IN1:=s, IN2:="%"); END_FOR;

EXIT 语句

表格 7- 103 EXIT 指令

SCL 说明
EXIT; EXIT 语句用于随时退出循环(FOR、WHILE 或 REPEAT),而不考虑是否满足终止条件。

EXIT 语句按照下列规则执行:

该语句会立即退出该退出语句所处的重复语句。

继续执行该循环后面(例如 END_FOR 之后)的程序。

在循环中使用 EXIT 语句。 在嵌套循环中,EXIT 语句将处理权返回到下一更高嵌套级。

FOR i = 0 TO 10 DO

CASE 值[i, 0] OF

1..10: 值 [i, 1]:="A";

11..40: 值 [i, 1]:="B";

41..100: 值 [i, 1]:="C"; ELSE

EXIT;

END_CASE;

END_FOR;

GOTO 语句

表格 7- 104 GOTO 语句

SCL 说明
GOTO JumpLabel; Statement;

... ;

JumpLabel: Statement;

GOTO 语句通过跳转到同一块中的某个标签来跳过语句。

跳转标签(“JumpLabel”)和 GOTO 语句必须在同一个块中。 跳转标签的名称只能在块中分配一次。 每个跳转标签都可以是多条 GOTO 语句

的跳转目标。

不能跳转到循环部分(FOR、WHILE 或 REPEAT)。 可以在循环中进行跳转。

在以下示例中: 根据操作数“Tag_value”的值在对应跳转标签定义的位置继续执行程序。如果“Tag_value”等于 2,则会在跳转标签“MyLabel2”位置继续执行,并会跳过

“MyLabel1”。

CASE "Tag_value" OF

: GOTO MyLabel1;

: GOTO MyLabel2; ELSE GOTO MyLabel3; END_CASE;

MyLabel1: "Tag_1" := 1; MyLabel2: "Tag_2" := 1; MyLabel3: "Tag_4" := 1;

RETURN 语句

表格 7- 105 RETURN 指令

SCL 说明
RETURN; Return 指令用于无条件退出正在执行的代码块。 程序执行返回到调用块或操作系统

(退出 OB 时)。

RETURN 指令示例:

IF "Error" <> 0 THEN RETURN;

END_IF;

说明

执行最后一条指令后,代码块自动返回到调用块。 不要在代码块末尾插入 RETURN 指令。

跳转和标签指令

表格 7- 106 JMP、JMPN 和 LABEL 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-94 s7一1200功能指令表 基本指令-95 请参见 GOTO (页 236)

语句。

如果有能流通过 JMP 线圈 (LAD),或者 JMP

功能框的输入为真 (FBD),则程序将从指定标签后的第一条指令继续执行。

s7一1200功能指令表 基本指令-96 s7一1200功能指令表 基本指令-97 如果没有能流通过 JMPN 线圈 (LAD),或者

JMPN 功能框的输入为假 (FBD),则程序将从指定标签后的第一条指令继续执行。

s7一1200功能指令表 基本指令-98 s7一1200功能指令表 基本指令-99 JMP 或 JMPN 跳转指令的目标标签。

1 通过在 LABEL 指令中直接键入来创建标签名称。 可以使用参数助手图标来选择 JMP 和 JMPN 标签名称字段可用的标签名称。 也可在 JMP 或 JMPN 指令中直接键入标签名称。

表格 7- 107 参数的数据类型

参数 数据类型 说明
Label_name 标签标识符 跳转指令以及相应跳转目标程序标签的标识符

各标签在代码块内必须唯一。

可以在代码块中进行跳转,但不能从一个代码块跳转到另一个代码块。

可以向前或向后跳转。

可以在同一代码块中从多个位置跳转到同一标签。

JMP_LIST 指令

表格 7- 108 JMP_LIST 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-100 CASE k OF

0: GOTO dest0;

1: GOTO dest1;

2: GOTO dest2; [n: GOTO destn;]

END_CASE;

JMP_LIST 指令用作程序跳转分配器,控制程序段的执行。 根据 K 输入的值跳转到相应的程序标签。 程序从目标跳转标签后面的程序指令继续执行。 如果 K 输入的值超过(标签数 - 1),则不进行跳转,继续处理下一程序段。

表格 7- 109 参数的数据类型

参数 数据类型 说明
K UInt 跳转分配器控制值
DEST0, DEST1, .., DESTn. 程序标签 与特定 K 参数值对应的跳转目标标签:

如果 K 的值等于 0,则跳转到分配给 DEST0 输出的程序标签。如果 K 的值等于 1,则跳转到分配给 DEST1 输出的程序标签, 以此类推。 如果 K 输入的值超过(标签数 - 1),则不进行跳

转,继续处理下一程序段。

对于 LAD 和 FBD: 在程序中第一次放置 JMP_LIST 功能框,该功能框有两个跳转标签输出。 可以添加或删除跳转目标。

s7一1200功能指令表 基本指令-101 单击功能框内的创建图标(位于最后一个 DEST 参数的左侧)可添加新的跳转标签输出。

s7一1200功能指令表 基本指令-102 右键单击输出短线,并选择“插入输出”(Insert ouput) 命令。

右键单击输出短线,并选择“删除”(Delete) 命令。

SWITCH 指令

表格 7- 110 SWITCH 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-103 不提供 SWITCH 指令用作程序跳转分配器,控制程序段的执行。 根据 K 输入的值与分配给指定比较输入的值的比较结果,跳转到与第一个为“真”的比较测试相对应的程序标

签。 如果比较结果都不为 TRUE,则跳转到分配给 ELSE

的标签。 程序从目标跳转标签后面的程序指令继续执行。

1 对于 LAD 和 FBD: 在功能框名称下方单击,并从下拉菜单中选择数据类型。

2 对于 SCL: 使用 IF-THEN 语句进行比较。

表格 7- 111 参数的数据类型

参数 数据类型 1 说明
K SInt、Int、DInt、USInt、UInt、

UDInt、Real、LReal、Byte、

Word、DWord、Time、TOD、Date

常用比较值输入
==, <>, <, <=, >.

>=

SInt、Int、DInt、USInt、UInt、

UDInt、Real、LReal、Byte、

Word、DWord、Time、TOD、Date

分隔比较值输入,获得特定比较类型
DEST0、DEST1,...,

DESTn。 ELSE

程序标签 与特定比较对应的跳转目标标签:

首先处理 K 输入下面的第一个比较输入,如果 K 值与该输入的比较结果为“真”,则跳转到分配给

DEST0 的标签。 下一比较测试使用接下来的下一个

输入,如果比较结果“真”,则跳转到分配给 DEST1

的标签。依次对其它比较进行类似的处理,如果比
较结果都不为“真”,则跳转到分配给 ELSE 输出的标
签。

1 K 输入和比较输入 (==, <>, <, <=, >, >=) 的数据类型必须相同。

添加输入、删除输入和指定比较类型

在程序中第一次放置 LAD 或 FBD SWITCH 功能框时,该功能框有两个比较输入。 可以分配比较类型以及添加输入/跳转目标,如下所示。

s7一1200功能指令表 基本指令-104 单击功能框内的比较运算符,并从下拉列表中选择新运算符。

s7一1200功能指令表 基本指令-105 单击功能框中的创建图标(位于最后一个 DEST 参数的左侧)可添加新的比较目标参数。

s7一1200功能指令表 基本指令-106 右键单击输入短线,并选择“插入输入”(Insert input) 命令。

右键单击输入短线并选择“删除”(Delete) 命令。

表格 7- 112 SWITCH 功能框数据类型和允许的比较运算

数据类型 比较 运算符语法
Byte、Word、DWord 等于 ==
不等于 <>
SInt、Int、DInt、USInt、

UInt、UDInt、Real、

LReal、Time、TOD、Date

等于 ==
不等于 <>
大于或等于 >=
小于或等于 <=
大于 >
小于 <

SWITCH 功能框放置规则

比较输入前可以不连接 LAD/FBD 指令。

由于没有 ENO 输出,因此,在一个程序段中只允许使用一条 SWITCH 指令,并且

SWITCH 指令必须是程序段中的最后一个运算。

RET 执行控制指令

可选的 RET 指令用于终止当前块的执行。 当且仅当有能流通过 RET 线圈 (LAD),或者当 RET 功能框的输入为真 (FBD) 时,则当前块的程序执行将在该点终止,并且不执行

RET 指令以后的指令。 如果当前块为 OB,则参数“Return_Value”将被忽略。 如果当前块为 FC 或 FB,则将参数“Return_Value”的值作为被调用功能框的 ENO 值传回到调用例程。

不要求用户将 RET 指令用作块中的最后一个指令;该操作是自动完成的。 一个块中可以有多个 RET 指令。

有关 SCL,请参见 RETURN (页 237) 语句。

表格 7- 113 Return_Value (RET) 执行控制指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-107 s7一1200功能指令表 基本指令-108 RETURN; 终止当前块的执行

表格 7- 114 参数的数据类型

参数 数据类型 说明
Return_Value Bool RET 指令的“Return_value”参数被分配给调用块中块调用功能框的 ENO

输出。

以下是在 FC 代码块中使用 RET 指令的示例步骤:

创建新项目并添加 FC:

编辑该 FC:

从指令树添加指令。

添加一个 RET 指令,包括参数“Return_Value”的以下值之一:

TRUE、FALSE,或用于指定所需返回值的存储位置。

添加更多的指令。

从 MAIN [OB1] 调用 FC。

MAIN 代码块中 FC 功能框的 EN 输入必须为真,才能开始执行 FC。

执行了有能流通过 RET 指令的 FC 后,该 FC 的 RET 指令所指定的值将出现在 MAIN 代码块中 FC 功能框的 ENO 输出上。

重新触发扫描循环看门狗指令

表格 7- 115 RE_TRIGR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-109 RE_TRIGR(); RE_TRIGR(重新触发扫描时间监视狗)用于延长扫描循环监视狗定时器生成错误前允许的最大时间。

RE_TRIGR 指令用于在单个扫描循环期间重新启动扫描循环监视定时器。 结果是从最后一次执行 RE_TRIGR 功能开始,使允许的最大扫描周期延长一个最大循环时间段。

说明

对于 S7-1200 CPU 固件版本 2.2 之前的版本,RE_TRIGR 限制为从程序循环 OB 执行, 并可能用于无限期地延长 PLC 扫描时间。 如果从启动 OB、中断 OB 或错误 OB 执行RE_TRIGR,则不会复位监视狗定时器且 ENO = FALSE。

对于固件版本 2.2 及以上版本,可从任何 OB(包括启动、中断和错误 OB)执行

RE_TRIGR。 但是,PLC 扫描时间最长只能延长到已组态最大循环时间的 10 倍。

设置 PLC 最大循环时间

可以在设备配置的“循环时间”(Cycle time) 下组态最大扫描循环时间值。

表格 7- 116 循环时间值

循环时间监视 最小值 最大值 默认值
最大循环时间 1 ms 6000 ms 150 ms

监视狗超时

如果最大扫描循环定时器在扫描循环完成前达到预置时间,则会生成错误。 如果用户程序中包含错误处理代码块 OB 80,则 CPU 将执行 OB 80,用户可以在其中添加程序逻辑以创建具体响应。 如果不包含 OB 80,则忽略第一个超时条件并且 CPU 切换到 STOP。

如果在同一程序扫描中第二次发生最大扫描时间超时(2 倍的最大循环时间值),则触发错误使 CPU 切换到 STOP 模式。

在 STOP 模式下,用户程序停止执行,而 CPU 系统通信和系统诊断仍继续执行。

停止扫描循环指令

表格 7- 117 STP 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-110 STP(); STP(停止扫描循环)将 CPU 置于 STOP 模式。 CPU 处于

STOP 模式时,将停止程序执行并停止过程映像的物理更新。

有关详细信息,请参见: 组态从 RUN 切换到 STOP 时的输出 (页 88)。

如果 EN = TRUE,CPU 将进入 STOP 模式,程序执行停止,并且 ENO 状态无意义。否则,EN = ENO = 0。

获取错误指令

获取错误指令提供有关程序块执行错误的信息。 如果在代码块中添加了 GetError 或

GetErrorID 指令,则可在程序块中处理程序错误。

GetError

表格 7- 118 GetError 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-111 GET_ERROR(_o

ut_);

指示发生本地程序块执行错误,并用详细错误信息填充预定义的错误数据结构。

表格 7- 119 参数的数据类型

参数 数据类型 说明
ERROR ErrorStruct 错误数据结构: 可以重命名该结构,但不能重命名结构中的成员。

表格 7- 120 ErrorStruct 数据结构的元素

结构组件 数据类型 说明
ERROR_ID Word 错误 ID
FLAGS Byte 显示块调用期间是否出错。

16#01: 块调用期间出错。

16#00: 块调用期间未出错。

REACTION Byte 默认响应:

0: 忽略(写入错误),

1: 以替代值“0”继续(读取错误),

2: 跳转指令(系统错误)

CODE_ADDRESS CREF 有关块地址和类型的信息
BLOCK_TYPE Byte 出错块的类型:

1: OB

2: FC

3: FB

CB_NUMBER UInt 代码块的编号
OFFSET UDInt 对内部存储器的引用
MODE Byte 访问模式: 根据具体的访问类型,可输出以下信息:
模式 (A) (B) (C) (D) (E)
结构组件 数据类型 说明
0
1 偏移
2 区域
3 位置 范围 编号
4 区域 偏移
5 区域 DB 编号 偏移
6 伙伴编号 /访问 区域 DB 编号 偏移
7 伙伴编号 /访问 插槽号/范围 区域 DB 编号 偏移
OPERAND_NUMBER UInt 机器命令的操作数
POINTER_NUMBER_ LOCATION UInt (A) 内部指针
SLOT_NUMBER_SCOPE UInt (B) 内部存储器中的存储区
DATA_ADDRESS NREF 有关操作数地址的信息
AREA Byte (C) 存储区:

L: 16#40 – 4E、86、87、8E、8F、C0 – CE

I:16#81

Q: 16#82

M: 16#83

DB: 16#84、85、8A、8B

DB_NUMBER UInt (D) 数据块编号
OFFSET UDInt (E) 操作数的相对地址

GetErrorID

表格 7- 121 GetErrorID 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-112 GET_ERR_ID()

;

指示发生程序块执行错误,并报告错误的 ID(标识符代码)。

表格 7- 122 参数的数据类型

参数 数据类型 说明
ID Word ErrorStruct ERROR_ID 成员的错误标识符值

表格 7- 123 Error_ID 值

ERROR_ID 十 六进制值 ERROR_ID 十

进制值

程序块执行错误
0 0 无错误
2503 9475 未初始化指针错误
2522 9506 操作数超出范围读取错误
2523 9507 操作数超出范围写入错误
2524 9508 无效区域读取错误
2525 9509 无效区域写入错误
2528 9512 数据分配读取错误(位赋值不正确)
2529 9513 数据分配写入错误(位赋值不正确)
2530 9520 DB 受到写保护
253A 9530 全局 DB 不存在
253C 9532 版本错误或 FC 不存在
253D 9533 指令不存在
253E 9534 版本错误或 FB 不存在
253F 9535 指令不存在
2575 9589 程序嵌套深度错误
2576 9590 局部数据分配错误
2942 10562 物理输入点不存在
2943 10563 物理输出点不存在

操作

默认情况下,CPU 通过将错误记录到诊断缓冲区来响应块执行错误。 但是,如果在代码块中放置一个或多个 GetError 或 GetErrorID 指令,即将该块设置为在块内处理错误。 在这种情况下,CPU 不在诊断缓冲区中记录错误。 而是在 GetError 或 GetErrorID 指令的输出中报告错误信息。 可以使用 GetError 指令读取详细错误信息,或使用 GetErrorID 指令只读取错误标识符。 因为后续错误往往只是第一个错误的结果,所以第一个错误通常最重要。

在块内第一次执行 GetError 或 GetErrorID 指令将返回块执行期间检测到的第一个错误。在块启动到执行 GetError 或 GetErrorID 期间随时都可能发生该错误。 随后执行GetError 或 GetErrorID 将返回上次执行 GetError 或 GetErrorID 以来发生的第一个错误。 不保存错误历史,执行任一指令都将使 PLC 系统重新捕捉下一个错误。

可以在数据块编辑器和块接口编辑器中添加 GetError 指令所使用的 ErrorStruct 数据类型,从而程序逻辑可以访问这些值。 从数据类型下拉列表中选择 ErrorStruct 以添加该结构。 您可以使用唯一的名称创建多个 ErrorStruct 元素。 不能重命名 ErrorStruct 的成 员。

ENO 指示的错误条件

如果 EN = TRUE 且 GetError 或 GetErrorID 执行,则:

ENO = TRUE 表示发生代码块执行错误并提供错误数据

ENO = FALSE 表示未发生代码块执行错误

可以将错误响应程序逻辑连接到在发生错误后激活的 ENO。 如果存在错误,该输出参数会将错误数据存储在程序能够访问这些数据的位置。

GetError 和 GetErrorID 可用来将错误信息从当前执行块(被调用块)发送到调用块。 将该指令放置在被调用块程序的最后一个程序段中可以报告被调用块的最终执行状态。

字逻辑指令

AND、OR 和 XOR 指令

表格 7- 124 AND、OR 和 XOR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-113 out := in1 AND in2; AND: 逻辑 AND
out := in1 OR in2; OR: 逻辑 OR
out := in1 XOR in2; XOR: 逻辑异或

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

s7一1200功能指令表 基本指令-114 要添加输入,请单击“创建”(Create) 图标,或在其中一个现有 IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 125 参数的数据类型

参数 数据类型 说明
IN1, IN2 Byte, Word, DWord 逻辑输入
OUT Byte, Word, DWord 逻辑输出

1 所选数据类型将 IN1、IN2 和 OUT 设置为相同的数据类型。

IN1 和 IN2 的相应位值相互组合,在参数 OUT 中生成二进制逻辑结果。 执行这些指令之后,ENO 总是为 TRUE。

取反指令

表格 7- 126 INV 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-115 不提供 计算参数 IN 的二进制反码。 通过对参数 IN 各位的值取反来计算反码(将每个 0 变为 1,每个 1 变为 0)。 执行该指令后,

ENO 总是为 TRUE。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 127 参数的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Byte, Word, DWord 要取反的数据元素
OUT SInt, Int, DInt, USInt, UInt, UDInt, Byte, Word, DWord 取反后的输出

编码和解码指令

表格 7- 128 ENCO 和 DECO 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-116 out := ENCO(_in_); 将位序列编码成二进制数

ENCO 指令将参数 IN 转换为与参数 IN 的最低有效设置位的位位置对应的二进制数,并将结果返回给参数

OUT。 如果参数 IN 为 0000 0001 或 0000 0000,则将

值 0 返回给参数 OUT。 如果参数 IN 的值为 0000 0000,则 ENO 设置为 FALSE。

s7一1200功能指令表 基本指令-117 out := DECO(_in_); 将二进制数解码成位序列

DECO 指令通过将参数 OUT 中的相应位位置设置为 1

(其它所有位设置为 0)解码参数 IN 中的二进制数。 执行 DECO 指令之后,ENO 始终为 TRUE。

注: DECO 指令的默认数据类型为 DWORD。 在 SCL 中,将指令名称更改为 DECO_BYTE 或 DECO_WORD 可解码字节或字值,并分配到字节或字变量或地址。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 129 参数的数据类型

参数 数据类型 说明
IN ENCO: Byte, Word, DWord DECO: UInt ENCO: 要编码的位序列

DECO: 要解码的值

OUT ENCO: Int

DECO: Byte, Word, DWord

ENCO: 编码后的值

DECO: 解码后的位序列

表格 7- 130 ENCO 的 OUT 参数

ENO 条件 结果 (OUT)
1 无错误 有效位号
0 IN 为零 OUT 设置为零

DECO 参数 OUT 的数据类型选项(Byte、Word 或 DWord)限制参数 IN 的可用范围。如果参数 IN 的值超出可用范围,将执行求模运算,如下所示提取最低有效位。

DECO 参数 IN 的范围:

3 位(值 0-7)IN 用于设置 Byte OUT 中 1 的位位置

4 位(值 0-15)IN 用于设置 Word OUT 中 1 的位位置

5 位(值 0-31)IN 用于设置 DWord OUT 中 1 的位位置

表格 7- 131 示例

DECO IN 值 DECO OUT 值(解码单个位位置)
Byte OUT

8 位

最小 IN 0 00000001
最大 IN 7 10000000
Word OUT

16 位

最小 IN 0 0000000000000001
最大 IN 15 1000000000000000
DWord OUT

32 位

最小 IN 0 00000000000000000000000000000001
最大 IN 31 10000000000000000000000000000000

选择、多路复用和多路分用指令

表格 7- 132 SEL(选择)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-118 out := SEL(

g:=_bool_in,

in0:-_variant_in, in1:=_variant_in);

SEL 根据参数 G 的值将两个输入值之一分配给参数 OUT。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 133 SEL 指令的数据类型

参数 数据类型 1 说明
G Bool 0 选择 IN0

1 选择 IN1

IN0, IN1 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出

1 输入变量和输出变量必须为相同的数据类型。

条件代码: 执行 SEL 指令之后,ENO 始终为 TRUE。

表格 7- 134 MUX(多路复用)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-119 out := MUX(

k:=_unit_in, in1:=variant_in, in2:=variant_in,

[...in32:=variant_in,

]

inelse:=variant_in);

MUX 根据参数 K 的值将多个输入值之一复制到参数 OUT。如果参数 K 的值大于 (INn - 1),则会将参数 ELSE 的值复制到参数 OUT。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

s7一1200功能指令表 基本指令-120 要添加输入,请单击“创建”(Create) 图标,或在其中一个现有 IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 135 MUX 指令的数据类型

参数 数据类型 说明
K UInt 0 选择 IN1

1 选择 IN2

n 选择 INn

IN0, IN1, ..

INn

SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
ELSE SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入替换值(可选)
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出

1 输入变量和输出变量必须为相同的数据类型。

表格 7- 136 DEMUX(多路分用)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-121 DEMUX(

k:=_unit_in, in:=variant_in, out1:=variant_in, out2:=variant_in,

[...out32:=variant_in

,]

outelse:=variant_in)

;

DEMUX 将分配给参数 IN 的位置值复制到多个输出之一。参数 K 的值选择将哪一输出作为 IN 值的目标。 如果 K 的值大于数值 (OUTn - 1),则会将 IN 值复制到分配给 ELSE 参

数的位置。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

要添加输出,请单击创建图标,或在其中一个现有 OUT 参数的输出短线处单击右键,并选择“插入输出”(Insert output) 命令。 要删除输出,请在其中一个现有 OUT 参数(多于两个原始输出时)的输出短线处单击右键,并选择“删除”(Delete) 命令。

s7一1200功能指令表 基本指令-122 要添加输出,请单击“创建”(Create) 图标,或在其中一个现有 OUT 参数的输出短线处单击右键,并选择“插入输出”(Insert output) 命令。

要删除输出,请在其中一个现有 OUT 参数(多于两个原始输出时)的输出短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 137 DEMUX 指令的数据类型

参数 数据类型 1 说明
K UInt 选择器的值:

0 选择 OUT1

1 选择 OUT2

n 选择 OUTn

IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
OUT0,

OUT1, .. OUTn

SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出
ELSE SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char K 大于 (OUTn - 1) 时的替换输出

1 输入变量和输出变量必须为相同的数据类型。

表格 7- 138 MUX 和 DEMUX 指令的 ENO 状态

ENO 条件 结果 (OUT)
1 无错误 MUX:将选择的 IN 值复制到 OUT DEMUX:将 IN 值复制到选择的 OUT
0 MUX:K 大于输入数 -1 不提供 ELSE: OUT 不变,

提供 ELSE,将 ELSE 值分配给 OUT

DEMUX: K 大于输出数 -1 不提供 ELSE: 输出不变,

提供 ELSE,将 IN 值复制到 ELSE

移位和循环

移位指令

表格 7- 139 SHR 和 SHL 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-123 out := SHR(

in:=_variant_in_, n:=_uint_in);

out := SHL(

in:=_variant_in_, n:=_uint_in);

使用移位指令(SHL 和 SHR)移动参数 IN 的位序列。结果将分配给参数 OUT。 参数 N 指定移位的位数:

SHR: 右移位序列

SHL: 左移位序列

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 140 参数的数据类型

参数 数据类型 说明
IN Byte, Word, DWord 要移位的位序列
N UInt 要移位的位数
OUT Byte, Word, DWord 移位操作后的位序列

若 N=0,则不移位。 将 IN 值分配给 OUT。

用 0 填充移位操作清空的位位置。

如果要移位的位数 (N) 超过目标值中的位数(Byte 为 8 位、Word 为 16 位、DWord 为 32 位),则所有原始位值将被移出并用 0 代替(将 0 分配给 OUT)。

对于移位操作,ENO 总是为 TRUE。

表格 7- 141 Word 数据的 SHL 示例

自右插入零,使 Word 的位左移 (N = 1)
IN 1110 0010 1010 1101 首次移位前的 OUT 值: 1110 0010 1010 1101
首次左移后: 1100 0101 0101 1010
第二次左移后: 1000 1010 1011 0100
第三次左移后: 0001 0101 0110 1000

7.10 移位和循环

循环指令

表格 7- 142 ROR 和 ROL 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-124 out := ROL(

in:=_variant_in_, n:=_uint_in);

out := ROR(

in:=_variant_in_, n:=_uint_in);

循环指令(ROR 和 ROL)用于将参数 IN 的位序列循环移位。结果分配给参数 OUT。 参数 N 定义循环移位的位数。

ROR:循环右移位序列

ROL:循环左移位序列

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 143 参数的数据类型

参数 数据类型 说明
IN Byte, Word, DWord 要循环移位的位序列
N UInt 要循环移位的位数
OUT Byte, Word, DWord 循环移位操作后的位序列

若 N=0,则不循环移位。 将 IN 值分配给 OUT。

从目标值一侧循环移出的位数据将循环移位到目标值的另一侧,因此原始位值不会丢失。

如果要循环移位的位数 (N) 超过目标值中的位数(Byte 为 8 位、Word 为 16 位、

DWord 为 32 位),仍将执行循环移位。

执行循环指令之后,ENO 始终为 TRUE。

表格 7- 144 Word 数据的 ROR 示例

将各个位从右侧循环移出到左侧 (N = 1)
IN 0100 0000 0000 0001 首次循环移位前的 OUT 值: 0100 0000 0000 0001
首次循环右移后: 1010 0000 0000 0000
第二次循环右移后: 0101 0000 0000 0000

位逻辑

位逻辑触点和线圈

使用 LAD 和 FBD 处理布尔逻辑非常高效。 SCL 不但非常适合处理复杂的数学计算和项目控制结构,而且也可以使用 SCL 处理布尔逻辑。

LAD 触点

表格 7- 1 常开触点和常闭触点

LAD SCL 说明
s7一1200功能指令表 基本指令-125 IF in THEN

Statement;

ELSE

Statement; END_IF;

常开触点和常闭触点: 可将触点相互连接并创建用户自己的组合逻辑。 如果用户指定的输入位使用存储器标识符 I(输入)或

Q(输出),则从过程映像寄存器中读取位值。 控制过程中的物理触点信号会连接到 PLC 上的 I 端子。 CPU 扫描已连接的输入信号并持续更新过程映像输入寄存器中的相应状态值。

通过在 I 偏移量后追加“:P”,可指定立即读取物理输入(例如:

“%I3.4:P”)。 对于立即读取,直接从物理输入读取位数据值, 而非从过程映像中读取。 立即读取不会更新过程映像。

s7一1200功能指令表 基本指令-126 IF NOT (in) THEN

Statement;

ELSE

Statement; END_IF;

表格 7- 2 参数的数据类型

参数 数据类型 说明
IN Bool 分配位

在赋的位值为 1 时,常开触点将闭合 (ON)。

在赋的位值为 0 时,常闭触点将闭合 (ON)。

以串联方式连接的触点创建 AND 逻辑程序段。

以并联方式连接的触点创建 OR 逻辑程序段。

FBD、AND、OR 和 XOR 功能框

在 FBD 编程中,LAD 触点程序段变为与 (&)、或 (>=1) 和异或 (x) 功能框程序段,可在其中为功能框输入和输出指定位值。 也可以连接到其它逻辑框并创建用户自己的逻辑组

合。 在程序段中放置功能框后,可从“收藏夹”(Favorites) 工具栏或指令树中拖动“插入输

入”(Insert input) 工具,然后将其放置在功能框的输入侧以添加更多输入。 也可以右键单击功能框输入连接器并选择“插入输入”(Insert input)。

功能框输入和输出可连接到其它逻辑框,也可输入未连接输入的位地址或位符号名称。 执行功能框指令时,当前输入状态会应用到二进制功能框逻辑,如果为真,功能框输出将为真。

表格 7- 3 AND、OR 和 XOR 功能框

FBD SCL1 说明
s7一1200功能指令表 基本指令-127 out := in1 AND in2; AND 功能框的所有输入必须都为“真”,输出才为“真”。
s7一1200功能指令表 基本指令-128 out := in1 OR in2; OR 功能框只要有一个输入为“真”,输出就为“真”。
s7一1200功能指令表 基本指令-129 out := in1 XOR in2; XOR 功能框必须有奇数个输入为“真”,输出才为“真”。

1 对于 SCL: 必须将运算的结果赋给要用于其它语句的变量。

表格 7- 4 参数的数据类型

参数 数据类型 说明
IN1, IN2 Bool 输入位

NOT 逻辑反相器

表格 7- 5 NOT 逻辑反相器

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-130 s7一1200功能指令表 基本指令-131 NOT 对于 FBD 编程,可从“收藏夹”(Favorites) 工具栏或指令树中拖动“取反二进制输入”(Negate binary input) 工具,然后将其
放置在输入或输出端以在该功能框连接器上创建逻辑反相
s7一1200功能指令表 基本指令-132
器。
LAD NOT 触点取反能流输入的逻辑状态。
如果没有能流流入 NOT 触点,则会有能流流出。
如果有能流流入 NOT 触点,则没有能流流出。

输出线圈和赋值功能框

线圈输出指令写入输出位的值。 如果用户指定的输出位使用存储器标识符 Q,则 CPU 接通或断开过程映像寄存器中的输出位,同时将指定的位设置为等于能流状态。 控制执行器的输出信号连接到 CPU 的 Q 端子。 在 RUN 模式下,CPU 系统将连续扫描输入信

号,并根据程序逻辑处理输入状态,然后通过在过程映像输出寄存器中设置新的输出状态值进行响应。 在每个程序执行循环之后,CPU 系统会将存储在过程映像寄存器中的新的输出状态响应传送到已连接的输出端子。

表格 7- 6 输出线圈 (LAD) 和输出赋值功能框 (FBD)

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-133 s7一1200功能指令表 基本指令-134 out := <布尔表达式

>;

在 FBD 编程中,LAD 线圈变为分配(= 和 /=)功能框,可在其中为功能框输出指定位地址。 功能

基本指令 7

位逻辑

位逻辑触点和线圈

使用 LAD 和 FBD 处理布尔逻辑非常高效。 SCL 不但非常适合处理复杂的数学计算和项目控制结构,而且也可以使用 SCL 处理布尔逻辑。

LAD 触点

表格 7- 1 常开触点和常闭触点

LAD SCL 说明
s7一1200功能指令表 基本指令-135 IF in THEN

Statement;

ELSE

Statement; END_IF;

常开触点和常闭触点: 可将触点相互连接并创建用户自己的组合逻辑。 如果用户指定的输入位使用存储器标识符 I(输入)或

Q(输出),则从过程映像寄存器中读取位值。 控制过程中的物理触点信号会连接到 PLC 上的 I 端子。 CPU 扫描已连接的输入信号并持续更新过程映像输入寄存器中的相应状态值。

通过在 I 偏移量后追加“:P”,可指定立即读取物理输入(例如:

“%I3.4:P”)。 对于立即读取,直接从物理输入读取位数据值, 而非从过程映像中读取。 立即读取不会更新过程映像。

s7一1200功能指令表 基本指令-136 IF NOT (in) THEN

Statement;

ELSE

Statement; END_IF;

表格 7- 2 参数的数据类型

参数 数据类型 说明
IN Bool 分配位

在赋的位值为 1 时,常开触点将闭合 (ON)。

在赋的位值为 0 时,常闭触点将闭合 (ON)。

以串联方式连接的触点创建 AND 逻辑程序段。

以并联方式连接的触点创建 OR 逻辑程序段。

FBD、AND、OR 和 XOR 功能框

在 FBD 编程中,LAD 触点程序段变为与 (&)、或 (>=1) 和异或 (x) 功能框程序段,可在其中为功能框输入和输出指定位值。 也可以连接到其它逻辑框并创建用户自己的逻辑组

合。 在程序段中放置功能框后,可从“收藏夹”(Favorites) 工具栏或指令树中拖动“插入输

入”(Insert input) 工具,然后将其放置在功能框的输入侧以添加更多输入。 也可以右键单击功能框输入连接器并选择“插入输入”(Insert input)。

功能框输入和输出可连接到其它逻辑框,也可输入未连接输入的位地址或位符号名称。 执行功能框指令时,当前输入状态会应用到二进制功能框逻辑,如果为真,功能框输出将为真。

表格 7- 3 AND、OR 和 XOR 功能框

FBD SCL1 说明
s7一1200功能指令表 基本指令-137 out := in1 AND in2; AND 功能框的所有输入必须都为“真”,输出才为“真”。
s7一1200功能指令表 基本指令-138 out := in1 OR in2; OR 功能框只要有一个输入为“真”,输出就为“真”。
s7一1200功能指令表 基本指令-139 out := in1 XOR in2; XOR 功能框必须有奇数个输入为“真”,输出才为“真”。

1 对于 SCL: 必须将运算的结果赋给要用于其它语句的变量。

表格 7- 4 参数的数据类型

参数 数据类型 说明
IN1, IN2 Bool 输入位

NOT 逻辑反相器

表格 7- 5 NOT 逻辑反相器

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-140 s7一1200功能指令表 基本指令-141 NOT 对于 FBD 编程,可从“收藏夹”(Favorites) 工具栏或指令树中拖动“取反二进制输入”(Negate binary input) 工具,然后将其
放置在输入或输出端以在该功能框连接器上创建逻辑反相
s7一1200功能指令表 基本指令-142
器。
LAD NOT 触点取反能流输入的逻辑状态。
如果没有能流流入 NOT 触点,则会有能流流出。
如果有能流流入 NOT 触点,则没有能流流出。

输出线圈和赋值功能框

线圈输出指令写入输出位的值。 如果用户指定的输出位使用存储器标识符 Q,则 CPU 接通或断开过程映像寄存器中的输出位,同时将指定的位设置为等于能流状态。 控制执行器的输出信号连接到 CPU 的 Q 端子。 在 RUN 模式下,CPU 系统将连续扫描输入信

号,并根据程序逻辑处理输入状态,然后通过在过程映像输出寄存器中设置新的输出状态值进行响应。 在每个程序执行循环之后,CPU 系统会将存储在过程映像寄存器中的新的输出状态响应传送到已连接的输出端子。

表格 7- 6 输出线圈 (LAD) 和输出赋值功能框 (FBD)

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-143 s7一1200功能指令表 基本指令-144 out := <布尔表达式

>;

在 FBD 编程中,LAD 线圈变为分配(= 和 /=)功能框,可在其中为功能框输出指定位地址。 功能
框输入和输出可连接到其它功能框逻辑,用户也可

以输入位地址。

s7一1200功能指令表 基本指令-145 s7一1200功能指令表 基本指令-146 out := NOT <布尔表达式>;
通过在 Q 偏移量后加上“:P”,可指定立即写入物理输出(例如: “%Q3.4:P”)。 对于立即写入,将
s7一1200功能指令表 基本指令-147
位数据值写入过程映像输出并直接写入物理输出。

表格 7- 7 参数的数据类型

参数 数据类型 说明
OUT Bool 分配位

如果有能流通过输出线圈或启用了 FBD“=”功能框,则输出位设置为 1。

如果没有能流通过输出线圈或未启用 FBD“=”赋值功能框,则输出位设置为 0。

如果有能流通过反向输出线圈或启用了 FBD“/=”功能框,则输出位设置为 0。

如果没有能流通过反向输出线圈或未启用 FBD“/=”功能框,则输出位设置为 1。

置位和复位指令

置位和复位 1 位

表格 7- 8 S 和 R 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-148 s7一1200功能指令表 基本指令-149 不提供 S(置位)激活时,OUT 地址处的数据值设置为 1。S

未激活时,OUT 不变。

s7一1200功能指令表 基本指令-150 s7一1200功能指令表 基本指令-151 不提供 R(复位)激活时,OUT 地址处的数据值设置为 0。R

未激活时,OUT 不变。

1 对于 LAD 和 FBD: 这些指令可放置在程序段的任何位置。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 9 参数的数据类型

参数 数据类型 说明
IN(或连接到触点/门逻辑) Bool 要监视的位位置
OUT Bool 要置位或复位的位位置

置位和复位位域

表格 7- 10 SET_BF 和 RESET_BF 指令

LAD1 FBD SCL 说明
s7一1200功能指令表 基本指令-152 s7一1200功能指令表 基本指令-153 不提供 SET_BF 激活时,为从地址 OUT 处开始的“n”位分配数据值 1。 SET_BF 未激活时,OUT 不变。
s7一1200功能指令表 基本指令-154 s7一1200功能指令表 基本指令-155 不提供 RESET_BF 为从地址 OUT 处开始的“n”位写入数据值

0。 RESET_BF 未激活时,OUT 不变。

1 对于 LAD 和 FBD: 这些指令必须是分支中最右端的指令。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 11 参数的数据类型

参数 数据类型 说明
OUT Bool 要置位或复位的位域的起始元素(例如 #MyArray[3])
n 常数 (UInt) 要写入的位数

置位优先和复位优先位锁存

表格 7- 12 RS 和 SR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-156 不提供 RS 是置位优先锁存,其中置位优先。 如果置位 (S1) 和复位 (R) 信号都为真,则输出地址 OUT 将为 1。
s7一1200功能指令表 基本指令-157 不提供 SR 是复位优先锁存,其中复位优先。 如果置位 (S) 和复位 (R1) 信号都为真,则输出地址 OUT 将为 0。

1 对于 LAD 和 FBD: 这些指令必须是分支中最右端的指令。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 13 参数的数据类型

参数 数据类型 说明
S, S1 Bool 置位输入;1 表示优先
R, R1 Bool 复位输入;1 表示优先
OUT Bool 分配的位输出“OUT”
Q Bool 遵循“OUT”位的状态

OUT 参数指定置位或复位的位地址。 可选 OUT 输出 Q 反映“OUT”地址的信号状态。

指令 S1 R “OUT”位
RS 0 0 先前状态
0 1 0
1 0 1
1 1 1
S R1
SR 0 0 先前状态
0 1 0
1 0 1
1 1 0

上升沿和下降沿指令

表格 7- 14 上升沿和下降沿跳变检测

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-158 s7一1200功能指令表 基本指令-159 不提供 LAD: 在分配的“IN”位上检测到正跳变(断到通)时,该触点的状态为 TRUE。 该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。 P 触点可以放置在程序段中除分支结尾外的任何位置。

FBD: 在分配的输入位上检测到正跳变(关到开)时,输出逻辑状态为 TRUE。 P 功能框只能放置在分支的开头。

s7一1200功能指令表 基本指令-160 s7一1200功能指令表 基本指令-161 不提供 LAD: 在分配的输入位上检测到负跳变(开到关)时,该触点的状态为 TRUE。 该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。 N 触点可以放置在程序段中除分支结尾外的任何位置。

FBD: 在分配的输入位上检测到负跳变(开到关)时,输出逻辑状态为 TRUE。 N 功能框只能放置在分支的开头。

s7一1200功能指令表 基本指令-162 s7一1200功能指令表 基本指令-163 不提供 LAD: 在进入线圈的能流中检测到正跳变(关到开)时,分配的位“OUT”为 TRUE。 能流输入状态总是通过线圈后变为能流输出状态。 P 线圈可以放置在程序段中的任何位置。

FBD: 在功能框输入连接的逻辑状态中或输入位赋值中(如果该功能框位于分支开头)检测到正跳变(关到开)时,分配的位“OUT”为 TRUE。 输入逻辑状态总是通过功能框后变为输

出逻辑状态。 P= 功能框可以放置在分支中的任何位置。

s7一1200功能指令表 基本指令-164 s7一1200功能指令表 基本指令-165 不提供 LAD: 在进入线圈的能流中检测到负跳变(开到关)时,分配的位“OUT”为 TRUE。 能流输入状态总是通过线圈后变为能流输出状态。 N 线圈可以放置在程序段中的任何位置。

FBD: 在功能框输入连接的逻辑状态中或在输入位赋值中

(如果该功能框位于分支开头)检测到负跳变(通到断)时,

分配的位“OUT”为 TRUE。 输入逻辑状态总是通过功能框后变为输出逻辑状态。 N= 功能框可以放置在分支中的任何位置。

1 对于 SCL: 必须在应用程序内编写代码来复制该函数。

表格 7- 15 P_TRIG 和 N_TRIG 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-166 不提供 在 CLK 输入状态 (FBD) 或 CLK 能流输入 (LAD) 中检测到正跳变(断到通)时,Q 输出能流或逻辑状态为 TRUE。

在 LAD 中,P_TRIG 指令不能放置在程序段的开头或结尾。 在

FBD 中,P_TRIG 指令可以放置在除分支结尾外的任何位置。

s7一1200功能指令表 基本指令-167 不提供 在 CLK 输入状态 (FBD) 或 CLK 能流输入 (LAD) 中检测到负跳变(通到断)时,Q 输出能流或逻辑状态为 TRUE。

在 LAD 中,N_TRIG 指令不能放置在程序段的开头或结尾。 在

FBD 中,N_TRIG 指令可以放置在除分支结尾外的任何位置。

1 对于 SCL: 必须在应用程序内编写代码来复制该函数。

表格 7- 16 参数的数据类型(P 和 N 触点/线圈、P=、N=、P_TRIG 和 N_TRIG)

参数 数据类型 说明
M_BIT Bool 保存输入的前一个状态的存储器位
IN Bool 要检测其跳变沿的输入位
OUT Bool 指示检测到跳变沿的输出位
CLK Bool 要检测其跳变沿的能流或输入位
Q Bool 指示检测到沿的输出

所有沿指令均使用存储器位 (M_BIT) 存储要监视的输入信号的前一个状态。 通过将输入的状态与存储器位的状态进行比较来检测沿。 如果状态指示在关注的方向上有输入变化,则会在输出写入 TRUE 来报告沿。 否则,输出会写入 FALSE。

说明

沿指令每次执行时都会对输入和存储器位值进行评估,包括第一次执行。 在程序设计期间必须考虑输入和存储器位的初始状态,以允许或避免在第一次扫描时进行沿检测。

由于存储器位必须从一次执行保留到下一次执行,所以应该对每个沿指令都使用唯一的位,并且不应在程序中的任何其它位置使用该位。 还应避免使用临时存储器和可受其它系统功能(例如 I/O 更新)影响的存储器。 仅将 M、全局 DB 或静态存储器(在背景 DB 中)用于 M_BIT 存储器分配。

定时器

使用定时器指令可创建编程的时间延时。 用户程序中可以使用的定时器数仅受 CPU 存储器容量限制。 每个定时器均使用 16 字节的 IEC_Timer 数据类型的 DB 结构来存储功能框或线圈指令顶部指定的定时器数据。 STEP 7 会在插入指令时自动创建该 DB。

表格 7- 17 定时器指令

LAD/FBD 功能框 LAD 线圈 SCL 说明
s7一1200功能指令表 基本指令-168 s7一1200功能指令表 基本指令-169 "IEC_Timer_0_DB".TP( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_, ET=>_time_out_); TP 定时器可生成具有预设宽度时间的脉冲。
s7一1200功能指令表 基本指令-170 s7一1200功能指令表 基本指令-171 "IEC_Timer_0_DB".TON ( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_,

ET=>_time_out_);

TON 定时器在预设的延时过后将输出 Q 设置为 ON。
s7一1200功能指令表 基本指令-172 s7一1200功能指令表 基本指令-173 "IEC_Timer_0_DB".TOF ( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_, ET=>_time_out_); TOF 定时器在预设的延时过后将输出 Q 重设为 OFF。
s7一1200功能指令表 基本指令-174 s7一1200功能指令表 基本指令-175 "IEC_Timer_0_DB".TONR ( IN:=_bool_in_, R:=_bool_in_ PT:=_time_in_, Q=>_bool_out_,

ET=>_time_out_);

TONR 定时器在预设的延时过后将输出 Q 设置为 ON。 在使用 R 输入重置经过的时间之前,会跨越多个定时时段一直累加经过的时间。
仅 FBD:

s7一1200功能指令表 基本指令-176

s7一1200功能指令表 基本指令-177 (无对应的 SCL 指令) PT(预设定时器)线圈会在指定的

IEC_Timer 中装载新的 PRESET 时间值。

仅 FBD:

s7一1200功能指令表 基本指令-178

s7一1200功能指令表 基本指令-179 (无对应的 SCL 指令) RT(复位定时器)线圈会复位指定的

IEC_Timer。

1 STEP 7 会在插入指令时自动创建 DB。

2 在 SCL 示例中,“IEC_Timer_0_DB”是背景 DB 的名称。

表格 7- 18 参数的数据类型

参数 数据类型 说明
功能框: IN

线圈: 能流

Bool TP、TON 和 TONR:

功能框: 0=禁用定时器,1=启用定时器

线圈: 无能流=禁用定时器,能流=启用定时器

TOF:

功能框: 0=启用定时器,1=禁用定时器

线圈: 无能流=启用定时器,能流=禁用定时器

R Bool 仅 TONR 功能框:

0=不重置

1= 将经过的时间和 Q 位重置为 0

功能框: PT

线圈: "PRESET_Tag"

Time 定时器功能框或线圈: 预设的时间输入
功能框: Q

线圈: DBdata.Q

Bool 定时器功能框: Q 功能框输出或定时器 DB 数据中的 Q 位定时器线圈: 仅可寻址定时器 DB 数据中的 Q 位
功能框: ET

线圈: DBdata.ET

Time 定时器功能框: ET(经历的时间)功能框输出或定时器 DB 数据中的 ET 时间值

定时器线圈: 仅可寻址定时器 DB 数据中的 ET 时间值。

表格 7- 19 PT 和 IN 参数值变化的影响

定时器 PT 和 IN 功能框参数和相应线圈参数的变化
TP 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,更改 IN 没有任何影响。

TON 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,将 IN 更改为 FALSE 会复位并停止定时器。

TOF 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,将 IN 更改为 TRUE 会复位并停止定时器。

TONR 定时器运行期间更改 PT 没有任何影响,但对定时器中断后继续运行会有影响。

定时器运行期间将 IN 更改为 FALSE 会停止定时器但不会复位定时器。 将 IN 改回

TRUE 将使定时器从累积的时间值开始定时。

PT(预设时间)和 ET(经过的时间)值以表示毫秒时间的有符号双精度整数形式存储在指定的 IEC_TIMER DB 数据中。 TIME 数据使用 T# 标识符,可以简单时间单元

(T#200ms 或 200)和复合时间单元(如 T#2s_200ms)的形式输入。

表格 7- 20 TIME 数据类型的大小和范围

数据类型 大小 有效数值范围 1
TIME 32 位,以

DInt 数据的形式存储

T#-24d_20h_31m_23s_648ms 到 T#24d_20h_31m_23s_647ms

以 -2,147,483,648 ms 到 +2,147,483,647 ms 的形式存储

1 在定时器指令中,无法使用上面所示 TIME 数据类型的负数范围。 负的 PT(预设时间)值在定时器指令执行时被设置为 0。 ET(经过的时间)始终为正值。

定时器线圈示例

-(TP)-、-(TON)-、-(TOF)- 和 -(TONR)- 定时器线圈必须是 LAD 网络中的最后一个指令。如定时器示例中所示,后面网络中的触点指令会求出定时器线圈 IEC_Timer DB 数据中的

Q 位值。 同样,如果要在程序中使用经过的时间值,必须访问 IEC_timer DB 数据中的

ELAPSED 元素。

s7一1200功能指令表 基本指令-180

当 Tag_Input 位的值由 0 转换为 1 时,脉冲定时器启动。 定时器开始运行并持续

Tag_Time 时间值指定的时间。

s7一1200功能指令表 基本指令-181

只要定时器运行,就存在 DB1.MyIEC_Timer.Q 状态=1 且 Tag_Output 值=1。当经过

Tag_Time 值后,DB1.MyIEC_Timer.Q=0 且 Tag_Output 值=0。

37 37 37
37 37

重置定时器 -(RT)- 和预设定时器 -(PT)- 线圈

这些线圈指令可与功能框或线圈定时器一起使用并可放置在中间位置。 线圈输出能流状态始终与线圈输入状态相同。 若 -(RT)- 线圈激活,指定 IEC_Timer DB 数据中的

ELAPSED 时间元素将重置为 0。若 -(PT)- 线圈激活,指定 IEC_Timer DB 数据中的

PRESET 时间元素将重置为 0。

说明

在 FB 中放置定时器指令时,可以选择“多重背景数据块”(Multi-instance data block) 选项。 各定时器结构名称可以对应不同的数据结构,但定时器数据包含在同一个数据块 中,无需为每个定时器都使用一个独立的数据块。 这样可减少处理定时器所需的处理时间和数据存储空间。 在共享的多重背景数据块中的定时器数据结构之间不存在交互作 用。

定时器的运行

表格 7- 21 IEC 定时器的类型

定时器 时序图
TP: 脉冲定时器 ,1
TP 定时器可生成具有预设宽度时间的脉冲。
(7
37
4
TON: 接通延迟定时器 ,1
TON 定时器在预设的延时过后将输出 Q 设置为

ON。

(7 37
4
37 37
定时器 时序图
TOF: 关断延迟定时器 ,1
TOF 定时器在预设的延时过后将输出 Q 重置为
OFF。 (7 37
4
TONR: 保持型接通延迟定时器 ,1
TONR 定时器在预设的延时过后将输出 Q 设置
为 ON。 在使用 R 输入重置经过的时间之前,会 (7 37
跨越多个定时时段一直累加经过的时间。
4
5

说明

在 CPU 中,没有给任何特定的定时器指令分配专门的资源。 每个定时器使用 DB 存储器中其自身的结构和一个连续运行的内部 CPU 定时器来执行定时。

当由于 TP、TON、TOF 或 TONR 指令的输入上出现沿跳变而启动定时器时,连续运行的内部 CPU 定时器的值将被复制到为该定时器指令分配的 DB 结构的 START 成员中。该起始值在定时器继续运行期间将保持不变,随后将在每次更新定时器时使用。 每次启动定时器时,都会从内部 CPU 定时器将一个新的起始值加载到定时器结构中。

更新定时器时,将从内部 CPU 定时器的当前值中减去上述起始值以确定经过的时间。 再将经过的时间与预设值进行比较以确定定时器 Q 位的状态。 然后在为该定时器分配的

DB 结构中,更新 ELAPSED 和 Q 成员。 注意,经过的时间将停留在预设值上(达到预设值后定时器便不会继续累加经过的时间)。

当且仅当满足以下条件时才会执行定时器更新:

已执行定时器指令(TP、TON、TOF 或 TONR)

某个指令直接引用 DB 中定时器结构的“ELAPSED”成员

某个指令直接引用 DB 中定时器结构的“Q”成员

定时器编程

规划和创建用户程序时应考虑以下定时器运行说明:

可在同一个扫描周期内多次更新定时器。 每次执行定时器指令(TP、TON、TOF、

TONR)和每次将定时器结构的 ELAPSED 或 Q 成员用作其它已执行指令的参数时, 都会更新定时器。 这在需要最新时间数据(本质上是立即读取定时器)时会是一项优点。 但是,如果希望在整个程序扫描周期内保持一致的值,则请将定时器指令放置在需要这些值的其它所有指令之前,并使用定时器指令的 Q 和 ET 输出中的变量而不是定时器 DB 结构的 ELAPSED 和 Q 成员。

扫描期间可以不执行定时器更新。 可以在函数中启动定时器,然后在一个或多个扫描周期内不再调用该函数。 如果没有执行引用定时器结构中 ELAPSED 或 Q 成员的其它指令,则不会更新定时器。 直到再次执行定时器指令或执行将定时器结构的

ELAPSED 或 Q 用作参数的其它指令时,才会再次更新定时器。

尽管并不常见,但可以将同一个 DB 定时器结构分配给多个定时器指令。 通常,为避免意外交互作用,应当使每个 DB 定时器结构仅对应一个定时器指令(TP、TON、

TOF、TONR)。

自复位定时器适合用于触发需要周期性发生的动作。 通常,将引用定时器位的常闭触点放置在定时器指令前面可创建自复位定时器。 该定时器网络通常位于使用该定时器位来触发动作的一个或多个依赖型网络上面。 当定时器时间已到(经过的时间达到预设值)时,定时器位将在一个扫描周期内为 ON,因而可执行由该定时器位控制的依赖型网络逻辑。 下次执行定时器网络时,常闭触点将为 OFF,从而复位定时器并清除定时器位。 下次扫描期间,常闭触点将为 ON,因此将重启定时器。 创建此类自复位定时器时,请勿将定时器 DB 结构的“Q”成员用作该定时器指令前面常闭触点的参数。 而是要使用与该定时器指令的“Q”输出相连的变量。 如果访问定时器 DB 结构的

Q 成员,将导致定时器更新,且如果因常闭触点而更新定时器,该触点将立即复位该定时器。 定时器指令的 Q 输出将在一个扫描周期内不为 ON,并且依赖型网络不会执行。

RUN-STOP-RUN 切换或 CPU 循环上电后保留时间数据

如果从运行模式阶段切换到停止模式或 CPU 循环上电并启动了新运行模式阶段,则存储在之前运行模式阶段中的定时器数据将丢失,除非将定时器数据结构指定为具有保持性

(TP、TON、TOF 和 TONR 定时器)。

将定时器指令放到程序编辑器中后,如果接受调用选项对话框中的默认设置,则将自动分配一个无法实现具有保持性的背景数据块。 要使定时器数据具有保持性,必须使用全局数据块或多重背景数据块。

指定全局数据块将定时器数据存储为保持性数据

无论将定时器放在什么位置(OB、FC 或 FB),该选项都有效。

创建一个全局数据块:

在项目树中双击“添加新块”(Add new block)。

单击数据块 (DB) 图标

对于“类型”(Type),选择“全局数据块”(global DB)。

如果希望能够将该数据块中各数据元素选择为具有保持性,则确保选中数据块类型

“优化”(Optimized) 框。 另一个数据块类型选项“标准 - 与 S7-300/400 兼

容”(Standard - compatible with S7-300/400) 仅允许将所有 DB 数据元素都设置为具有保持性或没有保持性。

单击“确定”(OK)

向该数据块中添加定时器结构:

在新的全局数据块中,添加 IEC_Timer 数据类型的静态变量。

在“保持性”(Retain) 列中,选中相应框以使该结构具有保持性。

重复此过程为要存储在该数据块中的所有定时器创建结构。 可以将每个定时器结构放置在独立的全局数据块中,也可以将多个定时器结构放置在同一个全局数据块 中。 除定时器外,还可以将其它静态变量放置在该全局数据块中。 将多个定时器结构放置在同一个全局数据块中可减少总的块数。

可根据需要重命名定时器结构。

打开程序块来选择保持性定时器的放置位置(OB、FC 或 FB)。

将定时器指令放置在所需位置。

在调用选项对话框出现后,单击“取消”按钮。

在新的定时器指令上方,输入上面所创建全局数据块和定时器结构的名称(请勿使用助手浏览)(例如:“Data_block_3.Static_1”)。

指定多重背景数据块以将定时器数据存储为保持性数据

该选项仅对于将定时器放置在 FB 中有效。

该选项取决于创建 FB 时是否选中了“优化”块访问(仅允许符号访问)。 创建 FB 后,便无法将复选框设置更改为“优化”(Optimized);必须在创建 FB 时,在从树中选择“添加新块”(Add new block) 后出现的第一个屏幕上正确选择该复选框。 要检查现有 FB 访问属性的组态情况,请在项目树中右键单击该 FB,选择“属性”(Properties),然后选择“特

性”(Attributes)。

如果创建 FB 时选中了“优化”(Optimized) 框(仅允许符号访问):

打开 FB 进行编辑。

将定时器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名定时器。

单击“确定”(OK)。 定时器指令将出现在编辑器中,而 IEC_TIMER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有必要,打开 FB 接口编辑器(可能需要单击小箭头以展开视图)。

在“静态”(Static) 下,找到刚刚创建的定时器结构。

在此定时器结构的“保持性”(Retain) 列中,改为选择“保持性”(Retain)。 此后只要从另一程序块调用此 FB,都将利用此接口定义(包含标有保持性的定时器结构)创建背景数据块。

如果创建 FB 时选中了“标准 - 与 S7-300/400 兼容”(Standard - compatible with S7-

300/400) 框(允许符号访问和直接访问):

打开 FB 进行编辑。

将定时器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名定时器。

单击“确定”(OK)。 定时器指令将出现在编辑器中,而 IEC_TIMER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

打开将使用此 FB 的块。

将此 FB 置于所需的位置。 如此将为该 FB 创建一个背景数据块。

打开将 FB 放入编辑器时创建的背景数据块。

在“静态”(Static) 下,找到所需的定时器结构。 在此定时器结构的“保持性”(Retain) 列中,选中相应框使该结构具有保持性。

计数器

表格 7- 22 计数器指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-182 "IEC_Counter_0_DB".CTU( CU:=_bool_in, R:=_bool_in, PV:=_int_in, Q=>_bool_out, CV=>_int_out); 可使用计数器指令对内部程序事件和外部过程事件进行计
数。 每个计数器都使用数据块中存储的结构来保存计数器数
据。 用户在编辑器中放置计数器指令时分配相应的数据块。
CTU 是加计数器
s7一1200功能指令表 基本指令-183 "IEC_Counter_0_DB".CTD( CD:=_bool_in, LD:=_bool_in, PV:=_int_in, Q=>_bool_out,

CV=>_int_out);

CTD 是减计数器
CTUD 是加减计数器
s7一1200功能指令表 基本指令-184 "IEC_Counter_0_DB".CTUD( CU:=_bool_in, CD:=_bool_in, R:=_bool_in, LD:=_bool_in, PV:=_int_in, QU=>_bool_out, QD=>_bool_out, CV=>_int_out);

1 对于 LAD 和 FBD: 从指令名称下的下拉列表中选择计数值数据类型。

2 STEP 7 会在插入指令时自动创建 DB。

3 在 SCL 示例中,“IEC_Counter_0_DB”是背景 DB 的名称。

表格 7- 23 参数的数据类型

参数 数据类型 1 说明
CU, CD Bool 加计数或减计数,按加或减一计数
R (CTU, CTUD) Bool 将计数值重置为零
LD (CTD, CTUD) Bool 预设值的装载控制
PV SInt, Int, DInt, USInt, UInt, UDInt 预设计数值
Q, QU Bool CV >= PV 时为真
QD Bool CV <= 0 时为真
CV SInt, Int, DInt, USInt, UInt, UDInt 当前计数值

1 计数值的数值范围取决于所选的数据类型。 如果计数值是无符号整型数,则可以减计数到零或加计数到范围限值。 如果计数值是有符号整数,则可以减计数到负整数限值或加计数到正整数限值。

用户程序中可以使用的计数器数仅受 CPU 存储器容量限制。 计数器占用以下存储器空间:

对于 SInt 或 USInt 数据类型,计数器指令占用 3 个字节。

对于 Int 或 UInt 数据类型,计数器指令占用 6 个字节。

对于 DInt 或 UDInt 数据类型,计数器指令占用 12 个字节。

这些指令使用软件计数器,软件计数器的最大计数速率受其所在的 OB 的执行速率限制。指令所在的 OB 的执行频率必须足够高,以检测 CU 或 CD 输入的所有跳变。 要了解更快的计数操作,请参见 CTRL_HSC 指令 (页 363)。

说明

在 FB 中放置计数器指令后,可以选择多重背景数据块选项,各计数器结构名称可以对应不同的数据结构,但计数器数据包含在同一个数据块中,从而无需每个计数器都使用一个单独的数据块。 这减少了计数器所需的处理时间和数据存储空间。 在共享的多重背景数据块中的计数器数据结构之间不存在交互作用。

计数器的运行

表格 7- 24 CTU 计数器的运行

计数器 运行
当参数 CU 的值从 0 变为 1 时,CTU 计数器会使计数值加 1。 &8 5

&9 4

0 1 2 3 4 0
CTU 时序图显示了计数值为无符号整数时的运行(其中,PV =
3)。
如果参数 CV(当前计数值)的值大于或等于参数 PV(预
设计数值)的值,则计数器输出参数 Q = 1。
如果复位参数 R 的值从 0 变为 1,则当前计数值重置为 0。

表格 7- 25 CTD 计数器的运行

计数器 运行
当参数 CD 的值从 0 变为 1 时,CTD 计数器会使计数 &'
值减 1。CTD 时序图显示了计数值为无符号整数时的
/2$'
运行(其中,PV = 3)。
&9 0 3 2 1 0 3 2
如果参数 CV(当前计数值)的值等于或小于 0,则
计数器输出参数 Q = 1。
如果参数 LOAD 的值从 0 变为 1,则参数 PV(预 4
设值)的值将作为新的 CV(当前计数值)装载到
计数器。

表格 7- 26 CTUD 计数器的运行

计数器 运行
当加计数 (CU) 输入或减计 &8
数 (CD) 输入从 0 转换为 1 &'
时,CTUD 计数器将加 1 或
减 1。 CTUD 时序图显示了 5
计数值为无符号整数时的运
行(其中 PV = 4)。 /2$'

&9

0 1 2 3 4 5 4 3 4 5 0
如果参数 CV 的值大于等
于参数 PV 的值,则计数
器输出参数 QU = 1。
如果参数 CV 的值小于或
等于零,则计数器输出参
数 QD = 1。 48
如果参数 LOAD 的值从 0 4'
变为 1,则参数 PV 的值
将作为新的 CV 装载到计
数器。
如果复位参数 R 的值从 0
变为 1,则当前计数值重
置为 0。

RUN-STOP-RUN 切换或 CPU 循环上电后保留计数器数据

如果从运行模式阶段切换到停止模式或 CPU 循环上电并启动了新运行模式阶段,则存储在之前运行模式阶段中的计数器数据将丢失,除非将定时器数据结构指定为具有保持性

(CTU、CTD 和 CTUD 计数器)。

将计数器指令放到程序编辑器中后,如果接受调用选项对话框中的默认设置,则将自动分配一个无法实现具有保持性的背景数据块。 要使计数器数据具有保持性,必须使用全局数据块或多重背景数据块。

指定全局数据块将计数器数据存储为保持性数据

无论将计数器放在什么位置(OB、FC 或 FB),该选项都有效。

创建一个全局数据块:

在项目树中双击“添加新块”(Add new block)。

单击数据块 (DB) 图标

对于“类型”(Type),选择“全局数据块”(global DB)。

如果希望能够将该数据块中的各个项选择为具有保持性,则确保选中“仅符号访 问”(symbolic-access-only) 框。

单击“确定”(OK)

向该数据块添加计数器结构:

在新的全局数据块中,添加使用以下计数器数据类型之一的新静态变量。 务必要考虑到想要用于预设值和计数值的类型。

计数器数据类型 预设值和计数值的相应类型

IEC_Counter INT

IEC_SCounter SINT

IEC_DCounter DINT

IEC_UCounter UINT

IEC_USCounter USINT

IEC_UDCounter UDINT

在“保持性”(Retain) 列中,选中相应框以使该结构具有保持性。

重复此过程为要存储在该数据块中的所有计数器创建结构。 可以将每个计数器结构放置在独立的全局数据块中,也可以将多个计数器结构放置在同一个全局数据块 中。 除计数器外,还可以将其它静态变量放置在该全局数据块中。 将多个计数器结构放置在同一个全局数据块中可减少总的块数。

可根据需要重命名计数器结构。

打开程序块来选择保持性计数器的放置位置(OB、FC 或 FB)。

将计数器指令放置在所需位置。

在调用选项对话框出现后,单击“取消”按钮。 您现在应该看到新的计数器指令,在指令名称的上面和下面均显示“???”。

在新的计数器指令上方,输入上面所创建全局数据块和计数器结构的名称(请勿使用助手浏览)(例如: “Data_block_3.Static_1”)。 这需要填入对应的预设值和计数值类型(例如: UInt 对应于 IEC_UCounter 结构)。

指定多重背景数据块以将计数器数据存储为保持性数据

该选项仅对于将计数器放置在 FB 中有效。

该选项取决于是否将 FB 创建为仅符号访问。 创建 FB 后,便无法更改“仅符号访

问”(Symbolic access only) 复选框的设置;必须在创建 FB 时,在从树中选择“添加新

块”(Add new block) 后出现的第一个屏幕上正确选择该复选框。 要查看此框针对现有 FB

的组态情况,请在项目树中右键单击该 FB,选择“属性”(properties),然后选择“特性”(Attributes)。

如果创建 FB 时选中了“仅符号访问”(Symbolic access only) 框:

打开 FB 进行编辑。

将计数器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名计数器。

单击“确定”(OK)。 计数器指令将出现在编辑器中并且预设值和计数值的类型为 INT, 而 IEC_COUNTER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有需要,请在计数器指令中将类型从 INT 更改为其它类型之一。 计数器结构将相应更改。

计数器指令中显示的类型(对于预设值和计数值)

FB 接口中显示的对应的结构类型

INT IEC_Counter

SINT IEC_SCounter

DINT IEC_DCounter

UINT IEC_UCounter

USINT IEC_USCounter

UDINT IEC_UDCounter

如有必要,打开 FB 接口编辑器(可能需要单击小箭头以展开视图)。

在“静态”(Static) 下,找到刚刚创建的计数器结构。

在此计数器结构的“保持性”(Retain) 列中,改为选择“保持性”(Retain)。 此后只要从另一程序块调用此 FB,都将利用此接口定义(包含标有保持性的计数器结构)创建背景数据块。

如果创建 FB 时未选中“仅符号访问”(Symbolic access only) 框:

打开 FB 进行编辑。

将计数器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名计数器。

单击“确定”(OK)。 计数器指令将出现在编辑器中并且预设值和计数值的类型为 INT, 而 IEC_COUNTER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有需要,请在计数器指令中将类型从 INT 更改为其它类型之一。 计数器结构将相应更改。

计数器指令中显示的类型(对于预设值和计数值)

FB 接口中显示的对应的结构类型

INT IEC_Counter

SINT IEC_SCounter

DINT IEC_DCounter

UINT IEC_UCounter

USINT IEC_USCounter

UDINT IEC_UDCounter

打开将使用此 FB 的块。

将此 FB 置于所需的位置。 如此将为该 FB 创建一个背景数据块。

打开将 FB 放入编辑器时创建的背景数据块。

在“静态”(Static) 下,找到所需的计数器结构。 在此计数器结构的“保持性”(Retain) 列中,选中相应框使该结构具有保持性。

比较

比较

表格 7- 27 比较指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-185 s7一1200功能指令表 基本指令-186 out := in1 = in2;

or

IF in1 = in2

THEN out := 1; ELSE out := 0; END_IF;

比较数据类型相同的两个值。 该 LAD 触点比较结果为 TRUE 时,则该触点会被激活。 如果该

FBD 功能框比较结果为 TRUE,则功能框输出为 TRUE。

1 对于 LAD 和 FBD: 单击指令名称(如“==”),以从下拉列表中更改比较类型。 单击“???”并从下拉列表中选择数据类型。

表格 7- 28 参数的数据类型

参数 数据类型 说明
IN1, IN2 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, String, Char, Time, DTL, 常数 要比较的值

表格 7- 29 比较说明

关系类型 满足以下条件时比较结果为真 ...
= IN1 等于 IN2
<> IN1 不等于 IN2
>= IN1 大于或等于 IN2
<= IN1 小于或等于 IN2
> IN1 大于 IN2
< IN1 小于 IN2

7.4 比较

范围内和范围外指令

表格 7- 30 范围内和范围外指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-187 out := IN_RANGE(min, val, max); 测试输入值是在指定的值范围之内还是之外。

如果比较结果为 TRUE,则功能框输出为 TRUE。

s7一1200功能指令表 基本指令-188 out := OUT_RANGE(min, val, max);

1 对于 LAD 和 FBD: 单击“???”并从下拉列表中选择数据类型。

表格 7- 31 参数的数据类型

参数 数据类型 1 说明
MIN, VAL, MAX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 比较器输入

1 输入参数 MIN、VAL 和 MAX 的数据类型必须相同。

满足以下条件时 IN_RANGE 比较结果为真: MIN <= VAL <= MAX

满足以下条件时 OUT_RANGE 比较结果为真: VAL < MIN 或 VAL > MAX

OK 和 Not OK 指令

表格 7- 32 OK 和 Not OK 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-189 s7一1200功能指令表 基本指令-190 不提供 测试输入数据参考是否为符合 IEEE 规范 754 的有效实数。
s7一1200功能指令表 基本指令-191 s7一1200功能指令表 基本指令-192 不提供

1 对于 LAD 和 FBD: 如果该 LAD 触点为 TRUE,则激活该触点并传递能流。 如果该 FBD 功能框为 TRUE, 则功能框输出为 TRUE。

表格 7- 33 参数的数据类型

参数 数据类型 说明
IN Real, LReal 输入数据

表格 7- 34 操作

指令 满足以下条件时 REAL 数测试结果为 TRUE:
OK 输入值为有效实数 1
NOT_OK 输入值不是有效实数 1

1 如果 Real 或 LReal 类型的值为 +/- INF(无穷大)、NaN(不是数字)或者非标准化的值,则其无效。 非标准化的值是非常接近于 0 的数字。 CPU 在计算中用 0 替换非标准化的值。

参见

LAD、FBD 和 SCL 的 EN 和 ENO (页 164)

数学

计算指令

表格 7- 35 CALCULATE 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-193 使用标准 SCL 数学表达式创建等式。 CALCULATE 指令可用于创建作用于多个输入上的数学函数

(IN1,IN2,.. INn),并根据您定义的等式在 OUT 处生成结果。

首先选择数据类型。 所有输入和输出的数据类型必须相同。

要添加其它输入,请单击最后一个输入处的图标。

表格 7- 36 参数的数据类型

参数 数据类型 1
IN1, IN2, ..INn SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord

1 IN 和 OUT 参数必须具有相同的数据类型(通过对输入参数进行隐式转换)。 例如: 如果 OUT 是 INT 或

REAL,则 SINT 输入值将转换为 INT 或 REAL 值

单击计算器图标可打开对话框,在其中定义数学函数。 输入等式作为输入(如 IN1 和

IN2)和操作数。 单击“确定”(OK) 保存函数时,对话框会自动生成 CALCULATE 指令的输入。

编辑器底部显示有一个示例及可包含的数学运算列表。

s7一1200功能指令表 基本指令-194

说明

还必须为函数中的任何常量生成输入。 然后会在指令 CALCULATE 的相关输入中输入该常量值。

通过输入常量作为输入,可将 CALCULATE 指令复制到用户程序的其它位置,从而无需更改函数。 之后,不需要修改函数,就可以更改指令输入的值或变量。

当执行 CALCULATE 并成功完成计算中的所有单个运算时,ENO = 1,否则 ENO = 0。

加法、减法、乘法和除法指令

表格 7- 37 加法、减法、乘法和除法指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-195 out out out out :=

:=

:=

:=

in1 in1 in1 in1 + in2;

- in2;

* in2;

/ in2;

ADD: 加法 (IN1 + IN2 = OUT)

SUB: 减法 (IN1 - IN2 = OUT)

MUL: 乘法 (IN1 * IN2 = OUT)

DIV: 除法 (IN1 / IN2 = OUT)
整数除法运算会截去商的小数部分以生成整数输出。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 38 参数的数据类型(LAD 和 FBD)

参数 数据类型 1 说明
IN1, IN2 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 参数 IN1、IN2 和 OUT 的数据类型必须相同。

s7一1200功能指令表 基本指令-196 要添加 ADD 或 MUL 输入,请单击“创建”(Create) 图标,或在其中一个现有

IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

启用数学指令 (EN = 1) 后,指令会对输入值(IN1 和 IN2)执行指定的运算并将结果存储在通过输出参数 (OUT) 指定的存储器地址中。 运算成功完成后,指令会设置 ENO = 1。

表格 7- 39 ENO 状态

ENO 说明
1 无错误
0 数学运算结果值可能超出所选数据类型的有效数值范围。 返回适合目标大小的结果的最低有效部分。
0 除数为 0 (IN2 = 0): 结果未定义,返回 0。
0 Real/LReal: 如果其中一个输入值为 NaN(不是数字),则返回 NaN。
0 ADD Real/LReal: 如果两个 IN 值均为 INF,但符号不同,则这是非法运算并返回 NaN。
0 SUB Real/LReal: 如果两个 IN 值均为 INF,且符号相同,则这是非法运算并返回 NaN。
0 MUL Real/LReal: 如果一个 IN 值为零而另一个为 INF,则这是非法运算并返回 NaN。
0 DIV Real/LReal: 如果两个 IN 值均为零或 INF,则这是非法运算并返回 NaN。

求模指令

表格 7- 40 MOD 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-197 out := in1 MOD in2; 可以使用 MOD 指令返回整数除法运算的余数。 用输入 IN1 的值除以输入 IN2 的值,在输出 OUT 中返回余数。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 41 参数的数据类型

参数 数据类型 1 说明
IN1 和 IN2 SInt, Int, DInt, USInt, UInt, UDInt, 常数 求模输入
OUT SInt, Int, DInt, USInt, UInt, UDInt 求模输出

1 IN1、IN2 和 OUT 参数的数据类型必须相同。

表格 7- 42 ENO 值

ENO 说明
1 无错误
0 值 IN2 = 0,OUT 被赋以零值

取反指令

表格 7- 43 NEG 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-198 -(in); 使用 NEG 指令可将参数 IN 的值的算术符号取反并将结果存储在参数 OUT

中。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 44 参数的数据类型

参数 数据类型 1 说明
IN SInt, Int, DInt, Real, LReal, Constant 数学运算输入
OUT SInt, Int, DInt, Real, LReal 数学运算输出

1 参数 IN 和 OUT 的数据类型必须相同。

表格 7- 45 ENO 状态

ENO 说明
1 无错误
0 结果值超出所选数据类型的有效数值范围。

以 SInt 为例: NEG (-128) 的结果为 +128,超出该数据类型的最大值。

递增和递减指令

表格 7- 46 INC 和 DEC 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-199 in_out := in_out + 1; 递增有符号或无符号整数值:

IN_OUT 值 +1 = IN_OUT 值

s7一1200功能指令表 基本指令-200 in_out := in_out - 1; 递减有符号或无符号整数值:

IN_OUT 值 - 1 = IN_OUT 值

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 47 参数的数据类型

参数 数据类型 说明
IN/OUT SInt, Int, DInt, USInt, UInt, UDInt 数学运算输入和输出

表格 7- 48 ENO 状态

ENO 说明
1 无错误
0 结果值超出所选数据类型的有效数值范围。

以 SInt 为例: INC (+127) 的结果为 +128,超出该数据类型的最大值。

绝对值指令

表格 7- 49 ABS 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-201 out := ABS(in); 计算参数 IN 的有符号整数或实数的绝对值并将结果存储在参数 OUT

中。

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 50 参数的数据类型

参数 数据类型 1 说明
IN SInt, Int, DInt, Real, LReal 数学运算输入
OUT SInt, Int, DInt, Real, LReal 数学运算输出

1 参数 IN 和 OUT 的数据类型必须相同。

表格 7- 51 ENO 状态

ENO 说明
1 无错误
0 数学运算结果值超出所选数据类型的有效数值范围。

以 SInt 为例: ABS (-128) 的结果为 +128,超出该数据类型最大值。

最小值和最大值指令

表格 7- 52 MIN 和 MAX 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-202 out:= MIN(

in1:=_variant_in_, in2:=_variant_in_

[,...in32]);

MIN 指令用于比较两个参数 IN1 和 IN2 的值并将最小

(较小)值分配给参数 OUT。

s7一1200功能指令表 基本指令-203 out:= MAX(

in1:=_variant_in_, in2:=_variant_in_

[,...in32]);

MAX 指令用于比较两个参数 IN1 和 IN2 的值并将最大

(较大)值分配给参数 OUT。

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 53 参数的数据类型

参数 数据类型 1 说明
IN1, IN2 [...IN32] SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入(最多 32 个输入)
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 IN1、IN2 和 OUT 参数的数据类型必须相同。

s7一1200功能指令表 基本指令-204 要添加输入,请单击“创建”(Create) 图标,或在其中一个现有 IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 54 ENO 状态

ENO 说明
1 无错误
0 仅适用于 Real 数据类型:

一个或多个输入不是实数 (NaN)。

结果 OUT 为 +/- INF(无穷大)。

Limit 指令

表格 7- 55 LIMIT 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-205 LIMIT(MN:=_variant_in_, IN:=_variant_in_, MX:=_variant_in_, OUT:=_variant_out_); Limit 指令用于测试参数 IN 的值是否在参数 MIN 和 MAX and if not, clamps the value at MIN or MAX. 指定的值范围内

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 56 参数的数据类型

参数 数据类型 1 说明
MN, IN 和 MX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 参数 MN、IN、MX 和 OUT 的数据类型必须相同。

如果参数 IN 的值在指定的范围内,则 IN 的值将存储在参数 OUT 中。 如果参数 IN 的值超出指定的范围,则 OUT 值为参数 MIN 的值(如果 IN 值小于 MIN 值)或参数 MAX 的值(如果 IN 值大于 MAX 值)。

表格 7- 57 ENO 状态

ENO 说明
1 无错误
0 Real: 如果 MIN、IN 和 MAX 的一个或多个值是 NaN(不是数字),则返回 NaN。
0 如果 MIN 大于 MAX,则将值 IN 分配给 OUT。

SCL 示例:

MyVal := LIMIT(MN:=10,IN:=53, MX:=40); //结果: MyVal = 40

MyVal := LIMIT(MN:=10,IN:=37, MX:=40); //结果: MyVal = 37

MyVal := LIMIT(MN:=10,IN:=8, MX:=40); //结果: MyVal = 10

浮点型算术运算指令

使用浮点指令可编写使用 Real 或 LReal 数据类型的数学运算程序:

SQR: 平方 (IN 2 = OUT)

SQRT: 平方根 (√IN = OUT)

LN: 自然对数 (LN(IN) = OUT)

EXP: 自然指数 (e IN =OUT),其中底数 e = 2.71828182845904523536

EXPT: 一般指数 (IN1 IN2 = OUT)

EXPT 参数 IN1 和 OUT 的数据类型始终相同,必须为其选择 Real 或 LReal 类型。 可以从众多数据类型中为指数参数 IN2 选择数据类型。

FRAC: 分数(浮点数 IN 的小数部分 = OUT)

SIN: 正弦 (sin(IN 弧度) = OUT)

ASIN: 反正弦 (arcsine(IN) = OUT 弧度),其中 sin(OUT 弧度) = IN

COS: 余弦 (cos(IN 弧度) = OUT)

ACOS: 反余弦 (arccos(IN) = OUT 弧度),其中 cos(OUT 弧度) = IN

TAN: 正切 (tan(IN 弧度) = OUT)

ATAN: 反正切 (arctan(IN) = OUT 弧度),其中 tan(OUT 弧度) = IN

表格 7- 58 浮点型数学运算指令示例

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-206 out

out

:=

:=

SQR(in);

in * in;

平方: IN 2 = OUT

例如: 如果 IN = 9,则 OUT = 81。

s7一1200功能指令表 基本指令-207 out := in1 ** in2; 普通指数: IN1 IN2 = OUT

例如: 如果 IN1 = 3 且 IN2 = 2,则 OUT = 9。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

2 对于 SCL: 还可以使用基本的 SCL 数学运算符来创建数学表达式。

表格 7- 59 参数的数据类型

参数 数据类型 说明
IN, IN1 Real, LReal, Constant 输入
IN2 SInt, Int, DInt, USInt, UInt,UDInt, Real, LReal, Constant EXPT 指数输入
OUT Real, LReal 输出

表格 7- 60 ENO 状态

ENO 指令 条件 结果 (OUT)
1 全部 无错误 有效结果
0 SQR 结果超出有效 Real/LReal 范围 +INF
IN 为 +/- NaN(不是数字) +NaN
SQRT IN 为负数 -NaN
ENO 指令 条件 结果 (OUT)
IN 为 +/- INF(无穷大)或 +/- NaN +/- INF 或 +/- NaN
LN IN 为 0.0、负数、-INF 或 -NaN -NaN
IN 为 +INF 或 +NaN +INF 或 +NaN
EXP 结果超出有效 Real/LReal 范围 +INF
IN 为 +/- NaN +/- NaN
SIN, COS, TAN IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN
ASIN, ACOS IN 超出 -1.0 到 +1.0 的有效范围 +NaN
IN 为 +/- NaN +/- NaN
ATAN IN 为 +/- NaN +/- NaN
FRAC IN 为 +/- INF 或 +/- NaN +NaN
EXPT IN1 为 +INF 且 IN2 不是 -INF +INF
IN1 为负数或 -INF 如果 IN2 为 Real/LReal, 则为 +NaN,

否则为 -INF

IN1 或 IN2 为 +/- NaN +NaN
IN1 为 0.0 且 IN2 为 Real/LReal(只能为Real/LReal) +NaN

移动

移动和块移动指令

使用移动指令可将数据元素复制到新的存储器地址并从一种数据类型转换为另一种数据类型。 移动过程不会更改源数据。

MOVE 指令用于将单个数据元素从参数 IN 指定的源地址复制到参数 OUT 指定的目标地址。

MOVE_BLK 和 UMOVE_BLK 指令具有附加的 COUNT 参数。 COUNT 指定要复制的数据元素个数。 每个被复制元素的字节数取决于 PLC 变量表中分配给 IN 和 OUT 参数变量名称的数据类型。

表格 7- 61 MOVE、MOVE_BLK 和 UMOVE_BLK 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-208 out1 := in; 将存储在指定地址的数据元素复制到新地址或多个地址。1
s7一1200功能指令表 基本指令-209 MOVE_BLK(

in:=_variant_in, count:=_uint_in,

out=>_variant_out);

将数据元素块复制到新地址的可中断移动。
s7一1200功能指令表 基本指令-210 UMOVE_BLK(

in:=_variant_in, count:=_uint_in,

out=>_variant_out);

将数据元素块复制到新地址的不可中断移动。

1 MOVE 指令: 要在 LAD 或 FBD 中添加其它输出,请单击输出参数旁的“创建”(Create) 图标。 对于 SCL,请使用多个赋值语句。 还可以使用任一循环结构。

表格 7- 62 MOVE 指令的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Char, Array, Struct, DTL, Time 源地址
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Char, Array, Struct, DTL, Time 目标地址

s7一1200功能指令表 基本指令-211 要添加 MOVE 输出,请单击“创建”(Create) 图标,或右键单击现有 OUT 参数之一的输出短线,并选择“插入输出”(Insert output) 命令。

要删除输出,请在其中一个现有 OUT 参数(多于两个原始输出时)的输出短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 63 MOVE_BLK 和 UMOVE_BLK 指令的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal Byte, Word, DWord 源起始地址
COUNT UInt 要复制的数据元素数
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 目标起始地址

说明

数据复制操作规则

要复制 Bool 数据类型,请使用 SET_BF、RESET_BF、R、S 或 输出线圈 (LAD)

(页 180)

要复制单个基本数据类型,请使用 MOVE

要复制基本数据类型数组,请使用 MOVE_BLK 或 UMOVE_BLK

要复制结构,请使用 MOVE

要复制字符串,请使用 S_MOVE (页 266)

要复制字符串中的单个字符,请使用 MOVE

MOVE_BLK 和 UMOVE_BLK 指令不能用于将数组或结构复制到 I、Q 或 M 存储区。

MOVE_BLK 和 UMOVE_BLK 指令在处理中断的方式上有所不同:

在 MOVE_BLK 执行期间排队并处理中断事件。 在中断 OB 子程序中未使用移动目标地址的数据时,或者虽然使用了该数据,但目标数据不必一致时,使用 MOVE_BLK 指令。 如果 MOVE_BLK 操作被中断,则最后移动的一个数据元素在目标地址中是完整并且一致的。 MOVE_BLK 操作会在中断 OB 执行完成后继续执行。

在 UMOVE_BLK 完成执行前排队但不处理中断事件。 如果在执行中断 OB 子程序前移动操作必须完成且目标数据必须一致,则使用 UMOVE_BLK 指令。 更多信息,请参阅 数据一致性 (页 154)部分。

执行 MOVE 指令之后,ENO 始终为真。

表格 7- 64 ENO 状态

ENO 条件 结果
1 无错误 成功复制了全部的 COUNT 个元素。
0 源 (IN) 范围或目标 (OUT) 范围超出可用存储区。 复制适当的元素。 不复制部分元素。

FieldRead 和 FieldWrite 指令

说明

STEP 7 V10.5 不支持数组索引或多维数组形式的变量引用。 FieldRead 和 FieldWrite 指令曾用于为一维数组提供变量数组索引操作。 STEP 7 V11 支持数组索引和多维数组形式的变量。 STEP 7 V11 中包含了 FieldRead 和 FieldWrite,以便向后兼容使用了这两个指令的程序。

表格 7- 65 FieldRead 和 FieldWrite 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-212 value := member[index]; FieldRead 用于从第一个元素由 MEMBER 参数指定的数组中读取索引值为 INDEX 的数组元素。 数组元素的值将传送到 VALUE 参数指定的位置。
s7一1200功能指令表 基本指令-213 member[index] :

= value;

WriteField 用于将 VALUE 参数指定的位置上的值传送给第一个元素由 MEMBER 参数指定的数组。 该值将传送给由 INDEX 参数指定数组索引的数组元素。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 66 参数的数据类型

参数和类型 数据类型 说明
Index 输入 DInt 要读取或写入的数组元素的索引号
Member 1 输入 数组元素类型:

Bool、Byte、Word、DWord、

Char、SInt、Int、Dint、USInt、UInt、UDInt、Real、LReal

在全局数据块或块接口中定义的一维数组的第一个元素的位置。

例如: 如果将数组索引指定为 [-2..4], 则第一个元素的索引为 -2,而不是 0。

值 1 输出 Bool、Byte、Word、DWord、

Char、SInt、Int、Dint、USInt、

UInt、UDInt、Real、LReal

将指定的数组元素复制到的位置

(FieldRead)

被复制到指定的数组元素的值的位置

(FieldWrite)

1 MEMBER 参数和 VALUE 参数指定的数组元素的数据类型必须相同。

如果满足下列条件之一,则使能输出 ENO = 0:

EN 输入的信号状态为“0”

在 MEMBER 参数引用的数组中未定义 INDEX 参数指定的数组元素

处理过程中发生溢出之类的错误

通过数组索引访问数据

要通过变量访问数组中的元素,仅需在程序逻辑中将该变量用作数组索引即可。 例如, 以下程序段中通过 PLC 变量“Index”引用的“Data_block_1”内布尔数组的布尔值来设置输出。

s7一1200功能指令表 基本指令-214

使用变量数组索引的逻辑结构与之前使用 FieldRead 指令的方法相同:

s7一1200功能指令表 基本指令-215

可以使用变量数组索引逻辑替换 FieldWrite 和 FieldRead 指令。

SCL 中没有 FieldRead 或 FieldWrite 指令,但支持通过变量对数组进行间接寻址:

#Tag_1 := "Data_block_1".Bool_Array[#Index];

填充指令

表格 7- 67 FILL_BLK 和 UFILL_BLK 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-216 FILL_BLK(

in:=_variant_in, count:=int,

out=>_variant_out);

可中断填充指令: 使用指定数据元素的副本填充地址范围
s7一1200功能指令表 基本指令-217 UFILL_BLK(

in:=_variant_in, count:=int out

=>_variant_out);

不中断填充指令: 使用指定数据元素的副本填充地址范围

表格 7- 68 参数的数据类型

参数 数据类型 说明
IN SInt, Int, DIntT, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 数据源地址
COUNT USInt, UInt 要复制的数据元素数
OUT SInt, Int, DIntT, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 数据目标地址

说明

数据填充操作规则

要使用 BOOL 数据类型填充,请使用 SET_BF、RESET_BF、R、S 或输出线圈

(LAD)

要使用单个基本数据类型填充,请使用 MOVE

要使用基本数据类型填充数组,请使用 FILL_BLK 或 UFILL_BLK

要填充字符串中的单个字符,请使用 MOVE

FILL_BLK 和 UFILL_BLK 指令不能用于将数组填充到 I、Q 或 M 存储区。

FILL_BLK 和 UFILL_BLK 指令可将源数据元素 IN 复制到通过参数 OUT 指定初始地址的目标中。 复制过程不断重复并填充相邻的一组地址,直到副本数等于 COUNT 参数。

FILL_BLK 和 UFILL_BLK 指令在处理中断的方式上有所不同:

在 FILL_BLK 执行期间排队并处理中断事件。 在中断 OB 子程序中未使用移动目标地址的数据时,或者虽然使用了该数据,但目标数据不必一致时,使用 FILL_BLK 指令。

在 UFILL_BLK 完成执行前排队但不处理中断事件。 如果在执行中断 OB 子程序前移动操作必须完成且目标数据必须一致,则使用 UFILL_BLK 指令。

表格 7- 69 ENO 状态

ENO 条件 结果
1 无错误 IN 元素成功复制到全部的 COUNT 个目标中。
0 目标 (OUT) 范围超出可用存储区 复制适当的元素。 不复制部分元素。

交换指令

表格 7- 70 SWAP 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-218 out := SWAP(in); 用于反转二字节和四字节数据元素的字节顺序。 不改变每个字节中的位顺序。 执行 SWAP 指令之后,ENO 始终为 TRUE。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 71 参数的数据类型

参数 数据类型 说明
IN Word, DWord 有序数据字节 IN
OUT Word, DWord 反转有序数据字节 OUT
示例 1 参数 IN = MB0

(执行前)

参数 OUT = MB4,

(执行后)

地址 MB0 MB1 MB4 MB5
W#16#1234 12 34 34 12
WORD MSB LSB MSB LSB

示例 2 参数 IN = MB0

(执行前)

参数 OUT = MB4,

(执行后)

地址 MB0 MB1 MB2 MB3 MB4 MB5 MB6 MB7
DW#16# 12345678 12 34 56 78 78 56 34 12
DWORD MSB LSB MSB LSB

转换

CONV 指令

表格 7- 72 转换 (CONV) 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-219 out := <data type in>_TO_<data type out>(in); 将数据元素从一种数据类型转换为另一种数据类型。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

2 对于 SCL:通过识别输入参数 (in) 和输出参数 (out) 的数据类型来构造转换指令。例如,DWORD_TO_REAL 将 DWord 值转换为 Real 值。

表格 7- 73 参数的数据类型

参数 数据类型 说明
IN 位串 1,SInt, USInt, Int, UInt, DInt, UDInt, Real, LReal, BCD16, BCD32 输入值
OUT 位串 1,SInt, USInt, Int, UInt, DInt, UDInt, Real, LReal, BCD16, BCE32 转换为新数据类型的输入值

1 该指令不允许您选择位串(Byte、Word、DWord)。 要为指令参数输入数据类型 Byte、Word 或 DWord 的操作数,选择位长度相同的无符号整型。 例如 为 Byte 选择 USInt、为 Word 选择 UInt 或为 DWord 选择

UDInt。

选择(转换源)数据类型之后,(转换目标)下拉列表中将显示可能的转换项列表。 与

BCD16 进行转换仅限于 Int 数据类型。 与 BCD32 进行转换仅限于 DInt 数据类型。

表格 7- 74 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN
0 结果超出 OUT 数据类型的有效范围 OUT 被设置为 IN 的最低有效字节

SCL 的转换指令

SCL 的转换指令

表格 7- 75 从 Bool、Byte、Word 或 DWord 进行转换

数据类型 指令 结果
Bool BOOL_TO_BYTE, BOOL_TO_WORD, BOOL_TO_DWORD, BOOL_TO_INT, BOOL_TO_DINT 值被传送到目标数据类型的最低有效位。
Byte BYTE_TO_BOOL 最低位被传送到目标数据类型。
BYTE_TO_WORD, BYTE_TO_DWORD 值被传送到目标数据类型的低位字节。
BYTE_TO_SINT, BYTE_TO_USINT 值被传送到目标数据类型。
BYTE_TO_INT, BYTE_TO_UINT, BYTE_TO_DINT, BYTE_TO_UDINT 值被传送到目标数据类型的最低有效字节。
Word WORD_TO_BOOL 最低位被传送到目标数据类型。
WORD_TO_BYTE 源值的低位字节被传送到目标数据类型。
WORD _TO_DWORD 值被传送到目标数据类型的低位字节。
WORD _TO_SINT, WORD _TO_USINT 源值的低位字节被传送到目标数据类型。
WORD _TO_INT, WORD _TO_UINT 值被传送到目标数据类型。
WORD _TO_DINT, WORD _TO_UDINT 值被传送到目标数据类型的低位字节。
DWord DWORD_TO_BOOL 最低位被传送到目标数据类型。
DWORD_TO_BYTE, DWORD_TO_WORD, DWORD_TO_SINT, DWORD_TO_USINT, DWORD_TO_INT, DWORD_TO_UINT 源值的低位字节被传送到目标数据类型。
DWORD_TO_DINT, DWORD_TO_UDINT,

DWORD_TO_REAL

值被传送到目标数据类型。

表格 7- 76 从短整型(SInt 或 USInt)进行转换

数据类型 指令 结果
SInt SINT_TO_BOOL 最低位被传送到目标数据类型。
SINT_TO_BYTE 值被传送到目标数据类型
SINT_TO_WORD, SINT_TO_DWORD, SINT_TO_INT, SINT_TO_DINT 值被传送到目标数据类型的低位字节。
数据类型 指令 结果
SINT_TO_USINT, SINT_TO_UINT, SINT_TO_UDINT, SINT_TO_REAL, SINT_TO_LREAL, SINT_TO_CHAR, SINT_TO_STRING 值被转换。
USInt USINT_TO_BOOL 最低位被传送到目标数据类型。
USINT_TO_BYTE 值被传送到目标数据类型
USINT_TO_WORD, USINT_TO_DWORD, USINT_TO_INT, USINT_TO_UINT, USINT_TO_DINT, USINT_TO_UDINT 值被传送到目标数据类型的低位字节。
USINT_TO_SINT, USINT_TO_REAL,

USINT_TO_LREAL, USINT_TO_CHAR, USINT_TO_STRING

值被转换。

表格 7- 77 从整型(Int 或 UInt)进行转换

数据类型 指令 结果
Int INT_TO_BOOL 最低位被传送到目标数据类型。
INT_TO_BYTE, INT_TO_DWORD, INT_TO_SINT, INT_TO_USINT, INT_TO_UINT, INT_TO_UDINT, INT_TO_REAL, INT_TO_LREAL, INT_TO_CHAR, INT_TO_STRING 值被转换。
INT_TO_WORD 值被传送到目标数据类型。
INT_TO_DINT 值被传送到目标数据类型的低位字节。
UInt UINT_TO_BOOL 最低位被传送到目标数据类型。
UINT_TO_BYTE, UINT_TO_SINT, UINT_TO_USINT, UINT_TO_INT, UINT_TO_REAL, UINT_TO_LREAL, UINT_TO_CHAR, UINT_TO_STRING 值被转换。
UINT_TO_WORD, UINT_TO_DATE 值被传送到目标数据类型。
UINT_TO_DWORD, UINT_TO_DINT, UINT_TO_UDINT 值被传送到目标数据类型的低位字节。

表格 7- 78 从双整型(Dint 或 UDInt)进行转换

数据类型 指令 结果
DInt DINT_TO_BOOL 最低位被传送到目标数据类型。
DINT_TO_BYTE, DINT_TO_WORD, DINT_TO_SINT, DINT_TO_USINT, DINT_TO_INT, DINT_TO_UINT, DINT_TO_UDINT, DINT_TO_REAL, DINT_TO_LREAL, DINT_TO_CHAR, DINT_TO_STRING 值被转换。
DINT_TO_DWORD, DINT_TO_TIME 值被传送到目标数据类型。
UDInt UDINT_TO_BOOL 最低位被传送到目标数据类型。
UDINT_TO_BYTE, UDINT_TO_WORD, UDINT_TO_SINT, UDINT_TO_USINT, UDINT_TO_INT, UDINT_TO_UINT, UDINT_TO_DINT, UDINT_TO_REAL, UDINT_TO_LREAL, UDINT_TO_CHAR, UDINT_TO_STRING 值被转换。
UDINT_TO_DWORD, UDINT_TO_TOD 值被传送到目标数据类型。

表格 7- 79 从实数(Real 或 LReal)进行转换

数据类型 指令 结果
Real REAL_TO_DWORD, REAL_TO_LREAL 值被传送到目标数据类型。
REAL_TO_SINT, REAL_TO_USINT, REAL_TO_INT, REAL_TO_UINT, REAL_TO_DINT, REAL_TO_UDINT, REAL_TO_STRING 值被转换。
LReal LREAL_TO_SINT, LREAL_TO_USINT, LREAL_TO_INT, LREAL_TO_UINT, LREAL_TO_DINT, LREAL_TO_UDINT, LREAL_TO_REAL, LREAL_TO_STRING 值被转换。

表格 7- 80 从 Time、DTL、TOD 或 Date 进行转换

数据类型 指令 结果
Time TIME_TO_DINT 值被传送到目标数据类型。
DTL DTL_TO_DATE, DTL_TO_TOD 值被转换。
TOD TOD_TO_UDINT 值被转换。
Date DATE_TO_UINT 值被转换。

表格 7- 81 从 Char 或 String 进行转换

数据类型 指令 结果
Char CHAR_TO_SINT, CHAR_TO_USINT, CHAR_TO_INT, CHAR_TO_UINT, CHAR_TO_DINT, CHAR_TO_UDINT 值被转换。
CHAR_TO_STRING 值被传送到字符串的第一个字符。
String STRING_TO_SINT, STRING_TO_USINT, STRING_TO_INT, STRING_TO_UINT, STRING_TO_DINT, STRING_TO_UDINT, STRING_TO_REAL, STRING_TO_LREAL 值被转换。
STRING_TO_CHAR 字符串的第一个字符被复制到 Char。

取整和截取指令

表格 7- 82 ROUND 和 TRUNC 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-220 out := ROUND (in); 将实数转换为整数。 默认数据类型为 DINT。 当输出为除 DINT 以外的有效数据类型时,必须显式声明;例如,ROUND_REAL 或 ROUND_LREAL。

实数的小数部分舍入为最接近的整数值(IEEE - 舍入为最接近值)。 如果该数值刚好是两个连续整数的一半(例如,10.5), 则将其取整为偶数。 例如:

ROUND (10.5) = 10

ROUND (11.5) = 12

s7一1200功能指令表 基本指令-221 out := TRUNC(in); TRUNC 用于将实数转换为整数。 实数的小数部分被截成零

(IEEE - 取整为零)。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

表格 7- 83 参数的数据类型

参数 数据类型 说明
IN Real, LReal 浮点型输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 取整或截取后的输出

表格 7- 84 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN

上取整和下取整指令

表格 7- 85 CEIL 和 FLOOR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-222 out := CEIL(in); 将实数(Real 或 LReal)转换为大于或等于所选实数的最小整数(IEEE“向正无穷取整”)。
s7一1200功能指令表 基本指令-223 out := FLOOR(in); 将实数(Real 或 LReal)转换为小于或等于所选实数的最大整数(IEEE“向负无穷取整”)。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

表格 7- 86 参数的数据类型

参数 数据类型 说明
IN Real, LReal 浮点型输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 转换后的输出

表格 7- 87 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN

标定和标准化指令

表格 7- 88 SCALE_X 和 NORM_X 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-224 out :=SCALE_X(min:=_in_,

value:=_in_, max:=_in_);

按参数 MIN 和 MAX 所指定的数据类型和值范围对标准化的实参数 VALUE(其中,

0.0 <= VALUE <= 1.0)进行标定:

OUT = VALUE (MAX - MIN) + MIN

s7一1200功能指令表 基本指令-225 out :=NORM_X(min:=_in_,

value:=_in_, max:=_in_);

标准化通过参数 MIN 和 MAX 指定的值范围内的参数 VALUE:

OUT = (VALUE - MIN) / (MAX - MIN), 其中 (0.0 <= OUT <= 1.0)

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 89 参数的数据类型

参数 数据类型 1 说明
MIN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 输入范围的最小值
VALUE SCALE_X: Real, LReal

NORM_X: SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal

要标定或标准化的输入值
MAX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 输入范围的最大值
OUT SCALE_X: SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal

NORM_X: Real, LReal

标定或标准化后的输出值

1 对于 SCALE_X: 参数 MIN、MAX 和 OUT 的数据类型必须相同。对于 NORM_X: 参数 MIN、VALUE 和 MAX 的数据类型必须相同。

说明

SCALE_X 参数 VALUE 应限制为 (0.0 <= VALUE <= 1.0)

如果参数 VALUE 小于 0.0 或大于 1.0:

线性标定运算会生成一些小于 MIN 参数值或大于 MAX 参数值的 OUT 值,作为 OUT

值,这些数值在 OUT 数据类型值范围内。此时,SCALE_X 执行会设置 ENO =

TRUE。

还可能会生成一些不在 OUT 数据类型值范围内的标定数值。 此时,OUT 参数值会被设置为一个中间值,该中间值等于被标定实数在最终转换为 OUT 数据类型之前的最低有效部分。在这种情况下,SCALE_X 执行会设置 ENO = FALSE。

NORM_X 参数 VALUE 应限制为 (MIN <= VALUE <= MAX)

如果参数 VALUE 小于 MIN 或大于 MAX,线性标定运算会生成小于 0.0 或大于 1.0 的标准化 OUT 值。 在这种情况下,NORM_X 执行会设置 ENO = TRUE。

表格 7- 90 ENO 状态

ENO 条件 结果 (OUT)
1 无错误 有效结果
0 结果超出 OUT 数据类型的有效范围 中间结果: 实数在最终转换为 OUT 数据类型前的最低有效部分。
0 参数 MAX <= MIN SCALE_X:用实数 VALUE 的最低有效部分填充

OUT 大小。

NORM_X:扩展 VALUE 数据类型的 VALUE 来填充双字大小。

0 参数 VALUE = +/- INF 或 +/- NaN VALUE 写入 OUT

示例 (LAD): 标准化和标定模拟量输入值

来自电流输入型模拟量信号模块或信号板的模拟量输入的有效值在 0 到 27648 范围内。

假设模拟量输入代表温度,其中模拟量输入值 0 表示 -30.0 摄氏度,27648 表示 70.0 摄氏度。

要将模拟值转换为对应的工程单位,应将输入标准化为 0.0 到 1.0 之间的值,然后再将其

标定为 -30.0 到 70.0 之间的值。 结果值是用模拟量输入(以摄氏度为单位)表示的温度:

s7一1200功能指令表 基本指令-226

请注意,如果模拟量输入来自电压型模拟量信号模块或信号板,则 NORM_X 指令的 MIN

值是 -27648,而不是 0。

示例 (LAD): 标准化和标定模拟量输出值

要在电流输出型模拟量信号模块或信号板中设置的模拟量输出的有效值必须在 0 到

27648 范围内。 假设模拟量输出表示温度设置,其中模拟量输入值 0 表示 -30.0 摄氏

度,27648 表示 70.0 摄氏度。要将存储器中的温度值(范围是 -30.0 到 70.0)转换为 0

到 27648 范围内的模拟量输出值,必须将以工程单位表示的值标准化为 0.0 到 1.0 之间

的值,然后将其标定为 0 到 27648 范围内的模拟量输出值:

s7一1200功能指令表 基本指令-227

请注意,如果模拟量输出应用到电压型模拟量信号模块或信号板,则 SCALE_X 指令的

MIN 值是 -27648,而不是 0。

有关电压和电流形式的 模拟量输出表示法 (页 845)和 模拟量输出表示法 (页 846)的详细信息,请参见技术规范。

程序控制

SCL 程序控制语句概述

结构化控制语言 (SCL, Structured Control Language) 提供三类用于结构化用户程序的程序控制语句:

选择语句: 选择语句可将程序执行转移到备选语句序列。

循环: 可以使用迭代语句控制循环执行。 迭代语句指定应根据某些条件重复执行的程序部分。

程序跳转: 程序跳转是指立刻跳转到特定的跳转目标,因而跳转到同一块内的其它语句。

这些程序控制语句都使用 PASCAL 编程语言的语法。

表格 7- 91 SCL 程序控制语句类型

程序控制语句 说明
选择 IF-THEN 语句

(页 230)

用将程序执行转移到两个备选分支之一(取决于条件为 TRUE

还是 FALSE)

CASE 语句 (页 231) 用于选择执行 n 个备选分支之一(取决于变量值)
循环 FOR 语句 (页 232) 只要控制变量在指定值范围内,就重复执行某一语句序列
WHILE-DO 语句

(页 233)

只要仍满足执行条件,就重复执行某一语句序列
REPEAT-UNTIL 语句

(页 234)

重复执行某一语句序列,直到满足终止条件为止
程序跳转 CONTINUE 语句

(页 235)

停止执行当前循环迭代
EXIT 语句 (页 236) 无论是否满足终止条件,都会随时退出循环
GOTO 语句 (页 236) 使程序立即跳转到指定标签
IF-THEN 语句

(页 230)

使程序立刻退出正在执行的块,返回到调用块

参见

RETURN 语句 (页 237)

IF-THEN 语句

IF-THEN 语句是条件语句,可控制程序流,根据逻辑表达式的 Bool 值的结果决定是否执行一组语句。 您还可以使用括号嵌套或结构化多条 IF-THEN 语句的执行。

表格 7- 92 IF-THEN 语句的元素

SCL 说明
IF "condition" THEN statement_A; statement_B; statement_C;

;

如果“condition”为 TRUE 或 1,则执行后面的语句,直到遇到

END_IF 语句为止。

如果“condition”为 FALSE 或 0,则跳转到 END_IF 语句(除非程序包含可选的 ELSIF 或 ELSE 语句)。

[ELSIF "condition-n" THEN statement_N;

;]

可选的 ELSEIF1 语句提供其它要评估的条件。 例如: 如果 IF-

THEN 语句中的“condition”为 FALSE,则程序将评估“condition-

n”。 如果“condition-n”为 TRUE,则执行“statement_N”。

[ELSE

statement_X;

;]

可选的 ELSE 语句提供 IF-THEN 语句的“condition”为 FALSE 时将要执行的语句。
END_IF; END_IF 语句用于终止 IF-THEN 指令。

1 可以在一条 IF-THEN 语句中包含多条 ELSIF 语句。

表格 7- 93 IF-THEN 语句的变量

变量 说明
“condition” 必需。 逻辑表达式为 TRUE (1) 或 FALSE (0)。
“statement_A” 可选。 “condition”为 TRUE 时要执行的一条或多条语句。
“condition-n” 可选。 可选 ELSIF 语句要评估的逻辑表达式。
“statement_N” 可选。 ELSIF 语句的“condition-n”为 TRUE 时要执行的一条或多条语句。
“statement_X” 可选。 IF-THEN 语句的“condition”为 FALSE 时要执行的一条或多条语句。

IF 语句按照下列规则执行:

执行第一个逻辑表达式为 TRUE 的语句序列。 不执行其余语句序列。

如果无布尔型表达式为 TRUE,则执行 ELSE 引入的语句序列(或者,如果 ELSE 分支不存在,则不执行语句序列)。

不限制 ELSIF 语句的数量。

说明

与 IF 语句相比,使用一个或多个 ELSIF 分支存在一定的优势,就是不用再评估有效表达式后面的逻辑表达式。 从而,可缩短程序的运行时间。

CASE 语句

表格 7- 94 CASE 语句的元素

SCL 说明
CASE "Test_Value" OF

"ValueList": Statement[; Statement, ...] "ValueList": Statement[; Statement, ...]

[ELSE

Else-statement[; Else-statement, ...]] END_CASE;

CASE 语句根据表达式的值来选择执行多组语句中的一组。

表格 7- 95 参数

参数 说明
“Test_Value” 必需。 任何 Int 数据类型的数字表达式
“ValueList” 必需。 单个值、或逗号分隔的值或值范围的列表。 (使用两个句点定义值范围: 2..8)下例说明了不同变型的值列表:

1: Statement_A;

2, 4: Statement _B;

3, 5..7,9: Statement _C;

Statement 必需。 “Test_Value”与值列表中任何一个值匹配时执行的一条或多条语句
Else-statement 可选。 与“ValueList”中的任何一个值都不匹配时执行的一条或多条语句

CASE 语句按照下列规则执行:

选择表达式必须返回一个 Int 类型的值。

处理 CASE 语句时,程序会检查选择表达式的值是否包含在指定的值列表中。 如果找到匹配项,则执行分配给该列表的语句成分。

如果未找到匹配项,则执行 ELSE 后面的程序段,如果不存在 ELSE 分支,则不执行任何语句。

CASE 语句可以嵌套使用。 每个嵌套的 CASE 语句必须具有相关联的 END_CASE 语句。

CASE var1 OF

1 : var2 := "A";

2 : var2 := "B";

ELSE

CASE var3 OF

65..90: var2 := "UpperCase"; 97..122: var2 := "LowerCase";

ELSE

var2:= "SpecialCharacter";

END_CASE; END_CASE;

FOR 语句

表格 7- 96 FOR 语句的元素

SCL 说明
FOR "control_variable" := "begin" TO "end" [BY "increment"] DO

statement;

; END_FOR;

FOR 语句用于在控制变量处于指定的值范围内时重复执行某一语句序列。 使用 FOR 定义循环时需要指定初始值和最终值。 这

两个值的数据类型必须与控制变量的相同。

表格 7- 97 参数

参数 说明
“control_variable” 必需。 整型(Int 或 DInt),用作循环计数器
“begin” 必需。 指定控制变量初始值的简单表达式
参数 说明
“end” 必需。 确定控制变量最终值的简单表达式
“increment” 可选。 每次循环后“control variable”的变化量。 “increment”与“control variable”

具有相同的数据类型。 如果未指定“increment”的值,则每次循环之后,运行变量的值加 1。不能在执行 FOR 语句期间更改“increment”。

FOR 语句的执行方式如下:

循环开始时,控制变量设置为初始值(初始分配),每次重复进行循环时,控制变量会增加指定增量(正增量)或减少指定增量(负增量),直至达到最终值。

每次执行完循环之后,会检查该条件(达到最终值)以确定是否满足该条件。 如果满足条件,则执行语句序列,否则将跳过该循环及其语句序列。

定义 FOR 语句的规则:

控制变量的数据类型只能是 Int 或 DInt。

可以省略语句 BY [increment]。 如果未指定增量,则自动默认为 +1。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句将执行紧随 END_FOR 语句之后的语句。

使用 CONTINUE 语句 (页 235) 可跳过某个 FOR 循环的后续语句,并继续执行循环,同时检查是否满足终止条件。

WHILE-DO 语句

表格 7- 98 WHILE 语句

SCL 说明
WHILE "condition" DO Statement; Statement;

...;

END_WHILE;

WHILE 语句执行一系列语句,直到给定条件为 TRUE。

可以嵌套使用 WHILE 循环。 END_WHILE 语句与最后执行的 WHILE 指令配对。

表格 7- 99 参数

参数 说明
“condition” 必需。 值为 TRUE 或 FALSE 的逻辑表达式。 (“null”条件被视为 FALSE。)
Statement 可选。 在条件值为 TRUE 之前执行的一条或多条语句。

说明

WHILE 语句先评估“condition”的状态,然后执行语句。 要执行语句一次或多次而不考虑

“condition”的状态,请使用 REPEAT 语句。

WHILE 语句按照下列规则执行:

每次循环执行循环体之前,评估执行条件。

只要执行条件的值为 TRUE,就重复执行 DO 后面的循环体。

一旦值变为 FALSE,则立即跳过循环,去执行循环后面的语句。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句执行紧跟 END_WHILE 语句的语句

使用 CONTINUE 语句可跳过 WHILE 循环后面的语句,并在检查是否满足终止条件后决定是否继续执行循环。

REPEAT-UNTIL 语句

表格 7- 100 REPEAT 指令

SCL 说明
REPEAT

Statement;

;

UNTIL “condition” END_REPEAT;

REPEAT 语句执行一组语句,直到给定条件为 TRUE。

可以嵌套使用 REPEAT 循环。 END_REPEAT 语句始终与最后执行的

Repeat 指令配对。

表格 7- 101 参数

参数 说明
Statement 可选。 在条件值为 TRUE 之前执行的一条或多条语句。
“condition” 必需。 一个或多个用以下两种方式表达的表达式: 值为 TRUE 或 FALSE 的数字表达式或字符串表达式。 “null”条件被视为 FALSE。

说明

在循环的首次迭代过程中,REPEAT 语句在执行相关语句(即使“condition”为 FALSE) 后评估“condition”的状态。 要在执行这些语句前查看“condition”的状态,请使用 WHILE 语句。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句执行紧跟 END_REPEAT 语句的语句

使用 CONTINUE 语句 (页 235) 可跳过某个 REPEAT 循环的后续语句,并继续执行循环,同时检查是否满足终止条件。

CONTINUE 语句

表格 7- 102 CONTINUE 语句

SCL 说明
CONTINUE

Statement;

;

CONTINUE 语句跳过程序循环(FOR、WHILE、REPEAT)后面的语句,并在检查是否满足终止条件后决定是否继续执行循环。 如果不满足,则继续执

行循环。

CONTINUE 语句按照下列规则执行:

该语句立即终止循环体的执行。

根据是否满足重复执行循环的条件,决定是再次执行循环体还是退出迭代语句而去执行紧随其后的语句。

在 FOR 语句中,在执行 CONTINUE 语句后控制变量立即增加指定的增量。

只能在循环中使用 CONTINUE 语句。 在嵌套循环中,CONTINUE 总是立即指向包含它的循环。 CONTINUE 通常与 IF 语句一起使用。

如果要退出循环而不考虑终止测试情况,请使用 EXIT 语句。

下例说明了使用 CONTINUE 语句来避免计算值的百分数时发生被 0 除的错误:

FOR x = 0 TO 10 DO

IF value[i] = 0 THEN CONTINUE; END_IF;

p := part / value[i] * 100; s := INT_TO_STRING(p);

percent=CONCAT(IN1:=s, IN2:="%"); END_FOR;

EXIT 语句

表格 7- 103 EXIT 指令

SCL 说明
EXIT; EXIT 语句用于随时退出循环(FOR、WHILE 或 REPEAT),而不考虑是否满足终止条件。

EXIT 语句按照下列规则执行:

该语句会立即退出该退出语句所处的重复语句。

继续执行该循环后面(例如 END_FOR 之后)的程序。

在循环中使用 EXIT 语句。 在嵌套循环中,EXIT 语句将处理权返回到下一更高嵌套级。

FOR i = 0 TO 10 DO

CASE 值[i, 0] OF

1..10: 值 [i, 1]:="A";

11..40: 值 [i, 1]:="B";

41..100: 值 [i, 1]:="C"; ELSE

EXIT;

END_CASE;

END_FOR;

GOTO 语句

表格 7- 104 GOTO 语句

SCL 说明
GOTO JumpLabel; Statement;

... ;

JumpLabel: Statement;

GOTO 语句通过跳转到同一块中的某个标签来跳过语句。

跳转标签(“JumpLabel”)和 GOTO 语句必须在同一个块中。 跳转标签的名称只能在块中分配一次。 每个跳转标签都可以是多条 GOTO 语句

的跳转目标。

不能跳转到循环部分(FOR、WHILE 或 REPEAT)。 可以在循环中进行跳转。

在以下示例中: 根据操作数“Tag_value”的值在对应跳转标签定义的位置继续执行程序。如果“Tag_value”等于 2,则会在跳转标签“MyLabel2”位置继续执行,并会跳过

“MyLabel1”。

CASE "Tag_value" OF

: GOTO MyLabel1;

: GOTO MyLabel2; ELSE GOTO MyLabel3; END_CASE;

MyLabel1: "Tag_1" := 1; MyLabel2: "Tag_2" := 1; MyLabel3: "Tag_4" := 1;

RETURN 语句

表格 7- 105 RETURN 指令

SCL 说明
RETURN; Return 指令用于无条件退出正在执行的代码块。 程序执行返回到调用块或操作系统

(退出 OB 时)。

RETURN 指令示例:

IF "Error" <> 0 THEN RETURN;

END_IF;

说明

执行最后一条指令后,代码块自动返回到调用块。 不要在代码块末尾插入 RETURN 指令。

跳转和标签指令

表格 7- 106 JMP、JMPN 和 LABEL 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-228 s7一1200功能指令表 基本指令-229 请参见 GOTO (页 236)

语句。

如果有能流通过 JMP 线圈 (LAD),或者 JMP

功能框的输入为真 (FBD),则程序将从指定标签后的第一条指令继续执行。

s7一1200功能指令表 基本指令-230 s7一1200功能指令表 基本指令-231 如果没有能流通过 JMPN 线圈 (LAD),或者

JMPN 功能框的输入为假 (FBD),则程序将从指定标签后的第一条指令继续执行。

s7一1200功能指令表 基本指令-232 s7一1200功能指令表 基本指令-233 JMP 或 JMPN 跳转指令的目标标签。

1 通过在 LABEL 指令中直接键入来创建标签名称。 可以使用参数助手图标来选择 JMP 和 JMPN 标签名称字段可用的标签名称。 也可在 JMP 或 JMPN 指令中直接键入标签名称。

表格 7- 107 参数的数据类型

参数 数据类型 说明
Label_name 标签标识符 跳转指令以及相应跳转目标程序标签的标识符

各标签在代码块内必须唯一。

可以在代码块中进行跳转,但不能从一个代码块跳转到另一个代码块。

可以向前或向后跳转。

可以在同一代码块中从多个位置跳转到同一标签。

JMP_LIST 指令

表格 7- 108 JMP_LIST 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-234 CASE k OF

0: GOTO dest0;

1: GOTO dest1;

2: GOTO dest2; [n: GOTO destn;]

END_CASE;

JMP_LIST 指令用作程序跳转分配器,控制程序段的执行。 根据 K 输入的值跳转到相应的程序标签。 程序从目标跳转标签后面的程序指令继续执行。 如果 K 输入的值超过(标签数 - 1),则不进行跳转,继续处理下一程序段。

表格 7- 109 参数的数据类型

参数 数据类型 说明
K UInt 跳转分配器控制值
DEST0, DEST1, .., DESTn. 程序标签 与特定 K 参数值对应的跳转目标标签:

如果 K 的值等于 0,则跳转到分配给 DEST0 输出的程序标签。如果 K 的值等于 1,则跳转到分配给 DEST1 输出的程序标签, 以此类推。 如果 K 输入的值超过(标签数 - 1),则不进行跳

转,继续处理下一程序段。

对于 LAD 和 FBD: 在程序中第一次放置 JMP_LIST 功能框,该功能框有两个跳转标签输出。 可以添加或删除跳转目标。

s7一1200功能指令表 基本指令-235 单击功能框内的创建图标(位于最后一个 DEST 参数的左侧)可添加新的跳转标签输出。

s7一1200功能指令表 基本指令-236 右键单击输出短线,并选择“插入输出”(Insert ouput) 命令。

右键单击输出短线,并选择“删除”(Delete) 命令。

SWITCH 指令

表格 7- 110 SWITCH 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-237 不提供 SWITCH 指令用作程序跳转分配器,控制程序段的执行。 根据 K 输入的值与分配给指定比较输入的值的比较结果,跳转到与第一个为“真”的比较测试相对应的程序标

签。 如果比较结果都不为 TRUE,则跳转到分配给 ELSE

的标签。 程序从目标跳转标签后面的程序指令继续执行。

1 对于 LAD 和 FBD: 在功能框名称下方单击,并从下拉菜单中选择数据类型。

2 对于 SCL: 使用 IF-THEN 语句进行比较。

表格 7- 111 参数的数据类型

参数 数据类型 1 说明
K SInt、Int、DInt、USInt、UInt、

UDInt、Real、LReal、Byte、

Word、DWord、Time、TOD、Date

常用比较值输入
==, <>, <, <=, >.

>=

SInt、Int、DInt、USInt、UInt、

UDInt、Real、LReal、Byte、

Word、DWord、Time、TOD、Date

分隔比较值输入,获得特定比较类型
DEST0、DEST1,...,

DESTn。 ELSE

程序标签 与特定比较对应的跳转目标标签:

首先处理 K 输入下面的第一个比较输入,如果 K 值与该输入的比较结果为“真”,则跳转到分配给

DEST0 的标签。 下一比较测试使用接下来的下一个

输入,如果比较结果“真”,则跳转到分配给 DEST1

的标签。依次对其它比较进行类似的处理,如果比
较结果都不为“真”,则跳转到分配给 ELSE 输出的标
签。

1 K 输入和比较输入 (==, <>, <, <=, >, >=) 的数据类型必须相同。

添加输入、删除输入和指定比较类型

在程序中第一次放置 LAD 或 FBD SWITCH 功能框时,该功能框有两个比较输入。 可以分配比较类型以及添加输入/跳转目标,如下所示。

s7一1200功能指令表 基本指令-238 单击功能框内的比较运算符,并从下拉列表中选择新运算符。

s7一1200功能指令表 基本指令-239 单击功能框中的创建图标(位于最后一个 DEST 参数的左侧)可添加新的比较目标参数。

s7一1200功能指令表 基本指令-240 右键单击输入短线,并选择“插入输入”(Insert input) 命令。

右键单击输入短线并选择“删除”(Delete) 命令。

表格 7- 112 SWITCH 功能框数据类型和允许的比较运算

数据类型 比较 运算符语法
Byte、Word、DWord 等于 ==
不等于 <>
SInt、Int、DInt、USInt、

UInt、UDInt、Real、

LReal、Time、TOD、Date

等于 ==
不等于 <>
大于或等于 >=
小于或等于 <=
大于 >
小于 <

SWITCH 功能框放置规则

比较输入前可以不连接 LAD/FBD 指令。

由于没有 ENO 输出,因此,在一个程序段中只允许使用一条 SWITCH 指令,并且

SWITCH 指令必须是程序段中的最后一个运算。

RET 执行控制指令

可选的 RET 指令用于终止当前块的执行。 当且仅当有能流通过 RET 线圈 (LAD),或者当 RET 功能框的输入为真 (FBD) 时,则当前块的程序执行将在该点终止,并且不执行

RET 指令以后的指令。 如果当前块为 OB,则参数“Return_Value”将被忽略。 如果当前块为 FC 或 FB,则将参数“Return_Value”的值作为被调用功能框的 ENO 值传回到调用例程。

不要求用户将 RET 指令用作块中的最后一个指令;该操作是自动完成的。 一个块中可以有多个 RET 指令。

有关 SCL,请参见 RETURN (页 237) 语句。

表格 7- 113 Return_Value (RET) 执行控制指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-241 s7一1200功能指令表 基本指令-242 RETURN; 终止当前块的执行

表格 7- 114 参数的数据类型

参数 数据类型 说明
Return_Value Bool RET 指令的“Return_value”参数被分配给调用块中块调用功能框的 ENO

输出。

以下是在 FC 代码块中使用 RET 指令的示例步骤:

创建新项目并添加 FC:

编辑该 FC:

从指令树添加指令。

添加一个 RET 指令,包括参数“Return_Value”的以下值之一:

TRUE、FALSE,或用于指定所需返回值的存储位置。

添加更多的指令。

从 MAIN [OB1] 调用 FC。

MAIN 代码块中 FC 功能框的 EN 输入必须为真,才能开始执行 FC。

执行了有能流通过 RET 指令的 FC 后,该 FC 的 RET 指令所指定的值将出现在 MAIN 代码块中 FC 功能框的 ENO 输出上。

重新触发扫描循环看门狗指令

表格 7- 115 RE_TRIGR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-243 RE_TRIGR(); RE_TRIGR(重新触发扫描时间监视狗)用于延长扫描循环监视狗定时器生成错误前允许的最大时间。

RE_TRIGR 指令用于在单个扫描循环期间重新启动扫描循环监视定时器。 结果是从最后一次执行 RE_TRIGR 功能开始,使允许的最大扫描周期延长一个最大循环时间段。

说明

对于 S7-1200 CPU 固件版本 2.2 之前的版本,RE_TRIGR 限制为从程序循环 OB 执行, 并可能用于无限期地延长 PLC 扫描时间。 如果从启动 OB、中断 OB 或错误 OB 执行RE_TRIGR,则不会复位监视狗定时器且 ENO = FALSE。

对于固件版本 2.2 及以上版本,可从任何 OB(包括启动、中断和错误 OB)执行

RE_TRIGR。 但是,PLC 扫描时间最长只能延长到已组态最大循环时间的 10 倍。

设置 PLC 最大循环时间

可以在设备配置的“循环时间”(Cycle time) 下组态最大扫描循环时间值。

表格 7- 116 循环时间值

循环时间监视 最小值 最大值 默认值
最大循环时间 1 ms 6000 ms 150 ms

监视狗超时

如果最大扫描循环定时器在扫描循环完成前达到预置时间,则会生成错误。 如果用户程序中包含错误处理代码块 OB 80,则 CPU 将执行 OB 80,用户可以在其中添加程序逻辑以创建具体响应。 如果不包含 OB 80,则忽略第一个超时条件并且 CPU 切换到 STOP。

如果在同一程序扫描中第二次发生最大扫描时间超时(2 倍的最大循环时间值),则触发错误使 CPU 切换到 STOP 模式。

在 STOP 模式下,用户程序停止执行,而 CPU 系统通信和系统诊断仍继续执行。

停止扫描循环指令

表格 7- 117 STP 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-244 STP(); STP(停止扫描循环)将 CPU 置于 STOP 模式。 CPU 处于

STOP 模式时,将停止程序执行并停止过程映像的物理更新。

有关详细信息,请参见: 组态从 RUN 切换到 STOP 时的输出 (页 88)。

如果 EN = TRUE,CPU 将进入 STOP 模式,程序执行停止,并且 ENO 状态无意义。否则,EN = ENO = 0。

获取错误指令

获取错误指令提供有关程序块执行错误的信息。 如果在代码块中添加了 GetError 或

GetErrorID 指令,则可在程序块中处理程序错误。

GetError

表格 7- 118 GetError 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-245 GET_ERROR(_o

ut_);

指示发生本地程序块执行错误,并用详细错误信息填充预定义的错误数据结构。

表格 7- 119 参数的数据类型

参数 数据类型 说明
ERROR ErrorStruct 错误数据结构: 可以重命名该结构,但不能重命名结构中的成员。

表格 7- 120 ErrorStruct 数据结构的元素

结构组件 数据类型 说明
ERROR_ID Word 错误 ID
FLAGS Byte 显示块调用期间是否出错。

16#01: 块调用期间出错。

16#00: 块调用期间未出错。

REACTION Byte 默认响应:

0: 忽略(写入错误),

1: 以替代值“0”继续(读取错误),

2: 跳转指令(系统错误)

CODE_ADDRESS CREF 有关块地址和类型的信息
BLOCK_TYPE Byte 出错块的类型:

1: OB

2: FC

3: FB

CB_NUMBER UInt 代码块的编号
OFFSET UDInt 对内部存储器的引用
MODE Byte 访问模式:

根据具体的访问类型,可输出以下信息:

模式 (A) (B) (C) (D) (E)
结构

组件

数据类型 说明
0
1 偏移
2 区域
3 位置 范围 编号
4 区域 偏移
5 区域 DB 编号 偏移
6 伙伴编号 /访问 区域 DB 编号 偏移
7 伙伴编号 /访问 插槽号/范围 区域 DB 编号 偏移
OPERAND

_NUMBER

UInt 机器命令的操作数
POINTER

_NUMBER_ LOCATION

UInt (A) 内部指针
SLOT_NUM

BER_SCOPE

UInt (B) 内部存

储器中的存储区

DATA_A

DDRESS

NREF 有关操作数

地址的信息

AREA Byte (C) 存储区:

L: 16#40 –

4E、86、87、

8E、8F、

C0 – CE

I:16#81

Q: 16#82

M: 16#83

DB: 16#84、

85、8A、8B

DB_NUMBER UInt (D) 数据块编号
OFFSET UDInt (E) 操作数的

相对地址

GetErrorID

表格 7- 121 GetErrorID 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-246 GET_ERR_ID()

;

指示发生程序块

执行错误,并报告错误的 ID(标识符代码)。

表格 7- 122 参数的数据类型

参数 数据类型 说明
ID Word ErrorStruct ERROR_ID 成员的错误标识符值

表格 7- 123 Error_ID 值

ERROR_ID 十 六进制值 ERROR_ID 十

进制值

程序块执行错误
0 0 无错误
2503 9475 未初始化指针错误
2522 9506 操作数超出范围读取错误
2523 9507 操作数超出范围写入错误
2524 9508 无效区域读取错误
2525 9509 无效区域写入错误
2528 9512 数据分配读取错误(位赋值不正确)
2529 9513 数据分配写入错误(位赋值不正确)
2530 9520 DB 受到写保护
253A 9530 全局 DB 不存在
253C 9532 版本错误或 FC 不存在
253D 9533 指令不存在
253E 9534 版本错误或 FB 不存在
253F 9535 指令不存在
2575 9589 程序嵌套深度错误
2576 9590 局部数据分配错误
2942 10562 物理输入点不存在
2943 10563 物理输出点不存在

操作

默认情况下,CPU 通过将错误记录到诊断缓冲区来响应

块执行错误。 但是,如果在代码块中放置一个或多个

GetError 或 GetErrorID 指令,即将该块设置为在块

内处理错误。 在这种情况下,CPU 不在诊断缓冲区

中记录错误。 而是在 GetError 或 GetErrorID 指令的

输出中报告错误信息。 可以使用 GetError 指令读取

详细错误信息,或使用 GetErrorID 指令只读取错误标识符。

因为后续错误往往只是第一个错误的结果,

所以第一个错误通常最重要。

在块内第一次执行 GetError 或 GetErrorID 指令将返回

块执行期间检测到的第一个错误。在块启动到执行 GetError

或 GetErrorID 期间随时都可能发生该错误。 随后执行

GetError 或 GetErrorID 将返回上次执行 GetError 或

GetErrorID 以来发生的第一个错误。 不保存错误历史,

执行任一指令都将使 PLC 系统重新捕捉下一个错误。

可以在数据块编辑器和块接口编辑器中添加 GetError

指令所使用的 ErrorStruct 数据类型,

从而程序逻辑可以访问这些值。

从数据类型下拉列表中选择 ErrorStruct 以添加该结构。

您可以使用唯一的名称创建多个 ErrorStruct 元素。

不能重命名 ErrorStruct 的成 员。

ENO 指示的错误条件

如果 EN = TRUE 且 GetError 或 GetErrorID 执行,则:

ENO = TRUE 表示发生代码块执行错误并提供错误数据

ENO = FALSE 表示未发生代码块执行错误

可以将错误响应程序逻辑连接到在发生错误后激活的 ENO。

如果存在错误,该输出参数会将错误数据存储

在程序能够访问这些数据的位置。

GetError 和 GetErrorID 可用来将错误信息从当前执行块

(被调用块)发送到调用块。 将该指令放置在被调用块程序

的最后一个程序段中可以报告被调用块的最终执行状态。

字逻辑指令

AND、OR 和 XOR 指令

表格 7- 124 AND、OR 和 XOR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-247 out := in1 AND in2; AND: 逻辑 AND
out := in1 OR in2; OR: 逻辑 OR
out := in1 XOR in2; XOR: 逻辑异或

1 对于 LAD 和 FBD: 单击“???”

并从下拉菜单中选择数据类型。

s7一1200功能指令表 基本指令-248 要添加输入,请单击“创建”(Create) 图标,

或在其中一个现有 IN 参数的输入短线处单击右键,

并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数

(多于两个原始输入时)的输入短线处单击右键,

并选择“删除”(Delete) 命令。

表格 7- 125 参数的数据类型

参数 数据类型 说明
IN1, IN2 Byte, Word, DWord 逻辑输入
OUT Byte, Word, DWord 逻辑输出

1 所选数据类型将 IN1、IN2 和 OUT 设置为相同的数据类型。

IN1 和 IN2 的相应位值相互组合,在参数 OUT 中生成

二进制逻辑结果。 执行这些指令之后,ENO 总是为 TRUE。

取反指令

表格 7- 126 INV 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-249 不提供 计算参数 IN 的二进制反码。 通过对参数 IN 各位的值取反来计算反码(将每个 0 变为 1,每个 1 变为 0)。 执行该指令后,

ENO 总是为 TRUE。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 127 参数的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Byte, Word, DWord 要取反的数据元素
OUT SInt, Int, DInt, USInt, UInt, UDInt, Byte, Word, DWord 取反后的输出

编码和解码指令

表格 7- 128 ENCO 和 DECO 指令

LAD

/FBD

SCL 说明
s7一1200功能指令表 基本指令-250 out := ENCO

(_in_);

将位序列编码成二进制数

ENCO 指令将参数 IN 转换为与参数 IN 的最低有效设置位的位位置对应的二进制数,并将结果返回给参数

OUT。 如果参数 IN 为 0000 0001 或 0000 0000,则将

值 0 返回给参数 OUT。 如果参数 IN 的值为 0000 0000,则 ENO 设置为 FALSE。

s7一1200功能指令表 基本指令-251 out := DECO

(_in_);

将二进制数解码成位序列

DECO 指令通过将参数 OUT 中的相应位位置设置为 1

(其它所有位设置为 0)解码参数 IN 中的二进制数。 执行 DECO 指令之后,ENO 始终为 TRUE。

注: DECO 指令的默认数据类型为 DWORD。 在 SCL 中,将指令名称更改为 DECO_BYTE 或 DECO_WORD 可解码字节或字值,并分配到字节或字变量或地址。

1 对于 LAD 和 FBD: 单击“???”并从下

拉菜单中选择数据类型。

表格 7- 129 参数的数据类型

参数 数据类型 说明
IN ENCO: Byte, Word, DWord DECO: UInt ENCO: 要编码的位序列

DECO: 要解码的值

OUT ENCO: Int

DECO: Byte, Word, DWord

ENCO: 编码后的值

DECO: 解码后的位序列

表格 7- 130 ENCO 的 OUT 参数

ENO 条件 结果 (OUT)
1 无错误 有效位号
0 IN 为零 OUT 设置为零

DECO 参数 OUT 的数据类型选项

(Byte、Word 或 DWord)限制参数 IN 的可用范围。

如果参数 IN 的值超出可用范围,将执行求模运算,

如下所示提取最低有效位。

DECO 参数 IN 的范围:

3 位(值 0-7)IN 用于设置 Byte OUT 中 1 的位位置

4 位(值 0-15)IN 用于设置 Word OUT 中 1 的位位置

5 位(值 0-31)IN 用于设置 DWord OUT 中 1 的位位置

表格 7- 131 示例

DECO IN 值 DECO OUT 值(解码单个位位置)
Byte OUT

8 位

最小 IN 0 00000001
最大 IN 7 10000000
Word OUT

16 位

最小 IN 0 0000000000000001
最大 IN 15 1000000000000000
DWord OUT

32 位

最小 IN 0 000000000000

0000000000000

0000001

最大 IN 31 10000000000000

000000000000000000

选择、多路复用和多路分用指令

表格 7- 132 SEL(选择)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-252 out := SEL(

g:=_bool_in,

in0:-_variant_in, in1:=_variant_in);

SEL 根据参数 G 的值将两个输入值之一分配给参数 OUT。

1 对于 LAD 和 FBD: 单击“???”

并从下拉菜单中选择数据类型。

表格 7- 133 SEL 指令的数据类型

参数 数据类型 1 说明
G Bool 0 选择 IN0

1 选择 IN1

IN0, IN1 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出

1 输入变量和输出变量必须为相同的数据类型。

条件代码: 执行 SEL 指令之后,ENO 始终为 TRUE。

表格 7- 134 MUX(多路复用)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-253 out := MUX(

k:=_unit_in, in1:=variant_in, in2:=variant_in,

[...in32:=variant_in,

]

inelse:=variant_in);

MUX 根据参数 K 的值将多个输入值之一复制到参数 OUT。如果参数 K 的值大于 (INn - 1),则会将参数 ELSE 的值复制到参数 OUT。

1 对于 LAD 和 FBD: 单击“???”

并从下拉菜单中选择数据类型。

s7一1200功能指令表 基本指令-254 要添加输入,请单击“创建”(Create) 图标,

或在其中一个现有 IN 参数的输入短线处单击右键,

并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数

(多于两个原始输入时)的输入短线处单击右键,

并选择“删除”(Delete) 命令。

表格 7- 135 MUX 指令的数据类型

参数 数据类型 说明
K UInt 0 选择 IN1

1 选择 IN2

n 选择 INn

IN0, IN1, ..

INn

SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
ELSE SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入替换值(可选)
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出

1 输入变量和输出变量必须为相同的数据类型。

表格 7- 136 DEMUX(多路分用)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-255 DEMUX(

k:=_unit_in, in:=variant_in, out1:=variant_in, out2:=variant_in,

[...out32:=variant_in

,]

outelse:=variant_in)

;

DEMUX 将分配给参数 IN 的位置值复制到多个输出之一。参数 K 的值选择将哪一输出作为 IN 值的目标。 如果 K 的值大于数值 (OUTn - 1),则会将 IN 值复制到分配给 ELSE 参

数的位置。

1 对于 LAD 和 FBD: 单击“???”

并从下拉菜单中选择数据类型。

要添加输出,请单击创建图标,或在其中一个现有

OUT 参数的输出短线处单击右键,并选择“插入输出”

(Insert output) 命令。 要删除输出,请在其中一个现有

OUT 参数(多于两个原始输出时)的输出短线处单击右键

,并选择“删除”(Delete) 命令。

s7一1200功能指令表 基本指令-256 要添加输出,请单击“创建”(Create) 图标,

或在其中一个现有 OUT 参数的输出短线处单击右键,

并选择“插入输出”(Insert output) 命令。

要删除输出,请在其中一个现有 OUT 参数

(多于两个原始输出时)的输出短线处单击右键,

并选择“删除”(Delete) 命令。

表格 7- 137 DEMUX 指令的数据类型

参数 数据类型 1 说明
K UInt 选择器的值:

0 选择 OUT1

1 选择 OUT2

n 选择 OUTn

IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
OUT0,

OUT1, .. OUTn

SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出
ELSE SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char K 大于 (OUTn - 1) 时的替换输出

1 输入变量和输出变量必须为相同的数据类型。

表格 7- 138 MUX 和 DEMUX 指令的 ENO 状态

ENO 条件 结果 (OUT)
1 无错误 MUX:将选择的 IN 值复制到 OUT DEMUX:将 IN 值复制到选择的 OUT
0 MUX:K 大于输入数 -1 不提供 ELSE: OUT 不变,

提供 ELSE,将 ELSE 值分配给 OUT

DEMUX: K 大于输出数 -1 不提供 ELSE: 输出不变,

提供 ELSE,将 IN 值复制到 ELSE

移位和循环

移位指令

表格 7- 139 SHR 和 SHL 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-257 out := SHR(

in:=_variant_in_, n:=_uint_in);

out := SHL(

in:=_variant_in_, n:=_uint_in);

使用移位指令(SHL 和 SHR)移动参数 IN 的位序列。结果将分配给参数 OUT。 参数 N 指定移位的位数:

SHR: 右移位序列

SHL: 左移位序列

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 140 参数的数据类型

参数 数据类型 说明
IN Byte, Word, DWord 要移位的位序列
N UInt 要移位的位数
OUT Byte, Word, DWord 移位操作后的位序列

若 N=0,则不移位。 将 IN 值分配给 OUT。

用 0 填充移位操作清空的位位置。

如果要移位的位数 (N) 超过目标值中的位数

(Byte 为 8 位、Word 为 16 位、DWord 为 32 位),

则所有原始位值将被移出并用 0 代替(将 0 分配给 OUT)。

对于移位操作,ENO 总是为 TRUE。

表格 7- 141 Word 数据的 SHL 示例

自右插入零,使 Word 的位左移 (N = 1)
IN 1110 0010 1010 1101 首次移位前的 OUT 值: 1110 0010 1010 1101
首次左移后: 1100 0101 0101 1010
第二次左移后: 1000 1010 1011 0100
第三次左移后: 0001 0101 0110 1000

7.10 移位和循环

循环指令

表格 7- 142 ROR 和 ROL 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-258 out := ROL(

in:=_variant_in_, n:=_uint_in);

out := ROR(

in:=_variant_in_, n:=_uint_in);

循环指令(ROR 和 ROL)用于将参数 IN 的位序列循环移位。结果分配给参数 OUT。 参数 N 定义循环移位的位数。

ROR:循环右移位序列

ROL:循环左移位序列

1 对于 LAD 和 FBD: 单击“???”

并从下拉菜单中选择数据类型。

表格 7- 143 参数的数据类型

参数 数据类型 说明
IN Byte, Word, DWord 要循环移位的位序列
N UInt 要循环移位的位数
OUT Byte, Word, DWord 循环移位操作后的位序列

若 N=0,则不循环移位。 将 IN 值分配给 OUT。

从目标值一侧循环移出的位数据将循环移位到

目标值的另一侧,因此原始位值不会丢失。

如果要循环移位的位数 (N) 超过目标值中的位数

(Byte 为 8 位、Word 为 16 位、

DWord 为 32 位),仍将执行循环移位。

执行循环指令之后,ENO 始终为 TRUE。

表格 7- 144 Word 数据的 ROR 示例

将各个位从右侧循环移出到左侧 (N = 1)
IN 0100 0000 0000 0001 首次循环移位前的 OUT 值: 0100 0000 0000 0001
首次循环右移后: 1010 0000 0000 0000
第二次循环右移后: 0101 0000 0000 0000
框输入和输出可连接到其它功能框逻辑,用户也可

以输入位地址。

s7一1200功能指令表 基本指令-259 s7一1200功能指令表 基本指令-260 out := NOT <布尔表达式>;
通过在 Q 偏移量后加上“:P”,

可指定立即写入物理输出(例如: “%Q3.4:P”)。

对于立即写入,将

s7一1200功能指令表 基本指令-261
位数据值写入过程映像输出并直接写入物理输出。

表格 7- 7 参数的数据类型

参数 数据类型 说明
OUT Bool 分配位

如果有能流通过输出线圈或启用了 FBD“=”功能框,则输出位设置为 1。

如果没有能流通过输出线圈或未启用 FBD“=”赋值功能框,则输出位设置为 0。

如果有能流通过反向输出线圈或启用了 FBD“/=”功能框,则输出位设置为 0。

如果没有能流通过反向输出线圈或未启用 FBD“/=”功能框,则输出位设置为 1。

置位和复位指令

置位和复位 1 位

表格 7- 8 S 和 R 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-262 s7一1200功能指令表 基本指令-263 不提供 S(置位)激活时,OUT 地址处的数据值设置为 1。S

未激活时,OUT 不变。

s7一1200功能指令表 基本指令-264 s7一1200功能指令表 基本指令-265 不提供 R(复位)激活时,OUT 地址处的数据值设置为 0。R

未激活时,OUT 不变。

1 对于 LAD 和 FBD: 这些指令可放置在程序段的任何位置。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 9 参数的数据类型

参数 数据类型 说明
IN(或连接到触点/门逻辑) Bool 要监视的位位置
OUT Bool 要置位或复位的位位置

置位和复位位域

表格 7- 10 SET_BF 和 RESET_BF 指令

LAD1 FBD SCL 说明
s7一1200功能指令表 基本指令-266 s7一1200功能指令表 基本指令-267 不提供 SET_BF 激活时,为从地址 OUT 处开始的“n”位分配数据值 1。 SET_BF 未激活时,OUT 不变。
s7一1200功能指令表 基本指令-268 s7一1200功能指令表 基本指令-269 不提供 RESET_BF 为从地址 OUT 处开始的“n”位写入数据值

0。 RESET_BF 未激活时,OUT 不变。

1 对于 LAD 和 FBD: 这些指令必须是分支中最右端的指令。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 11 参数的数据类型

参数 数据类型 说明
OUT Bool 要置位或复位的位域的起始元素(例如 #MyArray[3])
n 常数 (UInt) 要写入的位数

置位优先和复位优先位锁存

表格 7- 12 RS 和 SR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-270 不提供 RS 是置位优先锁存,其中置位优先。 如果置位 (S1) 和复位 (R) 信号都为真,则输出地址 OUT 将为 1。
s7一1200功能指令表 基本指令-271 不提供 SR 是复位优先锁存,其中复位优先。 如果置位 (S) 和复位 (R1) 信号都为真,则输出地址 OUT 将为 0。

1 对于 LAD 和 FBD: 这些指令必须是分支中最右端的指令。

2 对于 SCL:必须在应用程序内编写代码来复制该函数。

表格 7- 13 参数的数据类型

参数 数据类型 说明
S, S1 Bool 置位输入;1 表示优先
R, R1 Bool 复位输入;1 表示优先
OUT Bool 分配的位输出“OUT”
Q Bool 遵循“OUT”位的状态

OUT 参数指定置位或复位的位地址。 可选 OUT 输出 Q 反映“OUT”地址的信号状态。

指令 S1 R “OUT”位
RS 0 0 先前状态
0 1 0
1 0 1
1 1 1
S R1
SR 0 0 先前状态
0 1 0
1 0 1
1 1 0

上升沿和下降沿指令

表格 7- 14 上升沿和下降沿跳变检测

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-272 s7一1200功能指令表 基本指令-273 不提供 LAD: 在分配的“IN”位上检测到正跳变(断到通)时,该触点的状态为 TRUE。 该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。 P 触点可以放置在程序段中除分支结尾外的任何位置。

FBD: 在分配的输入位上检测到正跳变(关到开)时,输出逻辑状态为 TRUE。 P 功能框只能放置在分支的开头。

s7一1200功能指令表 基本指令-274 s7一1200功能指令表 基本指令-275 不提供 LAD: 在分配的输入位上检测到负跳变(开到关)时,该触点的状态为 TRUE。 该触点逻辑状态随后与能流输入状态组合以设置能流输出状态。 N 触点可以放置在程序段中除分支结尾外的任何位置。

FBD: 在分配的输入位上检测到负跳变(开到关)时,输出逻辑状态为 TRUE。 N 功能框只能放置在分支的开头。

s7一1200功能指令表 基本指令-276 s7一1200功能指令表 基本指令-277 不提供 LAD: 在进入线圈的能流中检测到正跳变(关到开)时,分配的位“OUT”为 TRUE。 能流输入状态总是通过线圈后变为能流输出状态。 P 线圈可以放置在程序段中的任何位置。

FBD: 在功能框输入连接的逻辑状态中或输入位赋值中(如果该功能框位于分支开头)检测到正跳变(关到开)时,分配的位“OUT”为 TRUE。 输入逻辑状态总是通过功能框后变为输

出逻辑状态。 P= 功能框可以放置在分支中的任何位置。

s7一1200功能指令表 基本指令-278 s7一1200功能指令表 基本指令-279 不提供 LAD: 在进入线圈的能流中检测到负跳变(开到关)时,分配的位“OUT”为 TRUE。 能流输入状态总是通过线圈后变为能流输出状态。 N 线圈可以放置在程序段中的任何位置。

FBD: 在功能框输入连接的逻辑状态中或在输入位赋值中

(如果该功能框位于分支开头)检测到负跳变(通到断)时,

分配的位“OUT”为 TRUE。 输入逻辑状态总是通过功能框后变为输出逻辑状态。 N= 功能框可以放置在分支中的任何位置。

1 对于 SCL: 必须在应用程序内编写代码来复制该函数。

表格 7- 15 P_TRIG 和 N_TRIG 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-280 不提供 在 CLK 输入状态 (FBD) 或 CLK 能流输入 (LAD) 中检测到正跳变(断到通)时,Q 输出能流或逻辑状态为 TRUE。

在 LAD 中,P_TRIG 指令不能放置在程序段的开头或结尾。 在

FBD 中,P_TRIG 指令可以放置在除分支结尾外的任何位置。

s7一1200功能指令表 基本指令-281 不提供 在 CLK 输入状态 (FBD) 或 CLK 能流输入 (LAD) 中检测到负跳变(通到断)时,Q 输出能流或逻辑状态为 TRUE。

在 LAD 中,N_TRIG 指令不能放置在程序段的开头或结尾。 在

FBD 中,N_TRIG 指令可以放置在除分支结尾外的任何位置。

1 对于 SCL: 必须在应用程序内编写代码来复制该函数。

表格 7- 16 参数的数据类型(P 和 N 触点/线圈、P=、N=、P_TRIG 和 N_TRIG)

参数 数据类型 说明
M_BIT Bool 保存输入的前一个状态的存储器位
IN Bool 要检测其跳变沿的输入位
OUT Bool 指示检测到跳变沿的输出位
CLK Bool 要检测其跳变沿的能流或输入位
Q Bool 指示检测到沿的输出

所有沿指令均使用存储器位 (M_BIT) 存储要监视的输入信号的前一个状态。 通过将输入的状态与存储器位的状态进行比较来检测沿。 如果状态指示在关注的方向上有输入变化,则会在输出写入 TRUE 来报告沿。 否则,输出会写入 FALSE。

说明

沿指令每次执行时都会对输入和存储器位值进行评估,包括第一次执行。 在程序设计期间必须考虑输入和存储器位的初始状态,以允许或避免在第一次扫描时进行沿检测。

由于存储器位必须从一次执行保留到下一次执行,所以应该对每个沿指令都使用唯一的位,并且不应在程序中的任何其它位置使用该位。 还应避免使用临时存储器和可受其它系统功能(例如 I/O 更新)影响的存储器。 仅将 M、全局 DB 或静态存储器(在背景 DB 中)用于 M_BIT 存储器分配。

定时器

使用定时器指令可创建编程的时间延时。 用户程序中可以使用的定时器数仅受 CPU 存储器容量限制。 每个定时器均使用 16 字节的 IEC_Timer 数据类型的 DB 结构来存储功能框或线圈指令顶部指定的定时器数据。 STEP 7 会在插入指令时自动创建该 DB。

表格 7- 17 定时器指令

LAD/FBD 功能框 LAD 线圈 SCL 说明
s7一1200功能指令表 基本指令-282 s7一1200功能指令表 基本指令-283 "IEC_Timer_0_DB".TP( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_, ET=>_time_out_); TP 定时器可生成具有预设宽度时间的脉冲。
s7一1200功能指令表 基本指令-284 s7一1200功能指令表 基本指令-285 "IEC_Timer_0_DB".TON ( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_,

ET=>_time_out_);

TON 定时器在预设的延时过后将输出 Q 设置为 ON。
s7一1200功能指令表 基本指令-286 s7一1200功能指令表 基本指令-287 "IEC_Timer_0_DB".TOF ( IN:=_bool_in_, PT:=_time_in_, Q=>_bool_out_, ET=>_time_out_); TOF 定时器在预设的延时过后将输出 Q 重设为 OFF。
s7一1200功能指令表 基本指令-288 s7一1200功能指令表 基本指令-289 "IEC_Timer_0_DB".TONR ( IN:=_bool_in_, R:=_bool_in_ PT:=_time_in_, Q=>_bool_out_,

ET=>_time_out_);

TONR 定时器在预设的延时过后将输出 Q 设置为 ON。 在使用 R 输入重置经过的时间之前,会跨越多个定时时段一直累加经过的时间。
仅 FBD:

s7一1200功能指令表 基本指令-290

s7一1200功能指令表 基本指令-291 (无对应的 SCL 指令) PT(预设定时器)线圈会在指定的

IEC_Timer 中装载新的 PRESET 时间值。

仅 FBD:

s7一1200功能指令表 基本指令-292

s7一1200功能指令表 基本指令-293 (无对应的 SCL 指令) RT(复位定时器)线圈会复位指定的

IEC_Timer。

1 STEP 7 会在插入指令时自动创建 DB。

2 在 SCL 示例中,“IEC_Timer_0_DB”是背景 DB 的名称。

表格 7- 18 参数的数据类型

参数 数据类型 说明
功能框: IN

线圈: 能流

Bool TP、TON 和 TONR:

功能框: 0=禁用定时器,1=启用定时器

线圈: 无能流=禁用定时器,能流=启用定时器

TOF:

功能框: 0=启用定时器,1=禁用定时器

线圈: 无能流=启用定时器,能流=禁用定时器

R Bool 仅 TONR 功能框:

0=不重置

1= 将经过的时间和 Q 位重置为 0

功能框: PT

线圈: "PRESET_Tag"

Time 定时器功能框或线圈: 预设的时间输入
功能框: Q

线圈: DBdata.Q

Bool 定时器功能框: Q 功能框输出或定时器 DB 数据中的 Q 位定时器线圈: 仅可寻址定时器 DB 数据中的 Q 位
功能框: ET

线圈: DBdata.ET

Time 定时器功能框: ET(经历的时间)功能框输出或定时器 DB 数据中的 ET 时间值

定时器线圈: 仅可寻址定时器 DB 数据中的 ET 时间值。

表格 7- 19 PT 和 IN 参数值变化的影响

定时器 PT 和 IN 功能框参数和相应线圈参数的变化
TP 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,更改 IN 没有任何影响。

TON 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,将 IN 更改为 FALSE 会复位并停止定时器。

TOF 定时器运行期间,更改 PT 没有任何影响。

定时器运行期间,将 IN 更改为 TRUE 会复位并停止定时器。

TONR 定时器运行期间更改 PT 没有任何影响,但对定时器中断后继续运行会有影响。

定时器运行期间将 IN 更改为 FALSE 会停止定时器但不会复位定时器。 将 IN 改回

TRUE 将使定时器从累积的时间值开始定时。

PT(预设时间)和 ET(经过的时间)值以表示毫秒时间的有符号双精度整数形式存储在指定的 IEC_TIMER DB 数据中。 TIME 数据使用 T# 标识符,可以简单时间单元

(T#200ms 或 200)和复合时间单元(如 T#2s_200ms)的形式输入。

表格 7- 20 TIME 数据类型的大小和范围

数据类型 大小 有效数值范围 1
TIME 32 位,以

DInt 数据的形式存储

T#-24d_20h_31m_23s_648ms 到 T#24d_20h_31m_23s_647ms

以 -2,147,483,648 ms 到 +2,147,483,647 ms 的形式存储

1 在定时器指令中,无法使用上面所示 TIME 数据类型的负数范围。 负的 PT(预设时间)值在定时器指令执行时被设置为 0。 ET(经过的时间)始终为正值。

定时器线圈示例

-(TP)-、-(TON)-、-(TOF)- 和 -(TONR)- 定时器线圈必须是 LAD 网络中的最后一个指令。如定时器示例中所示,后面网络中的触点指令会求出定时器线圈 IEC_Timer DB 数据中的

Q 位值。 同样,如果要在程序中使用经过的时间值,必须访问 IEC_timer DB 数据中的

ELAPSED 元素。

s7一1200功能指令表 基本指令-294

当 Tag_Input 位的值由 0 转换为 1 时,脉冲定时器启动。 定时器开始运行并持续

Tag_Time 时间值指定的时间。

s7一1200功能指令表 基本指令-295

只要定时器运行,就存在 DB1.MyIEC_Timer.Q 状态=1 且 Tag_Output 值=1。当经过

Tag_Time 值后,DB1.MyIEC_Timer.Q=0 且 Tag_Output 值=0。

37 37 37
37 37

重置定时器 -(RT)- 和预设定时器 -(PT)- 线圈

这些线圈指令可与功能框或线圈定时器一起使用并可放置在中间位置。 线圈输出能流状态始终与线圈输入状态相同。 若 -(RT)- 线圈激活,指定 IEC_Timer DB 数据中的

ELAPSED 时间元素将重置为 0。若 -(PT)- 线圈激活,指定 IEC_Timer DB 数据中的

PRESET 时间元素将重置为 0。

说明

在 FB 中放置定时器指令时,可以选择“多重背景数据块”(Multi-instance data block) 选项。 各定时器结构名称可以对应不同的数据结构,但定时器数据包含在同一个数据块 中,无需为每个定时器都使用一个独立的数据块。 这样可减少处理定时器所需的处理时间和数据存储空间。 在共享的多重背景数据块中的定时器数据结构之间不存在交互作 用。

定时器的运行

表格 7- 21 IEC 定时器的类型

定时器 时序图
TP: 脉冲定时器 ,1
TP 定时器可生成具有预设宽度时间的脉冲。
(7
37
4
TON: 接通延迟定时器 ,1
TON 定时器在预设的延时过后将输出 Q 设置为

ON。

(7 37
4
37 37
定时器 时序图
TOF: 关断延迟定时器 ,1
TOF 定时器在预设的延时过后将输出 Q 重置为
OFF。 (7 37
4
TONR: 保持型接通延迟定时器 ,1
TONR 定时器在预设的延时过后将输出 Q 设置
为 ON。 在使用 R 输入重置经过的时间之前,会 (7 37
跨越多个定时时段一直累加经过的时间。
4
5

说明

在 CPU 中,没有给任何特定的定时器指令分配专门的资源。 每个定时器使用 DB 存储器中其自身的结构和一个连续运行的内部 CPU 定时器来执行定时。

当由于 TP、TON、TOF 或 TONR 指令的输入上出现沿跳变而启动定时器时,连续运行的内部 CPU 定时器的值将被复制到为该定时器指令分配的 DB 结构的 START 成员中。该起始值在定时器继续运行期间将保持不变,随后将在每次更新定时器时使用。 每次启动定时器时,都会从内部 CPU 定时器将一个新的起始值加载到定时器结构中。

更新定时器时,将从内部 CPU 定时器的当前值中减去上述起始值以确定经过的时间。 再将经过的时间与预设值进行比较以确定定时器 Q 位的状态。 然后在为该定时器分配的

DB 结构中,更新 ELAPSED 和 Q 成员。 注意,经过的时间将停留在预设值上(达到预设值后定时器便不会继续累加经过的时间)。

当且仅当满足以下条件时才会执行定时器更新:

已执行定时器指令(TP、TON、TOF 或 TONR)

某个指令直接引用 DB 中定时器结构的“ELAPSED”成员

某个指令直接引用 DB 中定时器结构的“Q”成员

定时器编程

规划和创建用户程序时应考虑以下定时器运行说明:

可在同一个扫描周期内多次更新定时器。 每次执行定时器指令(TP、TON、TOF、

TONR)和每次将定时器结构的 ELAPSED 或 Q 成员用作其它已执行指令的参数时, 都会更新定时器。 这在需要最新时间数据(本质上是立即读取定时器)时会是一项优点。 但是,如果希望在整个程序扫描周期内保持一致的值,则请将定时器指令放置在需要这些值的其它所有指令之前,并使用定时器指令的 Q 和 ET 输出中的变量而不是定时器 DB 结构的 ELAPSED 和 Q 成员。

扫描期间可以不执行定时器更新。 可以在函数中启动定时器,然后在一个或多个扫描周期内不再调用该函数。 如果没有执行引用定时器结构中 ELAPSED 或 Q 成员的其它指令,则不会更新定时器。 直到再次执行定时器指令或执行将定时器结构的

ELAPSED 或 Q 用作参数的其它指令时,才会再次更新定时器。

尽管并不常见,但可以将同一个 DB 定时器结构分配给多个定时器指令。 通常,为避免意外交互作用,应当使每个 DB 定时器结构仅对应一个定时器指令(TP、TON、

TOF、TONR)。

自复位定时器适合用于触发需要周期性发生的动作。 通常,将引用定时器位的常闭触点放置在定时器指令前面可创建自复位定时器。 该定时器网络通常位于使用该定时器位来触发动作的一个或多个依赖型网络上面。 当定时器时间已到(经过的时间达到预设值)时,定时器位将在一个扫描周期内为 ON,因而可执行由该定时器位控制的依赖型网络逻辑。 下次执行定时器网络时,常闭触点将为 OFF,从而复位定时器并清除定时器位。 下次扫描期间,常闭触点将为 ON,因此将重启定时器。 创建此类自复位定时器时,请勿将定时器 DB 结构的“Q”成员用作该定时器指令前面常闭触点的参数。 而是要使用与该定时器指令的“Q”输出相连的变量。 如果访问定时器 DB 结构的

Q 成员,将导致定时器更新,且如果因常闭触点而更新定时器,该触点将立即复位该定时器。 定时器指令的 Q 输出将在一个扫描周期内不为 ON,并且依赖型网络不会执行。

RUN-STOP-RUN 切换或 CPU 循环上电后保留时间数据

如果从运行模式阶段切换到停止模式或 CPU 循环上电并启动了新运行模式阶段,则存储在之前运行模式阶段中的定时器数据将丢失,除非将定时器数据结构指定为具有保持性

(TP、TON、TOF 和 TONR 定时器)。

将定时器指令放到程序编辑器中后,如果接受调用选项对话框中的默认设置,则将自动分配一个无法实现具有保持性的背景数据块。 要使定时器数据具有保持性,必须使用全局数据块或多重背景数据块。

指定全局数据块将定时器数据存储为保持性数据

无论将定时器放在什么位置(OB、FC 或 FB),该选项都有效。

创建一个全局数据块:

在项目树中双击“添加新块”(Add new block)。

单击数据块 (DB) 图标

对于“类型”(Type),选择“全局数据块”(global DB)。

如果希望能够将该数据块中各数据元素选择为具有保持性,则确保选中数据块类型

“优化”(Optimized) 框。 另一个数据块类型选项“标准 - 与 S7-300/400 兼

容”(Standard - compatible with S7-300/400) 仅允许将所有 DB 数据元素都设置为具有保持性或没有保持性。

单击“确定”(OK)

向该数据块中添加定时器结构:

在新的全局数据块中,添加 IEC_Timer 数据类型的静态变量。

在“保持性”(Retain) 列中,选中相应框以使该结构具有保持性。

重复此过程为要存储在该数据块中的所有定时器创建结构。 可以将每个定时器结构放置在独立的全局数据块中,也可以将多个定时器结构放置在同一个全局数据块 中。 除定时器外,还可以将其它静态变量放置在该全局数据块中。 将多个定时器结构放置在同一个全局数据块中可减少总的块数。

可根据需要重命名定时器结构。

打开程序块来选择保持性定时器的放置位置(OB、FC 或 FB)。

将定时器指令放置在所需位置。

在调用选项对话框出现后,单击“取消”按钮。

在新的定时器指令上方,输入上面所创建全局数据块和定时器结构的名称(请勿使用助手浏览)(例如:“Data_block_3.Static_1”)。

指定多重背景数据块以将定时器数据存储为保持性数据

该选项仅对于将定时器放置在 FB 中有效。

该选项取决于创建 FB 时是否选中了“优化”块访问(仅允许符号访问)。 创建 FB 后,便无法将复选框设置更改为“优化”(Optimized);必须在创建 FB 时,在从树中选择“添加新块”(Add new block) 后出现的第一个屏幕上正确选择该复选框。 要检查现有 FB 访问属性的组态情况,请在项目树中右键单击该 FB,选择“属性”(Properties),然后选择“特

性”(Attributes)。

如果创建 FB 时选中了“优化”(Optimized) 框(仅允许符号访问):

打开 FB 进行编辑。

将定时器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名定时器。

单击“确定”(OK)。 定时器指令将出现在编辑器中,而 IEC_TIMER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有必要,打开 FB 接口编辑器(可能需要单击小箭头以展开视图)。

在“静态”(Static) 下,找到刚刚创建的定时器结构。

在此定时器结构的“保持性”(Retain) 列中,改为选择“保持性”(Retain)。 此后只要从另一程序块调用此 FB,都将利用此接口定义(包含标有保持性的定时器结构)创建背景数据块。

如果创建 FB 时选中了“标准 - 与 S7-300/400 兼容”(Standard - compatible with S7-

300/400) 框(允许符号访问和直接访问):

打开 FB 进行编辑。

将定时器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名定时器。

单击“确定”(OK)。 定时器指令将出现在编辑器中,而 IEC_TIMER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

打开将使用此 FB 的块。

将此 FB 置于所需的位置。 如此将为该 FB 创建一个背景数据块。

打开将 FB 放入编辑器时创建的背景数据块。

在“静态”(Static) 下,找到所需的定时器结构。 在此定时器结构的“保持性”(Retain) 列中,选中相应框使该结构具有保持性。

计数器

表格 7- 22 计数器指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-296 "IEC_Counter_0_DB".CTU( CU:=_bool_in, R:=_bool_in, PV:=_int_in, Q=>_bool_out, CV=>_int_out); 可使用计数器指令对内部程序事件和外部过程事件进行计
数。 每个计数器都使用数据块中存储的结构来保存计数器数
据。 用户在编辑器中放置计数器指令时分配相应的数据块。
CTU 是加计数器
s7一1200功能指令表 基本指令-297 "IEC_Counter_0_DB".CTD( CD:=_bool_in, LD:=_bool_in, PV:=_int_in, Q=>_bool_out,

CV=>_int_out);

CTD 是减计数器
CTUD 是加减计数器
s7一1200功能指令表 基本指令-298 "IEC_Counter_0_DB".CTUD( CU:=_bool_in, CD:=_bool_in, R:=_bool_in, LD:=_bool_in, PV:=_int_in, QU=>_bool_out, QD=>_bool_out, CV=>_int_out);

1 对于 LAD 和 FBD: 从指令名称下的下拉列表中选择计数值数据类型。

2 STEP 7 会在插入指令时自动创建 DB。

3 在 SCL 示例中,“IEC_Counter_0_DB”是背景 DB 的名称。

表格 7- 23 参数的数据类型

参数 数据类型 1 说明
CU, CD Bool 加计数或减计数,按加或减一计数
R (CTU, CTUD) Bool 将计数值重置为零
LD (CTD, CTUD) Bool 预设值的装载控制
PV SInt, Int, DInt, USInt, UInt, UDInt 预设计数值
Q, QU Bool CV >= PV 时为真
QD Bool CV <= 0 时为真
CV SInt, Int, DInt, USInt, UInt, UDInt 当前计数值

1 计数值的数值范围取决于所选的数据类型。 如果计数值是无符号整型数,则可以减计数到零或加计数到范围限值。 如果计数值是有符号整数,则可以减计数到负整数限值或加计数到正整数限值。

用户程序中可以使用的计数器数仅受 CPU 存储器容量限制。 计数器占用以下存储器空间:

对于 SInt 或 USInt 数据类型,计数器指令占用 3 个字节。

对于 Int 或 UInt 数据类型,计数器指令占用 6 个字节。

对于 DInt 或 UDInt 数据类型,计数器指令占用 12 个字节。

这些指令使用软件计数器,软件计数器的最大计数速率受其所在的 OB 的执行速率限制。指令所在的 OB 的执行频率必须足够高,以检测 CU 或 CD 输入的所有跳变。 要了解更快的计数操作,请参见 CTRL_HSC 指令 (页 363)。

说明

在 FB 中放置计数器指令后,可以选择多重背景数据块选项,各计数器结构名称可以对应不同的数据结构,但计数器数据包含在同一个数据块中,从而无需每个计数器都使用一个单独的数据块。 这减少了计数器所需的处理时间和数据存储空间。 在共享的多重背景数据块中的计数器数据结构之间不存在交互作用。

计数器的运行

表格 7- 24 CTU 计数器的运行

计数器 运行
当参数 CU 的值从 0 变为 1 时,CTU 计数器会使计数值加 1。 &8 5

&9 4

0 1 2 3 4 0
CTU 时序图显示了计数值为无符号整数时的运行(其中,PV =
3)。
如果参数 CV(当前计数值)的值大于或等于参数 PV(预
设计数值)的值,则计数器输出参数 Q = 1。
如果复位参数 R 的值从 0 变为 1,则当前计数值重置为 0。

表格 7- 25 CTD 计数器的运行

计数器 运行
当参数 CD 的值从 0 变为 1 时,CTD 计数器会使计数 &'
值减 1。CTD 时序图显示了计数值为无符号整数时的
/2$'
运行(其中,PV = 3)。
&9 0 3 2 1 0 3 2
如果参数 CV(当前计数值)的值等于或小于 0,则
计数器输出参数 Q = 1。
如果参数 LOAD 的值从 0 变为 1,则参数 PV(预 4
设值)的值将作为新的 CV(当前计数值)装载到
计数器。

表格 7- 26 CTUD 计数器的运行

计数器 运行
当加计数 (CU) 输入或减计 &8
数 (CD) 输入从 0 转换为 1 &'
时,CTUD 计数器将加 1 或
减 1。 CTUD 时序图显示了 5
计数值为无符号整数时的运
行(其中 PV = 4)。 /2$'

&9

0 1 2 3 4 5 4 3 4 5 0
如果参数 CV 的值大于等
于参数 PV 的值,则计数
器输出参数 QU = 1。
如果参数 CV 的值小于或
等于零,则计数器输出参
数 QD = 1。 48
如果参数 LOAD 的值从 0 4'
变为 1,则参数 PV 的值
将作为新的 CV 装载到计
数器。
如果复位参数 R 的值从 0
变为 1,则当前计数值重
置为 0。

RUN-STOP-RUN 切换或 CPU 循环上电后保留计数器数据

如果从运行模式阶段切换到停止模式或 CPU 循环上电并启动了新运行模式阶段,则存储在之前运行模式阶段中的计数器数据将丢失,除非将定时器数据结构指定为具有保持性

(CTU、CTD 和 CTUD 计数器)。

将计数器指令放到程序编辑器中后,如果接受调用选项对话框中的默认设置,则将自动分配一个无法实现具有保持性的背景数据块。 要使计数器数据具有保持性,必须使用全局数据块或多重背景数据块。

指定全局数据块将计数器数据存储为保持性数据

无论将计数器放在什么位置(OB、FC 或 FB),该选项都有效。

创建一个全局数据块:

在项目树中双击“添加新块”(Add new block)。

单击数据块 (DB) 图标

对于“类型”(Type),选择“全局数据块”(global DB)。

如果希望能够将该数据块中的各个项选择为具有保持性,则确保选中“仅符号访 问”(symbolic-access-only) 框。

单击“确定”(OK)

向该数据块添加计数器结构:

在新的全局数据块中,添加使用以下计数器数据类型之一的新静态变量。 务必要考虑到想要用于预设值和计数值的类型。

计数器数据类型 预设值和计数值的相应类型

IEC_Counter INT

IEC_SCounter SINT

IEC_DCounter DINT

IEC_UCounter UINT

IEC_USCounter USINT

IEC_UDCounter UDINT

在“保持性”(Retain) 列中,选中相应框以使该结构具有保持性。

重复此过程为要存储在该数据块中的所有计数器创建结构。 可以将每个计数器结构放置在独立的全局数据块中,也可以将多个计数器结构放置在同一个全局数据块 中。 除计数器外,还可以将其它静态变量放置在该全局数据块中。 将多个计数器结构放置在同一个全局数据块中可减少总的块数。

可根据需要重命名计数器结构。

打开程序块来选择保持性计数器的放置位置(OB、FC 或 FB)。

将计数器指令放置在所需位置。

在调用选项对话框出现后,单击“取消”按钮。 您现在应该看到新的计数器指令,在指令名称的上面和下面均显示“???”。

在新的计数器指令上方,输入上面所创建全局数据块和计数器结构的名称(请勿使用助手浏览)(例如: “Data_block_3.Static_1”)。 这需要填入对应的预设值和计数值类型(例如: UInt 对应于 IEC_UCounter 结构)。

指定多重背景数据块以将计数器数据存储为保持性数据

该选项仅对于将计数器放置在 FB 中有效。

该选项取决于是否将 FB 创建为仅符号访问。 创建 FB 后,便无法更改“仅符号访

问”(Symbolic access only) 复选框的设置;必须在创建 FB 时,在从树中选择“添加新

块”(Add new block) 后出现的第一个屏幕上正确选择该复选框。 要查看此框针对现有 FB

的组态情况,请在项目树中右键单击该 FB,选择“属性”(properties),然后选择“特性”(Attributes)。

如果创建 FB 时选中了“仅符号访问”(Symbolic access only) 框:

打开 FB 进行编辑。

将计数器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名计数器。

单击“确定”(OK)。 计数器指令将出现在编辑器中并且预设值和计数值的类型为 INT, 而 IEC_COUNTER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有需要,请在计数器指令中将类型从 INT 更改为其它类型之一。 计数器结构将相应更改。

计数器指令中显示的类型(对于预设值和计数值)

FB 接口中显示的对应的结构类型

INT IEC_Counter

SINT IEC_SCounter

DINT IEC_DCounter

UINT IEC_UCounter

USINT IEC_USCounter

UDINT IEC_UDCounter

如有必要,打开 FB 接口编辑器(可能需要单击小箭头以展开视图)。

在“静态”(Static) 下,找到刚刚创建的计数器结构。

在此计数器结构的“保持性”(Retain) 列中,改为选择“保持性”(Retain)。 此后只要从另一程序块调用此 FB,都将利用此接口定义(包含标有保持性的计数器结构)创建背景数据块。

如果创建 FB 时未选中“仅符号访问”(Symbolic access only) 框:

打开 FB 进行编辑。

将计数器指令放在 FB 中的所需位置。

“调用选项”(Call options) 对话框出现后,单击“多重背景”(Multi instance) 图标。 仅在将该指令放置于 FB 中后,“多重背景”(Multi instance) 选项才可用。

如有需要,请在“调用选项”(Call options) 对话框中重命名计数器。

单击“确定”(OK)。 计数器指令将出现在编辑器中并且预设值和计数值的类型为 INT, 而 IEC_COUNTER 结构将出现在“FB 接口”(FB Interface) 的“静态”(Static) 下。

如有需要,请在计数器指令中将类型从 INT 更改为其它类型之一。 计数器结构将相应更改。

计数器指令中显示的类型(对于预设值和计数值)

FB 接口中显示的对应的结构类型

INT IEC_Counter

SINT IEC_SCounter

DINT IEC_DCounter

UINT IEC_UCounter

USINT IEC_USCounter

UDINT IEC_UDCounter

打开将使用此 FB 的块。

将此 FB 置于所需的位置。 如此将为该 FB 创建一个背景数据块。

打开将 FB 放入编辑器时创建的背景数据块。

在“静态”(Static) 下,找到所需的计数器结构。 在此计数器结构的“保持性”(Retain) 列中,选中相应框使该结构具有保持性。

比较

比较

表格 7- 27 比较指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-299 s7一1200功能指令表 基本指令-300 out := in1 = in2;

or

IF in1 = in2

THEN out := 1; ELSE out := 0; END_IF;

比较数据类型相同的两个值。 该 LAD 触点比较结果为 TRUE 时,则该触点会被激活。 如果该

FBD 功能框比较结果为 TRUE,则功能框输出为 TRUE。

1 对于 LAD 和 FBD: 单击指令名称(如“==”),以从下拉列表中更改比较类型。 单击“???”并从下拉列表中选择数据类型。

表格 7- 28 参数的数据类型

参数 数据类型 说明
IN1, IN2 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, String, Char, Time, DTL, 常数 要比较的值

表格 7- 29 比较说明

关系类型 满足以下条件时比较结果为真 ...
= IN1 等于 IN2
<> IN1 不等于 IN2
>= IN1 大于或等于 IN2
<= IN1 小于或等于 IN2
> IN1 大于 IN2
< IN1 小于 IN2

7.4 比较

范围内和范围外指令

表格 7- 30 范围内和范围外指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-301 out := IN_RANGE(min, val, max); 测试输入值是在指定的值范围之内还是之外。

如果比较结果为 TRUE,则功能框输出为 TRUE。

s7一1200功能指令表 基本指令-302 out := OUT_RANGE(min, val, max);

1 对于 LAD 和 FBD: 单击“???”并从下拉列表中选择数据类型。

表格 7- 31 参数的数据类型

参数 数据类型 1 说明
MIN, VAL, MAX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 比较器输入

1 输入参数 MIN、VAL 和 MAX 的数据类型必须相同。

满足以下条件时 IN_RANGE 比较结果为真: MIN <= VAL <= MAX

满足以下条件时 OUT_RANGE 比较结果为真: VAL < MIN 或 VAL > MAX

OK 和 Not OK 指令

表格 7- 32 OK 和 Not OK 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-303 s7一1200功能指令表 基本指令-304 不提供 测试输入数据参考是否为符合 IEEE 规范 754 的有效实数。
s7一1200功能指令表 基本指令-305 s7一1200功能指令表 基本指令-306 不提供

1 对于 LAD 和 FBD: 如果该 LAD 触点为 TRUE,则激活该触点并传递能流。 如果该 FBD 功能框为 TRUE, 则功能框输出为 TRUE。

表格 7- 33 参数的数据类型

参数 数据类型 说明
IN Real, LReal 输入数据

表格 7- 34 操作

指令 满足以下条件时 REAL 数测试结果为 TRUE:
OK 输入值为有效实数 1
NOT_OK 输入值不是有效实数 1

1 如果 Real 或 LReal 类型的值为 +/- INF(无穷大)、NaN(不是数字)或者非标准化的值,则其无效。 非标准化的值是非常接近于 0 的数字。 CPU 在计算中用 0 替换非标准化的值。

参见

LAD、FBD 和 SCL 的 EN 和 ENO (页 164)

数学

计算指令

表格 7- 35 CALCULATE 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-307 使用标准 SCL 数学表达式创建等式。 CALCULATE 指令可用于创建作用于多个输入上的数学函数

(IN1,IN2,.. INn),并根据您定义的等式在 OUT 处生成结果。

首先选择数据类型。 所有输入和输出的数据类型必须相同。

要添加其它输入,请单击最后一个输入处的图标。

表格 7- 36 参数的数据类型

参数 数据类型 1
IN1, IN2, ..INn SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord

1 IN 和 OUT 参数必须具有相同的数据类型(通过对输入参数进行隐式转换)。 例如: 如果 OUT 是 INT 或

REAL,则 SINT 输入值将转换为 INT 或 REAL 值

单击计算器图标可打开对话框,在其中定义数学函数。 输入等式作为输入(如 IN1 和

IN2)和操作数。 单击“确定”(OK) 保存函数时,对话框会自动生成 CALCULATE 指令的输入。

编辑器底部显示有一个示例及可包含的数学运算列表。

s7一1200功能指令表 基本指令-308

说明

还必须为函数中的任何常量生成输入。 然后会在指令 CALCULATE 的相关输入中输入该常量值。

通过输入常量作为输入,可将 CALCULATE 指令复制到用户程序的其它位置,从而无需更改函数。 之后,不需要修改函数,就可以更改指令输入的值或变量。

当执行 CALCULATE 并成功完成计算中的所有单个运算时,ENO = 1,否则 ENO = 0。

加法、减法、乘法和除法指令

表格 7- 37 加法、减法、乘法和除法指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-309 out out out out :=

:=

:=

:=

in1 in1 in1 in1 + in2;

- in2;

* in2;

/ in2;

ADD: 加法 (IN1 + IN2 = OUT)

SUB: 减法 (IN1 - IN2 = OUT)

MUL: 乘法 (IN1 * IN2 = OUT)

DIV: 除法 (IN1 / IN2 = OUT)
整数除法运算会截去商的小数部分以生成整数输出。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 38 参数的数据类型(LAD 和 FBD)

参数 数据类型 1 说明
IN1, IN2 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 参数 IN1、IN2 和 OUT 的数据类型必须相同。

s7一1200功能指令表 基本指令-310 要添加 ADD 或 MUL 输入,请单击“创建”(Create) 图标,或在其中一个现有

IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

启用数学指令 (EN = 1) 后,指令会对输入值(IN1 和 IN2)执行指定的运算并将结果存储在通过输出参数 (OUT) 指定的存储器地址中。 运算成功完成后,指令会设置 ENO = 1。

表格 7- 39 ENO 状态

ENO 说明
1 无错误
0 数学运算结果值可能超出所选数据类型的有效数值范围。 返回适合目标大小的结果的最低有效部分。
0 除数为 0 (IN2 = 0): 结果未定义,返回 0。
0 Real/LReal: 如果其中一个输入值为 NaN(不是数字),则返回 NaN。
0 ADD Real/LReal: 如果两个 IN 值均为 INF,但符号不同,则这是非法运算并返回 NaN。
0 SUB Real/LReal: 如果两个 IN 值均为 INF,且符号相同,则这是非法运算并返回 NaN。
0 MUL Real/LReal: 如果一个 IN 值为零而另一个为 INF,则这是非法运算并返回 NaN。
0 DIV Real/LReal: 如果两个 IN 值均为零或 INF,则这是非法运算并返回 NaN。

求模指令

表格 7- 40 MOD 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-311 out := in1 MOD in2; 可以使用 MOD 指令返回整数除法运算的余数。 用输入 IN1 的值除以输入 IN2 的值,在输出 OUT 中返回余数。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 41 参数的数据类型

参数 数据类型 1 说明
IN1 和 IN2 SInt, Int, DInt, USInt, UInt, UDInt, 常数 求模输入
OUT SInt, Int, DInt, USInt, UInt, UDInt 求模输出

1 IN1、IN2 和 OUT 参数的数据类型必须相同。

表格 7- 42 ENO 值

ENO 说明
1 无错误
0 值 IN2 = 0,OUT 被赋以零值

取反指令

表格 7- 43 NEG 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-312 -(in); 使用 NEG 指令可将参数 IN 的值的算术符号取反并将结果存储在参数 OUT

中。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 44 参数的数据类型

参数 数据类型 1 说明
IN SInt, Int, DInt, Real, LReal, Constant 数学运算输入
OUT SInt, Int, DInt, Real, LReal 数学运算输出

1 参数 IN 和 OUT 的数据类型必须相同。

表格 7- 45 ENO 状态

ENO 说明
1 无错误
0 结果值超出所选数据类型的有效数值范围。

以 SInt 为例: NEG (-128) 的结果为 +128,超出该数据类型的最大值。

递增和递减指令

表格 7- 46 INC 和 DEC 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-313 in_out := in_out + 1; 递增有符号或无符号整数值:

IN_OUT 值 +1 = IN_OUT 值

s7一1200功能指令表 基本指令-314 in_out := in_out - 1; 递减有符号或无符号整数值:

IN_OUT 值 - 1 = IN_OUT 值

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 47 参数的数据类型

参数 数据类型 说明
IN/OUT SInt, Int, DInt, USInt, UInt, UDInt 数学运算输入和输出

表格 7- 48 ENO 状态

ENO 说明
1 无错误
0 结果值超出所选数据类型的有效数值范围。

以 SInt 为例: INC (+127) 的结果为 +128,超出该数据类型的最大值。

绝对值指令

表格 7- 49 ABS 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-315 out := ABS(in); 计算参数 IN 的有符号整数或实数的绝对值并将结果存储在参数 OUT

中。

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 50 参数的数据类型

参数 数据类型 1 说明
IN SInt, Int, DInt, Real, LReal 数学运算输入
OUT SInt, Int, DInt, Real, LReal 数学运算输出

1 参数 IN 和 OUT 的数据类型必须相同。

表格 7- 51 ENO 状态

ENO 说明
1 无错误
0 数学运算结果值超出所选数据类型的有效数值范围。

以 SInt 为例: ABS (-128) 的结果为 +128,超出该数据类型最大值。

最小值和最大值指令

表格 7- 52 MIN 和 MAX 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-316 out:= MIN(

in1:=_variant_in_, in2:=_variant_in_

[,...in32]);

MIN 指令用于比较两个参数 IN1 和 IN2 的值并将最小

(较小)值分配给参数 OUT。

s7一1200功能指令表 基本指令-317 out:= MAX(

in1:=_variant_in_, in2:=_variant_in_

[,...in32]);

MAX 指令用于比较两个参数 IN1 和 IN2 的值并将最大

(较大)值分配给参数 OUT。

1 对于 LAD 和 FBD:单击“???”并从下拉菜单中选择数据类型。

表格 7- 53 参数的数据类型

参数 数据类型 1 说明
IN1, IN2 [...IN32] SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入(最多 32 个输入)
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 IN1、IN2 和 OUT 参数的数据类型必须相同。

s7一1200功能指令表 基本指令-318 要添加输入,请单击“创建”(Create) 图标,或在其中一个现有 IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 54 ENO 状态

ENO 说明
1 无错误
0 仅适用于 Real 数据类型:

一个或多个输入不是实数 (NaN)。

结果 OUT 为 +/- INF(无穷大)。

Limit 指令

表格 7- 55 LIMIT 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-319 LIMIT(MN:=_variant_in_, IN:=_variant_in_, MX:=_variant_in_, OUT:=_variant_out_); Limit 指令用于测试参数 IN 的值是否在参数 MIN 和 MAX and if not, clamps the value at MIN or MAX. 指定的值范围内

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 56 参数的数据类型

参数 数据类型 1 说明
MN, IN 和 MX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, 常数 数学运算输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 数学运算输出

1 参数 MN、IN、MX 和 OUT 的数据类型必须相同。

如果参数 IN 的值在指定的范围内,则 IN 的值将存储在参数 OUT 中。 如果参数 IN 的值超出指定的范围,则 OUT 值为参数 MIN 的值(如果 IN 值小于 MIN 值)或参数 MAX 的值(如果 IN 值大于 MAX 值)。

表格 7- 57 ENO 状态

ENO 说明
1 无错误
0 Real: 如果 MIN、IN 和 MAX 的一个或多个值是 NaN(不是数字),则返回 NaN。
0 如果 MIN 大于 MAX,则将值 IN 分配给 OUT。

SCL 示例:

MyVal := LIMIT(MN:=10,IN:=53, MX:=40); //结果: MyVal = 40

MyVal := LIMIT(MN:=10,IN:=37, MX:=40); //结果: MyVal = 37

MyVal := LIMIT(MN:=10,IN:=8, MX:=40); //结果: MyVal = 10

浮点型算术运算指令

使用浮点指令可编写使用 Real 或 LReal 数据类型的数学运算程序:

SQR: 平方 (IN 2 = OUT)

SQRT: 平方根 (√IN = OUT)

LN: 自然对数 (LN(IN) = OUT)

EXP: 自然指数 (e IN =OUT),其中底数 e = 2.71828182845904523536

EXPT: 一般指数 (IN1 IN2 = OUT)

EXPT 参数 IN1 和 OUT 的数据类型始终相同,必须为其选择 Real 或 LReal 类型。 可以从众多数据类型中为指数参数 IN2 选择数据类型。

FRAC: 分数(浮点数 IN 的小数部分 = OUT)

SIN: 正弦 (sin(IN 弧度) = OUT)

ASIN: 反正弦 (arcsine(IN) = OUT 弧度),其中 sin(OUT 弧度) = IN

COS: 余弦 (cos(IN 弧度) = OUT)

ACOS: 反余弦 (arccos(IN) = OUT 弧度),其中 cos(OUT 弧度) = IN

TAN: 正切 (tan(IN 弧度) = OUT)

ATAN: 反正切 (arctan(IN) = OUT 弧度),其中 tan(OUT 弧度) = IN

表格 7- 58 浮点型数学运算指令示例

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-320 out

out

:=

:=

SQR(in);

in * in;

平方: IN 2 = OUT

例如: 如果 IN = 9,则 OUT = 81。

s7一1200功能指令表 基本指令-321 out := in1 ** in2; 普通指数: IN1 IN2 = OUT

例如: 如果 IN1 = 3 且 IN2 = 2,则 OUT = 9。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

2 对于 SCL: 还可以使用基本的 SCL 数学运算符来创建数学表达式。

表格 7- 59 参数的数据类型

参数 数据类型 说明
IN, IN1 Real, LReal, Constant 输入
IN2 SInt, Int, DInt, USInt, UInt,UDInt, Real, LReal, Constant EXPT 指数输入
OUT Real, LReal 输出

表格 7- 60 ENO 状态

ENO 指令 条件 结果 (OUT)
1 全部 无错误 有效结果
0 SQR 结果超出有效 Real/LReal 范围 +INF
IN 为 +/- NaN(不是数字) +NaN
SQRT IN 为负数 -NaN
ENO 指令 条件 结果 (OUT)
IN 为 +/- INF(无穷大)或 +/- NaN +/- INF 或 +/- NaN
LN IN 为 0.0、负数、-INF 或 -NaN -NaN
IN 为 +INF 或 +NaN +INF 或 +NaN
EXP 结果超出有效 Real/LReal 范围 +INF
IN 为 +/- NaN +/- NaN
SIN, COS, TAN IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN
ASIN, ACOS IN 超出 -1.0 到 +1.0 的有效范围 +NaN
IN 为 +/- NaN +/- NaN
ATAN IN 为 +/- NaN +/- NaN
FRAC IN 为 +/- INF 或 +/- NaN +NaN
EXPT IN1 为 +INF 且 IN2 不是 -INF +INF
IN1 为负数或 -INF 如果 IN2 为 Real/LReal, 则为 +NaN,

否则为 -INF

IN1 或 IN2 为 +/- NaN +NaN
IN1 为 0.0 且 IN2 为 Real/LReal(只能为Real/LReal) +NaN

移动

移动和块移动指令

使用移动指令可将数据元素复制到新的存储器地址并从一种数据类型转换为另一种数据类型。 移动过程不会更改源数据。

MOVE 指令用于将单个数据元素从参数 IN 指定的源地址复制到参数 OUT 指定的目标地址。

MOVE_BLK 和 UMOVE_BLK 指令具有附加的 COUNT 参数。 COUNT 指定要复制的数据元素个数。 每个被复制元素的字节数取决于 PLC 变量表中分配给 IN 和 OUT 参数变量名称的数据类型。

表格 7- 61 MOVE、MOVE_BLK 和 UMOVE_BLK 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-322 out1 := in; 将存储在指定地址的数据元素复制到新地址或多个地址。1
s7一1200功能指令表 基本指令-323 MOVE_BLK(

in:=_variant_in, count:=_uint_in,

out=>_variant_out);

将数据元素块复制到新地址的可中断移动。
s7一1200功能指令表 基本指令-324 UMOVE_BLK(

in:=_variant_in, count:=_uint_in,

out=>_variant_out);

将数据元素块复制到新地址的不可中断移动。

1 MOVE 指令: 要在 LAD 或 FBD 中添加其它输出,请单击输出参数旁的“创建”(Create) 图标。 对于 SCL,请使用多个赋值语句。 还可以使用任一循环结构。

表格 7- 62 MOVE 指令的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Char, Array, Struct, DTL, Time 源地址
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Char, Array, Struct, DTL, Time 目标地址

s7一1200功能指令表 基本指令-325 要添加 MOVE 输出,请单击“创建”(Create) 图标,或右键单击现有 OUT 参数之一的输出短线,并选择“插入输出”(Insert output) 命令。

要删除输出,请在其中一个现有 OUT 参数(多于两个原始输出时)的输出短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 63 MOVE_BLK 和 UMOVE_BLK 指令的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal Byte, Word, DWord 源起始地址
COUNT UInt 要复制的数据元素数
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 目标起始地址

说明

数据复制操作规则

要复制 Bool 数据类型,请使用 SET_BF、RESET_BF、R、S 或 输出线圈 (LAD)

(页 180)

要复制单个基本数据类型,请使用 MOVE

要复制基本数据类型数组,请使用 MOVE_BLK 或 UMOVE_BLK

要复制结构,请使用 MOVE

要复制字符串,请使用 S_MOVE (页 266)

要复制字符串中的单个字符,请使用 MOVE

MOVE_BLK 和 UMOVE_BLK 指令不能用于将数组或结构复制到 I、Q 或 M 存储区。

MOVE_BLK 和 UMOVE_BLK 指令在处理中断的方式上有所不同:

在 MOVE_BLK 执行期间排队并处理中断事件。 在中断 OB 子程序中未使用移动目标地址的数据时,或者虽然使用了该数据,但目标数据不必一致时,使用 MOVE_BLK 指令。 如果 MOVE_BLK 操作被中断,则最后移动的一个数据元素在目标地址中是完整并且一致的。 MOVE_BLK 操作会在中断 OB 执行完成后继续执行。

在 UMOVE_BLK 完成执行前排队但不处理中断事件。 如果在执行中断 OB 子程序前移动操作必须完成且目标数据必须一致,则使用 UMOVE_BLK 指令。 更多信息,请参阅 数据一致性 (页 154)部分。

执行 MOVE 指令之后,ENO 始终为真。

表格 7- 64 ENO 状态

ENO 条件 结果
1 无错误 成功复制了全部的 COUNT 个元素。
0 源 (IN) 范围或目标 (OUT) 范围超出可用存储区。 复制适当的元素。 不复制部分元素。

FieldRead 和 FieldWrite 指令

说明

STEP 7 V10.5 不支持数组索引或多维数组形式的变量引用。 FieldRead 和 FieldWrite 指令曾用于为一维数组提供变量数组索引操作。 STEP 7 V11 支持数组索引和多维数组形式的变量。 STEP 7 V11 中包含了 FieldRead 和 FieldWrite,以便向后兼容使用了这两个指令的程序。

表格 7- 65 FieldRead 和 FieldWrite 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-326 value := member[index]; FieldRead 用于从第一个元素由 MEMBER 参数指定的数组中读取索引值为 INDEX 的数组元素。 数组元素的值将传送到 VALUE 参数指定的位置。
s7一1200功能指令表 基本指令-327 member[index] :

= value;

WriteField 用于将 VALUE 参数指定的位置上的值传送给第一个元素由 MEMBER 参数指定的数组。 该值将传送给由 INDEX 参数指定数组索引的数组元素。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 66 参数的数据类型

参数和类型 数据类型 说明
Index 输入 DInt 要读取或写入的数组元素的索引号
Member 1 输入 数组元素类型:

Bool、Byte、Word、DWord、

Char、SInt、Int、Dint、USInt、UInt、UDInt、Real、LReal

在全局数据块或块接口中定义的一维数组的第一个元素的位置。

例如: 如果将数组索引指定为 [-2..4], 则第一个元素的索引为 -2,而不是 0。

值 1 输出 Bool、Byte、Word、DWord、

Char、SInt、Int、Dint、USInt、

UInt、UDInt、Real、LReal

将指定的数组元素复制到的位置

(FieldRead)

被复制到指定的数组元素的值的位置

(FieldWrite)

1 MEMBER 参数和 VALUE 参数指定的数组元素的数据类型必须相同。

如果满足下列条件之一,则使能输出 ENO = 0:

EN 输入的信号状态为“0”

在 MEMBER 参数引用的数组中未定义 INDEX 参数指定的数组元素

处理过程中发生溢出之类的错误

通过数组索引访问数据

要通过变量访问数组中的元素,仅需在程序逻辑中将该变量用作数组索引即可。 例如, 以下程序段中通过 PLC 变量“Index”引用的“Data_block_1”内布尔数组的布尔值来设置输出。

s7一1200功能指令表 基本指令-328

使用变量数组索引的逻辑结构与之前使用 FieldRead 指令的方法相同:

s7一1200功能指令表 基本指令-329

可以使用变量数组索引逻辑替换 FieldWrite 和 FieldRead 指令。

SCL 中没有 FieldRead 或 FieldWrite 指令,但支持通过变量对数组进行间接寻址:

#Tag_1 := "Data_block_1".Bool_Array[#Index];

填充指令

表格 7- 67 FILL_BLK 和 UFILL_BLK 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-330 FILL_BLK(

in:=_variant_in, count:=int,

out=>_variant_out);

可中断填充指令: 使用指定数据元素的副本填充地址范围
s7一1200功能指令表 基本指令-331 UFILL_BLK(

in:=_variant_in, count:=int out

=>_variant_out);

不中断填充指令: 使用指定数据元素的副本填充地址范围

表格 7- 68 参数的数据类型

参数 数据类型 说明
IN SInt, Int, DIntT, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 数据源地址
COUNT USInt, UInt 要复制的数据元素数
OUT SInt, Int, DIntT, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord 数据目标地址

说明

数据填充操作规则

要使用 BOOL 数据类型填充,请使用 SET_BF、RESET_BF、R、S 或输出线圈

(LAD)

要使用单个基本数据类型填充,请使用 MOVE

要使用基本数据类型填充数组,请使用 FILL_BLK 或 UFILL_BLK

要填充字符串中的单个字符,请使用 MOVE

FILL_BLK 和 UFILL_BLK 指令不能用于将数组填充到 I、Q 或 M 存储区。

FILL_BLK 和 UFILL_BLK 指令可将源数据元素 IN 复制到通过参数 OUT 指定初始地址的目标中。 复制过程不断重复并填充相邻的一组地址,直到副本数等于 COUNT 参数。

FILL_BLK 和 UFILL_BLK 指令在处理中断的方式上有所不同:

在 FILL_BLK 执行期间排队并处理中断事件。 在中断 OB 子程序中未使用移动目标地址的数据时,或者虽然使用了该数据,但目标数据不必一致时,使用 FILL_BLK 指令。

在 UFILL_BLK 完成执行前排队但不处理中断事件。 如果在执行中断 OB 子程序前移动操作必须完成且目标数据必须一致,则使用 UFILL_BLK 指令。

表格 7- 69 ENO 状态

ENO 条件 结果
1 无错误 IN 元素成功复制到全部的 COUNT 个目标中。
0 目标 (OUT) 范围超出可用存储区 复制适当的元素。 不复制部分元素。

交换指令

表格 7- 70 SWAP 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-332 out := SWAP(in); 用于反转二字节和四字节数据元素的字节顺序。 不改变每个字节中的位顺序。 执行 SWAP 指令之后,ENO 始终为 TRUE。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 71 参数的数据类型

参数 数据类型 说明
IN Word, DWord 有序数据字节 IN
OUT Word, DWord 反转有序数据字节 OUT
示例 1 参数 IN = MB0

(执行前)

参数 OUT = MB4,

(执行后)

地址 MB0 MB1 MB4 MB5
W#16#1234 12 34 34 12
WORD MSB LSB MSB LSB

示例 2 参数 IN = MB0

(执行前)

参数 OUT = MB4,

(执行后)

地址 MB0 MB1 MB2 MB3 MB4 MB5 MB6 MB7
DW#16# 12345678 12 34 56 78 78 56 34 12
DWORD MSB LSB MSB LSB

转换

CONV 指令

表格 7- 72 转换 (CONV) 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-333 out := <data type in>_TO_<data type out>(in); 将数据元素从一种数据类型转换为另一种数据类型。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

2 对于 SCL:通过识别输入参数 (in) 和输出参数 (out) 的数据类型来构造转换指令。例如,DWORD_TO_REAL 将 DWord 值转换为 Real 值。

表格 7- 73 参数的数据类型

参数 数据类型 说明
IN 位串 1,SInt, USInt, Int, UInt, DInt, UDInt, Real, LReal, BCD16, BCD32 输入值
OUT 位串 1,SInt, USInt, Int, UInt, DInt, UDInt, Real, LReal, BCD16, BCE32 转换为新数据类型的输入值

1 该指令不允许您选择位串(Byte、Word、DWord)。 要为指令参数输入数据类型 Byte、Word 或 DWord 的操作数,选择位长度相同的无符号整型。 例如 为 Byte 选择 USInt、为 Word 选择 UInt 或为 DWord 选择

UDInt。

选择(转换源)数据类型之后,(转换目标)下拉列表中将显示可能的转换项列表。 与

BCD16 进行转换仅限于 Int 数据类型。 与 BCD32 进行转换仅限于 DInt 数据类型。

表格 7- 74 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN
0 结果超出 OUT 数据类型的有效范围 OUT 被设置为 IN 的最低有效字节

SCL 的转换指令

SCL 的转换指令

表格 7- 75 从 Bool、Byte、Word 或 DWord 进行转换

数据类型 指令 结果
Bool BOOL_TO_BYTE, BOOL_TO_WORD, BOOL_TO_DWORD, BOOL_TO_INT, BOOL_TO_DINT 值被传送到目标数据类型的最低有效位。
Byte BYTE_TO_BOOL 最低位被传送到目标数据类型。
BYTE_TO_WORD, BYTE_TO_DWORD 值被传送到目标数据类型的低位字节。
BYTE_TO_SINT, BYTE_TO_USINT 值被传送到目标数据类型。
BYTE_TO_INT, BYTE_TO_UINT, BYTE_TO_DINT, BYTE_TO_UDINT 值被传送到目标数据类型的最低有效字节。
Word WORD_TO_BOOL 最低位被传送到目标数据类型。
WORD_TO_BYTE 源值的低位字节被传送到目标数据类型。
WORD _TO_DWORD 值被传送到目标数据类型的低位字节。
WORD _TO_SINT, WORD _TO_USINT 源值的低位字节被传送到目标数据类型。
WORD _TO_INT, WORD _TO_UINT 值被传送到目标数据类型。
WORD _TO_DINT, WORD _TO_UDINT 值被传送到目标数据类型的低位字节。
DWord DWORD_TO_BOOL 最低位被传送到目标数据类型。
DWORD_TO_BYTE, DWORD_TO_WORD, DWORD_TO_SINT, DWORD_TO_USINT, DWORD_TO_INT, DWORD_TO_UINT 源值的低位字节被传送到目标数据类型。
DWORD_TO_DINT, DWORD_TO_UDINT,

DWORD_TO_REAL

值被传送到目标数据类型。

表格 7- 76 从短整型(SInt 或 USInt)进行转换

数据类型 指令 结果
SInt SINT_TO_BOOL 最低位被传送到目标数据类型。
SINT_TO_BYTE 值被传送到目标数据类型
SINT_TO_WORD, SINT_TO_DWORD, SINT_TO_INT, SINT_TO_DINT 值被传送到目标数据类型的低位字节。
数据类型 指令 结果
SINT_TO_USINT, SINT_TO_UINT, SINT_TO_UDINT, SINT_TO_REAL, SINT_TO_LREAL, SINT_TO_CHAR, SINT_TO_STRING 值被转换。
USInt USINT_TO_BOOL 最低位被传送到目标数据类型。
USINT_TO_BYTE 值被传送到目标数据类型
USINT_TO_WORD, USINT_TO_DWORD, USINT_TO_INT, USINT_TO_UINT, USINT_TO_DINT, USINT_TO_UDINT 值被传送到目标数据类型的低位字节。
USINT_TO_SINT, USINT_TO_REAL,

USINT_TO_LREAL, USINT_TO_CHAR, USINT_TO_STRING

值被转换。

表格 7- 77 从整型(Int 或 UInt)进行转换

数据类型 指令 结果
Int INT_TO_BOOL 最低位被传送到目标数据类型。
INT_TO_BYTE, INT_TO_DWORD, INT_TO_SINT, INT_TO_USINT, INT_TO_UINT, INT_TO_UDINT, INT_TO_REAL, INT_TO_LREAL, INT_TO_CHAR, INT_TO_STRING 值被转换。
INT_TO_WORD 值被传送到目标数据类型。
INT_TO_DINT 值被传送到目标数据类型的低位字节。
UInt UINT_TO_BOOL 最低位被传送到目标数据类型。
UINT_TO_BYTE, UINT_TO_SINT, UINT_TO_USINT, UINT_TO_INT, UINT_TO_REAL, UINT_TO_LREAL, UINT_TO_CHAR, UINT_TO_STRING 值被转换。
UINT_TO_WORD, UINT_TO_DATE 值被传送到目标数据类型。
UINT_TO_DWORD, UINT_TO_DINT, UINT_TO_UDINT 值被传送到目标数据类型的低位字节。

表格 7- 78 从双整型(Dint 或 UDInt)进行转换

数据类型 指令 结果
DInt DINT_TO_BOOL 最低位被传送到目标数据类型。
DINT_TO_BYTE, DINT_TO_WORD, DINT_TO_SINT, DINT_TO_USINT, DINT_TO_INT, DINT_TO_UINT, DINT_TO_UDINT, DINT_TO_REAL, DINT_TO_LREAL, DINT_TO_CHAR, DINT_TO_STRING 值被转换。
DINT_TO_DWORD, DINT_TO_TIME 值被传送到目标数据类型。
UDInt UDINT_TO_BOOL 最低位被传送到目标数据类型。
UDINT_TO_BYTE, UDINT_TO_WORD, UDINT_TO_SINT, UDINT_TO_USINT, UDINT_TO_INT, UDINT_TO_UINT, UDINT_TO_DINT, UDINT_TO_REAL, UDINT_TO_LREAL, UDINT_TO_CHAR, UDINT_TO_STRING 值被转换。
UDINT_TO_DWORD, UDINT_TO_TOD 值被传送到目标数据类型。

表格 7- 79 从实数(Real 或 LReal)进行转换

数据类型 指令 结果
Real REAL_TO_DWORD, REAL_TO_LREAL 值被传送到目标数据类型。
REAL_TO_SINT, REAL_TO_USINT, REAL_TO_INT, REAL_TO_UINT, REAL_TO_DINT, REAL_TO_UDINT, REAL_TO_STRING 值被转换。
LReal LREAL_TO_SINT, LREAL_TO_USINT, LREAL_TO_INT, LREAL_TO_UINT, LREAL_TO_DINT, LREAL_TO_UDINT, LREAL_TO_REAL, LREAL_TO_STRING 值被转换。

表格 7- 80 从 Time、DTL、TOD 或 Date 进行转换

数据类型 指令 结果
Time TIME_TO_DINT 值被传送到目标数据类型。
DTL DTL_TO_DATE, DTL_TO_TOD 值被转换。
TOD TOD_TO_UDINT 值被转换。
Date DATE_TO_UINT 值被转换。

表格 7- 81 从 Char 或 String 进行转换

数据类型 指令 结果
Char CHAR_TO_SINT, CHAR_TO_USINT, CHAR_TO_INT, CHAR_TO_UINT, CHAR_TO_DINT, CHAR_TO_UDINT 值被转换。
CHAR_TO_STRING 值被传送到字符串的第一个字符。
String STRING_TO_SINT, STRING_TO_USINT, STRING_TO_INT, STRING_TO_UINT, STRING_TO_DINT, STRING_TO_UDINT, STRING_TO_REAL, STRING_TO_LREAL 值被转换。
STRING_TO_CHAR 字符串的第一个字符被复制到 Char。

取整和截取指令

表格 7- 82 ROUND 和 TRUNC 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-334 out := ROUND (in); 将实数转换为整数。 默认数据类型为 DINT。 当输出为除 DINT 以外的有效数据类型时,必须显式声明;例如,ROUND_REAL 或 ROUND_LREAL。

实数的小数部分舍入为最接近的整数值(IEEE - 舍入为最接近值)。 如果该数值刚好是两个连续整数的一半(例如,10.5), 则将其取整为偶数。 例如:

ROUND (10.5) = 10

ROUND (11.5) = 12

s7一1200功能指令表 基本指令-335 out := TRUNC(in); TRUNC 用于将实数转换为整数。 实数的小数部分被截成零

(IEEE - 取整为零)。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

表格 7- 83 参数的数据类型

参数 数据类型 说明
IN Real, LReal 浮点型输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 取整或截取后的输出

表格 7- 84 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN

上取整和下取整指令

表格 7- 85 CEIL 和 FLOOR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-336 out := CEIL(in); 将实数(Real 或 LReal)转换为大于或等于所选实数的最小整数(IEEE“向正无穷取整”)。
s7一1200功能指令表 基本指令-337 out := FLOOR(in); 将实数(Real 或 LReal)转换为小于或等于所选实数的最大整数(IEEE“向负无穷取整”)。

1 对于 LAD 和 FBD: 单击“???” (指令名称旁),并从下拉菜单中选择数据类型。

表格 7- 86 参数的数据类型

参数 数据类型 说明
IN Real, LReal 浮点型输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 转换后的输出

表格 7- 87 ENO 状态

ENO 说明 结果 (OUT)
1 无错误 有效结果
0 IN 为 +/- INF 或 +/- NaN +/- INF 或 +/- NaN

标定和标准化指令

表格 7- 88 SCALE_X 和 NORM_X 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-338 out :=SCALE_X(min:=_in_,

value:=_in_, max:=_in_);

按参数 MIN 和 MAX 所指定的数据类型和值范围对标准化的实参数 VALUE(其中,

0.0 <= VALUE <= 1.0)进行标定:

OUT = VALUE (MAX - MIN) + MIN

s7一1200功能指令表 基本指令-339 out :=NORM_X(min:=_in_,

value:=_in_, max:=_in_);

标准化通过参数 MIN 和 MAX 指定的值范围内的参数 VALUE:

OUT = (VALUE - MIN) / (MAX - MIN), 其中 (0.0 <= OUT <= 1.0)

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 89 参数的数据类型

参数 数据类型 1 说明
MIN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 输入范围的最小值
VALUE SCALE_X: Real, LReal

NORM_X: SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal

要标定或标准化的输入值
MAX SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 输入范围的最大值
OUT SCALE_X: SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal

NORM_X: Real, LReal

标定或标准化后的输出值

1 对于 SCALE_X: 参数 MIN、MAX 和 OUT 的数据类型必须相同。对于 NORM_X: 参数 MIN、VALUE 和 MAX 的数据类型必须相同。

说明

SCALE_X 参数 VALUE 应限制为 (0.0 <= VALUE <= 1.0)

如果参数 VALUE 小于 0.0 或大于 1.0:

线性标定运算会生成一些小于 MIN 参数值或大于 MAX 参数值的 OUT 值,作为 OUT

值,这些数值在 OUT 数据类型值范围内。此时,SCALE_X 执行会设置 ENO =

TRUE。

还可能会生成一些不在 OUT 数据类型值范围内的标定数值。 此时,OUT 参数值会被设置为一个中间值,该中间值等于被标定实数在最终转换为 OUT 数据类型之前的最低有效部分。在这种情况下,SCALE_X 执行会设置 ENO = FALSE。

NORM_X 参数 VALUE 应限制为 (MIN <= VALUE <= MAX)

如果参数 VALUE 小于 MIN 或大于 MAX,线性标定运算会生成小于 0.0 或大于 1.0 的标准化 OUT 值。 在这种情况下,NORM_X 执行会设置 ENO = TRUE。

表格 7- 90 ENO 状态

ENO 条件 结果 (OUT)
1 无错误 有效结果
0 结果超出 OUT 数据类型的有效范围 中间结果: 实数在最终转换为 OUT 数据类型前的最低有效部分。
0 参数 MAX <= MIN SCALE_X:用实数 VALUE 的最低有效部分填充

OUT 大小。

NORM_X:扩展 VALUE 数据类型的 VALUE 来填充双字大小。

0 参数 VALUE = +/- INF 或 +/- NaN VALUE 写入 OUT

示例 (LAD): 标准化和标定模拟量输入值

来自电流输入型模拟量信号模块或信号板的模拟量输入的有效值在 0 到 27648 范围内。

假设模拟量输入代表温度,其中模拟量输入值 0 表示 -30.0 摄氏度,27648 表示 70.0 摄氏度。

要将模拟值转换为对应的工程单位,应将输入标准化为 0.0 到 1.0 之间的值,然后再将其

标定为 -30.0 到 70.0 之间的值。 结果值是用模拟量输入(以摄氏度为单位)表示的温度:

s7一1200功能指令表 基本指令-340

请注意,如果模拟量输入来自电压型模拟量信号模块或信号板,则 NORM_X 指令的 MIN

值是 -27648,而不是 0。

示例 (LAD): 标准化和标定模拟量输出值

要在电流输出型模拟量信号模块或信号板中设置的模拟量输出的有效值必须在 0 到

27648 范围内。 假设模拟量输出表示温度设置,其中模拟量输入值 0 表示 -30.0 摄氏

度,27648 表示 70.0 摄氏度。要将存储器中的温度值(范围是 -30.0 到 70.0)转换为 0

到 27648 范围内的模拟量输出值,必须将以工程单位表示的值标准化为 0.0 到 1.0 之间

的值,然后将其标定为 0 到 27648 范围内的模拟量输出值:

s7一1200功能指令表 基本指令-341

请注意,如果模拟量输出应用到电压型模拟量信号模块或信号板,则 SCALE_X 指令的

MIN 值是 -27648,而不是 0。

有关电压和电流形式的 模拟量输出表示法 (页 845)和 模拟量输出表示法 (页 846)的详细信息,请参见技术规范。

程序控制

SCL 程序控制语句概述

结构化控制语言 (SCL, Structured Control Language) 提供三类用于结构化用户程序的程序控制语句:

选择语句: 选择语句可将程序执行转移到备选语句序列。

循环: 可以使用迭代语句控制循环执行。 迭代语句指定应根据某些条件重复执行的程序部分。

程序跳转: 程序跳转是指立刻跳转到特定的跳转目标,因而跳转到同一块内的其它语句。

这些程序控制语句都使用 PASCAL 编程语言的语法。

表格 7- 91 SCL 程序控制语句类型

程序控制语句 说明
选择 IF-THEN 语句

(页 230)

用将程序执行转移到两个备选分支之一(取决于条件为 TRUE

还是 FALSE)

CASE 语句 (页 231) 用于选择执行 n 个备选分支之一(取决于变量值)
循环 FOR 语句 (页 232) 只要控制变量在指定值范围内,就重复执行某一语句序列
WHILE-DO 语句

(页 233)

只要仍满足执行条件,就重复执行某一语句序列
REPEAT-UNTIL 语句

(页 234)

重复执行某一语句序列,直到满足终止条件为止
程序跳转 CONTINUE 语句

(页 235)

停止执行当前循环迭代
EXIT 语句 (页 236) 无论是否满足终止条件,都会随时退出循环
GOTO 语句 (页 236) 使程序立即跳转到指定标签
IF-THEN 语句

(页 230)

使程序立刻退出正在执行的块,返回到调用块

参见

RETURN 语句 (页 237)

IF-THEN 语句

IF-THEN 语句是条件语句,可控制程序流,根据逻辑表达式的 Bool 值的结果决定是否执行一组语句。 您还可以使用括号嵌套或结构化多条 IF-THEN 语句的执行。

表格 7- 92 IF-THEN 语句的元素

SCL 说明
IF "condition" THEN statement_A; statement_B; statement_C;

;

如果“condition”为 TRUE 或 1,则执行后面的语句,直到遇到

END_IF 语句为止。

如果“condition”为 FALSE 或 0,则跳转到 END_IF 语句(除非程序包含可选的 ELSIF 或 ELSE 语句)。

[ELSIF "condition-n" THEN statement_N;

;]

可选的 ELSEIF1 语句提供其它要评估的条件。 例如: 如果 IF-

THEN 语句中的“condition”为 FALSE,则程序将评估“condition-

n”。 如果“condition-n”为 TRUE,则执行“statement_N”。

[ELSE

statement_X;

;]

可选的 ELSE 语句提供 IF-THEN 语句的“condition”为 FALSE 时将要执行的语句。
END_IF; END_IF 语句用于终止 IF-THEN 指令。

1 可以在一条 IF-THEN 语句中包含多条 ELSIF 语句。

表格 7- 93 IF-THEN 语句的变量

变量 说明
“condition” 必需。 逻辑表达式为 TRUE (1) 或 FALSE (0)。
“statement_A” 可选。 “condition”为 TRUE 时要执行的一条或多条语句。
“condition-n” 可选。 可选 ELSIF 语句要评估的逻辑表达式。
“statement_N” 可选。 ELSIF 语句的“condition-n”为 TRUE 时要执行的一条或多条语句。
“statement_X” 可选。 IF-THEN 语句的“condition”为 FALSE 时要执行的一条或多条语句。

IF 语句按照下列规则执行:

执行第一个逻辑表达式为 TRUE 的语句序列。 不执行其余语句序列。

如果无布尔型表达式为 TRUE,则执行 ELSE 引入的语句序列(或者,如果 ELSE 分支不存在,则不执行语句序列)。

不限制 ELSIF 语句的数量。

说明

与 IF 语句相比,使用一个或多个 ELSIF 分支存在一定的优势,就是不用再评估有效表达式后面的逻辑表达式。 从而,可缩短程序的运行时间。

CASE 语句

表格 7- 94 CASE 语句的元素

SCL 说明
CASE "Test_Value" OF

"ValueList": Statement[; Statement, ...] "ValueList": Statement[; Statement, ...]

[ELSE

Else-statement[; Else-statement, ...]] END_CASE;

CASE 语句根据表达式的值来选择执行多组语句中的一组。

表格 7- 95 参数

参数 说明
“Test_Value” 必需。 任何 Int 数据类型的数字表达式
“ValueList” 必需。 单个值、或逗号分隔的值或值范围的列表。 (使用两个句点定义值范围: 2..8)下例说明了不同变型的值列表:

1: Statement_A;

2, 4: Statement _B;

3, 5..7,9: Statement _C;

Statement 必需。 “Test_Value”与值列表中任何一个值匹配时执行的一条或多条语句
Else-statement 可选。 与“ValueList”中的任何一个值都不匹配时执行的一条或多条语句

CASE 语句按照下列规则执行:

选择表达式必须返回一个 Int 类型的值。

处理 CASE 语句时,程序会检查选择表达式的值是否包含在指定的值列表中。 如果找到匹配项,则执行分配给该列表的语句成分。

如果未找到匹配项,则执行 ELSE 后面的程序段,如果不存在 ELSE 分支,则不执行任何语句。

CASE 语句可以嵌套使用。 每个嵌套的 CASE 语句必须具有相关联的 END_CASE 语句。

CASE var1 OF

1 : var2 := "A";

2 : var2 := "B";

ELSE

CASE var3 OF

65..90: var2 := "UpperCase"; 97..122: var2 := "LowerCase";

ELSE

var2:= "SpecialCharacter";

END_CASE; END_CASE;

FOR 语句

表格 7- 96 FOR 语句的元素

SCL 说明
FOR "control_variable" := "begin" TO "end" [BY "increment"] DO

statement;

; END_FOR;

FOR 语句用于在控制变量处于指定的值范围内时重复执行某一语句序列。 使用 FOR 定义循环时需要指定初始值和最终值。 这

两个值的数据类型必须与控制变量的相同。

表格 7- 97 参数

参数 说明
“control_variable” 必需。 整型(Int 或 DInt),用作循环计数器
“begin” 必需。 指定控制变量初始值的简单表达式
参数 说明
“end” 必需。 确定控制变量最终值的简单表达式
“increment” 可选。 每次循环后“control variable”的变化量。 “increment”与“control variable”

具有相同的数据类型。 如果未指定“increment”的值,则每次循环之后,运行变量的值加 1。不能在执行 FOR 语句期间更改“increment”。

FOR 语句的执行方式如下:

循环开始时,控制变量设置为初始值(初始分配),每次重复进行循环时,控制变量会增加指定增量(正增量)或减少指定增量(负增量),直至达到最终值。

每次执行完循环之后,会检查该条件(达到最终值)以确定是否满足该条件。 如果满足条件,则执行语句序列,否则将跳过该循环及其语句序列。

定义 FOR 语句的规则:

控制变量的数据类型只能是 Int 或 DInt。

可以省略语句 BY [increment]。 如果未指定增量,则自动默认为 +1。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句将执行紧随 END_FOR 语句之后的语句。

使用 CONTINUE 语句 (页 235) 可跳过某个 FOR 循环的后续语句,并继续执行循环,同时检查是否满足终止条件。

WHILE-DO 语句

表格 7- 98 WHILE 语句

SCL 说明
WHILE "condition" DO Statement; Statement;

...;

END_WHILE;

WHILE 语句执行一系列语句,直到给定条件为 TRUE。

可以嵌套使用 WHILE 循环。 END_WHILE 语句与最后执行的 WHILE 指令配对。

表格 7- 99 参数

参数 说明
“condition” 必需。 值为 TRUE 或 FALSE 的逻辑表达式。 (“null”条件被视为 FALSE。)
Statement 可选。 在条件值为 TRUE 之前执行的一条或多条语句。

说明

WHILE 语句先评估“condition”的状态,然后执行语句。 要执行语句一次或多次而不考虑

“condition”的状态,请使用 REPEAT 语句。

WHILE 语句按照下列规则执行:

每次循环执行循环体之前,评估执行条件。

只要执行条件的值为 TRUE,就重复执行 DO 后面的循环体。

一旦值变为 FALSE,则立即跳过循环,去执行循环后面的语句。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句执行紧跟 END_WHILE 语句的语句

使用 CONTINUE 语句可跳过 WHILE 循环后面的语句,并在检查是否满足终止条件后决定是否继续执行循环。

REPEAT-UNTIL 语句

表格 7- 100 REPEAT 指令

SCL 说明
REPEAT

Statement;

;

UNTIL “condition” END_REPEAT;

REPEAT 语句执行一组语句,直到给定条件为 TRUE。

可以嵌套使用 REPEAT 循环。 END_REPEAT 语句始终与最后执行的

Repeat 指令配对。

表格 7- 101 参数

参数 说明
Statement 可选。 在条件值为 TRUE 之前执行的一条或多条语句。
“condition” 必需。 一个或多个用以下两种方式表达的表达式: 值为 TRUE 或 FALSE 的数字表达式或字符串表达式。 “null”条件被视为 FALSE。

说明

在循环的首次迭代过程中,REPEAT 语句在执行相关语句(即使“condition”为 FALSE) 后评估“condition”的状态。 要在执行这些语句前查看“condition”的状态,请使用 WHILE 语句。

要结束循环而不考虑“condition”表达式的状态,请使用 EXIT 语句 (页 236)。 EXIT 语句执行紧跟 END_REPEAT 语句的语句

使用 CONTINUE 语句 (页 235) 可跳过某个 REPEAT 循环的后续语句,并继续执行循环,同时检查是否满足终止条件。

CONTINUE 语句

表格 7- 102 CONTINUE 语句

SCL 说明
CONTINUE

Statement;

;

CONTINUE 语句跳过程序循环(FOR、WHILE、REPEAT)后面的语句,并在检查是否满足终止条件后决定是否继续执行循环。 如果不满足,则继续执

行循环。

CONTINUE 语句按照下列规则执行:

该语句立即终止循环体的执行。

根据是否满足重复执行循环的条件,决定是再次执行循环体还是退出迭代语句而去执行紧随其后的语句。

在 FOR 语句中,在执行 CONTINUE 语句后控制变量立即增加指定的增量。

只能在循环中使用 CONTINUE 语句。 在嵌套循环中,CONTINUE 总是立即指向包含它的循环。 CONTINUE 通常与 IF 语句一起使用。

如果要退出循环而不考虑终止测试情况,请使用 EXIT 语句。

下例说明了使用 CONTINUE 语句来避免计算值的百分数时发生被 0 除的错误:

FOR x = 0 TO 10 DO

IF value[i] = 0 THEN CONTINUE; END_IF;

p := part / value[i] * 100; s := INT_TO_STRING(p);

percent=CONCAT(IN1:=s, IN2:="%"); END_FOR;

EXIT 语句

表格 7- 103 EXIT 指令

SCL 说明
EXIT; EXIT 语句用于随时退出循环(FOR、WHILE 或 REPEAT),而不考虑是否满足终止条件。

EXIT 语句按照下列规则执行:

该语句会立即退出该退出语句所处的重复语句。

继续执行该循环后面(例如 END_FOR 之后)的程序。

在循环中使用 EXIT 语句。 在嵌套循环中,EXIT 语句将处理权返回到下一更高嵌套级。

FOR i = 0 TO 10 DO

CASE 值[i, 0] OF

1..10: 值 [i, 1]:="A";

11..40: 值 [i, 1]:="B";

41..100: 值 [i, 1]:="C"; ELSE

EXIT;

END_CASE;

END_FOR;

GOTO 语句

表格 7- 104 GOTO 语句

SCL 说明
GOTO JumpLabel; Statement;

... ;

JumpLabel: Statement;

GOTO 语句通过跳转到同一块中的某个标签来跳过语句。

跳转标签(“JumpLabel”)和 GOTO 语句必须在同一个块中。 跳转标签的名称只能在块中分配一次。 每个跳转标签都可以是多条 GOTO 语句

的跳转目标。

不能跳转到循环部分(FOR、WHILE 或 REPEAT)。 可以在循环中进行跳转。

在以下示例中: 根据操作数“Tag_value”的值在对应跳转标签定义的位置继续执行程序。如果“Tag_value”等于 2,则会在跳转标签“MyLabel2”位置继续执行,并会跳过

“MyLabel1”。

CASE "Tag_value" OF

: GOTO MyLabel1;

: GOTO MyLabel2; ELSE GOTO MyLabel3; END_CASE;

MyLabel1: "Tag_1" := 1; MyLabel2: "Tag_2" := 1; MyLabel3: "Tag_4" := 1;

RETURN 语句

表格 7- 105 RETURN 指令

SCL 说明
RETURN; Return 指令用于无条件退出正在执行的代码块。 程序执行返回到调用块或操作系统

(退出 OB 时)。

RETURN 指令示例:

IF "Error" <> 0 THEN RETURN;

END_IF;

说明

执行最后一条指令后,代码块自动返回到调用块。 不要在代码块末尾插入 RETURN 指令。

跳转和标签指令

表格 7- 106 JMP、JMPN 和 LABEL 指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-342 s7一1200功能指令表 基本指令-343 请参见 GOTO (页 236)

语句。

如果有能流通过 JMP 线圈 (LAD),或者 JMP

功能框的输入为真 (FBD),则程序将从指定标签后的第一条指令继续执行。

s7一1200功能指令表 基本指令-344 s7一1200功能指令表 基本指令-345 如果没有能流通过 JMPN 线圈 (LAD),或者

JMPN 功能框的输入为假 (FBD),则程序将从指定标签后的第一条指令继续执行。

s7一1200功能指令表 基本指令-346 s7一1200功能指令表 基本指令-347 JMP 或 JMPN 跳转指令的目标标签。

1 通过在 LABEL 指令中直接键入来创建标签名称。 可以使用参数助手图标来选择 JMP 和 JMPN 标签名称字段可用的标签名称。 也可在 JMP 或 JMPN 指令中直接键入标签名称。

表格 7- 107 参数的数据类型

参数 数据类型 说明
Label_name 标签标识符 跳转指令以及相应跳转目标程序标签的标识符

各标签在代码块内必须唯一。

可以在代码块中进行跳转,但不能从一个代码块跳转到另一个代码块。

可以向前或向后跳转。

可以在同一代码块中从多个位置跳转到同一标签。

JMP_LIST 指令

表格 7- 108 JMP_LIST 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-348 CASE k OF

0: GOTO dest0;

1: GOTO dest1;

2: GOTO dest2; [n: GOTO destn;]

END_CASE;

JMP_LIST 指令用作程序跳转分配器,控制程序段的执行。 根据 K 输入的值跳转到相应的程序标签。 程序从目标跳转标签后面的程序指令继续执行。 如果 K 输入的值超过(标签数 - 1),则不进行跳转,继续处理下一程序段。

表格 7- 109 参数的数据类型

参数 数据类型 说明
K UInt 跳转分配器控制值
DEST0, DEST1, .., DESTn. 程序标签 与特定 K 参数值对应的跳转目标标签:

如果 K 的值等于 0,则跳转到分配给 DEST0 输出的程序标签。如果 K 的值等于 1,则跳转到分配给 DEST1 输出的程序标签, 以此类推。 如果 K 输入的值超过(标签数 - 1),则不进行跳

转,继续处理下一程序段。

对于 LAD 和 FBD: 在程序中第一次放置 JMP_LIST 功能框,该功能框有两个跳转标签输出。 可以添加或删除跳转目标。

s7一1200功能指令表 基本指令-349 单击功能框内的创建图标(位于最后一个 DEST 参数的左侧)可添加新的跳转标签输出。

s7一1200功能指令表 基本指令-350 右键单击输出短线,并选择“插入输出”(Insert ouput) 命令。

右键单击输出短线,并选择“删除”(Delete) 命令。

SWITCH 指令

表格 7- 110 SWITCH 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-351 不提供 SWITCH 指令用作程序跳转分配器,控制程序段的执行。 根据 K 输入的值与分配给指定比较输入的值的比较结果,跳转到与第一个为“真”的比较测试相对应的程序标

签。 如果比较结果都不为 TRUE,则跳转到分配给 ELSE

的标签。 程序从目标跳转标签后面的程序指令继续执行。

1 对于 LAD 和 FBD: 在功能框名称下方单击,并从下拉菜单中选择数据类型。

2 对于 SCL: 使用 IF-THEN 语句进行比较。

表格 7- 111 参数的数据类型

参数 数据类型 1 说明
K SInt、Int、DInt、USInt、UInt、

UDInt、Real、LReal、Byte、

Word、DWord、Time、TOD、Date

常用比较值输入
==, <>, <, <=, >.

>=

SInt、Int、DInt、USInt、UInt、

UDInt、Real、LReal、Byte、

Word、DWord、Time、TOD、Date

分隔比较值输入,获得特定比较类型
DEST0、DEST1,...,

DESTn。 ELSE

程序标签 与特定比较对应的跳转目标标签:

首先处理 K 输入下面的第一个比较输入,如果 K 值与该输入的比较结果为“真”,则跳转到分配给

DEST0 的标签。 下一比较测试使用接下来的下一个

输入,如果比较结果“真”,则跳转到分配给 DEST1

的标签。依次对其它比较进行类似的处理,如果比
较结果都不为“真”,则跳转到分配给 ELSE 输出的标
签。

1 K 输入和比较输入 (==, <>, <, <=, >, >=) 的数据类型必须相同。

添加输入、删除输入和指定比较类型

在程序中第一次放置 LAD 或 FBD SWITCH 功能框时,该功能框有两个比较输入。 可以分配比较类型以及添加输入/跳转目标,如下所示。

s7一1200功能指令表 基本指令-352 单击功能框内的比较运算符,并从下拉列表中选择新运算符。

s7一1200功能指令表 基本指令-353 单击功能框中的创建图标(位于最后一个 DEST 参数的左侧)可添加新的比较目标参数。

s7一1200功能指令表 基本指令-354 右键单击输入短线,并选择“插入输入”(Insert input) 命令。

右键单击输入短线并选择“删除”(Delete) 命令。

表格 7- 112 SWITCH 功能框数据类型和允许的比较运算

数据类型 比较 运算符语法
Byte、Word、DWord 等于 ==
不等于 <>
SInt、Int、DInt、USInt、

UInt、UDInt、Real、

LReal、Time、TOD、Date

等于 ==
不等于 <>
大于或等于 >=
小于或等于 <=
大于 >
小于 <

SWITCH 功能框放置规则

比较输入前可以不连接 LAD/FBD 指令。

由于没有 ENO 输出,因此,在一个程序段中只允许使用一条 SWITCH 指令,并且

SWITCH 指令必须是程序段中的最后一个运算。

RET 执行控制指令

可选的 RET 指令用于终止当前块的执行。 当且仅当有能流通过 RET 线圈 (LAD),或者当 RET 功能框的输入为真 (FBD) 时,则当前块的程序执行将在该点终止,并且不执行

RET 指令以后的指令。 如果当前块为 OB,则参数“Return_Value”将被忽略。 如果当前块为 FC 或 FB,则将参数“Return_Value”的值作为被调用功能框的 ENO 值传回到调用例程。

不要求用户将 RET 指令用作块中的最后一个指令;该操作是自动完成的。 一个块中可以有多个 RET 指令。

有关 SCL,请参见 RETURN (页 237) 语句。

表格 7- 113 Return_Value (RET) 执行控制指令

LAD FBD SCL 说明
s7一1200功能指令表 基本指令-355 s7一1200功能指令表 基本指令-356 RETURN; 终止当前块的执行

表格 7- 114 参数的数据类型

参数 数据类型 说明
Return_Value Bool RET 指令的“Return_value”参数被分配给调用块中块调用功能框的 ENO

输出。

以下是在 FC 代码块中使用 RET 指令的示例步骤:

创建新项目并添加 FC:

编辑该 FC:

从指令树添加指令。

添加一个 RET 指令,包括参数“Return_Value”的以下值之一:

TRUE、FALSE,或用于指定所需返回值的存储位置。

添加更多的指令。

从 MAIN [OB1] 调用 FC。

MAIN 代码块中 FC 功能框的 EN 输入必须为真,才能开始执行 FC。

执行了有能流通过 RET 指令的 FC 后,该 FC 的 RET 指令所指定的值将出现在 MAIN 代码块中 FC 功能框的 ENO 输出上。

重新触发扫描循环看门狗指令

表格 7- 115 RE_TRIGR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-357 RE_TRIGR(); RE_TRIGR(重新触发扫描时间监视狗)用于延长扫描循环监视狗定时器生成错误前允许的最大时间。

RE_TRIGR 指令用于在单个扫描循环期间重新启动扫描循环监视定时器。 结果是从最后一次执行 RE_TRIGR 功能开始,使允许的最大扫描周期延长一个最大循环时间段。

说明

对于 S7-1200 CPU 固件版本 2.2 之前的版本,RE_TRIGR 限制为从程序循环 OB 执行, 并可能用于无限期地延长 PLC 扫描时间。 如果从启动 OB、中断 OB 或错误 OB 执行RE_TRIGR,则不会复位监视狗定时器且 ENO = FALSE。

对于固件版本 2.2 及以上版本,可从任何 OB(包括启动、中断和错误 OB)执行

RE_TRIGR。 但是,PLC 扫描时间最长只能延长到已组态最大循环时间的 10 倍。

设置 PLC 最大循环时间

可以在设备配置的“循环时间”(Cycle time) 下组态最大扫描循环时间值。

表格 7- 116 循环时间值

循环时间监视 最小值 最大值 默认值
最大循环时间 1 ms 6000 ms 150 ms

监视狗超时

如果最大扫描循环定时器在扫描循环完成前达到预置时间,则会生成错误。 如果用户程序中包含错误处理代码块 OB 80,则 CPU 将执行 OB 80,用户可以在其中添加程序逻辑以创建具体响应。 如果不包含 OB 80,则忽略第一个超时条件并且 CPU 切换到 STOP。

如果在同一程序扫描中第二次发生最大扫描时间超时(2 倍的最大循环时间值),则触发错误使 CPU 切换到 STOP 模式。

在 STOP 模式下,用户程序停止执行,而 CPU 系统通信和系统诊断仍继续执行。

停止扫描循环指令

表格 7- 117 STP 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-358 STP(); STP(停止扫描循环)将 CPU 置于 STOP 模式。 CPU 处于

STOP 模式时,将停止程序执行并停止过程映像的物理更新。

有关详细信息,请参见: 组态从 RUN 切换到 STOP 时的输出 (页 88)。

如果 EN = TRUE,CPU 将进入 STOP 模式,程序执行停止,并且 ENO 状态无意义。否则,EN = ENO = 0。

获取错误指令

获取错误指令提供有关程序块执行错误的信息。 如果在代码块中添加了 GetError 或

GetErrorID 指令,则可在程序块中处理程序错误。

GetError

表格 7- 118 GetError 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-359 GET_ERROR(_o

ut_);

指示发生本地程序块执行错误,并用详细错误信息填充预定义的错误数据结构。

表格 7- 119 参数的数据类型

参数 数据类型 说明
ERROR ErrorStruct 错误数据结构: 可以重命名该结构,但不能重命名结构中的成员。

表格 7- 120 ErrorStruct 数据结构的元素

结构组件 数据类型 说明
ERROR_ID Word 错误 ID
FLAGS Byte 显示块调用期间是否出错。

16#01: 块调用期间出错。

16#00: 块调用期间未出错。

REACTION Byte 默认响应:

0: 忽略(写入错误),

1: 以替代值“0”继续(读取错误),

2: 跳转指令(系统错误)

CODE_ADDRESS CREF 有关块地址和类型的信息
BLOCK_TYPE Byte 出错块的类型:

1: OB

2: FC

3: FB

CB_NUMBER UInt 代码块的编号
OFFSET UDInt 对内部存储器的引用
MODE Byte 访问模式: 根据具体的访问类型,可输出以下信息:
模式 (A) (B) (C) (D) (E)
结构组件 数据类型 说明
0
1 偏移
2 区域
3 位置 范围 编号
4 区域 偏移
5 区域 DB 编号 偏移
6 伙伴编号 /访问 区域 DB 编号 偏移
7 伙伴编号 /访问 插槽号/范围 区域 DB 编号 偏移
OPERAND_NUMBER UInt 机器命令的操作数
POINTER_NUMBER_ LOCATION UInt (A) 内部指针
SLOT_NUMBER_SCOPE UInt (B) 内部存储器中的存储区
DATA_ADDRESS NREF 有关操作数地址的信息
AREA Byte (C) 存储区:

L: 16#40 – 4E、86、87、8E、8F、C0 – CE

I:16#81

Q: 16#82

M: 16#83

DB: 16#84、85、8A、8B

DB_NUMBER UInt (D) 数据块编号
OFFSET UDInt (E) 操作数的相对地址

GetErrorID

表格 7- 121 GetErrorID 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-360 GET_ERR_ID()

;

指示发生程序块执行错误,并报告错误的 ID(标识符代码)。

表格 7- 122 参数的数据类型

参数 数据类型 说明
ID Word ErrorStruct ERROR_ID 成员的错误标识符值

表格 7- 123 Error_ID 值

ERROR_ID 十 六进制值 ERROR_ID 十

进制值

程序块执行错误
0 0 无错误
2503 9475 未初始化指针错误
2522 9506 操作数超出范围读取错误
2523 9507 操作数超出范围写入错误
2524 9508 无效区域读取错误
2525 9509 无效区域写入错误
2528 9512 数据分配读取错误(位赋值不正确)
2529 9513 数据分配写入错误(位赋值不正确)
2530 9520 DB 受到写保护
253A 9530 全局 DB 不存在
253C 9532 版本错误或 FC 不存在
253D 9533 指令不存在
253E 9534 版本错误或 FB 不存在
253F 9535 指令不存在
2575 9589 程序嵌套深度错误
2576 9590 局部数据分配错误
2942 10562 物理输入点不存在
2943 10563 物理输出点不存在

操作

默认情况下,CPU 通过将错误记录到诊断缓冲区来响应块执行错误。 但是,如果在代码块中放置一个或多个 GetError 或 GetErrorID 指令,即将该块设置为在块内处理错误。 在这种情况下,CPU 不在诊断缓冲区中记录错误。 而是在 GetError 或 GetErrorID 指令的输出中报告错误信息。 可以使用 GetError 指令读取详细错误信息,或使用 GetErrorID 指令只读取错误标识符。 因为后续错误往往只是第一个错误的结果,所以第一个错误通常最重要。

在块内第一次执行 GetError 或 GetErrorID 指令将返回块执行期间检测到的第一个错误。在块启动到执行 GetError 或 GetErrorID 期间随时都可能发生该错误。 随后执行GetError 或 GetErrorID 将返回上次执行 GetError 或 GetErrorID 以来发生的第一个错误。 不保存错误历史,执行任一指令都将使 PLC 系统重新捕捉下一个错误。

可以在数据块编辑器和块接口编辑器中添加 GetError 指令所使用的 ErrorStruct 数据类型,从而程序逻辑可以访问这些值。 从数据类型下拉列表中选择 ErrorStruct 以添加该结构。 您可以使用唯一的名称创建多个 ErrorStruct 元素。 不能重命名 ErrorStruct 的成 员。

ENO 指示的错误条件

如果 EN = TRUE 且 GetError 或 GetErrorID 执行,则:

ENO = TRUE 表示发生代码块执行错误并提供错误数据

ENO = FALSE 表示未发生代码块执行错误

可以将错误响应程序逻辑连接到在发生错误后激活的 ENO。 如果存在错误,该输出参数会将错误数据存储在程序能够访问这些数据的位置。

GetError 和 GetErrorID 可用来将错误信息从当前执行块(被调用块)发送到调用块。 将该指令放置在被调用块程序的最后一个程序段中可以报告被调用块的最终执行状态。

字逻辑指令

AND、OR 和 XOR 指令

表格 7- 124 AND、OR 和 XOR 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-361 out := in1 AND in2; AND: 逻辑 AND
out := in1 OR in2; OR: 逻辑 OR
out := in1 XOR in2; XOR: 逻辑异或

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

s7一1200功能指令表 基本指令-362 要添加输入,请单击“创建”(Create) 图标,或在其中一个现有 IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 125 参数的数据类型

参数 数据类型 说明
IN1, IN2 Byte, Word, DWord 逻辑输入
OUT Byte, Word, DWord 逻辑输出

1 所选数据类型将 IN1、IN2 和 OUT 设置为相同的数据类型。

IN1 和 IN2 的相应位值相互组合,在参数 OUT 中生成二进制逻辑结果。 执行这些指令之后,ENO 总是为 TRUE。

取反指令

表格 7- 126 INV 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-363 不提供 计算参数 IN 的二进制反码。 通过对参数 IN 各位的值取反来计算反码(将每个 0 变为 1,每个 1 变为 0)。 执行该指令后,

ENO 总是为 TRUE。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 127 参数的数据类型

参数 数据类型 说明
IN SInt, Int, DInt, USInt, UInt, UDInt, Byte, Word, DWord 要取反的数据元素
OUT SInt, Int, DInt, USInt, UInt, UDInt, Byte, Word, DWord 取反后的输出

编码和解码指令

表格 7- 128 ENCO 和 DECO 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-364 out := ENCO(_in_); 将位序列编码成二进制数

ENCO 指令将参数 IN 转换为与参数 IN 的最低有效设置位的位位置对应的二进制数,并将结果返回给参数

OUT。 如果参数 IN 为 0000 0001 或 0000 0000,则将

值 0 返回给参数 OUT。 如果参数 IN 的值为 0000 0000,则 ENO 设置为 FALSE。

s7一1200功能指令表 基本指令-365 out := DECO(_in_); 将二进制数解码成位序列

DECO 指令通过将参数 OUT 中的相应位位置设置为 1

(其它所有位设置为 0)解码参数 IN 中的二进制数。 执行 DECO 指令之后,ENO 始终为 TRUE。

注: DECO 指令的默认数据类型为 DWORD。 在 SCL 中,将指令名称更改为 DECO_BYTE 或 DECO_WORD 可解码字节或字值,并分配到字节或字变量或地址。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 129 参数的数据类型

参数 数据类型 说明
IN ENCO: Byte, Word, DWord DECO: UInt ENCO: 要编码的位序列

DECO: 要解码的值

OUT ENCO: Int

DECO: Byte, Word, DWord

ENCO: 编码后的值

DECO: 解码后的位序列

表格 7- 130 ENCO 的 OUT 参数

ENO 条件 结果 (OUT)
1 无错误 有效位号
0 IN 为零 OUT 设置为零

DECO 参数 OUT 的数据类型选项(Byte、Word 或 DWord)限制参数 IN 的可用范围。如果参数 IN 的值超出可用范围,将执行求模运算,如下所示提取最低有效位。

DECO 参数 IN 的范围:

3 位(值 0-7)IN 用于设置 Byte OUT 中 1 的位位置

4 位(值 0-15)IN 用于设置 Word OUT 中 1 的位位置

5 位(值 0-31)IN 用于设置 DWord OUT 中 1 的位位置

表格 7- 131 示例

DECO IN 值 DECO OUT 值(解码单个位位置)
Byte OUT

8 位

最小 IN 0 00000001
最大 IN 7 10000000
Word OUT

16 位

最小 IN 0 0000000000000001
最大 IN 15 1000000000000000
DWord OUT

32 位

最小 IN 0 00000000000000000000000000000001
最大 IN 31 10000000000000000000000000000000

选择、多路复用和多路分用指令

表格 7- 132 SEL(选择)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-366 out := SEL(

g:=_bool_in,

in0:-_variant_in, in1:=_variant_in);

SEL 根据参数 G 的值将两个输入值之一分配给参数 OUT。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 133 SEL 指令的数据类型

参数 数据类型 1 说明
G Bool 0 选择 IN0

1 选择 IN1

IN0, IN1 SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出

1 输入变量和输出变量必须为相同的数据类型。

条件代码: 执行 SEL 指令之后,ENO 始终为 TRUE。

表格 7- 134 MUX(多路复用)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-367 out := MUX(

k:=_unit_in, in1:=variant_in, in2:=variant_in,

[...in32:=variant_in,

]

inelse:=variant_in);

MUX 根据参数 K 的值将多个输入值之一复制到参数 OUT。如果参数 K 的值大于 (INn - 1),则会将参数 ELSE 的值复制到参数 OUT。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

s7一1200功能指令表 基本指令-368 要添加输入,请单击“创建”(Create) 图标,或在其中一个现有 IN 参数的输入短线处单击右键,并选择“插入输入”(Insert input) 命令。

要删除输入,请在其中一个现有 IN 参数(多于两个原始输入时)的输入短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 135 MUX 指令的数据类型

参数 数据类型 说明
K UInt 0 选择 IN1

1 选择 IN2

n 选择 INn

IN0, IN1, ..

INn

SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
ELSE SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入替换值(可选)
OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出

1 输入变量和输出变量必须为相同的数据类型。

表格 7- 136 DEMUX(多路分用)指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-369 DEMUX(

k:=_unit_in, in:=variant_in, out1:=variant_in, out2:=variant_in,

[...out32:=variant_in

,]

outelse:=variant_in)

;

DEMUX 将分配给参数 IN 的位置值复制到多个输出之一。参数 K 的值选择将哪一输出作为 IN 值的目标。 如果 K 的值大于数值 (OUTn - 1),则会将 IN 值复制到分配给 ELSE 参

数的位置。

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

要添加输出,请单击创建图标,或在其中一个现有 OUT 参数的输出短线处单击右键,并选择“插入输出”(Insert output) 命令。 要删除输出,请在其中一个现有 OUT 参数(多于两个原始输出时)的输出短线处单击右键,并选择“删除”(Delete) 命令。

s7一1200功能指令表 基本指令-370 要添加输出,请单击“创建”(Create) 图标,或在其中一个现有 OUT 参数的输出短线处单击右键,并选择“插入输出”(Insert output) 命令。

要删除输出,请在其中一个现有 OUT 参数(多于两个原始输出时)的输出短线处单击右键,并选择“删除”(Delete) 命令。

表格 7- 137 DEMUX 指令的数据类型

参数 数据类型 1 说明
K UInt 选择器的值:

0 选择 OUT1

1 选择 OUT2

n 选择 OUTn

IN SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输入
OUT0,

OUT1, .. OUTn

SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char 输出
ELSE SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal, Byte, Word, DWord, Time, Char K 大于 (OUTn - 1) 时的替换输出

1 输入变量和输出变量必须为相同的数据类型。

表格 7- 138 MUX 和 DEMUX 指令的 ENO 状态

ENO 条件 结果 (OUT)
1 无错误 MUX:将选择的 IN 值复制到 OUT DEMUX:将 IN 值复制到选择的 OUT
0 MUX:K 大于输入数 -1 不提供 ELSE: OUT 不变,

提供 ELSE,将 ELSE 值分配给 OUT

DEMUX: K 大于输出数 -1 不提供 ELSE: 输出不变,

提供 ELSE,将 IN 值复制到 ELSE

移位和循环

移位指令

表格 7- 139 SHR 和 SHL 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-371 out := SHR(

in:=_variant_in_, n:=_uint_in);

out := SHL(

in:=_variant_in_, n:=_uint_in);

使用移位指令(SHL 和 SHR)移动参数 IN 的位序列。结果将分配给参数 OUT。 参数 N 指定移位的位数:

SHR: 右移位序列

SHL: 左移位序列

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 140 参数的数据类型

参数 数据类型 说明
IN Byte, Word, DWord 要移位的位序列
N UInt 要移位的位数
OUT Byte, Word, DWord 移位操作后的位序列

若 N=0,则不移位。 将 IN 值分配给 OUT。

用 0 填充移位操作清空的位位置。

如果要移位的位数 (N) 超过目标值中的位数(Byte 为 8 位、Word 为 16 位、DWord 为 32 位),则所有原始位值将被移出并用 0 代替(将 0 分配给 OUT)。

对于移位操作,ENO 总是为 TRUE。

表格 7- 141 Word 数据的 SHL 示例

自右插入零,使 Word 的位左移 (N = 1)
IN 1110 0010 1010 1101 首次移位前的 OUT 值: 1110 0010 1010 1101
首次左移后: 1100 0101 0101 1010
第二次左移后: 1000 1010 1011 0100
第三次左移后: 0001 0101 0110 1000

7.10 移位和循环

循环指令

表格 7- 142 ROR 和 ROL 指令

LAD/FBD SCL 说明
s7一1200功能指令表 基本指令-372 out := ROL(

in:=_variant_in_, n:=_uint_in);

out := ROR(

in:=_variant_in_, n:=_uint_in);

循环指令(ROR 和 ROL)用于将参数 IN 的位序列循环移位。结果分配给参数 OUT。 参数 N 定义循环移位的位数。

ROR:循环右移位序列

ROL:循环左移位序列

1 对于 LAD 和 FBD: 单击“???”并从下拉菜单中选择数据类型。

表格 7- 143 参数的数据类型

参数 数据类型 说明
IN Byte, Word, DWord 要循环移位的位序列
N UInt 要循环移位的位数
OUT Byte, Word, DWord 循环移位操作后的位序列

若 N=0,则不循环移位。 将 IN 值分配给 OUT。

从目标值一侧循环移出的位数据将循环移位到目标值的另一侧,因此原始位值不会丢失。

如果要循环移位的位数 (N) 超过目标值中的位数(Byte 为 8 位、Word 为 16 位、

DWord 为 32 位),仍将执行循环移位。

执行循环指令之后,ENO 始终为 TRUE。

表格 7- 144 Word 数据的 ROR 示例

将各个位从右侧循环移出到左侧 (N = 1)
IN 0100 0000 0000 0001 首次循环移位前的 OUT 值: 0100 0000 0000 0001
首次循环右移后: 1010 0000 0000 0000
第二次循环右移后: 0101 0000 0000 0000
weinxin
plc入门知识问答
每一个PLC工程师都应该关注的微信公众账号,只需输入您的问题,就会有答案

发表评论

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