西门子s7-1200的扩展指令

2018年6月21日22:57:39 发表评论 4,480 阅读
文章目录[隐藏]

日期和日时钟

日期和时间指令

日期和时间指令用于设计日历和时间计算。

        • T_CONV 用于转换时间值的数据类型: (Time 转换为 DInt) 或(DInt 转换为 Time)
        • T_ADD 将 Time 值与 DTL 值相加: (Time + Time = Time) 或 (DTL + Time = DTL)
        • T_SUB 将 Time 值与 DTL 值相减: (Time - Time = Time) 或 (DTL - Time = DTL)
        • T_DIFF 提供两个 DTL 值的差作为 Time 值: DTL - DTL = Time
        • T_COMBINE 将 Date 值和 Time_and_Date 值组合在一起生成 DTL 值

有关 DTL 和 Time 数据的结构信息,请参见 Time 和 Date 数据类型 (页 98)部分。

表格 8- 1 T_CONV (时间转换)指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-1 out :=

T_CONV( in:=_varian t_in);

T_CONV 将 Time 数据类型转换为 DInt 数据类型,或将 DInt

数据类型转回 Time 数据类型。

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

表格 8- 2 T_CONV 参数的数据类型

参数和类型 数据类型 说明
IN IN DInt, Time 输入 Time 值或 DInt 值
OUT OUT DInt, Time 经过转换的 DInt 值或 Time 值

表格 8- 3 T_ADD(时间相加)和 T_SUB(时间相减)指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-2 out := T_ADD(

in1:=_variant_in, in2:=_time_in);

T_ADD 将输入 IN1 的值(DTL 或 Time 数据类型)与输入
IN2 的 Time 值相加。 参数 OUT 提供 DTL 或 Time 值结果。
允许以下两种数据类型的运算:
  • Time + Time = Time
  • DTL + Time = DTL
西门子s7-1200的扩展指令-3 out := T_SUB(

in1:=_variant_in, in2:=_time_in);

T_SUB 从 IN1(DTL 或 Time 值)中减去 IN2 的 Time 值。
参数 OUT 以 DTL 或 Time 数据类型提供差值。 允许以下两种
数据类型的运算:
  • Time - Time = Time
  • DTL - Time = DTL

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

表格 8- 4 T_ADD 和 T_SUB 参数的数据类型

参数和类型 数据类型 说明
IN11 IN DTL, Time DTL 或 Time 值
IN2 IN Time 要加上或减去的 Time 值
OUT OUT DTL, Time DTL 或 Time 的和值或差值

1 从指令名称下方提供的下拉列表中选择 IN1 的数据类型。 所选的 IN1 数据类型同时也会设置参数 OUT 的数据类型。

表格 8- 5 T_DIFF(时差)指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-4 out := T_DIFF( in1:=_DTL_in, in2:=_DTL_in); T_DIFF 从 DTL 值 (IN1) 中减去 DTL 值 (IN2)。 参数 OUT 以

Time 数据类型提供差值。

  • DTL - DTL = Time

表格 8- 6 T_DIFF 参数的数据类型

参数和类型 数据类型 说明
IN1 IN DTL DTL 值
IN2 IN DTL 要减去的 DTL 值
OUT OUT Time Time 差

条件代码: ENO = 1 表示未发生错误。 ENO = 0 且参数 OUT = 0 的错误:

        • DTL 值无效
        • Time 值无效

表格 8- 7 T_COMBINE (组合时间值)指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-5 out := CONCAT_DATE_TOD(

In1 := _date_in, In2 := _tod_in);

T_COMBINE 将 Date 值和 Time_of_Day

值组合在一起生成 DTL 值。

1 请注意,在扩展指令中,T_COMBINE 指令相当于 SCL 中的 CONCAT_DATE_TOD 函数。

表格 8- 8 T_COMBINE 参数的数据类型

参数和类型 数据类型 说明
IN1 IN Date 要组合的 Date 值必须在 DATE#1990-01-01 和

DATE#2089-12-31 之间

IN2 IN Time_of_Day 要组合的 Time_of_Day 值
OUT OUT DTL DTL 值

设置和读取系统时钟

时钟指令用于设置和读取 CPU 系统时钟。 使用数据类型 DTL (页 98) 提供日期和时间值。

表格 8- 9 系统时间指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-6 ret_val := WR_SYS_T( in:=_DTL_in_); WR_SYS_T(写入系统时间)使用参数 IN 中的 DTL 值设置

CPU 时钟。 该时间值不包括本地时区或夏令时偏移量。

西门子s7-1200的扩展指令-7 ret_val := RD_SYS_T( out=>_DTL_out); RD_SYS_T(读取系统时间)从 CPU 中读取当前系统时间。该时间值不包括本地时区或夏令时偏移量。
西门子s7-1200的扩展指令-8 ret_val := RD_LOC_T( out=>_DTL_out); RD_LOC_T(读取本地时间)以 DTL 数据类型提供 CPU 的当

前本地时间。 该时间值反映了就夏令时(如果已经组态)进行过适当调整的本地时区。

表格 8- 10 参数的数据类型

参数和类型 数据类型 说明
IN IN DTL 要在 CPU 系统时钟内设置的时间
RET_VAL OUT Int 执行条件代码
OUT OUT DTL RD_SYS_T: 当前 CPU 系统时间

RD_LOC_T: 当前本地时间。包括对夏令时的任何调整

(如果已经组态)

        • 通过使用用户在设备组态常规选项卡“时间”(Time of day) 参数中设置的时区和夏令时偏移量计算本地时间。
        • 时区组态是相对于 UTC 或 GMT 时间的偏移量。
        • 夏令时组态指定夏令时开始时的月份、星期、日期和小时。
        • 标准时间组态也会指定标准时间开始时的月份、星期、日期和小时。
        • 时区偏移量始终会应用到系统时间值。 只有在夏令时有效时才会应用夏令时偏移量。

说明

夏令时和标准起始时间组态

CPU 设备组态的“夏令时开始”(Start for daylight saving time) 的“时间”(Time of day) 属性必须是本地时间。

条件代码: ENO = 1 表示未发生错误。 ENO = 0 表示发生了执行错误,同时在

RET_VAL 输出中提供条件代码。

表格 8- 11 条件代码

