258
1 目录 1 产品概述................................................................................................................................................................ 1 1.1 S7-SCL应用范围 ......................................................................................................................................... 1 1.2 S7-SCL的功能 ............................................................................................................................................. 1 1.3 S7-SCL提供了哪些功能? ......................................................................................................................... 2 1.4 在版本V5.3 SP1 中的新内容..................................................................................................................... 3 2 安装........................................................................................................................................................................ 5 2.1 自动化许可证管理器 ................................................................................................................................. 5 2.1.1 通过自动化许可证管理器使用授权 .............................................................................................. 5 2.1.2 安装自动化许可证管理器 .............................................................................................................. 6 2.1.3 处理许可证密钥的指南 .................................................................................................................. 7 2.2 安装............................................................................................................................................................. 7 2.2.1 安装要求(Installation Requirements......................................................................................... 7 2.2.2 S7-SCL的安装(Installation of S7-SCL........................................................................................... 7 3 设计一个SCL程序 .................................................................................................................................................. 9 3.1 一个针对初次用户的例子——“获取测量值Welcome to "Measured Value Acquisition" - A Sample Program for First-Time Users ...................................................................................................................... 9 3.2 任务(Task............................................................................................................................................ 10 3.3 结构化S7-SCL程序的设计 ....................................................................................................................... 11 3.4 定义子任务(Defining the Subtasks..................................................................................................... 12 3.5 定义块间接口(Defining the Interfaces Between Blocks).......................................................................... 13 3.6 定义输入/输出接口................................................................................................................................... 14 3.7 定义源文件中块的顺序 ............................................................................................................................ 15 3.8 定义符号(Defining Symbols) .................................................................................................................... 16 3.9SQUARE函数的语句部分(Statement Section of the SQUARE Function) ............................................... 16 3.10 建立EVALUATE功能块......................................................................................................................... 17 3.10 .1EVALUATE的流程图(Flow Chart for EVALUATE) ............................................................................ 17 3.10.2 功能块EVALUATE的声明部分....................................................................................................... 18 3.10.3EVALUATE功能块的声明语句........................................................................................................ 18 3.11 建立ACQUIRE功能块 ........................................................................................................................... 20 3.11.1 ACQUIRE的流程图(Flow Chart for ACQUIRE.......................................................................... 20 3.11.2 功能块ACQUIRE的声明部分(Declaration Section of FB ACQUIRE........................................ 21 3.11.3 功能块ACQUIRE的语句部分(Statement Section of FB ACQUIRE......................................... 22 3.12 建立组织块CYCLECreating the CYCLE Organization Block....................................................... 24 3.13 测试数据(Test Data.......................................................................................................................... 25 4 使用S7-SCL ............................................................................................................................................................ 28 41 启动S7-SCL软件 .................................................................................................................................... 28 42 用户界面(User Interface.................................................................................................................. 28 43 定制用户界面(Customizing the User Interface............................................................................... 29 44 创建和管理S7-SCL源文件 .................................................................................................................... 30 4.4.1 创建一个新的S7-SCL源文件(Creating a New S7-SCL Source File............................................ 30 4.4.2 打开一个S7-SCL源文件(Opening an S7-SCL Source File.......................................................... 30 4.4.3 关闭一个S7-SCL源文件(Closing an S7-SCL Source File............................................................ 31

打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

1

目录

1 产品概述 ................................................................................................................................................................ 1

1.1 S7-SCL应用范围 ......................................................................................................................................... 1

1.2 S7-SCL的功能 ............................................................................................................................................. 1

1.3 S7-SCL提供了哪些功能? ......................................................................................................................... 2

1.4 在版本V5.3 SP1 中的新内容 ..................................................................................................................... 3

2 安装 ........................................................................................................................................................................ 5

2.1 自动化许可证管理器 ................................................................................................................................. 5

2.1.1 通过自动化许可证管理器使用授权 .............................................................................................. 5

2.1.2 安装自动化许可证管理器 .............................................................................................................. 6

2.1.3 处理许可证密钥的指南 .................................................................................................................. 7

2.2 安装 ............................................................................................................................................................. 7

2.2.1 安装要求(Installation Requirements) ......................................................................................... 7

2.2.2 S7-SCL的安装(Installation of S7-SCL) ........................................................................................... 7

3 设计一个SCL程序 .................................................................................................................................................. 9

3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" - A Sample Program for First-Time Users ) ...................................................................................................................... 9

3.2 任务(Task) ............................................................................................................................................ 10

3.3 结构化S7-SCL程序的设计 ....................................................................................................................... 11

3.4 定义子任务(Defining the Subtasks) ..................................................................................................... 12

3.5 定义块间接口(Defining the Interfaces Between Blocks) .......................................................................... 13

3.6 定义输入/输出接口 ................................................................................................................................... 14

3.7 定义源文件中块的顺序 ............................................................................................................................ 15

3.8 定义符号(Defining Symbols) .................................................................................................................... 16

3.9SQUARE函数的语句部分(Statement Section of the SQUARE Function) ............................................... 16

3.10 建立EVALUATE功能块 ......................................................................................................................... 17

3.10 .1EVALUATE的流程图(Flow Chart for EVALUATE) ............................................................................ 17

3.10.2 功能块EVALUATE的声明部分 ....................................................................................................... 18

3.10.3EVALUATE功能块的声明语句 ........................................................................................................ 18

3.11 建立ACQUIRE功能块 ........................................................................................................................... 20

3.11.1 ACQUIRE的流程图(Flow Chart for ACQUIRE) .......................................................................... 20

3.11.2 功能块ACQUIRE的声明部分(Declaration Section of FB ACQUIRE) ........................................ 21

3.11.3 功能块ACQUIRE的语句部分(Statement Section of FB ACQUIRE) ......................................... 22

3.12 建立组织块CYCLE(Creating the CYCLE Organization Block) ....................................................... 24

3.13 测试数据(Test Data) .......................................................................................................................... 25

4 使用S7-SCL ............................................................................................................................................................ 28

4.1 启动S7-SCL软件 .................................................................................................................................... 28

4.2 用户界面(User Interface) .................................................................................................................. 28

4.3 定制用户界面(Customizing the User Interface) ............................................................................... 29

4.4 创建和管理S7-SCL源文件 .................................................................................................................... 30

4.4.1 创建一个新的S7-SCL源文件(Creating a New S7-SCL Source File) ............................................ 30

4.4.2 打开一个S7-SCL源文件(Opening an S7-SCL Source File) .......................................................... 30

4.4.3 关闭一个S7-SCL源文件(Closing an S7-SCL Source File) ............................................................ 31

Page 2: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

2

4.4.4 打开块(Opening Blocks) ............................................................................................................ 31

4.4.5 指定对象属性(Specifying Object Properties) ........................................................................... 31

4.4.6 用标准编辑器创建SCL源文件(Creating SCL Source Files with a Standard Editor) .................. 32

4.4.7 块保护(Block Protection) .......................................................................................................... 32

4.5 S7-SCL源文件指南 ................................................................................................................................... 32

4.5.1S7-SCL源文件通用规则(General Rules for S7-SCL Source Files) ................................................ 32

4.5.2 块的次序(Order of the Blocks) .................................................................................................. 33

4.5.3 使用符号地址(Using Symbolic Addresses) ............................................................................... 33

4.6 编辑S7-SCL源文件 ................................................................................................................................... 33

4.6.1 取消最后的编辑操作(Undoing the Last Editing Action) .......................................................... 33

4.6.2 恢复编辑操作(Redoing an Editing Action) ............................................................................... 33

4.6.3 查找和替换文本对象(Finding and Replacing Text Objects) ..................................................... 33

4.6.4 选择文本对象 ................................................................................................................................. 34

4.6.5 拷贝文本对象 ................................................................................................................................. 34

4.6.6 剪切文本对象 ................................................................................................................................. 34

4.6.7 删除文本对象 ................................................................................................................................. 35

4.6.8 将光标定位到指定行 ..................................................................................................................... 35

4.6.9 按语法调整行缩进(Syntactically Correct Indenting of Lines ) ................................................ 35

4.6.10 设置字体和颜色 ........................................................................................................................... 36

4.6.11 在源文本中放置书签 ................................................................................................................... 36

4.6.12 插入模板 ...................................................................................................................................... 37

4.7 编译S7-SCL程序 ...................................................................................................................................... 38

4.7.1 关于编译应明白什么 ..................................................................................................................... 38

4.7.2 自定义编译器 ................................................................................................................................. 38

4.8 保存和打印S7-SCL源文件 ....................................................................................................................... 41

4.8.1 保存一个S7-SCL源文件 .................................................................................................................. 41

4.8.2 自定义页面格式 ............................................................................................................................. 41

4.8.3 打印一个S7-SCL源文件 .................................................................................................................. 41

4.8.4 设置打印选项 ................................................................................................................................. 42

4.9 下载建立好的程序 .................................................................................................................................... 42

4.9.1CPU内存复位 ................................................................................................................................... 42

4.9.2 下载用户程序到CPU ...................................................................................................................... 43

4.10 测试创建的程序 ...................................................................................................................................... 43

4.10.1 S7-SCL的调试功能 ........................................................................................................................ 43

4.10.2 “监视”调试功能 ........................................................................................................................... 44

4.10.3 调试 ............................................................................................................................................. 45

4.10.4 逐步监视 ...................................................................................................................................... 45

4.10.5 用断点逐步调试 ........................................................................................................................... 47

4.10.6 使用STEP7 测试/调试功能 ......................................................................................................... 49

4.11 显示和修改CPU特性 ............................................................................................................................. 51

4.11.1 显示和修改CPU操作模式 ........................................................................................................... 51

4.11.2 显示和设置CPU的日期和时间 ................................................................................................... 51

4.11.3 读出CPU数据 ............................................................................................................................... 51

4.11.4 读出CPU诊断缓冲区 ................................................................................................................... 52

4.11.5 显示/比较CPU的用户内存 ......................................................................................................... 52

4.11.6 显示CPU的循环时间 ................................................................................................................... 52

Page 3: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

3

4.11.7 显示CPU的时间系统 ................................................................................................................... 52

4.11.8 显示在CPU中的块 ....................................................................................................................... 53

4.11.9 显示CPU有关通讯的信息(Displaying Information about Communication with the CPU) .... 53

4.11.10 显示CPU的堆栈(Displaying the Stacks of the CPU) ............................................................. 53

5 S7-SCL基本术语 .................................................................................................................................................... 54

5.1 解释句法图(Interpreting the Syntax Diagrams) .................................................................................. 54

5.2 字符集(Character Set) ......................................................................................................................... 55

5.3 保留字(Reserved Words) ..................................................................................................................... 56

5.4 标识符(Identifiers) ............................................................................................................................... 57

5.5 标准标识符(Standard Identifiers) ....................................................................................................... 57

5.6 块标识符(Block Identifiers) ..................................................................................................................... 58

5.7 地址标识符(Address Identifiers) .............................................................................................................. 59

5.8 定时器标识符(Timer Identifiers) ............................................................................................................. 60

5.9 计数器标识符(Counter Identifiers) ..................................................................................................... 60

5.10 数字(Numbers) .................................................................................................................................. 60

5.11 字符串(Character Strings) ................................................................................................................. 61

5.12 符号(Symbol) .................................................................................................................................... 62

5.13 注释部分(Comment Section) ............................................................................................................ 62

5.14 行注释(Line Comment) ..................................................................................................................... 63

5.15 变量(Variables) .................................................................................................................................. 63

6 S7-SCL程序结构 .................................................................................................................................................... 65

6.1 在S7-SCL源文件中的块(Blocks in S7-SCL Source Files) ................................................................. 65

6.2 块的次序(Order of the Blocks) ........................................................................................................... 65

6.3 块的一般结构(General Structure of a Block) ..................................................................................... 66

6.4 块的开始和结束(Block Start and End) ............................................................................................... 66

6.5 块的属性(Attributes for Blocks) ......................................................................................................... 67

6.6 块注释(Block Comment) ..................................................................................................................... 69

6.7 块的系统属性(System Attributes for Blocks) ..................................................................................... 69

6.8 声明部分(Declaration Section) ........................................................................................................... 70

6.9 参数的系统属性(System Attributes for Parameters) .......................................................................... 71

6.10 语句部分(Statement Section) ............................................................................................................ 71

6.11 语句(Statements) ................................................................................................................................ 72

6.12 功能块(FB)的结构(Structure of a Function Block (FB)) .................................................................. 73

6.13 函数(FC)的结构(Structure of a Function (FC)) ................................................................................. 74

6.14 组织块(OB)的结构(tructure of an Organization Block (OB)) .......................................................... 76

6.15 用户定义数据类型的结构(Structure of a User-defined Data Type) ................................................ 77

6.16 在S7-SCL源文件中的编译选项(Compiler Options in S7-SCL Source Files) ................................. 78

附:数据块(DB)的结构(Structure of a Data Block (DB)) ........................................................................ 79

7 数据类型 .............................................................................................................................................................. 82

7.1 在SCL中数据类型概述(Overview of the Data Types in SCL) ........................................................... 82

7.2 基本数据类型 ........................................................................................................................................... 83

7.2.1 位类数据类型(Bit Data Types) ................................................................................................. 83

7.2.2 字符类数据类型(Character Types) ................................................................................................ 83

7.2.3 数字类数据类型(Numeric Data Types) .................................................................................... 84

7.2.4 时间类数据类型(Time Types) .................................................................................................. 84

7.3 复杂数据类型 ........................................................................................................................................... 84

Page 4: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

4

7.3.1 日期时间数据类型(DATE_AND_TIME Data Type) ................................................................... 84

7.3.2 字符串数据类型(STRING Data Type) ....................................................................................... 86

7.3.3 数组数据类型(ARRAY Data Type) ............................................................................................ 87

7.3.4 结构数据类型(STRUCT Data Type) .......................................................................................... 88

7.4 用户定义数据类型(UDT)(User-Defined Data Types) .................................................................. 89

7.5 参数的数据类型(Data type of Parameters) ................................................................................ 91

7.5.1 定时器和计数器数据类型(TIMER and COUNTER Data Types) .................................................. 91

7.5.2 块数据类型(BLOCK Data Types) ............................................................................................... 91

7.5.3 指针数据类型(POINTER Data Type) ........................................................................................ 92

附:参数数据类型举例(Example of Data Types for Parameters) ..................................................... 93

7.6 ANY数据类型(ANY Data Type) ......................................................................................................... 93

7.6.1 ANY数据类型举例(Example of the ANY Data Type) ................................................................. 94

8 本地变量和块参数的声明 .................................................................................................................................. 95

8.1 本地变量和块参数(Local Variables and Block Parameters) .............................................................. 95

8.2 变量或参数声明的常规句法(General Syntax of a Variable or Parameter Declaration) .................... 95

8.3 初始化(Initialization) .......................................................................................................................... 96

8.4 声明变量范围上的视图(Declaring Views of Variable Ranges) ......................................................... 98

8.5 使用多重实例(Using Multiple Instances) ........................................................................................... 99

8.6 实例声明(Instance Declaration) .......................................................................................................... 99

8.7 标志(OK标志) ........................................................................................................................................ 100

8.8 声明子域 ................................................................................................................................................. 100

8.8.1 声明子域概述(Overview of the Declaration Subsections) .................................................... 100

8.8.2 静态变量(Static Variables) ..................................................................................................... 101

8.8.3 临时变量(Temporary Variables) .............................................................................................. 102

8.8.4 块参数(Block Parameters) ...................................................................................................... 103

9 声明常量和标号 ................................................................................................................................................ 105

9.1 常量(Constants) ................................................................................................................................. 105

9.1.1 为常量声明符号名(Declaring Symbolic Names for Constants) ............................................. 105

9.1.2 常量的数据类型(Data Types for Constants) .......................................................................... 106

9.1.3 常量标记法(Notation for Constants) ..................................................................................... 106

9.2 声明标号(Declaring Labels) ............................................................................................................. 117

10 共享数据 ......................................................................................................................................................... 118

10.1 共享数据概述(Overview of Shared Data) ...................................................................................... 118

10.2 CPU的内存区域(Memory Areas of the CPU) ................................................................................. 118

10.2.1 CPU的内存区域概述(Overview of the Memory Areas of the CPU) ..................................... 118

10.2.2 CPU内存区域的绝对存取(Absolute Access to Memory Areas of the CPU) ......................... 119

10.2.3 CPU内存区域的符号存取(Symbolic Access to Memory Areas of the CPU) ......................... 120

10.2.4 CPU内存区域的索引存取(Indexed Access to Memory Areas of the CPU) .......................... 121

10.3 数据块(Data Blocks) ....................................................................................................................... 122

10.3.1 数据块概述(Overview of Data Blocks) ................................................................................. 122

10.3.2 数据块的绝对存取(Absolute Access to Data Blocks) .......................................................... 122

10.3.3 数据块的索引方式存取(Indexed Access to Data Blocks) ................................................... 124

10.3.4 数据块的结构化存取(Structured Access to Data Blocks) ................................................... 124

11 表达式、操作符和地址 .................................................................................................................................. 126

11.1 表达式、运算符和地址概述(Overview of Expressions, Operations and Addresses) ................... 126

11.2 运算符(Operations) ......................................................................................................................... 126

Page 5: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

5

11.3 地址(Addresses) ............................................................................................................................... 127

11.4 表达式的语法(Syntax of an Expression) ........................................................................................ 128

11.5 简单表达式(Simple Expression) ..................................................................................................... 129

11.6 算术表达式(Arithmetic Expressions) .............................................................................................. 130

11.7 逻辑表达式(Logical Expressions) ................................................................................................... 131

11.8 比较表达式(Comparison Expressions) ............................................................................................ 133

12 语句 .................................................................................................................................................................. 135

12.1 赋值(Value Assignments) ................................................................................................................ 135

12.1.1 基本数据类型变量的赋值(Value Assignments with Variables of an Elementary Data Type)

................................................................................................................................................................ 135

12.1.2 STRUCT和UDT类型变量的赋值(Value Assignments with Variables of the Type STRUCT and

UDT) ..................................................................................................................................................... 136

12.1.3 ARRAY类型变量的赋值(Value Assignments with Variables of the Type ARRAY) .................. 137

12.1.4 STRING数据类型变量的赋值(Value Assignments with Variables of the Data Type STRING)

................................................................................................................................................................ 138

12.1.5 DATE_AND_TIME 类型变量的赋值( Value Assignments with Variables of the Type

DATE_AND_TIME) ................................................................................................................................ 139

12.1.6 内存区域中绝对变量的赋值(Value Assignments with Absolute Variables for Memory Areas)

................................................................................................................................................................ 140

12.1.7 共享变量的赋值(Value Assignments with Shared Variables) .............................................. 141

12.2 控制语句 ............................................................................................................................................... 142

12.2.1 控制语句概述(Overview of Control Statements) ................................................................ 142

12.2.2 条件(Conditions) .................................................................................................................. 142

12.2.3 IF语句(IF Statements) ............................................................................................................ 143

12.2.4 CASE语句(CASE Statement) ................................................................................................... 144

12.2.5 FOR语句(FOR Statement) ...................................................................................................... 145

12.2.6 WHILE语句(WHILE Statement) .............................................................................................. 147

12.3.7 REPEAT语句(REPEAT Statement) ........................................................................................... 148

12.2.9 EXIT语句(EXIT Statement) ..................................................................................................... 149

12.2.10 GOTO语句(GOTO Statement) .............................................................................................. 150

12.2.11 RETURN语句(RETURN Statement) ....................................................................................... 151

12.3 功能和功能块的调用 ........................................................................................................................... 151

12.3.1 调用和参数传递(Call and Parameter Transfer) ........................................................................... 151

12.3.2 调用功能块(Calling Function Blocks) .................................................................................... 152

12.3.3 调用功能(Calling Functions) ................................................................................................. 158

12.3.4 隐式定义参数 ............................................................................................................................ 162

13 计数器和定时器 .............................................................................................................................................. 164

13.1 计数器 ................................................................................................................................................... 164

13.1.1 计数器函数(Counter Functions) .......................................................................................... 164

13.1.2 调用计数器函数(Calling Counter Functions) ........................................................................ 164

13.1.3 提供参数给计数器函数(Supplying Parameters for Counter Functions) ............................. 165

13.1.4 计数器值的输入和取得(Input and Evaluation of the Counter Value) ................................ 166

13.1.5 向上计数(S_CU) ......................................................................................................................... 167

13.1.6 向下计数(S_CD) ......................................................................................................................... 167

13.1.7 双向计数(S_CUD) ...................................................................................................................... 168

13.1.8 计数器函数的例子 .................................................................................................................... 168

Page 6: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

6

13.2 定时器 ................................................................................................................................................... 169

13.2.1 定时器函数(Timer Functions) .............................................................................................. 169

13.2.2 调用定时器函数(Calling Timer Functions) .......................................................................... 169

13.2.3 提供参数合定时器函数(Supplying Parameters for Timer Functions) ................................ 171

13.2.4 输入和取得时间值(Input and Evaluation of a Time Value) ................................................. 172

13.2.5 脉冲定时器(S_PULSE) Start Timer as Pulse Timer (S_PULSE) ................................................... 173

13.2.6 脉冲扩展定时器(Start Timer as Extended Pulse Timer (S_PEXT)) ...................................... 173

13.2.7 上电延时(闭合)定时器 Start Timer as On-Delay Timer (S_ODT) ............................................. 174

13.2.8 保持型上电延时(闭合)定时器(S_ODTS) Start Timer as Retentive On-Delay Timer (S_ODTS) . 175

13.2.9 断电延时(断开)定时器(S_OFFDT) Start Timer as Off-Delay Timer (S_OFFDT) ...................... 175

13.2.10 定时器函数的例子 Example of Timer Functions ................................................................... 176

13.2.11 选择正确的定时器(Selecting the Right Timer) ................................................................. 177

14 S7-SCL的标准函数 ............................................................................................................................................ 178

14.1 数据类型转换函数 ............................................................................................................................... 178

14.1.1 转换数据类型(Converting Data Types) ................................................................................ 178

14.1.2 隐式数据类型转换(Implicit Data Type Conversion) ............................................................ 178

14.1.3 显式数据类型转换的标准函数(Standard Functions for Explicit Data Type Conversion) ... 179

14.2 数字类标准函数 ................................................................................................................................... 183

14.2.1 通用标准算术函数(General Arithmetic Standard Functions) ............................................. 183

14.2.2 对数函数(Logarithmic Functions) ........................................................................................ 184

14.2.3 三角函数(Trigonometric Functions) .......................................................................................... 184

14.2.4 数字类标准函数举例(Examples of Numeric Standard Functions) ........................................... 184

14.3 标准位串函数(Bit String Standard Functions) ..................................................................................... 185

14.3.1 标准位串函数举例(Examples of Bit String Standard Functions) .............................................. 185

14.4 串处理函数 ........................................................................................................................................... 186

14.4.1 串操作函数(Functions for String Manipulation) ................................................................. 186

14.4.2 串比较函数(Functions for Comparing Strings) .................................................................... 188

14.4.3 数据格式转换函数(Functions for Converting the Data Format) ......................................... 189

14.4.4 字符串处理举例(Example of Processing Character Strings) ............................................... 190

14.5 选值函数(Functions for Selecting Values) ...................................................................................... 192

14.5.1 选值函数(Functions for Selecting Values) ............................................................................ 192

14.6 系统函数/功能块和标准库 .................................................................................................................. 194

14.6.1 系统函数/功能块和标准库(System Functions/Function Blocks and the Standard Library)

............................................................................................................................................................... 194

14.6.2 传递到组织块的接口(Transfer Interface to OBs) ................................................................ 195

15 语言描述 ......................................................................................................................................................... 197

15.1 规范化语言描述 ................................................................................................................................... 197

15.1.1 语法图概述(Overview of Syntax Diagrams) ......................................................................... 197

15.1.2 规则(Rules) ........................................................................................................................... 198

15.1.3 在组词规则中使用的术语(Terms Used in the Lexical Rules) .............................................. 199

15.1.4 格式符、分隔符和运算符(Formatting Characters, Separators and Operations) ............... 200

15.1.5 关键字和预定义标识符(Keywords and Predefined Identifiers) ......................................... 202

15.1.6 地址标识符和块关键字(Address Identifiers and Block Keywords) .................................... 204

15.1.7 非术语项概述(Overview of Non Terms) .............................................................................. 205

15.1.8 语言符号概述(Overview of Tokens) .................................................................................... 206

15.1.9 标识符(Identifiers) ............................................................................................................... 206

Page 7: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

7

15.1.10 在S7-SCL中取名(Assigning Names in S7-SCL) .................................................................... 207

15.1.11 预定义的常量和标志(Predefined Constants and Flags) ................................................... 209

15.2 组词规则 ............................................................................................................................................... 209

15.2.1 概述:组词规则(Overview: Lexical Rules) .......................................................................... 209

15.2.2 标识符(Identifiers) ............................................................................................................... 209

15.2.3 常量(Constants) .................................................................................................................... 211

15.2.4 绝对地址(Absolute Addressing) ........................................................................................... 214

15.2.5 注释(Comments) .................................................................................................................. 216

15.2.6 块属性(Block Attributes) ...................................................................................................... 216

15.2.7 编译器选项(Compiler Options) ............................................................................................ 217

15.3 语法规则 ............................................................................................................................................... 218

15.3.1 概述:句法规则(Overview: Syntax Rules) ........................................................................... 218

15.3.2 S7-SCL源文件的结构 .................................................................................................................. 218

15.3.3 声明部分的结构(Structure of the Declaration Sections) .................................................... 220

15.3.4 在S7-SCL中的数据类型(Data Types in S7-SCL) .................................................................... 223

15.3.5 语句部分(Statement Section) .............................................................................................. 225

15.3.6 赋值(Value Assignments) ....................................................................................................... 227

15.3.7 调用函数和功能块(Calling Functions and Function Blocks) ................................................ 229

15.3.8 控制语句(Control Statements) ............................................................................................. 230

16 技巧与秘诀 ...................................................................................................................................................... 234

术语表 .................................................................................................................................................................... 237

Page 8: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

8

Page 9: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

1

1 产品概述

1.1 S7-SCL 应用范围

S7-SCL(结构化控制语言)是用于 SIMATIC S7 系列 CPU 编程的类 PASCAL 高级语言。

PLC 无关性认可

S7-SCL 遵循在 IEC 61131-3 定义的文本高级语言 ST(结构化文本),并且确保其可重用性。

应用范围(Area of application)

S7-SCL 针对可编程逻辑控制器(PLC)编程进行了优化,且其既包含了 PASCAL 编程语言的语言元

素,又包含了诸如输入/输出、计时器和计数器等的典型的 PLC 元素。 S7-SCL 特别适合下列任务: 复杂算法的编程 数学函数的编程 数据和配方管理 过程优化

1.2 S7-SCL 的功能

集成到 STEP

S7-SCL 支持 STEP 7 的(程序)块概念。

用 S7-SCL 可以创建下列 STEP 7(程序)块: OB(组织块) FC(函数,在 STEP 7 中文版中称“功能”) FB(功能块) DB(数据块) UDT(用户自定义数据类型) 在一个 S7 程序中,S7-SCL(程序)块也能够与其他 STEP 7 编程语言所编写的块相结合,块可以相

互调用。S7-SCL 块也可以储存在库中并被其他语言使用。 因为 S7-SCL 程序用 ASCII 文本编程,故极易导入导出。 S7-SCL 块能编译成 STEP 7 编程语言 STL(语句表)格式,但是记住,当存贮成 STL 形式的程序就

Page 10: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

2

不再能够在 S7-SCL 中进行编辑。

开发环境(Development environment)

事实上,S7-SCL 提供了强大的开发环境,其特殊的方面已经与 STEP 7 进行协调。开发环境包括

下面组件: 一个编辑器,便于编制包含有函数(FC)、功能块(FB)、组织块(OB)、数据块(DB)和用户自定

义数据类型(UDT)的程序。编程器支持强大的处理功能。 一个批编译器,便于将编辑好的程序编译成 MC7 机器代码。生成的 MC7 代码可以在所有

S7-300/400 可编程控制器系列 CPU 上执行,像 CPU 314。 一个调试器,便于在无编辑错误的程序中查找逻辑错误。找出的错误在源语言程序中显示出

来。 下图表明开发环境组件的概况:

1.3 S7-SCL 提供了哪些功能?

S7-SCL 提供了高级语言的所有优点,此外,还提供特别设计支持结构化程序的性能:

块库(Block libraries)

库提供预定义的块,如: 系统功能 IEC 功能 转换功能

在对话框中浏览库,当选中一个块,其参数模板自动调入正处理的文件中,只要输入所要声

明的参数即可。

编程模板(Program templates)

S7-SCL 编辑器提供用来插入的只要填充的各种模板: 块(如功能块、数据块)及其调用的模板 块注释、块参数和常量的模板 程序控制结构的模板(IF, CASE, FOR, WHILE, REPEAT)

Page 11: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

3

来自高级编程的语言元素(Language elements from high-level programming)

通过使用有效的语言结构简单迅速创建程序,很少出错。如: 循环结构 分支结构(IF ... THEN ... ELSE) 跳转

程序通俗易懂(Program easy to understand)

下列特点增加了程序的易读性: 全符号编程 注释 基本的和自定义数据类型 显示交叉参考 通过在行首增加空格自动格式化输入的内容 语言元素的语法着色

高级语言级的调试(Debugger on high-level language level)

调试器允许高级语言级的简明程序调试,其提供下列功能: 连续监视程序的执行 按可单独设置的断点逐步监视 踏入(step-in)功能(调试期间跳入调用块中的可能性)

1.4 在版本 V5.3 SP1 中的新内容

语言的扩充(Language extensions)

在 IEC 61131-3 中定义的语言资源加进了 S7-SCL V5.3 SP1: 处理数值的函数当作 SCL 的内部函数(SEL, MAX, MIN, LIMIT, MUX) 通过转换函数(BCD_TO_INT, INT_TO_BCD, etc.)支持表示整数的 BCD 码 派给操作符 => 用于函数的输出参数 用同类项初始化域 新的转换函数(BYTE_TO_INT, INT_TO_BYTE, etc.)

在源文件中进行编译器的设置(Compiler settings in the source)

编译器的设置能够储存在 S7-SCL 源文件或编译控制文件,意思是说可存贮源文件的特别编译性

能。

扩充的调试功能(Extended debugging functions)

在 S7-SCL 块中的块矛盾和时间戳记冲突能用 STEP 7 的调试功能“检查块冲突(Check block

Page 12: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

4

consistency)”来检查和纠正。此功能从 STEP 7 V5.3 SP2 开始就可用了。 “监视器(Monitor)”调试功能能够用在更多定义了调用环境的特殊情况。 “监视器(Monitor)”的监视范围能够在源文件中标识部分不进行特别限制。

彩色打印(Color printing)

S7-SCL 也能够进行彩色打印。

扩充的查找功能(Extended search function)

现在,S7-SCL 也允许从光标位置开始查找和在选定内容中查找。

在源文本中放置书签(Placing of bookmarks in the source text)

现在,能够通过在源文件中的书签进行快速浏览。

用外语字符集创建 S7-SCL 程序块(Creation of S7-SCL blocks with foreign-language

character set)

S7-SCL 源文件能包含用外语字符集的文本。这就允许建立适应广阔需要的程序块,用户见到的

关键处是用外语字符集显示的(如符号块名、属性和注释)。 更多的关于外语字符集的信息请参考 Readme 文件。

Page 13: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

5

2 安装

2.1 自动化许可证管理器

2.1.1 通过自动化许可证管理器使用授权

自动化许可证管理器

使用编程软件时,需要产品专用的许可证密钥(用户权限)。从 SU-SCL V5.3 起,这个密钥通过

自动化许可证管理器安装。 自动化许可证管理器是 Siemens AG 公司的软件产品。它用于管理系统全部的许可证密钥(许可

证模块)。 自动化许可证管理器处于下列位置: STEP 7 的安装程序中 Siemens AG 公司 Internet 的 A&D 服务支持网页中下载 自动化许可证管理器集成了自身的在线帮助。要在安装许可证管理器后获取帮助,请按 F1 或选

择帮助 > 许可证管理器帮助。绍在线帮助包含自动化许可证管理器功能和操作的详细信息。

许可证

合法使用受许可证保护的 STEP 7 程序软件包时必须要有许可证。许可证为用户提供使用产品的

合法权限。下列各项提供使用权限证明: CoL (许可证证书),和 许可证密钥

许可证证书(CoL)

产品所包含的“许可证”是使用绍产品权限的合法证明。绍产品只能供许可证证书(CoL)拥有者或由

拥有者授权使用的人员使用。

许可证密钥

许可证密钥是软件使用许可证的技术表示(电子“许可证标志”)。 SIEMENS AG 给受许可证保护的所有软件颁发许可证密钥。启动计算机后,只能在确认具有有效

许可证密钥之后,才能根据许可证和使用条款使用绍软件。 注意 可以使用不带许可证密钥的标准软件来熟悉用户接口和功能。 但是,必须使用许可证才能根据许可证协议完全无限制地使用 STEP 7 软件。 如果还没有安装许可证密钥,那么将定期提示您安装许可证密钥。 可以按如下所述,在各种类型的存储设备之间存储和传送许可证密钥: 在许可证密钥软盘上

Page 14: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

6

在本地硬盘上 在网络硬盘上 如果安装没有提供许可证的软件产品,则请判定需要何种许可证密钥,并按要求订购。 欲知获取和使用许可证密钥的详情,请参见自动化许可证管理器的在线帮助。

许可证类型

给西门子 AG 软件产品提供下列不同类型的面向应用的用户许可证。软件的实际特性取决于所安

装的许可证密钥类型。可在附带的许可证证书中获得使用类型。 许可证类型 描述 单独许可证 绍软件可在希望具有无限使用时间的单台计算机上使用。 浮动许可证 绍软件可在希望具有无限使用时间的计算机网络(“远程使用”)上使用。 试用许可证 绍软件可在下列限制条件下使用:

有效期最多为 14 天, 第一次使用之日起的总操作天数, 用于测试和确认(免除责任)。

升级许可证 在软件升级方面,现有系统中的特定要求可能适用: 升级许可证可用于将“旧版本 X”软件转换为新版本 X+。 由于给定系统中需处理的数据量增大,可能需要升级。

2.1.2 安装自动化许可证管理器

自动化许可证管理器通过 MSI 设置过程安装。STEP 7 产品 CD 包含自动化许可证管理器的安装

软件。 可以在安装 STEP 7 的同时安装自动化许可证管理器或在以后安装。 注意 欲知如何安装自动化许可证管理器的详细信息,请参见当前的“Readme.wri”文件。 自动化许可证管理器的在线帮助包含许可证密钥功能和处理所需的所有信息。

随后安装许可证密钥

启动 STEP 7 软件时如果没有可用的许可证密钥,将显示一个指示绍情况的警告消息。 注意 可以使用不带许可证密钥的标准软件来熟悉用户接口和功能。 但是,必须使用许可证才能根据许可证协议完全无限制地使用 STEP 7 软件。 如果还没有安装许可证密钥,那么将定期提示您安装许可证密钥。 可按下列方法随后安装许可证密钥: 从软盘上安装许可证密钥 安装从 Internet 上下载的许可证密钥。这种情况下,必须首先订购许可证密钥。 使用网络中可用的浮动许可证密钥 欲知安装许可证密钥的详细信息,请参见自动化许可证管理器的在线帮助。请按 F1 或选择菜单

Page 15: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

7

命令帮助 > 许可证管理器帮助。 注意 在 Windows 2000/XP 中,只有在本地硬盘上安装并具有写访问状态时,才能操作许可证密钥

授权。 也可以在网络内使用浮动许可证(“远程”使用)。

2.1.3 处理许可证密钥的指南

警告 请注意在自动化许可证管理器在线帮助以及在安装 CD-ROM 中 STEP 7 Readme.wri 文件中关于

处理许可证密钥的信息。如果不遵守这些指南,那么将丢失许可证密钥且不可恢复。 要访问自动化许可证管理器的在线帮助,请按 F1 获取上下文关联帮助或选择帮助> 许可证管理

器帮助菜单命令。 绍帮助部分包含许可证密钥功能和处理所需的所有信息。

2.2 安装

2.2.1 安装要求(Installation Requirements)

系统要求(System Requirements)

S7-SCL V5.3 SP1 选件包能够运行在安装了 STEP 7 V5.3 或更高版本的标准包编程设备或 PC 上。 关于操作系统的必要条件请参考 Readme.wri 文件。

硬件要求(Hardware Requirements)

S7-SCL 的要求与 STEP 7 标准包一样。S7-SCL V5.3 SP1 选件包对硬盘空间的要求能在 Readme.wri文件中找到。

2.2.2 S7-SCL 的安装(Installation of S7-SCL)

启动安装程序(Starting the Installation Program)

S7-SCL 包含一个自动安装软件的 Setup 程序。出现在屏蔽上的提示指导你一步一步地完成整个安

装过程。 大致步骤如下: 1. 打开 Windows 2000/XP 的控制面板,双击增加/删除程序图标。 2. 选择安装 l... 3. 插入 CD,点击"下一步(Next)"。然后 Windows 将自动搜索安装程序"Setup.exe"。 4. 安装程序显示下面的指示。

Page 16: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

8

安装许可证(Installing License Keys)

安装期间,程序将检查是否在硬盘上安装了相应的许可证。如未发现有效的许可证,信息会告之

软件只能在所显示的许可证下使用。如果需要,能够立即安装许可证或继续安装然后再安装许可

证。如果现在就安装许可证,按照提示插入授权软盘。

Page 17: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

9

3 设计一个 SCL 程序

3.1 一个针对初次用户的例子——“获取测量值”(Welcome to

"Measured Value Acquisition" - A Sample Program for

First-Time Users )

你将学到什么?

这个针对初次用户的例子将告诉你如何有效使用 S7-SCL。首先,你或许会有一些问题,如: 我怎样用 SCL 来设计程序? 哪些 S7-SCL 语言功能适合执行任务? 有什么调试功能可用? 本部分中将回答这些及其他问题。

S7-SCL 语言元素的使用

例子程序采用了下列 S7-SCL 语言功能: 各种 S7-SCL 块类型的结构和应用 带参数传递的块调用和赋值 各种输入和输出格式 用基本数据类型的数组编程 初始化变量 程序结构,分支及循环的使用

硬件要求(Required Hardware)

能够在 SIMATIC S7-300 或 SIMATIC S7-400 运行例子程序,需要以下外部设备: 一个 16 点的输入模块 一个 16 点的输出模块

调试功能(Debugging Functions)

程序已经创建,用输入模块上的开关和显示在输出模块上,能够迅速测试此程序。要运行全面的

测试,使用 S7-SCL 的调试功能。 也能够使用 STEP 7 标准包提供的其他系统函数。

Page 18: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

10

3.2 任务(Task)

概述(Overview)

通过输入模块获取测量值,然后通过 S7-SCL 存贮和处理测量值。结果将显示在输出模块上。

获取测量值(Acquire Measured Values)

测量值用 8 个输入开关设置,当检测到输入开关的边沿时,然后将测量值读入内存中的测量值数

组(见下图)。 测量值的范围是 0 到 255,为此需要 1 个字节。

处理测量值(Processing Measured Values)

测量值数组组织成一个最多 8 个输入项目的环形缓冲区。当检测到排序开关的信号,测量值数组

中存贮的值则按增序进行排列。其后,计算每个数的均方根和平方值。为此需要 1 个字。

选择性输出(Selectable Outputs)

只能显示一个值在输出模块上,要进行如下选择: 从列表中元素的选择 测量值、均方根和平方值的选择 按如下选择显示的值如下: 3 个开关用来设置代码,检测到第 4 个开关——取码开关的信号,则记录下代码。从此,被

计算的地址用来存取输出。 同一个地址标识三个值:测量值、及其均方根和平方值。要选择这三个值中的一个,要求 2

个选择器开关。

Page 19: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

11

3.3 结构化 S7-SCL 程序的设计

块的种类(Block Types)

采用结构化 S7-SCL 程序是前面定义的任务的最好解决方案。换言之,意思是采用模块化设计,

程序分成几个块,每块对应特定的子任务。在 SCL 中,与在 STEP 7 中的其他语言一样,有下列

块类型可用。

Page 20: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

12

在 S7-SCL 源文件中块的约定(Arrangement of Blocks in S7-SCL Source Files)

一个 S7-SCL 程序包含一个或几个 S7-SCL 源文件。一个源文件能够包含单个块或一个有几个块

的完整程序。

3.4 定义子任务(Defining the Subtasks)

子任务(Subtasks)

下图显示了子任务,方形区域表示块。逻辑块从左到右排列,也是他们被调用的次序。

Page 21: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

13

选择和指定要用的块类型(Selecting and Assigning the Available Block Types)

根据下列准则选择各个块: 功能 块名称 用户程序只能在一个 OB 启动。因测量值将被不断地获取,要求

有一个循环调用的组织块(OB1)。程序部分——数据输入和数据

输出在此 OB 中编程。

"Cycle" OB

子任务“获取测量数据”要求一个带内存的块,即功能块,因为某

些本地块数据(如环形缓冲区)必须从一个程序循环保留至下一个

程序循环。排序数据(内存)的定位在实例数据块ACQUIRE_DATA中。同样的 FB 也能够管理地址和选择输出子任务,因数据是在

此用。

"Acquire" FB

当为子任务排序测量数据和计算结果选择块类型时,记住须要一

个包含每个测量值的计算结果“均方根”和“平方值”的输出缓冲

区。只有 FB 是合适的块类型。因为在调用层次中,此 FB 被上

层的 FB 调用,它不需要拥有自己的 DB。其实例数据能够存贮

在调用它的 FB 的实例数据块中。

"Evaluate" FB

函数最适合子任务计算均方根和平方值,因结果能够作为函数值

返回,而且无可用数据在一个程序循环后再需要保留。标准的

S7-SCL函数SORT能够用来计算均方根。建立特殊函数SQUARE来计算均方根,同时检查其值是否在允许的范围内。

"SQRT" FC (square root) and "Square" FC

3.5 定义块间接口(Defining the Interfaces Between Blocks)

概述(Overview)

块的接口由能够为其他块存取的参数组成。 声明的参数是一个占位符,当块被实际地使用(被调用)时,则有一个值。占位符当作形式参数,

当块被调用时指定的值作为实际参数。当一个块被调用,输入数据作为实际参数传递给它。程序

返回到凋用块后,输出数据可用作更多的处理。函数能够传递其结果作为函数值。 块参数能够分为以下几类: 块参数 描述 声明 输入参数 Input parameters

当块被调用时,输入参数接受实际的输入值。他们是

只读的。 VAR_INPUT

输出参数 Output parameters

输出参数传送当前输出值到产生调用的块。能够写入

或读出数据。 VAR_OUTPUT

输入/输出参数 In/out parameters

输入/输出参数在块被调用时接受变量的实际值,且

将结果返回给原来的变量。 VAR_IN_OUT

Cycle OB

CYCLE OB 没有自己的形式参数。它调用功能块 ACQUIRE,并传递测量值和控制数据到其形式

参数。 "获取"功能块(Acquire FB)

Page 22: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

14

参数名 数据类型 声明形式 描述 measval_in INT VAR_INPUT 测量值 newval BOOL VAR_INPUT 输入测量值到环形缓冲区的开关 resort BOOL VAR_INPUT 排序和求测量数据(均方根和平方)值的开关 funct_sel BOOL VAR_INPUT 均方根或平方值的选择器开关 selection WORD VAR_INPUT 选择输出值的代码 newsel BOOL VAR_INPUT 读入代码的开关 result_out DWORD VAR_OUTPUT 计算结果的输出 measval_out DWORD VAR_OUTPUT 测量值的输出

求值(Evaluate)

功能块 ACQUIRE 调用功能块 EVALUATE。他们共享的是要求排序的测量值数组。而且数组声明

成输入/输出参数。为计算结果均方根和平方值建立了一个结构化的数组作为输出参数。下表显示

了形式参数: 名称 数据类型 声明形式 描述 sortbuffer ARRAY[..] OF

REAL VAR_IN_OUT 测量值数组,对应环形缓冲区

calcbuffer ARRAY[..]OF STRUCT

VAR_OUTPUT 结果数组: 带 INT 类型组件“square root”和“square”的结构

SQRT and Square

这些函数被 EVALUATE 调用。他们需要一个输入值(自变量),并作为函数值返回其结果。 名称 数据类型 声明形式 描述 value REAL VAR_INPUT SQRT 的输入 SQRT REAL Function value 输入值的均方根 value INT VAR_INPUT SQUARE 的输入 SQUARE INT Function value 输入值的平方值

3.6 定义输入/输出接口

下图显示了输入/输出接口。记住当输入/输出是用的字节,低位字节在上方而高低字节在下方。

另一方面,如果输入/输出用字,则正好相反。

Page 23: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

15

3.7 定义源文件中块的顺序

在排列 S7-SCL 源文件中块的顺序时,记住在使用前,就是说在被其他块调用前,块必须已经存

在。意味着在 S7-SCL 源文件中必须按下图排列各块:

Page 24: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

16

3.8 定义符号(Defining Symbols)

对模块地址使用符号名和块使得编程容易进行。在能够使用这些符号前,必须在符号表中键入他

们。 下图显示例子程序的符号表。它描述了在符号表中声明的符号名,这样能够无错误地编译源文件:

3.9SQUARE 函数的语句部分 (Statement Section of the

SQUARE Function)

语句部分(Statement Section)

程序首先检查输入值是否超出其结果将溢出数字范围的限制。若此,用整数的最大值代之,否则

计算平方值。结果作为函数值传递。 FUNCTION SQUARE : INT (************************************************************ 该函数返回输入值的平方值作为函数值,如果存在溢出,则为整数能够表示的最大值。 *************************************************************) VAR_INPUT value : INT; END_VAR BEGIN IF value <= 181 THEN SQUARE := value * value; //计算函数值 ELSE SQUARE := 32_767; //如果溢出,则设置为最大值 END_IF; END_FUNCTION

Page 25: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

17

3.10 建立 EVALUATE 功能块

3.10 .1EVALUATE 的流程图(Flow Chart for EVALUATE)

下图用流程图形式显示算法:

Page 26: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

18

3.10.2 功能块 EVALUATE 的声明部分

声明部分的结构(Structure of the Declaration Section)

该块的声明部分有以下子域: 常量:在 CONST 和 END_CONST 之间。 输入/输出参数:在 VAR_IN_OUT 和 END_VAR 之间。 输出参数:在 VAR_OUTPUT 和 END_VAR 之间。 临时变量:在 VAR_TEMP 和 END_VAR 之间。

CONST LIMIT := 7; END_CONST VAR_IN_OUT sortbuffer : ARRAY[0..LIMIT] OF INT; END_VAR VAR_OUTPUT calcbuffer : ARRAY[0..LIMIT] OF STRUCT squareroot : INT; square : INT; END_STRUCT; END_VAR VAR_TEMP swap : BOOL; index, aux : INT; valr, resultr : REAL ; END_VAR

3.10.3EVALUATE 功能块的声明语句

编程顺序(Program Sequence)

输入/输出参数"sortbuffer"连接到环形缓冲区"measvals"以便缓冲区的原始内容被排序好的测量值

覆盖。 新数组"calcbuffer"为计算结果建立,用作为输出参数。其元素是结构化的,以便包含每个测量值

的均方根和平方值。 下图显示数组间的关系:

Page 27: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

19

此接口显示处理测量值时数据交换的核心。数据存贮在实例数据块 ACQUIRE_DATA 中,在调用

功能块 ACQUIRE 时,建立了功能块 EVALUATE 的本地实例。

EVALUATE 的语句部分(Statement Section of EVALUATE)

首先,对环形缓冲区里的测量值进行排序,然后计算: 排序算法

常见的交换值的方法用来对测量值组缓冲区进行排序。意思是比较相邻值并交换其位置,最

终达到从头到尾按序排列。使用的缓冲区是输入/输出参数"sortbuffer"。 启动计算

一旦排序完成,执行一个循环,调用函数 SQUARE 求平方值,调用函数 SQRT 进行开方求

均方根值。结果存贮在结构化数组"calcbuffer"中。

EVALUATE 的语句部分(Statement Section of EVALUATE)

逻辑块的语句部分如下: BEGIN (******************************************************** 第一部分 排序:根据"冒泡排序法":交换值对直到测量值排序完成。 **********************************************************) REPEAT swap := FALSE; FOR index := LIMIT TO 1 BY -1 DO IF sortbuffer[index-1] > sortbuffer[index] THEN aux :=sortbuffer[index]; sortbuffer[index] := sortbuffer[index-1]; sortbuffer[index-1] := aux; swap := TRUE; END_IF; END_FOR; UNTIL NOT swap END_REPEAT; (********************************************************** 第二部分 计算:用标准函数 SQRT 求均方根,用 SQUARE 函数求平方值。 ************************************************************) FOR index := 0 TO LIMIT BY 1 DO valr := INT_TO_REAL(sortbuffer[index]); resultr := SQRT(valr);

Page 28: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

20

calcbuffer[index].squareroot := REAL_TO_INT(resultr); calcbuffer[index].square := SQUARE(sortbuffer[index]); END_FOR; END_FUNCTION_BLOCK

3.11 建立 ACQUIRE 功能块

3.11.1 ACQUIRE 的流程图(Flow Chart for ACQUIRE)

下图是用流程图形式显示算法:

Page 29: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

21

3.11.2 功能块 ACQUIRE 的声明部分(Declaration Section of FB

ACQUIRE)

声明部分的结构(Structure of the Declaration Section)

块中的声明部分包含以下子域: 常量:在 CONST 和 END_CONST 之间。 输入参数:在 VAR_INPUT 和 END_VAR 之间。 输出参数:在 VAR_OUTPUT 和 END_VAR 之间。 静态变量:在 VAR 和 END_VAR 之间。也包括对 EVALUATE 块的本地实例的声明。

CONST LIMIT := 7; QUANTITY := LIMIT + 1; END_CONST VAR_INPUT measval_in : INT ; // 新测量值 newval : BOOL; // 在环形缓冲区"measvals"中的测量值 resort : BOOL; // 对测量值进行排序 funct_sel : BOOL; // Select calculation square root/square newsel : BOOL; // 取得输出地址 selection : WORD; // 输出地址 END_VAR VAR_OUTPUT result_out : INT; // 计算值 measval_out : INT; // 相应的测量值 END_VAR VAR measvals : ARRAY[0..LIMIT] OF INT := 8(0); resultbuffer: ARRAY[0..LIMIT] OF STRUCT squareroot : INT; square : INT; END_STRUCT; pointer : INT := 0; oldval : BOOL := TRUE; oldsort : BOOL := TRUE; oldsel : BOOL := TRUE; address : INT := 0; // 转换后的输出地址 outvalues_instance: EVALUATE; // 定义本地实例 END_VAR

Page 30: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

22

静态变量(Static Variables)

因为某些数据要保留到下一个程序循环,所以选择 FB 块类型。有些静态变量在声明部分"VAR, END_VAR"中声明。 静态变量是本地变量,其值保留贯穿每个块处理过程。他们用来保留功能块的值,且存贮在实例

数据块中。

初始化变量(Initializing Variables)

记住当块被初始化时(下载到 CPU 之后),在变量中键入初始值。功能块 EVALUATE 的本地实例

也在声明子域"VAR, END_VAR"中声明。其名字是以后调用和存取输出参数使用的。共享的实例

ACQUIRE_DATA 用来存贮数据。 名称 数据类型 初始值 描述 Measvals ARRAY [..]

OF INT 8(0) 测量值的环形缓冲区

Resultbuffer ARRAY [..] OF STRUCT

- 带有 INT 类型的"square root" 和"square" 组件的结构化数组

Index INT 0 定位测量值的环形缓冲区的索引标识 oldval BOOL FALSE 用"newval"读入的测量值的前一个值 oldsort BOOL FALSE 排序用的"resort"的前一个值 oldsel BOOL FALSE 用"newsel"读入代码的前一个值 address INT 0 测量值或结果输出的地址 eval_instance Local instance - 功能块 EVALUATE 的本地实例

3.11.3 功能块 ACQUIRE 的语句部分(Statement Section of FB

ACQUIRE)

语句部分的结构(Structure of the Statement Section)

ACQUIRE 的语句部分分为三个子部分: 获取测量值:

如果输入参数"newval"与"oldval"不同,则读入一个新测量值到环形缓冲区。 启动排序和计算:

比较输入参数"resort"和"oldsort",发生改变时,通过调用 EVALUATE 功能块启动排充和计算。 求取代码并准备输出:

按字读取代码。根据 SIMATIC 转换规则,意思是上开关组(字节 0)包含输入字的高 8 位,下

开关组(字节 1)包含低 8 位。下图显示代码开关的位置。

计算地址(Calculating the Address)

下图显示如何计算地址:检测到取码开关(位 15)一个边沿,输入字 IW0 的 12 至 14 位包含了读入

的代码。用标准函数 SHR 右移并用 AND 屏蔽相应的位得到“地址”。

Page 31: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

23

地址用来将数组元素(计算结果和对应测量值)写入输出参数。是均方根据,还是平方值决定于

"funct_sel"。 检测到取码开关的一个边沿,是因为"newsel"和"oldsel"不同。

声明部分(Statement Section)

逻辑块的语句部分如下: BEGIN (***************************************************************** 第 1 部分:获取测量值。 如果"newval"值发生改变,则输入了测量值。MOD 运算是用来实现测量值用的环形缓冲区。 ******************************************************************) IF newval <> oldval THEN pointer := pointer MOD QUANTITY; measvals[pointer] := measval_in; pointer := pointer + 1; END_IF; oldval := newval; (***************************************************************** 第 2 部分:启动排序和计算 如果"resort"发生改变,则启动对环形缓冲区的排序和运行对测量值的计算。 结果存贮在一个新的叫"calcbuffer"的数组里。 ******************************************************************) IF resort <> oldsort THEN pointer := 0; //复位缓冲区指针 eval_instance(sortbuffer := measvals); //调用 EVALUATE END_IF; oldsort := resort; resultbuffer := eval_instance.calcbuffer; //平方值和均方根

Page 32: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

24

(***************************************************************** 第 3 部分:求代码值和准备输出 如果"newsel"发生改变,则计算用来输出的数组元素的寻址代码:屏蔽"selection" 的相应位并转换为整数。 依据"funct_sel"开关的设置,选择"squareroot"或 "square"用于输出。 ******************************************************************) IF newsel <> oldsel THEN address := WORD_TO_INT(SHR(IN := selection, N := 12) AND 16#0007); END_IF; oldsel := newsel; IF funct_sel THEN result_out := resultbuffer[address].square; ELSE result_out := resultbuffer[address].squareroot; END_IF; measval_out := measvals[address]; //Measured value display END_FUNCTION_BLOCK

3.12 建立组织块 CYCLE(Creating the CYCLE Organization

Block)

组织块 CYCLE 的任务(Tasks of the CYCLE OB)

选择 OB1 是因为它被循调用。它执行下列程序任务: 调用并提供功能块 ACQUIRE 输入和控制数据。 读入功能块 ACQUIRE 返回的数据。 输出值到显示器 在声明部分的开始处,有 20 个字节的临时数据数组“system data”。

组织块 CYCLE 的程序代码(Program Code of the CYCLE OB)

ORGANIZATION_BLOCK CYCLE (*********************************************************** CYCLE 和 OB1 一样,它被 S7 系统循环地调用。 第 1 部分:功能块调用和输入值的传送; 第 2 部分:输出值和的读入到输出开关的输出 ***********************************************************) VAR_TEMP systemdata : ARRAY[0..20] OF BYTE; //OB1 专用区 END_VAR

Page 33: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

25

BEGIN (* Part 1 : ***************************************************) ACQUIRE.ACQUIRE_DATA( measval_in := WORD_TO_INT(input), newval := "Input 0.0", //作为信号标识的输入开关 resort := Sort_switch, funct_sel := Function_switch, newsel := Coding_switch, selection := Coding); (* Part 2 : **************************************************) IF Output_switch THEN //输出已经改变 Output := ACQUIRE_DATA.result_out; //均方根或平方值 ELSE Output := ACQUIRE_DATA.measval_out; //测量值 END_IF; END_ORGANIZATION_BLOCK

数据类型转换(Data Type Conversion)

测量值作为 BYTE 数据类型应用到输入,它必须转换到 INT 类型,必须将它从 WORD 类型转换

到 INT 类型(从 BYTE 到 WORD 类型的转换是由编译器隐式地提前进行了)。另一方面,输出不

要求转换,因为在符号表中声明为 INT 类型。

3.13 测试数据(Test Data)

要求(Requirements)

要进行测试,要求一个在地址 0 处的输入模块和一个在地址 4 处的输出模块。 进行测试前,将上面组的 8 个开关置于左边("0"),下面组的 8 个开关则置于右边("1")。 重载块至 CPU,因为变量的初始值也必须测试。

测试过程(Test Procedure)

下表描述要进行的测试: 测试号 动作 结果 1 将代码设置为“111”(I0.4、I0.5 和 I0.6),并用

取码开关(I0.7)输入它。 在输出模块(低字节)上的所有输出均被

激活,且 LED 点亮。 2 设置输出开关(I0.3)到“1”,显示相应的均方根

值。 输出模块上的 LED 指示二进制数

“10000”(=16) 3 设置函数(选择)开关到“1”,显示相应的平方

值。 输出模块上的 15 个 LED 全部点亮。表

示溢出,因为 255x255 的结果高出整型

数范围。

Page 34: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

26

4a 复位输出开关(I0.3)到“0” 测量值又显示出来。所有低位输出字节

的输出 LED 全部点亮。 4b 在输入处设置值 3(二进制“11”)作为新的测量

值。 此时输出没有改变。

5a 监视测量值的读入:设置代码到“000”,并用

取码开关(I0.7)输入,以便以后能够看到输入

值。

输出模块显示 0;没有 LED 点亮。

5b 开关输入开关"I0.0"。这时读入在第 4 步设置

的值。 输出显示测量值 3,二进制“11”。

6 通过开关排序开关(I0.1),启动排序和计算。 输出又指示 0,因为排序处理将测量值

移到数组的较高位置。 7 Display the measured value after sorting: Set the

code "110" (I0.6 = 1, I0.5 = 1, I0.4 = 0 of IB0; corresponds to bit 14, bit 13 and bit 12 of IW0) and read it in by switching over the coding switch.

The output now indicates the measured value "11" again since it is the second highest value in the array.

8a Display the corresponding results as follows: Switching over the output switch (I0.3) displays the square of the measured value from the 7th step.

The output value 9 (binary "1001") is displayed.

8b Switch over the function switch (I0.2) to obtain the square root.

The output value 2 (binary "10") is displayed.

附加测试(Additional Test )

The following tables describe the switches on the input module and the examples for square and square root. These descriptions will help you to define your own tests: Input is made using switches. You can control the program with the top eight switches and you can set the measured value with the bottom 8 switches. Output is indicated by LEDs. The top group displays the higher-order output byte, the bottom group the lower-order byte.

Switch Parameter Name Description Channel 0 Enter switch Switch over to read in measured value Channel 1 Sort switch Switch over to start sorting/calculation Channel 2 Function switch Switch left ("0"): Square root,

Switch right ("1"): Square Channel 3 Output switch Switch left ("0"): Measured value,

Switch right ("1"): Result Channel 4 Code Output address bit 0 Channel 5 Code Output address bit 1 Channel 6 Code Output address bit 2 Channel 7 Code switch Switch over to enter code

The following table contains eight examples of measured values that have already been sorted. You can enter the values in any order. Set the bit combination for each value and transfer this value by

Page 35: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

27

operating the input switch. Once all values have been entered, start sorting and calculation by changing over the sort switch. You can then view the sorted values or the results (square root or square).

Measured Value Square Root Square 0000 0001 = 1 0, 0000 0001 = 1 0000 0000, 0000 0001 = 1 0000 0011 = 3 0, 0000 0010 = 2 0000 0000, 0000 1001 = 9 0000 0111 = 7 0, 0000 0011 = 3 0000 0000, 0011 0001 = 49 0000 1111 = 15 0, 0000 0100 = 4 0000 0000, 1110 0001 = 225 0001 1111 = 31 0, 0000 0110 = 6 0000 0011, 1100 0001 = 961 0011 1111 = 63 0, 0000 1000 = 8 0000 1111, 1000 0001 = 3969 0111 1111 = 127 0, 0000 1011 = 11 0011 1111, 0000 0001 = 16129 1111 1111 = 255 0, 0001 0000 = 16 0111 111, 1111 1111 = Overflow!

Page 36: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

28

4 使用 S7-SCL

4.1 启动 S7-SCL 软件

从 Windows 界面启动

一旦在编程设备或 PC 中安装了 S7-SCL 软件,就能够使用在 Windows 工具条的启动按钮(在“SIMATIC/STEP7”组)启动 S7-SCL。

从 SIMATIC 管理器启动(Starting from the SIMATIC Manager)

启动 S7-SCL 最快的方法是在 SIMATIC 管理器中将鼠标定位在一个 S7-SCL 源文件上双击它。

4.2 用户界面(User Interface)

S7-SCL 窗口有以下标准组件:

1. 标题栏(Title bar):

包含窗口标题和窗口控制钮。 2. 菜单栏(Menu bar):

显示所有打开的窗口可用的菜单项。 3. 工具条(Toolbar):

包含经常使用的命令的按钮。 4. 工作区(Working area):

包含一个或多个窗口,在其中能够编辑程序文本或读到编译信息或调试数据。 5. 状态条(Status bar):

Page 37: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

29

显示关于当前项目的状态和其他信息。

4.3 定制用户界面(Customizing the User Interface)

定制编辑器(Customizing the Editor)

要设置编辑器,选择菜单命令选项(Options) > 定制(Customize),在“定制(Customize)”对话框中点

击“编辑器(Editor)”标签。此卡片内,能够进行下列设定: 在“编辑”卡片中的或选项 说明 字体 指定全部源文本的字体 制表长度 指定制表符的列数 显示行数 从起始行开始显示的行数 编译前保存 编译前,询问是否要保存源文件 保存前的确认 询问保存前是否确认

更改式样和颜色(Adapting the Style and Color)

要更改各种语言符号的字体和颜色,选择菜单命令,在“定制(Customize)”对话框中点击“格式

(Format)”标签。在这,能够进行如下设置: 在“格式(Format)”卡片中的选项 说明 用大写字母的关键字

当编写程序时,将 S7-SCL 关键字,如 FOR、WHILE、

FUNCTION_BLOCK、VAR 或 VAR_END 格式化为大写字符。 缩排关键字 编写程序时,在声明部分和控制语句 IF、CASE、WHILE 和

REPEAT 中进行缩排。 自动缩排 结束一行后,新行自动用前一行同样数量(空格)缩排。此设置

仅用于新行。 式样/颜色 能够选择各种语言元素的字体和颜色。 当在“格式(Format)”卡片中选择了“使用以下格式(Use following formats)”选项时,此卡片中的设置

才有效。

工具条、断点条、状态条(Toolbar, Breakpoint Bar, Status Bar)

能够分别打开和关闭工具条、断点条和状态条的显示。简单选中和去选在视图(View)菜单中专有

的命令即可。此功能激活时,在命令项前出现一个检查标志。

“错误和警告”窗口("Errors and warnings" window)

编译源文件时,在“错误和警告”窗口列出了出错和警告信息。使用菜单命令视图(View) > 错误和

警告(Errors and warnings)能够激活和禁止它。

Page 38: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

30

4.4 创建和管理 S7-SCL 源文件

4.4.1 创建一个新的 S7-SCL 源文件(Creating a New S7-SCL Source

File)

在能够编写 S7-SCL 程序前,首先必须建立一个新的 S7-SCL 源文件。建立源文件是在 S7 程序的

源文件夹里进行的。

在 SIMATIC 管理器中 S7 程序的结构(Structure of an S7 Program in the SIMATIC Manager)

在 S7-SCL 中建立的源文件集成到了 S7 程序结构中,如下:

步骤大致如下(Follow the steps outlined below):

1. 用下列方法打开"新建(New)"对话框: 在工具条上点击"新建(New)"按钮或 在选择菜单命令文件(File) > 新建(New)。

2. 在“新建(New)”对话框中,选择 一个项目(A project) 对象类型设置为"S7-SCL 源文件"以及 在 S7 程序的源文件夹中

3. 在文本框中输入源文件对象的名称[文件名]。名字最多 24 个字符长。 4. “确定”。 源文件按照所选名称建立起来了,并显示在窗口中,能够用它继续工作。 注(Note) 也能够用 SIMATIC 管理器通过选择源文件夹和菜单命令插入(Insert) > S7 软件(S7 Software) > SCL 源文件(SCL Source File)建立 S7-SCL 源文件。

4.4.2 打开一个 S7-SCL 源文件(Opening an S7-SCL Source File)

打开一个 S7-SCL 源文件,以便编译或编辑它。 大致步骤如下(Follow the steps outlined below): 1. 如下方法打开"打开(Open)"对话框:

在工具条上点击"打开(Open)"或

Page 39: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

31

选择菜单命令文件(File) > 打开(Open)。 2. 对话框打开后,选择以下内容:

所要求的项目 所要求的 S7 程序 相应的源文件夹

3. 选择 S7-SCL 源文件。 4. 点击"确认"。 注(Note) 也能够在 SIMATIC 管理器中通过双击其图标或在对象已经选中时用菜单命令编辑(Edit) > 打开

对象(Open Object)来打开一个 S7-SCL 源文件。

4.4.3 关闭一个 S7-SCL 源文件(Closing an S7-SCL Source File)

大致步骤如下(Follow the steps outlined below): 选择菜单文件(File) > 关闭(Close)。 在窗口的标题栏上点击“关闭”符号[x]。 注(Note) 如果你改动了源文件,会询问你是否在关闭文件前保存,如果不保存,改动内容会丢失。

4.4.4 打开块(Opening Blocks)

在 S7-SCL 应用程序中不可能打开块,总是打开相应的源文件。然而,用 S7-SCL 建立的块能够

用LAD/STL/FBD编辑器打开和显示,并用STL编程语言编辑。不要用STL形式对块作任何修改,

理由如下: 显示的 MC7 命令不一定表示有效的 STL 块。 改动用 STL 编译器正确的程序要求对 STL 和 SCL 都很精通。 用 STL 编译的块中有 STL 语言元素,不再是 S7-SCL 标识符。 S7-SCL 源文件和 MC7 代码不再一致。 STEP 7 的在线帮助中有更多有用信息。 注(Note) 在 S7-SCL 源文件中改动来维护 CPU 程序更容易,重新编译即可。

4.4.5 指定对象属性(Specifying Object Properties)

通过指定块属性的赋值来指定对象属性。能够在“属性(Properties)”对话框中选择 S7-SCL 源文件的

属性(如:作者)。

大致步骤如下(Follow the steps outlined below):

1. 选择菜单命令文件(File) > 属性(Properties)。

Page 40: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

32

2. 在“属性(Properties)”对话框中输入要求的选项。 3. "确认"。

4.4.6 用标准编辑器创建 SCL 源文件(Creating SCL Source Files with

a Standard Editor)

也能够用标准 ASCII 编辑器来编辑 S7-SCL 源文件。如果选用此方法,不能使用 S7-SCL 的强大

编辑功能和集成的在线帮助。 一旦建立和保存源文件,必须用 SIMATIC 管理器导入到 S7 程序的源文件夹中(参见 STEP 7 资料)。接着就能够在 S7-SCL 中打开源文件并继续工作或编译。

4.4.7 块保护(Block Protection)

在源程序中编者按制块时,能够通过指定 KNOW_HOW_PROTECT 属性来保护块.

块保护的结果(Result of Block Protection)

用增量 STL 编辑器打开编译好的块时,块的语句是隐藏的。 在块的声明部分,只有显示 VAR_IN, VAR_OUT 和 VAR_IN_OUT 类型的变量,而在声明域

VAR 和 VAR_TEMP 保持隐藏。

使用块保护的规则(Rules for Using Block Protection)

关键字是 KNOW_HOW_PROTECT。在的有块属性之前输入。 用此方法保护 OBs, FBs, FCs, 和 DBs。

4.5 S7-SCL 源文件指南

4.5.1S7-SCL 源文件通用规则(General Rules for S7-SCL Source Files)

S7-SCL 源文件必须遵照以下规则: 能够在 S7-SCL 源文件中编辑任意数量的逻辑块(FB, FC, OB)、数据块(DB)、和用户定义数据

类型(UDT)。 每个块均有特有的结构。 每个语句和变量声明均用分号(;)结束。 大小写无区别。 注释仅为程序的说明资料,不影响程序的运行。 当调用功能块时,自动建立实例数据块,无需编辑。 DB0 有特殊用途,不能用此号码建立数据块。

Page 41: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

33

4.5.2 块的次序(Order of the Blocks)

建立 S7-SCL 源文件时,记住以下规则左右着块的次序: 被调用的块必须在调用它的块之前出现。 用户定义数据类型(UDT)必须在使用它的块之前出现。 指定到用户数据类型的数据块必须在相应 UDT 之后。 共享的数据块应在所有存取其的块之前。

4.5.3 使用符号地址(Using Symbolic Addresses)

在一个 S7-SCL 程序中,使用地址工作,如 I/O 信号、内存位、计数器、定时器和块等。能够使

用绝对地址方式 (如 I1.1, M2.0, FB11)在程序中对这些元素寻址,然而如果使用符号 (如Motor_ON)S7-SCL 源文件更易读。使用符号能够在用户程序中存取地址。

本地的和共享的符号(Local and Shared Symbols)

对 CPU 内存区域和块标识符采用共享符号。它们为整个应用程序扎接受,且必须是唯一的标识

符。能够用 STEP 7 建立符号表。 本地符号只在定义它们的块内可见,能够为变量、参数、常量和跳转达标号指定名字,且能够在

不同的块为不同的用途用同一个名字。 注(Note) 确信符号名是唯一的且不与任何关键字一样。

4.6 编辑 S7-SCL 源文件

4.6.1 取消最后的编辑操作(Undoing the Last Editing Action)

用菜单命令 Edit > Undo,能够 撤消一个或几个步骤。 不能够撤消所有的活动,例如,菜单命令不能被撤消。

4.6.2 恢复编辑操作(Redoing an Editing Action)

取消一个或几个操作后,能够用菜单命令编辑(Edit) > 重做(Redo)恢复操作步骤。

4.6.3 查找和替换文本对象(Finding and Replacing Text Objects)

如果要编辑或修改一个 S7-SCL 源文件,能够通过查找和替换文本对象来节省宝贵的时间。例如,

能够查找关键字、绝对标识符、符号标识符等。 大致步骤如下(Follow the steps outlined below):

Page 42: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

34

1. 选择菜单命令编辑(Edit) > 查找和替换(Find and Replace).... 2. 在“查找和替换"Find and Replace"对话框中输入内容。 3. 如下开始搜索:

点击"查找(Find)"按钮找出文本对象并标记或 点击"替换(Replace)"或"替换所有的(Replace All)"按钮,找到文本并用输入在"用…替换

(Replace with)"文本框中的内容替换。

4.6.4 选择文本对象

按下鼠标键并拖动鼠标指针滑过要选择的文本区域能够选择文本对象。 也能够: 通过选择菜单命令编辑(Edit) > 选择所有的(Select All),来选择全部源文本。 在其上双击鼠标选择一个字。 点击行左边缘选择整个行。 用菜单命令编辑(Edit) > 取消选择(Undo Selection),能够取消选择。

4.6.5 拷贝文本对象

用此功能,能够拷贝整个程序或程序的一部分。拷贝的文本放在剪贴板上,然后通常粘贴至文本

中要求的位置。 大致步骤如下(Follow the steps outlined below): 1. 选中要拷贝的文本对象。 2. 如下拷贝对象:

在工具条上点击"拷贝(Copy)"按钮或 选择菜单命令编辑(Edit) > 拷贝(Copy)。

3. 将光标定位到要粘贴此对象的地方(同文件或不同应用程序文件中)。 4. 如下粘贴对象:

在工具条上点击"粘贴(Paste)"按钮或 选择菜单命令编辑(Edit) > 粘贴(Paste)。

4.6.6 剪切文本对象

用此功能,能够将选择的文本放置到剪贴板上。通常,此菜单命令结合菜单命令编辑(Edit) > 粘贴(Paste)一起使用,用来在当前光标位置插入剪贴板上的内容。 大致步骤如下(Follow the steps outlined below): 1. 选择要剪切的对象。 2. 如下剪切对象:

在工具条上点击"剪切(Cut)"按钮或 选择菜单命令编辑(Edit) > 剪切(Cut)。

注(Note) 如果菜单命令编辑(Edit) > 剪切(Cut)没有激活(灰色背景),选择的对象不能剪切。 使用菜单命令,能够在任何位置(同一文件或不同应用程序中)插入此文本。 剪贴板上的内容在下次使用菜单命令编辑(Edit) > 剪切(Cut)或编辑(Edit) > 拷贝(Copy)前一直保

留。

Page 43: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

35

4.6.7 删除文本对象

能够从源文本中删除选中的文本对象。 大致步骤如下(Follow the steps outlined below): 1. 选中要删除的文本。 2. 选择菜单命令编辑(Edit) > 删除(Delete)。 删除的文本没有拷入剪贴板。删除的对象能够用菜单命令编辑(Edit) > 取消(Undo)或编辑(Edit) > 恢复(Redo)来恢复。

4.6.8 将光标定位到指定行

用下列功能,能够将光标定位到特定位置。

定位到特定行号(Positioning in a specific line-number)

能够将光标定位到特定行的开始处: 1. 选择菜单命令编辑(Edit) > 到某行(Go To Line)。

"Go To"对话框打开。 2. 在“Go To”对话框中输入行号。 3. "确认"。

定位光标到下一个/前一个书签位置(Positioning on the next/previous bookmark)

如果在源文件中设置了书签,能够在他们间浏览: 选择菜单命令编辑(Edit) > 到……(Go To) >下一个书签 /前一个书签(Next Bookmark /

Previous Bookmark)。

定位光标到下一个/前一个程序代码中的出错位置(Positioning on the next/previous error in

the program code)

编辑之后,所有语法错误均通过指明行列号显示在“错误和警告(Errors and warnings)”窗口。 S7-SCL 提供在程序中各个出错位置间浏览的可能,以便所有汇集起来的错误能够依次被处理。 1. 将光标定位在源文本中的任意位置。 2. 选择菜单命令编辑(Edit) > 到……(Go To) > 下一个错误/前一个错误(Next Error / Previous

Error)。

4.6.9 按语法调整行缩进(Syntactically Correct Indenting of Lines )

下列功能允许你通过缩进行来构造 S7-SCL 源文件: 自动缩进(Automatic indent)

此功能激活后,接下来的新行则自动用与前行一样的空格缩进。 缩进关键字(Indenting keywords)

Page 44: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

36

此功能激活后,在声明部分和控制结构 IF, CASE, FOR, WHILE 和 REPEAT 均会缩进。 大致步骤如下(Follow the steps outlined below): 1. 选择选项(Options) > 自定义(Customize)菜单命令。 2. 在显示的对话框中选择"格式(Format)"卡。 3. 确信选项"使用下列格式(Use following formats)"被激活。 4. 激活选项"自动缩进(Indent automatically)"或"缩进关键字"。

4.6.10 设置字体和颜色

对各种语言元素采用不同的字体和颜色,使 S7-SCL 源文件更易读,借此体现更多专业性东西。

要格式化源文本,能够用下列功能 关键字用大写(Keywords in uppercase):

此功能激活后,定义了诸如 FOR, WHILE, FUNCTION_BLOCK, VAR 或 END_VAR 均用大定

字母书写。 定义字体和颜色(Defining the style and color):

对于各种语言元素,如运算符、注释或常量,均有各种默认的字体和颜色。能够改变这些默

认设置。 下面是默认的颜色: 颜色 语言元素 举例 蓝色 关键字 ORGANIZATION_BLOCK 预定义数据类型 INT 预定义标识符 ENO 标准函数 BOOL_TO_WORD 黄褐色 运算符 NOT 粉红色 常量 TRUE 蓝绿色 注释 //...或(*...*) 紫色 在引号里和公共符号(符号表) "Motor" 黑色 正常文本 Variables

大致步骤如下(Follow the steps outlined below): 1. 选择选项(Options) > 自定义(Customize)菜单命令。 2. 在显示的对话框选择"格式(Format)"卡。 3. 确信选项"使用下列打印格式(Use following formats for printing):"被激活。 4. 现在能够进行要求的设定。打开对话框后,点击“帮助(Help)”能够显示关于对话框的详细信

息。

4.6.11 在源文本中放置书签

现在能够在源文件中用书签快速浏览了。如,为了在源文件中各点处进行有效的修订,书签非常

有用。 能够在源文件中任意点处插入书签。如果有几个书签,就能够在各个书签间前后浏览。

Page 45: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

37

合法性(Validity)

打开源文件书签就有效。他们不存贮在源文件中。

插入书签(Inserting bookmarks)

1. 将光标定位在要标识的行处。 2. 选择菜单命令编辑(Edit) > 书签开/关(Bookmarks On/Off)。

在书签间浏览(Navigating between the bookmarks)

选择菜单命令编辑(Edit) > 到……(Go To) > 下一个书签/前一个书签(Next Bookmark / Previous Bookmark)。

删除书签(Deleting bookmarks)

选择菜单命令编辑(Edit) > 删除所有书签(Delete All Bookmarks)。 注(Note) 通过书签块使用书签才能快速进行所要求的功能。通过菜单命令视图(View) > 书签块(Bookmark Bar),来显示书签块。

4.6.12 插入模板

4.6.12.1 插入块模板

一个 S7-SCL 的编辑功能允许你插入 OB、FB、FCs、实例 DB、DB、参照 UDT 的 DB 和 UDT。使用块模板使得编程更容易且符合语法要求。 大致步骤如下(Follow the steps outlined below): 1. 将光标定位在要插入块模板处。 2. 选择菜单命令插入 Insert > 块模板 Block Template > OB/FB/FC/DB/IDB/DB Referencing

UDT/UDT。

4.6.12.2 插入块调用

S7-SCL 支持可编程块调用。能够调用以下块: 从 SIMATIC 库中调用系统功能块(SFB)和系统函数(SFC), 用 SCL 创建的功能块和函数, 用 STEP 7 其他语言创建的功能块和函数。 大致步骤如下(Follow the steps outlined below): 1. 选择插入(Insert) > 块调用(Block Call)菜单命令。 2. 在对话框中选择要求的 SFC, SFB, FC,或 FB,且"确认"。

S7-SCL 自动拷贝调用的块到 S7 程序中,且输入块调用和块的正确语法的形式参数到源文件

中。

Page 46: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

38

3. 如果调用功能块,加入关于实例 DB 的信息。 4. 输入块要求的实际参数。为助你选择实际参数,S7-SCL 以注释指示要求的数据类型。

4.6.12.3 插入注释模板

S7-SCL 的编辑功能允许插入注释模板。使用这些模板使得输入信息更容易,且符合语法要求。 大致步骤如下(Follow the steps outlined below): 1. 将光标定位在要求的块头之后。 2. 选择菜单命令插入(Insert) > 块模板(Block Template) > 注释(Comment)。

4.6.12.4 插入参数模板

一个 S7-SCL 的编辑功能允许插入参数声明的模板。使用块模板使得编程更容易且符合语法要求。

能够在功能块和函数中声明参数。 大致步骤如下(Follow the steps outlined below): 1. 将光标定位到 FB 或 FC 的声明部分。 2. 选择菜单命令插入 Insert > 块模板 Block Template > 参数 Parameter。

4.6.12.5 插入控制结构

S7-SCL 的编辑功能允许插入控制结构模板。使用块模板使得 输入信息更容易且符合语法要求。 大致步骤如下(Follow the steps outlined below): 1. 将光标定位在要插入模板处。 2. 选择菜单命令插入(Insert) > 控制结构(Control Structure) > IF/CASE/FOR/WHILE/REPEAT.

4.7 编译 S7-SCL 程序

4.7.1 关于编译应明白什么

在运行或测试程序前,必须先编译它。一旦你启动编译,编译器则自动启动。编译器有下列特性: 能够在汇编集中编译全部 S7-SCL 源文件,或编译在源文件中的选择的各个块。 编译器找出的所有语法错误均显示在一个窗口中。 每次调用功能块,如未已存在则建立相应的实例数据块。 也能够编译通过建立一个S7-SCL编译控制文件合在一起的几个S7-SCL源文件。 使用选项(Options) > 自定义(Customize)菜单命令,能够设置编译器的选项。 一旦正确创建用户程序且被编译,就认为程序是正确的。然而当程序在PLC中运行还是会出现问

题。使用SCL的调试功能找出此类错误。

4.7.2 自定义编译器

能够调整编译满足要求。 大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令选项(Options) > 自定义(Customize)来打开"自定义 Customize"对话框。

Page 47: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

39

2. 选择"编译器(Compiler)"卡或"建立块(Create Block)"卡。 3. 在此卡输入要求的选项。

在"编译器(Compiler)"卡中的选项(Options in the "Compiler" tab)

建立目标代码 此选项,决定是否建立可执行代码。无此选项编译只简单进行语法检查。 优化目标代码 选择此项,优化块对内存的要求和在 PLC 中的运行。让此选项永久选中是可

取的,因为优化对块性能并无不便处。 监视数组限制 如果此项,在 S7 程序运行时根据 ARRAY 数组的声明检查确定数组索引是否

在允许的范围内。如果超出允许的范围,OK 标志置为 FALSE。 建立调试信息 此选项允许在已经编译程序并下载到CPU之后,用调试器进行测试。然而,

此选项增加了程序和运行时对内存的要求。 设置 OK 标志 此选项允许在S7-SCL源文件中查询OK标志。 允许嵌套注释 如果你要在 S7-SCL 源文件中嵌套注释到另一个注释中,则选择此选项。 最大串长度 在这,能够减少串数据类型的标准长度。默认是 254 个字符。此设置影响所

有作为函数值的输出和输入/输出参数。记住设置的值必须不小于在程序中实

际串变量。

在"建立块(Create Block)"卡中的选项(Options in the "Create Block" tab)

覆盖块 如果在编译期间建立了有相同标识符的块,则覆盖在 S7 程序的“块”文件夹

中已经存在的块。 当下载块时,在目标系统中已经存在同名的块也将被覆盖。 如果不选择此项,则块在覆盖前将提示你以得到确认。

显示警告 决定是否也将警告信息显示附加在编译的错误信息之后。 警告前显示错误 在显示窗口中警告信息前有一个错误列表。 生成参考数据 如果要在建立块时自动生成参考数据,选择此项。

用菜单命令选项(Options) > 参考数据(Reference Data),也能够以后生成或修

订参考数据。 包含系统属性 如果在建立块时,要将"S7 server" 参数的系统属性放入报告中,则选择此项。

当参数与连接的构造和信息有关时则应指定此属性。它包含了连接或信息编

号。此选项增加所需的编译时间。

4.7.3 编译程序

能够测试或运行程序之前,必须先编译。为了确信编译的总是最后版本的 S7-SCL 源文件,选择

菜单命令选项(Options) > 自定义(Customize)并在"编辑(Editor)"卡选择先项"编译前保存(Save before compiling)"。菜单命令文件(File) > 编译(Compile)时隐式地保存了 S7-SCL 源文件。

大致步骤如下(Follow the steps outlined below):

1. 保存要编译的S7-SCL源文件。 2. 要建立一个可执行程序,必须在"自定义(Customize)"对话框中的"编译(Compiler)"卡中选择选

项"建立目标代码(Create object code)"。

Page 48: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

40

3. 如果需要,修改其他的编译设置。 4. 检查相应的符号表是否在同一程序文件夹中。 5. 能够用下列方式启动编译:

菜单命令文件(File) > 编译(Compile)将编译整个源文件。 菜单命令文件(File) > 编译选定的块(Compile Selected Blocks) 打开一个能够单独选择要

编译的块的对话框。 6. "错误和警告(Errors and Warnings)"对话框显示程序编译时的所有语法错误和警告。纠正编译

器报告的任何错误,然后重复上述过程。

4.7.4 建立编译控制文件

如果建立编译控制文件,能够一次编译在源文件夹中的几个 S7-SCL 源文件。在编译控制文件中,

为编译他们起见,输入 S7-SCL 源文件的名字。

大致步骤如下(Follow the steps outlined below):

1. 通过选择菜单命令文件(File) > 新建(New)打开"新建(New)"对话框。 2. 在"新建(New)"对话框中,选择

在 S7 程序中的源文件夹和 选择对象类型"S7-SCL 编译控制文件"

3. 在相应的框中键入控制文件名(取多 24 个字符)并“OK”确认。 4. 进一步的编辑在工作窗口建立和显示此文件。

在工作窗口,按所需的顺序键入要编译的S7-SCL源文件的名称并保存此文件。 5. 然后通过选择菜单命令文件(File) > 编译(Compile)启动编译。

4.7.5 编译之后调试程序

所有编译期间产生的语法错误和警告显示在"错误和警告(Errors and Warnings)"窗口。如果产生一

个错误,则不能编译块;反过来如果只是产生警告,则编译为一个可执行的块。然而可以不理它,

在 PLC 上运行将碰到问题。 要纠正错误(To correct an error): 1. 选择错误,并按 F1 键来显示对错误的描述和纠错指导。 2. 如果显示了行列号,能够在源文件中如下定位错误的位置: 在"错误与警告(Errors and Warnings)"窗口中用鼠标右健点击错误信息,然后选择显示错误

(Display Errors)命令。 双击错误信息将光标定位在所报告处(行,列)。 1. 在 S7-SCL 语言描述中找出正确的语法。 2. 在源文本中进行必要的纠正。 3. 保存源文件。 4. 再次编译编译源文件。

Page 49: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

41

4.8 保存和打印 S7-SCL 源文件

4.8.1 保存一个 S7-SCL 源文件

项目"保存(saving)"在 S7-SCL 中总是当作保存源文件。当源文件被编译时在 S7-SCL 中生成了块,

且自动存储在相应的文件夹中。任何时候,能够在一个 S7-SCL 源文件的当前状态下保存。对象

未编译时,任何错误也被保存。

大致步骤如下(Follow the steps outlined below):

选择菜单命令文件(File) > 保存(Save),或在工具条上点击"保存(Save)"按钮。 S7-SCL 源文件被订正。

如果要创建一个已激活源文件的拷贝,选择菜单命令文件(File) > 另存为(Save As)。另存为

对话框出现,能够输入备份文件的路径和名称。

4.8.2 自定义页面格式

能够按如下方式修改打印外观:

• 菜单命令文件(File) > 页面设置(Page Setup)允许选择打印的格式和方向。

• 通过菜单命令文件(File) > 页面设置(Page Setup),然后在随后的对话框中选择“页眉和页脚

(Headers and footers)”卡,能够设置文档的页眉和页脚。

• 能够用菜单命令文件(File) > 打印机设置(Printer Setup)进行更多的打印机特有的设置。

注意(Caution)

页面方向必须在“页面设置(Page setup)”对话框中设置。在“打印机设置(Printer setup)”对话

框中的设置对打印 S7-SCL 源文件没有关系。

也能够用菜单命令文件(File) > 打印预览(Print Preview)在打印前显示和检查页面。

4.8.3 打印一个 S7-SCL 源文件

在活动编辑窗口中的 S7-SCL 源文件是可打印的,换言之,要打印 S7-SCL 源文件,文件必须已

经打开。

大致步骤如下(Follow the steps outlined below):

1. 激活要打印的 S7-SCL 源文件的编辑窗口。 2. 按如下打开“打印(Print)”对话框:

• 在工具条上点击“打印”按钮或 • 选择菜单命令文件(File) > 打印(Print)。

3. 在“打印”对话框中选择要求的选项,如打印范围和份数等。 4. “确认”。

Page 50: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

42

4.8.4 设置打印选项

能够用下列功能格式化打印输出: • 块开始/结束时换页(Form feed at start/end of block)

选中此检查项时,每个块均打印在一个新的页面上,用一个换页符开始或结束。 • 打印行号(Print line numbers)

选中此检查项时,在每行的开始处打印出行号。 • 彩色打印(Color printing)

选中此检查项时,用彩色打印源文件。 • 打印字体(Font for printing)

默认的字体是 Courier New 大小为 8。此字体确保理想的打印准效果。 • 样式(Style)

能够为各种语言元素定义各种样式。能够单独选择下列元素: 语言元素 例 正常文本 关键字 ORGANIZATION_BLOCK 预定义数据类型的标识符 INT 预定义标识符 ENO 标准函数的标识符 BOOL_TO_WORD 运算符 NOT 常量 TRUE 注释部分 (* *) 行注释 //... 在引号内的共享符号(符号表) "Motor"

大致步骤如下(Follow the steps outlined below): 1. 选择选项(Options) > 自定义(Customize)菜单命令。 2. 在显示的对话框中选择"打印(Print)"卡。 3. 确信"使用下面的格式(Use following formats)"检查项已经选中。 4. 现在进行要求的设置。对话框打开后点击“帮助”按钮,能够显示更多关于此对话框的详细信

息。

4.9 下载建立好的程序

4.9.1CPU 内存复位

用清除/复位(Clear/Reset)功能,能够在线删除 CPU 中全部的用户程序。

大致步骤如下(Follow the steps outlined below):

1. 选择菜单命令 PLC > 运行模式(Operating Mode)且将 CPU 置为 STOP 模式。

2. 选择菜单命令 PLC > 清除/复位(Clear/Reset)。

3. 在随后显示的对话框中确认此动作。

Page 51: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

43

警告(Warning)

• CPU 被复位。

• 所有用户数据被删除。

• CPU 终止所有存在的连接。

• 如果插入了内存卡,在内存复位后,CPU 拷贝内存卡中的内容到内部装载内存中。

4.9.2 下载用户程序到 CPU

要求(Requirements)

当编译一个 S7-SCL 源文件时,从源文件建立了块,并将其保存在 S7 程序的“块”文件夹。 在 S7-SCL 块中在第一级调用的块自动拷贝到“块”目录,且进入装载列表中。 用 SIMATIC 管理器能够将更多的用户程序块从编程设备下载到 CPU。 能够下载块之前,编程设备和 CPU 之间的连接必须存在。在线用户程序必须用 SIMATIC 管理器

指定到 CPU 模块。

过程(Procedure)

一旦编译了源文件,就可以用下面的方法开始下载: • 文件(File) > 下载(Download)菜单命令下载在源文件中的所有块,和所有在第一级调用的块。 • 文件(File) > 编译选定的块(Compile Selected Blocks)菜单命令打开一个对话框,在此能够选择

要编译的单个的块。 块被传送到 CPU。如果块已经存在于 CPU 的 RAM 中,将会询问你是否要覆盖原有的块。 备注(Note) 建议在 STOP 模式下载用户程序,因为如果在 RUN 模式覆盖旧程序将产生错误。

4.10 测试创建的程序

4.10.1 S7-SCL 的调试功能

使用 S7-SCL 的调试功能,能够检查程序在 CPU 上的执行和定位程序中的任何错误。语法错误由

编译器指出。在程序的执行期间产生的运行时错误也被指出,这种情况是由系统中断。通过使用

调试功能,能够定位逻辑程序错误。

S7-SCL 的调试功能(S7-SCL Debugging Functions)

在 SCL 中,能够启动下列测试功能: • 监视

用此功能,能够显示在S7-SCL源文件中的变量名和当前值。测试期间,参数和变量的值按时

间顺序显示,并且不断更新。 • 用断点/单步进行调

用此功能,能够设置断点,然后用单步方式进行调试。例如,一句一句地执行程序算法,且

Page 52: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

44

能够看到变量的值是如何改变的。

注意(Caution) 当电柜有操作时运行测试,如果程序有错误,可能危及人身安全或损坏设备! 在激活调试功能前务必确信不产生危险。

调试的要求(Requirements for Debugging) • 程序应该用选项"建立目标代码(Create object code)"和"建立调试信息(Create debug info)"进行

编译。能够在"自定义(Customize)"对话框中的"编译(Compiler)"卡中选择此选项。能够用菜单

命令选项(Options) > 自定义(Customize)显示此对话框。 • 当前参考数据是可用的。

如果激活了选项"建立调试信息(Create Debug Info)",参考数据在编译期间自动产生。 • 从编程设备/PC 到 CPU 的在线连接已经存在。 • 程序已经下载到 CPU。能够用菜单命令 PLC > 下载(Download)完成此事。

4.10.2 “监视”调试功能

“监视”调试功能("Monitor" debugging function)

使用连续监视功能,能够调试一组语句。语句组也被当作监视范围。测试期间,此范围内的参数

和变量的值按先后顺序显示并来断更新。如果监视范围是每个循环均要执行的程序部分,则变量

的值通常不能在每个循环均取得。 在当前循环改变的和没有改变的值用其颜色区分。

监视范围(Monitoring range)

能够监视测试的语句范围依连接的 CPU 的执行情况而定。 编译之后,在源代码中的 S7-SCL 语句形成不同数量的机器代码语句。以至于当你选择要求监视

的范围的首条语句时,监视范围的长度是可变的,并由 S7-SCL 来决定和指明。 而且能够定义一个特定的监视范围。要这样做的话,在源文件中选择要监视的语句。

调试模式(Debugging modes)

查询此信息通常涉及到循环时间的长短。要允许改变循环时间扩展的范围,C7-SCL 提供了两种

不同模式。 操作模式 说明

测试操作 在“测试操作”模式,监视范围仅受连接的 CPU 的执行情况的限制。所有调试功

能均能够载限制地使用。因语句的情况,CPU 循环时间不可忽视地被延展。如,

在每个分支中程序循环均被询问等。 处理操作 在“处理操作”模式中,S7-SCL 调试器限制了最大监视范围,以便测试期间的循

环时间不超出处理的实际运行时间,或者微乎其微。 记住下列对“监视”功能的限制: • 高级数据类型变量不能全部显示。倘若这些变量不是基本数据类型,能够监视它们的元素。 • 不能显示类型 DATE_AND_TIME 和 STRING 的变量及类型 BLOCK_FB、BLOCK_FC、

BLOCK_DB、BLOCK_SDB、TIMER 和 COUNTER 的参数。 • 不能显示用<符号>.<绝对地址>格式存取的数据块(如data.DW4).

Page 53: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

45

4.10.3 调试

如果用断点测试,程序是一步一步地测试。能够一句一句地执行程序算法,并且能够看到变量值

如何改变。 设置断点之后,允许程序一直执行到断点处,然后在此断点处一步一步地监视。

单步功能(Single Step Functions):

当激活“用断点调试”功能时,能够使用下列功能: • 下一句

执行当前选中的语句。 • 继续

继续执行直到下一个断点处。 • 到光标处

继续执行直到在源文件中选定的光标位置。 • 执行调用

跳入或调用一个调用链中下层的 S7-SCL 块。

断点(Breakpoints)

能够在源文本的语句部分的任何位置定义断点。 当选择菜单命令调试(Debug) > 激活断点(Breakpoints Active)时,断点才被传送到可编程控制器并

被激活。 能激活的最大断点数目依 CPU 而定。

要求(Requirements):

已经打开的源文件不是先前在编辑器中修改的。

4.10.4 逐步监视

一旦将编译好的程序下载到可编程控制器中,就能够用“监视”模式测试。 备注 要调度的语句的范围(最大可监视范围)依连接的 CPU 的性能而定。 大致步骤如下: 1. 确信满足调试要求,且CPU处在RUN或RUN-P模式。 2. 选择包括要测试的程序的源文件的窗口。 3. 如果要改变默认的模式(处理操作),选择菜单命令调试(Debug) > 操作(Operation) > 测试操作

(Test Operation)。 4. 定义监视范围,有两种可能:

将光标定位在包含要测试范围的首条语句的源文本行上。现在 S7-SCL 从当前光标位置

开始选择最大监视范围。 在源文本中选择要监视的指令。

Page 54: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

46

5. 确信运行程序不会产生危险后果。 6. 选择菜单命令调试(Debug) > 监视(Monitor)。 7. 解除激活菜单命令调试(Debug) > 监视(Monitor)以中断调试。 8. 选择菜单命令调试(Debug) > 完成调试(Finish Debugging)以结束调试。

结果

监视范围被计算出来并用灰色条在窗口的左边沿处指示出来。窗口被分开,在监视范围内的变量

的名字和当前值一行一行地显示在窗口的右半部分。

调整监视功能

有以下可能要调整监视功能: • 定义要监视的块的调用环境。 • 选择菜单命令视图(View) > 符号(Symbolic Representation)打开或关闭在程序的符号表中的符

号名。 • 选择菜单命令选项(Options) > 自定义(Customize),打开 "格式(Format)"卡,并进行将显示的变

量的颜色设置。

4.10.4.1 定义块的调用环境

调用环境(Call environment)

为了特别多地定义监视范围,可以为要监视的块定义调用环境,为此指定如果下列条件满足块才

被监视: 条件 可能的选择 从特定的块调用块。 调用路径 与特定块一起调用块。 全局数据块

和/或 实例数据块

按如下处理定义调用路径(Proceed as follows to define a call path)

1. 选择菜单命令调试(Debug) > 块的调用环境(Blocks Call Environment)。 在其后的对话框中显示一个存在的块的列表。

2. 从列表中选择一个块。 3. 激活选项"激活调用路径(Activate call path)"。

现在,在窗口底部图形式显示可能的调用路径。 4. 选择想要的调用路径。

按如下定义数据块

选择菜单命令调试(Debug) > 块的调用环境(Blocks Call Environment)。 在其后的对话框中显示一个存在的块的列表。

Page 55: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

47

从列表中选择一个块。 激活选项"打开数据块(Open data blocks)"。 键入想要的数据块号。 备注 已经定义了调用环境时,为了启动监视按如下处理: 为已定义的调用环境,在块中定位要监视的插入点。 选择菜单命令调试(Debug) > 监视(Monitor)。 监视功能将启动。当所有定义的调用环境满足时块就被监视。

4.10.5 用断点逐步调试

4.10.5.1 定义断点

要设置和定义断点: 1. 打开要调试的源文件。 2. 用菜单命令视图(View) > 断点条(Breakpoint Bar)显示断点编辑的工具条。 3. 将光标定在要求的点处,选择菜单命令测试(Test) > 设置断点(Set Breakpoint)或在断点箱上点

击铵钮。用一个红色的圆圈将断点显示在窗口的左边。 4. 如有须要,选择调试(Debug) > 编辑断点(Edit Breakpoints)和定义调用环境。调用环境决定了

是否只有所定位的块在以下情况下断点才被激活: 被特定的高一级的块所调用和/或 调用时带有特定的数据块/实例数据块。

4.10.5.2 带断点启动测试

一旦下载了编译好的程序到可编程控制器并设置了断点,就能够在"带断点测试(Test with Breakpoints)"模式测试。 大致步骤如下(Follow the steps outlined below): 1. 打开要调试程序的S7-SCL源文件。 2. 确信运行程序不导致危险结果,并且 CPU 处于 RUN-P 模式。 3. 选择菜单命令调试 (Debug) > 断点激活 (Breakpoints Active)然后是调试 (Debug) > 监视

(Monitor)。 结果:窗口垂直分成两半。程序一直运行到下一断点处。达到后,CPU 变为 HOLD 且用一

个黄色箭头标志红色的断点。 4. 用下列命令之一继续:

选择菜单命令调试(Debug) > 继续(Resume)或点击"继续(Resume)"按钮。 CPU 变为 RUN 模式。当到达下一个激活的断点处,它又变为保持模式并在右边窗口显

示断点信息。 选择菜单命令调试(Debug) > 下一句(Next Statement)或点击"下一句(Next Statement)"按

钮。 CPU 变为 RUN 模式。处理完选择的语句后它又变为保持模式,并在右边窗口显示当前

处理的变量的内容。 选择菜单命令调试(Debug) > 到光标处(To Cursor)或点击"到光标处(To Cursor)"按钮。

CPU 变为 RUN 模式。当到达在程序中选定的点处时,它又变为保持模式。 如果程序停止在包含块调用的行处,选择菜单命令调试(Debug) > 执行调用(Execute call)。

Page 56: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

48

如果调用链中下一组长块是用 SCL 创建的,它将被打开并在测试模式下执行。处理完

成后,程序跳回高速用处。 如果块是用其他语言创建,将跨过调用和直达下一个选定处。

备注(Note) 菜单命令调试(Debug) > 下一句(Next Statement)或调试(Debug) > 到光标处(To Cursor)将设置和

激活隐含的断点。确信当你选择这些功能时,没有用到实际 CPU 的最大数量的激活断点。

4.10.5.3 用断点停止测试

要返回正常的程序运行: • 取消调试(Debug) > 断点激活(Breakpoints Active)菜单命令来中断调试或 • 选择菜单命令调试(Debug) > 结束调试(Finish Debugging)来建军出调试。

4.10.5.4 激活、取消和删除断点

能够单个地激活/取消和删除设置的断点: 1. 选择菜单命令调试(Debug) > 编辑断点(Edit Breakpoints)。 2. 在对话框,能够

通过检查标志,激活和取消选择的断点。 删除单个的断点。

要删除所有的断点,选择菜单命令调试(Debug) > 删除所有断点(Delete All Breakpoints)。

4.10.5.5 定义断点的调用环境

调用环境(Call environment)

通过定义调用环境指定了如果应用下列条件断点是有效的: 条件 可能的选择 从特定的高一级块调用包含断点的块。 调用路径 与一个特定的块一起调用包含断点的块。 全局数据块

和或 实例数据块

按如下处理来定义调用路径(Proceed as follows to define a call path)

1. 选择调试(Debug) > 编辑断点(Edit Breakpoints)菜单命令。 一个已经存在的断点的列表显示在其后的对话框中。

2. 从列表中选择一个断点。 3. 激活选项"激烽调用路径(Activate call path)"。

现在,可能的调用路径在窗口底部图形式显示出来。 4. 选择想要的调用路径。

Page 57: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

49

按如下处理定义一个数据块(Proceed as follows to define a data block)

1. 选择调试(Debug) > 编辑断点(Edit Breakpoints)菜单命令。 一个已经存在的断点的列表显示在其后的对话框中。

2. 从列表中选择一个断点。 3. 激活选项"打开数据块(Open data blocks)"。 4. 键入想要的数据块的编号。

4.10.5.6 用单步模式调试

大致步骤如下(Follow the steps outlined below): 1. 从要用单步模式调试的程序中,在语句前面选择一个断点。 2. 选择菜单命令调试(Debug) > 断点激活(Breakpoints Active)。 3. 运行程序直到到达此断点处。 4. 要执行下一句,选择菜单命令调试(Debug) > 下一句(Next Statement)。

如果语句是一个块调用,将执行完调用且程序跳到违犯调用之后的第一句处。 用调试(Debug) > 执行调用(Execute Call)菜单命令,将跳入块中。这儿,能够用单步模

式继续调试或设置断点。块结束时,返回块调用之后的语句。

4.10.6 使用 STEP7 测试/调试功能

4.10.6.1 建立和显示参考数据

在调试和修改用户程序时,能够建立和求解参考数据。

能够显示下列参考数据(You can display the following reference data):

• 用户程序结构 • 交叉参考列表 • 分配表 • 未用地址表 • 没有符号的地址表

建立参考数据(Creating reference data)

能够用下列方法建立参考数据: • 用菜单命令选项(Options) > 参考数据(Reference Data) > 显示(Display),能够建立或修订和显

示所要的数据。 • 通过过滤,能够限制显示的参考数据的数量的相当地提高建立和显示的速度。选择选项

(Options) > 参考数据(Reference Data) > 过滤(Filter)菜单命令。 • 使用菜单命令选项(Options) > 自定义(Customize),能够决定在编译源文件时是否自动建立参

考数据。要编译时自动地建立参考数据,键入在"建立块(Create Block)"卡中的"建立参考数据

(Create Reference Data)"旁的检查标志。

Page 58: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

50

记住自动建立参考数据将增加编译时间。

4.10.6.2 监视和修改变量

当用"监视和修改变量(monitoring and modifying variables)"功能来测试程序时,能够做下列事情: • 显示包含在用户程序中的全局数据的当前值(监视)。 • 给用户程序中使用的变量指定固定的值(修改)。 大致步骤如下(Follow the steps outlined below): • 选择菜单命令 PLC > 监视/修改变量(Monitor/Modify Variables)。 • 在显示窗口建立变量表(VAT)。要修改变量,键入新的变量值。 • 说明触发点和条件。

注意(Caution) 电柜在操作时测试运行,如果程序有错误导致危害人身安全和损坏设备!在运行调试功能

前,确信不会产生危险情况!

4.10.6.3 检查块的一致性

备注(Note) 此功能只在 STEP 7 版本 5.3 SP2 以后可用。

如果一个 S7-SCL 源文件被修改,可能被引用的任何块也应被调整,否则可能在程序中产生矛盾。

如果源文件或块的时间戳不一致,矛盾也可能产生。 STEP 7 功能"检查块的一致性(Check block consistency)"让矛盾得以暴露,极时消除错误。 程序修改之后,在项目中所有 S7-SCL 源文件之上触发一致性检查。对于不能自动消除矛盾的情

况,此功能高尔夫球你带到源文件中要改变的位置,这儿能够进行所要的改变。所有的矛盾被子

一步一步地消除。

必要条件(Prerequisites)

在设备中安装了 STEP 7 V5.3 SP2 或更高版本。 要用"Check block consistency"功能来检查的源文件必须已经用 S7-SCL V5.3 SP1 或更高版本编译

过一次。 已经在设备上安装了 S7-SCL 并执行一致性检查。

操作如下(Proceed as follows):

1. 打开 SIMATIC 管理器。 2. 选择"块(Blocks)"文件夹。 3. 选择菜单命令编辑(Edit) > 检查块的一致性(Check Block Consistency)。 4. 选择菜单命令视图(View) > 显示 SCL 源文件参照(Display SCL Source File References)。

结果(Result)

STEP 7 检查所有块和在当前文件夹中对应的源文件的时间戳和接口,并报告下列矛盾:

Page 59: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

51

• 在 S7-SCL 源文件和块之间的时间戳矛盾。 • 在不同块和接口矛盾之间的参照。 如果发现了冲突,相应的源文件将进行新的一次编译。如果源文件包含几个块的洒脱文件,此源

文件中的所有块都会重新编译。编译时采用当前的编译选项设置。 备注(Note) 更多关于此功能的信息请参考 STEP 7 帮助功能。

4.11 显示和修改 CPU 特性

4.11.1 显示和修改 CPU 操作模式

能够查询和修改 CPU 的当前运行模式。这必须连接到 CPU。 下面是大致步骤(Follow the steps outlined below): 1. 选择菜单命令 PLC > Operating Mode。 2. 在显示的对话框中,选择下列模式之一:

暖启动 冷启动 热启动 停止

警告(Warning) 当系统正在运行时改变操作模式,可能导致危及人身安全,或如果程序有错误,会损害设

备! 运行调试功能前,确信不会产生紧急情况。

4.11.2 显示和设置 CPU 的日期和时间

能够查询和修改 CPU 的当前时间。此时必须连接到 CPU。 大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令 PLC > 设置日期和时间(Set Date and Time)。 2. 在出现的对话框中,设置 CPU 的实时钟的日期和时间。 如果 CPU 没有配备实时钟,对话框中显示的时间为“00:00:00”,日期为“00.00.00”。意味着不能进

行任何改变。

4.11.3 读出 CPU 数据

能够显示下列关于 CPU 的信息: • 系统的系列、CPU 型号、序列号、和 CPU 的版本。 • 工作内存和装载内存的大小及装载内存的最大可能的构造。 • 输入和输出、定时器、计数器和内存位的数量和地址。 • CPU 能够工作的本地数据的数量。 • CPU 是否具有多处理器的能力(从 CPU)。 此时必须连接 CPU。

Page 60: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

52

大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令 PLC > 模块信息(Module Information)。 2. 在对话框中选择"常规(General)" 卡。

4.11.4 读出 CPU 诊断缓冲区

如果读出诊断缓冲区,就能够找出 STOP 模式的原因或回索诊断事件的出现。 此时必须连接 CPU。 大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令 PLC > 模块信息(Module Information)。 2. 在下来的对话框中选择"诊断缓冲区(Diagnostic Buffer)"卡。

4.11.5 显示/比较 CPU 的用户内存

用此功能,能够显示关于 CPU 的内存负载的信息,如有必要,重新组织 CPU 内存。当最大自由

连续内存区没有足够大来从编程设备下载一个新的对象时,这是必须的。 此时必须连接 CPU。 大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令 PLC > 模块信息(Module Information)。 2. 在接下来的对话框中选择"内存(Memory)"卡。

4.11.6 显示 CPU 的循环时间

下列时间是表示两个可选的界限值: 最后从 STOP 变为 RUN 之后的最长循环周期。 最后从 STOP 变为 RUN 之后的最短循环周期。 最后一次循环周期。 如果最后一次循环周期到来时,进入了看门狗时间,则可能看门狗时间计算在内,且 CPU 将变

为 STOP 模式。循环时间可能被延展,比如,在编程状态测试块时。要显示程序的循环时间,必

须连接 CPU 大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令 PLC > 模块信息(Module Information)。 2. 在接下来的对话框中选择"循环时间(Cycle Time)"卡。

4.11.7 显示 CPU 的时间系统

CPU 的时间系统包括关于内部时钟和多 CPU 之间的时间同步的信息。 此时必须连接 CPU。 大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令 PLC > 模块信息(Module Information)。 2. 在接下来的对话框中选择"时间系统(Time System)"卡。

Page 61: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

53

4.11.8 显示在 CPU 中的块

能够在线显示 CPU 可用的块。 此量必须连接 CPU。 大致步骤如下(Follow the steps outlined below): 选择菜单命令 PLC > 模块信息(Module Information)。 在接下来的对话框中选择"执行的数据/块(Performance Data/Blocks)"卡。

4.11.9 显示 CPU 有关通讯的信息(Displaying Information about

Communication with the CPU)

对每个 CPU,能够在线显示关于选择的和最大传输速率、连接和通讯负载的信息。 此时必须连接 CPU。 大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令 PLC > 模块信息(Module Information)。 2. 在接下来和对话框中选择"通讯(Communication)"卡。

4.11.10 显示 CPU 的堆栈(Displaying the Stacks of the CPU)

通过选择此卡,能够在线显示有关每个 CPU 的堆栈的信息。CPU 必须处于 STOP 模式或到达一

个断点处。 显示堆栈对帮助定位错误非常有用,比如在测试块时。如果 CPU 改变为 STOP 模式,能够显示带

当前状态位的中断点和在中断堆栈(I stack)中累加器的内容,以便找出原因(如编程错误)。 此时必须连接 CPU。 大致步骤如下(Follow the steps outlined below): 1. 选择菜单命令 PLC > 模块信息(Module Information)。 2. 在接下来的对话框中选择"堆栈(Stacks)"卡。

Page 62: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

54

5 S7-SCL 基本术语

5.1 解释句法图(Interpreting the Syntax Diagrams)

各章节中描述语言的基本工具是句法图。它提供了直观的 7-SCL 的句法结构。在题为"语言描述

(Language Description)"节包含了语言元素的句法图集。

何谓句法图(What is a Syntax Diagram)?

句法图是语言结构的图形化描述。结构由一系列的规则定义,一个规则可能基于其他一些基础规

则。

句法图从左往右看。下面是其结构规则: 序列:一串的盒子 选项:可跳过的分支 叠代:反复分支 二选一:多重二选一分支

有些什么类型的盒子(What Types of Boxes Are There)?

盒子是一个基本元素或一个由其他对象组成的元素。下图显示了描述各种盒子的符号。

灵活的格式意味着什么(What Does Flexible Format Mean)?

写源代码时,程序员不只需要句法规则,还要词法规则。 句法和词法规则在题为"语言描述(Language Description)"节详细描述。灵活的格式意味着能够插入

格式化字符如空格(Space)、制表符(Tab)和分页符,就像在条目之间的注释一样。 对于词法规则,没有灵活的格式!应用词法规则时,必须精确地采纳规范,没有例外。

Page 63: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

55

词法规则(Lexical Rule)

下例遵守上述规则: R_CONTROLLER3 _A_FIELD _100_3_3_10 The following examples are invalid for the reasons listed above: 1_1AB RR__20 *#AB

句法规则(Syntax Rule)

对于句法规则,格式是灵活的。

下例遵守上述规则: VARIABLE_1 := 100; SWITCH:=FALSE; VARIABLE_2 := 3.2;

5.2 字符集(Character Set)

字母和数字字符(Letters and Numeric Characters)

S7-SCL 使用下列 ASCII 字符集的子集中的下列字符: (大小写)字母 A 到 Z。 阿拉伯数字 0 到 9。 空白-空格本身(ASCII 码 32)和所有控制字符(ASCII 0-31),包括换行符(ASCII 13)。

其他字符(Other Characters)

在 SCL 中下面的字符有特定的意义: + - * / = < > [ ] ( ) : ; $ # " ' { } % . ,

Page 64: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

56

注意(Note) 在题为“语言描述”节中,你会发现所有允许的字符和其在 SCL 中的解释的内容。

5.3 保留字(Reserved Words)

保留字是关键字,只能用于特定用途,不区分大小写。

在 SCL 中的关键字(Keywords in SCL)

AND END_CASE ORGANIZATION_BLOCK ANY END_CONST POINTER ARRAY END_DATA_BLOCK PROGRAM AT END_FOR REAL BEGIN END_FUNCTION REPEAT BLOCK_DB END_FUNCTION_BLOCK RETURN BLOCK_FB END_IF S5TIME BLOCK_FC END_LABEL STRING BLOCK_SDB END_TYPE STRUCT BLOCK_SFB END_ORGANIZATION_BLOCK THEN BLOCK_SFC END_REPEAT TIME BOOL END_STRUCT TIMER BY END_VAR TIME_OF_DAY BYTE END_WHILE TO CASE ENO TOD CHAR EXIT TRUE CONST FALSE TYPE CONTINUE FOR VAR COUNTER FUNCTION VAR_TEMP DATA_BLOCK FUNCTION_BLOCK UNTIL DATE GOTO VAR_INPUT DATE_AND_TIME IF VAR_IN_OUT DINT INT VAR_OUTPUT DIV LABEL VOID DO MOD WHILE DT NIL WORD DWORD NOT XOR ELSE OF Names of the standard functions ELSIF OK EN OR

Page 65: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

57

5.4 标识符(Identifiers)

定义(Definition)

标识符是指定给 S7-SCL 语言对象的名字;换言之,即常量、变量或块(的名字)。 规则(Rules) 标识符最多 24 个字母或数字,可是任何顺序,但首字符必须是字母或下划线。大小定均可,标

识符对大小写不敏感(AnNa 和 AnnA 是一样的)。

例子(Examples)

下面是有效标识符的例子: X y12 Sum Temperature Name Surface Controller Table

下列名称是非法标识符:

4th //第一个字符必须是字母或下划线 Array //ARRAY 是一个关键字 S Value //不允许空格(记住空格也是一个字符)。

注意(Notes) 确认名字没有被关键字和标准标识符报使用。 选用唯一有意义源文本的名字可取,易懂。

5.5 标准标识符(Standard Identifiers)

在 SCL 中,一些标识符是预定义的,且称为标准标识符。标准标识符如下: 块标识符, 地址标识符,CPU 的内存区域的称呼, 定时器标识符和 计数器标识符。

Page 66: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

58

5.6 块标识符(Block Identifiers)

定义(Definition)

用作单独的块的称呼的标准标识符。

规则(Rules)

下表罗列了德语助记符,第二列为国际助记符。字母 x 是 0 到 65533 之间的一个数字的占位符,

其中定时器和计数器范围为 0 到 65535。 助记符 (SIMATIC)

助记符 (IEC)

标识

DBx DBx 数据块。块标识 DB0 保留为 SCL 用 FBx FBx 功能块 FCx FCx 函数 OBx OBx 组织块 SDBx SDBx 系统数据块 SFCx SFCx 系统函数 SFBx SFBx 系统功能块 Tx Tx 定时器 UDTx UDTx 用户定义数据类型 Zx Cx 计数器

在 SCL 中,有几种方法指定块标识符。能够指定一个全十进制数字作为块号。

例子(Example)

下面是有效标识符的例子: FB10 DB100 T141

Page 67: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

59

5.7 地址标识符(Address Identifiers)

定义(Definition)

在程序中任意处,能够用地址标识符称呼一个 CPU 的内存区域。 规则(Rules) 下表罗列了德语助记符,第二列为国际助记符。数据块指定时,地址标识符才有效。 助记符 (German)

助记符 (internat.)

寻址 数据类型

Ax.y Qx,y 输出(通过处理映象) 位 ABx QBx 输出(通过处理映象) 字节 ADx QDx 输出(通过处理映象) 双字 AWx QWx 输出(通过处理映象) 字 AXx.y QXx.y 输出(通过处理映象) 位 Dx.y Dx.y 数据块 位 DBx DBx 数据块 字节 DDx DDx 数据块 双字 DWx DWx 数据块 字 DXx.y DXx.y 数据块 位 Ex.y Ix.y 输入(通过处理映象) 位 EBx IBx 输入(通过处理映象) 字节 EDx IDx 输入(通过处理映象) 双字 EWx IWx 输入(通过处理映象) 字 EXx.y IXx.y 输入(通过处理映象) 位 Mx.y Mx.y 位内存 位 MBx.y MBx.y 位内存 字节 MDx MDx 位内存 双字 MWx MWx 位内存 字 MXx MXx 位内存 位 PABx PQBx 输出(直接到外设) 字节 PADx PQDx 输出(直接到外设) 双字 PAWx PQWx 输出(直接到外设) 字 PEBx PIBx 输入(直接从外设) 字节 PEDx PIDx 输入(直接从外设) 双字 PEWx PIWx 输入(直接从外设) 字

x = 0 到 65535 之间的数字(绝对地址) y = 0 到 7 之间的数字(位号)

例子(Example)

I1.0 MW10 PQW5 DB20.DW3

Page 68: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

60

5.8 定时器标识符(Timer Identifiers)

规则(Rules)

在 SCL 中,有几种方法指定定时器。能够用全数字作为计时器号码。

5.9 计数器标识符(Counter Identifiers)

规则(Rules)

在 SCL 中有几种说明计数器的方式。能够指定一个完整的十进制数字作为计数器号。

5.10 数字(Numbers)

在 SCL 中,有几种写数字的方法。下面是关于所有数字的规则: 一个数字可以有一个可选的符号、一个小数点、和一个指数。 一个数字不能包含逗号和空格。 为提高可读性。能够用下划线作为分隔符。 数字能够前置正号或负号,没有前置符号,则当作正数。 数字不能超过或低于最大值或最小值。

整数(Integers)

整数既无小数点,也无指数。意思是整数是前置正或负号的简单的数字串列。SCL 中提供两种整

数类型:INT 和 DINT,各有不同的数值范围。 合法整数的例子:

0 1 +1 -1 743 -5280 600_00 -32_211

Page 69: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

61

下列情况的整数是不正确的: 123,456 整数不能有逗号 36. 整数没有小数点 10 20 30 整数不包含空格

在 SCL 中,通过前置相应数制的关键字,能够表述不同数制的整数。关键字 2#当作二进制,8#当作八进制,16#当作十六进制。 十进制数 15 的合法整数: 2#1111 8#17 16#F

实数(Real Numbers)

实数必须包含小数点或指数(或两者都有)。小数点必须处于两串数字之间,意思是实数不能用小

数点作为开始或结束。 合法实数的例子:

0.0 1.0 -0.2 827.602 50000.0 -0.000743 12.3 -315.0066

下面的实数是错误的: 1. 小数点不能在数字的两边 1,000.0 实数不包含逗号 .3333 小数点不能在数字的两边

实数可用指数说明小数点的位置。如果没有小数点,则认为小数点在数字串的最右边。指数必须

是正的或负的整数。字母 E 表示基为 10。 3x10 幂为 10 的值在 S7-SCL 中的描述有以下方式:

3.0E+10 3.0E10 3e+10 3E10 0.3E+11 0.3e11 30.0E+9 30e9

下面的实数表示法是错误的: 3.E+10 小数点不能在数字的两边 8e2.3 指数必须是整数 .333e-3 小数点不能在数字的两边 30 E10 实数不含空格

5.11 字符串(Character Strings)

定义(Definition)

字符串即是在引号中的字符(即字母、数字和特殊字符)串列。 合法的字符串的例子: 'RED' '76181 Karlsruhe' '270-32-3456' 'DM19.95' 'The correct answer is:'

规则(Rules)

用符号$能够键入特殊格式字符,引号(')或$字符。

Page 70: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

62

源文本 编译后 'SIGNAL$'RED$'' SIGNAL'RED' '50.0$$' 50.0$ 'VALUE$P' VALUE 分页 'RUL$L' RUL 换行 'CONTROLLER$R CONTROLLER 回车 'STEP$T' STEP 制表符

要键入非打印字符,用相应的十六进制代码按型式$hh 打入,hh 当作十六进制表示的 ASCII 字符

的值。 要键入不打算打印和显示出来的注释字符串,用字符$>和$<夹住注释。

5.12 符号(Symbol)

在 S7-SCL 中,用下面的句法键入符号。当符号不遵循标识符规则时,引号才是必要的。

句法(Syntax):

5.13 注释部分(Comment Section)

规则(Rules)

注释部分能扩展到多行,用'(*'开始,用'*)'结束。 默认设置允许注释部分嵌套,然而你可以改变设置,阻止注释部分的嵌套。 注释不能放在符号名或常量的中间,但是可以放在字符串的中间。

句法(Syntax)

注释部分按下面的句法图形式表达。

例子(Example)

(* 这是一个注释部分的例子, 能够扩展到多行*)

Page 71: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

63

SWITCH := 3 ; END_FUNCTION_BLOCK

5.14 行注释(Line Comment)

规则(Rules)

行注释由“//”引出,直到行结束。 注释的长度限制在最多 254 个字符,包括引导符"//"。 注释不能放在符号名或常量的中间,但是可以放在字符串的中间。

句法(Syntax)

行注释按下面的句法图所示形式表达。

例子(Example)

VAR SWITCH : INT ; // 行注释 END_VAR 注意(Notes) 在声明部分的用"//"开始的注释包含在接口中,且能够在 LAD/STL/CSF 编辑器中显示。 可打印字符在题为“语言描述”节列出。 在行注释中,字符对"(*"和"*)"没有意义。

5.15 变量(Variables)

其值在程序执行期间能够改变的标识符叫做变量。每个变量在逻辑块或数据块中使用前必须分别

声明。变量的声明说明标识符是一个变量(远不只是常量等),通过指定数据类型定义变量类型。 变量类型以用他们的地方命名: 本地数据 共享用户数据 预定义变量(CPU 内存区域)

本地数据(Local Data)

本地数据在逻辑块(FC, FB, OB)中声明,使用范围仅在逻辑块内。尤其有以下:

Page 72: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

64

变量 说明 静态变量 静态变量是本地变量,块执行期间和之后保留其值(在块内存)。他们用来储

存功能块中的值。 临时变量 临时变量局部地属于逻辑块,不产生任何静态内存区域。对应的块在运行时

其值才保留。临时变量不能在声明他们的块之外被存取。 块参数 块参数是功能块或函数的形式参数。他们是本地变量,块被调用时用来传递

特定的实际参数。

共享的用户数据(Shared User Data)

他们是能在用户程序中任意处存取的数据或数据区域。要使用共享的用户定义变量,必须建立数

据块(DBs)。 建立数据块时,在结构部分定义其结构。代之结构部分,能够用用户定义数据类型(UDT)。指定

结构组件的顺序决定了在 DB 中的数据序列。

CPU 的内存区域(Memory Areas of a CPU)

从程序的任意处用地址标识符能够直接存取 CPU 的内存区域,而无需声明这些变量。 也记住总是能够符号化寻址这些内存区域。在 STEP 7 中,使用符号表,符号可全局赋值。

Page 73: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

65

6 S7-SCL 程序结构

6.1 在S7-SCL源文件中的块(Blocks in S7-SCL Source Files)

能够在 S7-SCL 源文件中编程一定数量的块。块是 STEP 7 程序的子单元,根据它们的功能、结构

或预期的用途进行组织。

块类型(Block Types)

下面是可用的块类型:

预制块(Ready-made Blocks)

不必每项功能自己编程,可以使用各种预制块。它们在 STEP 7 标准包的 CPU 操作系统或库(S7lib)中,如编程通讯功能。

6.2 块的次序(Order of the Blocks)

应用下列一般规则: 被调用块在调用(它的)块之前。 明确地说,即为下面的意思: 用户定义数据类型(UDTs)必须在使用它们的块之前引出。 由用户定义数据类型反映定的数据块必须跟在所引用的 UDT 之后。 被所有逻辑块存取的数据块必须在所有存取它的块之前引出。 由功能块按带出的数据块在功能块之后[译者:实例数据块]。 组织块 OB1,调用其他块,在最后出现。在 OB1 中被块调用调用的块必须在调用它块之前

引出。 在源文件中调用,但不在同一个源文件中编制的块,在文件编译到用户程序时必须已经存在。 此外,S7-SCL 源文件也能够包含针对各个要编译的块的编译器设定信息。编译器选项在块

中不受位置限制。

Page 74: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

66

6.3 块的一般结构(General Structure of a Block)

块包含下列区域: 块开始,通过关键字和一个块名或符号块名标识,例如:"ORGANIZATION_BLOCK OB1" 标

识一个组织块。 对于函数,函数类型也应指定,决定其返回值的数据类型。如果无返回值,则指定关键字VOID。

可选的块标题由关键字"TITLE ="引出。 可选的块注释,块注释能扩展到多行,每行由"//"开始。 块属性(可选)的条目 块的系统属性(可选)的条目 声明部分(依块的类型而定) 逻辑块中的语句部分或

在数据块中实际值的给定(可选) 在逻辑块:语句 块结束,用END_ORGANIZATION_BLOCK、END_FUNCTION_BLOCK或END_FUNCTION

标识。

6.4 块的开始和结束(Block Start and End)

依据块的类型,标准的块开始标识符和块名作为单个块源文本的开始,块尾标准标识符结束该块。 能见到的各种块的句法见下表: 标识符 块类型 句法 Function block (功能块)

FB FUNCTION_BLOCK fb_name . . . END_FUNCTION_BLOCK

Page 75: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

67

Function (函数)

FC FUNCTION fc_name : function type . . . END_FUNCTION

Organization block (组织块)

OB ORGANIZATION_BLOCK ob_name . . . END_ORGANIZATION_BLOCK

Data block (数据块)

DB DATA_BLOCK db_name . . . END_DATA_BLOCK

Shared data type (用户定义数据类型)

UDT TYPE udt_name . . . END_TYPE

块名(Block name)

表中,xx_name 当作块名,依据以下句法:

块号可以是 0 到 65533 之间的值,然而,数据块标识符 DB0 被保留。 也请注意,必须在 STEP 7 符号表中(为其)定义一个标识符或符号(名)。

例子(Example)

FUNCTION_BLOCK FB10 FUNCTION_BLOCK Controller Block FUNCTION_BLOCK "Controller.B1&U2"

6.5 块的属性(Attributes for Blocks)

定义(Definition)

块属性即能用的块特性,如指定块类型、版本、块保护和作者等。当你选择应用程序中的块时,

在 STEP 7 的属性页显示这些属性。 能够给下列属性赋值: 关键字/属性 描述 举例 TITLE='可打印字符' 块的标题 TITLE='SORT' VERSION :'十进制数字

串.十进制数字串' 块的版本号(0-15) 注:对于数据块,版本属性不必

在引号中指定。

VERSION : '3.1' //With a DB: VERSION : 3.1

Page 76: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

68

KNOW_HOW_PROTECT 块保护;带此选项的块编译后不

能用 STEP 7 打开。 KNOW_HOW_PROTECT

AUTHOR : 作者的名字:公司、部门名称或

其他名称(标识符和可打印的字

符)

AUTHOR : Siemens AUTHOR : 'A&D AS'

NAME : 块名(标识符和可打印的字符) NAME : PID NAME : 'A&D AS'

FAMILY : 块系列的名称:如马达。将块(归类)保存,便于快速查找(标识符和

可打印的字符)。

FAMILY : example FAMILY : 'A&D AS'

规则(Rules)

在块开始之后,用关键字直接声明块属性。 其标识符最多 8 个字符。 键入块属性句法如下:

Page 77: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

69

例子(Examples)

FUNCTION_BLOCK FB10 TITLE = 'Mean_Value' VERSION : '2.1' KNOW_HOW_PROTECT AUTHOR : AUT_1

6.6 块注释(Block Comment)

在块的头部“TITLE:”之后,能够键入关于整个块的注释。在此,使用行注释表达形式,注释可以

有多行,每行用“//”开始。 在 SIMATIC 管理器或 LAD/STL/FBD 编辑器中,块注释显示在块的属性窗中。

例子(Example)

FUNCTION_BLOCK FB15 TITLE=MY_BLOCK //这是一个块注释。 //其作为一边串的行注释键入。 //能够在 SIMATIC 管理器中显示。 AUTHOR... FAMILY...

6.7 块的系统属性(System Attributes for Blocks)

定义(Definition)

系统属性超过单个应用范围控制系统的属性。对于块的系统属性应用于全部的块。

规则(Rules)

在属开始后立即指定系统属性。 键入其的句法如下:

Page 78: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

70

例子(Examples)

FUNCTION_BLOCK FB10 {S7_m_c := 'true' ; S7_blockview := 'big'}

6.8 声明部分(Declaration Section)

定义(Definition)

声明部分用来声明本地变量、参数、常量和标号。 在逻辑块的声明部分定义的本地变量、参数、常量和标号仅只在本块中有效。 要定义所有逻辑块均难存取的数据区则在数据块中进行。 在 UDT 的声明部分,指定用户定义数据类型。

结构(Structure)

声明部分通过各自的关键字对分为几个不同的子区,每个子区包含同类型数据的声明,子区可按

任何顺序定位。下表中列出可能的子区: 数据 句法 FB FC OB DB UDT 常量 Constants

CONST 声明列表(declaration list) END_CONST

X

X

X

标号 Labels

LABEL 声明列表(declaration list) END_LABEL

X

X

X

临时变量 Temporary Variables

VAR_TEMP 声明列表(declaration list) END_VAR

X

X

X

静态变量 Static variables

VAR 声明列表(declaration list) END_VAR

X

X *)

X **)

X **)

输入参数 Input parameters

VAR_INPUT 声明列表(declaration list) END_VAR

X

X

输出参数 Output parameters

VAR_OUTPUT 声明列表(declaration list) END_VAR

X

X

输入/输出参数 In/out parameters

VAR_IN_OUT 声明列表(declaration list) END_VAR

X

X

*) 在函数中,尽管允许变量的声明在关键字对 VAR 和 END_VAR 之间,但在源文件编译时,声

明被移至临时区。 **) 在数据块和用户定义数据类型中,关键字 VAR 和 END_VAR 分别被 STRUCT 和

Page 79: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

71

END_STRUCT 替代。

6.9 参数的系统属性(System Attributes for Parameters)

定义(Definition)

系统属性超过单个应用范围控制系统的属性。他们用在诸如消息和连接的构建。参数的系统属性

仅用来构建特定的参数。可以给输入、输出和输入/输出参数指定系统属性。

规则(Rules)

直接在输入、输出或输入/输出参数的声明域内指明系统属性。 标识符最多 24 个字符。 键入的句法如下:

例子(Example)

VAR_INPUT in1 {S7_server:='alarm_archiv'; S7_a_type:='ar_send'}: DWORD ; END_VAR 在 S7-SCL 在线资料中选择“显示参考帮助(Displaying Reference Help)”可以显示系统属性的帮助。

6.10 语句部分(Statement Section)

定义(Definition)

语句部分包含逻辑块调用时将执行的语句。语句用来处理数据和地址。 数据块的语句部分包含初始化变量的语句。

规则(Rules)

如果你愿意,可用关键字 BEGIN 开始语句部分,数据块则是强制要有 BEGIN。语句部分的结束

则用块结束关键字。 每个语句用分号";"结束。 在语句部分使用的标识符必须已经声明过。 必要的话,可为每个调句键入一个标号。

Page 80: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

72

(语句)条的句法如下图:

例子(Example)

BEGIN INITIAL_VALUE :=0; FINAL_VALUE :=200; . . STORE: RESULT :=SETPOINT; . . END_FUNCTION_BLOCK

6.11 语句(Statements)

定义(Definition)

语句是用户程序的最小单位,它描述一个执行指定操作的处理器指令。 在 SCL 中使用的语句类型如下: 赋值语句用来指派表达式或变量的结果至另一个变量。 控制语句,在程序中的循环语句或语句组或分支语句。 子程序调用,用以调用函数或功能块。

规则(Rules)

句法如下:

Page 81: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

73

例子(Example)

下面的例子说明各种语句类型: // 赋值语句的例子 MEASVAL:= 0 ; // 子程序调用的例子 FB1.DB11 (TRANSFER:= 10) ; // 控制语句的例子 WHILE COUNTER < 10 DO.. . . END_WHILE;

6.12 功能块(FB)的结构(Structure of a Function Block (FB))

定义(Definition)

功能块是逻辑块,包含程序部分,并且有一个内存区域援引派给它。无论何时 FB 被调用,必须

给它指定一个实例数据块。当定义 FB 的声明部分时,就说明了实例数据块的结构。

句法(Syntax)

FB 标识符(FB Identifier)

在关键字 FUNCTION_BLOCK 或 PROGRAM 之后,键入关键字 FB,跟上一个块号或 FB 的符号

名。块号是 0 到 65533 之间的一个数值。 例子(Examples): FUNCTION_BLOCK FB10 FUNCTION_BLOCK MOTOR1

Page 82: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

74

FB 声明部分(FB Declaration Section)

FB 的声明部分用来定义块专有数据。声明部分应详细描述,记住声明部分也决定指派的实例数

据块的结构。

例子(Example)

下例显示了一个功能块的源代码。例中输入和输出参数(本案中为 V1 和 V2)赋予了初始值。 FUNCTION_BLOCK FB11 VAR_INPUT V1 : INT := 7 ; END_VAR VAR_OUTPUT V2 : REAL ; END_VAR VAR FX1, FX2, FY1, FY2 : REAL ; END_VAR BEGIN IF V1 = 7 THEN FX1 := 1.5 ; FX2 := 2.3 ; FY1 := 3.1 ; FY2 := 5.4 ; //调用函数 FC11 并用静态变量提供参数 V2 := FC11 (X1:= FX1, X2 := FX2, Y1 := FY1, Y2 := FY2) ; END_IF ; END_FUNCTION_BLOCK

6.13 函数(FC)的结构(Structure of a Function (FC))

定义(Definition)

函数是逻辑块,没有自己的内存区域,它不要求实例数据块。对比 FB(功能块),函数能返回一个

函数值(返回值)给调用它之处。函数能在表达式中像变量一样使用。类型为 VOID 的函数没有返

回值。

Page 83: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

75

句法(Syntax)

函数标识符(FC Identifier)

在关键字"FUNCTION"之后,键入关键字 FC 作为函数的标识符,后面跟一个块号或函数的符号

名。块号是 0 到 65533 之间的一个值。

例子(Example)

FUNCTION FC17 : REAL FUNCTION FC17 : VOID

数据类型说明(Data Type Specification)

数据类型说明返回值的数据类型,可以是除STRUCT(结构)和ARRAY(数组)之外的所有数据类型。

如果不要求返回值(使用 VOID 类型)则无数据类型须指明。

FC 的声明部分(FC Declaration Section)

函数的声明部分用来声明本地数据(临时变量、输入参数、输出参数、输入/输出参数、常量、标

号)。

FC 的代码部分(FC Code Section)

必须在代码部分把函数结果赋予函数名。VOID 类型的函数则不必赋值。下面是在一个名为 FC31的函数中的有效的语句例子。 FC31:= VALUE;

例子(Example)

FUNCTION FC11: REAL VAR_INPUT x1: REAL ;

Page 84: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

76

x2: REAL ; x3: REAL ; x4: REAL ; END_VAR VAR_OUTPUT Q2: REAL ; END_VAR BEGIN // 从函数返回值 FC11:= SQRT( (x2 - x1)**2 + (x4 - x3) **2 ) ; Q2:= x1 ; END_FUNCTION

6.14 组织块(OB)的结构(tructure of an Organization Block

(OB))

定义(Definition)

组织块如同 FB 和 FC,是用户程序的一部分,被循环地调用或通过操作系统响应某些事件。它提

供了操作系统和用户程序间的接口。

句法(Syntax)

OB 标识符(OB Identifier)

在关键字"ORGANIZATION_BLOCK"之后,键入关键字“OB”作为 OB 的标识符,后面跟一个块号

或 OB 的符号名。块号是 1 到 65533 之间的一个数字。 例子(Examples) ORGANIZATION_BLOCK OB1 ORGANIZATION_BLOCK ALARM

OB 的声明部分(OB Declaration Section)

OB的声明部分用来对本地数据(如临时变量、常量、标号)的声明。

Page 85: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

77

为运行,每个 OB 的声明部分均为操作系统要求 20 个字节的本地数据,为此必须声明一个带标识

符的数组。如果是插入 OB 块模板,这些声明已经包含了。

例子(Example)

ORGANIZATION_BLOCK OB1 VAR_TEMP HEADER : ARRAY [1..20] OF BYTE ; //20 个字节的操作系统保留空间 END_VAR BEGIN FB17.DB10 (V1 := 7) ; END_ORGANIZATION_BLOCK

6.15 用户定义数据类型的结构(Structure of a User-defined

Data Type)

用户定义数据类型(UDTs)是你自己创建的特殊数据结构。因用户数据类型指派了名字,他们可以

用很多次。一旦他们被定义,就可在 CPU 程序的任意点使用;换句话说,他们是共享数据类型,

而且他们能够用在: 在块中用同样的方法,作为基本的或复杂的数据类型,或 作为模板建立同样数据结构的数据块。 当使用用户定义数据类型时,记住在 S7-SCL 源文件中他们应在使用他们的块之前。

UDT 标识符(UDT Identifier)

在关键字 TYPE 后,键入关键字 UDT,后面跟一个数字或简明的 UDT 符号名。块号是 0 到 65533之间的一个数值。

例子(Examples:)

TYPE UDT10 TYPE SUPPLYBLOCK

指定数据类型(Specifying the Data Type)

数据类型总是用 STRUCT 数据类型清单来说明。数据类型 UDT 能够用在逻辑块或数据块或的声

明子区或指派数据块。

Page 86: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

78

UDT 定义的例子(Example of a UDT Definition)

TYPE MEASVALUES STRUCT // 带符号标识答的 UDT 定义 BIPOL_1 : INT := 5; BIPOL_2 : WORD := W#16#FFAA ; BIPOL_3 : BYTE := B#16#F1 ; BIPOL_4 : WORD := B#(25,25) ; MEASURE : STRUCT BIPOLAR_10V : REAL ; UNIPOLAR_4_20MA : REAL ; END_STRUCT ; END_STRUCT ; END_TYPE // 在 FB 中 UDT 的使用 FUNCTION_BLOCK FB10 VAR MEAS_RANGE : MEASVALUES; END_VAR BEGIN // . . . MEAS_RANGE.BIPOL_1 := -4 ; MMEAS_RANGE.MEASURE.UNIPOLAR_4_20MA := 2.7 ; // . . . END_FUNCTION_BLOCK

6.16 在 S7-SCL 源文件中的编译选项(Compiler Options in

S7-SCL Source Files)

定义(Definition)

在 S7-SCL 源文件中可以包含编译器设置的信息在各个要编译的块中。 编译器选项控制编译器对各个块或整个源文件的编译,而不管其在“编译器设置[Compiler (settings)]”表中的设定。 编译器选项能够用在 S7-SCL 源文件或编译控制文件中。

合法性(Validity)

选项的定义只提供给源文件的编译。编译器选项的合法性从指明其开始,到源文件或编译控制文

件的结束。如果用了几次相同的编译器选项,则按先后顺序使用最后一个(的设定)。 如果编译器选项为一个块而定义,其优先权比在“编译器设置[Compiler (settings)]”表中的设定要高。

Page 87: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

79

然而在设置表中的设定保持全局有效。

规则(Rules)

下面的规则用在了编译器选项上: 选项在源文件中的位置不受限制。 每个项处于一行中。 其所有(内容)无固定框架。

可用的选项(Available options)

表中列出了可用的选项: 选项 值 含义

[Scl_]ResetOptions 无键入值。 复位到默认的编译器设定(对话框

中的设定) [Scl_]OverwriteBlocks 'y[es]' or 'n[o]' 覆盖块 [Scl_]GenerateReferenceData 'y[es]' or 'n[o]' 生产参考数据

[Scl_]S7ServerActive 'y[es]' or 'n[o]' 考虑"S7_server"的服务属性 [Scl_]CreateObjectCode 'y[es]' or 'n[o]' 建立目标块 [Scl_]OptimizeObjectCode 'y[es]' or 'n[o]' 优化目标块 [Scl_]MonitorArrayLimits 'y[es]' or 'n[o]' 监视数组界限 [Scl_]CreateDebugInfo 'y[es]' or 'n[o]' 建立调试信息 [Scl_]SetOKFlag 'y[es]' or 'n[o]' 设置 OK 标志 [Scl_]SetMaximumStringLength '1 .. 254' 最大的字符串长度

例子(Example)

{SCL_OverwriteBlocks := 'y' ; SCL_CreateDebugInfo := 'y'} {SetOKFlag := 'y' ; OptimizeObjectCode := 'y'}

附:数据块(DB)的结构(Structure of a Data Block (DB))

定义(Definition)

在一个程序中,可以被所有块存取的特定用户数据包含在数据块.每个 FB、FC 或 OB 均能读写这些

数据块。 有两种数据块类型: 数据块(Data blocks) 能被所有 S7 程序的逻辑块存取。每个 FB、FC 或 OB 读或写包含在这些数据块里的数据。 指派给一个 FB 的数据块(实例数据块)(Data blocks assigned to an FB (instance DB)) 实例数据块是指派给特定功能块的数据块。它们功能块的指定的本地数据。当 FB 被用户程序调

用时,这些数据块被 S7-SCL 编译器自动建立。

Page 88: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

80

句法(Syntax)

DB 标识符(DB Identifier)

在关键字"DATA_BLOCK"之后,键入关键字 DB 作为数据块的标识符,后面跟一个块号或数据块

的符号名,块号是 1 到 65533 中间的值。

例子(Examples:)

DATA_BLOCK DB20 DATA_BLOCK MEASRANGE

数据块声明部分(DB Declaration Section)

在 DB 的声明部分定义 DB 的数据结构。有两种方法做这件事,如下: 通过指派到用户定义数据类型(By assigning a user-defined data type) 在此,指派一个先在程序中定义的用户数据类型的标识符,然后数据块取得该UDT的结构。你可

以在数据块的赋值部分指派变量的初始值。 通过定义 STRUCT(结构)数据类型(By defining a STRUCT data type)

在 STRUCT 数据类型的说明中,指定了存储在 DB 中的每个变量的数据类型,可能也给出了初始

值。

例子(Example)

DATA_BLOCK DB20 STRUCT // 声明部分 VALUE:ARRAY [1..100] OF INT; END_STRUCT BEGIN // 赋值部分开始

Page 89: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

81

: END_DATA_BLOCK // 数据块结束

数据块赋值部分(DB Assignment Section)

在赋值部分,能够改写在声明部分声明的数据,以便指定实际应用所需的特定值。 赋值部分用关键字 BEGIN 开始,然后包含一系列赋值语句。

当指派初始值(初始化)时, 键入属性和注释采用 STL 句法。关于如何写常量、属性和注释,使

用 STL 在线帮助或参考 STEP 7 的资料。

例子(Example)

// 带指定 STRUCT 数据类型的数据块 DATA_BLOCK DB10 STRUCT // 带初始值声明的数据声明 VALUE : ARRAY [1..100] OF INT := 100 (1) ; SWITCH : BOOL := TRUE ; S_WORD : WORD := W#16#FFAA ; S_BYTE : BYTE := B#16#FF ; S_TIME : S5TIME := S5T#1h30m10s ; END_STRUCT BEGIN // 赋值部分 // 为特定的数组元素赋值 VALUE [1] := 5; VALUE [5] := -1; END_DATA_BLOCK // 带用户定义数据类型指定的数据块 DATA_BLOCK DB11 UDT 51 BEGIN END_DATA_BLOCK

Page 90: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

82

7 数据类型

7.1 在 SCL 中数据类型概述(Overview of the Data Types in

SCL)

数据类型是其在单个单元中值的范围和操作的组合。 数据类型决定了: 数据元素的型式和解释, 数据元素允许的(值的)范围, 在数据类型的地址上能够执行的允许的操作, 数据类型的常量的表达式。

基本数据类型(Elementary Data Types)

基本数据类型定义了不可细分的数据元素的结构。他们与 DIN EN 1131-3 标准的定义相一致。基

本数据类型用固定的长度描述一个内存区域,当作位、整数、实数、时间周期、日期时间和字符

的值用。下面是在 SCL 中预定义的数据类型: 分类 数据类型 说明 位类数据类型 BOOL

BYTE WORD DWORD

这类数据元素占用 1 位、8 位、16 位或 32 位。

字符类数据类型 CHAR 这类数据元素恰好是 ASCII 字符集中的一个字符。 数字类数据类型 INT

DINT REAL

这类数据元素用于处理数值。

时间类数据类型 TIME DATE TIME_OF_DAY S5TIME

这类数据元素描述在 STEP 7 中的各种时间和日期值。

复杂数据类型(Complex Data Types)

S7-SCL 支持下列复杂数据类型: 数据类型 说明 DATE_AND_TIME DT

定义了一个 64 位(8 个字节)的区域。这种数据类型存储日期和时间(采用

BCD 码),在 S7-SCL 中是预定义数据类型。 STRING 定义了一个最多 254 个(数据类型为 CHAR)字符的字符串。 ARRAY 定义了一个包含一种数据类型(基本的或复杂的)的元素的阵列。 STRUCT 定义了一个任意类型组合的数据类型的组。其能够是一个结构的阵列,

或是包含结构和数组的结构。

Page 91: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

83

用户定义数据类型(User-Defined Data Types)

在数据类型声明中,能够建立自己的用户定义数据类型。每个指定唯一的名字,可以使用任意次

数。一旦定义好,用户定义数据类型就能产生许多同样结构的数据块。

参数类型(Parameter Types)

参数类型是指定能够当作形式参数使用的定时器、计数器和块的数据类型. 数据类型 Data Type

含义 Explanation

TIMER 用来声明作为参数的定时器函数。 COUNTER 用来声明作为参数的计数器函数。 BLOCK_xx 用来声明作为参数的 FCs(函数)、FBs(功能块)、DBs(数据块)和 SDB(系

统数据块)函数。 ANY 用来许可 ANY 数据类型的地址作为参数。 POINTER 用来许可一个内存区域作为参数。

ANY 数据类型(ANY Data Type)

在 SCL 中,能够使用 ANY 数据类型的变量作为块的形式参数。也能够建立这种类型的临时变量,

在赋值语句中使用他们。

7.2 基本数据类型

7.2.1 位类数据类型(Bit Data Types)

这类数据类型是位的组合,可能是 1 位(BOOL 类型)、8 位、16 位或 32 位。不能指定这些数据类

型的数值范围:byte(字节)、word(字)和 double word(双字)。这些仅能够用作布尔表达式。 类型 关键字 位宽 位置对齐 值范围 位 BOOL 1 bit Begins at the least significant bit

in the byte 0, 1 or FALSE, TRUE

字节 BYTE 8 bits Begins at the least significant byte in the word.

-

字 WORD 16 bits Begins at a WORD boundary. - 双字 DWORD 32 bits Begins at a WORD boundary. -

7.2.2 字符类数据类型(Character Types)

这类型的数据元素占用恰好 ASCII 字符集中的一个字符。 类型 关键字 位宽 值范围 单个字符 CHAR 8 扩展 ASCII 字符集

Page 92: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

84

7.2.3 数字类数据类型(Numeric Data Types)

这种类型用于处理数值(如计算算术表达式)。 类型 关键字 位宽 位置对齐 值范围 整数

INT 16 从字的边界开始 -32_768 to 32_767

双精度整数

DINT 32 从字的边界开始 -2_147_483_648 to 2_147_483_647

浮点数 (IEEE 浮点数)

REAL 32 从字的边界开始 -3.402822E+38 to -1.175495E-38 +/- 0 1.175495E-38 to 3.402822E+38

7.2.4 时间类数据类型(Time Types)

这种类型的数据在 STEP 7 中表示各种时间和日期的值(例如:设置日期或键入一个时间的时间值)。 类型 关键字 位宽 位置对齐 值范围 S5 time S5TIME

S5T 16 从字边界开始 T#0H_0M_0S_10MS to

T#2H_46M_30S_0MS Time period: IEC time in steps of 1 ms.

TIME T

32 从字边界开始 -T#24D_20H_31M_23S_647MS to T#24D_20H_31M_23S_647MS

Date IEC data in steps of 1 day

DATE D

16 从字边界开始 D#1990-01-01 to D#2168-12-31

Time of day time in steps of 1 ms.

TIME_OF_DAY TOD

32 从字边界开始 TOD#0:0:0.0 to TOD#23:59:59.999

如果设置值高于范围的上限,则使用上限值。 对于数据类型 S5TIME 的变量,分辨率受到限制,就是说只有 0.01s、0.1s、1s、10s 的时基可用。

编译器相应取整。如果设置值高于范围的上限,则使用上限值。

7.3 复杂数据类型

7.3.1 日期时间数据类型(DATE_AND_TIME Data Type)

定义(Definition)

这种数据类型定义一个 64 位(8 个字节)的区域,指明日期和时间。数据区域存贮下列信息(用 BCD码): 年、月、日、时、分、秒、毫秒。

Page 93: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

85

句法(Syntax)

说明日期和时间的准确句法在“声明常量”中描述。

值范围(Value Range)

类型 关键字 位宽 对齐 值的范围 日期时间 DATE_AND_TIME

DT 64 开始和结束

于字边界 DT#1990-01-01-0:0:0.0 到 DT#2089-12-31-23:59:59.999

用 BCD 格式存贮的日期时间数据类型: 字节 内容 范围 0 年份 1990 到 2089 1 月份 01 到 12 2 日期 1 到 31 3 时 0 到 23 4 分 0 到 59 5 秒 0 到 59 6 2 MSD (most

significant decade) of ms

00 到 99

7 (4 MSB) LSD (least significant decade) of ms

0 到 9

7 (4 LSB) 星期 1 到 7 (1 = 星期日)

例子(Example)

对日期时间 20/Oct./1995 12:20:30,10 毫秒的有效定义如下: DATE_AND_TIME#1995-10-20-12:20:30.10 DT#1995-10-20-12:20:30.10 注(Note) 能够用在 STEP 7 库中的标准函数存取特定的部件 DATE 或 TIME。

Page 94: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

86

7.3.2 字符串数据类型(STRING Data Type)

定义(Definition)

串数据类型定义一个最长 254 个字符的字符串。标准的区域保留有 256 个字符的字符串。内存区

域存贮 254 个字符和 2 个头字节。 通过定义保存在串中的字符的最大数量,能够减少字符串要求的内存。一个空串,即没有数据的

串是最小的值。

句法(Syntax)

简单表达式当作在串中的字符的最大数量。串中允许所有ASCII代码的字符,也能包含特殊字符,

如控制字符和非打印字符。能够用句法$hh 键入,hh 当作用十六进制表示和 ASCII 字符的值(如:

‘$0D$0AText’)。 声明字符串内存空间时,能够定义能存贮在串中的最大字符数。如果不指定,则建立长度为 254的串。 例子(Example) VAR Text1 : String [123]; Text2 : String; END_VAR 在变量"Text1"声明中的常量"123"当作在串中的最大字符数。对于变量"Text2",保留 254 字符的

长度。 备注(Note) 对于输出和输入/输出参数,及函数返回值,能够减少为串保留的默认长度(254),将 CPU 资源

做更好的用处。要减少默认的长度,选择菜单命令项项(Options) > 自定义(Customize),及 在“编译器”卡上的“最大串长度(Maximum String Length)”框中键入要求的长度值。记得此值影响

在源文件中的所有串变量。而且此值不能少于在程序中串变量的实际使用值。

初始化字符串(Initializing Character Strings)

串变量,同其他变量一样,能够用常量字符串在功能块的参数声明中初始化。初始化函数的参数

则不可能。 如果初始的串短于声明的最大长度,多余字符不被初始化。当在程序中处理变量时,当前占用的

字符位置才作考虑。 例子(Example) x : STRING[7]:='Address'; 如果要求串类型临时变量,例如缓冲结果,在他们首次使用之前,总必须在变量声明或赋值语句

Page 95: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

87

中用串常量初始化。 备注(Note 如果标准库中函数返回一个字符串类型的值,并将此值赋值给一个临时变量,则变量必须初始

化。 例子(Example) FUNCTION Test : STRING[45] VAR_TEMP x : STRING[45]; END_VAR x := 'a'; x := concat (in1 := x, in2 := x); Test := x; END_FUNCTION 没有初始化(语句)x := 'a';,函数返回错误结果。

位置对齐(Alignment)

串类型变量开始和结束于 P 字边界。

7.3.3 数组数据类型(ARRAY Data Type)

定义(Definition)

数组有一特定数量的同一数据类型的组成部分。下面是在 SCL 中可能的数据组类型: 一维数组类型。是一个按升序排列的数据元素表。 二维数组类型。这是一个且有行列的数据表,第一维引用行号,第二维引用列号。 多维数组类型。二维数组类型的扩展,最大维数为 6。

句法(Syntax)

索引说明(Index Specification)

数组维数的描述如下:

Page 96: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

88

每维最小和最大可能索引值(索引范围)。 索引能够是任意整数值(-32768 到 32767)。

界限用两个点分开。各索引范围必须作逗号分开。 全部索引说明封闭在方括号内。

数据类型说明(Data Type Specification)

用数据类型说明,声明元素的数据类型。所有的数据类型均可用于声明。例如,数组的数据类型

也能用于结构类型的声明。参数类型则不能用作数组的元素类型。

例子(Example)

VAR CONTROLLER1 : ARRAY[1..3,1..4] OF INT:= -54, 736, -83, 77, -1289, 10362, 385, 2, 60, -37, -7, 103 ; CONTROLLER2 : ARRAY[1..10] OF REAL ; END_VAR

位置对齐(Alignment)

数组类型的变量一行一行地建立。类型为 BOOL, BYTE 或 CHAR 的变量的每维结束于字节边界,

其他则在字边界。

7.3.4 结构数据类型(STRUCT Data Type)

定义(Definition)

结构数据类型描述一个有固定数量可以是不同数据类型的组成部分的区域。数据元素能够用组件

声明方法在关键字 STRUCT 之后立即说明。 结构数据类型的主要特性是数据元素可是复杂类型,意味着结构数据类型允许嵌套。

句法(Syntax)

Page 97: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

89

组件声明(Component Declaration)

组件声明是各种结构数据类型的组件表,它包含下列内容: 1 到 n 个指定数据类型的标识符,和 一个可选取的初始值说明。

标识符是结构元素的名字,其后应提供数据类型的说明。 除参数类型外的所有数据类型均允许作为数据类型说明。 在数据类型说明使用初始值后,对特定结构元素可指定一个初始值。

例子(Example)

VAR MOTOR : STRUCT DATA : STRUCT LOADCURR : REAL ; VOLTAGE : INT := 5 ; END_STRUCT ; END_STRUCT ; END_VAR

位置对齐(Alignment)

结构类型变量开始和结束于字边界。 注意(Caution) 如果你定义一个结构没有在字边界结束,S7-SCL 将自动填充缺少的字节,调整结构的大小。 当数据类型用单数位长度进行存取时,调整结构大小会引起冲突。

7.4 用户定义数据类型(UDT)(User-Defined Data Types)

定义(Definition)

作为块来定义用户定义数据类型(UDT),一旦定义,就能为用户程序所使用;换言之,它是一种

共享数据类型。能够用 UDT 的标识符、UDTx(x 表示一个数字)或在数据块或逻辑块的声明部分

定义的符号名来使用这些数据类型。 用户定义类型能够用来声明变量、参数、数据块和其他用户定义数据类型。结构和数组类型的组

件也可以用用户定义类型来说明。

Page 98: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

90

句法(Syntax)

UDT 的标识符(UDT Identifier)

用户定义数据类型的声明用关键字 TYPE 后跟用户定义类型名(UDT 的标识符)开始。用户定义类

型的名字既能够用固定格式,或者说 UDTx(x 代表一个数字)这样的标准名字,也可用符号名来指

定。 例子(Examples:) TYPE UDT10 TYPE MEASVALUES

数据类型说明(Data Type Specification)

UDT 标识符后跟数据类型说明。在这种情况下只允许的数据类型说明是 STRUCT。 STRUCT : END_STRUCT 备注(Note) 在用户定义数据类型里必须用 STL 的句法,例如应用到常量和初始值指定。关于常量的句法参

考 STL 在线帮助。

例子(Example)

// 带符号名的 UDT 定义 TYPE MEASVALUES: STRUCT BIPOL_1 : INT := 5; BIPOL_2 : WORD := W#16#FFAA ; BIPOL_3 : BYTE := B#16#F1 ; BIPOL_4 : WORD := W#16#1919 ; MEASURE : STRUCT BIPOLAR_10V : REAL ; UNIPOLAR_4_20MA : REAL ; END_STRUCT; END_STRUCT; END_TYPE // 在 FB 中 UDT 的使用

Page 99: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

91

FUNCTION_BLOCK FB10 VAR MEAS_RANGE : MEASVALUES; END_VAR BEGIN // . . . MEAS_RANGE.BIPOL_1 := -4 ; MEAS_RANGE.MEASURE.UNIPOLAR_4_20MA := 2.7 ; // . . . END_FUNCTION_BLOCK

7.5 参数的数据类型(Data type of Parameters)

要说明 FB 和 FC 的形式块参数,可用参数类型,附加已经采用的数据类型: 参数 大小 描述 TIMER 2 bytes 标识一个特定的程序在逻辑块调用中使用的定时器。

如实际参数 T1。 COUNTER 2 bytes 标识一个特定的程序在逻辑块调用中使用的计数器。

如实际参数 C10。 BLOCK_FB BLOCK_FC BLOCK_DB BLOCK_SDB

2 bytes 标识一个特定的 STL 程序在逻辑块调用中使用的计数器。 如实际参数 FC101、DB42。 注(Notes): 数据类型 BLOCK_DB 能够绝对方式存取(myDB.dw10)。也用

BLOCK_DB_TO_WORD()能够深层存取 BLOCK_DB。 数据类型 BLOCK_SDB, BLOCK_FB 和 BLOCK_FC 不能被

S7-SCL 程序解析。 只能用它们在调用 STL 块时提供这种类型的参数。

ANY 10 bytes 除 ANY 外的做文章数据类型允许用作实际参数的数据类型。 POINTER 6 bytes 标识一个程序使用的实际的内存区域,如实际参数 M50.0

7.5.1 定时器和计数器数据类型(TIMER and COUNTER

Data Types)

当块执行时,指定使用一个实际的定时器和计数器。TIMER 和 COUNTER 数据类型只允许用在输入参数

(VAT_INPUT)。

7.5.2 块数据类型(BLOCK Data Types)

(用来)指定一个用作输入参数的块。输入参数的声明决定了块的类型(FB, FC, DB)。为提供参数,

指定块标识符,绝对方式和符号名均可。 能够用绝对寻址(myDB.dw10)存取 BLOCK_DB 数据类型。S7-SCL 不提供对其他块数据类型的操

作。块被调用时,这类参数只能提供值。使用函数时,输入参数不能传递。

Page 100: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

92

在 SCL 中,能够指定下列数据类型的地址作为实际参数: 无形式参数的功能块 无形式参数和无返回值(VOID 函数)的函数 数据块和系统数据块。

7.5.3 指针数据类型(POINTER Data Type)

能够指定一个已经声明的块的形式能类为指针数据类型。如果调节器用这样的块,提供的是任意

数据类型(除 ANY)的地址。 在 SCL 中,只提供了一个处理指针数据类型的语句,就是传送到低层块。 能够指定下列地址类型作为实际参数: 绝对地址 符号名 指针数据类型的地址

只可能当地址是带兼容参数类型的形式参数时。 NIL 常量

指定一个空指针(nil pointer)。

限制(Restrictions)

指针数据类型允许用在功能块和函数的形式输入参数、输入/输出参数和函数的输出参数。常

量不允许作(其)实际参数,NIL(空指针)常量除外。 如果在调节器用 FB 和 FC 时提供一个指针类型的形式参数,将不能传递参数到深层的块。

传递时临时参数将失效。 FC 蓝天 FB 被调用时,如果形式参数作为输入参数声明,只能将过程输入(%PEW)指定给指

针类型的形式参数。 当 FB 被调用时,如果形式参数作为输出参数声明,只能将过程输出(%PAW)指定给指针类型

的形式参数。

例子(Example)

FUNCTION FC100 : VOID VAR_IN_OUT N_out : INT; out : POINTER; END_VAR VAR_TEMP ret : INT; END_VAR BEGIN // ... ret := SFC79(N := N_out, SA := out); // ... END_FUNCTION

Page 101: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

93

FUNCTION_BLOCK FB100 VAR ii : INT; aa : ARRAY[1..1000] OF REAL; END_VAR BEGIN // ... FC100( N_out := ii, out := aa); // ... END_FUNCTION_BLOCK

附:参数数据类型举例(Example of Data Types for Parameters)

FUNCTION DISTANCE : REAL VAR_INPUT MyDB : BLOCK_DB; TIME : TIMER ; END_VAR VAR_TEMP INDEX : INT ; END_VAR BEGIN DISTANCE := DWORD_TO_REAL(MyDB.DD4) ; END_FUNCTION

7.6 ANY 数据类型(ANY Data Type)

在 SCL 中,能够声明 ANY 数据类型的变量如下: 作为块的形式参数;当块被调用时,这些参数能用任意数据类型的实际参数提供。 作为临时变量;能够指定任意数据类型的值给这些变量。 能够用下列数据作为实际参数或作为赋值语句的右边部分: 本地和共享变量 在 DB 中的变量(绝对地址或称号地址) 在本地实例中的变量(绝对地址或称号地址) NIL 常量

指定一个空指针。 ANY 数据类型 定时器、计数器和块

指定标识符(如:T1, C20 或 FB6)。

Page 102: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

94

限制(Restrictions)

ANY 数据类型允许用作 FB 和 FC 的形式输入参数、输入/输出参数,及 FC 的输出参数。常

量不允许用作其实际参数或用在其赋值语句的右边,除 NIL 常量外。 当调用 FB 或 FC 时,如果将临时变量用作 ANY 类型的形式参数,不能传递参数到远程块,

传递他们时临时变量将失效。 这种类型变量不能用作结构类型的组件类型或作为数组的元素类型。 当调用 FC 或 FB 时,如果形式参数作为输入参数声明,只能指定过程输入(%PEW)给 ANY

类型的形式参数。 当调用 FB 时,如果形式参数作为输出参数声明,只能指定过程输出(%PAW)给 ANY 类型的

形式参数。

7.6.1 ANY 数据类型举例(Example of the ANY Data Type)

VAR_INPUT iANY : ANY; END_VAR VAR_TEMP pANY : ANY; END_VAR CASE ii OF 1: pANY := MW4; // pANY 包含 MW4 的地址 3..5: pANY := aINT[ii]; // pANY 包含 aINT 中的第 ii 个元素的地址; 100: pANY := iANY; // pANY contains the value of the iANY input variable ELSE pANY := NIL; // pANY 包含 NIL 指针的值 END_CASE; SFCxxx(IN := pANY);

Page 103: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

95

8 本地变量和块参数的声明

8.1 本地变量和块参数(Local Variables and Block Parameters)

变量有类别(Categories of Variables)

下表详述了本地变量的类别: 变量 说明 静态变量 静态变量是本地变量,其值贯穿所有块循环一直保留。用来存贮功能块的值,存

贮在实例数据块中。 临时变量 临时变量在局部级属于一个逻辑块,不产生静态内存空间,一直存贮在 CPU 堆栈

里。对应的块正在运行时其值才保留。临时变量不能从声明它的块外进行存取。

块参数的类别(Categories of Block Parameters)

块参数是一个占位符,当块被调用时才赋予特定的值。 在块中的占位符被认作一个形式参数,当块被调用时参考实际参数给他们赋值。块的形式参数像本地变量一样看待。 块参数分为以下几类: 块参数 说明 输入参数 当块被调用时,输入参数接受当前的输入值。他们是只读的。 输出参数 输出参数将当前输出值传送给进行调用的块。数据能够读写。 输入/输出参数 当块被调用时,输入/输出参数采用当前值,处理完成后返回结果给进行调用

的块。

标志(OK 标志)

S7-SCL 编译器提供了一个标志,当程序在 CPU 上运行是时用来检测错误。它是一个预定义名为

“OK”的布尔型本地变量。

8.2 变量或参数声明的常规句法(General Syntax of a Variable

or Parameter Declaration)

在数据块和逻辑块中使用前,变量和块参数必须分别声明。声明指定一个用作块参数或变量的标

识符,并赋予其数据类型。 变量或参数声明拥有标识符(用户命名的)和一个数据类型。基本格式在下面的句法图中显示:

Page 104: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

96

变量或参数声明的句法(Syntax of a Variable or Parameter Declaration)

例子(Examples)

VALUE1 : REAL; // if there are several variables of the same type: VALUE2, VALUE3,VALUE4,....: INT; ARR : ARRAY[1..100, 1..10] OF REAL; SET : STRUCT MEASARR:ARRAY[1..20] OF REAL; SWITCH:BOOL; END_STRUCT 注(Note) 要将保留字用作标识符,必须前置“#”字符(如:#FOR)。

8.3 初始化(Initialization)

与FB的输入和输出参数一样,静态变量能够在声明时指派初始值。输入/输出参数也参指派初始

值,当然他们是基本数据类型之一。对于简单变量,在数据类型说明之后,用赋值号(:=)将一个

常量指派为初始值。

句法(Syntax)

例子(Example)

Page 105: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

97

VALUE :REAL := 20.25; 注(Note) 变量表( A1, A2, A3,...: INT:=...)的初始化是不可能的。此时变量必须分别初始化。

数组的初始化(Array Initialization)

要初始化数组,既可为每个元素指定一个用逗号分隔的值,也可指定一个重复因数(整数)用同样

的值来初始化多个元素。 初始值能选择地围在括号内,就算是多维数组也只能作一对括号。

数组初始化的句法(Syntax of Array Initialization)

例子(Examples)

VAR // 静态变量的初始化: INDEX1 : INT := 3 ; // 数组初始化: CONTROLLER1 : ARRAY [1..2, 1..2] OF INT := -54, 736, -83, 77; CONTROLLER2 : ARRAY[1..10] OF REAL := 10(2.5); CONTROLLER1 : ARRAY [1..2, 1..2] OF INT := [-54, 736, -83, 77]; CONTROLLER2 : ARRAY[1..10] OF REAL := [10(2.5)]; // 结构的初始化: GENERATOR: STRUCT DAT1 : REAL := 100.5;

Page 106: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

98

A1 : INT := 10 ; A2 : STRING[6] := 'FACTOR'; A3 : ARRAY[1..12] OF REAL := 0.0, 10(100.0), 1.0; END_STRUCT ; END_VAR

8.4 声明变量范围上的视图(Declaring Views of Variable

Ranges)

要能按不同数据类型来存取声明的变量,用关键字“AT”定义变量或在变量上的范围视图。视图只

在块本地可见;其不包括在接口里。视图在块中能够像其他变量一样使用。它继承其参照的变量

的所有属性,除数据类型是新的(未声明的)。

例子(Example)

下面的例子在一个输入参数上做了几个视图: VAR_INPUT Buffer : ARRAY[0..255] OF BYTE; Frame1 AT Buffer : UDT100 ; Frame2 AT Buffer : UDT200 ; END_VAR 调用块提供缓训参数,其看不到名为 Frame1 和 Frame2(的变量)。被调用块[原文应是 The called block]现在有三种解释数据的方法,以 buffer 命名的数组或以 Frame1 或 Frame2 命名的不同结构

类型数据。

规则(Rules)

变量的远程视图的声明必须跟在变量的声明之后,同处声明子区里。 不可能初始化。 视图的数据类型必须与变量的类型相容。变量说明内存区域的大小,视图的内存要求应等于或小

于(变量内存区域)。以下规则也应用于组合数据类型: 视图的数据类型 变量的数据类型 Elementary Complex ANY/POINTER FB Declaration of a view in

VAR, VAR_TEMP, VAR_IN or VAR_OUT

Elementary Complex ANY/POINTER

x x

x x x (1)

x (1)

Declaration of a view in VAR_IN_OUT

Elementary Complex ANY/POINTER

x

x

FC Declaration of a view in VAR or VAR_TEMP

Elementary Complex ANY/POINTER

x x

x x x

x

Declaration of a view in Elementary x

Page 107: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

99

VAR_IN, VAR_OUT or VAR_IN_OUT

Complex ANY/POINTER

x

(1) ANY/指针不允许在 VAR_OUT 里。 基本的(Elementary) = BOOL, BYTE, WORD, DWORD, INT, DINT, DATE, TIME, S5TIME, CHAR 复杂的(Complex) = ARRAY, STRUCT, DATE_AND_TIME, STRING

8.5 使用多重实例(Using Multiple Instances)

可能想要或已经使用了限定数量的数据块,实例数据(的数量)依所采用的 S7 CPU 的性能(内存容

量)。如果在用户程序的一个 FB 中调节器用其他存在的块,能够不要他们自己的实例数据块。 采用下列解决办法: 在调用功能块的变量声明部分包含要调用静态变量的功能块。 在此功能块中,无需其实例数据块而调用其他的功能块。 集中实例数据块到一个实例数据块,允许更有效使用几个数据块。

8.6 实例声明(Instance Declaration)

对于功能块,也能够在声明部分声明类型为 FB 或 SFB 的变量作为静态变量(VAR; END_VAR)附加到基本的、复杂的或用户定义数据类型的变量上。此变量被 FB 或 SFB 的本地的实例调用。 本地实例数据存贮在产生调用的功能块的实例数据块中。特定本地实例的初始化是不可能的。 作为本地实例被调用的块长度为 0。至少一个静态变量或参数在此块声明。

句法(Syntax)

例子(Example)

Supply1 : FB10; Supply2,Supply3,Supply4 : FB100; Motor1 : Motor ; 此例中 Motor 是在符号表中键入的一个 FB 的符号名。

Page 108: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

100

8.7 标志(OK 标志)

OK 标志用来标识块执行的正确与否,是一个定名为“OK”的 BOOL 类型的本地变量。 程序的开始时,OK 标志的值为 TRUE。其能够在块内任意处查询,或用 S7-SCL 语句设置为

TRUE/FALSE。如果在执行操作时产生错误(如被零除),OK 标志就设置成 FALSE。块退出时,

OK 标志的值保存地输出参数 ENO 里,能够被产生调节器用的块评估。

声明(Declaration)

OK 标志是系统变量,不必声明。然而如果要在程序中使用 OK 标志,必须在编译前选择编译器

选项“设置 OK 标志(Set OK flag)”。

例子(Example)

// 设置 OK 标志为 TRUE 来检查动作是否正确地执行。 OK:= TRUE; Division:= 1 / IN; IF OK THEN // 除法正确 // : // : ELSE // 除法不正确。 // : END_IF;

8.8 声明子域

8.8.1 声明子域概述(Overview of the Declaration Subsections)

每类本地变量或参数,都有用各自关键字对标识的自己的声明子域。每个子域包含允许的详细的

声明子域,子域可按任何顺序定位。 下表显示能够在各种逻辑块中声明的变量或参数类型。 Data Syntax FB FC OB 变量作为: 静态变量

VAR . . . END_VAR

X

X *)

临时变量

VAR_TEMP . . . END_VAR

X

X

X

块参数作为: VAR_INPUT

Page 109: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

101

输入参数 . . . END_VAR

X X

输出参数

VAR_OUTPUT . . . END_VAR

X

X

输入/输出参数

VAR_IN_OUT . . . END_VAR

X

X

*) 虽然在函数中允许通过关键字对 VAR 和 END_VAR 进行变量的声明,但当源文件编译时变量

建立在临时(变量)区域。

8.8.2 静态变量(Static Variables)

静态变量是本地变量,块运行时其值被保留。用来保存功能块的值,并包含在相应实例数据块中。

句法(Syntax)

静态变量在 VAR / END_VAR 声明区内声明。该声明子域是 FB 声明部分的一部分。编译之后,

该子域和块参数子域决定了指定的实例数据块的结构。 在该子域能够: 建立变量,指定变量的数据类型和初始化变量。 如果要在当前 FB 中作为本地实例调(其他的)FB,则将一个被调用的 FB 声明为静态变量。

例子(Example)

VAR RUN :INT; MEASARR :ARRAY [1..10] OF REAL; SWITCH :BOOL; MOTOR_1,MOTOR_2 :FB100; // 实例声明 END_VAR

Page 110: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

102

存取(Access)

从如下代码部分存取变量: 块内存取(Access within the block):在功能块的代码部分能够存取在声明部分声明的变量。详细的

解释在标题为"赋值语句(Value Assignment)"节。 用实例 DB 进行外部存取(External access using the instance DB): 用索引存取能够从其他块存取变

量,如 DBx.变量。

8.8.3 临时变量(Temporary Variables)

临时变量在本地属于逻辑块,不产生静态内存区域,他们位于 CPU 的堆栈里。本块正在运行时,

其值才被保留。临时变量不能从声明它的块外存取。一个 OB、FB 或 FC 首次执行前,临时变量

的值是不确定的。也不能被初始化。 如果只要求在 OB、FB 或者 FC 执行时记录中间结果,可以声明临时数据。

句法(Syntax)

临时变量在 VAR_TEMP / END_VAR 声明部分里声明。该声明部分是 FB、FC 或 OB 的一部分。

通过变量声明以声明变量名和数据类型。

例子(Example)

VAR_TEMP BUFFER 1 : ARRAY [1..10] OF INT ; AUX1, AUX2 : REAL ; END_VAR

存取(Access)

变量总是从逻辑块的代码部分存取,变量是在声明部分声明的(内部存取)。参见题为“赋值语句

(Value Assignment)”节。

Page 111: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

103

8.8.4 块参数(Block Parameters)

参数是占位符,块被实际地调用时才指定一个值。在块里声明的占位符认为是指派了作为实际参

数的值的形式变量。且参数提供了一个块间交换信息的机制。 块参数的类型(Types of Block Parameters) 被实际参数指定的形式输入参数(数据流入块)。 形式输出参数用来传递输出参数(数据 从块流出)。 有输入和输出参数功能的形式输入/输出参数。

句法(Syntax)

在功能块或函数的声明部分制作形式参数的声明,根据在三种声明子域内的参数类型组合参数。

在变量声明中,指定参数名和数据类型。初始化只可能对一个 FB 的输入和输出参数。 声明形式参数时,不仅只能用基本的、复杂的和用户定义数据类型,也可用参数数据类型。

例子(Example)

VAR_INPUT // 输入参数 MY_DB : BLOCK_DB ; CONTROLLER : DWORD ; TIMEOFDAY : TIME_OF_DAY ; END_VAR VAR_OUTPUT // 输出参数 SETPOINTS: ARRAY [1..10] of INT ; END_VAR VAR_IN_OUT // 输入/输出参数 SETTING : INT ; END_VAR

存取(Access)

块参数可从逻辑块的代码部分进行存取如下: 内部存取: 从在其声明部分已经声明该参数的逻辑块的代码部分存取。在题为"赋值语句

Page 112: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

104

(Value Assignment)"和"表达式、操作和地址(Expressions, Operations and Addresses)"节有解释。 用实例数据块外部存取: 用特定的 DB 能够存取功能块的块参数。

Page 113: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

105

9 声明常量和标号

9.1 常量(Constants)

常是有固定值的数据元素,程序运行中不能改变。 下面是能够在 SCL 中使用的常组: 位常量 数字类常量

- 整数常量 - 实数常量

字符类常量 - 字符常量 - 串常量

时间类常量 - 日期常量 - 时长型常数 - 日时间常数 - 日期时间常数

9.1.1 为常量声明符号名(Declaring Symbolic Names for Constants)

常量不必声明。但是,在声明部分应给常量指定符号名。 能够在逻辑块的声明部分用 CONST 语句给常量声明符号名。对于块的所有常量这样做是可取的,

用此方法,要改变常值时,块变得容易阅读和修订。

语法(Syntax)

在简单表达式中,只允许基本的算术运算(*, /, +, -, DIV, MOD)。

例子(Example)

CONST Number := 10 ; TIMEOFDAY1 := TIME#1D_1H_10M_22S_2MS ; NAME := 'SIEMENS' ; NUMBER2 := 2 * 5 + 10 * 4 ;

Page 114: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

106

NUMBER3 := 3 + NUMBER2 ; END_CONST

9.1.2 常量的数据类型(Data Types for Constants)

常量数据类型的指定的方法不同于在 STL 中: 给出常量数据类型只通过其使用的算术或逻辑运算,如: Int1 :=Int2 + 12345 //"12345" is given the data type INT Real1:=Real2 + 12345 //"12345" is given the data type REAL The constant is assigned the data type with the smallest value range that will accommodate the constant without any loss of value. For example, the constant "12345" is not always given the INT data type as in STL but the ANY_NUM data type class; depending on its use therefore, INT, DINT, or REAL.

类型定义符常量(Type-Defined Constants)

用类型定义符常标记法,对于下列数字类数据类型,也能够显式指定数据类型。 例子(Examples): 数据类型 类型定义符标记法 BOOL BOOL#1 bool#0

Bool#false BOOL#TRUE BYTE BYTE#0 B#2#101

Byte#'? b#16#f WORD WORD#32768 word#16#f

W#2#1001_0100 WORD#8#177777 DWORD DWORD#16#f000_0000 dword#32768

DW#2#1111_0000_1111_0000 DWord#8#37777777777 INT INT#16#3f_ff int#-32768

Int#2#1111_0000 inT#8#77777 DINT DINT#16#3fff_ffff dint#-65000

DInt#2#1111_0000 dinT#8#17777777777 REAL REAL#1 real#1.5

real#2e4 real#3.1 CHAR CHAR#A CHAR#49

9.1.3 常量标记法(Notation for Constants)

有一种依据常量的值的数据类型和数据格式的特殊的标记法或格式。通过标记法直接决定常量的

值和类型,不需要声明。 例如: 15 值 15 用十进制格式当作整数常量 2#1111 值 15 用二进制格式当作整数常量 16#F 值 15 用十六进制格式当作整数常量

Page 115: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

107

可能的标记法概况(Overview of the Possible Notations)

数据类型 描述 在 SCL 中的例子 在 STL 中的例子 BOOL 1 位 FALSE

TRUE BOOL#0 BOOL#1 BOOL#FALSE BOOL#TRUE

BYTE 8 位十六进制数 B#16#00 B#16#FF BYTE#0 B#2#101 Byte#'? b#16#f

CHAR 8 位(1 个 ASCII 字符) 'A' CHAR#49

STRING 最多 254 个 ASCII 字符 'Address' WORD 16 位十六进制数

16 位八进制数 16 位二进制数

W#16#0000 W#16#FFFF word#16#f WORD#8#177777 8#177777 W#2#1001_0100 WORD#32768

DWORD 32 位十六进制数 32 位八进制数 32 位二进制数

DW#16#0000_0000 DW#16#FFFF_FFFF Dword#8#37777777777 8#37777777777 DW#2#1111_0000_1111_0000 dword#32768

INT 16 位定点数 -32768 +32767 INT#16#3f_ff int#-32768 Int#2#1111_0000 inT#8#77777

DINT 32 位浮点数

-2147483648 +2147483647 DINT#16#3fff_ffff dint#-65000

L#-2147483648 L#+2147483647

Page 116: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

108

Dint#2#1111_0000 dinT#8#17777777777

REAL 32 位浮点数 十进制格式 123.4567 REAL#1 real#1.5 指数格式 real#2e4 +1.234567E+02

S5TIME 16 位 SIMATIC 格式时间

值 T#0ms TIME#2h46m30s T#0.0s TIME#24.855134d

S5T#0ms S5TIME#2h46m30s

TIME 32-bit time value in IEC format

-T#24d20h31m23s647ms TIME#24d20h31m23s647ms T#0.0s TIME#24.855134d

Date 16-bit date value

D#1990-01-01 DATE#2168-12-31

TIME_OF_DAY

32-bit time of day

TOD#00:00:00 TIME_OF_DAY#23:59:59.999

DATE_AND_ TIME

Date and time value DT#95-01-01-12:12:12.2

9.1.3.1 位常量(Bit Constants)

位常量包含长度为 1 位、8 位、16 位或 32 位的值。依据其长度,能够在 S7-SCL 程序中用数据类

型 BOOL、BYTE、WORD 或 DWORD 来指派给变量。

语法(Syntax)

Page 117: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

109

十进制数字串(Decimal Digit String)

包括一串数字(如需要,能够用下划线分隔开)的常量的十进制数。下划线用来提高长数字的可读

性。用在常量的十进制数字串的有效标记法的例子如下: DW#2#1111_0000_1111_0000 dword#32768

二进制、八进制和十六进制值(Binary, Octal and Hexadecimal Values)

能够用其他的数字制式指定一个整数常量,像用前缀 2#、8#或 16#后跟用相应数字制式标记法的

数字。下图用基于八进制数字串的例子说明:

例子(Example)

下面的例子说明位常量的标记法: Bool#false 8#177777 DW#16#0000_0000

9.1.3.2 整数常量(Integer Constants)

整数常量包括长度为 16 位或 32 位的全部数值。依据他们的长度,在 S7-SCL 程序中能够将其指

派给数据类型为 INT 或 DINT 的变量。

语法(Syntax)

十进制数字串(Decimal Digit String)

包括一串数字(如需要,能够用下划线分隔开)的常量的十进制数。下划线用来提高长数字的可读

性。用在常量的十进制数字串的有效标记法的例子如下: 1000

Page 118: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

110

1_120_200 666_999_400_311 二进制、八进制和十六进制值(Binary, Octal and Hexadecimal Values) 能够用其他的数字制式指定一个整数常量,像用前缀 2#、8#或 16#后跟用相应数字制式标记法的

数字。

例子(Example)

下面的例子说明整数常量的标记法: Value_2:=2#0101; // 二进制数,十进制值为 5 Value_3:=8#17; // 八进制数,十进制值为 14 Value_4:=16#F; // 十六进制数,十进制值为 15 Value_5:=INT#16#3f_ff // 十六进制数,类型定义表示法

9.1.3.3 实数常量(Real Number Constants)

实数常量是十进制表示的值。能够指派给 REAL 数据类型的变量。

语法(Syntax)

正负号是可选的,没指定符号,则表示正数。 包括一串数字(如需要,能够用下划线分隔开)的常量的十进制数。下划线用来提高长数字的可读

性。用在常量的十进制数字串的有效标记法的例子如下: 1000 1_120_200 666_999_400_311

指数(Exponent)

指定浮点数时,能够用一个指数。字母“E”或“e“后跟一个整数来指定指数。 在 SCL 中,值 能够用下列实数表示: 3.0E+10 3.0E10 3e+10 3E10 0.3E+11 0.3e11 30.0E+9 30e9

例子(Examples)

NUM4:= -3.4 ;

Page 119: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

111

NUM5:= 4e2 ; NUM6:= real#1.5;

9.1.3.4 字符常量(单字符)(Char Constants (Single Characters))

字符常量恰好包括一个字符。字符用单引号(')括起来。字符常量不能用在表达式中,

语法(Syntax)

例子(Example)

Charac_1 := 'B'; Charac_2 := char#43; Charac_3 := char#'B';

字符的语法(Syntax of a Character)

扩展 ASCII 字符集中全部的任何字符均能够使用。特殊格式的字符,引号(')和$字符能够用转义

符$来输入。 也能够使用扩展 ASCII 字符集全集中的非打印字符。要做到这点,用十六进制指定代换表达式。

用十六进制代码表示一个字符的例子(Example of a Character in Hexadecimal Code) CHARACTER := '$41' ; //对应字符'A'

Page 120: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

112

Blank :='$20'; //对应字符‘空格’

9.1.3.5 串常量(String Constants)

串常量是一个最多 254 个字符的字符串。字符用单引号括起来。串常量不能用在表达式中。

语法(Syntax)

字符的语法(Syntax of a Character)

扩展 ASCII 字符集中全部的任何字符均能够使用。特殊格式的字符,引号(')和$字符能够用转义

符$来输入。 也能够使用扩展 ASCII 字符集全集中的非打印字符。要做到这点,用十六进制指定代换表达式。

中断一个串(Interrupting a String)

能够多次中断和接续一个字符串。 用特殊标识符,串既可占 SCL 块中的一行也或扩展到多行。要中断一个串,使用标识符$>,其

后接续此串则用标识符$<。在中断标识符和接续标识符之间的地方能够扩展到多行,且能够包含

注释或空着。

Page 121: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

113

例子(Examples)

// 串常量: NAME:= 'SIEMENS'; //中断一个串常量 MESSAGE1:= 'MOTOR- $> $< Controller'; // 用十六进制表示串: MESSAGE1:= '$41$4E' (*字符串 AN*);

9.1.3.6 日期常量(Date Constants)

日期由前缀 DATE#或 D#引导。通过整数说明日期,年(4 个数字)、月和日之间用破折号(减号)分开。

语法(Syntax)

例子(Example )

TIMEVARIABLE1:= DATE#1995-11-11 ; TIMEVARIABLE2:= D#1995-05-05 ;

9.1.3.7 时长常量(Time Period Constants)

时间段常量用前缀 TIME#或 T#引导。时长常量能够用两种可能的方式表示: 十进制格式 复合格式

Page 122: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

114

语法(Syntax)

当不指定时间单位,只可能会从复合格式变成十进制格式。 跟在前缀 TIME#或 T#后,必须至少指定一个时间单位。

十进制格式(Decimal Format)

如果用十进制数字指定时间量如小时或分针,则使用十进制格式。

复合格式(Composite format)

复合格式是独立时间量的一外序列。先是天然后是小时等,用下划线分开说明。但能够在序列中

省略一些时间分量,至少必须指定一个时间单元。

Page 123: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

115

例子(Example)

// 十进制格式 Interval1:= TIME#10.5S ; // 复合格式 Interval2:= T#3D_2S_3MS ; // 复合十进制格式 Interval3 := T#2D_2.3s ;

9.1.3.8 日时间常量(Time-of-Day Constants)

日时间由前缀 TIME_OF_DAY#或 TOD#引导。

语法(Syntax)

通过指定用冒号分隔的时、分和秒数字来标识日时间。毫秒数是可选的。毫秒数用小数点与其他

数字分开。

Page 124: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

116

指定日时间(Specifying the Time of Day)

例子(Example)

TIMEOFDAY1:= TIME_OF_DAY#12:12:12.2 ; TIMEOFDAY2:= TOD#11:11:11 ;

9.1.3.9 日期时间常量(Date and Time Constants)

用前缀 DATE_ANG_TIME#或 DT#引导日期时间。指定一个日期和一个日时间组成该常量。

语法(Syntax)

日期(Date)

Page 125: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

117

日时间(Time of Day)

例子(Example)

TIMEOFDAY1:= DATE_AND_TIME#1995-01-01-12:12:12.2 ; TIMEOFDAY2:= DT#1995-02-02-11:11:11;

9.2 声明标号(Declaring Labels)

标号用来标识 GOTO 语句的目标。他们在逻辑块的声明部分用符号名声明。

语法(Syntax)

例子(Example)

LABEL LAB1, LAB2, LAB3; END_LABEL

Page 126: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

118

10 共享数据

10.1 共享数据概述(Overview of Shared Data)

在 SCL 中,能够存取共享数据。有两种类型的共享数据如下: CPU 内存区域 内存区域包含系统数据,如输入、输出和位内存。可用内存区域的数视所使用的 CPU 而定。 用可装载形式的共享的用户数据 这些数据区域放在数据块中。要使用它们,必须先建立数据块,并在其中声明数据。实例数据块

基于特定的功能块并自动建立。

存取共享数据(Access to Shared Data)

能够用下列方法存取共享数据: 用绝对寻址方式:使用地址标识符和绝对地址。 用符号寻址方式:指定一外预先在符号表中定义的符号。 索引方式:用地址标识符和数组索引。 结构方式:使用变量。 存取方式 CPU 内存区域 共享的用户数据 绝对方式 Yes Yes 符号方式 Yes Yes 索引方式 Yes Yes 结构方式 No Yes

10.2 CPU 的内存区域(Memory Areas of the CPU)

10.2.1 CPU 的内存区域概述(Overview of the Memory Areas of the

CPU)

CPU 的内存区域是全系统声明的区域。由此,这些区域不必在逻辑块中声明。每个 CPU 均提供

以下有各自地址范围的内存区域: 在存贮映象中的输入/输出(如 Q1.0) 外部输入/输出(如 PQ1.0) 位内存(如 M1.0) 定时器、计数器(C1)

存取的语法(Syntax for Access)

在逻辑块的代码部分,用赋值方式存取一个 CPU 内存区域,像简单存取,能够指定为一个

绝对地址或符号,或 用索引方式存取。

Page 127: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

119

10.2.2 CPU 内存区域的绝对存取(Absolute Access to Memory Areas of

the CPU)

要通过绝对内存定位方式存取 CPU 的内存区域,使用将一个绝对标识符赋值给同类型的变量。

绝对标识符指示 CPU 中的内存区域。通过指定地址标识符(此处为 IB)后面跟一个地址(此处为 10)来指定内存区域。

绝对标识符的语法(Syntax of the Absolute Identifier)

内存前缀(Memory Prefix)

用内存前缀,指定要寻址的内存类型。

Page 128: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

120

依你选择的语种,德语和英语地址标识符有所不同。

大小前缀(Size Prefix)

用大小前缀,指定要从外部 I/O 读取的内存区域的长度。例如能够读一个籽节或一个字。如果只

要指定一个位时,则使用大小前缀是可选的。

地址(Address)

对于地址,首先指定绝对的字节地址,然后是用一个点分开的位地址。位地址是可选的。

例子(Examples)

STATUSBYTE :=IB10; STATUS_3 :=I1.1; MEASVAL :=IW20;

10.2.3 CPU 内存区域的符号存取(Symbolic Access to Memory Areas

of the CPU)

用符号地址,代替绝对地址,能够用符号名来寻址 CPU 内存区域。 通过建立符号表在用户程序中将一个符号名指定给实际地址。用菜单命令选项(Options) > 符号表

(Symbol Table)在 S7-SCL 中能够打开符号表任意次来增加符号。 对于数据类型说明,能够用使用能接受的指定数据元素大小的任何数据类型。下表说明符号表中

怎么样显现的: 符号 绝对地址 数据类型 注释 Motor_contact_1 I 1.7 BOOL Contact switch 1 for Motor A Input1 IW 10 INT Status word

Page 129: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

121

存取(Access)

通过将一个值指定给同类型的已经声明符号的变量存取地址。

例子(Example)

MEASVAL_1 := Motor_contact_1; Status_Motor1 := Input1 ;

10.2.4 CPU 内存区域的索引存取(Indexed Access to Memory Areas of

the CPU)

也能够用一外索引来存取 CPU 的内存区域。与绝对地址比较,此方式的优点是能够用变量索引

动态寻址。例如,能够将 FOR 循环的控制变量用作地址。 执行索引存取内存区域与绝对方式的做法一样,仅提供了地址的长处。取代绝对地址,指定的索

引能够是一个常量、一个变量或一个算术表达式。 对于索引存取,绝对标识符由地址标识符(内存前缀和大小前缀)和用于索引的基本表达式组成。

绝对标识符的语法(Syntax of the Absolute Identifier)

索引(基数表达式)必须遵循以下规则(The indexing (base expression) must adhere to the

following rules)

每个索引必须是一个 INT 类型的算术表达式。 当存取 BYTE、WORD 或 DWORD 类型的数据时,只能使用一个索引。索引被看作字节地址。

存取的长度由大小前缀指定。 当存取 BOOL 类型的数据,必须使用双索引。第一个索引指定字节地址,第二个索引指定字节内

的位地址。

Page 130: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

122

例子(Example)

MEASVAL_1 :=IW[COUNTER]; OUTLABEL :=I[BYTENO, BITNO];

10.3 数据块(Data Blocks)

10.3.1 数据块概述(Overview of Data Blocks)

在数据块里,能够保存和处理所有数据,应用范围是整个程序或整个项目。每个逻辑块均能读写

共享的用户数据。

存取(Access)

能够用下列方法存取共享数据块的数据: 绝对方式或简单方式, 结构方式, 索引方式。

10.3.2 数据块的绝对存取(Absolute Access to Data Blocks)

要用绝对地址存取数据块编程,就像使用 CPU 内存区域一样将一个值指定到同类型的变量。首

先指定 DB 标识符,跟着是关键字“D”和大小前缀(如用于位的 X)及字节地址(如 13.1)。

Page 131: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

123

语法(Syntax)

通过在大小前缀和地址前指定 DB 标识符不定义数据存取。

大小前缀(Size Prefix)

大小前缀标识在数据块中寻址的内存区域的长度。例如,能够从 DB 中读取一个字节或一个字。

如果仅指定一个位,使用大小前缀是可选取的。

地址(Address)

当指定地址时,首先指定绝对的字节地址,然后是用点分隔的相应字节的位地址(只在位存取时)。

例子(Example)

绝对存取数据块的例子如下。在绝对方式中数据块在第一部分指定,而在符号方式中是在第二部

分。 STATUSBYTE :=DB101.DB10; STATUS_3 :=DB30.D1.1; MEASVAL :=DB25.DW20; STATUSBYTE :=Status_data.DB10; STATUS_3 :="New data".D1.1; MEASVAL :=Measdata.DW20.DW20; STATUS_1 :=WORD_TO_BLOCK_DB (INDEX).DW10;

Page 132: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

124

10.3.3 数据块的索引方式存取(Indexed Access to Data Blocks)

也能够用索引方式存取数据块。与绝对寻址比较,优点是允许地址只在运行时确定的寻址定位。

例如,能够将地址用作 FOR 循环的控制变量。 索引方式存取数据块与绝对存取一样,只是地址说明不同。 取代绝对地址,能够用一个常量、一个变量或一个算术表达式来指定一个索引。 索引存取由DB标识符、地址标识符(关键字“D”和大小前缀)和用作索引的基本表达式。

语法(Syntax)

使用索引时,必须遵循下列规则: 存取类型为 BYTE, WORD 或 DWORD 的数据时,只能使用一个索引,索引被看作一个字节

地址。存取的长度由大小前缀指定。 当存取类型为 BOOL 的数据时,必须使用两个索引,第一个指定字节地址,第二个指定字节

内位的位置。 每个索引必须是一个 INT 数据类型(0 - 32767)的算术表达式。

例子(Example)

STATUS_1:= DB11.DW[COUNTER]; STATUS_2:= DB12.DX[WNO, BITNO]; STATUS_1:= Database1.DW[COUNTER]; STATUS_2:= Database2.DX[WNO, BITNO]; STATUS_1:= WORD_TO_BLOCK_DB(INDEX).DW[COUNTER];

10.3.4 数据块的结构化存取(Structured Access to Data Blocks)

结构化存取使用在数据块中声明的变量的标识符。能够将变量赋值给任何同类型的变量。 通过指定 DB 名和用点分隔的简单变量和名字来引用在数据块中的变量。

Page 133: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

125

语法(Syntax)

简单变量表示在 DB 的声明中指定为基本或复杂数据类型的变量。 如果使用一个 BLOCK_DB 类型的参数或转换函数 WORD_TO_BLOCK_DB 的结果来初始存取数

据块,只通顺是绝对方式或索引方式存取,不能用结构方式存取。

例子(Example)

//在 FB10 的声明部分: VAR Result: STRUCT RES1 : INT; RES2 : WORD; END_STRUCT END_VAR //用户定义数据类型 UDT1 TYPE UDT1 STRUCT RES1 : INT; RES2 : WORD; END_STRUCT //带用户定义数据类型的 DB20: DB20 UDT1 BEGIN ... //不带用户定义数据类型的 DB30: DB30 STRUCT RES1 : INT; RES2 : WORD; END_STRUCT BEGIN ... //用以下存取的功能块: .. FB10.DB10(); RESWORD_A := DB10.Result.RES2; RESWORD_B := DB20.RES2; RESWORD_C := DB30.RES2;

Page 134: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

126

11 表达式、操作符和地址

11.1 表达式、运算符和地址概述(Overview of Expressions,

Operations and Addresses)

表达式表示在编译或运行期间计算出来的一个值,由地址(如常量、变量或函数调用)和运算符(如*, /, + 或 -)组成。 地址的数据类型和所用的运算符决定了表达式的类型。在 SCL 中可能有下列表达式: 算术表达式 比较表达式 逻辑表达式 表达式按特定顺序求值。由以下决定: 所包含的运算符的优先级别和 从左到右处理有同样优先级别的运算符或 用括号。 能够用表达式的结果做以下事情: 将其赋值给一个变量。 将其用作控制语句的条件。 将其用作调用函数和功能块的参数。

11.2 运算符(Operations)

表达式包含运算符和地址。大多数 S7-SCL 运算符由两个地址组成,因此称为二元操作。另一些

仅包含一个地址,叫做一元操作。 二元运算符写在两地址之间(如 A+B)。一元运算符总是就在地址前面(如-B)。 下表中列出的运算符的优先权给出了求值的顺序。"1"表示最高优先权。 类别 操作 符号 优先级别 赋值操作: 赋值 : = 11 算术运算: 幂 Power

一元运算 Unary Operations 一元加 Unary plus 一元减 Unary minus 基本算术运算 Basic Arithmetic Operations 乘法 Multiplication 除法 Division 取模函数 Modulo function 整除 Integer division 加法 Addition 减法 Subtraction

** + - * / MOD DIV + -

2 3 3 4 4 4 4 5 5

比较运算: 小于 Less than 大于 Greater than 小于或等于 Less than or equal to

< > <=

6 6 6

Page 135: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

127

大于或等于 Greater than or equal to 等于 Equal to 不等于 Not equal to

>= = <>

6 7 7

逻辑运算: 非 Negation NOT 3

基本逻辑运算 Basic Logical Operations 与 And 异或 Exclusive or 或 Or

AND or & XOR OR

8 9 10

括号 括号 ( ) 1

11.3 地址(Addresses)

地址是能够组成表达式的对象。在地址中允许下列元素:

常量(Constants)

常量能够是一个数字值或一个符号名或一个字符串。

下面是有效的常量的例子: 4_711 4711 30.0 'CHARACTER' FACTOR

扩展变量(Extended Variable)

扩展变量是一系列变量的总称项,更多详细内容在标题为“赋值”部分给出。

Page 136: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

128

有效变量的例子: SETPOINT 简单变量 IW10 绝对变量 I100.5 绝对变量 DB100.DW [INDEX] 在数据块中的变量 MOTOR.SPEED 在本地实例中的变量 SQR (20) 标准函数 FC192 (SETPOINT) 函数调用

备注(Note) 在函数调用情况下,计算结果、返回值、用函数名插入在表达式之中。VOID 型函数无返回值,

故不允许在表达式中作地址用。

11.4 表达式的语法(Syntax of an Expression)

语法(Syntax)

Page 137: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

129

表达式的结果(Result of an Expression )

用表达式结果能做下面的事情: 将其赋值给一个变量。 将其用作控制语句的条件。 将其用作调用函数或功能块的参数。

求值的顺序(Order of Evaluation)

表达式的求值顺序依据以下: 所包含的运算符的优先级 从左到右的顺序 括号的使用(如果运算符有同样的优先级)

规则(Rules)

表达式的求值依据以下规则: 在两个不同优先级运算符之间的地址总是与较高优先级别的运算符联合。 依据等级顺序处理运算。 同等优先级别的运算则从左到右求值。 在标识符前放一个减号相当于乘以-1。 算术运算符不能相互紧跟。表达式 a*-b 是无效的,反过来 a*(-b)是允许的。 括号能够用来超越运算符的优先级;换言之,括号有最高的优先级别。 在括号中的表达式被认作单个地址,总是先求值。 左右括号的数量必须匹配。 算术运算符不能用来边接字符或逻辑数据。表达式像'A'+'B'和(n<=0)+(m>0)是错误的。

表达式的例子(Examples of Expressions)

IB10 // 地址 A1 AND (A2) // 逻辑表达式 (A3) < (A4) // 比较表达式 3+3*4/2 // 算术表达式

11.5 简单表达式(Simple Expression)

在 SCL 中,简单表达式意思是简单的算术表达式。能够用乘或除常量值对,且加减这些对。

Page 138: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

130

简单表达式的语法(Syntax of a simple expression)

简单乘法的语法(Syntax of simple multiplication)

例子(Example)

SIMP_EXPRESSION= A * B + D / C - 3 * VALUE1;

11.6 算术表达式(Arithmetic Expressions)

算术表达式是由算术运算符构成的。其允许处理数字类数据类型。 下表显示所有可能的运算符和指出依据地址的结果属于的类型。用到下列缩定: ANY_INT for data types INT, DINT ANY_NUM for data types ANY_INT 和 REAL 运算 标识符 第一地址 第二地址 结果 优先级 幂 ** ANY_NUM ANY_NUM REAL 2 一元加 + ANY_NUM - ANY_NUM 3 TIME - TIME 3 一元减 - ANY_NUM - ANY_NUM 3 TIME - TIME 3 乘法 * ANY_NUM ANY_NUM ANY_NUM 4 TIME ANY_INT TIME 4 除法 / ANY_NUM ANY_NUM ANY_NUM 4

Page 139: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

131

TIME ANY_INT TIME 4 整除 DIV ANY_INT ANY_INT ANY_INT 4 TIME ANY_INT TIME 4 取模 MOD ANY_INT ANY_INT ANY_INT 4 加法 + ANY_NUM ANY_NUM ANY_NUM 5 TIME TIME TIME 5 TOD TIME TOD 5 DT TIME DT 5 减法 - ANY_NUM ANY_NUM ANY_NUM 5 TIME TIME TIME 5 TOD TIME TOD 5 DATE DATE TIME 5 TOD TOD TIME 5 DT TIME DT 5 DT DT TIME 5 备注(Note) 除法结果的数据类型依较高级别值地址的数据类型而定。 例如,如果两个 INT 类型的地址相除,结果也是此数据类型(如:10/3=3 而不是 3.33)。

规则(Rules)

按其优先级操作在算术表达式中的运算符: 在没有语法必须情况下,为了清晰明了,将负数插起来是可取的。 当两个完全的 INT 类型的数相除,运算符"DIV"和"/"得出同样的结果(见下面的例子)。 在除法运算中(`/', `MOD'和`DIV'),第二个地址不能是 0。 如果说一个是 INT 类型的数(整数),另一个是 REAL 类型的数(实数),则结果总是 REAT 类

型。 当 DATE_AND_TIME 和 TIME 类型的数据相减时,数据类型为 TIME 的地址总是必须放在

运算符"-"的右边。

例子(Examples)

// 将算术表达式的结果(11)指定给变量"VALUE" VALUE1 := 3 + 3 * 4 / 2 - (7+3) / (-5) ; // 下面的表达式的值是 1 VALUE2 := 9 MOD 2 ;

11.7 逻辑表达式(Logical Expressions)

逻辑表达式是由逻辑运算符构成的。

Page 140: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

132

基本逻辑运算符(Basic Logic Operations)

用运算符 AND, &, XOR 和 OR,逻辑地址(BOOL 类型)或数据类型 BYTE、WORD 或 DWORD 能

够组成逻辑表达式。负逻辑则用 NOT 运算符。

逻辑运算符(Logic Operations):

布尔类型的逻辑表达式的结果是 TRUE 或 FALSE 二者之一,而两个位型地址的逻辑运算结果是

位阵。 下表列出了可用的逻辑表达式和地址及结果的数据类型。用到下面的缩写: ANY_BIT for data types BOOL, BYTE, WORD, DWORD 运算符 标识符 第一地址 第二地址 结果 优先级 非 NOT ANY_BIT - ANY_BIT 3 与 AND ANY_BIT ANY_BIT ANY_BIT 8 异或 XOR ANY_BIT ANY_BIT ANY_BIT 9 或 OR ANY_BIT ANY_BIT ANY_BIT 10

结果(Result):

逻辑表达式的结果是以下之一: 如果是布尔地址,则是 1(true)或 0(false),或 两个地址的给合则是一个位阵。

例子(Examples)

// 比较表达式的结果是否定的. IF NOT (COUNTER > 5) THEN . . . ; // 第一个表达式和结果和第二个表达式的结果相与 A := NOT (COUNTER1 = 4) AND (COUNTER2 = 10) ; // 两个比较表达式的或(和) WHILE (A >= 9) OR (SCAN <> "n") DO.... ; // 屏蔽一个输入字节(位操作) Result := IB10 AND 2#11110000 ;

Page 141: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

133

11.8 比较表达式(Comparison Expressions)

比较表达式比较两个地址的值,并求出一个布尔值。如果比较条件是真则结果是 TRUE,否则为

FALSE。

语法(Syntax)

规则(Rules)

下表列出了可比较的数据类型和转换时的规则: 数据类型 = <> >0 <0 > < 规则 INT √ √ √ √ √ √ 所有比较操作均允许用在数字数据类型。

较高级别值的操作决定了运算结果的类型。 DINT √ √ √ √ √ √ REAL √ √ √ √ √ √ BOOL √ √ 只有等于和不等于允许用在位数据类型。

较高级别值的操作决定了运算结果的类型。 BYTE √ √ WORD √ √ DWORD √ √ CHAR √ √ √ √ √ √ 对于字符和串的情况, 变量的长度和每个字符的

ASCII 数字值用于比较。 对于串,比较是内在通过 IEC 库中的函数

EQ_STRNG, GE_STRNG, LE_STRNG, GT_STRNG和 LT_STRNG 得出结果。 下列地址不允许用于这些函数: 函数的参数 STRUCT或ARRAY类型的功能块的输入/输出参数。

STRING √ √ √ √ √ √ DATE √ √ √ √ √ √ TIME √ √ √ √ √ √ DT √ √ √ √ √ √ 对于 DT,比较是内在通过 IEC 库中的 EQ_DT, GE_

DT, LE_ DT, GT_STRNG 和 LT_ DT 函数得出结果。

Page 142: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

134

下列地址不允许用于这些函数: 函数的参数 STRUCT或ARRAY类型的功能块的输入/输出参数。

TOD √ √ √ √ √ √ S5-TIME S5 TIME 变量不允许用作比较地址。S5TIME 格式必

须用 IEC 函数显式转换为 TIME 格式。

比较表达式的组成(Combining of comparsion expressions)

比较表达式能够根据执行语句的布尔规则进行组合,如"if a < b and b < c then ..."。 按照其优先级对运算进行求值。可用括号改变优先级别。

例子(Examples)

// 比较:3 小于或等于 4. 结果是"TRUE"(真) A := 3 <= 4 // 比较:7 不等于 7. 结果是"FALSE"(假) 7 <> 7 // 在 IF 语句中的比较表达式的求值 IF COUNTER < 5 THEN .... // 两个比较表达式组合 Value_A > 20 AND Value_B < 20 // 两个比较表达式用括弧组合 A<>(B AND C)

Page 143: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

135

12 语句

12.1 赋值(Value Assignments)

当一个值被指定,变量的当前值被通过表达式指定的新的值代替。此表达式也能够包含函数标识

符,其被语句激活,然后返回相应的值(返回值)。 如下图所示,在赋值符右边的表达式被求值,且得到的值作为结果设定给其名字写在赋值符左边

的变量。函数允许的变量如下图所示:

赋值的语法(Syntax of a Value Assignment)

赋值表达式的形式是向左寻址形式,简单变量能是一个基本的或复杂数据类型的变量。

12.1.1 基本数据类型变量的赋值(Value Assignments with Variables of

an Elementary Data Type)

能够将同类型的不同变量指定给基本数据类型的每个变量和每个表达式。 Identifier := Expression ; Identifier := Variable ;

例子(Example)

FUNCTION_BLOCK FB12 VAR SWITCH_1 : INT ; SWITCH_2 : INT ; SETPOINT_1 : REAL ; SETPOINT_2 : REAL ; QUERY_1 : BOOL ; TIME_1 : S5TIME ; TIME_2 : TIME ;

Page 144: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

136

DATE_1 : DATE ; TIMEOFDAY_1 : TIME_OF_DAY ; END_VAR BEGIN // 给变量赋予常量值 SWITCH_1 := -17 ; SETPOINT_1 := 100.1 ; QUERY_1 := TRUE ; TIME_1 := T#1H_20M_10S_30MS ; TIME_2 := T#2D_1H_20M_10S_30MS ; DATE_1 := D#1996-01-10 ; // 给变量赋予变量值 SETPOINT_1 := SETPOINT_2 ; SWITCH_2 := SWITCH_1 ; // 给变量赋予表达式 SWITCH_2 := SWITCH_1 * 3 ; END_FUNCTION_BLOCK

12.1.2 STRUCT 和 UDT 类型变量的赋值(Value Assignments with

Variables of the Type STRUCT and UDT)

STRUCT 和 UDT 类型变量是表示一个完整结构或一个结构元素的结构化变量。 下面是有效结构变量的例子: Image //结构的标识符 Image.element //结构元素的标识符 Image.arr //在一个结构中的一维数组标识符 Image.arr[2,5] //在一个结构中的数组元素的标识符

赋值一个完整结构(Assigning a Complete Structure)

一个完整结构只能赋值给另一个完整结构,两个结构内部的名称和数据类型应完全匹配。下面的

赋值是有效的: structname_1 := structname_2 ;

赋值结构元素(Assigning Structure Components)

能够将一个同类型变量、同类型表达式或另一个结构部件赋值给任何结构元素。 能够通过说明结构的标识符来引用结构元素,结构元素的标识符用一个句点分开。下面的赋值是

有效的: structname_1.element1 := Value ;

Page 145: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

137

structname_1.element1 := 20.0 ; structname_1.element1 := structname_2.element1 ; structname_1.arrname1 := structname_2.arrname2 ; structname_1.arrname[10] := 100 ;

例子(Example)

FUNCTION_BLOCK FB3 VAR AUXVAR : REAL ; MEASVAL : STRUCT //目标结构 VOLTAGE :REAL ; RESISTANCE :REAL ; SIMPLEARR : ARRAY [1..2, 1..2] OF INT ; END_STRUCT ; PROCVAL : STRUCT //源结构 VOLTAGE : REAL ; RESISTANCE : REAL ; SIMPLEARR : ARRAY [1..2, 1..2] OF INT ; END_STRUCT ; END_VAR BEGIN //赋值给一个完整结构 MEASVAL := PROCVAL ; //赋值给地个结构元素 MEASVAL.VOLTAGE := PROCVAL.VOLTAGE ; //将一个结构元素赋值给同类型变量 AUXVAR := PROCVAL.RESISTANCE ; //将一个常量赋值给结构元素 MEASVAL.RESISTANCE := 4.5; //将一个常量赋值给一维数组元素 MEASVAL.SIMPLEARR[1,2] := 4; END_FUNCTION_BLOCK

12.1.3 ARRAY 类型变量的赋值(Value Assignments with Variables of

the Type ARRAY)

数组包含 1 至 6 维,且包含全部为同类型的元素。将数组赋值给变量有两种方法。能够引用完整

数组或一个数组元素。

赋值一个完整数组(Assigning a Complete Array)

当元素的数据类型和数组界限(最低和最高的可能的数组索引)相匹配时,能够将一个完整数组赋

Page 146: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

138

值给另一个数组。如果是这样,在赋值符后指定数组的标识符。下面的赋值是有效的: arrname_1 := arrname_2 ; 备注(Note) 引起注意的是常量不能赋值给完整数组。

数组元素的赋值(Assigning a Component of an Array)

用数组名后跟在方括号内的适当的索引值来寻地数组的单个元素。每维一个索引,他们用逗号分

开并处于同一方括号内。索引必须是数据类型 INT 的算术表达式。 要达成对一个允许的元素的赋值,省去数组名称后的方括号内右边的索引。用此方法,取得数组

的子集,其维数等于省去的索引数。下面的赋值是有效的: arrname_1[ i ] := arrname_2[ j ] ; arrname_1[ i ] := expression ; identifier_1 := arrname_1[ i ] ;

例子(Example)

FUNCTION_BLOCK FB3 VAR SETPOINTS :ARRAY [0..127] OF INT ; PROCVALS :ARRAY [0..127] OF INT ; CRTLLR : ARRAY [1..3, 1..4] OF INT ; // 声明一个有 3 行 4 列的矩阵(二维数组) CRTLLR_1 : ARRAY [1..4] OF INT ; // 声明一个有 4 个元素的向量(一维数组) END_VAR BEGIN // 完整数组的赋值 SETPOINTS := PROCVALS ; // 将一个向量赋值给数组 CRTLLR 的第二行 CRTLLR[2] := CRTLLR_1 ; // 数组元素的赋值 CRTLLR [1,4] := CRTLLR_1 [4] ; END_FUNCTION_BLOCK

12.1.4 STRING 数据类型变量的赋值(Value Assignments with

Variables of the Data Type STRING)

数据类型 STRING 的变量包含一个最多 254 个字符的字符串。STRING 数据类型的变量能够被赋

值给同类型的另一个变量。下面的赋值是有效的: stringvariable_1 := stringconstant; stringvariable_1 := stringvariable_2 ;

Page 147: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

139

例子(Example)

FUNCTION_BLOCK FB3 VAR DISPLAY_1 : STRING[50] ; STRUCTURE1 : STRUCT DISPLAY_2 : STRING[100] ; DISPLAY_3 : STRING[50] ; END_STRUCT ; END_VAR BEGIN // 将常量赋值给 STRING 变量 DISPLAY_1 := 'Error in module 1' ; // 将结构元素赋值给 STRING 变量 DISPLAY_1 := STRUCTURE1.DISPLAY_3 ; // 串变量之间的赋值 If DISPLAY_1 <> STRUCTURE1.DISPLAY_3 THEN DISPLAY_1 := STRUCTURE1.DISPLAY_3 ; END_IF; END_FUNCTION_BLOCK

12.1.5 DATE_AND_TIME 类型变量的赋值(Value Assignments with

Variables of the Type DATE_AND_TIME)

数据类型 DATE_AND_TIME 为日期和时间定义一个有 64 位 (8 字节 )的一个区域。每个

DATE_AND_TIME 数据类型的变量均能用另一个同类型变量或常量来赋值。下面的赋值是有效

的: dtvariable_1 := date and time constant; dtvariable_1 := dtvariable_2 ;

例子(Example)

FUNCTION_BLOCK FB3 VAR TIME_1 : DATE_AND_TIME ; STRUCTURE1 : STRUCT TIME_2 : DATE_AND_TIME ; TIME_3 : DATE_AND_TIME ; END_STRUCT ; END_VAR BEGIN // 将一个常量赋值给 DATE_AND_TIME 变量

Page 148: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

140

TIME_1 := DATE_AND_TIME#1995-01-01-12:12:12.2 ; STRUCTURE1.TIME_3 := DT#1995-02-02-11:11:11 ; // 将一个结构元素赋值给 DATE_AND_TIME 变量 TIME_1 := STRUCTURE1.TIME_2 ; // DATE_AND_TIME 变量间的赋值 If TIME_1 < STRUCTURE1.TIME_3 THEN TIME_1 := STRUCTURE1.TIME_3 ; END_IF ; END_FUNCTION_BLOCK

12.1.6 内存区域中绝对变量的赋值(Value Assignments with Absolute

Variables for Memory Areas)

绝对变量引用全范围内的 CPU 内存区域。能够用三种方式存取这些区域: 绝对存取方式 索引存取方式 符号存取方式 绝对变量的语法(Syntax of Absolute Variables)

例子(Example)

FUNCTION_BLOCK FB3 VAR STATUSWORD1 : WORD ; STATUSWORD2 : BOOL ; STATUSWORD3 : BYTE ; STATUSWORD4 : BOOL ; ADDRESS : INT ; END_VAR BEGIN ADDRESS := 10 ; // 将一个输入字赋值给一个变量(简单存取) STATUSWORD1 := IW4 ; // 将一个变量赋值给输出位(简单存取) a1.1 := STATUSWORD2 ; // 将一个输入字赋值给一个变量(索引存取方式) STATUSWORD3 := IB[ADDRESS] ; // 将一个输入位赋值给一个变量(索引存取方式)

Page 149: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

141

FOR ADDRESS := 0 TO 7 BY 1 DO STATUSWORD4 := e[1, ADDRESS] ; END_FOR ; END_FUNCTION_BLOCK

12.1.7 共享变量的赋值(Value Assignments with Shared Variables)

也能够通过将一个值指定给同类型的变量来存取数据里的数据。能够将全局变量指定给一个同类

型的变量或表达式。存取这些方式: 结构化存取方式 绝对存取方式 索引存取方式

DB 变量的语法(Syntax of the DB Variable)

例子(Example)

FUNCTION_BLOCK FB3 VAR CRTLLR_1 : ARRAY [1..4] OF INT ; STATUSWORD1 : WORD ; STATUSWORD2 : ARRAY [0..10] OF WORD ; STATUSWORD3 : INT ; STATUSWORD4 : WORD ; ADDRESS : INT ; END_VAR VAR_INPUT ADDRESSWORD : WORD ; END_VAR BEGIN // 将 DB11 的字 1 赋值给一个变量(简单存取) STATUSWORD1 := DB11.DW1 ; // 将变量"NUMBER"指定给矩阵的第 1 行第 1 列的数组元素(结构化存取方式): CRTLLR_1[1] := DB11.NUMBER ; // 将结构"NUMBER1"的结构元素"NUMBER2"赋值给状态变量的 word3 STATUSWORD3 := DB11.NUMBER1.NUMBER2 ; // 用索引地址将 DB11 中的一个字赋值给一个变量(索引存取方式) FOR ADDRESS := 1 TO 10 BY 1 DO

Page 150: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

142

STATUSWORD2[ADDRESS] := DB11.DW[ADDRESS] ; // 这儿输入参数 ADDRESSWORD 作为 DB 号,且索引 ADDRESS 用来指定在 DB 中的字地

址 STATUSWORD4 := WORD_TO_BLOCK_DB(ADDRESSWORD).DW[ADDRESS] ; END_FOR ; END_FUNCTION_BLOCK

12.2 控制语句

12.2.1 控制语句概述(Overview of Control Statements)

选择语句(Selective Statements)

选择语句让你支配在分支里的语句序列的执行。 分支类型 功能 IF 语句 IF 语句让你根据条件是 TRUE 或 FALSE 来支配两个分支之一的程序运行。 CASE 语句 CASE 语句让你基于一个变量的值来支配 n 个分支之一的程序运行。

循环(Loops)

用重复语句能够控制循环执行。重复语句说明程序部分依据某种条件进行重复。 循环类型 功能 FOR 语句 控制变量保持在指定值范围内时重复语句序列 WHILE 语句 当执行条件满足时重复语句序列 REPEAT 语句 重复语句序列直到终止条件成立

程序跳转(Program Jump)

程序跳转意味着立即跳到目标位置,且在同块中的不同语句。 跳转类型 功能 CONTINUE 语句 用来终止当前循环的执行 EXIT 语句 不管终止条件成立与否,用来在任意点退出循环 GOTO 语句 引起程序立即跳转到指定标号 RETURN 语句 引起程序退出当前块

12.2.2 条件(Conditions)

条件可是比较表达、逻辑表达式或是算术表达式。其是 BOOL 类型,有 TRUE 或是 FALSE 值。

如果结果不是 0 则算术表达式为 TRUE,结果为 0 时则为 FALSE。下面是条件的例子: 形式 举例 比较表达式 TEMP > 50

COUNTER <= 100

Page 151: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

143

CHAR1 < 'S' 比较和条件表达式 (ALPHA <> 12) AND NOT BETA 布尔地址 I 1.1 算术表达式 ALPHA = (5 + BETA)

12.2.3 IF 语句(IF Statements)

IF 语句是条件语句。它提供一个或多个选项,且选择其语句部分之一(或无)执行。 条件语句的执行是给指定逻辑表达式求值。如果表达式的值是 TRUE 则条件成立,如果是 FALSE则不成立。

语法(Syntax)

一个 IF 语句按下列规则执行: 逻辑表达式=TRUE 则第一部分语句序列执行。其余的语句序列不执行。 如果布尔表达式=TRUE 不成立,则执行由 ELSE 引导的语句序列(或者如果 ELSE 分支不存

在则无语句被执行)。 可以存在任意数量的 ELSIF 语句。 备注(Note) 用一个或多个 ELSEIF 分支具有跟在一个有效表达式后的逻辑表达式不再求值,与 IF 语句序列

形成对比。而且减少程序的运行时间。

例子(Example)

IF I1.1 THEN N := 0 ; SUM := 0 ; OK := FALSE ; // 将 OK 标志设置为 FALSE ELSIF START = TRUE THEN N := N + 1 ; SUM := SUM + N ;

Page 152: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

144

ELSE OK := FALSE ; END_IF ;

12.2.4 CASE 语句(CASE Statement)

CASE 语句用来选择几个分支程序部分之一。选择是基于选择表达式当前值的。

语法(Syntax)

CASE 语句按下列规则执行: 选择表达式必须返回一个整数类型的值。 当 CASE 语句被处理时,程序检查是否选择表达式的值包含在指定的值表之中。如果找到匹

配项,列表指定的语句部分将被执行。 如果没有发现匹配项,程序选择 ELSE 后面的语句,或者如果 ELSE 分支不存在则无语句可

执行。

值表(Value List)

包含允许的选择表达式的值。

下列规则应用于值表: 每个值表用常量、常量表或常量范围开始。 值表中的值必须是整数类型的。 每个值只能出现一次。

Page 153: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

145

值(Value)

值有下图所示的语法:

例子(Example) CASE TW OF 1 : DISPLAY:= OVEN_TEMP; 2 : DISPLAY:= MOTOR_SPEED; 3 : DISPLAY:= GROSS_TARE; QW4 := 16#0003; 4..10: DISPLAY:= INT_TO_DINT (TW); QW4 := 16#0004; 11,13,19: DISPLAY:= 99; QW4 := 16#0005; ELSE: DISPLAY := 0; TW_ERROR := 1; END_CASE ;

12.2.5 FOR 语句(FOR Statement)

FOR 语句在控制变量处于指定的值范围内时用来重复语句序列。控制变量必须是 INT 或 DINT 类

型的本地变量的标识符。FOR 循环的定义包括一个初始值和一个终止值的说明。两个值必须与控

制变量是同类型。

语法(Syntax)

FOR 语句如下执行: 在循环的开始。控制变量设置为初始值(初始化赋值),每次循环重复,其增加(正增量)或减少

Page 154: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

146

(负增量)一个增量,直到达到终止值。 接着循环的每次运行,检查条件(终止值达到)证实是否满足。如果条件满足,语句序列被执

行,否则跳过循环及其语句序列。

规则(Rules)

FOR 语句的规则: 控制变量只能是 INT 或 DINT 数据类型。 能够省去语句 BY [增量]。如果不指定增量,则自动指定为+1。

初始赋值(Initial Assignment)

控制变量的初始值有下列语法。在赋值左边的简单变量必须是数据类型 INT 或 DINT。

有效的初始赋值的例子: FOR I := 1 TO 20 FOR I := 1 TO (START + J)

终止值和增量(Final Value and Increment)

能够为终止值和所要求的增量写一个基本表达式。此基本表达式有下列语法:

能够省去语句 BY [increment]。如果没指定增量,则自动指定为+1。 初始值、终止值和增量是表达式(见"表达式、运算符和地址")。当 FOR 语句执行时,起先对他们

进行求值。 循环执行后,不允许对终止值和增量值进行更改。

例子(Example)

FUNCTION_BLOCK FOR_EXA

Page 155: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

147

VAR INDEX : INT ; IDWORD : ARRAY [1..50] OF STRING; END_VAR BEGIN FOR INDEX := 1 TO 50 BY 2 DO IF IDWORD [INDEX] = 'KEY' THEN EXIT; END_IF; END_FOR; END_FUNCTION_BLOCK

12.2.6 WHILE 语句(WHILE Statement)

WHILE允许由执行条件控制的循环地执行语句序列。执行条件根据逻辑表达式的规则构成。

语法(Syntax)

WHILE 语句根据下列规则执行: 在循环体的重复之前,求值执行条件。 执行条件值为 TRUE(真)时,跟在 DO 后的循环体不断重复。 一旦值为 FALSE,就跳过循环体并执行循环后面的语句。

例子(Example)

FUNCTION_BLOCK WHILE_EXA VAR INDEX: INT ; IDWORD: ARRAY [1..50] OF STRING ; END_VAR BEGIN INDEX := 1 ; WHILE INDEX <= 50 AND IDWORD[INDEX] <> 'KEY' DO INDEX := INDEX + 2; END_WHILE ; END_FUNCTION_BLOCK

Page 156: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

148

12.3.7 REPEAT 语句(REPEAT Statement)

REPEAT语句引起在REPEAT和UNTIL之间的语句序列的重复执行,直到终止条件产生。终止条件

根据逻辑表达式的规则而形成。

语法(Syntax)

循环体已经执行之后求值条件。意味着当循环开始时循环体至少执行一次,不管终止条件是否成

立。

例子(Example)

FUNCTION_BLOCK REPEAT_EXA VAR INDEX : INT ; IDWORD : ARRAY [1..50] OF STRING ; END_VAR BEGIN INDEX := 0 ; REPEAT INDEX := INDEX + 2 ; UNTIL INDEX > 50 OR IDWORD[INDEX] = 'KEY' END_REPEAT ; END_FUNCTION_BLOCK

12.2.8 CONTIUNE 语句(CONTINUE Statement) CONTIUNE 语句用来终止循环语句(FOR, WHILE 或 REPEAT)的当前重复的执行。

语法(Syntax)

CONTINUE 语句依据下列规则执行: 此语句立即终止循环体的执行。 依据循环重复的条件是否满足,循环体再次执行或重复语句已经执行,立即执行接下来的语

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

Page 157: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

149

例子(Example)

FUNCTION_BLOCK CONTINUE_EXA VAR INDEX :INT ; ARRAY :ARRAY[1..100] OF INT ; END_VAR BEGIN INDEX := 0 ; WHILE INDEX <= 100 DO INDEX := INDEX + 1 ; // If ARRAY[INDEX] is equal to INDEX, // then ARRAY [INDEX] is not changed: IF ARRAY[INDEX] = INDEX THEN CONTINUE ; END_IF ; ARRAY[INDEX] := 0 ; // 更多语句 END_WHILE ; END_FUNCTION_BLOCK

12.2.9 EXIT 语句(EXIT Statement)

EXIT 语句用来在任意点退出循环(FOR, WHILE or REPEAT),而不管终止条件是否满足。

语法(Syntax)

EXIT 语句依据下列规则执行: 此语句引起立即退出 exit 语句周围的循环语句。 在循环之后(如 END_FOR 之后)的程序继续执行。

例子(Example)

FUNCTION_BLOCK EXIT_EXA VAR INDEX_1 : INT ; INDEX_2 : INT ; INDEX_SEARCH : INT ;

Page 158: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

150

IDWORD : ARRAY[1..51] OF STRING ; END_VAR BEGIN INDEX_2 := 0 ; FOR INDEX_1 := 1 TO 51 BY 2 DO // 如果 IDWORD[INDEX_1]等于'KEY',则退出 FOR 循环: IF IDWORD[INDEX_1] = 'KEY' THEN INDEX_2 := INDEX_1 ; EXIT ; END_IF ; END_FOR ; // The following value assignment is made // after executing EXIT or after the // regular end of the FOR loop: INDEX_SEARCH := INDEX_2 ; END_FUNCTION_BLOCK

12.2.10 GOTO 语句(GOTO Statement)

用 GOTO 语句能够执行程序跳转。此引起立即跳转到指定标号,为此而到同块中不同的语句。 GOTO 语句应只用在特定情况,如出错管理。根据结构化编程规则,不应使用 GOTO 语句。

语法(Syntax)

这里,标号是在一个在 LABEL/END_LABEL 声明部分的标号。标号引出 GOTO 语句后下一步执

行的语句。 如果使用 GOTO 语句,记住以下规则: 跳转的目标必须在同一个块内。 跳转的目标必须是唯一的标记。 跳入循环是不可能的。从循环跳出则是可能的。

例子(Example)

FUNCTION_BLOCK GOTO_EXA VAR INDEX : INT ; A : INT ; B : INT ; C : INT ; IDWORD : ARRAY[1..51] OF STRING ;

Page 159: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

151

END_VAR LABEL LAB1, LAB2, LAB3 ; END_LABEL BEGIN IF A > B THEN GOTO LAB1 ; ELSIF A > C THEN GOTO LAB2 ; END_IF ; // . . . LAB1: INDEX := 1 ; GOTO LAB3 ; LAB2: INDEX := 2 ; // . . . LAB3: // . . .

12.2.11 RETURN 语句(RETURN Statement)

RETURN 语句退出当前活动块(OB, FB, FC),且返回调用块或当 OB 退出时,操作系统。

语法(Syntax)

备注(Note) 在逻辑块的代码部分或数据块声明部分结束处的 RETURN语句是多余的,因为此是自动执行的。

12.3 功能和功能块的调用

12.3.1 调用和参数传递(Call and Parameter Transfer)

调用功能和功能块(Calling FCs and FBs)

要想容易地阅读和刷新用户程序,应将程序的各个职能分为通过功能块(FBs)和功能(FCs)执

行的较小的单个任务。从 S7-SCL 块能够调用其他的功能块和功能。 能够调用以下块: 用 SCL 创建的功能块和功能

Page 160: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

152

用其他 STEP 7 语言(LAD, FBD, STL)创建的功能块和功能 在 CPU 操作系统中可用的系统功能(SFCs)和系统功能块(SFBs)。

参数传递的基本原理(Basic Principle of Parameter Transfer)

功能或功能块被调用时,数据在调用与被调用块之间交换。在被调用块的接口中定义了块工作的

参数。这些参数被当作形式参数。它们纯粹是当块被调用时传递到块的参数的“占位符”。传递到

块的参数被当作实际参数。

参数传递的语法(Syntax of Parameter Transfer)

要传递的参数必须按照参数表的格式在调用中说明。参数放在括号内,多个参数用逗号分开。 在下面这个功能调用的例子中,说明了一个输入参数、一个输入/输出参数和一个输出参数。

参数用赋值形式来指定。赋值将一个值(实际参数)指定给在被调用块的声明部分定义的参数(形式

参数)。

12.3.2 调用功能块(Calling Function Blocks)

12.3.2.1 调用功能块(FB 或 SFB)(Calling Function Blocks (FB or SFB))

当调用功能块时,能够使用共享实例数据块和当前活动的实例数据块的本地实例区域。 用本地实例调用一个功能块与用共享实例调用在数据存贮的方法上不同。此时数据不保存地特定

的数据块,但在产生调用的功能块的实例数据块里。

Page 161: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

153

语法(Syntax)

作共享实例调用(Call as a Shared Instance)

通过说明以下内容在一个调用语句中进行调用: 功能块或系统功能块的名称(FB 或 SFB 的标识符), 实例数据块(DB 标识符), 提供的参数(FB 参数)。 对于共享实例的函数调用能够是绝对方式的或符号方式的。

作本地实例调用 Call as a Local Instance

通过说明以下内容在调用语句中进行调用: 本地实例名称(标识符) 提供参数(FB 参数) 对于本地实例的调用总是符号方式的。必须在调用块的声明部分声明符号名。

12.3.2.2 提供功能块参数(Supplying FB Parameters)

调用一个功能块(作为共享的或本地实例)时,必须提供以下参数:

Page 162: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

154

输入参数 输入/输出参数 当调用一个功能块时,输出参数不必说明。

对定义的 FB 参数赋值的语法(Syntax of a Value Assignment for Defining FB Parameters)

调用共享的或本地实例时,FB 参数说明的语法是一样的。

提供参数时应用以下规则: 参数能够以任意顺序。 实际参数和形式参数的数据类型必须匹配。 用逗号分开赋值。 在功能块调用时输出赋值是不可能的。声明的输出参数的值存贮在实例数据中。在那它能够

被所有功能块存取。要读取输出数据,必须在功能块中定义存取。 记住ANY数据类型和POINTER(指针)数据类型的特殊性能。

执行块之后的结果(Result after Executing the Block)

执行块之后: 传递的实际参数不改变。 传递的和修改的输入/输出参数的值被修订;基本数据类型的输入/输出参数例外。 输出参数能够被调用块从共享实例数据块或本地实例区读取。

例子(Example)

带一个输入和一个输入/输出参数赋值的调如下: FB31.DB77(I_Par:=3, IO_Par:=LENGTH);

12.3.2.3 输入赋值(FB) Input Assignment (FB)

输入赋值将实际参数指定给形式参数。功能块不能改变这些实际参数。实际输入参数的赋值是可

选的。如果没指定实际参数,最后一次调用的值被保留。 可能的实际参数如下: 实际参数 描述 表达式 算术、逻辑或比较表达式

常量 扩展变量

定时器/计数器标识符 当块被处理时,定义一个要用的特定定时器和计数器

Page 163: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

155

块标识符 将一个特定的要用的块定义作一个输入参数。在输入参数声明中指定

块的类型(FB, FC 或 DB)。 当指定参数值时,要指定块号。能够用绝对方式或符号形式来指定。

语法(Syntax)

12.3.2.4 输入/输出赋值(FB) In/Out Assignment (FB)

输入/输出用来将实际参数指定给形式输入/输出参数。被调用的功能块能够修改输入/输出参数。

参数的新值——处理功能块的结果写回实际参数。原始值被覆盖。 如果在被调用的功能块中声明了输入/输出参数,当首次调用块时,他们必须提供值。再次执行时,

可选指定实际值。对于基本数据类型的输入/输出参数,当块被调用时如果形式参数没提供值,实

际参数没有修订。 因为作为输入/输出参数指定的实际参数在功能块执行时能够被改变,故它必须是一个变量。 实际参数 说明 扩展变量 下列类型的扩展变量是可能的:

简单变量和参数 存取到绝对变量 存取到数据块 函数调用

语法(Syntax)

备注(Note) 特殊规则应用于于为数据类型ANY和POINTER提供值。 以下不能用作非基本数据类型的输入/输出参数的实际参数:

- 功能块输入/输出参数 - 函数参数

Page 164: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

156

12.3.2.5 读取输出值(FB 调用) Reading Output Values (FB Call)

被调用的块执行后,输出参数能够从共享实例块或本地实例区用一个赋值语句来读取。

例子(Example)

RESULT:= DB10.CONTROL;

12.3.2.6 作为共享实例调用的举例(Example of a Call as a Shared Instance)

下面的例子中显示了带 FOR 循环的功能块的例子。这些例子假定在符号表中为 FB17 声明了符号

TEST。

功能块(Function Block)

FUNCTION_BLOCK TEST VAR_INPUT FINALVAL : INT; // 输入参数 END_VAR VAR_IN_OUT IQ1 : REAL; // 输入/输出参数 END_VAR VAR_OUTPUT CONTROL : BOOL; // 输出参数 END_VAR VAR INDEX : INT; END_VAR BEGIN CONTROL :=FALSE; FOR INDEX := 1 TO FINALVAL DO IQ1 :=IQ1*2; IF IQ1 > 10000 THEN CONTROL := TRUE; END_IF; END_FOR; END_FUNCTION_BLOCK

调用(Call)

要调用功能块,能够选择以下变体之一。其假设 VARIABLE1 已经在调用块作为一个实际变量声

明。

Page 165: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

157

// 绝对函数调用, 共享实例: FB17.DB10 (FINALVAL:=10, IQ1:=VARIABLE1); // 符号调用, 共享实例: TEST.TEST_1 (FINALVAL:=10, IQ1:= VARIABLE1);

结果(Result):

块执行之后,输入/输出参数的计算值 IQ1 在 VARIABLE1 是可用的。

读取输出值(Reading an Output Value)

下面两个例子说明读取输出参数 CONTROL 的两种可能方法: // 输出参数被存取 // 通过: RESULT:= DB10.CONTROL; // 也能够在其他功能块调用直接使用输出参数来提供输入参数: FB17.DB12 (INP_1:=DB10.CONTROL);

12.3.2.7 作为本地实例调用的举例(Example of a Call as a Local Instance)

带一个简单 FOR 循环的功能块作为“作为共享实例”的例子编程,假设符号 TEST 在符号表中为

FB17 已经声明。 功能块能如下调用,假设 VARIABLE1 在调用块作为一个实数变量已经声明。

调用(Call)

FUNCTION_BLOCK CALL VAR // 本地实例声明 TEST_L : TEST ; VARIABLE1 : REAL ; RESULT : BOOL ; END_VAR BEGIN . . . // 调用本地实例: TEST_L (FINALVAL:= 10, IQ1:= VARIABLE1) ;

读取输出值(Reading an Output Value)

输出参数 CONTROL 能够如下读取:

Page 166: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

158

// 输出参数被存取 // 通过: RESULT := TEST_L.CONTROL ; END_FUNCTION_BLOCK

12.3.3 调用功能(Calling Functions)

12.3.3.1 调用功能(FC) Calling Functions (FC)

通过说明功能名(FC, SFC标识符)和参数表来调用功能。能够用绝对或符号形式指定标识返回值的

功能名称: FC31 (X1:=5, Q1:=Checksum) ; // 绝对形式 DISTANCE (X1:=5, Q1=:Checksum) ; // 符号形式 调用之后,功能的结果可用作为返回值或作为输出和输入/输出参数(实际参数)。

语法(Syntax)

备注(Note) 如果在 S7-SCL 调用功能并不提供返回值,这导致错误的用户程序执行: 用 S7-SCL 编程的功能,提供了返回值但相应语句并没有执行时,这种情况能够出现。 用 STL/LAD/FBD 编程的功能,如果功能编程时求提供返回值或相应的语句没有执行,这种情

况能够出现。

12.3.3.2 返回值(FC) Return Value (FC)

对比功能块,功能提供一个结果当作返回值。基于这个原因,功能能够被子当作地址来对待(VOID类型的功能除外)。 功能计算与功能有同样名称的返回值,且将其返回给调用它的块。在那里,值代替功能调用。 例如,在下面的赋值中,DISTANCE 功能被调用,且结果赋值给 LENGTH 变量。 LENGTH:= DISTANCE (X1:=-3, Y1:=2); 返回值能够用在下面的功能或功能块元素: 在一个赋值语句中, 在一个逻辑、算术或比较表达式或 作为更进一步的功能块或功能调用的参数。

Page 167: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

159

备注(Note) 如果功能有返回值 ANY,至少有一个输入或输入/输出参数也必须是 ANY 类型。如果定义了不

只一个 ANY 类型参数,必须用同类型的实际参数提供给他们(如:INT、DINT 和 REAL)。然后,

返回值自动使用在这些类型中的最大类型。 数据类型 STRING 的最大长度能够从 254 个字符减少到任意长度。

12.3.3.3 功能的参数(FC Parameters)

对比功能块,功能没有任何他们保存参数值的内存。在功能激活时,本地数据只中临时地贮存。

由于这个原因,当调用功能时,所有在功能声明部分定义的形式输入、输入/输出和输出参数必须

赋予实际参数。

语法(Syntax)

规则(Rules)

用于提供参数的规则: 能够以任意顺序赋值。 形式和实际参数的数据类型必须匹配。 形式和实际参数的数据类型必须匹配。

例子(Example)

带为输入、输出和输入/输出参数赋值的调用如下: FC32 (E_Param1:=5,D_Param1:=LENGTH, A_Param1:=Checksum)

12.3.3.4 输入赋值(FC) Input Assignment (FC)

使用输入赋值,给被调用的功能的形式输入参数指定了值(实际参数)。功能能够用这些实际参数

Page 168: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

160

工作,但不能改变他们。对比功能块的调用,功能调用的赋值是不可选的。 能够用输入赋值指定下列实际参数: 实际参数 说明 表达式 表达式相当于一个值和地址的内容和运算符。

可能有下列形式的表达式: 算术、逻辑或比较表达式 常量 扩展变量

定时器/计数器名 当块被处理时定义一个特定要用的的定时器或计数器。 块名 将一个特定的要用的块定义为输入参数。在输入参数说明中说明了块的

类型(FB, FC 或 DB)。指定参数时,指定块地址。既能够用绝对地址也

能够用符号地址。

语法(Syntax)

备注(Note) 对于非基本类型的形式输入参数,功能块输入/输出参数和功能参数不允许作为实际参数。记住

数据类型ANY和POINTER的特殊性能。

12.3.3.5 输出和输入/输出赋值(FC) Output and In/Out Assignment (FC)

在输出赋值中,将调用块的变量指定给执行功能将写入的输出值。输入/输出赋值用来指定一个实

际值给输入/输出参数。 在输出和输入/输出赋值中的实际参数必须是变量,因为功能要将值写入参数。由于这个原因,输

入参数不能在输入/输出赋值中指定(不能写入值)。这意味着在输出和输入/输出参数中只能够指定

扩展变量。 实际参数 说明 扩展变量 可能有下列类型的扩展变量:

简单变量和参数 存取到绝对变量 存取到数据块 功能调用

Page 169: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

161

语法(Syntax)

备注(Note) 下列实际参数不允许用作形式输出和输入/输出参数: 功能/功能块的输入参数 功能块的非基本数据类型的输入/输出参数 功能的非基本数据类型的输入/输出和输出参数 牢记数据类型ANY和POINTER的特殊性。 串数据类型的最大长度能够从 254 个字符减少到任意长度。

12.3.3.6 功能调用举例(Example of a Function Call)

功能被调用(Function to be Called)

计算在使用笛卡尔坐标系统的同一平面中两点(X1,Y1)和(X2,Y2)之间距离的功能DISTANCE可以

是下面的形式(此例假设符号 DISTANCE 在符号表中为 FC37 已经声明)。 FUNCTION DISTANCE: REAL // 符号 VAR_INPUT X1 : REAL; X2 : REAL; Y1 : REAL; Y2 : REAL; END_VAR VAR_OUTPUT Q2 : REAL; END_VAR BEGIN DISTANCE := SQRT( (X2-X1)**2 + (Y2-Y1)**2 ); Q2 := X1+X2+Y1+Y2; END_FUNCTION

Page 170: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

162

调用块(Calling Block)

下例显示更多功能值的使用的可选择的形式: FUNCTION_BLOCK CALL VAR LENGTH : REAL ; CHECKSUM : REAL ; RADIUS : REAL; Y : REAL; END_VAR BEGIN . . . // 在赋值语句中调用: LENGTH := DISTANCE (X1:=3, Y1:=2, X2:=8.9, Y2:= 7.4, Q2:=CHECKSUM) ; // 在算术或逻辑表达式中调用,如: Y := RADIUS + DISTANCE (X1:=-3, Y1:=2, X2:=8.9, Y2:=7.4, Q2:=Checksum) // 用来为进一步的被调用的块提供参数 FB32.DB32 (DIST:= DISTANCE (X1:=-3, Y1:=2, X2:=8.9, Y2:=7.4), Q2:=Checksum) . . . END_FUNCTION_BLOCK

12.3.4 隐式定义参数

12.3.4.1 输入参数 EN(Input Parameter EN)

每一个功能块和每一个函数都有隐式定义的输入参数 EN。EN 是 BOOL 数据类型,且被贮存在临

时块数据区域。如果 EN 为 TRUE,被调用的块执行,否则不会执行。给参数 EN 提供一个值是

可选的。然而,记住它不必在块或函数的声明部分声明。 因为 EN 是一个输入参数,故不能在块内改变 EN。 备注(Note) 如果没被调用(EN : FALSE),函数的返回值是不定的。

例子(Example)

FUNCTION_BLOCK FB57 VAR MY_ENABLE : BOOL ; Result : REAL; END_VAR // . . . BEGIN // . . . MY_ENABLE := FALSE ;

Page 171: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

163

// 调用函数并提供 EN 参数: Result := FC85 (EN:= MY_ENABLE, PAR_1:= 27) ; // FC85 不会执行因为 MY_ENABLE 在前面设置为 FALSE END_FUNCTION_BLOCK

12.3.4.2 输出参数 ENO(Output Parameter ENO)

每一个功能块和每一个函数都有隐式定义的BOOL数据类型的输入参数ENO。被贮存在临时块数

据区域。一旦块被执行,用ENO输入OK标志的当前值。 块被调用之后,能够立即检查ENO的值来看看在块中的所有操作是否正确运行还是产生了错误。

例子(Example)

// 功能块调用: FB30.DB30 ([Parameter supply]); // 检查被调用的块中的所有事情是否正确运行: IF ENO THEN // 所有均 OK // . . . ELSE // 错误产生, 故要求出错管理 // . . . END_IF;

Page 172: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

164

13 计数器和定时器

13.1 计数器

13.1.1 计数器函数(Counter Functions)

STEP 7 提供了几个标准计数器函数。能够无需事先定义在 S7-SCL 程序中使用这些计数器。必须

准确提供他们要求的参数。STEP 7 提供下列计数器函数: 计数器函数 含义 S_CU 向上计数

S_CD 向下计数

S_CUD 双向计数

13.1.2 调用计数器函数(Calling Counter Functions)

计数器函数像函数一样调用,而且函数标识符能够在任意处一个表达式中代替一个地址使用,函

数值的类型应与被置处兼容。 返回调用块的函数值(返回值)是按数据类型 WORD 的当前计数值(BCD 格式)。

绝对或动态调用(Absolute or Dynamic Call)

对于调用,能够键入一个作为计数器号的绝对值(如,C_NO:=C10)。然而此值在运行期间不能改

变。 代之绝对计数器号,能够指定一个 INT 数据类型的变量或常量。这种方式的优点是每次调用时能

够通过指定不同号码给变量或常量来调用计数器。 要做到动态调用,也能够指定一个 COUNTER 数据类型的变量。

例子(Examples)

// 绝对调用的例子: S_CUD (C_NO :=C12, CD :=I0.0, CU :=I0.1, S :=I0.2 & I0.3, PV :=120, R :=FALSE, CV :=binVal, Q :=actFlag); // 动态调用的例子: 在 FOR 循环的每个分支,调用了不同的计数器: FUNCTION_BLOCK COUNT VAR_INPUT

Page 173: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

165

Count: ARRAY [1..4] of STRUCT C_NO : INT; PV : WORD; END_STRUCT; . . END_VAR . . FOR I:= 1 TO 4 DO S_CD(C_NO:=Count[I].C_NO, S:=true, PV:= Count[I].PV); END_FOR; // 用 COUNTER 数据类型的变量进行动态调用的例子: FUNCTION_BLOCK COUNTER VAR_INPUT MYCounter:COUNTER; END_VAR . . CurrVal:=S_CD (C_NO:=MyCounter,.....); 注(Note) 函数和参数名称在德语和英语助记符中都是一样的,只是计数器标识符不同(德语:Z,英语:

C)。

13.1.3 提供参数给计数器函数(Supplying Parameters for Counter

Functions)

下表提供计数器函数参数的概貌: 参数 数据类型 描述 C_NO COUNTER

INT 计数器号(计数器标识符);其范围视 CPU 而定

CD BOOL CD 输入:向下计数 CU BOOL CU 输入:向上计数 S BOOL 预置计数器输入 PV WORD 初始化计数器的值,在 0 到 999 之间(按 16#<值>用 BCD 格式

的值键入) R BOOL 复位输入 Q BOOL 输出:计数器状态 CV WORD 输出:二进制计数值 RET_VAL WORD BCD 格式的结果

Page 174: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

166

规则(Rules)

一旦固定存贮参数值(如,CD:=I0.0),当前状态下就不必指定他们的值。提供参数值注意下列通用

规则: 当调用函数时,必须提供标识符 C_NO 参数。代之以绝对计数器号(如 C12),也能够在调用

中指定一个 INT 类型的变量或常数,或一个 COUNTER 类型的输入参数。 至少参数 CU(向上计数)或参数 CD(向下计数)必须提供。 参数 PV(初始值)和 S(设定值)能够成对省略。 函数值总是 BCD 格式结果值。

例子(Example)

FUNCTION_BLOCK FB1 VAR CurrVal, binVal: word; actFlag : bool; END_VAR BEGIN CurrVal :=S_CD (C_NO:= C10, CD:=TRUE, S:=TRUE, PV:=100, R:=FALSE, CV:=binVal,Q:=actFlag); CurrVal :=S_CU (C_NO:= C11, CU:=M0.0, S:=M0.1, PV:=16#110, R:=M0.2, CV:=binVal,Q:=actFlag); CurrVal :=S_CUD(C_NO:= C12, CD:=I0.0, CU:=I0.1, S:=I0.2 &I0.3, PV:=120, R:=FALSE, CV:=binVal,Q:=actFlag); CurrVal :=S_CD (C_NO:= C10, CD:=FALSE, S:=FALSE, PV:=100, R:=TRUE, CV:=binVal,Q:=actFlag); END_FUNCTION_BLOCK

13.1.4 计数器值的输入和取得(Input and Evaluation of the Counter

Value)

要输入初始值或取得函数的结果 ,需要计数值内部表达式。计数值用 WORD 类型,其 0 到 11位包含 BCD 代码值,12-15 位没用。 当设置计数器,应指定写入计数器的值,值的范围为 0到 999;通过特定的操作:双向计数(S_CUD)、向上计数(S_CU)和向下计数(S_CD)在此范围内改变计数值。

格式(Format)

下图示意计数值的位结构:

Page 175: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

167

输入(Input)

十进制整数值:如 295 指定相应有效的 BCD 格式值。 采用 BCD 格式(按 16 进制输入):如 16#127

求值(Evaluation)

作为函数结果(WORD 类型):用 BCD 格式 作为输出参数 CV(WORD 类型):用二进制代码

13.1.5 向上计数(S_CU)

对于向上计数功能,只能执行增加计数操作.下表表明计数器如何工作: 操作 含义 向上计数 如果输入 CU 的信号状态从“0”变到“1”,并且计数值小于 999 时,计数值增

1。 设置计数器 当输入 S 的信号状态从“0”变到“1”,计数器用输入 PV 的值设置计数器。此

信号改变总是要求设置计数器。 复位 当输入 R=1 时,计数器被复位。复位计数器设置计数值为“0”。 查询计数器 如果计数值大于 0 查询状态,在输出 Q 返回“1”的信号状态。如果计数值等

于“0”,查询返回“0”。

13.1.6 向下计数(S_CD)

对于向下计数(S_CD)功能,只能够减数器功能。下表描述计数器如何工作: 操作 含义 向下计数 如果输入 CU 的信号状态从“0”变到“1”,并且计数值小于 999 时,计数

值减 1。 设置计数器 当输入 S 的信号状态从“0”变到“1”,计数器用输入 PV 的值设置计数器。

此信号改变总是要求设置计数器。 复位 当输入 R=1 时,计数器被复位。复位计数器设置计数值为“0”。 查询计数器 如果计数值大于 0 查询状态,在输出 Q 返回“1”的信号状态。如果计数

值等于“0”,查询返回“0”。

Page 176: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

168

13.1.7 双向计数(S_CUD)

对于双向计数(S_CUD)功能,能够执行向上和向下计数器操作。如果同时收到向上和向下计数脉

冲,两种操作均被执行,计数值保持不变。下表说明计数器如何工作: 操作 含义 向上计数 如果输入 CU 的信号状态从“0”变到“1”,并且计数值小于 999 时,计数

值增 1。 向下计数 如果输入 CU 的信号状态从“0”变到“1”,并且计数值小于 999 时,计数

值减 1。 设置计数器 当输入 S 的信号状态从“0”变到“1”,计数器用输入 PV 的值设置计数器。

此信号改变总是要求设置计数器。 复位 当输入 R=1 时,计数器被复位。复位计数器设置计数值为“0”。 查询计数器 如果计数值大于 0 查询状态,在输出 Q 返回“1”的信号状态。如果计数

值等于“0”,查询返回“0”。

13.1.8 计数器函数的例子

参数赋值(Parameter Assignment)

下表说明功能 S_CD 功能的参数赋值: 参数 说明 C_NO MyCounter: CD Input I0.0 S SET PV Initialvalue 16#0089 R Reset Q Q0.7 CV BIN_VALUE

例子(Example)

FUNCTION_BLOCK COUNT VAR_INPUT MYCOUNTER : COUNTER ; END_VAR VAR_OUTPUT RESULT : INT ; END_VAR VAR SET : BOOL ; RESET : BOOL ; BCD_VALUE : WORD ; // BCD 码计数值 BIN_VALUE : WORD ; // 二进制计数值

Page 177: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

169

INITIALVALUE : WORD ; END_VAR BEGIN Q0.0 := 1 ; SET := I0.2 ; RESET := I0.3 ; INITIALVALUE := 16#0089 ; // 向下计数 BCD_VALUE := S_CD (C_NO := MYCOUNTER, CD := I0.0 , S := SET , PV := INITIALVALUE, R := RESET , CV := BIN_VALUE , Q := Q0.7) ; // 输出参数的更多处理 RESULT := WORD_TO_INT (BIN_VALUE) ; QW4 := BCD_VALUE ; END_FUNCTION_BLOCK

13.2 定时器

13.2.1 定时器函数(Timer Functions)

定时器是程序的功能部件,其执行和监视时间控制功能。STEP 7 提供了几种标准定时器函数,能

够用在 S7 SCL 程序中: 定时器函数 说明 S_PULSE 脉冲定时器[上电延时断开] S_PEXT 扩展脉冲定时器[保持型上电延时断开] S_ODT 上电延时(闭合)定时器

S_ODTS 保持型上电延时(闭合)定时器

S_OFFDT 断电延时闭合定时器

13.2.2 调用定时器函数(Calling Timer Functions)

定时器函数像函数一样调用,函数标识符能够在任意点使用取代表达式中的一个地址,函数结果

的类型兼容被取代的地址。 返回到调用块的函数值(返回值)是数据类型 S5TIME 的时间值。

绝对和动态调用(Absolute or Dynamic Call)

在调用中,能够以定时器号键入一个 TIMER 数据类型的绝对值(如:T_NO:=T10),然而此值在运

行时不能修改。

Page 178: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

170

取代绝对数字,也能够指定一个 INT 类型的变量或常量。这种方法的优点是每次调用中能够动态

指派变量或常量一个不同的数字。 要做到动态调用,也能够指定一个 TIMER 类型的变量。

例子(Examples)

// 绝对调用的例子: CurrTime:=S_ODT (T_NO :=T10, S :=TRUE, TV :=T#1s, R :=FALSE, BI :=biVal, Q :=actFlag); // 动态调用的例子: 在 FOR 循环的每个分支,调用了不同的定时器函数: FUNCTION_BLOCK TIME VAR_INPUT MY_TIMER : ARRAY [1..4] of STRUCT T_NO : INT; TV : WORD; END_STRUCT; . . END_VAR . . FOR I:= 1 TO 4 DO CurrTime:= S_ODT(T_NO:=MY_TIMER[I].T_NO, S:=true, TV:= MY_TIMER[I].TV); END_FOR; // 使用 TIMER 数据类型变量的动态调用的例子: FUNCTION_BLOCK TIMER VAR_INPUT mytimer:TIMER; END_VAR . . CurrTime:=S_ODT (T_NO:=mytimer,.....); 注(Note) 函数名称在德语和英语中的助记符是一样的。

Page 179: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

171

13.2.3 提供参数合定时器函数(Supplying Parameters for Timer

Functions)

下表显示定时器参数的概貌: 参数 数据类型 描述 T_NO TIMER

INTEGER 定时器号标识,其范围依 CPU 而定。

S BOOL 启动输入 TV S5TIME 定时值(BCD 格式)的初始化 R BOOL 复位输入 Q BOOL 定时器的状态 BI WORD 余下时间值(二进制)

规则(Rules)

一旦参数被全局地存贮,在当前状态下就不必指定其值。提供参数值注意下列通用规则: 当调用函数时,标识 T_NO 的定时器参数必须提供。取代绝对定时号(如:T10)也能够在调用

中指定一个 INT 类型的变量或一个 TIMER 类型的输入参数。 参数 PV(初始值)和 S(启动)能够成对省略。 函数值总是用 S5TIME 格式的结果值。

例子(Example)

FUNCTION_BLOCK FB2 VAR CurrTime : S5time; BiVal : word; ActFlag : bool; END_VAR BEGIN CurrTime :=S_ODT (T_NO:= T10, S:=TRUE, TV:=T#1s, R:=FALSE, BI:=biVal,Q:=actFlag); CurrTime :=S_ODTS (T_NO:= T11, S:=M0.0, TV:= T#1s, R:=M0.1, BI:=biVal,Q:=actFlag); CurrTime :=S_OFFDT(T_NO:= T12, S:=I0.1 & actFlag, TV:= T#1s, R:=FALSE, BI:=biVal,Q:=actFlag); CurrTime :=S_PEXT (T_NO:= T13, S:=TRUE, TV:= T#1s, R:=I0.0, BI:=biVal,Q:=actFlag); CurrTime :=S_PULSE(T_NO:= T14, S:=TRUE, TV:= T#1s, R:=FALSE, BI:=biVal,Q:=actFlag); END_FUNCTION_BLOCK

Page 180: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

172

13.2.4 输入和取得时间值(Input and Evaluation of a Time Value)

要用 BCD 码输入初始值和取得函数结果,要求时间值的内部描述。时间值是 WORD 数据类型,

其 0 到 11 位包含 BCD 格式的时间值,12 和 13 位为时基,14 和 15 位没用。 在 1 个时基指定的周期内,用定时器读数减 1 个单位来修订时间(值)。定时器读数直到其值为 0一直在减。可能的时间范围为 0 到 9990 秒。

格式(Format)

下图说明时间值的位构成:

输入(Input)

能够装载下列格式的预定义时间值: 用复合时间格式 用十进制时间格式 在两种情况下时基均是自动选择的,且此值将舍入下一个此时基下的数字。

取值(Evaluation)

能够取得两种不同格式的结果: 作为函数结果(类型 S5TIME): 用 BCD 格式 作为输出参数(没带时基数据的 WORD 类型的时间值): 用二进制代码 时间值的时基(Time Base for Time Values) 要输入或取得时间值,要求一个时基(时间字的第 12 和 13 位)。时基定义时间值减去 1 个单

元的时间间隙。最小是 10ms,最大是 10s。 时基 时基的二进制代码 10 ms 00 100 ms 01 1 s 10 10 s 11 备注 一旦保存了作为同期的时间值,非时间周期的严格倍数部分的值将被舍去。对于要求的范围分

辨率太高的值将会四舍五入,以便要求的范围但不是要求的分辨率能够实现。

Page 181: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

173

13.2.5 脉冲定时器(S_PULSE) Start Timer as Pulse Timer (S_PULSE)

输出信号置为"1"的最大时间与编程的时间值一致。如果在定时器运行期间,输入信号出现“0”状态,则定时器置“0”;意思是定时器运行时未到期结束。

定时器功能怎样(How the Timer Functions)

下表显示了“脉冲定时器(pulse timer)”如何工作: 操作 说明 启动定时 当启动输入 S 的信号状态由 0 变到 1,“脉冲定时器”启动运行指定时间。

要使能定时器,总是要求信号改变。 运行说明 定时器按输入 TV 的时间值运行,直到编好的时间到达且输入 S=1。 运行中止 如果在时间未到前输入信号 S 从 1 变为 0,定时器将停止。 复位 当在定时器运行时复位输入(R)由“0”变为“1”,定时将复位。为此,定时

器读数和时基均复位到 0。如果定时大路没有运行,在输入 R 上的信号

状态 1 没有影响。 查询信号状态 在定时器运行时,输出 Q 为“1”的信号状态查询结果是“1”。如果定时器

中止了,对输出 Q 的信号状态查询结果为“0”。 查询当前定时器读数 使用函数值 S_PULSE 和在输出 BI 上能够查询到当前定时器读数。

13.2.6 脉冲扩展定时器(Start Timer as Extended Pulse Timer

(S_PEXT))

输出信号保持 1 在编好的时间内,而不论输入信号保持多久。触发启动脉冲,重新开始定时,输

出脉冲是扩展的(可重触发)。

定时器函数如何工作(How the Timer Functions)

下表显示了脉冲扩展定时器函数是如何工作的: 操作 含义

Page 182: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

174

启动时间 当在输入 S 的信号状态从 0 变到 1 时,脉冲入展定时器(S_PEXT)开始

运行指定时间。要使能定时器,总是要求信号改变。 复位时间计数器 在定时器运行中,如果在输入 S 的信号状态再次改变为 1,定时器将

重新启动指定时间值。 初始化运行时 定时器按在输入 TV 的值运行,直到到达编好的时间。 复位 定时器运行时,复位信号从 0 变为 1,时间将被重新设置。对此改变,

定时器读取和时基均复位到 0。如果定时器没有运行,输入 R 为的信

号状态为 1 时定时器不会运行。 查询信号状态 和定时器运行时间一样,查询在输出 Q 的信号状态为 1 而不管输入信

号的长短。 查询当前定时器读取值 能够在输出 BI 和并使用函数值 S_PEXT 查询当前时间值。

13.2.7 上电延时 (闭合 )定时器 Start Timer as On-Delay Timer

(S_ODT)

当程控时间到达且输入信号一直为 1 时,输出信号才从 0 变为 1;意思是说输出经过延时后才激

活。输入信号保持激活一段时间,(此时间)短于程序时间则输出不会出现 1。

定时功能如何工作(How the Timer Functions)

下表描述了上电延时定时器如何工作: 操作 说明 启动定时 当输入 S 信号状态从 0 变为 1 时,上电延时定时器启动指定时间。要使

能定时器,总是要求信号改变。 停止定时器 如果定时器运行时,输入 S 信号状态从 1 变为 0,定时器将停止。 运行说明 在输入 S=1 时,定时器继续用输入 TV 上的值运行。 复位 当定时器在运行时复位输入(R)由“0”变“1”,定时复位。为此,定时器读

数和时基均设置为 0。尽管定时器没有运行,当置 R=1 时,定时器也复

位。 查询信号状态 时间到达后没有错误且输入 S 一直为“1”时,输出 Q 为“1”售状态查询结

果为“1”。 如果定时器停止了,信号状态查询的结果总是“0”。 定时器设有运行且输入 S 的信号状态一直为“1”时,输出 Q 为“1”之后的

信号状态查询结果也为“0”。 查询当前定时器读数 当前时间值能够在输出 BI 和用函数值 S_ODT 来查询。

Page 183: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

175

13.2.8 保持型上电延时 (闭合 )定时器 (S_ODTS) Start Timer as

Retentive On-Delay Timer (S_ODTS)

当程控时间到达后,输出信号才从“0”变为“1”,而不管输入信号保持为“1”多久。

定时器函数如何工作(How the Timer Functions)

下表显示了“保持型上电延时(闭合)定时器”如何工作: 操作 说明 启动定时 当启动输入(S)上的信号状态由“0”变“1”,“保持型上电延时定时器”启动

一个指定的时间。要使能定时器,总是要求信号的改变。 复位定时器 在定时器运行时输入 S 从“0”变到“1”,则定时器将重启动指定的时间。 运行说明 如果输入 S 的信号状态在时间到达之前变为“0”,定时器按输入 TV 上的

值继续运行。 复位 如果复位输入(R)由"0"变"1",定时器将复位,而不管输入·的信号状态。 查询信号状态 定时到达后不管输入 S 的信号状态如何,输出 Q 上为“1”信号状态查询结

果为“1”。 查询当前定时器读数 当前时间值能够在输出 BI 上和使用函数值 S_ODTS 查询到。

13.2.9 断电延时(断开)定时器(S_OFFDT) Start Timer as Off-Delay

Timer (S_OFFDT)

在启动输入 S 上的信号状态由“0”变“1”时,输出 Q 设置为“1”。如果启动输入由“1”变“0”,定时器

启动。时间到达后输出才变为“0”。所以在一个延时之后输出取消。

定时器函数如何工作(How the Timer Functions)

下表显示了“断电延时定时器”如何工作:

Page 184: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

176

操作 说明 启动定时 当启动输入 S 由“1”变“0”时,“断电延时定时器”启动运行指定时间。使

能定时器总是要求信号发生改变。 重启定时器 当输入 S 的信号状态又由“1”变为“0”,定时器重新启动(正如下面的复

位)。 运行说明 定时器按输入 TV 指定的值运行。 复位 在定时器运行时,如果复位输入 R 由“0”变“1”,定时器将复位。 查询信号状态 如果输入 S=1 或定时器正在运行时,输出 Q 为“1”的信号状态查询结果

为“1”。 查询当前定时器读数 当前时间值能够在输出 BI 和用函数值 S_OFFDT 来查询。

13.2.10 定时器函数的例子 Example of Timer Functions

FUNCTION_BLOCK TIMER VAR_INPUT mytime : TIMER ; END_VAR VAR_OUTPUT result : S5TIME ; END_VAR VAR set : BOOL ; reset : BOOL ; bcdvalue : S5TIME ; // 时基和 BCD 码形式的保持值 binvalue : WORD ; // 二进制形式的时间值 initialvalue : S5TIME ; END_VAR BEGIN Q0.0 := 1; set := I0.0 ; reset := I0.1; initialvalue := T#25S ; bcdvalue := S_PEXT (T_NO := mytime , S := set , TV := initialvalue , R := reset , BI := binvalue , Q := Q0.7) ; // 更多输出参数的的处理 result := bcdvalue ; // 显示输出 QW4 := binvalue ; END_FUNCTION_BLOCK

Page 185: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

177

13.2.11 选择正确的定时器(Selecting the Right Timer)

下图提供了在本章中描述的五种不同定时器函数的概况。将助你选择最适合实际用途的定时器函

数。

Page 186: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

178

14 S7-SCL 的标准函数

14.1 数据类型转换函数

14.1.1 转换数据类型(Converting Data Types)

如果在逻辑运算中使用两个地址,必须确信两地址的数据类型兼容。如果地址是两种不同数据类

型,必须进行数据类型转换。在 S7-SCL 中有以下可能的数据类型转换: 隐式数据类型转换

数据类型按类划分。如果地址归属同一类,S7-SCL 进行隐式数据类型转换。编译器使用的

此功能归在“A 类转换函数”。 显式数据类型转换

如果地址不属于同一类,必须启用转换函数。为了允许显式数据类型转换,S7-SCL 提供一

些标准函数,按以下类别分类: - B 类转换函数 - 四舍五入和截取函数

14.1.2 隐式数据类型转换(Implicit Data Type Conversion)

表中定义的几类数据类型,编译器将按所显示的次序进行隐式数据类型转换。两地址的共同格式

总是取两数据类型定义之较大者——例如,BYTE 和 WORD 的共同格式是 INTEGER WORD。 记住在 ANY_BIT 类中数据类型转换结果中的前导位被置为 0。 分类 转换次序 ANY_BIT BOOL > BYTE > WORD > DWORD ANY_NUM INT > DINT > REAL

隐式数据类型转换的例子(Example of Implicit Data Type Conversion)

VAR PID_CTRLLER_1 : BYTE ; PID_CTRLLER_2 : WORD ; END_VAR BEGIN IF (PID_CTRLLER_1 <> PID_CTRLLER_2) THEN ... (* 在上面的 IF 语句中,PID_CTRLLER_1 被隐式地由 BYTE 转换为 WORD. *)

14.1.2.1 A 类转换函数(Conversion Functions Class A)

表中显示 A 类数据类型转换函数。函数被编译器隐式执行,然而,如果须要,也能够显式地说明。

其结果已定义。

Page 187: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

179

函数名 转换规则 BOOL_TO_BYTE 加前置 0 BOOL_TO_DWORD 加前置 0 BOOL_TO_WORD 加前置 0 BYTE_TO_DWORD 加前置 0 BYTE_TO_WORD 加前置 0 CHAR_TO_STRING 转换到包含同样字符的串(长度为 1) DINT_TO_REAL 按照 IEEE 标准转换到实数。值可能改变(由于实数的不同精度)。 INT_TO_DINT 负的输入参数用 16#FFFF 填充函数值的高位字,其他则用 0 填充。

值不变。 INT_TO_REAL 按 IEEE 标准转换到实数,值不变。 WORD_TO_DWORD 加前置 0

14.1.3 显式数据类型转换的标准函数(Standard Functions for

Explicit Data Type Conversion)

在"调用函数"里将找到函数调用的一般描述。 当调用转换函数时,记住以下几点: 输入参数:

每个数据类型转换函数只能有一个输入参数,因其是单参数函数,这无需说明。 函数值:

其结果总是函数值。 函数名:

A 类和 B 类概述中,函数名能够清楚地识别输入参数和函数值的数据类型。例如,函数

BOOL_TO_BYTE,输入参数的数据类型是 BOOL,函数值的数据类型是 BYTE。

14.1.3.1 B 类转换函数(Conversion Functions Class B)

下表显示了 B 类数据类型转换函数。函数必须显式说明。如果目标类型没有足够大,其结果也能

够是不确定的。 能够通过范围检查来检查这种情况,或通过在编译前选择“OK标志”选项进行系统检查。结果不确

定情况下,系统将OK标 设置为FALSE。 志

函数名 转换规则 OK BOOL_TO_INT WORD_TO_INT(BOOL_TO_WORD(x)) N BOOL_TO_DINT DWORD_TO_DINT(BOOL_TO_DWORD(x)) N BYTE_TO_BOOL 拷贝最后的有效位。 Y BYTE_TO_CHAR 拷贝位串。 N BYTE_TO_INT WORD_TO_INT(BYTE_TO_WORD(x)) N BYTE_TO_DINT DWORD_TO_DINT(BYTE_TO_DWORD(x)) N CHAR_TO_BYTE 拷贝位串。 N CHAR_TO_INT 输入参数的位串输入到函数值的低位字节,高位字节用 0 填充。 N DATE_TO_DINT 拷贝位串。 N DINT_TO_DATE 拷贝位串。 Y

Page 188: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

180

DINT_TO_DWORD 拷贝位串。 N DINT_TO_INT 拷贝符号位。输入参数的值被当作 INT 数据类型。如果值小于

-32768 或大于 32767,OK 变量设置为 FALSE。 Y

DINT_TO_TIME 拷贝位串。 N DINT_TO_TOD 拷贝位串。 Y DINT_TO_BOOL DWORD_TO_BOOL(DINT_TO_DWORD(x)) Y DINT_TO_BYTE DWORD_TO_BYTE(DINT_TO_DWORD(x)) Y DINT_TO_STRING DI_STRNG Y DINT_TO_WORD DWORD_TO_WORD(DINT_TO_DWORD(x)) y DWORD_TO_BOOL 拷贝最后的有效位。 Y DWORD_TO_BYTE 拷贝最后 8 个有效位。 Y DWORD_TO_DINT 拷贝位串。 N DWORD_TO_REAL 拷贝位串。 N DWORD_TO_WORD 拷贝最后 8 个有效位。 Y DWORD_TO_INT DINT_TO_INT (DWORD_TO_ DINT(x)) Y INT_TO_CHAR 拷贝位串。 Y INT_TO_WORD 拷贝位串。 N INT_TO_BOOL WORD_TO_BOOL(INT_TO_WORD(x)) Y INT_TO_BYTE WORD_TO_BYTE(INT_TO_WORD(x)) Y INT_TO_DWORD WORD_TO_DWORD(INT_TO_WORD(x)) N INT_TO_STRING I_STRNG(x) Y REAL_TO_DINT 四舍五入 IEEE 实数到 DINT(长整数)。

如果值小于-2147483648 或大于 2147483647,OK 变量设置为

FALSE。

Y

REAL_TO_DWORD 拷贝位串。 N REAL_TO_INT 四舍五入 IEEE 实数到 INT(整数)。

如果值小于-32768 或大于 32767,OK 变量设置为 FALSE。 Y

REAL_TO_STRING R_STRNG(x) Y STRING_TO_CHAR 拷贝串的第一个字符。

如果串长度不是 1,OK 变量设置为 FALSE。 Y

STRING_TO_INT STRNG_I(x) Y STRING_TO_DINT STRNG_DI(x) Y STRING_TO_REAL STRNG_R(x) Y TIME_TO_DINT 拷贝位串。 N TOD_TO_DINT 拷贝位串。 N WORD_TO_BOOL 拷贝最后的有效位。 Y WORD_TO_BYTE 拷贝最后 8 个有效位。 Y WORD_TO_INT 拷贝位串。 N WORD_TO_DINT INT_TO_DINT(WORD_TO_INT(x)) N WORD_TO_BLOCK_DB

The bit pattern of WORD is interpreted as the data block number N

BLOCK_DB_TO_WORD

The data block number is interpreted as the bit pattern of WORD N

BCD_TO_INT(x) 表达式 x 是 WORD 类型的,指定为一个在-999 和+999 范围内的 N

Page 189: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

181

WORD_BCD_TO_INT(x)

一个 BCD 码值。转换之后,结果用作 INT 类型的整数(二进制格

式)。 如果转换期间产生一个错误,可编程控制器变为停止状态。停止

的原因能够在 OB121 中编辑。 INT_TO_BCD(x) INT_TO_BCD_WORD(x)

表达式 x 是 INT 类型的,指定为一个在-999 和+999 范围内的一

个整数。转换之后,结果用作 WORD 类型的 BCD 码数字。 超范围时结果不确定。如果激活了“设置 OK 标志”选项,OK 标

志将置为‘FALSE’。

Y

BCD_TO_DINT(x) DWORD_BCD_TO_DINT(x)

表达式 x 是 DWORD 类型,指定为一个在-9999999 和+9999999范围内的一个 BCD 码值。转换之后,结果用作 DINT 类型的整数

(二进制格式)。 如果转换期间产生一个错误,可编程控制器变为停止状态。停止

的原因能够在 OB121 中编辑。

N

DINT_TO_BCD(x) DINT_TO_BCD_DWORD(x)

表达式 x 是 DINT 类型,指定为一个在-9999999 和+9999999 之间

的一个值。转换后结果用作 DWORD 类型的 BCD 码数字。 超范围时结果不确定。如果激活了“设置 OK 标志”选项,OK 标

志将置为‘FALSE’。

Y

注意(Caution) 如果将一个较高级数据类型的常量转换到一个较低级数据类型,在常量处于低级数据类型范围

之外情况下,编译时将接收到一个出错信息。 例子:

M0.0 :=WORD_TO_BOOL(W#16#FFFF); MW0 :=DINT_TO_INT(35000);

注(Note) 对于数据类型转换,也有使用 IEC 函数的选项。关于函数信息,参考 STEP 7 参考手册“S7-300/400系统和标准函数”。

14.1.3.2 四舍五入和截取函数(Functions for Rounding and Truncating)

四舍五入和截取函数也属于数据类型转换函数。下表显示了这些函数的名称、数据类型(输入参数

和函数值)和任务: 函数名 输入参数数

据类型 函数值数

据类型 任务

ROUND REAL DINT 四舍五入(形成一个 DINT 数) 遵照 DIN EN61131-3,函数总是四舍五入到无零头的整数

值;换言之,1.5 返回 2,2.45 也返回 2。 TRUNC REAL DINT 截取(形成一个 DINT 数) 注(Note) 对于数据类型转换,也有使用 IEC 函数的选项。关于函数信息,参考 STEP 7 参考手册“S7-300/400系统和标准函数”。

Page 190: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

182

例子(Example)

// 舍去(结果为: 3) ROUND (3.14) ; // 舍入(结果为: 4) ROUND (3.56) ; // 截取(结果为: 3) TRUNC (3.14) ; // 截取(结果为: 3) TRUNC (3.56) ;

14.1.3.3 用标准函数进行转换的例子(Examples of Converting with Standard Functions)

下面的举例中,必须使用显式转换,因为目标数据类型比源数据类型低级。 FUNCTION_BLOCK FB10 VAR SWITCH : INT; CTRLLER : DINT; END_VAR (* INT is lower order than DINT *) SWITCH := DINT_TO_INT (CTRLLER) ; // . . . END_FUNCTION_BLOCK 下面的举例中,必须使用显式转换,因为数据类型 REAL 比不允许用在带 MOD 运算的算术表达

式中。 FUNCTION_BLOCK FB20 VAR SWITCH : REAL INTVALUE : INT := 17; CONV2 : INT ; END_VAR (* MOD 只能用于 INT 或 DINT 类型的数据 *) CONV2 := INTVALUE MOD REAL_TO_INT (SWITCH); // . . . END_FUNCTION_BLOCK 下面的举例中,必须使用转换,因为对于逻辑运算,数据类型是错误的。NOT 运算仅能用于类型

为 BOOL、BYTE、WORD 或 DWORD 的数据。 FUNCTION_BLOCK FB30 VAR

Page 191: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

183

INTVALUE : INT := 17; CONV1 : WORD ; END_VAR (* NOT 不能用在 INT 类型的数据 *) CONV1 := NOT INT_TO_WORD(INTVALUE); // . . . END_FUNCTION_BLOCK 下例说明用于外设输入/输出的数据类型转换。 FUNCTION_BLOCK FB40 VAR Radius_in : WORD ; Radius : INT; END_VAR Radius_in := %IB0; Radius := WORD_TO_INT (radius_in); (* Conversion when changing to a different type class. Value comes from input and is converted for further processing.*) Radius := Radius (area:= circledata.area) %QB0 :=WORD_TO_BYTE (INT_TO_WORD(RADIUS)); (*Radius is recalculated from the area and is then as an integer. For output, the value is first converted to a different type class (INT_TO_WORD) and then into a lower order type (WORD_TO_BYTE).*) // . . . END_FUNCTION_BLOCK

14.2 数字类标准函数

14.2.1 通用标准算术函数(General Arithmetic Standard Functions)

有计算绝对值、平方或均方根的函数。 数据类型ANY_NUM代表INT、DINT或REAL。记住,如果函数值是REAL类型,则INT或DINT类型的输入参数内部转换到REAL变量。 函数名 输入参数数据类型 函数值数据类型 描述 ABS ANY_NUM ANY_NUM 数字 SQR ANY_NUM REAL 平方 SQRT ANY_NUM REAL 均方根 注(Note) 对于数据类型转换,也有使用 IEC 函数的选项。关于函数信息,参考 STEP 7 参考手册“S7-300/400系统和标准函数”。

Page 192: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

184

14.2.2 对数函数(Logarithmic Functions)

有计算指数值或值的对数的函数。 数据类型ANY_NUM代表INT、DINT或REAL。记住,如果函数值是REAL类型,则INT或DINT类型的输入参数内部转换到REAL变量。 函数名 输入参数数据类型 函数值数据类型 说明 EXP ANY_NUM REAL e 为幂底 EXPD ANY_NUM REAL 10 为幂底 LN ANY_NUM REAL 自然对数(e) LOG ANY_NUM REAL 常用对数(10) 备注(Note) 对于数据类型转换,也有使用 IEC 函数的选项。关于函数信息,参考 STEP 7 参考手册“S7-300/400系统和标准函数”。

14.2.3 三角函数(Trigonometric Functions)

用弧度表示角度进行计算的三角函数在下表中描述。 数据类型ANY_NUM代表INT、DINT或REAL。记住,如果函数值是REAL类型,则INT或DINT类型的输入参数内部转换到REAL变量。 函数名 输入参数数据类型 函数值数据类型 描述 ACOS ANY_NUM REAL Arc cosine ASIN ANY_NUM REAL Arc sine ATAN ANY_NUM REAL Arc tangent COS ANY_NUM REAL Cosine SIN ANY_NUM REAL Sine TAN ANY_NUM REAL Tangent 备注(Note) 对于数据类型转换,也有使用 IEC 函数的选项。关于函数信息,参考 STEP 7 参考手册“S7-300/400系统和标准函数”。

14.2.4 数 字 类 标 准 函 数 举 例 (Examples of Numeric Standard

Functions)

调用(Call) 结果(RESULT) RESULT := ABS (-5) ; //5 RESULT := SQRT (81.0); //9 RESULT := SQR (23); //529 RESULT := EXP (4.1); //60.340 ... RESULT := EXPD (3); //1_000

Page 193: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

185

RESULT := LN (2.718 281) ; //1 RESULT := LOG (245); //2.389_166 ... PI := 3. 141 592 ; RESULT := SIN (PI / 6) ;

//0.5

RESULT := ACOS (0.5); //1.047_197 (=PI / 3)

14.3 标准位串函数(Bit String Standard Functions)

每个标准位串函数有两个用 IN 和 N 标识的输入参数,结果总是函数值。下表列出函数名、两个

输入参数及函数值的数据类型。输入参数的解释: 输入参数 IN:要执行位串操作的缓冲区。此输入参数的数据类型决定了函数值的数据类型。 输入参数 N:循环移位函数 ROL 和 ROR 的循环次数,或 SHL 和 SHR 时,移动的位置数。 表中显示可能的标准位串函数: 函数名 IN 的数据类型 N 的数据类型 函数值数据类型 任务 ROL BOOL

BYTE WORD DWORD

INT INT INT INT

BOOL BYTE WORD DWORD

参数 IN 中的值被向左循环移

动参数 N 的内容说明的位数。

ROR BOOL BYTE WORD DWORD

INT INT INT INT

BOOL BYTE WORD DWORD

参数 IN 中的值被向右循环移

动参数 N 的内容说明的位数。

SHL BOOL BYTE WORD DWORD

INT INT INT INT

BOOL BYTE WORD DWORD

参数 IN 中的值被向左移动参

数 N 的内容说明的位数,右侧

位用 0 代替。

SHR BOOL BYTE WORD DWORD

INT INT INT INT

BOOL BYTE WORD DWORD

参数 IN 中的值被向右移动参

数 N 的内容说明的位数,左侧

位用 0 代替。

备注(Note) 对于数据类型转换,也有使用 IEC 函数的选项。关于函数信息,参考 STEP 7 参考手册“S7-300/400系统和标准函数”。

14.3.1 标 准 位 串 函 数 举 例 (Examples of Bit String Standard

Functions)

Call Result RESULT := ROL (IN:=BYTE#2#1101_0011, N:=5);

//2#0111_1010 //(= 122 十进制)

Page 194: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

186

RESULT := ROR (IN:=BYTE#2#1101_0011, N:=2);

//2#1111_0100 //(= 244 十进制)

RESULT := SHL (IN:=BYTE#2#1101_0011, N:=3);

//2#1001_1000 //(= 152 十进制)

RESULT := SHR (IN:=BYTE#2#1101_0011, N:=2);

//2#0011_0100 //(= 52 十进制)

14.4 串处理函数

14.4.1 串操作函数(Functions for String Manipulation)

LEN

LEN 函数(FC21)返回串的当前长度(有效字符个数)。空串('')长度为 0。函数不报告错误。 例 LEN (S:= 'XYZ' ) 参数 声明 数据类型 内存区域 描述 S INPUT STRING D, L 用串格式的输入变量 返回值 INT I, Q, M, D, L 当前的字符数

CONCAT

CONCAT 函数将最多 32 个串变量合并为一个串。如果结果串比输出参数的串要度,结果串将限

定在最大长度…… 当使用 S7-SCL 函数 CONCAT 时,隐式地在“IEC 函数”库中调用 FC2。 Example CONCAT (IN1:= 'Valve', IN2:= ' open') 参数 声明 数据类型 内存区域 描述 IN1 INPUT STRING

CHAR D, L 串格式或字符形式输入变量

IN2 INPUT STRING CHAR

D, L 串格式或字符形式输入变量

INn INPUT STRING CHAR

D, L 串格式或字符形式输入变量

返回值 STRING CHAR

D, L 结果串

LEFT 或 RIGHT

LEFT 和 RIHGT 函数(FC20 和 FC32)返回开始或最后的字符串。如果 L 比串变量的当前长度大,

则返回全部串。如果 L=0,返回空串。如果 L 是负数,输出空串。 Example LEFT (IN:= 'Valve', L:= 4) 参数 声明 数据类型 内存区域 描述

Page 195: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

187

IN INPUT STRING D, L 串格式输入变量 L INPUT INT I, Q, M, D, L, const. 左边串的长度 返回值 STRING D, L 串格式的输出变量

MID

MID 函数(FC26)返回串的一部分。L 是将读出的串的长度,P 是将读出的首个字符的位置。 如果 L 和 P-1 之和比串变量当前长度大,返回的串从 P 指示的字符开始直到输入串的结束。其他

情况(P 超出当前串长度,P 和/或 L 等于 0 或负数),返回一个空串。 Example MID (IN:= 'Temperature', L:= 2, P:= 3) 参数 声明 数据类型 内存区域 描述 IN INPUT STRING D, L 串格式输入变量 L INPUT INT I, Q, M, D, L, const. 中间串部分长度 P INPUT INT I, Q, M, D, L, const. 首个字符的位置 返回值 STRING D, L 串格式的输出参数

INSERT

INSERT 函数(FC17)将参数 IN2 中的字符串插入到参数 IN1 中 P 批示的位置之后。如果 P=0,第

二个串插入到第一个串之前。如果 P 大于第一个串的当前长度,则第二个串接到第一个串之后。

如果 P 是负数,则输出空串。当结果串长于输出参数说明和变量,结果将限定在最大长度。 Example INSERT (IN1:= 'Participant arrived', IN2:='Miller':= 2, P:= 11) 参数 声明 数据类型 内存区域 描述 IN1 INPUT STRING D, L 将被插入的串变量 IN2 INPUT STRING D, L 要插入的串 P INPUT INT I, Q, M, D, L, const. 插入位置 返回值 STRING D, L 结果串

DELETE

DELETE 函数(FC 4)在一个串中从 P 指示的字符开始删除 L 个字符。如果 L 和或 P 等于 0,或者

如果 P 大于输入串的当前长度,返回输入的串。如果 L 和 P 之和大于输入串的长度,则串删除到

结束位置。如果 L 和/或 P 是负数,输出一个空串。 Example: DELETE (IN:= 'Temperature ok', L:= 6, P:= 5) REPLACE REPLACE函数(FC31)用第二个串(IN2)置换第一个串中 P指示的位置开始的L个字符。如果L=0,则返回第一个串。如果 P 为 0 或 1,则从起始位置开始置换。如果 P 在第一个串长度之外,第二

个串接到第一个串之后。如果 P 和/或 L 是负数,则返回空串。当结果串长于输出参数指定的变

量,则限定到最大长度。 Example REPLACE (IN1:= 'Temperature', IN2:= ' high' L:= 6, P:= 5) 参数 声明 数据类型 内存区域 描述 IN1 INPUT STRING D, L 将被置换的串变量 IN2 INPUT STRING D, L 要插入的串变量 L INPUT INT I, Q, M, D, L, const. 被置换的字符数

Page 196: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

188

P INPUT INT I, Q, M, D, L, const. 首个置换字符的位置 返回值 STRING D, L 结果串

FIND

FIND 函数(FC11)返回第二个串(IN2)在第一个串(IN1)中的位置。查找从左开始;报告首次出现的

位置。如果第一个串中不包含第二个串,则返回 0。此函数不报告错误。 Example FIND (IN1:= 'Processingstation', IN2:='station') 参数 声明 数据类型 内存区域 描述 IN1 INPUT STRING D, L 被搜索的串 IN2 INPUT STRING D, L 要搜索的串 返回值 INT I, Q, M, D, L 找到的串的位置

14.4.2 串比较函数(Functions for Comparing Strings)

使用 S7-SCL 比较函数=, <>, <, >, <=和>=能够比较串。编译器包括了自动调用要求的函数。简单

地列出下列函数提供全部的情况。

EQ_STRNG 和 NE_STRNG

EQ_STRNG (FC10)和 NE_STRNG (FC29)函数比较两个串格式的变量的内容是否相等(FC10)或不

相等(FC29),并返回比较结果。如果参数串 S1 与参数串 S2 相等(不相等),则返回信号状态“1”的值。此函数不报告错误。 参数 声明 数据类型 内存区域 描述 S1 INPUT STRING D, L 串格式的输入变量 S2 INPUT STRING D, L 串格式的输入变量 返回值 BOOL I, Q, M, D, L 比较结果

GE_STRNG and LE_STRNG

GE_STRNG (FC13)和 LE_STRNG (FC19)函数比较串格式的两个变量大于(小于)或等于,并返回比

较结果。如果参数串S1大于(小于)或等于参数串S2,则返回信号状态“1”的值。从左开始用其ASCII代码比较字符(如'a'大于'A')。第一个不同的字符决定了比较结果。如果较长串的左边部分与较短

串相同,则认为较长串大。此函数不报告错误。 参数 声明 数据类型 内存区域 描述 S1 INPUT STRING D, L 串格式的输入变量 S2 INPUT STRING D, L 串格式的输入变量 返回值 BOOL I, Q, M, D, L 比较结果

GT_STRNG and LT_STRNG

GT_STRNG (FC15)和 LT_STRNG (FC24)函数比较串格式的两个变量大于(小于),并返回比较结果。

如果参数串 S1 大于(小于)参数串 S2,则返回信号状态“1”的值。从左开始用其 ASCII 代码比较字

Page 197: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

189

符(如'a'大于'A')。第一个不同的字符决定了比较结果。如果较长串的左边部分与较短串相同,则

认为较长串大。此函数不报告错误。 参数 声明 数据类型 内存区域 描述 S1 INPUT STRING D, L 串格式的输入变量 S2 INPUT STRING D, L 串格式的输入变量 RET_VAL BOOL I, Q, M, D, L 比较结果

14.4.3 数据格式转换函数(Functions for Converting the Data Format)

INT_TO_STRING 和 STRING_TO_INT

函数 INT_TO_STRING和 STRING_TO_INT将一个 INT格式变量转换为字符串或将字符串转换为

INT 变量。函数 I_STRNG (FC16)和 STRNG_I (FC38)被从提供的“IEC 函数”库中隐式地使用。串

用一个前置符号表述。如果在返回参数指定的变量太短,则不进行转换。 参数 声明 数据类型 内存区域 描述 INT_TO_STRING I INPUT INT I, Q, M, D, L, const. 输入值 返回值 STRING D, L 结果串 STRING_TO_INT S INPUT STRING D, L 输入串 返回值 INT I, Q, M, D, L 结果

DINT_TO_STRING 和 STRING_TO_DINT

函数 DINT_TO_STRING 和 STRING_TO_DINT 将一个 DINT 格式的变量转换为字符串或字符串

转换为 DINT 变量。函数 DI_STRNG (FC5)和 STRNG_DI (FC37)被从提供的“IEC 函数”库中隐式

地使用。串用一个前置符号表述。如果在返回参数指定的变量太短,则不进行转换。 参数 声明 数据类型 内存区域 描述 DINT_TO_STRING I INPUT DINT I, Q, M, D, L, const. 输入值 返回值 STRING D, L 结果串 STRING_TO_DINT S INPUT STRING D, L 输入串 返回值 DINT I, Q, M, D, L 结果

REAL_TO_STRING and STRING_TO_REAL

函数 REAL_TO_STRING 和 STRING_TO_REAL 将一个实数格式的变量转换为字符串或字符串转

换为实数变量。函数 R_STRNG (FC30)和 STRNG_R (FC39)被从提供的“IEC 函数”库中隐式地使

用。串必须有下列格式: ?v.nnnnnnnE?xx (?= 符号, v =小数点前的数字, n =小数点后的数字, x =指数数字) 如果串的长度小于 14,或其不是上述格式构造,将不进行转换。 如果返回参数指定的变量太短或 IN 参数中包含一个无效浮点数,没有转换。

Page 198: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

190

参数 声明 数据类型 内存区域 描述 REAL_TO_STRING IN INPUT REAL I, Q, M, D, L, const. 输入值 返回值 OUTPUT STRING D, L 结果串 STRING_TO_REAL S INPUT STRING D, L 输入串 返回值 REAL I, Q, M, D, L 结果

14.4.4 字符串处理举例(Example of Processing Character Strings)

将信息文本放到一块(Putting together message texts) //通过处理和存贮,将信息文本放到一块。 //////////////////////////////////////////////////////////////////// //块包含必要的信息文本和产生的最后 20 条信息 //////////////////////////////////////////////////////////////////// DATA_BLOCK Messagetexts STRUCT Index : int; textbuffer : array [0..19] of string[34]; HW : array [1..5] of string[16]; // 5 种不同设备 statuses : array [1..5] of string[12]; // 5 种不同状态 END_STRUCT BEGIN Index :=0; HW[1] := 'Motor '; HW[2] := 'Valve '; HW[3] := 'Press '; HW[4] := 'Weldingstation '; HW[5] := 'Burner '; Statuses[1] := ' problem'; Statuses[2] := ' started'; Statuses[3] := ' temperature'; Statuses[4] := ' repaired'; Statuses[5] := ' maintained'; END_DATA_BLOCK //////////////////////////////////////////////////////////////////// //函数将信息广西领先到一块,并输入到 DB 的信息文本中。信息文本存贮在一个环形

缓冲区里。 //文本缓冲区的下一个空区索引也在 DB 信息文本内并被函数修正。 //////////////////////////////////////////////////////////////////// FUNCTION Textgenerator : bool

Page 199: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

191

VAR_INPUT unit : int; // 设备文本(名称)的索引 no : int; // 设备的 ID 号 status : int; value : int; END_VAR VAR_TEMP text : string[34]; i : int; END_VAR // 临时变量的初始化 text := ''; Textgenerator := true; Case unit of 1..5 : case status of 1..5 : text := concat( in1 := Messagetexts.HW[unit], in2 := right(l:=2,in:=I_STRNG(no))); text := concat( in1 := text, in2 := Messagetexts.statuses[status]); if value <> 0 then text := concat( in1 := text, in2 := I_STRNG(value)); end_if; else Textgenerator := false; end_case; else Textgenerator := false; end_case; i := Messagetexts.index; Messagetexts.textbuffer[i] := text; Messagetexts.index := (i+1) mod 20; END_FUNCTION //////////////////////////////////////////////////////////////////// //函数在%M10.0 边沿触发时被循环程序调用,如果参数改变了,则输入一次信息。 //////////////////////////////////////////////////////////////////// Organization_block Cycle Var_temp Opsy_ifx : array [0..20] of byte; error : BOOL; End_var; //////////////////////////////////////////////////////////////////// //下面的调用将信息"Motor 12 started"输入 DB 信息文本的文本缓冲区, %MW0 为 1, //%IW2 为 12 及%MW2 为 2. ////////////////////////////////////////////////////////////////////

Page 200: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

192

if %M10.0 <> %M10.1 then error := Textgenerator (unit := word_to_int(%MW0), no := word_to_int(%IW2), status := word_to_int(%MW2), value := 0); %M10.1:=M10.0; end_if; end_organization_block

14.5 选值函数(Functions for Selecting Values)

14.5.1 选值函数(Functions for Selecting Values)

下列选值函数可用作 S7-SCL 函数。他们符合 IEC61131-3。 备注(Note) 一些函数也包括地 STEP 7 标准库中。然而库中函数不全面满足 IEC 的要求。

SEL

SEL 函数选择两个输入值之一。 除 ARRAY 和 ATRUCT 数据类型和参数数据类型外的所有类型均作为输入值。所有参数化变量均

应是同一类数据类型。 例子: A:= SEL (G:= SELECT, IN0:= X, IN1:= Y); 参数 声明 数据类型 内存区域 描述 D INPUT BOOL I, Q, M, D,

L 选择标准

IN0 INPUT 除 ARRAY 和 STRUCT 外的所有数

据类型 I, Q, M, D, L

第一个输入值

IN1 INPUT 除 ARRAY 和 STRUCT 外的所有数

据类型 I, Q, M, D, L

第二个输入值

返回值 OUTPUT 除 ARRAY 和 STRUCT 外的所有数

据类型 I, Q, M, D, L

选择的输入值 (可选)

MAX

MAX 函数选择一些变量值中最大值。 数字和时间数据类型允许作为输入值。所有参数化变量应是同类的数据类型。此符号取得最大值。 例: A:= MAX (IN1:=a, IN2:=b, IN3:=c, IN4:=d); 参数 声明 数据类型 内存区域 描述 IN1 INPUT ANY_NUM

除 S5TIME 外的时间数据类型 I, Q, M, D, L

第一个输入值

IN2 INPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

第二个输入值

Page 201: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

193

INn (n=3...32)

INPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

最后输入值(可选)

返回值 OUTPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

输入值的最高者(可选)

MIN

MIN 函数选择一些变量值中最小值。 数字和时间数据类型允许作为输入值。所有参数化变量应是同类的数据类型。此符号取得最大值。 例: A:= MIN (IN1:=a, IN1:=b, IN1:=c, IN1:=d); 参数 声明 数据类型 内存区域 描述 IN1 INPUT ANY_NUM

除 S5TIME 外的时间数据类型 I, Q, M, D, L

第一个输入值

IN2 INPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

第二个输入值

INn (n=3...32)

INPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

最后输入值(可选)

返回值

OUTPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

输入值的最低者(可选)

IMIT

LIMIT 函数将变量的数字值限入参数化范围。所有数字数据类型和时间数据类型均允许作为输入

值。所有参数均为同样数据类型。下限(MN)不能大于上限(MX)。 例: A:= LIMIT (MN:=5, IN:= Execution steps, MX:= 10); 参数 声明 数据类型 内存区域 描述 MN INPUT ANY_NUM

除 S5TIME 外的时间数据类型 I, Q, M, D, L

下限

IN INPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

输入变量

MX INPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

上限

返回值 OUTPUT ANY_NUM 除 S5TIME 外的时间数据类型

I, Q, M, D, L

限制的输出变量(可选)

MUX

MUX 函数从一些输入值中选择一个输入值。选择依据输入参数 K 进行。所有数据类型均允许作

为输入值。此符号取得最大值 例: A:= MUX (K:=SELECT, IN0:= Steps, IN1:=Number, IN2:=Total); 参数 声明 数据类型 内存区域 描述 K INPUT INT I, Q, M, D,

L 选择标准

Page 202: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

194

IN0 INPUT 除 ARRAY 和 STRUCT外的所有数据类型

I, Q, M, D, L

第一个输入值

IN1 INPUT 除 ARRAY 和 STRUCT外的所有数据类型

I, Q, M, D, L

第二个输入值

INn (n=2?1)

INPUT 除 ARRAY 和 STRUCT外的所有数据类型

I, Q, M, D, L

最后输入值(可选)

INELSE INPUT 除 ARRAY 和 STRUCT外的所有数据类型

I, Q, M, D, L

其他输入值(可选) 如果 K 不在 0…n 范围则当前值

从使用 INELSE 中选择。如果

INELSE 没用,则当前值使用

IN0。 返回值 OUTPUT 除 ARRAY 和 STRUCT

外的所有数据类型 I, Q, M, D, L

选择的值(可选)

14.6 系统函数/功能块和标准库

14.6.1 系统函数/功能块和标准库(System Functions/Function Blocks

and the Standard Library)

S7 CPU 已经将系统和标准函数集成在操作系统中,当用 SCL 编程时能够使用它们。按类别他们

如下: 组织块(OBs) 系统函数(SFCs) 系统功能块(SFBs)

调用接口(Call Interface (SFC/SFB))

能够用符号或绝对方式寻址块。要求要么是在符号表中声明的符号名,要么是块的绝对标识号。 当这些函数和块被子调用时,必须将实际的参数(程序运行时块所用的实际值)指定给形式参数,

创建块时已经指明了其名称和数据类型。 S7-SCL 为调用块,查找下面的文件夹和库: "程序(Programs)"文件夹 Simatic 标准库 IEC 标准库 如果 S7-SCL 发现了块,就将其拷贝到用户程序。此外必须用("...")标记法将其名称括起来调用,

并用绝对标识符调用。然后 S7-SCL 只能在用户程序的符号表中查找到他们的名字。必须用

SIMATIC 管理器手动拷贝这些函数到用户程序。

带有条件的调用(Conditional Call (SFB/SFC))

对于带有条件的调用,必须将预定义的输入参数EN设置为 0(如:通过输入I0.3)。然后块未被调用,

当EN值变为 1 时,函数被调用。如果块执行期间没有产生错误,这种情形下输出参数ENO也设置

为"1"(否则为"0")。

Page 203: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

195

不推荐带有条件的 SFC 调用,因为如果函数不被调用,应正常地接收函数返回值的变量变得不确

定。 备注(Note) 如果在程序中对数据类型 TIME、DATE_AND_TIME 和 STRING 使用下列操作,S7-SCL 隐式调用相应

的标准块。 这些标准块的符号和块号被保留,且必须不被其他块所使用。如果打破该规则,不一定被 S7-SCL 检测

到,且能导致编译错误。 下表包含被 SCL 隐式使用的 IEC 标准库的概况: Operation DATE_AND_TIME STRING == EQ_DT (FC9) EQ_STRING (FC10) <> NE_DT (FC28) NE_STRING (FC29) > GT_DT (FC14) GT_STRING (FC15) >= GE_DT (FC12) GE_STRING (FC13) <= LE_DT (FC18) LE_STRING (FC19) < LT_DT (FC23) LT_STRING (FC24) DATE_AND_TIME + TIME AD_DT_TM (FC1) DATE_AND_TIME + TIME SB_DT_TM (FC35) DATE_AND_TIME + DATE_AND_TIME

SB_DT_DT (FC34)

TIME_TO_S5TIME(TIME) TIM_S5TI (FC40) S5TIME_TO_TIME(S5TIME) S5TI_TIM (FC33) 关于可用的系统功能块、系统函数和组织块的详细信息及详细的接口描述,参照 STEP 7 参考手

册"S7-300/400 的系统和标准函数"。

14.6.2 传递到组织块的接口(Transfer Interface to OBs)

组织块(Organization Blocks)

组织块构成 CPU 操作系统与用户程序之间的接口。在下列情形能够用组织块来执行特定程序部

分: CPU 上电时 作循环和定时操作 在特定时间或在特定日期 在特定时间同期到达时 产生错误时 硬件或通讯中断触发时 根据指定的优先权处理组织块。

可用的组织块(Available OBs)

并非所有 S7 提供的组织块均能执行。参考 CPU 的数据表找出能够使用的组织块。

Page 204: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

196

附:系统函数/系统功能块举例(Example of SFCs/SFBs)

VAR RET_VAL : INT ; END_VAR . . . // 调用系统函数 SFC31 (查询中断的日型时间) RET_VAL := SFC 31(OB_NR := 10 , STATUS := MW100 ) ; . . . Results 函数值是整数类型。如果其值> = 0 表示块无误地执行了。如果其值< 0,出错了。调用之后,能

够求取隐式军政府的输出参数ENO的值。其值是"1" (无错)或"0" (出错了)。

Page 205: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

197

15 语言描述

15.1 规范化语言描述

15.1.1 语法图概述(Overview of Syntax Diagrams)

在各章节中语言描述的基本工具是句法图。它让 S7 SCL 句法清晰明了。在题为“组词规则”和“句法规则”节将发现一个所有语言元素的图的完整集合。

什么是句法图(What is a Syntax Diagram)?

句法图是一个语言结构的图形化描述。结构由一系列规则定义,一个规则可以基于其他更多的基

础规则。

句法图从右往左读,遵循下列结构规则: 序列:一连串的盒子 选项:一个可跳过的分支 叠代:分支的重复 选择:多选分支

有些什么类型的盒子(What Types of Boxes Are There)?

盒子是基本元素或由其他对象组成的元素。下图显示了描述各种类型盒子的符号: 术语 非术语项

基本元素不要求更多解释。参照

可打印字符和特殊字符、关键字

和预定义标识符。块中的信息必

须是如图所示的一份拷贝

规则名称可以是大写或小写字母! 复杂元素通过另外的句法图来描述。

语言符号

规则名称必须是大写字母!

复杂元素在句法规则中同基本元素

一样使用,且用组词规则来解释。

Page 206: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

198

15.1.2 规则(Rules)

用于 S7-SCL 程序结构的规则分类为组词规则和句法规则。

组词规则(Lexical Rules)

组词规则描述在编译器执行词汇分析期间处理的元素(语言符号)的构成。基于这种理由,组词规

则不允许灵活的格式,且必须严格遵守。实际上,意思是: 不允许插入定义格式的字符, 节和行注释不能插入其中。 不允许插入标识符的属性。 下例显示标识符的组词规则,它定义一个标识符(名字)的构成: MEAS_FIELD_12 SETPOINT_B_1

句法规则(Syntax Rules)

句法规则建立在组词规则之上,定义 SCL 的结构。在这些规则的限定下,S7-SCL 程序的结构有

灵活的格式。

形态(Formal Aspects)

每个规则在定义前均有一个名字。如果那个规则用在高级规则里,即名字出现地高级规则里,则

为非术语项。 如果规则名用大写书写,则是一个用组词规则描述的语言符号。

Page 207: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

199

语义(Semantics)

规则仅能描述语言和形式构造,意思是说(语义)是不能从这些规则中弄明白的。基于这种原因,

写在规则之后的附加信息是很重要的。下面是此情况的一个例子: 当同型式元素有不同的含义,就给出一个附加名称:如在 DECIMALDIGITSTRING(十进制数字

串)年、月或日的数据描述规则中,名字指出了其用途。 重要的限制与规则并排注明:例如,你会发现一个符号表的备注,告诉你符号必须在符号表中定

义。

15.1.3 在组词规则中使用的术语(Terms Used in the Lexical Rules)

定义(Definition)

术语是一个不能被其他规则只能用文字解释的基本元素。在句法图中,它用下列符号描绘:

下表定义术语使用 ASCII 字符集中字符范围的基本部分:

字母和数字字符(Letters and Numeric Characters)

字母和数字是主要使用的字符。例如,标识符(IDENTUFIER)由字母、数字和下划线组成。 字符 子群 字符集范围 字母 大写

小写 A to Z a to z

数字 十进制数字 0.. 9 八进制数字 八进制数字 0.. 7 十六进制数字 十六进制数字 0 to 9, A to F, a to f 位 二进制数字 0, 1

可打印字符和特殊字符(Printable Characters and Special Characters)

全部的,扩展字符集均能用在字符串、注释和符号中。 字符 子群 字符集中范围 可打印字符 依使用的字符代码而定。在 ASCII

代码中,如在十进制 32 不用 DEL也不用转义符开始。

所有可打印字符

转义符 美元符号 引号

$ '

控制字符 $P 或$p 换页 form feed

Page 208: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

200

$L 或$l $R 或$r $T 或$t $N 或$n

换行 line feed 回车 carriage return 制表符 tabulator 开始新行 new line

十六进制表达式中转义

符 $hh 用十六进制代码(hh)能表示的任

意字符

15.1.4 格式符、分隔符和运算符(Formatting Characters, Separators

and Operations)

在组词规则中使用(Used in the Lexical Rules)

下表显示在组词规则中用作格式符和分隔符的 ASCII 字符集中的字符: 字符 描述 : 在时、分和秒之间,及属性的定界符;

属性 . 在绝对地址、实数或时间周期表达式中的分隔符。 ' ' 字符和字符串 " " 根据编辑器的规则的符号的引导符 _ 下划线 在常量中分隔数字,和能被用在标识符中。 $ 指定控制字符或转义符 $> $< 在串不适合在一行内时打断串,或在串中插入注释。

用于常量(For Constants)

下表显示了分隔符和在组词规则中用于常量的字符串的使用。此表适应英语和德语标记法: 前缀 表示 组词规则 BOOL# BOOL 类型常量的类型定义 BIT 常量 BYTE# BYTE 类型常量的类型定义 BIT 常量 WORD# WORD 类型常量的类型定义 BIT 常量 DWORD# DWORD 类型常量的类型定义 BIT 常量 INT# INT 类型常量的类型定义 INT 常量 DINT# DINT 类型常量的类型定义 DINT 常量 REAL# REAL 类型常量的类型定义 REAL 常量 CHAR# CHAR 类型常量的类型定义 CHAR 常量 2# 数字常量 二进制数字串 8# 数字常量 八进制数字串 16# 数字常量 十六进制数字串 D# 时间 日期 DATE# 时间 日期 DATE_AND_TIME# 时间 日期时间 DT# 时间 日期时间 E 实数常量的分隔符 指数

Page 209: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

201

e 实数常量的分隔符 指数 D 时间单元(天)分隔符 天数 (规则: 复杂格式) H 时间单元(时) 分隔符 小时数: (规则: 复杂格式) M 时间单元(分) 分隔符 分钟数: (规则: 复杂格式) MS 时间单元(毫秒) 分隔符 毫秒数: (规则: 复杂格式) S 时间单元(秒) 分隔符 秒数: (规则: 复杂格式) T# 时间 时间周期 TIME# 时间 时间周期 TIME_OF_DAY# 时间 日型时间 TOD# 时间 日型时间

在句法规则中(In the Syntax Rules)

下表显示在句法规则、注释和属性中作为格式化符和分隔符的各个字符: 字符 描述 句法规则、书签或属性 : 在标号后语句前作类型说明的分界符 变量声明部分,实例声明,功能代码部

分,CASE 语句 ; 声明或语句的终结符 常量和变量声明,代码部分,DB 的赋

值部分,常量子域,标号子域,组件声

明 , 列表和标号子域的分界符 变量声明,数组数据类型说明,数组初

始化列表,FB 参数,FC 参数,值表,

实例声明 .. 范围说明 数组数据类型说明,值表 . FB 和 DB、绝对地址的分界符 FB 调用,结构化变量 ( ) 函数和功能块调用将表达式括起来

数组的初始化列表 函数调用,FB 调用,表达式,数据组

初始化列表,简单乘法,指数表达式 [ ] 数组声明,数组结构化变量部分,共

享变量和串的索引 数组数据类型说明,串数据类型说明

(* *) 注释部分 见“组词规则”

// 行注释 见“组词规则”

{ } 属性域 为说明属性

% 引出直接标识符 要编写和 IEC 一致的程序,%M4.0 能

够用 M4.0 代替 # 引出一个非关键字 指明一个标识符不是关键字,如#FOR

运算符(Operations)

下表列出了的有 S7-SCL 的运算符、关键字,如 AND 和普通的单字符运算符。其适应于英语和德

语助记符。 运算符 描述 例子,句法规则 := 赋值,初始值指派,数据类型初始化 赋值,DB 的赋值部分,常

Page 210: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

202

量子域,输入、输出和输入/输出赋值

+, - 算术运算:单元运算,符号 表达式,简单表达式,指数

表达式 +, -, *, / MOD; DIV

基本算术运算 基本算术运算,简单乘法

** 算术运算:指数运算 指数 NOT 逻辑运算:取反 指数 AND, &, OR; XOR, 基本逻辑运算 基本逻辑运算 <,>,<=,>=,=,<> 比较运算 比较运算

15.1.5 关键字和预定义标识符(Keywords and Predefined Identifiers)

下表按字母顺序列出了在 S7-SCL 中的关键字和预定义字符。并排的是每一个的说明和将他们作为术语使

用的句法规则。关键字通常与助记符无关。 关键字 说明 举例,句法 AND 逻辑运算 基本逻辑运算 ANY 数据类型 ANY 的标识符 参数数据类型说明 ARRAY 导出数组说明,后跟用“[”和“]”框起来的

索引表 数组数据类型说明

AT 变量的视图声明 变量声明 BEGIN 引出逻辑块中的代码部分或数据块中的

初始化部分 组织块、功能块、数据块

BLOCK_DB 数据类型 BLOCK_DB 的标识符 参数数据类型说明 BLOCK_FB 数据类型 BLOCK_FB 的标识符 参数数据类型说明 BLOCK_FC 数据类型 BLOCK_FC 的标识符 参数数据类型说明 BLOCK_SDB 数据类型 BLOCK_SDB 的标识符 参数数据类型说明 BOOL 二进制数据的基本数据类型 位数据类型 BY 引出增量说明 FOR 语句 BYTE 基本数据类型 位数据类型 CASE 引出选择控制语句 CASE 语句 CHAR 基本数据类型 字符类型 CONST 引出常量的声明 常量子域 CONTINUE FOR、WHILE 和 REPEAT 循环中的控

制语句 CONTINUE 语句

COUNTER 计数器数据类型,仅在参数子域内可用 参数数据类型说明 DATA_BLOCK 引出一个数据块 数据块 DATE 日期型基本数据类型 时间类型 DATE_AND_TIME 日期和时间的给合数据类型 日期时间 DINT 基本数据类型,整数、双精度。 数字数据类型 DIV 除法运算符 基本算术运算 DO 引出 FOR 语句的语句部分 FOR 语句、WHILE 语句 DT 时期时间型数据类型 DATE_AND_TIME DWORD 双字基本数据类型 位数据类型

Page 211: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

203

ELSE 引出如果条件不成立时执行的指令 IF、CASE 语句 ELSIF 引出选择条件 IF 语句 EN 块许可标志 ENO 块出错标志 END_CASE 结束 CASE 语句 CASE 语句 END_CONST 结束常量的定义 常量子域 END_DATA_BLOCK 结束数据块 数据块 END_FOR 结束 FOR 语句 FOR 语句 END_FUNCTION 结束函数 函数 END_FUNCTION_BLOCK 结束功能块 功能块 END_IF 结束 IF 语句 IF 语句 END_LABEL 结束标号声明子域 标号子域 END_TYPE 结束 UDT 用户定义数据类型 END_ORGANIZATION_BLOCK 结束组织块 组织块 END_REPEAT 结束 REPEAT 语句 REPEAT 语句 END_STRUCT 结束结构说明 结构数据类型说明 END_VAR 结束声明块 临时变量子域、静态变量子

域、参数子域 END_WHILE 结束 WHILE 语句 WHILE 语句 EXIT 执行从循环中立即退出 EXIT FALSE 预定义布尔常量,逻辑条件非真,值等

于 0。

FOR 引出循环处理的控制语句 FOR 语句 FUNCTION 引出函数 函数 FUNCTION_BLOCK 引出功能块 功能块 GOTO 执行跳转到一个标号 程序跳转 IF 引出选择的控制语句 IF 语句 INT 基本数据类型,整数、单精度。 数字类数据类型 LABEL 引出标号声明子域 标号子域 MOD 除法求余数的算术运算 基本算术运算 NIL 空指针 NOT 逻辑运算,属于一元运算 表达式 OF 引出数据类型说明 数组数据类型说明、CASE 语

句 OK 标志,指示在已经执行的块中是否有错

OR 逻辑运算 基本逻辑运算 ORGANIZATION_BLOCK 引出一个组织块 组织块 POINTER 指针数据类型,仅允许在参数子域的参

数声明中,在 SCL 不处理。 参考"全局数据"节

PROGRAM 引 出 一 个 FB 的 语 句 部 分 ( 与

FUNCTION_ BLOCK 同义) 功能块

REAL 基本数据类型 数字类数据类型 REPEAT 引出循环语句的控制语句 REPEAT 语句 RET_VAL 函数的返回值 函数

Page 212: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

204

RETURN 控制语句,执行从子程序返回 RETURN 语句 S5TIME 时间说明的基本数据类型,特殊的 S5

格式 时间类型

STRING 字符串数据类型 串数据类型说明 STRUCT 引出结构的说明,后面跟组成列表 THEN 引出如果条件成立的结果动作 IF 语句 TIME 时间说明的基本数据类型 时间类型 TIMER 定时器数据类型,仅能用在参数子域 参数数据类型说明 TIME_OF_DAY 日期时间的基本数据类型 时间类型 TO 引出终止值 FOR 语句 TOD 日期时间的基本数据类型 时间类型 TRUE 预定义布尔常量:逻辑条件成立,值不

等于 0

TYPE 引出 UDT 用户定义数据类型 VAR 引出声明子域 静态变量子域 VAR_TEMP 引出声明子域 临时变量子域 UNTIL 引出 REPEAT 语句的终止条件 REPEAT 语句 VAR_INPUT 引出声明子域 参数说明子域 VAR_IN_OUT 引出声明子域 参数说明子域 VAR_OUTPUT 引出声明子域 参数说明子域 WHILE 引出循环语句的控制语句 WHILE 语句 WORD 基本数据类型 字 位数据类型 VOID 函数调用无返回值 函数 XOR 逻辑运算 基本逻辑运算

15.1.6 地址标识符和块关键字(Address Identifiers and Block

Keywords)

共享的系统数据(Shared System Data)

下表列出了 SIMATIC S7-SCL 地址标识符的助记符,按字母顺序并每个均有说明。 地址标识符说明:

内存前缀(Q, I, M, PQ, PI)或数据块(D) 数据元素大小的说明:

大小前缀(任意或 B, D, W, X) 助记符表示地址标识符(内存前缀或数据块前缀 D)和大小标识符的组合。其二者均是组词规则。

表中按德语助记符排序,相应的英语助记符在第二列。 German Mnemonic

English Mnemonic

Memory Prefix or Data Block Size Prefix

A Q 输出(通过映象) 位 AB QB 输出(通过映象) 字节 AD QD 输出(通过映象) 双字 AW QW 输出(通过映象) 字

Page 213: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

205

AX QX 输出(通过映象) 位 D D 数据块 位 DB DB 数据块 字节 DD DD 数据块 双字 DW DW 数据块 字 DX DX 数据块 位 E I 输入(通过映象) 位 EB IB 输出(通过映象) 字节 ED ID 输出(通过映象) 双字 EW IW 输出(通过映象) 字 EX IX 输出(通过映象) 位 M M 位内存 位 MB MB 位内存 字节 MD MD 位内存 双字 MW MW 位内存 字 MX MX 位内存 位 PAB PQB 输出(直接到外设) 字节 PAD PQD 输出(直接到外设) 双字 PAW PQW 输出(直接到外设) 字 PEB PIB 输入(直接从外设) 字节 PED PID 输入(直接从外设) 双字 PEW PIW 输入(直接从外设) 字

块关键字(Block Keywords)

用在块的绝对地址。表中按德语助记符排序,相应的英语助记符在第二列。 德语助记符 英语助记符 内存前缀或数据块 DB DB 数据块 FB FB 功能块 FC FC 函数 OB OB 组织块 SDB SDB 系统数据块 SFC SFC 系统函数 SFB SFB 系统功能块 T T 定时器 UDT UDT 用户定义数据类型 Z C 计数器

15.1.7 非术语项概述(Overview of Non Terms)

非术语项是用其他规则描述的复杂元素,一个非术语项用一个长方形盒子表示。盒子里的名字是

多个特定规则的名字

Page 214: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

206

该元素在组词规则或句法规则中产生。

15.1.8 语言符号概述(Overview of Tokens)

语言符号是用作句法规则中的基本元素的复杂元素,和用组词规则解释的复杂元素。一个语言符

号用一个长方形盒子表示。其名用大写字母表示,是解释组词规则的名字(不是在盒子旁边的)。

定义的语言符号表示从级别词规则基础上得到的标识符。这样,语言符号描述: 标识符 S7-SCL 命名协定 预定义的常量和标志

15.1.9 标识符(Identifiers)

标识符(Identifier)

能够用标识符存取 S7-SCL 的语言对象。下表显示了标识符的类别: 标识符类型 注释,例子 关键字 如控制语句 BEGIN, DO,WHILE 预定义名字 下面的名字

标准数据类型(如 BOOL, BYTE, INT) 预定义标准函数,如 ABS 标准常量 TRUE 和 FALSE

绝对地址标识符 为共享的系统数据和数据块: 如 I1.2, MW10, FC20, T5, DB30, DB10.D4.5

基于标识符规则的用户定义名字 下面的名字 声明的变量 结构组件 参数 声明的常量 标号

符号编辑器的符号 遵守标识符组词规则或符号组词规则之一,即

是说用引号括起来,如“xyz”

Page 215: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

207

大小写(Upper- and Lowercase)

对于关键字,大小写无关。自从 S7-SCL4.0 版开始,预定义名字和自由选择的名字的记法,如变

量和符号表中的符号不再区分大小写。下表提供了一个概况: 标识符类型 大小写敏感? 关键字 No 标准数据类型的预定义名字 No 标准函数的名字 No 标准常量的预定义名字 No 绝对地址标识符 No 用户定义名字 No 符号编辑器的符号 No 标准函数的名字,如 BYTE_TO_WORD 和 ABS 也能够用小写字符。对定时器函数和计数器函数

均适应,如 SV、se 或 CV。

15.1.10 在 S7-SCL 中取名(Assigning Names in S7-SCL)

指定可选名称(Assigning Selectable Names)

能够用以下两种方式取名: 能够用 S7-SCL 它自己取名,名字遵守标识符规则。标识符是是能够在 SCL 中用来取任何名

字的一般规则。 选择性地,能够在 STEP 7 中用符号表取名。该情况下也应用标识符规则或,附加项:符号。

将键入的内容放在单引号中,能够用所有可打印字符书写符号,如‘spaces’。

取名规则(Rules for Assigning Names)

请记住以下几点: 选择名字应不含糊且有含义,能够促进程序的理解。

Page 216: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

208

检查名字是否已经被系统所使用,如数据类型或标准函数的标识符。 范围:如果你使用全局名字,则其范围覆盖整个程序。本地范围的名字只对块有效。这使得

你能够在不同的块中使用相同的名字。下表中列出各种可用的选项。

限制(Restrictions)

取名时,记住以下限制: 名字在其使用范围内必须是唯一的,那就是,在特定块中已经使用的名字不能再在同一块中使用。

此外,以下名字为系统保留,不能使用: 关键字的名字:如 CONST, END_CONST, BEGIN 运算符的名字:如 AND, XOR 预定义标识符的名字:如数据类型的名字,像 BOOL, STRING, INT 预定义常量的名字:如 TRUE 和 FALSE 标准函数的名字:如 ABS, ACOS, ASIN, COS, LN 共享的系统数据的绝对地址标识符:如 IB, IW, ID, QB, QW, QD MB, MD

使用标识符(Using IDENTIFIERS)

下表显示能够使用遵守标识符规则的名字的场合: 标识符 描述 规则 名块 块的符号名称 块标识符,函数调用 定时器或计数器的名字 定时器或计数器的符号名称 定时器标识符、计数器标识符 属性名 属性的名称 属性的指派 常量名 符号常量的声明/使用 常量子域

常量 标号 标号的声明/使用 村号子域、语句部分、GOTO

语句 变量名 临时变量或静态变量的声明 变量声明、简单变量、结构化

变量 本地实例名 本地实例的声明 实例声明、FB 调用

块标识符(BLOCK IDENTIFIER)

在块标识符规则中,能够使用标识符或符号:

定时器标识符和计数器标识符规则类似于块标识符规则。

Page 217: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

209

15.1.11 预定义的常量和标志(Predefined Constants and Flags)

下表造就英语和德语助记符。

常量(Constants)

助记符 描述 FALSE 预定义的值为 0 的布尔常量(标准常量),;逻辑意义是条件不成立。 TRUE 预定义的值为 1 的布尔常量(标准常量),逻辑意义是条件成立。

标志(Flags)

助记符 描述 EN 块激活标志 ENO 块出错标志 OK 如果语句执行错误,标志设置为 FALSE。

15.2 组词规则

15.2.1 概述:组词规则(Overview: Lexical Rules)

组词规则描述了在编译器执行词法分析期间处理的元素(语言符号)的结构。介于此,组词规则没

有灵活的格式,必须严格遵守。实际上,意味着: 不允许插入格式字符, 不能插入节注释和行注释。 不允许插入标识符的属性。

15.2.2 标识符(Identifiers)

规则 句法图 标识符

Page 218: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

210

块标识符

定时器标识符

计数器标识符

块关键字

符号

数字,号码

Page 219: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

211

15.2.3 常量(Constants)

规则 句法图 位常量 Bit constant

整数常量 Integer constant

实数常量 Real number constant

十进制数字串 Decimal digit string

二进制数字串 Binary digit string

八进制数字串 Octal digit string

Page 220: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

212

十六进制数字串 Hexadecimal digit string

指数 Exponent

字符常量 Character constant

串常量 String constant

字符 Characters

Page 221: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

213

断串 String Break

日期 Date

时间周期 Time period

日型时间 Time of day

日期时间 Date and time

日期 Date

日型时间 Time of day

Page 222: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

214

(时间的)十进制表达

式 Decimal representation

复杂日期格式 Composite time format

15.2.4 绝对地址(Absolute Addressing)

规则 句法图 简 单 内

存存取

Page 223: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

215

索 引 内

存存取

内 存 地

址 标 识

绝 对 数

据 块 存

索 引 数

据 块 存

结 构 数

据 块 存

地 址 标

识 符

DB

内 存 前

Page 224: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

216

用 于 内

存 和 数

据 块 的

前缀

用 于 内

存 和 数

据 块 的

地址

存 取 本

地实例

15.2.5 注释(Comments)

插入注释时,以下几点很重要须记住: 如果激活了“允许嵌套注释”,则允许嵌套注释。 能够在句法规则的任意点插入,但在组词规则中则不行。

规则 句法图 注释

行注释

注释部分

15.2.6 块属性(Block Attributes)

块属性能够放在块标识符之后,第一个变量或参数声明子域之前,使用下面的句法:

Page 225: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

217

规则 句法图 标题 Title

版本 Version

块保护 Block protection

作者 Author

参数名 Parameter name

块系列 Block family

块的系统属性 System attributes for blocks

15.2.7 编译器选项(Compiler Options)

编译器选项在源文件中的地个限定的行中,不受块位置限制。全部非大小写敏感。 规则 句法图 编译器选项

Page 226: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

218

15.3 语法规则

15.3.1 概述:句法规则(Overview: Syntax Rules)

句法规则建立在组词规则之上,定义 SCL 的结构。在这些规则限定下,S7-SCL 源文件的结构是

灵活的。 每条规则在定义前均有一个名字。如果一个规则被高级规则所用,则在高级规则中作为一个非术

语项名字出现。 如果名字用大写字母(译成中文时用加下划线表示)在长方形盒子中,意味着它是在组词规则中描

述的语言符号。 在圆角长方形或圆形中的规则的名字的信息在标题为 “形式语言描述 (Formal Language Description)”节能够找到。

灵活的格式(Flexible Format)

灵活的格式意思是: 能够在任意位置插入格式化字符。 能够插入注释行和注释部分。

15.3.2 S7-SCL 源文件的结构

规则 句法图

Page 227: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

219

S7-SCL 程序 S7-SCL program

S7-SCL 程序单元 S7-SCL program unit

组织块(OB) Organization block

函数 记住如果在函数的代

码部分没有 VOID,其

返回值必须指定给函

数名。 Function Note that if functions do not have VOID in the code section, the return value must be assigned to the function name.

功能块 Function block

Page 228: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

220

数据块 Data block

用户定义数据类型 User-defined data type

15.3.3 声明部分的结构(Structure of the Declaration Sections)

规则 句法图 OB 的声明部分 OB declaration section

FC 的声明部分 FC declaration section

FB 的声明部分 FB declaration section

Page 229: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

221

DB 的声明部分 DB declaration section

DB 的赋值部分 DB assignment section

常量子域 constant subsection

标签子域 Label subsection

静态变量子域 Static variable subsection

变量声明 Variable declaration

Page 230: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

222

数据类型初始化 Data type initialization

数组的初始化表 Array initialization list

实例声明 (仅可能在 FB 的 VAR部分) Instance declaration (possible only in the VAR section of an FB)

Page 231: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

223

临时变量子域 Temporary variable subsection

参数子域 Parameter subsection

数据类型说明 Data type specification

15.3.4 在 S7-SCL 中的数据类型(Data Types in S7-SCL)

规则 句法图

Page 232: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

224

基本数据类型 Elementary data type

位数据类型 Bit data type

字符类型 Character type

串数据类型说明 STRING data type specification

数字数据类型 Numeric data type

时间类型 Time type

DATE_AND_TIME

Page 233: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

225

数组数据类型 ARRAY data type specification

结构数据类型说明 STRUCT data type specification Remember that the END_STRUCT keyword must be terminated by a semicolon.

元素声明 Component declaration

参数类型说明 Parameter type specification

15.3.5 语句部分(Statement Section)

规则 句法图

Page 234: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

226

语句部分 Statement section

语句 Statement

赋值语句 Value assignment

扩展变量 Extended variable

简单变量 Simple variable

Page 235: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

227

结构化变量 Structured variable

15.3.6 赋值(Value Assignments)

规则 句法图 表达式 Expression

简单表达式 Simple expression

简单乘法 Simple multiplication

Page 236: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

228

地址 Address

扩展变量 Extended Variable

常量 Constant

指数 Exponent

基本逻辑运算 Basic logic operation

基本算术运算 Basic arithmetic operation

Page 237: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

229

比较运算 Comparison operation

15.3.7 调用函数和功能块(Calling Functions and Function Blocks)

规则 句法图 功能块调用 FB call

函数调用 Function call

功能块参数 FB parameter

Page 238: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

230

函数参数 FC parameters

输入赋值 Input assignment

输入/输出赋值 In/out assignment

输出赋值 Output assignment

15.3.8 控制语句(Control Statements)

规则 句法图

Page 239: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

231

IF 语句 记住关键字 END_IF 必

须用分号结束。

CASE 语句 记住关键字END_CASE必须用分号结束。

值表

Page 240: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

232

分支和跳转语句

FOR 语句 记住关键字 END_FOR必须用分号结束。

初始语句

WHILE 语句 记 住 关 键 字

END_WHILE 必须用分

号结束。

REPEAT 语句 记 住 关 键 字

END_REPEAT 必须用

分号结束。

Page 241: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

233

CONTINUE 语句

RETURN 语句

EXIT 语句

程序跳转

Page 242: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

234

16 技巧与秘诀 在数据块中存取结构时的运行时优化代码

如果需要在数据块中多次存取一个结构,建议用下列方法: 用结构类型建立一个本地变量。 从数据块将结构指定给变量一次。 然后就能够在代码中多次使用此变量,而不必再次存取 DP。 例子 DB100.array[i].value := DB100.array[i].value1 * DB100.array[i].value2 / DB100.array[i].value3 ; 此例需最少内存,如果如下编程,运行时间较短。 VAR_TEMP tmp : STRUCT value : REAL; value1 : REAL; value2 : REAL; value3 : REAL; END_STRUCT; END_VAR tmp := DB100.array[i]; DB100.array[i].value := tmp.value1 * tmp.value2 / tmp.value3; 备注 用 VAR_TEMP,在 CPU 的堆栈中存贮变量。对于不型 CPU,可能导致堆栈溢出;而且应该节

省使用临时变量!

分配小型 CPU 的 L 堆栈的问题

分配 L 堆栈的问题是由于小型 CPU 的小堆栈空间。在大多数情况下,能够通过如下离线检测来

避免: 节省使用临时变量(VAR_TEMP 或 VAR 部分)。 不要声明高级数据类型的 any 变量和将基本数据类型变量的数目减至最少。 使用静态变量:

- 编制一个 FB 时,使用 VAR 部分取代 VAR_TEMP。 - 编制 OB 或 FC 时,尽量用共享数据块或位内存。

避免使用复杂的表达式。在处理复杂表达式时,编译器将中间结果存贮在堆栈中。依据中间

结果的类型的数目,可能越出可用的堆栈空间。 补救措施: 将表达式分成几个较小的表达式,并将中间结果显式指定给变量。

监视期间实数的输出

“监视”测试功能能够在显示非打印的实数时,产生下列形式:

Page 243: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

235

值 符号 + 无穷大 1.#INF 随机数-数字 - 列穷大 -1.#INF 随机数-数字 不确定 数字.#IND 随机数-数字 NaN 数字. #NAN 随机数-数字

管理源文件、接口和代码的时间戳

源文件的时间戳(Time stamps of the source file) 一个 S7-SCL 源文件总有最后一次修订的时间戳。 块代码的时间戳(Time stamp of the block code) 块(FB, FC 和 OB)总有其编译时的时间戳。 块接口的时间戳(Time stamp of the block interface) 接口的时间戳只有在接口的结构被修改时才会改变;换言之, 如果修改的是代码部分、属性、注释、VAR_TEMP(FC 中是 VAR)部分、或是参数或变量的

名称的表示方面,时间戳保持不变。同时也适应下层接口。 当修改了数据类型或任何参数或变量的初始值,或增减了参数,以及涉及多实例时 FB 的名

字改变了时,将修订接口的时间戳。

STEP 7 标准函数和系统函数的返回值

许多 STEP 7 的标准函数和系统函数为包含错误代码的 INT 型函数值。在参考手册中,关于这些

函数的可能的错误代码被当作固定代码字"W#16#8093"指定。 关于类型混合使用 S7-SCL 是一种规则严格的语言,以至于 INT 和 WORD 都不能混合使用。例

如,下面的问题不会产生所要的结果: IF SFCxx(..) = 16#8093 THEN ... 然而,能够告诉 S7-SCL 编译器:WORD 应当作 INT 类型,如下: 用类型定义常数。此时上面的问题应如下表现:

IF SFCxx(..) = INT#16#8093 THEN ... 用转换 WORD_TO_INT()。将上面的问题按如下公式写:

IF SFCxx(..) = WORD_TO_INT(16#8093) THEN ...

重接(Rewiring Blocks)

用选项(Options) > 重接(Rewire)SIMATIC 管理器功能,再不能够重接在 S7-SCL 块中的块调用。

必须在的影响的块的 S7-SCL 源文件中手动编辑调用。 推荐: 在符号表中训块定义符号名,并用其符号名来调用块。 在符号表中为绝对地址(I, M, Q 等)定义符号名,并在程序中使用符号名。 如果以后要重接块,只需在符号表中改变指定而不需在 S7-SCL 源文件中进行改变。

给结构分配偶数字节长度

结构的长度总是填充到字界限。为了应用偶数字节数结构,S7-SCL 提供了 AT 架构:

Page 244: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

236

例子: VAR theStruct : STRUCT twoBytes : ARRAY [0..1] OF BYTE; oneInt : INT oneByte : BYTE; END_STRUCT; fiveBytes AT theStruct : ARRAY[0..4] OF BYTE; END_VAR 使用了需要 5 个字节的标识符 fiveBytes。这样标识符 theStruct 能够用作结构化存取。

FOR 语句的限制

为要编制“可靠的”FOR 语句,其不能连续运行,遵守下列规则和限制。 规则(Rule) FOR ii := beginning TO end BY step DO

If... then: Remark beginning < end end < (PMAX - step) 变量 ii 往负方向运行。 beginning > end AND step < 0 end > (NMAX - step) 变量 ii 往负方向运行。

界限(Limits) 应用两种可能的数据类型的不同界限: 数据类型 Data Type

PMAX NMAX

INT 类型的 ii 32_767 -32_768 DINT 的 ii 2_147_483_647 -2_147_483_648

Page 245: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

237

术语表 实际参数(Actual Parameter)

当功能块(FB)和函数被调用时,实际参数(Actual parameters)将取代形式参数(formal parameters)。 例如:形式参数“Start”被实际参数“I3.6”取代。

地址(Address)

地址是语句的组成部分,指定运算执行的数据在哪里。绝对方式和符号方式均能够用来寻址。

地址标识符(Address Identifier)

地址标识符是一个包含信息的运算的一个地址的组成部分。例如,运算能够存取的用以执行一个

逻辑运算的值(数据目标),或者用以执行一个逻辑运算的变量的值,在内存区域中的详细情况。

在指令"Value := IB10"中,“IB”是地址标识符(“I”指内存中输入区域,“B”当作区域的一个字节)。

寻地(Addressing)

在用户程序中一个内存位置的指定。内存位置可指定为特定的地址或地址区域(如:输入点 I 12.1,内存字 MW25)。

绝对寻址(Addressing, Absolute)

通过绝对寻址,指明被处理地址和内存位置。例如:地址 Q4.0 表示处理输出区的第 4 字节的第 0位。

符号寻址(Addressing, Symbolic)

使用符号寻址,要处理的地址作为一个符号键入,而不是地址。将符号指定到一个地址是在符号

表或使用符号文件。

数组(Array)

数组是一个复杂数据类型,包含一定数量的同类型的数据元素,其中的数据元素双可以是基本类

型或复杂类型。

赋值(Assignment)

将一个值赋予变量的行为。

Page 246: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

238

属性(Attribute)

属性即特性,同诸如块标识符或变量名称等相关联。在 SCL 中存在后面这些属性:块标题(block title),发行版本号(release version),块保护(block protection),作者(author),块名称(block name),块系列(block family)

BCD

二进制码形十进制。在 STEP 7 中,CPU 内的定时器和计数器的内部码只用 BCD 格式。

位内存(Bit Memory (M))

在 SIMATIC S7 CPU 中系统内存的一个内存区域。该区域能够用读或写出进行存取(位, 字节, 字, 和双字)。位内存区域能够用来储存临时结果。

块(Block)

块是用户程序的子单元,按他们功能、结构或用途划分。在 STEP 7 中,有逻辑块(FBs, FCs, OBs, SFCs 和 SFBs)、数据块(DBs 和 SDBs)和用户自定义数据类型(UDTs)。

块调用(Block Call)

块调用在 STEP 7 中启动一个块执行。组织块只能被操作系统调节器用;其他块均可被 STEP 7 用

户程序调用。

块类别(Block Class)

根据信息类型块被细分,包括以下两个类别:逻辑块和数据块。

块注释(Block Comment)

可以键入关于块的附加信息(如:描述自动化过程)。注释不会载入 SIMATIC S7 可编程控制器。

块保护(Block Protection)

用块保护,可保护编译后的各个块。在编译源文件时指定关键字"KNOW_HOW_PROTECTED"的值来激活保护(功能)。

块类型(Block Type)

STEP 7 的块构造包括以下块类型:组织块、功能、函数、数据块,以及系统功能块、系统函数、

系统数据块和用户定义数据类型。

Page 247: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

239

书签(Bookmarks)

书签是在源文件中标记位置的临时性文本,协助浏览源文件。

断点(Breakpoint)

该功能用来在程序中特定点将 CPU 置到 HOLD(挂起)位置。当程序执行到一个断点(位置),像单

步指令或控制/监视变量变为可能。

调用层次(Call Hierarchy)

要执行块,先调用它。调用的次序和嵌套序列称作调用层次。

调用接口(Call Interface)

在 STEP 7 用户程序中,一个块的输入、输出、输入/输出参数(形式参数)定义了调用接口。块被

调用时,这些参数被实际参数所取代。

CASE 语句(CASE Statement)

这是一个多分支语句。其通过选择表达式的值决定 n 个分支之一来选择特定的程序分支。

注释(Comments)

能够在程序中包含解释性文本的语言架构,客观存在不影响程序的运行。

编译(Compilation)

从源文件产生可执行用户程序的过程。

编译,类源文件(Compilation, Source-Oriented)

对于类源文件输入,只有所有指令全部键入时,源文件才被编译为一个可执行用户程序。编译器

检查输入错误。[译者认为:不用 SCL 的内置编辑器而用其他文本编辑软件编写 SCL 源代码文件,

然后再导入 STEP 7 进行编译,此时的源文件就称作类源 Source-Oriented 文件]

常量/常数(Constant)

在逻辑块中保持不变值储存器。其用来增强程序的易读性。例如:指定一个储存器

“Max_loop_iterations”替代一个特定值(如:10)。当块被调用时,常量的值(如:10)代替了储存器。

Page 248: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

240

符号常量(Constant, (symbolic))

带符号名的常量是在逻辑块中储存常量值的储存器。符号常量用来提高程序的易读性。

CONTINUE 语句(CONTINUE Statement)

其用来结束循环语句(FOR, WHILE or REPEAT)本次循环的执行()。

计数器(Counter)

计数器是 CPU 系统内存里的部件。计数器的内容被操作系统异步更新。STEP 7 指令用来定义计

数器准确的功能(如:count up)和启用(如:start)。

数据块(Data Block (DB))

数据块是包含用户程序操作的数据和参数的块。对比其他类型的块,它们不含指令。

静态数据(Data, Static)

静态数据是功能块的本地(局部)数据,存储在实例数据块中,并保持到功能块的下一次执行。

临时数据(Data, Temporary)

临时数据是块的本地数据,块执行时存贮在本地栈(L stack)中。一旦块执行完毕,数据不再可用。

数据类型(Data Type)

数据类型确定了以下: 数据元素的形式和含义 数据元素的值的范围和默认的内存 在数据类型上可执行的操作 数据元素的表示法

复杂数据类型(Data Type, Complex)

复杂数据类型由基本数据类型组建。结构类型和数组是有区别的。数据类型 STRING 和

DATE_AND_TIME 也是复杂数据类型。

数据类型转换(Data Type Conversion)

要求对两种不同类型数据进行操作时,必须进行数据类型的转换。

Page 249: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

241

基本数据类型(Data Type, Elementary)

基本数据类型是依据 IEC 1131--3 预定义的数据类型。例如:数据类型"BOOL"定义一个二进制变

量位("bit");数据类型“INT”定义一个 16 位的整数变量。

用户定义数据类型(Data Type, User-defined)

用户定义数据类型是可以用已声明的数据类型创建的数据类型。每个指定一个唯一名称并能够使

用作任一次数。用户定义数据类型对于生成具有同样结构(如:控制器)的多个数据块非常有用。

声明(Declaration)

一种定义语言元素的机制。声明包含语言元素与标识符的连系,属性和数据类型的指定。

声明部分(Declaration Section)

块的变量声明按各种类型块参数分割成各种声明部分。如,声明部分 IN 包含输入参数的声明,

声明部分 OUT 包含输出参数的声明。 如果用文本编辑器编写程序,在声明部分声明逻辑块的本地数据。

下载(Download)

可载入目标(如:逻辑块)从编程设备传送到 CPU 内存。

激活(Enable (EN))

在 STEP 7 中,每个功能块和每个函数均有一个隐式定义的输入参数"Enable" (EN),当块被调用时,

它能够被设置。如果 EN 为 TRUE(真),被调用的块将被执行,否则不执行。

激活输出(Enable Output (ENO))

在 STEP 7 中,每个功能块和每个函数均有一个输出参数"Enable Output" (ENO)。当块执行完成

OK 标志的值设置到 ENO。调用块之后,立即检查 ENO 的值,看看块内所有操作是否正确运行

或出错了。

EXIT 语句(EXIT Statement)

程序里的语言结构,用来在任意点不论条件如何,退出循环。

表达式(Expression)

在 SCL 中,表达式就是数据处理。算术、逻辑和比较表达式是有差别的。

Page 250: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

242

FOR 语句(FOR Statement)

程序中的语言结构。用于当控制变量被连续赋值,在一个循环中执行一个语句序列。

形式参数(Formal Parameter)

形式参数是在构成逻辑块的为“实际”参数准备的占位符。在 FBs(功能块)和 FCs(函数)中,形式参

数由编程者声明,在 SFBs(系统功能块)和 SFCs(系统函数)中,形式参数已经存在。块被调用时,

形式参数指定为实际参数赋结果,被调用块用实际参数来工作。形式参数当作本地块数据,并分

为输入、输出和输入/输出参数。

函数(Function (FC),在 STEP 7 中文版中称“功能”)

根据国际电工协会 IEC 1131-3 标准,函数是一个没有静态数据的逻辑块。在用户程序中函数允许

传递参数,意思是他们适合于编制复杂的要频繁使用的复杂功能,如计算器。

功能块(Function Block (FB))

根据国际电工协会 IEC 1131-3 标准,功能块是有静态数据的逻辑块。因为一个 FB 拥有“内存”(实例数据块),就可能在任何时候在用户程序中的任何位置存取它的参数。

GOTO 语句(GOTO Statement)

程序中的语言结构。GOTO 语名使程序立即跳到指定的标号,到程序块中不同的语句。

保持(HOLD)

CPU 根据编程设备要求从运行(RUN)状态变为保持(HOLD)状态。此状态下可能执行特殊的测试

功能。

标识符(Identifier)

其由字母、数字和下划线组成,标识语言元素。

初始值(Initial Value)

系统起动时,赋给变量的值。

输入/输出参数(In/Out Parameter)

输入/输出参数存在于函数和功能块中。手来传递数据到被调用的块,处理完成后,从被调用块返

回原变量的结果。

Page 251: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

243

输入参数(Input Parameters)

输入参数只存在于函数和功能块中。用来传递数据给被调用的块进行处理。 实例(Instance)[译者注:STEP 7 中文版称“背景”,译者认为“实例”更合适,在块的接口部分声明

了“形式(formal)”参数,由此而产生数据块,就是“形式”的“实例”] 词“实例”涉及功能块的调用。实例数据块或本地(局部)实例指定给有关的功能块。在一个 STEP 7用户程序中,如果功能块被调用 n 次,每次使用不同的参数和不同的实例数据块名,则有 n 个实

例。 实例数据块(Instance Data Block (Instance DB))[注:在 STEP 7 中文版中,译为“背景数据块”,译

者用“类”的概念来领会“功能块”的意思,故用“实例”一词,应更为贴切] 实例数据块存贮功能块的形式参数和静态的本地数据。一个实例数据块能够指定给一个 FB 调用

或功能块调用链。

整数(Integer (INT))

整数是数据类型之一。其值是 16 位(bit)的全部数字。

关键字(Keyword)

一个保留的表示语言元素的字,如“IF”。 在 SCL 中,关键字用来标志块的开始,在声明部分标志子区域,和标识指令;也用在属性和注释

(方面)。

构词规则(Lexical Rule)

SCL 的格式化语言描述的低级规则包含构词规则。他们不允许灵活的格式,就是说,不允许有多

余的空格和控制字符。

字面,文字(Literal)

决定值和常时类型的形式表示法。

本地(局部)数据(Local Data)

本地数据是指定给特定逻辑块的数据,其在声明部分或变量声明中声明。依实际的块,它包含形

式参数、静态数据和临时数据。

逻辑块(Logic Block)

在 SIMATIC S7 中的逻辑块是包含 STEP 7 用户程序的部分。事实上,数据块仅包含数据。有以下

几种类型的逻辑块:组织块(OBs)、功能块 (FBs)、函数(FCs)、系统功能块(SFBs)和系统函数(SFCs)。

Page 252: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

244

内存区域(Memory Area)

一个 SIMATIC S7 CPU 有三个内存区域:本地(局部)区、工作区和系统区。

助记符(Mnemonics)

助记符是程序中程序操作和地址的缩写表述。STEP 7 支持英语表述(如,“I”当作输入)和德语表述

(如,“E”当作输入,德语词“输入”的缩写)

监视(Monitoring)

通过监视,能够检查程序在 CPU 中是如何执行的。监视时,诸如变量和参数的名称和实际值按

顺序显示和循环更新。

多重实例(Multiple Instance,有些时候称“多重背景”)

非项,非词条(Non Term)

非词条是一个用句法描述的复杂元素,由其他词法或句法规则描述。

离线(Offline)

离线是一种操作模式,编程设备没有(物理地或逻辑地)连接到 PLC。

OK 标志(OK Flag)

其用来标识块中的命令序列执行的正确和错误,是一个 BOOL(布尔)类型的共享变量。

在线(Online)

在线是一种操作模式,编程设备(物理地或逻辑地)与 PLC 连接。

在线帮助(Online Help)

用 STEP 7 编程软件工作时,能够在屏幕上显示上下文相关的帮助(信息)。

运算符(Operation)

运算符是语句的一部分,说明处理器要执行的动作。

Page 253: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

245

组织块(Organization Block (OB))

组织块构成 S— CPU 操作系统和用户程序之间的接口。组织块指定用户程序中块的执行序列。

输出参数(Output Parameter)

在用户程序中块和输出参数是用来传递结果到调用它的块。

参数类型(Parameter Type)

参数类型是关于定时器、计数器和块的特殊数据类型。能够用于功能块的输入参数,和仅为传送

定时器和计数器读数的功能块的输入/输出参数,及块到被调用块。

处理映象(Process Image)

用处理映象将数字输入和输出模块的信号状态存贮在 CPU 中。有办出表处理映象(PII)和输出表处

理映象(PIQ)。

输入表处理映象(PII)(Process-image Input Table (PII))

在用户程序进行处理前,操作系统读入输入的处理映象。

输出表处理映象(PIQ)(Process-image Output Table (PIQ))

在用户程序完成后,操作系统将输出处理映象传送到输出模块。

结构化程序设计(Programming, Structured)

使实现复杂自动化任务这得容易,将用户程序分成几部分,自成一体的子程序(块)。用户程序的

子块是基于功能化的考虑或系统的技术结构。

符号化程序设计(Programming, Symbolic)

SCL 编程语言允许使用符号字符串代替地址:例如,地址 Q1.1 能够用"valve_17"代替。符号表建

立了地址和指定的符号字符串之间的联接。

项目(Project)

在一个文件夹中存贮与实际的自动化方案相关的所有对象,不管是多个工作站、模块,还是其怎

样组网。

Page 254: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

246

实数(Real Number)

实数是描述十进制值的正数或负数。例如:0.339 或 1.1。

REPEAT 语句(REPEAT Statement)

在程序中用来重复一系列语句直到条件满足的语言结构。

RETURN 语句(RETURN Statement)

在程序中退出当前块的语言结构。

返回值(Return Value (RET_VAL))

对比功能块,函数产生一个结果作为返回值。

运行(RUN)

在运行(RUN)模式,用户程序被子执行,过程映象被循环修订,所有输出被激活。

RUN-P

编程运行(RUN-P)操作模式同运行(RUN)模式一样,此外,所有编程设备功能均无限制。

S7 用户程序(S7 User Program)

装有块的文件夹下载到可编程的 S7 模块(如 CPU 或 FM),并作为控制一个系统或过程的部分能够

在模块上运行。

扫描周期监视时间(Scan Cycle Monitoring Time)

如果执行用户程序所花的时间超过了扫描周期监视时间,操作系统将产生一个错误信息,并将

CPU 置为 STOP 模式。

扫描周期时间(Scan Cycle Time)

CPU 执行用户程序一次所需的时间为扫描周期时间。

SCL

遵循标准 DIN EN-61131-3(国际标准 IEC 1131-3)的类 PASCAL 高级语言, 用来在一个 CPU 上编

制复杂的运算程序,例如,算法和数据处理任务。简称"结构化控制语言"。

Page 255: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

247

SCL 编译器(SCL Compiler)

SCL 编译器是一个批编译器,用来将用文本编辑器写的程序(SCL 源文件)转换成 M7 机器代码。

已编译的块存贮在 S7 程序的"块"文件夹中。

SCL 调试器(SCL Debugger)

SCL 调试器是一个高级语言调试器,用来在用 SCL 建立的用户程序中查找逻辑编程错误。

SCL 编辑器(SCL Editor)

SCL 编辑器是一个设计用来用 SCL 建立 SCL 源文件的特定的编辑器。

SCL 源文件(SCL Source File)

SCL 源文件是用 SCL 编写的程序文件。SCL 源文件将被 SCL 编译器转换成机器代码。

语义(Semantics)

编程语言的符号元素与其含义、解释及应用之间的关联。

共享数据(Shared Data)

共享数据是能够被任何逻辑块(FC, FB 或 OB)存取的数据。特别地它包含位内存(M)、输入(I)、输

出(O)、定时器、计数器和数据块(DBs)的元素。全局数据能够用绝对或符号方式寻址。

单步(Single Step)

单步是指被 SCL 调试器在调试操作时执行的一个步程序。在单步调试模式,能够一次执行一条指

令,并在结果窗口看到每步的结果。

源文件(Source File)

用图形或文本编辑器建立的程序部分,能够将其编译成可执行的用户程序。

语句 Statement

语句是用文本编辑语言编写的最小不可分单元。它描述了处理器执行的特定操作。

状态字 Status Word

状态字是 CPU 寄存器的一部分。状态字包含了与 STEP 7 命令的处理相关的状态信息和错误信息。

Page 256: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

248

状态位能够被编程者读和写。错误位则是只读的。

结构 Structure (STRUCT)

包含不同数据类型的复杂数据类型。在结构中的数据类型可是基本的或较复杂的。

符号 Symbol

符号是用户遵循某些语法规则定义的一个名字。一旦定义,名字能够用来编程和运算,以及监视

(如,变量、数据类型、跳转标签、或块)。例子:地址:I 5.0、数据类型:Bool、符号:Emer_Off_Switch 符号表 Symbol Table 用来为共享数据和块将符号(或符号名)指定给地址的表。例子:Emer_Off (符号)、I1.7 (地址)、Controller (符号)、SFB24 (块)

语法规则 Syntax Rule

用规范 SCL 语言描述的由句法规则的高级规则。使用时不受格式限制;换言之,能够加入空格和

控制字符。

系统数据块 System Data Block (SDB)

系统数据块是在 S7 CPU 中的数据区域,包括系统设置和模块参数。系统用 STEP 7 标准软件建立

和编辑。

系统函数 System Function (SFC)

系统函数(SFC)是集成在 CPU 操作系统中的函数,需要时,能够被 STEP 7 用户程序所调用。

系统功能块 System Function Block (SFB)

系统功能块(SFB)是集成在 CPU 操作系统的功能块,需要时,能够被 STEP 7 用户程序所调用。

系统内存(系统区域)System Memory (System Area)

系统内存集成在 CPU 中,称作 RAM。操作系统内部所需的地址区(定时器、计数器、位内存等)和数据区(如,通讯备份)存贮在系统内存中。

项,词条(Term)

词条是词法规则或句(语)法规则中的基本元素,用文字词汇表达,不能再用其他规则来解释。词

条可是关键字甚至是一个字符。

Page 257: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

249

计时器(Timers)

计时器是 CPU 系统内存中的部件。对于用户程序,其内容被操作系统异步修改。能够用 STEP 7指令定义计时器的准确功能(如:on-delay timer[上电延时])和启动其运行(Start)。

UDT

见:用户定义数据类型。

用户数据(User Data)

用户数据被 CPU 与信号模块、功能模块和通讯模块通过处理映象或直接存取方式进行交换。用

户数据举例:从信号模块来的数字和模拟输入/输出信号、从功能模块来的控制和状态数据。

用户程序(User Program)

用户程序包含所有的语句、声明和控制装置或过程信号处理要求的数据。程序指定到一个可编程

模块(如 CPU、FM),且能被用最小单元(块)进行结构化。

变量(Variable)

变量定义一项数据,变量内容能在 STEP 7 用户程序中使用。变量由一个地址(如:M3.1)和数据类

型(如:BOOL[布尔型])组成,且用有意义的符号名称(TAPE_ON)标识:变量在声明部分声明。

变量声明(Variable Declaration)

变量声明包括符号名称、数据类型的指定,必要时,还有初始值和注释。

变量表(Variable Table)

变量表是将要监视和修改的变量,包括其格式化信息集中在一起而形成。

视图(View)

要存取带声明的不同类型的变量,就定义一个变量或变量中的区域的视图。视图能够在块中像其

他变量一样使用。它继承了变量的所有属性,只是数据类型是新的。

Page 258: 打开块( - gongkongftp.gongkong.com/UploadFile/datum/2011-3/... · 3.1 一个针对初次用户的例子——“获取测量值”(Welcome to "Measured Value Acquisition" A

250