RET_VAL (W#16#....) 说明
0000 当前的本地时间为标准时间。
0001 夏令制时间已组态,当前的本地时间为夏令制时间。
8080 本地时间不可用
8081 非法年份值
8082 非法月份值
8083 非法日期值
8084 非法小时值
8085 非法分钟值
8086 非法秒数值
8087 非法纳秒值
80B0 实时时钟发生了故障。

运行时间计时器指令

表格 8- 12 RTM 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-9 RTM(NR:=_uint_in_, MODE:=_byte_in_, PV:=_dint_in_, CQ=>_bool_out_, CV=>_dint_out_); RTM(运行时间计时器)指令可以设置、启动、停止和读取 CPU 中的运行时间小时计时器。

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

参数和类型 数据类型 说明
NR IN UInt 运行时间计时器编号: (可能值: 0..9)
MODE IN Byte RTM 执行模式编号:

  • 0 = 获取值(然后状态值写入 CQ,当前值写入 CV)
  • 1 = 启动(从上一计数值开始)
  • 2 = 停止
  • 4 = 设置(设为 PV 中指定的值)
  • 5 = 设置(设为 PV 中指定的值),然后启动
  • 6 = 设置(设为 PV 中指定的值),然后停止
  • 7 = 将 CPU 中的所有 RTM 值保存到 MC(存储卡)
PV IN DInt 指定运行时间计时器的预设小时值
RET_VAL OUT Int 功能结果/错误消息
CQ OUT Bool 运行时间计时器的状态(1 = 正在运行)
CV OUT DInt 指定计时器的当前运行小时值

CPU 最多可运行 10 个运行小时计时器来跟踪关键控制子系统的运行小时数。 必须对每个定时器执行一次 RTM 分别启动小时计时器。 CPU 从运行模式切换为停止模式时,所有运行小时计时器都将停止。 还可以使用 RTM 执行模式 2 停止各个的定时器。

CPU 从停止模式切换为运行模式时,必须对每个已启动的定时器执行一次 RTM 来重新启动小时计时器。 运行时间计时器值大于 2147483647 小时后,将停止计时并发出“上溢”错误。 必须为每个定时器执行一次 RTM 指令,以复位或修改定时器。

CPU 电源故障或循环上电会导致断电过程将当前运行时间计时器值保存在保持性存储器中。 在 CPU 上电时,所存储的运行时间计时器值将重新加载到定时器,之前的运行时间小时总数不会丢失。 必须重启运行时间计时器才能累加额外的运行时间。

用户程序还可以使用 RTM 执行模式 7 将运行时间计时器值保存在存储卡中。 执行 RTM 模式 7 时的所有定时器的状态将保存在存储卡中。 由于小时定时器会在程序运行过程中或启动或停止,随着时间的推移,这些存储值就可能出错。 因此,必须周期性更新存储卡值,以捕获重要的运行事件。 在存储卡中保存 RTM 值的好处是,在替代 CPU 中插入存储卡时,就可以在其中使用程序和所保存的 RTM 值。 如果未将 RTM 值保存在存储卡中,则会丢失定时器值(在替代 CPU 中)。

说明

避免过度调用执行存储卡写操作的程序

尽可能减少闪存卡写操作,以延长存储卡的使用寿命。

表格 8- 14 条件代码

RET_VAL (W#16#....) 说明
0 无错误
8080 运行时间计时器编号错误
8081 负值已传递给参数 PV
8082 操作小时计数器溢出
8091 输入参数 MODE 包含非法值。
80B1 无法将值保存到 MC (MODE=7)

SET_TIMEZONE 指令

表格 8- 15 SET_TIMEZONE 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-10 "SET_TIMEZONE_DB"(

REQ:=_bool_in, Timezone:=_struct_in, DONE=>_bool_out_, BUSY=>_bool_out_, ERROR=>_bool_out_, STATUS=>_word_out_);

设置本地时区和夏令时参数,以用于将 CPU 系统时间转换为本地时间。

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

表格 8- 16 参数的数据类型

参数和类型 数据类型 说明
REQ IN Bool REQ=1: 执行功能
Timezone IN TimeTransformationRule 将系统时间转换为本地时间的规则
DONE OUT Bool 功能执行完毕
BUSY OUT Bool 功能忙
参数和类型 数据类型 说明
ERROR OUT Bool 检测到错误
STATUS OUT Word 功能结果/错误消息

要手动组态 CPU 的时区参数,请使用设备组态“常规”(General) 选项卡中的“时间”(Time of day) 属性。

通过程序使用 SET_TIMEZONE 指令设置本地时间组态。 “TimeTransformationRule”结构的参数用于指定本地时区以及在标准时间和夏令时之间自动切换的时间。

表格 8- 17 "TimeTransformationRule" 结构

参数 数据类型 说明
Bias Int UTC 与本地时间的时差 [min]
DaylightBias Int 冬季时间与夏季时间的时差 [min]
DaylightStartMonth USInt 夏令时的月份
DaylightStartWeek USInt 夏令时的星期:

  • 1 = 该月的第一周
  • ...
  • 5 = 该月的最后一周
DaylightStartWeekday USInt 夏令时的周几:

  • 1 = 星期日
  • ...
  • 7 = 星期六
DaylightStartHour USInt 夏令时的小时
StandardStartMonth USInt 转换为冬季时间的月份
StandardStartWeek USInt 转换为冬季时间的周:

  • 1 = 该月的第一周
  • ...
  • 5 = 该月的最后一周
StandardStartWeekday USInt 冬季时间的周几:

  • 1 = 星期日
  • ...
  • 7 = 星期六
参数 数据类型 说明
StandardStartHour USInt 冬季时间的小时
Time Zone Name STRING [80] 时区名称:

(GMT +01:00) 柏林、伯尔尼、布鲁塞尔、罗马、斯德哥尔摩和越南

字符串和字符

String 数据概述

字符串数据类型

String 数据被存储成 2 个字节的标头后跟最多 254 个 ASCII 码字符组成的字符字节。

String 标头包含两个长度。 第一个字节是初始化字符串时方括号中给出的最大长度,默认值为 254。 第二个标头字节是当前长度,即字符串中的有效字符数。 当前长度必须小于或等于最大长度。 String 格式占用的存储字节数比最大长度大 2 个字节。

初始化 String 数据

在执行任何字符串指令之前,必须将 String 输入和输出数据初始化为存储器中的有效字符串。

有效 String 数据

有效字符串的最大长度必须大于 0 但小于 255。当前长度必须小于等于最大长度。字符串无法分配给 I 或 Q 存储区。

有关详细信息,请参见: String 数据类型的格式 (页 100)。

S_MOVE 指令

表格 8- 18 字符串移动指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-11 out := in; 将源 IN 字符串复制到 OUT 位置。 S_MOVE 的执行并不影响源字符串的内容。

表格 8- 19 参数的数据类型

参数 数据类型 说明
IN String 源字符串
OUT String 目标地址

如果输入 IN 中字符串的实际长度超过输出 OUT 存储的字符串最大长度,则会复制 OUT

字符串能容纳的部分 IN 字符串。

字符串转换指令

字符串到值以及值到字符串的转换

可以使用以下指令将数字字符串转换为数值或将数值转换为数字字符串:

          • S_CONV 用于将数字字符串转换成数值或将数值转换成数字字符串
          • STRG_VAL 使用格式选项将数字字符串转换成数值
          • VAL_STRG 使用格式选项将数值转换成数字字符串
S_CONV(字符串到值的转换)

表格 8- 20 字符串转换指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-12 out :=

<Type>_TO_<Type>(in);

将字符串转换成相应的值,或将值转换成相应的字符串。

S_CONV 指令没有输出格式选项。 因此,S_CONV 指令比 STRG_VAL 指令和 VAL_STRG 指令更简单,但灵活

性更差。

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

2 对于 SCL: 从扩展指令中选择 S_CONV,然后应答数据类型转换的提示信息。 STEP 7 随后会显示相应的转换指令。

表格 8- 21 数据类型(字符串到值)

参数和类型 数据类型 说明
IN IN String 输入字符串
OUT OUT String, Char, SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 输出数值

字符串参数 IN 的转换从首个字符开始,并一直进行到字符串的结尾,或者一直进行到遇到第一个不是“0”到“9”、“+”、“-”或“.”的字符为止。 结果值将在参数 OUT 中指定的位置提供。 如果输出数值不在 OUT 数据类型的范围内,则参数 OUT 设置为 0,并且 ENO 设置为 FALSE。 否则,参数 OUT 将包含有效的结果,并且 ENO 设置为 TRUE。

输入 String 格式规则:

如果在 IN 字符串中使用小数点,则必须使用“.”字符。

允许使用逗点字符“,”作为小数点左侧的千位分隔符,并且逗点字符会被忽略。

忽略前导空格。

S_CONV(值到字符串的转换)

表格 8- 22 数据类型(值到字符串)

参数和类型 数据类型 说明
IN IN String, Char, SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 输入数值
OUT OUT String 输出字符串

整数值、无符号整数值或浮点值 IN 在 OUT 中被转换为相应的字符串。 在执行转换前, 参数 OUT 必须引用有效字符串。 有效字符串由第一个字节中的最大字符串长度、第二个字节中的当前字符串长度以及后面字节中的当前字符串字符组成。 转换后的字符串将从第一个字符开始替换 OUT 字符串中的字符,并调整 OUT 字符串的当前长度字节。 OUT 字符串的最大长度字节不变。

被替换的字符数取决于参数 IN 的数据类型和数值。 被替换的字符数必须在参数 OUT 的字符串长度范围内。 OUT 字符串的最大字符串长度(第一个字节)应大于或等于被转换字符的最大预期数目。 下表列出了所支持的各种数据类型要求的最大可能字符串长度。

表格 8- 23 每种数据类型的最大字符串长度

IN 数据类型 OUT 字符串中被转换字符的最大数目 示例 包括最大及当前长度字节在内的总字符串长度
USInt 3 255 5
SInt 4 -128 6
UInt 5 65535 7
Int 6 -32768 8
UDInt 10 4294967295 12
DInt 11 -2147483648 13

输出 String 格式规则:

          • 写入到参数 OUT 的值不使用前导“+”号。
          • 使用定点表示法(不可使用指数表示法)。
          • 参数 IN 为 Real 数据类型时,使用句点字符“.”表示小数点。
STRG_VAL 指令

表格 8- 24 字符串转换成值指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-13 "STRG_VAL"(

in:=_string_in, format:=_word_in, p:=uint_in, out=>_variant_out);

将数字字符串转换为相应的整型或浮点型表示法。

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

表格 8- 25 STRG_VAL 指令的数据类型

参数和类型 数据类型 说明
IN IN String 要转换的 ASCII 字符串
FORMAT IN Word 输出格式选项
P IN UInt, Byte, USInt IN: 指向要转换的第一个字符的索引(第一个字符 = 1)
OUT OUT SInt, Int, DInt, USInt, UInt, UDInt, Real, LReal 转换后的数值

转换从字符串 IN 中的字符偏移量 P 位置开始,并一直进行到字符串的结尾,或者一直进行到遇到第一个不是“+”、“-”、“.”、“,”、“e”、“E”或“0”到“9”的字符为止。 结果放置在参数

OUT 中指定的位置。

必须在执行前将 String 数据初始化为存储器中的有效字符串。

以下定义了 STRG_VAL 指令的 FORMAT 参数。 未使用的位位置必须设置为零。

表格 8- 26 STRG_VAL 指令的格式

16

8

7

0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 f r

f = 表示法格式 1= 指数表示法

0 = 定点表示法

r = 小数点格式 1 =“,”(逗点字符) 0 =“.” (句点字符)

表格 8- 27 FORMAT 参数的值

FORMAT (W#16#) 表示法格式 小数点表示法
0000(默认) 定点 "."
0001 ","
0002 指数 "."
0003 ","
0004 到 FFFF 非法值

STRG_VAL 转换的规则:

          • 如果使用句点字符“.”作为小数点,则小数点左侧的逗点“,”将被解释为千位分隔符字 符。 允许使用逗点字符并且会将其忽略。
          • 如果使用逗点字符“,”作为小数点,则小数点左侧的句点“.”将被解释为千位分隔符字 符。 允许使用句点字符并且会将其忽略。
          • 忽略前导空格。
VAL_STRG 指令

表格 8- 28 值转换成字符串的运算

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-14 "VAL_STRG"(

in:=_variant_in, size:=_usint_in, prec:=_usint_in, format:=_word_in, p:=uint_in, out=>_string_out);

将整数值、无符号整数值或浮点值转换为相应的字符串表示法。

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

表格 8- 29 VAL_STRG 指令的数据类型

参数和类型 数据类型 说明
IN IN SInt, Int, DInt, USInt,

UInt, UDInt, Real, LReal

要转换的值
SIZE IN USInt 要写入 OUT 字符串的字符数
PREC IN USInt 小数部分的精度或大小。 不包括小数点。
FORMAT IN Word 输出格式选项
P IN UInt, Byte, USInt IN: 指向要替换的第一个 OUT 字符串字符的索引(第一个字符 = 1)
OUT OUT String 转换后的字符串

参数 IN 表示的值将被转换为参数 OUT 所引用的字符串。 在执行转换前,参数 OUT 必须为有效字符串。

转换后的字符串将从字符偏移量计数 P 位置开始替换 OUT 字符串中的字符,一直到参数

SIZE 指定的字符数。 SIZE 中的字符数必须在 OUT 字符串长度范围内(从字符位置 P

开始计数)。 该指令对于将数字字符嵌入到文本字符串中很有用。 例如,可以将数字

“120”放入字符串“Pump pressure = 120 psi”中。

参数 PREC 用于指定字符串中小数部分的精度或位数。 如果参数 IN 的值为整数,则

PREC 指定小数点的位置。 例如,如果数据值为 123 且 PREC = 1,则结果为“12.3”。对于 Real 数据类型,支持的最大精度为 7 位。

如果参数 P 大于 OUT 字符串的当前大小,则会添加空格,一直到位置 P,并将该结果附加到字符串末尾。 如果达到了最大 OUT 字符串长度,则转换结束。

以下定义了 VAL_STRG 指令的 FORMAT 参数。 未使用的位位置必须设置为零。

表格 8- 30 VAL_STRG 指令的格式

16

8

7

0

0 0 0 0 0 0 0 0 0 0 0 0 0 s f r

s = 数字符号字符 1= 使用符号字符“+”和“-” 0 = 仅使用符号字符“-”

f = 表示法格式 1= 指数表示法

0 = 定点表示法

r = 小数点格式 1 =“,”(逗点字符) 0 =“.” (句点字符)

表格 8- 31 FORMAT 参数的值

FORMAT (WORD) 数字符号字符 表示法格式 小数点表示法
W#16#0000 仅“-” 定点 "."
W#16#0001 ","
W#16#0002 指数 "."
W#16#0003 ","
W#16#0004 “+”和“-” 定点 "."
W#16#0005 ","
W#16#0006 指数 "."
W#16#0007 ","
W#16#0008 到

W#16#FFFF

非法值

参数 OUT 字符串的格式规则如下:

如果转换后的字符串小于指定的大小,则会在字符串的最左侧添加前导空格字符。

如果 FORMAT 参数的符号位为 FALSE,则会将无符号和有符号整型值写入输出缓冲区,且不带前导“+”号。 必要时会使用“-”号。

<前导空格><无前导零的数字>'.'<PREC 数字>

如果符号位为 TRUE,则会将无符号和有符号整型值写入输出缓冲区,且总是带前导符号字符。

<前导空格><符号><不带前导零的数字>'.'<PREC 数字>

如果 FORMAT 被设置为指数表示法,则会按以下方式将 Real 数据类型的值写入输出缓冲区:

<前导空格><符号><数字> '.' <PREC 数字>'E' <符号><无前导零的数字>

如果 FORMAT 被设置为定点表示法,则会按以下方式将整型、无符号整型和实型值写入输出缓冲区:

<前导空格><符号><不带前导零的数字>'.'<PREC 数字>

小数点左侧的前导零会被隐藏,但与小数点相邻的数字除外。

小数点右侧的值被舍入为 PREC 参数所指定的小数点右侧的位数。

输出字符串的大小必须比小数点右侧的位数多至少三个字节。

输出字符串中的值为右对齐。

ENO 报告的条件

在转换操作期间遇到错误时,将返回以下结果:

  • ENO 设置为 0。
  • OUT 设置为 0,或者如字符串到值的转换示例中所示。
  • OUT 不变,或者如 OUT 为字符串时的示例中所示。

表格 8- 32 ENO 状态

ENO 说明
1 无错误
0 非法或无效参数;例如,访问一个不存在的 DB
0 非法字符串,要求该字符串的最大长度为 0 或 255
ENO 说明
0 非法字符串,当前长度大于最大长度
0 转换后的数值对于指定的 OUT 数据类型而言过大。
0 OUT 参数的最大字符串大小必须足够大,以接受参数 SIZE 所指定的字符数(从字符位置参数 P 开始)。
0 非法 P 值,P=0 或 P 大于当前字符串长度
0 参数 SIZE 必须大于参数 PREC。

表格 8- 33 S_CONV 字符串到值的转换示例

IN 字符串 OUT 数据类型 OUT 值 ENO
"123" Int 或 DInt 123 TRUE
"-00456" Int 或 DInt -456 TRUE
"123.45" Int 或 DInt 123 TRUE
"+2345" Int 或 DInt 2345 TRUE
"00123AB" Int 或 DInt 123 TRUE
"123" Real 123.0 TRUE
"123.45" Real 123.45 TRUE
"1.23e-4" Real 1.23 TRUE
"1.23E-4" Real 1.23 TRUE
"12,345.67" Real 12345.67 TRUE
"3.4e39" Real 3.4 TRUE
"-3.4e39" Real -3.4 TRUE
"1.17549e-38" Real 1.17549 TRUE
"12345" SInt 0 FALSE
"A123" 不适用 0 FALSE
"" 不适用 0 FALSE
"++123" 不适用 0 FALSE
"+-123" 不适用 0 FALSE

表格 8- 34 S_CONV 值到字符串的转换示例

数据类型 IN 值 OUT 字符串 ENO
UInt 123 "123" TRUE
UInt 0 "0" TRUE
UDInt 12345678 "12345678" TRUE
Real -INF "INF" FALSE
Real +INF "INF" FALSE
Real NaN "NaN" FALSE

表格 8- 35 STRG_VAL 转换示例

IN 字符串 FORMAT

(W#16#....)

OUT 数据类型 OUT 值 ENO
"123" 0000 Int 或 DInt 123 TRUE
"-00456" 0000 Int 或 DInt -456 TRUE
"123.45" 0000 Int 或 DInt 123 TRUE
"+2345" 0000 Int 或 DInt 2345 TRUE
"00123AB" 0000 Int 或 DInt 123 TRUE
"123" 0000 Real 123.0 TRUE
"-00456" 0001 Real -456.0 TRUE
"+00456" 0001 Real 456.0 TRUE
"123.45" 0000 Real 123.45 TRUE
"123.45" 0001 Real 12345.0 TRUE
"123,45" 0000 Real 12345.0 TRUE
"123,45" 0001 Real 123.45 TRUE
".00123AB" 0001 Real 123.0 TRUE
"1.23e-4" 0000 Real 1.23 TRUE
"1.23E-4" 0000 Real 1.23 TRUE
"1.23E-4" 0002 Real 1.23E-4 TRUE
"12,345.67" 0000 Real 12345.67 TRUE
"12,345.67" 0001 Real 12.345 TRUE
IN 字符串 FORMAT

(W#16#....)

OUT 数据类型 OUT 值 ENO
"3.4e39" 0002 Real +INF TRUE
"-3.4e39" 0002 Real -INF TRUE
"1.1754943e-38"

(及更小值)

0002 Real 0.0 TRUE
"12345" 不适用 SInt 0 FALSE
"A123" 不适用 不适用 0 FALSE
"" 不适用 不适用 0 FALSE
"++123" 不适用 不适用 0 FALSE
"+-123" 不适用 不适用 0 FALSE

下面的 VAL_STRG 转换示例均基于按以下方式初始化的 OUT 字符串:

"Current Temp = xxxxxxxxxx C"

其中字符“x”表示为转换后的值分配的空格字符。

表格 8- 36 VAL_STRG 转换示例

数据类型 IN 值 P SIZE FORMAT

(W#16#....)

PREC OUT 字符串 ENO
UInt 123 16 10 0000 0 Current Temp = xxxxxxx123 C TRUE
UInt 0 16 10 0000 2 Current Temp = xxxxxx0.00 C TRUE
UDInt 12345678 16 10 0000 3 Current Temp = x12345.678 C TRUE
UDInt 12345678 16 10 0001 3 Current Temp = x12345,678 C TRUE
Int 123 16 10 0004 0 Current Temp = xxxxxx+123 C TRUE
Int -123 16 10 0004 0 Current Temp = xxxxxx-123 C TRUE
Real -0.00123 16 10 0004 4 Current Temp = xxx-0.0012 C TRUE
数据类型 IN 值 P SIZE FORMAT

(W#16#....)

PREC OUT 字符串 ENO
Real -0.00123 16 10 0006 4 Current Temp = - 1.2300E-3 C TRUE
Real -INF 16 10 不适用 4 Current Temp = xxxxxx-INF C FALSE
Real +INF 16 10 不适用 4 Current Temp = xxxxxx+INF C FALSE
Real NaN 16 10 不适用 4 Current Temp = xxxxxxxNaN C FALSE
UDInt 12345678 16 6 不适用 3 Current Temp = xxxxxxxxxx C FALSE
字符串到字符和字符到字符串的转换

Chars_TO_Strg 将 ASCII 字符字节数组复制到字符串中。

Strg_TO_Chars 将 ASCII 字符串复制到字符字节数组中。

说明

只允许将零基数组类型 (Array [0..n] of Char) 或 (Array [0..n] of Byte) 作为指令

Chars_TO_Strg 的输入参数 Chars,或作为指令 Strg_TO_Chars 的 IN_OUT 参数

Chars 。

表格 8- 37 Chars_TO_Strg 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-15 Chars_TO_Strg( Chars:=_variant_in_, pChars:=_dint_in_, Cnt:=_uint_in_, Strg=>_string_out_); 将字符数组的全部或一部分复制到字符串。
执行 Chars_TO_Strg 之前必须声明输出字符串。 之后,

Chars_TO_Strg 操作会覆盖该字符串。

可以使用所有受支持的最大长度 (1..254) 的字符串。
Chars_TO_Strg 操作不会更改字符串的最大长度值。 达
到最大字符串长度后,将停止从数组复制到字符串。
字符数组中的 nul 字符“$00”或 16#00 值起分隔符的作
用,用于结束向字符串复制字符的操作。

表格 8- 38 参数的数据类型 (Chars_TO_Strg)

参数和类型 数据类型 说明
Chars IN Variant Chars 参数是要转换为字符串的零基字符数组 [0..n] 的指针。 可以在 DB 中声明数组,也可以在块接口中将其声明为本地变量。

示例: "DB1".MyArray 指向 DB1 中的 MyArray

[0..10] of Char 元素值。

pChars IN Dint 数组中要复制的第一个字符的元素编号。 默认值为数组元素 [0]。
Cnt IN UInt 要复制的字符数: 0 表示全部
Strg OUT String 目标字符串

表格 8- 39 Strg_TO_Chars 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-16 Strg_TO_Chars( Strg:=_string_in_, pChars:=_dint_in_, Cnt=>_uint_out_, Chars:=_variant_inout_); 将整个输入字符串 Strg 复制到 IN_OUT 参数 Chars.
的字符数组中。
该操作会从 pChars 参数指定的数组元素编号开始覆
盖字节。
可以使用所有受支持的最大长度 (1..254) 的字符
串。
结束分隔符不会被写入;这由用户负责。 要在最后
写入的数组字符后面设置结束分隔符,应使用下一
数组元素编号 [pChars+Cnt]。

表格 8- 40 参数的数据类型 (Strg_TO_Chars)

参数和类型 数据类型 说明
Strg IN String 源字符串
pChars IN DInt 写入目标数组的第一个字符串字符的数组元素编号
参数和类型 数据类型 说明
Chars IN_OUT Variant Chars 参数是从输入字符串复制的零基字符数组 [0..n] 的指针。 可以在 DB 中声明数组,也可以在块接口中将其声明为本地变量。

示例: "DB1".MyArray 指向 DB1 中的 MyArray

[0..10] of Char 元素值。

Cnt OUT UInt 已复制的字符数

表格 8- 41 ENO 状态

ENO 说明
1 无错误
0 Chars_TO_Strg:尝试将多于字符串声明中的最大长度字节允许的字符字节复制到输出字符串
0 Chars_TO_Strg:在输入字符字节数组中找到 nul 字符 (16#00) 值。
0 Strg_TO_Chars:尝试将多于元素数目限制所允许的字符字节复制到输出数组
ASCII 到十六进制和十六进制到 ASCII 的转换

使用 ATH(ASCII 到十六进制)和 HTA(十六进制到 ASCII)指令进行 ASCII 字符字节

(仅字符 0 到 9 和大写 A 到 F)与相应的 4 位十六进制半字节之间的转换。

表格 8- 42 ATH 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-17 ret_val := ATH( in:=_variant_in_, n:=_int_in_, out=>_variant_out_); 将 ASCII 字符转换为压缩的十六进制数字。

表格 8- 43 ATH 指令的数据类型

参数类型 数据类型 说明
IN IN Variant 指向 ASCII 字符字节数组的指针
N IN UInt 要转换的 ASCII 字符字节数
参数类型 数据类型 说明
RET_VAL OUT Word 执行条件代码
OUT OUT Variant 指向转换后的十六进制字节数组的指针

转换从参数 IN 指定的位置开始,并持续 N 个字节。 结果放置在 OUT 指定的位置。 只能转换有效的 ASCII 字符 0 到 9 和大写 A 到 F。 任何其它字符都将被转换为零。

8 位 ASCII 编码的字符将被转换为 4 位十六进制半字节。 两个 ASCII 字符可存储在单个字节中。

参数 IN 和 OUT 指定的是字节数组而不是十六进制 String 数据。 ASCII 字符将被转换, 并以其被读取的顺序放置在十六进制输出中。 如果 ASCII 字符数为奇数,则在最后一个转换的十六进制数字的最右侧半字节中放置零。

表格 8- 44 ASCII 到十六进制 (ATH) 转换示例

IN 字符字节 N OUT 值 ENO
'0123' 4 W#16#0123 TRUE
'123AFx1a23' 10 16#123AF01023 FALSE
'a23' 3 W#16#A230 TRUE

表格 8- 45 HTA 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-18 ret_val := HTA( in:=_variant_in_, n:=_uint_in_, out=>_variant_out_); 将压缩的十六进制数字转换为相应的 ASCII 字符字节。

表格 8- 46 HTA 指令的数据类型

参数和类型 数据类型 说明
IN IN Variant 指向输入字节数组的指针
N IN UInt 要转换的字节数(每个输入字节有两个 4 位半字节,并会生成

2N 个 ASCII 字符)

RET_VAL OUT Word 执行条件代码
OUT OUT Variant 指向 ASCII 字符字节数组的指针

转换从参数 IN 指定的位置开始,并持续 N 个字节。 每个 4 位半字节都会转换为单个 8

位 ASCII 字符,并会生成 2N 个 ASCII 字符输出字节。 全部 2N 个输出字节都会被写为

ASCII 字符 0 到 9 以及大写的 A 到 F。参数 OUT 指定一个字节数组,而不是字符串。

十六进制字节的每个半字节将按其读入的顺序转换为一个字符(首先转换十六进制数字最左侧的半字节,然后转换该字节最右侧的半字节)。

表格 8- 47 十六进制到 ASCII (HTA) 转换示例

IN 值 N OUT 字符字节 ENO(执行 HTA 之后,ENO 始终为 TRUE)
W#16#0123 2 '0123' TRUE
DW#16#123AF012 4 '123AF012' TRUE

表格 8- 48 ATH and HTA 条件代码

RET_VAL

(W#16#....)

说明 ENO
0000 无错误 TRUE
0007 无效的 ATH 输入字符: 发现不属于 ASCII 字符 0-9、小写 a-f 或大写 A-F

的字符

FALSE
8101 非法或无效的输入指针,例如,访问一个不存在的数据块。 FALSE
8120 输入字符串的格式无效,即,最大值 = 0、最大值 =255、当前值 > 最大值或允许的指针长度 < 最大值 FALSE
8182 输入缓冲区对于 N 来说过小 FALSE
8151 数据类型不允许用于输入缓冲区 FALSE
8301 非法或无效的输出指针,例如,访问一个不存在的数据块。 FALSE
8320 输出字符串的格式无效,即,最大值 = 0、最大值 =255、当前值 > 最大值或允许的指针长度 < 最大值 FALSE
8382 输出缓冲区对于 N 来说过小 FALSE
8351 数据类型不允许用于输出缓冲区 FALSE

字符串操作指令

控制程序可以使用以下字符串和字符指令为操作员显示和过程日志创建消息。

LEN

表格 8- 49 长度指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-19 out := LEN(in); LEN(长度)提供输出 OUT 处的字符串 IN 的当前长度。 空字符串的长度为零。

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

参数和类型 数据类型 说明
IN IN String 输入字符串
OUT OUT Int, DInt, Real, LReal IN 字符串的有效字符数

表格 8- 51 ENO 状态

ENO 条件 OUT
1 没有无效字符串条件 有效字符串长度
0 IN 的当前长度超出 IN 的最大长度 当前长度被设置为 0
IN 的最大长度不在分配的存储范围内
IN 的最大长度为 255(非法长度)
CONCAT

表格 8- 52 连接字符串指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-20 out := CONCAT(in1, in2); CONCAT(连接字符串)将字符串参数 IN1 和 IN2 连接成一个字符串,并在 OUT 输出。 连接后,字符串 IN1 是组合字符串的左侧部分,而 IN2 是其右侧部分。

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

参数和类型 数据类型 说明
IN1 IN String 输入字符串 1
IN2 IN String 输入字符串 2
OUT OUT String 组合字符串(字符串 1 + 字符串 2)

表格 8- 54 ENO 状态

ENO 条件 OUT
1 未检测到错误 有效字符
0 连接后的结果字符串比 OUT 字符串的最大长度长 复制结果字符串字符直到达到

OUT 的最大长度为止

IN1 的当前长度超出 IN1 的最大长度,IN2 的当前长度超出 IN2 的最大长度,或 OUT 的当前长度超出 OUT 的最大长度(无效字符串) 当前长度被设置为 0
IN1、IN2 或 OUT 的最大长度不在分配的存储范围内
IN1 或 IN2 的最大长度为 255,或 OUT 的最大长度为 0 或 255
LEFT、RIGHT 和 MID

表格 8- 55 左侧、右侧和中间子串操作

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-21 out := LEFT(in, L); LEFT(左侧子串)提供由字符串参数 IN 的前 L 个字符所组成的子串。

  • 如果 L 大于 IN 字符串的当前长度,则在 OUT 中返回整个

IN 字符串。

  • 如果输入是空字符串,则在 OUT 中返回空字符串。
西门子s7-1200的扩展指令-22 out := MID(in, L, p); MID(中间子串)提供字符串的中间部分。 中间子串为从字符位置 P(包括该位置)开始的 L 个字符的长度。

如果 L 和 P 的和超出字符串参数 IN 的当前长度,则返回从字符位置 P 开始并一直到 IN 字符串结尾的子串。

西门子s7-1200的扩展指令-23 out := RIGHT(in, L); RIGHT(右侧子串)提供字符串的最后 L 个字符。

  • 如果 L 大于 IN 字符串的当前长度,则在参数 OUT 中返回整个 IN 字符串。
  • 如果输入是空字符串,则在 OUT 中返回空字符串。

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

参数和类型 数据类型 说明
IN IN String 输入字符串
L IN Int 要创建的子串的长度:

  • LEFT 使用字符串最左侧的字符数
  • RIGHT 使用字符串最右侧的字符数
  • MID 使用字符串中从位置 P 开始的字符数
P IN Int 仅限 MID: 要复制的第一个子串字符的位置

P= 1,表示 IN 字符串的起始字符位置

OUT OUT String 输出字符串

表格 8- 57 ENO 状态

ENO 条件 OUT
1 未检测到错误 有效字符
0
  • L 或 P 小于或等于 0
  • P 大于 IN 的最大长度
  • IN 的当前长度超出 IN 的最大长度,或者 OUT 的当前长度超出 OUT 的最大长度
  • IN 或 OUT 的最大长度不在分配的存储范围内
  • IN 或 OUT 的最大长度为 0 或 255
当前长度被设置为 0
要复制的子串长度 (L) 比 OUT 字符串的最大长度长。 复制字符,直到达到 OUT 的最大长度为止
仅限 MID: L 或 P 小于或等于 0 当前长度被设置为 0
仅限 MID: P 大于 IN 的最大长度
IN1 的当前长度超出 IN1 的最大长度,或者 IN2 的当前长度超出

IN2 的最大长度(无效字符串)

当前长度被设置为 0
IN1、IN2 或 OUT 的最大长度不在分配的存储范围内
IN1、IN2 或 OUT 的最大长度为 0 或 255(非法长度)
DELETE

表格 8- 58 删除子串指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-24 out := DELETE(in, L, p); 从字符串 IN 中删除 L 个字符。 从字符位置 P(包括该位置)处开始删除字符,剩余字串在参数 OUT 中输出。

  • 如果 L 等于零,则在 OUT 中返回输入字符串。
  • 如果 L 与 P 的和大于输入字符串的长度,则一直删除到该字符串的末尾。

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

参数和类型 数据类型 说明
IN IN String 输入字符串
L IN Int 要删除的字符数
P IN Int 要删除的第一个字符的位置: IN 字符串的第一个字符的位置编号为 1
OUT OUT String 输出字符串

表格 8- 60 ENO 状态

ENO 条件 OUT
1 未检测到错误 有效字符
0 P 大于 IN 的当前长度 将 IN 复制到 OUT 且不删除任何字符
删除字符后的结果字符串比 OUT 字符串的最大长度长 复制结果字符串字符,直到达到 OUT 的最大长度为止
L 小于 0,或者 P 小于或等于 0 当前长度被设置为 0
IN 的当前长度超出 IN 的最大长度,或者 OUT 的当前长度超出

OUT 的最大长度

IN 或 OUT 的最大长度不在分配的存储范围内
IN 或 OUT 的最大长度为 0 或 255
INSERT

表格 8- 61 插入子串指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-25 out := INSERT(in1, in2, p); 将字符串 IN2 插入字符串 IN1。 在位置 P 的字符后开始插入。

表格 8- 62 参数的数据类型

参数和类型 数据类型 说明
IN1 IN String 输入字符串 1
IN2 IN String 输入字符串 2
P IN Int 字符串 IN1 中字符串 IN2 插入点前的最后一个字符位置字符串 IN1 的第一个字符的位置编号为 1。
OUT OUT String 结果字符串

表格 8- 63 ENO 状态

ENO 条件 OUT
1 未检测到错误 有效字符
0 P 大于 IN1 的长度 IN2 紧接最后一个 IN1 字符与 IN1

连接

P 小于 0 当前长度被设置为 0
插入后的结果字符串比 OUT 字符串的最大长度长 复制结果字符串字符,直到达到

OUT 的最大长度为止

IN1 的当前长度超出 IN1 的最大长度,IN2 的当前长度超出

IN2 的最大长度,或 OUT 的当前长度超出 OUT 的最大长度(无效字符串)

当前长度被设置为 0
IN1、IN2 或 OUT 的最大长度不在分配的存储范围内
IN1 或 IN2 的最大长度为 255,或 OUT 的最大长度为 0 或

255

REPLACE

表格 8- 64 替换子串指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-26 out := REPLACE(

in1:=_string_in_, in2:=_string_in_, L:=_int_in_, p:=_int_in);

替换字符串参数 IN1 中的 L 个字符。 使用字符串参数 IN2 中的替换字符,从字符串 IN1 的字符位置 P(包括该位 置)开始替换。

表格 8- 65 参数的数据类型

参数和类型 数据类型 说明
IN1 IN String 输入字符串
IN2 IN String 替换字符的字符串
L IN Int 要替换的字符数
P IN Int 要替换的第一个字符的位置
OUT OUT String 结果字符串

如果参数 L 等于零,则在字符串 IN1 的位置 P 处插入字符串 IN2,而不删除字符串 IN1

中的任何字符。

如果 P 等于 1,则用字符串 IN2 的字符替换字符串 IN1 的前 L 个字符。

表格 8- 66 ENO 状态

ENO 条件 OUT
1 未检测到错误 有效字符
0 P 大于 IN1 的长度 IN2 紧接最后一个 IN1 字符与 IN1

连接

P 在 IN1 范围内,但 IN1 中剩余的字符数小于 L IN2 从位置 P 开始替换 IN1 的后端字符
替换后的结果字符串比 OUT 字符串的最大长度长 复制结果字符串字符,直到达到

OUT 的最大长度为止

IN1 的最大长度为 0 IN2 字符被复制到 OUT
L 小于 0,或者 P 小于或等于 0 当前长度被设置为 0
IN1 的当前长度超出 IN1 的最大长度,IN2 的当前长度超出

IN2 的最大长度,或 OUT 的当前长度超出 OUT 的最大长度

IN1、IN2 或 OUT 的最大长度不在分配的存储范围内
IN1 或 IN2 的最大长度为 255,或 OUT 的最大长度为 0 或

255

FIND

表格 8- 67 查找子串指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-27 out := FIND(

in1:=_string_in_, in2:=_string_in);

提供由 IN2 指定的子串在字符串 IN1 中的字符位置。 从左侧开始搜索。 在 OUT 中返回 IN2 字符串第一次出现的字符位置。 如果在字符串 IN1 中没有找到字符串 IN2,则返回零。

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

参数和类型 数据类型 说明
IN1 IN String 在该字符串内搜索
IN2 IN String 搜索该字符串
OUT OUT Int 字符串 IN1 中第一个搜索匹配项的字符位置

表格 8- 69 ENO 状态

ENO 条件 OUT
1 未检测到错误 有效字符位置
0 IN2 大于 IN1 字符位置被设置为 0
IN1 的当前长度超出 IN1 的最大长度,或者 IN2 的当前长度超出 IN2 的最大长度(无效字符串)
IN1 或 IN2 的最大长度不在分配的存储范围内
IN1 或 IN2 的最大长度为 255

分布式 I/O(PROFINET、PROFIBUS 或 AS-Interface)

分布式 I/O 指令

可对 PROFINET、PROFIBUS 或 AS-i 使用以下分布式 I/O 指令:

        • RDREC 指令 (页 291): 可以从模块或设备中读取编号为 INDEX 的数据记录。
        • WRREC 指令 (页 291): 可以将编号为 INDEX 的数据记录传送到由 ID 定义的模块或设备。
        • RALRM 指令 (页 294): 可以从模块或设备接收中断及其全部相关信息,并将此信息提供给它的输出参数。
        • DPRD_DAT 指令 (页 302): 必须利用 DPRD_DAT 指令从模块或设备读取超过 64 个字节的一致性数据区。
        • DPWR_DAT 指令 (页 302): 必须利用 DPWR_DAT 指令将超过 64 个字节的一致性数据区写入模块或设备。

DPNRM_DG 指令 (页 305)只能用于 PROFIBUS。 可以“EN 50 170 第 2 卷,

PROFIBUS”所指定的格式来读取 DP 从站的当前诊断数据。

RDREC 和 WRREC

可以对 PROFINET、PROFIBUS 和 AS-Interface 使用 RDREC(读取记录)和 WRREC

(写入记录)指令。

表格 8- 70 RDREC 和 WRREC 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-28 "RDREC_DB"(

req:=_bool_in_, ID:=_word_in_, index:=_dint_in_, mlen:=_uint_in_, valid=>_bool_out_, busy=>_bool_out_, error=>_bool_out_, status=>_dword_out_, len=>_uint_out_, record:=_variant_inout_);

使用 RDREC 指令从通过 ID 寻址的组件(如中央机架或分布式组件

(PROFIBUS DP 或 PROFINET

IO))读取编号为 INDEX 的数据记录。 在 MLEN 中分配要读取的最大字节数。 目标区域 RECORD 的选定长度至少应该为 MLEN 个字节。

西门子s7-1200的扩展指令-29 "WRREC_DB"(

req:=_bool_in_, ID:=_word_in_, index:=_dint_in_, len:=_uint_in_, done=>_bool_out_, busy=>_bool_out_, error=>_bool_out_, status=>_dword_out_, record:=_variant_inout_);

使用 WRREC 指令将记录号为

INDEX 的数据 RECORD 传送到通过 ID 寻址的 DP 从站/PROFINET

IO 设备组件,如中央机架上的模块或分布式组件(PROFIBUS DP 或PROFINET IO)。

分配要传送的数据记录的字节长 度。 因此,源区域 RECORD 的选

定长度至少应该为 LEN 个字节。

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

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

表格 8- 71 RDREC 和 WRREC 参数的数据类型

参数和类型 数据类型 说明
REQ IN Bool REQ = 1:传送数据记录
ID IN HW_IO (Word) DP 从站/PROFINET IO 组件(模块或子模块)的逻辑地址:

  • 对于输出模块,必须将位 15 置位(例如,对于地址

5: ID:=DW#16#8005)。

  • 对于组合模块,应指定两个地址中的较小者。: 可以通过以下两种方法之一来确定设备 ID:
  • 通过选择下列“网络视图”(Network view) 选项:
    • “设备”(灰色框)
    • 设备的“属性”
    • “硬件标识符”

: 然而,并非所有设备都会显示硬件标识符。

  • 通过选择下列“项目树”(Project tree) 菜单选项:
    • PLC 变量
    • 默认变量表
    • “系统常量”选项卡

将显示所有已组态的设备硬件标识符。

INDEX IN Byte, Word, USInt, UInt, SInt, Int, DInt 数据记录号
MLEN IN Byte, USInt, UInt 要获取的数据记录信息的最大长度(字节)(RDREC)
VALID OUT Bool 新数据记录已接收并且有效 (RDREC)。 上一请求已完成且没有出错后,VALID 位将保持为 TRUE 一个扫描周

期时间。

DONE OUT Bool 已传送数据记录 (WRREC)。 上一请求已完成且没有出错后,DONE 位将保持为 TRUE 一个扫描周期时间。
BUSY OUT Bool
  • BUSY = 1:读取 (RDREC) 或写入 (WRREC) 过程尚未终止。
  • BUSY = 0:数据记录传送已完成。
参数和类型 数据类型 说明
ERROR OUT Bool ERROR = 1:出现读取 (RDREC) 或写入 (WRREC) 错误。 上一请求因错误而终止后,ERROR 位将保持为

TRUE 一个扫描周期时间。 STATUS 参数中的错误代码

值仅在 ERROR = TRUE 的一个扫描周期内有效。

STATUS OUT DWord 块状态或错误信息
LEN OUT (RDREC)

IN (WRREC)

UInt
  • 已获取的数据记录信息的长度 (RDREC)
  • 要传送的数据记录的最大长度(字节)(WRREC)
RECORD IN_OUT Variant
  • 已获取的数据记录的目标区域 (RDREC)
  • 数据记录 (WRREC)

RDREC 和 WRREC 指令以异步方式运行,即,处理过程跨越多个指令调用。 以 REQ =

1 调用 RDREC 或 WRREC 来启动作业。

通过输出参数 BUSY 和输出参数 STATUS 的两个中间字节显示作业状态。 输出参数

BUSY 的值为 FALSE 时,说明数据记录的传送完成。

输出参数 VALID (RDREC) 或 DONE (WRREC) 为 TRUE 时(只持续一个扫描周期), 表示数据记录已成功传送到目标区域 RECORD (RDREC) 或目标设备 (WRREC)。 使用RDREC 时,输出参数 LEN 包含所获取数据的长度(字节)。

输出参数 ERROR (只在 ERROR = TRUE 时持续一个扫描周期)表示发生数据记录传 送错误。 在这种情况下,输出参数 STATUS (只在 ERROR = TRUE 时持续一个扫描周期)包含错误信息。

由硬件设备制造商定义数据记录。 有关数据记录的详细信息,请参见硬件设备制造商的设备文档。

说明

如果已通过 GSD 文件(GSD 修订版 3 及更高版本)组态 DPV1 从站且 DP 主站的 DP 接口已设置为“S7 兼容”(S7 compatible),则可能无法在用户程序中通过“RDREC”从 I/O 模块读取数据记录,或通过“WRREC”将记录写入 I/O 模块。 这种情况下,DP 主站寻址错误的插槽(组态的插槽 + 3)。

解决方法: 将 DP 主站的接口设置为“DPV1”。

说明

“RDREC”和“WRREC”指令的接口与“符合 IEC 61131-3 的 PROFIBUS 准则、PROFIBUS

通信和代理函数块”中定义的“RDREC”和“WRREC”FB 完全相同。

说明

如果使用“RDREC”或“WRREC”读或写 PROFINET IO 的数据记录,则 INDEX、MLEN 和

LEN 参数中的负值将被解释为无符号 16 位整型值。

RALRM

可以对 PROFINET 和 PROFIBUS 使用 RALRM(读取报警)指令。

表格 8- 72 RALRM 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-30 "RALRM_DB"(

mode:=_int_in_, f_ID:=_word_in_, mlen:=_uint_in_, new=>_bool_out_, status=>_dword_out_, ID=>_word_out_, len=>_uint_out_, tinfo:=_variant_inout_, ainfo:=_variant_inout_);

使用 RALRM(读取报警)指令从 PROFIBUS 或

PROFINET I/O 模块/设备读取诊断中断信息。

输出参数中的信息包含被调用 OB 的启动信息以及中断源的信息。

在中断 OB 中调用 RALRM,可返回导致中断的事件的相关信息。 在 S7-1200 中,仅支持诊断中断 (OB82)。

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

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

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

参数和类型 数据类型 说明
MODE IN Byte, USInt, SInt, Int 工作模式
F_ID IN HW_IO (Word) 组件(模块)的逻辑起始地址,将从该地址接收中断: 可以通过以下两种方法之一来确定设备 ID:

  • 通过选择下列“网络视图”(Network view) 选项:
    • “设备”(灰色框)
    • 设备的“属性”
    • “硬件标识符”

: 并非所有设备都会显示硬件标识符。

  • 通过选择下列“项目树”(Project tree) 菜单选项:
    • PLC 变量
    • 默认变量表
    • “系统常量”选项卡
    • 将显示所有已组态的设备硬件标识符。
MLEN IN Byte, USInt, UInt 要接收的数据中断信息的最大长度(字节)。如果 MLEN 为

0,则允许接收的数据中断信息量与 AINFO 目标区域中提供的数据中断信息量相同。

NEW OUT Bool 已接收新中断。
STATUS OUT DWord RALRM 指令的状态。 有关详细信息,请参见 “RDREC、WRREC 和 RALRM 的 STATUS 参数” (页 297)。
ID OUT HW_IO (Word) 导致诊断中断的 I/O 模块的硬件标识符

: 有关如何确定设备 ID 的说明,请参见参数 F_ID 。

LEN OUT DWord, UInt,

UDInt, DInt, Real, LReal

已接收的 AINFO 中断信息的长度
TINFO IN_OUT Variant 任务信息: OB 启动和管理信息的目标范围。 TINFO 的长度始终为 32 个字节。
AINFO IN_OUT Variant 中断信息: 头信息和附加中断信息的目标区域。 对于AINFO,如果 MLEN 大于 0,则提供的长度至少为 MLEN 个字节。AINFO 的长度是可变的。

说明

如果在启动事件不是 I/O 中断的 OB 中调用“RALRM”,该指令在输出中提供的信息会相应减少。

在不同的 OB 中调用“RALRM”时,务必要使用不同的背景数据块。 如果评估在关联中断

OB 外部调用“RALRM”得出的数据,则应对每个 OB 启动事件单独使用一个数据块。

说明

“RALRM”指令的接口与“符合 IEC 61131-3 的 PROFIBUS 准则、PROFIBUS 通信和代理函数块”中定义的“RALRM”FB 完全相同。

调用 RALRM

可以在三种不同的操作模式 (MODE) 下调用 RALRM 指令。

表格 8- 74 RALRM 指令操作模式

MODE 说明
0
  • ID 包含触发中断的 I/O 模块的硬件标识符。
  • 输出参数 NEW 被设置为 TRUE。
  • LEN 产生 0 输出。
  • AINFO 和 TINFO 不使用任何信息进行更新。
1
  • ID 包含触发中断的 I/O 模块的硬件标识符。
  • 输出参数 NEW 被设置为 TRUE。
  • LEN 产生输出,数量为返回的 AINFO 数据的字节数。
  • AINFO 和 TINFO 使用中断相关信息进行更新。
2 如果分配给输入参数 F_ID 的硬件标识符触发了中断,则:

  • ID 包含触发中断的 I/O 模块的硬件标识符。 应与 F_ID 处的值相同。
  • 输出参数 NEW 被设置为 TRUE。
  • LEN 产生输出,数量为返回的 AINFO 数据的字节数。
  • AINFO 和 TINFO 使用中断相关信息进行更新。

说明

如果为过短的 TINFO 或 AINFO 指定目标区域,则 RALRM 无法返回完整信息。

MLEN 可限制所返回 AINFO 数据的量。

有关如何解释 TINFO 和 AINFO 数据的信息,请参见 STEP 7 在线信息系统的 AINFO 参数和 TINFO 参数。

RDREC、WRREC 和 RALRM 的 STATUS 参数

输出参数 STATUS 包含被解释为 ARRAY[1...4] OF BYTE 的错误信息,其结构如下:

表格 8- 75 STATUS 输出数组

数组元素 名称 说明
STATUS[1] Function_Nu m
  • B#16#00(如果无错误)
  • DPV1-PDU 的功能 ID: 如果发生错误,则对 , B#16#80 进行或运算

(对于读取数据记录:B#16#DE;对于写入数据记录:

B#16#DF)。 如果未使用 DPV1 协议元素,则输出 B#16#C0 。

STATUS[2] Error_Decode 错误 ID 的位置
STATUS[3] Error_Code_1 错误 ID
STATUS[4] Error_Code_2 制造商特定的错误 ID 扩展

表格 8- 76 STATUS[2] 值

Error_decode

(B#16#....)

来源 说明
00 到 7F CPU 无错误或无警告
80 DPV1 因不符合 IEC 61158-6 而出错
81 到 8F CPU B#16#8x 表示在指令的第“x”个调用参数中存在错误。
FE、FF DP 配置文件 配置文件特定错误

表格 8- 77 STATUS[3] 值

Error_decode

(B#16#....)

Error_code_1

(B#16#....)

解释 (DVP1) 说明
00 00 无错误,无警告
70 00 保留,拒绝 初始调用;未传送活动数据记录
01 保留,拒绝 初始调用;已开始传送数据记录
02 保留,拒绝 中间调用;已激活数据记录传送
80 90 保留,通过 逻辑起始地址无效
92 保留,通过 Variant 指针的类型非法
93 保留,通过 通过 ID 或 F_ID 寻址的 DP 组件未组态。
96 “RALRM (页 294)”不能提供 OB 启动信息、管理信息、标题信息或附加中断信息。

对于 OB 4x、55、56、57、82 和 83,可以使用

“DPNRM_DG (页 305)”指令异步读取相关 DP 从

站的当前诊断消息帧(OB 启动信息中的地址信息)。

A0 读取错误 读取模块时得到否定确认。
A1 写错误 写入模块时得到否定确认
A2 模块故障 第 2 层出现 DP 协议错误(例如,从站故障或总线故障)
A3 保留,通过
  • PROFIBUS DP: 直接数据链路映射器或用户接口/用户出现 DP 协议错误
  • PROFINET IO: 常规 CM 错误
A4 保留,通过 通信总线上的通信中断
A5 保留,通过 -
A7 保留,通过 DP 从站或模块已被占用(临时错误)。
A8 版本冲突 DP 从站或模块报告出现不兼容版本。
A9 特性不受支持 特性不受 DP 从站或模块支持
AA 到 AF 用户特定 DP 从站或模块报告其应用中出现制造商特定错

误。 请检查 DP 从站或模块的制造商提供的文档。

B0 索引无效 模块中出现未知数据记录;非法数据记录编号 ≥ 256
Error_decode

(B#16#....)

Error_code_1

(B#16#....)

解释 (DVP1) 说明
B1 写长度错误 RECORD 参数中的长度信息不正确。

  • 对于“RALRM”: AINFO 中的长度错误

注意: 要立即访问有关如何解释“AINFO”返回缓冲区的信息,请参见 STEP 7 的在线信息系统。

  • 对于“RDREC (页 291)”和“WRREC (页 291)”:

“MLEN”中的长度错误

B2 无效插槽 组态的插槽未被占用。
B3 类型冲突 实际模块类型与指定的模块类型不匹配。
B4 无效区域 DP 从站或模块报告对无效区域的访问。
B5 状态冲突 DP 从站或模块未就绪
B6 访问被拒绝 DP 从站或模块拒绝访问。
B7 无效范围 DP 从站或模块报告参数或值的范围无效。
B8 无效参数 DP 从站或模块报告参数无效。
B9 无效类型 DP 从站或模块报告类型无效:

  • 对于“RDREC (页 291)”: 缓冲区过小(无法读取子网)
  • 对于“WRREC (页 291)”: 缓冲区过小(无法写入子网)
BA 到 BF 用户特定 DP 从站或模块在访问时报告制造商特定错误。请检查 DP 从站或模块的制造商提供的文档。
C0 读限制冲突
  • 对于“WRREC (页 291)”: 仅当 CPU 处于

STOP 模式时才能写入数据。

注意: 这意味着无法通过用户程序写入数据。只能使用 PG/PC 在线写入数据。

  • 对于“RDREC (页 291)”: 模块可发送数据记录,但没有数据,或仅当 CPU 处于 STOP 模式时才能读取数据。

注意: 如果仅当 CPU 处于 STOP 模式时才能读取数据,则用户程序无法进行评估。 在这种

情况下,只能使用 PG/PC 在线读取数据。

Error_decode

(B#16#....)

Error_code_1

(B#16#....)

解释 (DVP1) 说明
C1 写限制冲突 针对相同数据记录向模块发送的上一次写请求的数据尚未被该模块处理。
C2 资源忙 模块正在处理 CPU 允许的最多作业数。
C3 资源不可用 所需操作资源当前已被占用。
C4 内部临时错误。 无法执行作业。

重复作业。 如果此错误经常发生,请检查安装的电气干扰源。

C5 DP 从站或模块不可用
C6 由于取消优先级而使数据记录传送被取消。
C7 作业由于 DP 主站的暖启动或冷启动而中止。
C8 到 CF DP 从站或模块报告制造商特定资源错误。 请检查 DP 从站或模块的制造商提供的文档。
Dx 用户特定 DP 从站特定。 参见 DP 从站的说明。
81 00 到 FF 初始调用参数错误(对于“RALRM (页 294)”: MODE) MODE)
00 非法工作模式
82 00 到 FF 第二个调用参数错误
88 00 到 FF 第八个调用参数错误(对于“RALRM (页 294)”: TINFO)

注意: 要立即访问有关如何解释“TINFO”返回缓冲区的信息,请参见 STEP 7 的在线信息系统。

01 语法 ID 错误
23 超出数量结构或目标区域过小
24 范围 ID 错误
32 DB/DI 号超出用户范围
3A 区域 ID DB/DI 的 DB/DI 号为 NULL,或指定的

DB/DI 不存在。

89 00 到 FF 第九个调用参数错误(对于“RALRM (页 294)”: AINFO)

注意: 要立即访问有关如何解释“AINFO”返回缓冲区的信息,请参见 STEP 7 的在线信息系统。

Error_decode

(B#16#....)

Error_code_1

(B#16#....)

解释 (DVP1) 说明
01 语法 ID 错误
23 超出数量结构或目标区域过小
24 范围 ID 错误
32 DB/DI 号超出用户范围
3A 区域 ID DB/DI 的 DB/DI 号为 NULL,或指定的

DB/DI 不存在。

8A 00 到 FF 第 10 个调用参数错误
8F 00 到 FF 第 15 个调用参数错误
FE、FF 00 到 FF 配置文件特定错误

数组元素 STATUS[4]

出现 DPV1 错误时,DP 主机会将 STATUS[4] 传递给 CPU 和指令。 如果没有 DPV1 错误,该值将被设置为 0,但对于 RDREC 有以下例外情况:

        • 如果 MLEN > RECORD 中的目标区域长度,则 STATUS[4] 包含 RECORD 中的目标区域长度。
        • 如果实际数据记录长度 < MLEN < RECORD 中的目标区域长度,则 STATUS[4] =

MLEN。

        • 如果必须设置 STATUS[4] > 255,则 STATUS[4] = 0

在 PROFINET IO 中,STATUS[4] 的值为 0。

DPRD_DAT 和 DPWR_DAT

可以对 PROFINET 和 PROFIBUS 使用 DPRD_DAT(读取一致性数据)和 DPWR_DAT

(写入一致性数据)指令。

表格 8- 78 DPRD_DAT 和 DPWR_DAT 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-31 ret_val := DPRD_DAT( laddr:=_word_in_,

record=>_variant_out_);

使用 DPRD_DAT 指令可读取 DP 标准从站

/PROFINET IO 设备的一致性数据。 如果数据传送过程中未出错,则已读取的数据将被输入到通过RECORD 参数设置的目标区域中。 目标区域的长度必须与通过 STEP 7 为所选模块组态的长度相同。 调用 DPRD_DAT 指令时,只能访问已组态

的起始地址下的一个模块/DP 标识的数据。

西门子s7-1200的扩展指令-32 ret_val := DPWR_DAT( laddr:=_word_in_, record:=_variant_in_); 使用 DPWR_DAT 指令可将 RECORD 中的数据一致性地传送到已寻址的 DP 标准从站/PROFINET

IO 设备。 源区域的长度必须与通过 STEP 7 为所

选模块组态的长度相同。

CPU 最多支持 64 个字节的一致性数据。 对于超过 64 个字节的一致性数据区域,必须使用 DPRD_DAT 和 DPWR_DAT 指令。 如果需要,可对 1 个字节或更大的数据区域使用这些指令。 如果访问被拒绝,将出现错误代码 W#16#8090。

说明

如果正在对一致性数据使用 DPRD_DAT 和 DPWR_DAT 指令,则必须从过程映像自动更新中删除该一致性数据。 有关详细信息,请参见 “PLC 概念: 用户程序的执行” (页 69)。

表格 8- 79 参数的数据类型

参数和类型 数据类型 说明
LADDR IN HW_IO

(Word)

  • 模块的“I”区域中已组态的起始地址,将从该处读取数据

(DPRD_DAT)

  • 模块的过程映像输出区域中已组态的起始地址,数据将被写入该地址 (DPWR_DAT)

必须以十六进制格式输入地址(例如,输入或输出地址 100 表示: LADDR:=W#16#64)。

RECORD OUT Variant 已读取的用户数据的目标区域 (DPRD_DAT) 或要写入的用户数据的源区域 (DPWR_DAT)。 此区域的大小必须与通过 STEP 7 为所选模块组态的区域大小完全相同。只允许使用数据类型

Byte。

RET_VAL OUT Int 如果在此函数已激活情况下发生错误,则返回值中将包含一个错误代码。

DPRD_DAT 操作

目标区域的长度必须与使用 STEP 7 为所选模块组态的长度相同。如果数据传送期间未出现错误,则会将已读取的数据输入到由 RECORD 标识的目标区域中。

如果从具有模块化设计或具有多个 DP 标识符的 DP 标准从站读取数据,则通过指定组态的起始地址,每次 DPRD_DAT 调用只能访问一个模块/DP 标识符的数据。

DPWR_DAT 操作

将 RECORD 中的数据一致性地传送到已寻址的 DP 标准从站/PROFINET IO 中。 数据以同步方式传送,即,指令完成时写入过程即完成。

源区域的长度必须与通过 STEP 7 为所选模块组态的长度相同。

如果 DP 标准从站具有模块化设计,则只能访问 DP 从站的一个模块。

表格 8- 80 DPRD_DAT 和 DPWR_DAT 错误代码

错误代码 说明
0000 未出错
808x 外部 DP 接口模块出现系统错误
错误代码 说明
8090 适用于下列情况之一:

  • 没有为指定的逻辑基址组态模块。
  • 忽略了有关一致性数据长度的限制。
  • 没有以十六进制格式在 LADDR 参数中输入起始地址。
8092 在 Any 引用中指定了一个非 Byte 的类型。
8093 LADDR 中指定的逻辑地址处不存在可以从其中读取 (DPRD_DAT) 一致性数据或向其写入 (DPWR_DAT) 一致性数据的 DP 模块/PROFINET IO 设备。
80A0 访问 I/O 设备时检测到访问错误 (DPRD_DAT)。
80A1 访问 I/O 设备时检测到访问错误 (DPWR_DAT)。
80B0 外部 DP 接口模块出现从站故障
80B1 指定的目标区域的长度 (DPRD_DAT) 或源区域的长度 (DPWR_DAT) 与通过 STEP 7

Basic 组态的用户数据的长度不同。

80B2、80B3、

80C2、80Fx

外部 DP 接口模块出现系统错误 (DPRD_DAT) 和 (DPWR_DAT)
87xy、808x 外部 DP 接口模块出现系统错误 (DPRD_DAT)
85xy 外部 DP 接口模块出现系统错误 (DPWR_DAT)
80C0 模块尚未读取数据 (DPRD_DAT)。
80C1 模块尚未处理模块中前一次写入作业的数据 (DPWR_DAT)。
8xyy1 常规错误信息

有关常规错误代码的更多信息,请参见 “扩展指令,分布式 I/O: RDREC、WRREC 和

RALRM 的错误信息” (页 297)。

说明

如果访问 DPV1 从站,这些从站的错误信息可从 DP 主站转发到指令。

DPNRM_DG

可以对 PROFIBUS 使用 DPNRM_DG(读取诊断数据)指令。

表格 8- 81 DPNRM_DG 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-33 ret_val := DPNRM_DG( req:=_bool_in_, laddr:=_word_in_, record=>_variant_out_, busy=>_bool_out_); 使用 DPNRM_DG 指令将以“EN 50 170 第 2 卷,

PROFIBUS”所指定的格式来读取 DP 从站的当前诊断数据。在顺利完成数据传输后,已读取的数据被输入到由

RECORD 指定的目标区域。

表格 8- 82 DPNRM_DG 指令的参数数据类型

参数和类型 数据类型 说明
REQ IN Bool REQ=1:读取请求
LADDR IN HW_DPSLAV E 所组态的 DP 从站诊断地址: 必须是该站点的地址,而不是

I/O 设备的地址。 在“网络”(Network) 视图的“设备组

态”(Device configuration) 中,选择相应站(不是设备的图像)来确定诊断地址。

输入十六进制格式的地址。 例如,诊断地址 1022 表示为

LADDR:=W#16#3FE。

RET_VAL OUT Int 如果在此函数已激活情况下发生错误,则返回值中将包含一个错误代码。 如果没有错误,则将实际传输的数据长度输入

RET_VAL。

RECORD OUT Variant 已读取的诊断数据的目标区域。 只允许 Byte 数据类型。 要读取的数据记录或目标区域的最小长度为 6。要发送的数据记录的最大长度为 240。

标准从站可提供大于 240 字节的诊断数据,最高可达 244 字节。 在这种情况下,将前 240 字节传送到目标区域,并在数据中设置溢出位。

BUSY OUT Bool BUSY=1:读取作业还未完成

通过在调用 DPNRM_DG 指令时将值 1 赋给输入参数 REQ 启动读取作业。 读取作业异步执行,即需要多次调用 DPNRM_DG 指令。 此作业的状态由输出参数 RET_VAL 和

BUSY 指示。

表格 8- 83 从站诊断数据结构

字节 说明
0 站状态 1
1 站状态 2
2 站状态 3
3 主站号
4 供应商 ID(高字节)
5 供应商 ID(低字节)
6 ... 附加从站诊断信息

表格 8- 84 DPNRM_DG 指令的错误代码

错误代码 说明 限制
0000 无错误 -
7000 首次调用时 REQ = 0: 没有激活的数据传输;BUSY 的值为 0。 -
7001 首次调用时 REQ = 1: 没有激活的数据传输;BUSY 的值为 1。 分布式 I/O
7002 临时调用(与 REQ 无关): 数据传送已经激活;BUSY 的值为

1。

分布式 I/O
8090 指定的逻辑基址无效: 无基址。 -
8092 在 Any 引用中指定的类型不是 Byte。 -
8093
  • 通过 LADDR 指定的模块不允许使用此指令(适用于 S7-1200

的 S7-DP 模块允许使用)。

  • LADDR 指定 I/O 设备,而不是站。 在“网络”(Network) 视图的

“设备组态”(Device configuration) 中,选择相应站(不是设备的图像)来确定 LADDR 的诊断地址。

-
80A2
  • 第 2 层出现 DP 协议错误(例如,从站故障或总线故障)
  • 对于 ET200S,无法在 DPV0 模式下读取数据记录。
分布式 I/O
80A3 用户接口/用户中出现 DP 协议错误 分布式 I/O
80A4 通信总线上出现通信故障 CPU 与外部 DP 接口模块之间发生错误。
错误代码 说明 限制
80B0
  • 相应模块类型不支持此指令。
  • 该模块不能识别数据记录。
  • 不允许使用数据目录号 241。
-
80B1 在 RECORD 参数中指定的长度不正确。 指定长度 > 记录长度
80B2 组态的插槽未被占用。 -
80B3 实际模块类型与要求的模块类型不匹配。 -
80C0 无诊断信息。 -
80C1 模块尚未处理其中同一数据记录前一次写入作业的数据。 -
80C2 模块正在处理 CPU 允许的最多作业数。 -
80C3 所需资源(存储器等)当前被占用。 -
80C4 内部临时错误。 作业无法处理。

请重复该作业。 如果此错误频繁发生,请检查系统是否存在电干扰源。

-
80C5 分布式 I/O 不可用。 分布式 I/O
80C6 数据记录传送因优先等级中止(重启或后台)而停止 分布式 I/O
8xyy1 常规错误代码

有关常规错误代码的更多信息,请参见 “扩展指令,分布式 I/O: RDREC、WRREC 和

RALRM 的错误信息” (页 297)。

中断

附加和分离指令

使用 ATTACH 和 DETACH 指令可激活和禁用由中断事件驱动的子程序。

表格 8- 85 ATTACH 和 DETACH 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-34 ret_val := ATTACH( ob_nr:=_int_in_, event:=_event_att_in_, add:=_bool_in_); ATTACH 启用响应硬件中断事件的中断

OB 子程序执行。

西门子s7-1200的扩展指令-35 ret_val := DETACH( ob_nr:=_int_in_, event:=_event_att_ in); DETACH 禁用响应硬件中断事件的中断

OB 子程序执行。

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

参数和类型 数据类型 说明
OB_NR IN OB_ATT 组织块标识符: 从使用“添加新块”(Add new block) 功能创建的可用硬件中断 OB 中进行选择。 双击该参数域,然后单

击助手图标可查看可用的 OB。

EVENT IN EVENT_ATT 事件标识符: 从在 PLC 设备组态中为数字输入或高速计数器启用的可用硬件中断事件中进行选择。 双击该参数域,然后单击助手图标可查看这些可用事件。
ADD

(仅限

ATTACH)

IN Bool
  • ADD = 0(默认值): 该事件将取代先前为此 OB 附加的所有事件。
  • ADD = 1:该事件将添加到先前为此 OB 附加的事件中。
RET_VAL OUT Int 执行条件代码
硬件中断事件

CPU 支持以下硬件中断事件:

        • 上升沿事件(所有内置 CPU 数字量输入和 SB 数字量输入)
          • 数字输入从 OFF 切换为 ON 时会出现上升沿,以响应连接到输入的现场设备的信号变化。
        • 下降沿事件(所有内置 CPU 数字量输入和 SB 数字量输入)
          • 数字输入从 ON 切换为 OFF 时会出现下降沿。
        • 高速计数器 (HSC) 当前值 = 参考值 (CV = RV) 事件(HSC 1 至 6)
          • 当前计数值从相邻值变为与先前设置的参考值完全匹配时,会生成 HSC 的 CV =

RV 中断。

        • HSC 方向变化事件(HSC 1 至 6)
          • 当检测到 HSC 从增大变为减小或从减小变为增大时,会发生方向变化事件。
        • HSC 外部复位事件(HSC 1 至 6)
          • 某些 HSC 模式允许分配一个数字输入作为外部复位端,用于将 HSC 的计数值重置为零。 当该输入从 OFF 切换为 ON 时,会发生此类 HSC 的外部复位事件。
在设备组态期间启用硬件中断事件

必须在设备组态中启用硬件中断。 如果要在组态或运行期间附加此事件,则必须在设备组态中为数字输入通道或 HSC 选中启用事件框。

PLC 设备组态中的复选框选项:

数字量输入

启用上升沿检测

启用下降沿检测

高速计数器 (HSC)

启用此高速计数器

生成计数器值等于参考计数值的中断

生成外部复位事件的中断

生成方向变化事件的中断

向用户程序添加新硬件中断 OB 代码块

默认情况下,第一次启用事件时,没有任何 OB 附加到该事件。 这可通过标签“HW 中 断:”(HW interrupt:) 设备组态 "<未连接>" 来进行标识。 只有硬件中断 OB 能附加到硬件中断事件。 所有现有的硬件中断 OB 都会出现在“HW 中断:”(HW interrupt:) 下拉列表中。 如果未列出任何 OB,则必须按下列步骤创建类型为“硬件中断”的 OB。 在项目树的

“程序块”(Program blocks) 分支下:

  1. 双击“添加新块”(Add new block),选择“组织块 (OB)”(Organization block (OB)),然后选择“硬件中断”(Hardware interrupt)。
  2. 也可以重命名 OB、选择编程语言(LAD 或 FBD)以及选择块编号(切换为手动并选择与建议块编号不同的块编号)。
  3. 编辑该 OB,添加事件发生时要执行的已编程响应。 可以从此 OB 调用最多嵌套四层深的 FC 和 FB。
OB_NR 参数

所有现有的硬件中断 OB 名称都会出现在“HW 中断:”(HW interrupt:) 下拉列表和

ATTACH / DETACH 参数 OB_NR 下拉列表中。

EVENT 参数

启用某个硬件中断事件时,将为该事件分配一个唯一的默认事件名称。 可以通过编辑“事件名称:”(Event name:) 编辑框更改该事件的名称,但该名称必须唯一。 这些事件名称将成为“常量”(Constants) 变量表中的变量名称,并显示在 ATTACH 和 DETACH 指令框的 EVENT 参数下拉列表中。 变量的值是用于标识事件的内部编号。

常规操作

每个硬件事件都可附加到一个硬件中断 OB 中,在发生该硬件中断事件时将排队执行该硬件中断 OB。 在组态或运行期间可附加 OB 事件。

用户可以在组态时将 OB 附加到已启用的事件或使其与该事件分离。 要在组态过程中向事件附加一个 OB,必须使用“HW 中断:”(HW interrupt:) 下拉列表(单击右侧的向下箭头),然后从可用的硬件中断 OB 列表中选择一个 OB。 从该列表中选择相应的 OB 名称,或者选择“<未连接>”(<not connected>) 以删除该附加关系。

也可以在运行期间附加或分离已启用的硬件中断事件。 在运行期间使用 ATTACH 或

DETACH 程序指令(如有必要可多次使用)将已启用的中断事件附加到相应的 OB 或与其分离。如果当前未附加到任何 OB(选择了设备组态中的“<未连接>”(<not connected>) 选项或由于执行了 DETACH 指令),则将忽略已启用的硬件中断事件。

DETACH 操作

使用 DETACH 指令将特定事件或所有事件与特定 OB 分离。如果指定了 EVENT,则仅将该事件与指定的 OB_NR 分离;当前附加到此 OB_NR 的任何其它事件仍保持附加状态。 如果未指定 EVENT,则分离当前附加到 OB_NR 的所有事件。

条件代码

表格 8- 87 条件代码

RET_VAL (W#16#....) ENO 说明
0000 1 无错误
0001 1 没有要分离的事件(仅 DETACH)
8090 0 OB 不存在
8091 0 OB 类型错误
8093 0 事件不存在

循环中断

SET_CINT(Set 循环中断)

表格 8- 88 SET_CINT(Set 循环中断指令)

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-36 ret_val := SET_CINT( ob_nr:=_int_in_, cycle:=_udint_in_, phase:=_udint_in_); 设置特定的中断 OB 以开始循环中断程序扫描过程。

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

参数和类型 数据类型 说明
OB_NR IN OB_CYCLIC OB 号(允许使用符号名称)
CYCLE IN UDInt 时间间隔(微秒)
参数和类型 数据类型 说明
PHASE IN UDInt 相移(微秒)
RET_VAL OUT Int 执行条件代码

时间参数示例:

          • 如果 CYCLE 时间 = 100 us,则由 OB_NR 引用的中断 OB 将每隔 100 us 中断一次循环程序扫描。 中断 OB 在执行后会将执行控制交回程序扫描过程,从而继续从中断位置开始扫描。
          • 如果 CYCLE 时间 = 0,则中断事件被禁用,并且不会执行中断 OB。
          • PHASE(相移)时间是 CYCLE 时间间隔开始前的指定延迟时间。 可使用相移来控制优先级较低的 OB 的执行时间。

如果以相同的时间间隔调用优先级较高和优先级较低的 OB,则只有在优先级较高的 OB 完成处理后才会调用优先级较低的 OB。 低优先级 OB 的执行起始时间会根据优先级较高的 OB 的处理时间来延迟。

㷊㠲䠡䬤䞭 /" 崬䙑

惹奵

T T T T
T
T T T

/" 悬氁⁁≱俐

/"

⁷⁁≱俐

如果希望以固定的时间周期来执行优先级较低的 OB,则相移时间应大于优先级较高的OB 的处理时间。

㠲䠡䬤䞭 /" 崬䙑

惹奵

T T T T

T T T T

䠡䬤

/" 悬氁⁁≱俐

/"

⁷⁁≱俐

表格 8- 90 条件代码

RET_VAL (W#16#....) 说明
0000 无错误
8090 OB 不存在或类型错误
8091 无效周期时间
8092 无效相移时间
80B2 OB 未附加事件
QRY_CINT(Query 循环中断)

表格 8- 91 QRY_CINT (Query 循环中断)

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-37 ret_val := QRY_CINT( ob_nr:=_int_in_, cycle=>_udint_out_, phase=>_udint_out ,

status=>_word_out_);

获取循环中断 OB 的参数和执行状态。返回的值早在执行 QRY_CINT 时便已存在。

表格 8- 92 参数的数据类型

参数和类型 数据类型 说明
OB_NR IN OB_CYCLIC OB 号(允许使用类似 OB_MyOBName 的符号名称)
RET_VAL OUT Int 执行条件代码
CYCLE OUT UDInt 时间间隔(微秒)
PHASE OUT UDInt 相移(微秒)
STATUS OUT Word 循环中断状态代码:

  • 位 0 到 4,请参见下面的 STATUS 表
  • 其它位,始终为 0

表格 8- 93 STATUS 参数

说明
0 0 CPU RUN 期间
1 启动过程中
1 0 中断已启用。
1 中断已通过 DIS_IRT 指令禁用。
2 0 中断未激活或已过期。
1 中断已激活。
4 0 通过 OB_NR 标识的 OB 不存在。
1 通过 OB_NR 标识的 OB 存在。
其它位 始终为 0

如果发生错误,RET_VAL 显示相应的错误代买,并且参数 STATUS = 0。

表格 8- 94 RET_VAL 参数

RET_VAL (W#16#....) 说明
0000 无错误
8090 OB 不存在或类型错误。
80B2 OB 未附加事件。

延时中断

可使用 SRT_DINT 和 CAN_DINT 指令启动和取消延时中断处理过程,或使用

QRY_DINT 指令查询中断状态。 每个延时中断都是一个在指定的延迟时间过后发生的一次性事件。 如果在延迟时间到期前取消延时事件,则不会发生程序中断。

表格 8- 95 SRT_DINT、CAN_DINT 和 QRY_DINT 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-38 ret_val := SRT_DINT( ob_nr:=_int_in_, dtime:=_time_in_, sign:=_word_in_); SRT_DINT 启动延时中断,在参数 DTIME

指定的延迟过后执行 OB。

西门子s7-1200的扩展指令-39 ret_val := CAN_DINT( ob_nr:=_int_in_); CAN_DINT 取消已启动的延时中断。 在这种情况下,将不执行延时中断 OB。
西门子s7-1200的扩展指令-40 ret_val := QRY_DINT( ob_nr:=_int_in_, status=>_word_out_); QRY_DINT 查询通过 OB_NR 参数指定的延时中断的状态。

表格 8- 96 参数的数据类型

参数和类型 数据类型 说明
OB_NR IN OB_DELAY 将在延迟时间过后启动的组织块 (OB): 从使用“添加新

块”(Add new block) 项目树功能创建的可用延时中断 OB 中进行选择。 双击该参数域,然后单击助手图标可查看可用的

OB。

DTIME 1 IN Time 延迟时间值(1 到 60000 ms)
SIGN 1 IN Word S7-1200 不使用: 接受任何值。 为避免发生错误,必须指定一个值。
RET_VAL OUT Int 执行条件代码
STATUS OUT Word QRY_DINT 指令: 所指定延时中断 OB 的状态,请参见下文表格

1 仅限 SRT_DINT

操作

SRT_DINT 指令指定延迟时间、启动内部延迟时间定时器以及将延时中断 OB 子程序与延时超时事件相关联。 指定的延迟时间过去后,将生成可触发相关延时中断 OB 执行的程序中断。在指定的延时发生之前执行 CAN_DINT 指令可取消进行中的延时中断。 激活延时和循环中断事件的总次数不得超过四次。

在项目中添加延时中断 OB 子程序

只有延时中断 OB 可分配给 SRT_DINT 和 CAN_DINT 指令。 新项目中不存在延时中断

OB。 必须将延时中断 OB 添加到项目中。 要创建延时中断 OB,请按以下步骤操作:

  1. 在项目树的“程序块”(Program blocks) 分支中双击“添加新块”(Add new block),选择“组织块 (OB)”(Organization block (OB)),然后选择“延时中断”(Time delay interrupt)。
  2. 可以重命名 OB、选择编程语言或选择块编号。 如果要分配与自动分配的编号不同的块编号,请切换到手动编号模式。
  3. 编辑延时中断 OB 子程序,并创建要在发生延时超时事件时执行的已编程响应。 可从延时中断 OB 调用其它最多嵌套四层深的 FC 和 FB 代码块。
  4. 编辑 SRT_DINT 和 CAN_DINT 指令的 OB_NR 参数时,将可以使用新分配的延时中断 OB 名称。
QRY_DINT 参数 STATUS

表格 8- 97 如果存在错误 (REL_VAL <> 0),则 STATUS = 0。

说明
0 0 在 RUN 模式下
1 在启动过程中
1 0 中断已启用。
1 中断已禁用。
2 0 中断未激活或已过期。
1 中断已激活。
4 0 不存在具有 OB_NR 中所指定 OB 号的 OB。
1 存在具有 OB_NR 中所指定 OB 号的 OB。
其它位 始终为 0
条件代码

表格 8- 98 SRT_DINT、CAN_DINT 和 QRY_DINT 的条件代码

RET_VAL (W#16#...) 说明
0000 未出错
8090 不正确的参数 OB_NR
8091 不正确的参数 DTIME
80A0 未启动延时中断。

异步事件中断

使用 DIS_AIRT 和 EN_AIRT 指令可禁用和启用报警中断处理过程。

表格 8- 99 DIS_AIRT 和 EN_AIRT 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-41 DIS_AIRT(); DIS_AIRT 可延迟新中断事件的处理。 可在 OB 中多次执行

DIS_AIRT。

西门子s7-1200的扩展指令-42 EN_AIRT(); 对先前使用 DIS_AIRT 指令禁用的中断事件处理,可使用 EN_AIRT 来启用。 每一次 DIS_AIRT 执行都必须通过一次 EN_AIRT 执行来取消。

必须在同一个 OB 中或从同一个 OB 调用的任意 FC 或 FB 中完成

EN_AIRT 执行后,才能再次启用此 OB 的中断。

西门子s7-1200的扩展指令-43警告
如果数字量输入通道的滤波时间更改自以前的设置,则新的“0”电平输入值可能需要保持长达 20.0 ms 的累积时间,然后滤波器才会完全响应新输入。 在此期间,可能不会检测到持续时间少于 20.0 ms 的短“0”脉冲事件或对其计数。

滤波时间的这种更改会引发意外的机械或过程操作,这可能会导致人员死亡、重伤和/或 设备损坏。

为了确保新的滤波时间立即生效,必须关闭 CPU 电源后再开启。

表格 8- 100 参数的数据类型

参数和类型 数据类型 说明
RET_VAL OUT Int 延迟次数 = 队列中的 DIS_AIRT 执行次数。

由操作系统会统计 DIS_AIRT 执行的次数。 在特别通过 EN_AIRT 指令再次取消之前或者在已完成处理当前 OB 之前,这些执行中的每一个都保持有效。 例如: 如果通过五次

DIS_AIRT 执行禁用中断五次,则在再次启用中断前,必须通过五次 EN_AIRT 执行来取消禁用。

再次启用中断事件后,将处理 DIS_AIRT 生效期间发生的中断;或者在完成执行当前 OB

后,立即处理中断。

参数 RET_VAL 表示禁用中断处理的次数,即已排队的 DIS_AIRT 执行的个数。 只有当参数 RET_VAL = 0 时,才会再次启用中断处理。

诊断(PROFINET 或 PROFIBUS)

诊断指令

以下诊断指令适用于 PROFINET 或 PROFIBUS:

        • GET_DIAG 指令 (页 324): 可读取指定设备的诊断信息。
        • DeviceStates 指令 (页 321): 可获取 I/O 子系统中分布式 I/O 设备的运行状态。
        • ModuleStates 指令 (页 322): 可获取分布式 I/O 设备中各模块的运行状态。
        • LED 指令 (页 319): 可读取 I/O 设备的 LED 状态。

分布式 I/O 的诊断事件

说明

对于 PROFIBUS IO 系统,除非硬件兼容性设置为允许 可接受替换模块 (页 125),并且有一个或多个模块丢失或者不是已组态模块的可接受替换模块,否则 CPU 在下载或循环上电后将转到 RUN 模式。

如下表所示,CPU 支持对分布式 I/O 系统中的组件组态的诊断。 只要发生下面提到的错误,诊断缓冲区就会生成一个日志条目。

表格 8- 101 PROFINET 和 PROFIBUS 诊断事件的处理

错误类型 成为站的诊断信息? 在诊断缓冲区中生成条目? CPU 的操作模式
诊断错误 保持 RUN 模式
机架或站故障 保持 RUN 模式
I/O 访问错误 1 保持 RUN 模式
外围设备访问错误 2 保持 RUN 模式
插/拔事件 保持 RUN 模式

1 I/O 访问错误示例原因: 已移除的一个模块。

2 外围设备访问错误示例原因: 非周期性地与没有通信的子模块进行通信。

可对每个站使用 GET_DIAG 指令 (页 324)来获取相应的诊断信息。 用户借此可通过编程来处理设备错误,并根据需要将 CPU 切换为 STOP 模式。 采用此方法时,您需要指定从哪个硬件设备读取状态信息。

GET_DIAG 指令使用站的“L 地址”(LADDR) 来获取整个站点的健康状况。 此 L 地址可在

“网络组态”(Network Configuration) 视图中找到,或者也可选择整个站机架(整个灰色区域)并在站的“属性”(Properties) 选项卡中获取。 对于各模块的 LADDR,既可在该模块的属性中查看(在设备组态中),也可在 CPU 的默认变量表中查看。

LED 指令

表格 8- 102 LED 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-44 ret_val := LED(

laddr:=_word_in_, LED:=_uint_in_);

使用 LED 指令可读取某 CPU 或接口上 LED 的状态。 通过

RET_VAL 输出返回指定 LED 的状态。

表格 8- 103 参数的数据类型

参数和类型 数据类型 说明
LADDR IN HW_IO CPU 或接口的标识号 1
LED IN UInt LED 标识号
1 RUN/STOP 颜色 1 = 绿色,颜色 2 = 黄色
参数和类型 数据类型 说明
2 出错 颜色 1 = 红色
3 维护 颜色 1 = 黄色
4 冗余 不适用
5 链接 颜色 1 = 绿色
6 Tx/Rx 颜色 1 = 黄色
RET_VAL OUT Int LED 的状态

1 例如,可从该参数的下拉列表中选择 CPU(如“PLC_1”)或 PROFINET 接口。

表格 8- 104 RET_VAL 的状态

RET_VAL

(W#16#...)

说明
0 到 9 LED 状态 0 LED 不存在
1
2 颜色 1 常亮
3 颜色 2 常亮
4 颜色 1 以 2 Hz 的频率闪烁
5 颜色 2 以 2 Hz 的频率闪烁
6 颜色 1 和 2 以 2 Hz 的频率交替闪烁
7 颜色 1 点亮 (Tx/Rx)
8 颜色 2 点亮 (Tx/Rx)
9 LED 状态不可用
8091 由 LADDR 标识的设备不存在
8092 由 LADDR 标识的设备不支持 LED
8093 LED 标识符未定义
80Bx 由 LADDR 标识的 CPU 不支持 LED 指令

DeviceStates 指令

表格 8- 105 DeviceStates 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-45 ret_val := DeviceStates( laddr:=hw_io_in_, mode:=_uint_in_, state:=_variant_inout_); DeviceStates 获取 I/O 子系统的 I/O 设备运行状态。 指令执行后,STATE 参数将以位列表形式包含各个 I/O 设备的错误状态(针对指定的 LADDR 和 MODE)。 此信息与在 STEP 7 诊断视图中看到的设备状态一

致。

表格 8- 106 参数的数据类型

参数和类型 数据类型 说明
LADDR IN HW_IOSYSTEM 逻辑地址: (I/O 系统的标识符)
MODE IN UInt 状态类型:

  • 1: 设备的组态处于激活状态或尚未完成。
  • 2: 设备故障
  • 3: 被禁止的设备
  • 4: 设备存在
RET_VAL OUT Int 执行条件代码
STATE1 InOut Variant 接收每个设备的错误状态的缓冲区: 为 STATE 参数选择的数据类型可以是任何位类型(Bool、Byte、Word 或

DWord),也可以是位类型的数组

  • 摘要位: 位 0 = 1,前提时 I/O 设备的状态位中有一个为 1
  • 状态位: 根据所选 MODE,站编号为 n 的 I/O 设备的状态。 例如,MODE = 2 且位 3 = 1 表示站 3 有故 障。

1 对于 PROFIBUS-DP,状态信息的长度为 128 位。 对于 PROFINET I/O,长度为 1024 位。

指令执行后,STATE 参数将以位列表形式包含各个 I/O 设备的错误状态(针对分配的

LADDR 和 MODE)。

表格 8- 107 条件代码

RET_VAL (W#16#...) 说明
0 无错误
8091 LADDR 不存在。
8092 LADDR 未寻址 I/O 系统。
8093 为 STATE 参数指定的数据类型无效: 有效数据类型为(Bool、Byte、Word 或

Dword)或者(Bool、Byte、Word 或 Dword)的数组

80Bx CPU 不支持对此 LADDR 使用 DeviceStates 指令。
8452 完整的状态数据对于分配的 STATE 参数来说过大。 STATE 缓冲区包含部分结果。

ModuleStates 指令

表格 8- 108 ModuleStates 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-46 ret_val := ModuleStates( laddr:=_word_in_, mode:=_uint_in, state:=_variant_inout); ModuleStates 获取 I/O 模块的运行状态。 指令执行后,STATE 参数将以位列表形式包含各个 I/O 模块的错误状态

(针对指定的 LADDR 和 MODE)。 此信息与在 STEP 7 诊断视图中看到的模

块状态一致。

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

参数和类型 数据类型 说明
LADDR IN HW_DEVICE 逻辑地址(I/O 模块的标识符)
MODE IN UInt 状态类型:

  • 1: 模块的组态处于激活状态或尚未完成。
  • 2: 模块有故障
  • 3: 模块已禁用
  • 4: 模块存在
参数和类型 数据类型 说明
RET_VAL OUT Int 状态(条件代码)
STATE1 InOut Variant 接收每个模块的错误状态的缓冲区: 用于 STATE 参数的数据类型可以是任何位类型(Bool、Byte、Word 或

DWord),也可以是位类型的数组。

  • 摘要位: 位 0 = 1,前提是 I/O 模块的状态位中有一个为 1
  • 状态位: 根据所选 MODE,插槽编号为 n 的 I/O 模块的状态。 例如,MODE = 2 且位 3 = 1 表示站 3 有故

障。

1 最多可分配 128 位。 所需位数取决于 I/O 模块的使用情况。

表格 8- 110 条件代码

RET_VAL ( W#16#...) 说明
0 无错误
8091 由 LADDR 标识的模块不存在。
8092 由 LADDR 标识的模块未寻址 I/O 设备。
8093 STATE 参数的数据类型无效: 有效数据类型为(Bool、Byte、Word 或 Dword) 或者(Bool、Byte、Word 或 Dword)的数组。
80Bx 该 CPU 不支持对此 LADDR 使用 ModuleStates 指令。
8452 完整的状态数据对于分配的 STATE 参数来说过大。 STATE 缓冲区包含部分结果。

GET_DIAG 指令

说明

可以使用“GET_DIAG”指令读出硬件对象的诊断信息。 硬件对象通过 LADDR 参数进行选择。 使用 MODE 参数选择要读出的诊断信息。

表格 8- 111 GET_DIAG 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-47 ret_val := GET_DIAG( mode:=_uint_in_, laddr:=_word_in_, cnt_diag=>_uint_out_, diag:=_variant_inout_, detail:=_variant_inout_); 从指定的硬件设备读取诊断信息。
参数

下表列出了“GET_DIAG”指令的参数:

表格 8- 112 参数的数据类型

参数和类型 数据类型 说明
MODE IN UInt 使用 MODE 参数选择要输出的诊断数据。
LADDR IN HW_ANY

(Word)

设备的硬件 ID
RET_VAL OUT Int 指令的状态
CNT_DIAG OUT UInt 输出诊断详细信息的数量
DIAG InOut Variant 指向用于存储所选模式的诊断信息的数据区。
DETAILS InOut Variant 指向用于存储与所选模式一致的诊断详细信息的数据区。
MODE 参数

根据 MODE 参数的值,在 DIAG、CNT_DIAG 和 DETAILS 输出参数中输出不同的诊断数据。

表格 8- 113 MODE 参数

MODE 说明 DIAG CNT_DIAG DETAILS
0 以 DWord 格式输出模块的所有支持诊断信息,其中位 X=1 表示支持模式

X。

所支持模式的位字符串

(DWord 格式),其中位 X=1 表示支持模式

X。

0 -
1 输出已寻址硬件对象的固有状态。 诊断状态: 与 DIS 结构一致的输出。(注意: 请参见下面的“DIS 结构” 信息以及本部分结尾处的 GET_DIAG 指令示

例。)

0 -
2 输出已寻址硬件对象所有从属模块的状态。 输出与 DNN 结构一致的诊断数据。(注意: 请参见下面的“DNN 结构” 信息以及本部分结尾处的 GET_DIAG 指令示

例。)

0 与DiagnosticsDetails 结构一致的模块状态信息。
DIS 结构

在 MODE 参数 =1 的情况下,诊断信息的输出与 DIS 结构一致。 下表列出了各个参数值的含义:

表格 8- 114 诊断信息源 (DIS) 的结构

参数 数据类型 说明
MaintenanceSta te DWord 枚举
0 不需要维护
1 模块或设备已禁用。
2 -
3 -
参数 数据类型 说明
4 -
5 需要维护
6 要求维护
7 错误
8 附属模块中的状态未知/错误
9 -
10 输入/输出不可用。
Componentstat e Detail DWord 位数组 模块子模块的状态:

  • 位 0 到位 15: 模块的状态消息
  • 位 16 到位 31: CPU 的状态消息
0 到 2

(枚举)

附加信息:

  • 位 0: 无附加信息
  • 位 1: 不允许传送
3 位 3 = 1: 至少一个通道支持诊断限定符。
4 位 4 = 1: 至少一个通道或一个组件需要维护
5 位 5 = 1: 至少一个通道或一个组件要求维护
6 位 6 = 1: 至少一个通道或一个组件有错误
7 到 10 -
11 到 14 位 11 = 1: PNIO - 子模块正确位 12 = 1: PNIO - 更换模块位 13 = 1: PNIO - 错误模块

位 14 = 1: PNIO - 模块已断开

15 -
参数 数据类型 说明
16 到 31 CPU 生成的模块状态信息: 位 16 = 1: 模块已禁用

位 17 = 1: CiR 操作激活位 18 = 1: 输入不可用位 19 = 1: 输出不可用

位 20 = 1: 溢出诊断缓冲区位 21 = 1: 诊断不可用

位 22 - 31: 保留(始终为 0)

OwnState Uint16 枚举 OwnState 参数的值描述了模块的维护状态。
0 无故障
1 模块或设备已禁用。
2 需要维护
3 要求维护
4 错误
5 无法从 CPU 访问模块或设备(对于 CPU 下的模块和设备有效)。
6 输入/输出不可用。
7 -
IO State Uint16 位数组 模块的 I/O 状态
0 位 0 = 1: 不需要维护
1 位 1 = 1: 模块或设备已禁用。
2 位 2 = 1: 需要维护
3 位 3 = 1: 要求维护
4 位 4 = 1: 错误
5 位 5 = 1: 无法从 CPU 访问模块或设备(对于 CPU 下的模块和设备有效)。
6 输入/输出不可用。
7 限定符;如果位 0、2 或 3 置位,则位 7 = 1
8 到 15 保留(始终为 0)
参数 数据类型 说明
OperatingState UInt16 枚举
0 -
1 处于 STOP 状态/固件更新
2 处于 STOP 状态/复位存储器
3 处于 STOP 状态/自启动
4 处于 STOP 状态
5 存储器复位
6 处于 START 状态
7 处于 RUN 状态
8 -
9 处于 HOLD 状态
10 -
11 -
12 模块有故障
13 -
14 无电源
15 CiR
16 处于 STOP 状态/无 DIS
17 输入
18
19
20
DiagnosticsDetail 结构

在 MODE 参数=2 的情况下,诊断详细信息的输出与 DiagnosticsDetail 结构一致。 下表列出了各个参数值的含义:

表格 8- 115 诊断详细信息的结构

参数 数据类型 说明
ChannelNumber UInt 通道号
Properties Word
ALID UInt 报警的标识 ID
Qualifier DWord 诊断数据限定符
ErrorType UDInt 通道错误类型
ExtErrorType UDInt 扩展通道错误类型
AddValue_1 UInt 附加值
AddValue_2 UInt 附加值
AddValue_3 UInt 附加值
AddValue_4 UInt 附加值
DNN 结构

在 MODE 参数=2 的情况下,诊断详细信息的输出与 DNN 结构一致。 下表列出了各个参数值的含义:

表格 8- 116 诊断导航节点 (DNN) 的结构

参数 数据类型 说明
SubordinateState UINT Enum 从属模块的状态(请参见 DIS 结构的参数 OwnState)
SubordinateIOState WORD Bitarray 从属模块的输入和输出状态(请参见 DIS 结构的参数 IO State)
DNNmode WORD Bitarray
  • 位 0 = 0: 诊断已启用
  • 位 0 = 1: 诊断已禁用
  • 位 1 到位 15: 保留
RET_VAL 参数

表格 8- 117 RET_VAL 参数的错误代码

错误代码

(W#16#...)

说明
0 无错误
n DETAILS 参数中的数据区过小。 无法输出诊断数据的所有详细信息。
8080 不支持 MODE 参数中的值。
8081 所选模式(参数 MODE)不支持 DIAG 参数中的类型。
8082 所选模式(参数 MODE)不支持 DETAILS 参数中的类型。
8090 LADDR 不存在。
8091 CHANNEL 参数中的所选通道不存在。
80C1 并行执行的资源不足
示例

下面的梯形逻辑程序段和 DB 显示了如何使用三种结构的三种模式:

        • DIS
        • DiagnosticsDetail
        • 西门子s7-1200的扩展指令-48 DNN

西门子s7-1200的扩展指令-49 西门子s7-1200的扩展指令-50 西门子s7-1200的扩展指令-51 西门子s7-1200的扩展指令-52

1

2

3

① DNN

② DIS

③ DiagnosticsDetail

说明

在 DB 中,必须手动键入数据类型,以访问三种结构中的每一种;没有下拉列表选择。如下所示,准确键入数据类型:

  • DNN
  • DIS
  • DiagnosticsDetail

脉冲

CTRL_PWM 指令

表格 8- 118 CTRL_PWM(脉宽调制)指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-53 "CTRL_PWM_DB"(

PWM:=_word_in_, enable:=_bool_in_, busy=>_bool_out_, status=>_word_out_);

提供占空比可变的固定循环时间输出。 PWM 输出以指定频率(循环时间)启动之后将连续运行。 脉冲宽度会根据需要进行变化以影响所

需的控制。

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

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

CTRL_HSC

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

参数和类型 数据类型 说明
PWM IN HW_PWM

(Word)

PWM 标识符: 已启用的脉冲发生器的名称将变为“常

量”(constant) 变量表中的变量,并可用作 PWM 参数。 (默认值: 0)

ENABLE IN Bool 1 = 启动脉冲发生器

0 = 停止脉冲发生器

BUSY OUT Bool 功能忙(默认值:0)
STATUS OUT Word 执行条件代码(默认值:0)

CTRL_PWM 指令将参数信息存储在 DB 中。 数据块参数不是由用户单独更改的,而是由

CTRL_PWM 指令进行控制。

通过将其变量名称用于 PWM 参数,指定要使用的已启用脉冲发生器。

EN 输入为 TRUE 时,PWM_CTRL 指令根据 ENABLE 输入的值启动或停止所标识的

PWM。 脉冲宽度由相关 Q 字输出地址中的值指定。

由于 CPU 在 CTRL_PWM 指令执行后处理请求,所以参数 BUSY 总是报告 FALSE。 如果检测到错误,则 ENO 设置为 FALSE 且参数 STATUS 包含条件代码。

CPU 第一次进入 RUN 模式时,脉冲宽度将设置为在设备组态中组态的初始值。 根据需要将值写入设备组态中指定的 Q 字位置(“输出地址”/“起始地址:”), 以更改脉冲宽

度。 使用指令(如移动、转换、数学)或 PID 功能框将所需脉冲宽度写入相应的 Q 字。必须使用 Q 字值的有效范围(百分数、千分数、万分数或 S7 模拟格式)。

说明

无法强制分配给 PWM 和 PTO 的数字量 I/O 点

在设备组态期间分配脉冲宽度调制 (PWM, Pulse-Width Modulation) 和脉冲串输出 (PTO, Pulse-Train Output) 设备使用的数字量 I/O 点。 将数字 I/O 点分配给这些设备之后,无法通过监视表格强制功能修改所分配的 I/O 点的地址值。

表格 8- 120 STATUS 参数的值

STATUS 说明
0 无错误
80A1 PWM 标识符未寻址到有效的 PWM。

表格 8- 121 公共条件代码

条件代码 1 说明
8022 存储区对于输入太小
8023 存储区对于输出太小
8024 输入区非法
8025 输出区非法
8028 输入位赋值非法
8029 输出位赋值非法
8030 输出区是只读 DB。
803A DB 不存在。

1 如果执行代码块时发生某个常见错误,则 CPU 将进入 STOP 模式,除非在该代码块中使用 GetError 或

GetErrorID 指令编写程序来响应错误。

脉冲输出的作用

① 循环时间

② 脉冲宽度

脉冲宽度可表示为循环时间的百分数(0 到 100)、千分数(0 到 1000)、万分数(0 到 10000)或 S7 模拟格式。

脉冲宽度可从 0(无脉冲,始终关闭)到满刻度(无脉冲,始终打开)变化。

西门子s7-1200的扩展指令-54

由于 PWM 输出可从 0 到满刻度变化,因此可提供在许多方面都与模拟输出相同的数字输出。 例如,PWM 输出可用于控制电机的速度,速度范围可以是从停止到全速;也可用于控制阀的位置,位置范围可以是从闭合到完全打开。

有两种脉冲发生器可用于控制高速脉冲输出功能: PWM 和脉冲串输出 (PTO, Pulse train output)。 PTO 由运动控制指令使用。 可将每个脉冲发生器指定为 PWM 或 PTO,但不能指定为既是 PWM 又是 PTO。

这两种脉冲发生器映射到特定的数字输出,如下表所示。 可以使用板载 CPU 输出,也可以使用可选的信号板输出。 下表列出了输出点编号(假定使用默认输出组态)。 如果更改了输出点编号,则输出点编号将为用户指定的编号。 无论是在 CPU 上还是在连接的信号板上,PTO1/PWM1 都使用前两个数字输出,PTO2/PWM2 使用接下来的两个数字输出。 请注意,PWM 仅需要一个输出,而 PTO 每个通道可选择使用两个输出。 如果脉冲功能不需要输出,则相应的输出可用于其它用途。

注意
用户程序中的其它指令无法使用脉冲串输出

将 CPU 或信号板的输出组态为脉冲发生器时(供 PWM 或运动控制指令使用),这会从 Q 存储器中移除相应的输出地址(Q0.0、Q0.1、Q4.0 和 Q4.1),并且这些地址在用户程序中不能用于其它用途。 如果用户程序向用作脉冲发生器的输出写入值,则 CPU

不会将该值写入到物理输出。

表格 8- 122 脉冲发生器的默认输出分配

说明 脉冲 方向
PTO 0
内置 I/O Q0.0 Q0.1
SB I/O Q4.0 Q4.1
PWM 0
说明 脉冲 方向
内置输出 Q0.0 -
SB 输出 Q4.0 -
PTO 1
内置 I/O Q0.2 Q0.3
SB I/O Q4.2 Q4.3
PWM 1
内置输出 Q0.2 -
SB 输出 Q4.2 -
PTO 2
内置 I/O Q0.41 Q0.51
SB I/O Q4.0 Q4.1
PWM 2
内置输出 Q0.41 -
SB 输出 Q4.1 -
PTO 3
内置 I/O Q0.62 Q0.72
SB I/O Q4.2 Q4.3
PWM 3
内置输出 Q0.62 -
SB 输出 Q4.3 -

1 CPU 1211C 没有输出 Q0.4、Q0.5、Q0.6 或 Q0.7。因此这些输出不能在 CPU 1211C 中使用。

2 CPU 1212C 没有输出 Q0.6 或 Q0.7。因此这些输出不能在 CPU 1212C 中使用。

3 该表适用于 CPU 1211C、CPU 1212C、CPU 1214C 以及 CPU 1215C PTO/PWM 功能。

组态 PWM 的脉冲通道

要准备 PWM 操作,首先通过选择 CPU 来组态设备配置中的脉冲通道,然后组态脉冲发生器 (PTO/PWM),并选择 PWM1 或 PWM2。 启用脉冲发生器(复选框)。 如果启用一

个脉冲发生器,将为该特定脉冲发生器分配一个唯一的默认名称。 可以通过在“名

称:”(Name:)编辑框中编辑此名称来对其进行更改。 已启用的脉冲发生器的名称将成为

“常量”(constant) 变量表中的变量,并可用作 CTRL_PWM 指令的 PWM 参数。

注意
脉冲输出发生器的最大脉冲频率对于 CPU 的数字量输出为 100 KHz,而对于 SB 的数字量输出为 20 KHz,对于高速 SB 的数字量输出为 200 KHz。 可是,当组态了最大速度或频率超出此硬件限制的轴时,STEP 7 并不会提醒用户。 这可能会导致应用出现问

题,因此请始终确保不会超出硬件的最大脉冲频率。

可按如下方式重命名脉冲发生器、添加注释以及分配参数:

        • 脉冲发生器可用作: PWM 或 PTO(选择 PWM)
        • 输出源: 板载 CPU 或 SB
        • 时间基数: 毫秒或微秒
        • 脉冲宽度格式:

– 百分数(0 到 100)

– 千分数(0 到 1000)

– 万分数(0 到 10000)

– S7 模拟格式(0 到 27648)

        • 循环时间: 输入循环时间值。 该值只能在“设备配置”(Device configuration) 中更改。
        • 初始脉冲宽度: 输入初始脉冲宽度值。 可在运行期间更改脉冲宽度值。输入起始地址以组态输出地址。 输入要在其中查找脉冲宽度值的 Q 字地址。
注意
用户程序中的其它指令无法使用脉冲串输出

将 CPU 或信号板的输出组态为脉冲发生器时(供 PWM 或运动控制指令使用),这会从 Q 存储器中移除相应的输出地址(Q0.0、Q0.1、Q4.0 和 Q4.1),并且这些地址在用户程序中不能用于其它用途。 如果用户程序向用作脉冲发生器的输出写入值,则 CPU

不会将该值写入到物理输出。

对于 PWM1,默认位置是 QW1000;而对于 PWM2,默认位置是 QW1002。 该位置的值控制脉冲宽度,并且在每次 CPU 从 STOP 切换到 RUN 模式时都会初始化为上面指定的 “初始脉冲宽度:”(Initial pulse width:) 值。 在运行期间更改该 Q 字值会引起脉冲宽度变化。

数据记录

控制程序可以使用 Data log 指令将运行数据值存储在永久性日志文件中。 数据日志文件存储在闪存(CPU 或存储卡)中。 日志文件数据按照标准 CSV(逗号分隔值)格式进行存储。 数据记录按大小预定的循环日志文件形式组织。

Data log 指令用于在程序中创建、打开、写入记录以及关闭日志文件。 通过创建定义单个日志记录的数据缓冲区来确定要记录的程序值。 数据缓冲区用作新日志记录的临时存储空间。 运行期间,必须通过程序将新的过程值移到缓冲区中。 更新所有过程数据值之后,即可执行 DataLogWrite 指令,以将数据由缓冲区传送至数据日志记录中。

使用内置的 PLC Web 服务器管理数据日志文件。 通过“数据日志”(Data Logs) 标准 Web 页面下载最新记录、所有记录、清除记录或删除日志文件。 将数据日志文件传送到 PC 后,可使用标准电子表格工具(如 Excel)分析数据。

数据日志记录结构

DataLogCreate 指令的 DATA 和 HEADER 参数分配日志记录的所有数据元素的数据类型和列标题说明。

DataLogCreate 指令的 DATA 参数

DATA 参数指向用作新日志记录临时缓冲区的存储器,必须将其分配给 M 或 DB 位置。

可以分配整个 DB(源自创建 DB 时分配的 PLC 数据类型),也可分配部分 DB(指定的

DB 元素可以是任何数据类型、数据类型结构、PLC 数据类型或数据数组)。

结构数据类型限制为单嵌套级。 所声明数据元素的总数应与标题参数中指定的列数相对应。 可以分配的最大数据元素个数为 253(带时间戳)或 255(不带时间戳)。 这一限制使记录始终处于 Excel 工作表的 256 列限制范围内。

DATA 参数可在“标准”(与 S7-300/400 兼容)或“优化”DB 类型中分配保持性数据元素或非保持性数据元素。

要写入数据日志记录,首先必须用新过程值装载临时 DATA 记录,然后执行

DataLogWrite 指令将新记录值保存到 Datalog 文件中。

DataLogCreate 指令的 HEADER 参数

HEADER 参数指向 CSV 文件中编码的数据矩阵的第一行的列标题名称。 HEADER 数据必须位于 DB 或 M 存储器,且字符必须遵守标准 CSV 格式规则,各列名称用逗号分隔。数据类型可以是字符串、字节数组或字符数组。 字符/字节数组的大小可以增加,其中字

符串被限制为最多 255 个字节。 HEADER 参数是可选参数。 如果未分配 HEADER 参数,则不会在数据日志文件中创建标题行。

控制数据日志的程序指令

DataLogCreate

表格 8- 123 DataLogCreate 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-55 "DataLogCreate_DB"( req:=_bool_in_, records:=_udint_in_, format:=_uint_in_, timestamp:=_uint_in_, done=>_bool_out_, busy=>_bool_out_, error=>_bool_out_, status=>_word_out_, name:=_string_inout_, ID:=_dword_inout_, header:=_variant_inout_, data:=_variant_inout_); 创建和初始化数据日志文件。 文件创建到 PLC \DataLogs 目录下,由

NAME 参数命名,并且已隐式打开以便执行写操作。 可以使用 Data log 指令通过程序将运行过程数据存储到 CPU 的闪存中。

STEP 7 会在插入指令时自动创建关联的背景数据块。

1 在 SCL 示例中,“DataLogCreate_DB”是背景数据块的名称。

表格 8- 124 参数的数据类型

参数和类型 数据类型 说明
REQ IN Bool 通过由低到高的(上升沿)信号启动操作。 (默认值: False)
RECORDS IN UDint 覆盖最旧条目前循环数据日志可存储的最大数据记录数:

不包括标题记录。 PLC 装载存储器的可用空间必须足够大,以确保成功创建数据日志。 (默认值 - 1)

FORMAT IN UInt 数据日志格式:

  • 0 - 内部格式(不支持)
  • 1 - 逗号分隔值“csv-eng”(默认值)
参数和类型 数据类型 说明
TIMESTAMP IN UInt 数据时间戳格式: 不需要日期和时间字段的列标题。 时间戳使用系统时间(世界协调时间 - UTC),不使用本地时间。

  • 0 - 无时间戳
  • 1 - 日期和时间戳(默认值)
NAME IN Variant 数据日志名称: 用户可在此提供名称。 此变量仅支持 String 数据类型,且只可位于本地、DB 或 M 存储器。 (默认值: ' ')

该字符串引用还用作数据日志文件名。 名称中的字符必须遵守

Windows 文件系统命名限制。 字符 \ / : * ? " < > | 及空格字符均不许使用。

ID 输入/输出 DWord 数据日志数字标识符: 存储该生成值以便与其它数据日志指令配合使用。 ID 参数仅用作 DataLogCreate 指令的输出。 (默认值: 0)

该参数不支持符号名称访问。

HEADER 输入/输出 Variant 指向 CSV 文件中编码的数据矩阵的第一行的数据日志列标题名称。 (默认值: 空值)。

HEADER 数据必须位于 DB 或 M 存储器。

字符必须遵守标准 CSV 格式规则,各列名称用逗号分隔。 数据类型可以是字符串、字节数组或字符数组。 字符/字节数组的大小可以增加,其中字符串被限制为最多 255 个字节。

HEADER 参数是可选参数。 如果未设置 HEADER 参数,则不会在数据日志文件中创建标题行。

DATA 输入/输出 Variant 指向记录数据结构、用户自定义类型 (UDT) 或数组。 记录数据必须位于 DB 或 M 存储器。

DATA 参数指定数据日志记录的各个数据元素(列)及其数据类型。 结构数据类型限制为单嵌套级。 所声明数据元素的个数应与标题参数中指定的列数相对应。 可以分配的最大数据元素个数为

253(带时间戳)或 255(不带时间戳)。 这一限制使记录始终处

于 Excel 工作表的 256 列限制范围内。

DONE OUT Bool 上一请求已完成且没有出错后,DONE 位将保持为 TRUE 一个扫描周期时间。 (默认值: False)
BUSY OUT Bool
  • 0 - 无操作正在进行
  • 1 - 操作正在进行
参数和类型 数据类型 说明
ERROR OUT Bool 上一请求因错误而终止后,ERROR 位将保持为 TRUE 一个扫描周期时间。 STATUS 参数中的错误代码值仅在 ERROR = TRUE

的一个扫描周期内有效。

STATUS OUT Word 执行条件代码(默认值:0)

采用基于参数 RECORDS 和 DATA 预定的固定大小创建数据日志文件。 数据记录被组织成循环日志文件。 新记录将附加到数据日志文件中,直到已存储 RECORDS 参数指定的最大记录数为止。 写入的下一条记录将覆盖最早的记录。 另一记录写入操作将覆盖下一条最早的数据记录,依此类推。

说明

如果要防止覆盖任何数据记录,则可在当前数据日志已存储最大记录数后,使用

DataLogNewFile 指令基于当前数据日志创建新数据日志。 新数据记录将存储到新数据日志文件中。 旧数据日志文件及记录数据仍保存在闪存中。

存储器资源使用情况:

          • 数据日志仅占用装载存储器。
          • 对数据日志的总数并没有设置限制。 组合起来的所有数据日志的大小受装载存储器可用资源的限制。 一次只能打开八个数据日志。
          • RECORDS 参数的最大可能数值是 UDint 数的限值 (4,294,967,295)。 RECORD 参数的实际限值取决于单个记录的大小、其它数据日志的大小及装载存储器的可用资源。 此外,Excel 对 Excel 工作表中允许的行数也有一定限制。

说明

DataLogCreate 操作可能持续多个程序扫描周期。 创建日志文件所需的实际时间取决于记录结构和记录数。 程序逻辑监视并捕捉到 DataLogCreate DONE 位转换到 TRUE 状态后,新的数据日志才可用于其它数据日志操作。

表格 8- 125 ERROR 和 STATUS 的值

ERROR STATUS (W#16#....) 说明
0 0000 无错误
0 7000 无 REQ 沿时调用: BUSY = 0,DONE = 0
0 7001 有 REQ 沿时首次调用(工作): BUSY = 1,DONE = 0
0 7002 第 N 次调用(工作): BUSY = 1,DONE = 0
1 8070 所有内部实例存储器都在使用。
ERROR STATUS (W#16#....) 说明
1 807F 内部错误
1 8090 文件名无效
1 8091 名称参数不是字符串引用。
1 8093 数据日志已存在。
1 8097 请求的文件长度超出文件系统最大值。
1 80B3 可用装载存储器空间不足。
1 80B4 MC(存储卡)受写保护。
1 80C1 打开的文件过多: 最多只允许同时打开 8 个数据日志文件。
1 8253 记录计数无效
1 8353 格式选择无效
1 8453 时间戳选择无效
1 8B24 HEADER 区域分配无效: 例如,指向本地存储器
1 8B51 HEADER 参数数据类型无效
1 8B52 HEADER 参数数据元素过多
1 8C24 DATA 区域分配无效: 例如,指向本地存储器
1 8C51 DATA 参数数据类型无效
1 8C52 DATA 参数数据元素过多
DataLogOpen

表格 8- 126 DataLogOpen 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-56 "DataLogOpen_DB"( req:=_bool_in_, mode:=_uint_in_, done=>_bool_out_, busy=>_bool_out_, error=>_bool_out_, status=>_word_out_, name:=_string_inout_, ID:=_dword_inout_); 打开已有数据日志文件。 打开数据日志后,才可向该日志写入新记录。 可单独打开和关闭各个数据日志。 最多可同时打开八个数据日志。

STEP 7 会在插入指令时自动创建关联的背景数据块。

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

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

参数和类型 数据类型 说明
REQ IN Bool 通过由低到高的(上升沿)信号启动操作。 (默认值: False)
MODE IN UInt 工作模式:

  • 0 - 附加到现有数据(默认值)
  • 1 - 清除所有现有记录
NAME IN Variant 现有数据日志的名称: 此变量仅支持 String 数据类型,且只可位于本地、DB 或 M 存储器。 (默认值: ' ')
ID 输入/输出 DWord 数据日志的数字标识符。 (默认值: 0)

注: 该参数不支持符号名称访问。

DONE OUT Bool 上一请求已完成且没有出错后,DONE 位将保持为 TRUE 一个扫描周期时间。 (默认值: False)
BUSY OUT Bool
  • 0 – 无操作正在进行
  • 1 - 操作正在进行
ERROR OUT Bool 上一请求因错误而终止后,ERROR 位将保持为 TRUE 一个扫描周期时间。 STATUS 参数中的错误代码值仅在 ERROR =

TRUE 的一个扫描周期内有效。

STATUS OUT Word 执行条件代码(默认值:0)

可提供已有数据日志的 NAME 或 ID(ID 参数作为输入)。 如果同时提供这两个参数, 但有效的 ID 与 NAME 数据日志不对应,则使用 ID,而忽略 NAME。

NAME 必须是 DataLogCreate 指令创建的数据日志的名称。 如果只提供 NAME 且

NAME 指定一个有效数据日志,将返回对应的 ID(ID 参数作为输出)。

说明

数据日志文件的一般用法

  • 执行 DataLogCreate 和 DataLogNewFile 操作后会自动打开数据日志文件。
  • PLC 执行 RUN-STOP 切换或 PLC 循环上电后会自动关闭数据日志文件。
  • 必须打开了数据日志文件,才能执行新的 DataLogWrite 操作。
  • 最多可同时打开八个数据日志文件。 可能存在八个以上数据日志文件,但必须关闭一些数据日志文件,使打开的文件数不超过八个。

表格 8- 128 ERROR 和 STATUS 的值

ERROR STATUS (W#16#) 说明
0 0000 无错误
0 0002 警告: 数据日志文件已通过该应用程序打开
0 7000 无 REQ 沿时调用: BUSY = 0,DONE = 0
0 7001 有 REQ 沿时首次调用(工作): BUSY = 1,DONE = 0
0 7002 第 N 次调用(工作): BUSY = 1,DONE = 0
1 8070 所有内部实例存储器都在使用。
1 8090 数据日志定义与现有数据日志文件不一致。
1 8091 名称参数不是字符串引用。
1 8092 数据日志不存在。
1 80C0 数据日志文件被锁定。
1 80C1 打开的文件过多: 最多只允许同时打开 8 个数据日志文件。
DataLogClose

表格 8- 129 DataLogClose 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-57 "DataLogClose_DB"( req:=_bool_in_, done=>_bool_out_, busy=>_bool_out_, error=>_bool_out_, status=>_word_out_, ID:=_dword_inout_); 关闭打开的数据日志文件。对已关闭的数据日志
执行 DataLogWrite 操作将导致错误。 再次执行

DataLogOpen 操作之前,禁止对此数据日志执行

写操作。
切换到 STOP 模式时将关闭所有已打开的数据日
志文件。
STEP 7 会在插入指令时自动创建关联的背景数
据块。

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

表格 8- 130 参数的数据类型

参数和类型 数据类型 说明
REQ IN Bool 通过由低到高的(上升沿)信号启动操作。 (默认值: False)
ID 输入/输出 DWord 数据日志的数字标识符。 仅用作 DataLogClose 指令的输入。 (默认值: 0)

注: 该参数不支持符号名称访问。

DONE OUT Bool 上一请求已完成且没有出错后,DONE 位将保持为 TRUE 一个扫描周期时间。
BUSY OUT Bool
  • 0 – 无操作正在进行
  • 1 - 操作正在进行
ERROR OUT Bool 上一请求因错误而终止后,ERROR 位将保持为 TRUE 一个扫描周期时间。 STATUS 参数中的错误代码值仅在 ERROR = TRUE 的一个扫描周期内有效。
STATUS OUT Word 执行条件代码(默认值:0)

表格 8- 131 ERROR 和 STATUS 的值

ERROR STATUS (W#16#) 说明
0 0000 无错误
0 0001 数据日志未打开
0 7000 无 REQ 沿时调用: BUSY = 0,DONE = 0
0 7001 有 REQ 沿时首次调用(工作): BUSY = 1,DONE = 0
0 7002 第 N 次调用(工作): BUSY = 1,DONE = 0
1 8092 数据日志不存在。
DataLogWrite

表格 8- 132 DataLogWrite 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-58 "DataLogWrite_DB"( req:=_bool_in_, done=>_bool_out_, busy=>_bool_out_, error=>_bool_out_, status=>_word_out_, ID:=_dword_inout_); 将数据记录写入指定的数据日志。 已有目标数据日志处于打开状态时,才可执行 DataLogWrite 操作。

STEP 7 会在插入指令时自动创建关联的背景数据块。

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

表格 8- 133 参数的数据类型

参数和类型 数据类型 说明
REQ IN Bool 通过由低到高的(上升沿)信号启动操作。 (默认值: False)
ID 输入/输出 DWord 数据日志数字标识符。 仅用作 DataLogWrite 指令的输入。 (默认值: 0)

注: 该参数不支持符号名称访问。

DONE OUT Bool 上一请求已完成且没有出错后,DONE 位将保持为 TRUE 一个扫描周期时间。
BUSY OUT Bool
  • 0 – 无操作正在进行
  • 1 - 操作正在进行
ERROR OUT Bool 上一请求因错误而终止后,ERROR 位将保持为 TRUE 一个扫描周

期时间。 STATUS 参数中的错误代码值仅在 ERROR = TRUE 的一个扫描周期内有效。

STATUS OUT Word 执行条件代码(默认值:0)

记录缓冲区的存储器地址和数据结构通过 DataLogCreate 指令的 DATA 参数组态。 必须通过程序用当前运行过程值装载记录缓冲区,然后执行 DataLogWrite 指令将新记录数据从缓冲区移动到数据日志。

ID 参数用于标识数据日志和数据记录组态。 ID 号在创建数据日志时生成。

如果循环数据日志文件中存在空记录,则将写入下一条可用的空记录。 如果所有记录均不为空,则将覆盖最早的记录。

小心
CPU 电源故障时数据日志数据丢失的可能性

如果未完成 DataLogWrite 操作时发生电源故障,则当前正向数据日志传送的数据记录可能会丢失。

表格 8- 134 ERROR 和 STATUS 的值

ERROR STATUS (W#16#) 说明
0 0000 无错误
0 0001 表明数据日志已满: 创建的各数据日志只能存储指定的最大记录数。如果写入最后一条记录后达到最大记录数, 则下一写操作将覆盖最早的记录。
0 7000 无 REQ 沿时调用: BUSY = 0,DONE = 0
0 7001 有 REQ 沿时首次调用(工作): BUSY = 1,DONE = 0
0 7002 第 N 次调用(工作): BUSY = 1,DONE = 0
1 8070 所有内部实例存储器都在使用。
1 8092 数据日志不存在。
1 80B0 数据日志文件未打开(仅针对显式打开模式)。
DataLogNewFile

表格 8- 135 DataLogNewFile 指令

LAD/FBD SCL 说明
西门子s7-1200的扩展指令-59 "DataLogNewFile_DB"( req:=_bool_in_, records=:_udint_in_, done=>_bool_out_, busy=>_bool_out_, error=>_bool_out_, status=>_word_out_, name=:_DataLog_out_, ID:=_dword_inout_); 允许程序根据现有数据日志文件创建新的数据日志文件。

STEP 7 会在插入指令时自动创建关联的背景数据块。

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

表格 8- 136 参数的数据类型

参数和类型 数据类型 说明
REQ IN Bool 通过由低到高的(上升沿)信号启动操作。 (默认值: False)
RECORDS IN UDInt 覆盖最旧条目前循环数据日志可存储的最大数据记录数。 (默认值: 1)

不包括标题记录。 CPU 装载存储器的可用空间必须足够大,以确保成功创建数据日志。

NAME IN Variant 数据日志名称: 用户可在此提供名称。 此变量仅支持 String 数据类型,且只可位于本地、DB 或 M 存储器。 (默认值: ' ')

该字符串引用还用作数据日志文件名。 名称中的字符必须遵守

Windows 文件系统命名限制。 字符 \ / : * ? " < > | 及空格字符均不许使用。

ID 输入/输出 DWord 数据日志数字标识符(默认值:0):

  • 执行时,ID 输入标识有效数据日志。 将从该数据日志复制新数据日志组态。
  • 执行后,ID 参数成为返回新建数据日志文件的 ID 的输出。

注: 该参数不支持符号名称访问。

DONE OUT Bool 上一请求已完成且没有出错后,DONE 位将保持为 TRUE 一个扫描周期时间。
BUSY OUT Bool
  • 0 – 无操作正在进行
  • 1 - 操作正在进行
ERROR OUT Bool 上一请求因错误而终止后,ERROR 位将保持为 TRUE 一个扫描周期时间。 STATUS 参数中的错误代码值仅在 ERROR = TRUE

的一个扫描周期内有效。

STATUS OUT Word 执行条件代码(默认值:0)

如果数据日志已满或被视为已完成,但您不想丢失数据日志中存储的任何数据,则可执行

DataLogNewFile 指令。 可以根据此已写满的数据日志文件的结构创建一个新的空数据日志文件。 将从原始数据日志复制标题记录以及原始数据日志属性(DATA 记录缓冲区、数据格式和时间戳设置)。 隐式关闭原始数据日志文件并隐式打开新数据日志文件。

DataLogWrite 参数触发器: 程序必须监视每个 DataLogWrite 操作的 ERROR 和

STATUS 参数。 如果写入最后一条记录时数据日志已满,DataLogWrite ERROR 位 = 1

且 DataLogWrite STATUS 字 = 1。这些 ERROR 和 STATUS 值仅在一个扫描周期时间

内有效,因此监视逻辑必须使用 ERROR = 1 作为定时门来捕捉 STATUS 值,然后测试

STATUS 是否为 1(数据日志已满)。

DataLogNewFile 操作: 当程序逻辑获得数据日志已满信号时,此状态用于激活

DataLogNewFile 操作。 必须使用现有(通常已满)的已打开数据日志的 ID 执行DataLogNewFile,但要使用新的唯一 NAME 参数。 DataLogNewFile 操作完成后,将返回新的数据日志 ID 值(作为输出参数),该值与新的数据日志名称相对应。 新数据日志文件隐式打开并可存储新记录。 针对新数据日志文件的新的 DataLogWrite 操作必须使用

DataLogNewFile 操作返回的 ID 值。

说明

DataLogNewFile 操作可能持续多个程序扫描周期。 创建日志文件所需的实际时间取决于记录结构和记录数。 程序逻辑监视并捕捉到 DataLogNewFile DONE 位转换到 TRUE 状态后,新的数据日志才可用于其它数据日志操作。

表格 8- 137 ERROR 和 STATUS 的值

ERROR STATUS (W#16#) 说明
0 0000 无错误
0 7000 无 REQ 沿时调用: BUSY = 0,DONE = 0
0 7001 有 REQ 沿时首次调用(工作): BUSY = 1,DONE = 0
0 7002 第 N 次调用(工作): BUSY = 1,DONE = 0
1 8070 所有内部实例存储器都在使用。
1 8090 文件名无效
1 8091 名称参数不是字符串引用。
1 8092 数据日志不存在。
1 8093 数据日志已存在。
1 8097 请求的文件长度超出文件系统最大值。
1 80B3 可用装载存储器空间不足。
1 80B4 MC 受写保护。
1 80C1 打开的文件过多。

使用数据日志

数据日志文件以逗号分隔值格式 (*.csv) 存储在永久性闪存中。 可以使用 PLC Web 服务器功能或通过取出 PLC 存储卡并将其插入标准 PC 读卡器中来查看数据日志。

使用 PLC Web 服务器功能查看数据日志

如果 PLC PROFINET 端口和 PC 连接到网络,则可使用 PC Web 浏览器(如 Microsoft Internet Explorer 或 Mozilla Firefox)访问内置 PLC Web 服务器。 运行 PLC Web 服务器时,PLC 可以处于运行模式或停止模式。 如果 PLC 处于运行模式,则当 PLC Web 服务器通过网络传送日志数据时,控制程序会继续执行。

Web 服务器访问:

  1. 在目标 CPU 的设备配置中启用 Web 服务器 (页 542)。
  2. 通过 PROFINET 网络将 PC 连接到 PLC (页 543)。
  3. 登录内置 Web 服务器 (页 545)。
  4. 通过 “数据日志”(Data Logs) 标准 Web 页面 (页 556)下载最新记录、所有记录、清除记录或删除日志文件。
  5. 将数据日志文件的副本下载到 PC 后,可使用电子表格应用程序(如 Excel)打开 .csv

文件。

查看 PLC 存储卡中的数据日志

如果 S7-1200 CPU 中插入了“程序”型 S7-1200 存储卡,则可以取出该存储卡,然后将该卡插入 PC 或 PG 上的标准 SD(安全数码卡)卡槽或 MMC (多媒体卡)卡槽中。 取出存储卡后,PLC 将处于停止模式,因此不执行控制程序。

在 Windows 资源管理器中导航至存储卡中的 \DataLog 目录。 所有 \*.csv 数据日志文件都位于该目录下。

复制数据日志文件,然后将副本放到 PC 的本地驱动器中。 接着,可以使用 Excel 打开

*.csv 文件的本地副本,而不是存储在存储卡中的原始文件。

小心
可以借助 PC 读卡器复制 S7-1200 存储卡中的数据日志文件但不要修改或删除这些文件推荐使用标准 Web 服务器数据日志页面工具来查看、下载(复制)、清除(删除数

据)和删除数据日志文件。 Web 服务器可为您管理存储卡文件并有助于防止数据被意外修改或删除。

如果直接通过 Windows 资源管理器浏览存储卡文件系统,则可能意外删除/修改数据日志或其它系统文件,这样一来可能会损坏文件或使存储卡无法使用。

使用 Web 浏览器查看数据日志

即使没有使用 Web 服务器功能,也可使用 Internet Explorer 或 Mozilla Firefox 之类的

Web 浏览器直接查看数据日志。 只需在浏览器的地址栏中输入以下文本,就可以使用

CPU 的 IP 地址和 STEP 7 中数据日志文件的实际名称进行查看而非“MyDataLog”。

http://192.168.0.1/DataLog.html?FileName=MyDataLog.csv

还可以通过第三方的文件收集工具访问固定地址的数据日志文件。

对数据日志文件大小的限制

数据日志文件与程序、程序数据、组态数据、用户定义的 Web 页面和 PLC 系统数据共享

PLC 装载存储器空间。 使用内部装载存储器的大型程序需要大量的装载存储空间,因而可能造成用于数据日志文件的可用空间不足。 在这种情况下,可以使用“程序卡”来增加装载存储器容量。 S7-1200 CPU 既可以使用内部装载存储器也可以使用外部装载存储器, 但不能同时使用。

有关如何创建“程序卡”的详细信息,请参见“存储卡”章节 (页 116)。

单个数据日志文件的最大大小

单个数据日志文件的最大大小不可超过装载存储器(内部或外部)大小的 25%。 如果应用程序需要更多的数据日志条目,则可以使用“DataLogNewFile”指令在第一个文件中的所有记录都已填充后创建一个新文件。 有关单个数据日志文件的最大大小的信息,请参见下表。

表格 8- 138 装载存储器大小和单个数据日志文件的最大大小

数据区 CPU 1211C CPU 1212C CPU 1214C CPU 1215C 数据存储
内部装载存储器闪存 1 MB

(单个数据日志文件最大

250 KB)

1 MB

(单个数据日志文件最大

250 KB)

4 MB

(单个数据日志文件最大

500 KB)

4 MB

(单个数据日志文件最大 500

KB)

用户程序和程序数据、组态数 据、数据日志、

用户定义 Web 页

面以及 PLC 系统数据

外部装载存储器

可选“程序卡”闪存卡

2 MB、12 MB 或 24 MB,具体取决于 SD 卡的容量

(使用 2 MB 卡时,单个数据日志文件最大 500 KB)

(使用 24 MB 卡时,单个数据日志文件最大 6 MB)

确定装载存储器可用空间的大小
  1. 建立 STEP 7 和目标 S7-1200 PLC 之间的在线连接。
  2. 下载要添加数据日志操作的程序。
  3. 根据需要创建任何可选的用户定义 Web 页面。 (用于访问数据日志的标准 Web 页面存储在 PLC 固件中,不占用装载存储器的空间)。
  4. 使用 在线和诊断工具可获得装载存储器大小以及装载存储器可用空间的百分数

(页 736)。

  1. 将装载存储器大小乘以可用空间百分数即得到当前可用的装载存储器空间。
所有数据日志最大总大小

正常运行期间操作系统会使用和释放存储空间,因此装载存储器可用空间量会随之变化。应将所有数据日志文件的总大小限制为可用空间的一半。

计算单个数据日志记录的存储器要求

日志数据以 CSV(逗号分隔值)文件格式存储为若干字符字节。 下表给出了存储各数据类型所需的字节数。

表格 8- 139 CSV 文件数据大小

数据类型 字节数(数据字节加上逗号分隔符字节)
Bool 2
Byte 5
Word 7
DWord 12
Char 4

数据类型 字节数(数据字节加上逗号分隔符字节)

String 示例 1: MyString[10]

最大字符串大小分配为 10 个字符。

文本字符 + 自动填充的空格字符 = 10 个字节成对的双引号 + 逗号字符 = 3 个字节

10 + 3 = 13 个字节(总共)

示例 2: Mystring2

如果未使用方括号指定大小,则默认分配 254 个字节。文本字符 + 自动填充的空格字符 = 254 个字节

成对的双引号 + 逗号字符 = 3 个字节

254 + 3 = 257 个字节(总共)

USInt 5

UInt 7

UDInt 12

SInt 5

Int 7

DInt 12

Real 16

LReal 25

Time 15

DTL 24

DataLogCreate DATA 参数指向一个结构,该结构用于为一条数据日志记录指定数据字段数和各数据字段的数据类型。 上表给出了各种数据类型在 CSV 文件中所需的字节数。将给出的数据类型的出现次数乘以该数据类型所需的字节数。 对记录中的每种数据类型执行此操作,然后对字节数求和即得到数据记录的总大小。 另加上一个字节(行尾字符占用)。

数据日志记录的大小 = 所有数据字段所需字节数之和 + 1(行尾字符)。

计算整个数据日志文件的存储器要求

DataLogCreate 指令的 RECORDS 参数用于设置数据日志文件中可存储的最大记录数。创建数据日志文件时,分配最大存储器大小。

数据日志文件大小 = (一条记录的字节数) x (记录数)。

数据日志示例程序

该数据日志示例程序未显示从动态过程获取采样值必需的所有程序逻辑,但显示了数据日志指令的重要操作。 所使用的日志文件的结构和数目取决于过程控制要求。

说明

数据日志文件的一般用法

  • 执行 DataLogCreate 和 DataLogNew 文件操作后会自动打开数据日志文件。
  • PLC 执行 RUN-STOP 切换或 PLC 循环上电后会自动关闭数据日志文件。
  • 必须打开了数据日志文件,才能执行 DataLogWrite 操作。
  • 最多可同时打开八个数据日志文件。 可能存在八个以上数据日志文件,但必须关闭一些数据日志文件,使打开的文件数不超过八个。

示例数据日志程序

在数据块中创建示例数据日志名称、标题文本和 MyData 结构。 三个 MyData 变量临时存储新的采样值。 通过执行 DataLogWrite 指令将这些 DB 位置的过程采样值传送到数据日志文件。

西门子s7-1200的扩展指令-60

程序段 1 REQ 上升沿启动数据日志创建过程。

西门子s7-1200的扩展指令-61

程序段 2 捕获 DataLogCreate 的 DONE 输出,考虑到该指令仅在一个扫描周期内有效。

西门子s7-1200的扩展指令-62

程序段 3 上升沿信号触发何时将新过程值存储在 MyData 结构中。

西门子s7-1200的扩展指令-63

程序段 4 EN 输入状态取决于何时完成 DataLogCreate 操作。 创建操作将跨越多个扫描周期,并且必须在执行写入操作之前完成。 REQ 输入的上升沿信号是触发已启用写入操

作的事件。

西门子s7-1200的扩展指令-64

程序段 5 在写入最后一条记录后关闭数据日志。 执行写入最后一条记录的 DataLogWrite

操作后,将通过 DataLogWrite STATUS 输出为 1 来指示日志文件已写满状态。

西门子s7-1200的扩展指令-65

程序段 6 DataLogOpen REQ 输入的上升信号沿会模拟用户按下 HMI 上的按钮打开数据日志文件的操作。 如果打开所有记录都填满了过程数据的数据日志文件,则下一个

DataLogWrite 操作会覆盖最早的记录。 您也许想保存之前的数据日志并创建新数据日志,如程序段 7 中所示。

西门子s7-1200的扩展指令-66

程序段 7 ID 参数是 IN/OUT 类型。 首先应现有数据日志的 ID 值,以便能复制其结构。完成 DataLogNewFile 操作后,会将新数据记录的唯一 ID 新值写回 ID 参考位置。 未显示所需的 DONE 位 = TRUE 捕获,有关 DONE 位逻辑的示例,请参见程序段 1、2 和4。

西门子s7-1200的扩展指令-67

通过 S7-1200 CPU Webserver 看到的由示例程序创建的数据日志文件

西门子s7-1200的扩展指令-68

表格 8- 140 用 Excel 查看的已下载 .csv 文件示例

在最多五条记录的文件中写入了两条记录 西门子s7-1200的扩展指令-69
最多五条记录的数据日志文件中有五条记录 西门子s7-1200的扩展指令-70
将又一条记录写入上述已写满的文件后,第六次写入操作会用第六条数据覆盖最早的第一条记录。 另一次写入操作会用第七条记录覆盖第二条记录,依此类推。 西门子s7-1200的扩展指令-71

数据块控制

READ_DBL、WRIT_DBL(读取或写入装载存储器中的 DB)

表格 8- 141 READ_DBL 和 WRIT_DBL 指令

LAD/FBD 说明
西门子s7-1200的扩展指令-72 READ_DBL(

req:=_bool_in_, srcblk:=_variant_in_, busy=>_bool_out_, dstblk=>_variant_out_);

将 DB 的全部或部分起始值从装载
存储器复制到工作存储器的目标
DB 中。
在复制期间,装载存储器的内容不
变。
西门子s7-1200的扩展指令-73 WRIT_DBL(

req:=_bool_in_, srcblk:=_variant_in_, busy=>_bool_out_, dstblk=>_variant_out_);

将 DB 全部当前值或部分值从工作
存储器复制到装载存储器的目标
DB 中。
在复制期间,工作存储器的内容不
变。

表格 8- 142 参数的数据类型

参数和类型 数据类型 说明
REQ IN BOOL 如果 BUSY = 0,则高电平信号会启动操作。
SRCBLK IN VARIANT READ_DBL: 指向装载存储器中源数据块的指针

WRIT_DBL: 指向工作存储器中源数据块的指针

RET_VAL OUT INT 执行条件代码
BUSY OUT BOOL BUSY = 1 表示读取/写入过程尚未完成。
DSTBLK OUT VARIANT READ_DBL: 指向工作存储器中目标数据块的指针

WRIT_DBL: 指向装载存储器中目标数据块的指针

    1. 数据块控制

通常,DB 存储在装载存储器(闪存)和工作存储器 (RAM) 中。 起始值(初始值)始终存储在装载存储器中,当前值始终存储在工作存储器中。READ_DBL 可用于将一组起始值从装载存储器复制到工作存储器中程序引用的 DB 的当前值。 可使用 WRIT_DBL 将存储在内部装载存储器或存储卡中的起始值更新为工作存储器中的当前值。

说明

避 免 过 多 WRIT_DBL 闪 存 写 入 操 作WRIT_DBL 指令会在闪存(内部装载存储器或存储卡)内执行写入操作。 WRIT_DBL 应该用于诸如生产流程更改等的非经常性更新。

事先必须已通过 STEP 7 创建了 READ_DBL 和 WRIT_DBL 要使用的数据块,才能使用这些指令。 如果源数据块被创建成“标准”类型,则目标数据块也必须为“标准”类型。 如果源数据块被创建成“优化”类型,则目标数据块也必须为“优化”类型。

如果 DB 为标准 DB,则可指定一个变量名称或 P# 值。 P# 值允许指定和复制指定大小

(字节、字或双字)的任意数量的元素。 因此,可复制 DB 的全部或部分内容。 如果

DB 是优化 DB,则只能指定一个变量名称;无法使用 P# 操作符。 如果为标准或优化 DB

(或者其它工作存储器类型)指定变量名称,则会复制此变量引用的所有内容。 可以是用户定义类型、数组或基本元素。 如果 DB 是标准 DB 而不是优化 DB,则这些指令只能使用数据类型结构。 如果它是优化存储器中的结构,则必须使用用户定义类型 (UDT)。仅用户定义类型可确保源结构和目标结构的“数据类型”完全相同。

说明

在“优化”DB 中使用结构(数据类型 Struct)

在“优化”DB 中使用 Struct 数据类型时,首先必须为 Struct 创建一个用户定义的数据类型

(UDT)。 然后通过 UDT 组态源 DB 和目标 DB。 UDT 确保针对两个 DB Struct 内的数据类型保持一致。

对于“标准”DB,使用 Struct 时无需创建 UDT。

READ_DBL 和 WRIT_DBL 相对于循环程序扫描异步执行。 处理期间需要多次调用

READ_DBL 和 WRIT_DBL 指令。 通过 REQ = 1 来调用指令启动 DB 传输作业,然后监视 BUSY 和 RET_VAL 输出以确定数据传输的完成时间以及是否正确。

为确保数据的一致性,请勿在 READ_DBL 处理过程中修改目标区域或在 WRIT_DBL 处理过程中修改来源区域(即,不要在 BUSY 参数为 TRUE 时修改)。

SRCBLK 和 DSTBLK 参数限制:

        • 数据块必须先创建,然后才可引用。
        • BOOL 类型的 VARIANT 指针长度必须可被 8 整除。
        • 源指针和目标指针中 STRING 类型的 VARIANT 指针的长度必须相同。

配方和机器设置信息

可使用 READ_DBL 和 WRIT_DBL 指令来管理配方或机器设置信息。 虽然可以限制写入的次数以防止闪存损耗,但以上方法实际上是另一种归档那些值不经常更改的保持性数据的方法。 这样即可在提供给常规掉电保持性数据的容量的基础上有效增加保持性存储器的容量,至少可满足不经常更改值的需要。 可使用 WRIT_DBL 指令将配方信息或机器设置信息从工作存储器保存到装载存储器,并使用 READ_DBL 指令将这些信息从装载存储器提取到工作存储器。

表格 8- 143 条件代码

RET_VAL (W#16#...) 说明
0000 无错误
0081 警告: 源区域小于目标区域。 源数据已完全复制,目标区域中的额外字节未更改。
7000 REQ = 0 时调用: BUSY = 0
7001 REQ = 1 时首次调用(工作): BUSY = 1
7002 第 N 次调用(工作): BUSY = 1
8051 数据块类型错误
8081 源区域大于目标区域。 目标区域已满,源数据中的剩余字节被忽略。
8251 源数据块类型错误
82B1 缺少源数据块
82C0 源 DB 正在被其它语句或通信功能编辑。
8551 目标数据块类型错误
85B1 缺少目标数据块
85C0 目标 DB 正在被其它语句或通信功能编辑。
80C3 当前已有超过 50 个的 READ_DBL 或 WRIT_DBL 语句排队等候执行。
    1. 扩展指令的常见错误代码

8.9 “扩展”指令的常见错误代码

表格 8- 144 扩展指令的常见错误代码

条件代码 (W#16#....)1 说明
8022 存储区对于输入太小
8023 存储区对于输出太小
8024 输入区非法
8025 输出区非法
8028 输入位赋值非法
8029 输出位赋值非法
8030 输出区是只读 DB。
803A DB 不存在。

1 如果执行代码块时发生以上错误之一,则 CPU 将进入 STOP 模式,除非在该代码块中使用 GetError 或

GetErrorID 指令并编写程序来响应错误。

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

发表评论

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