创建 SCL 程序SCL的基础知识SCL 编程语言 SCL 编程语言 SCL(Structured ControlLanguage,结构化控制语言)是一种基于 PASCAL 的gaoji编程语 言。 这种语言基于标准 DIN EN61131-3(guojibiaozhun为 IEC 1131-3)。 根据该标准,可对用于可编程逻辑控制器的编程语言进行标准化。SCL 编程语言实现了该标 准中定义的 ST 语言 (结构化文本) 的 PLCopen 初级水平。 语言元素 SCL 除了包含 PLC的典型元素(例如,输入、输出、定时器或存储器位)外,还包含gaoji编 程语言。 • 表达式 • 赋值运算 • 运算符 程序控制SCL 提供了简便的指令进行程序控制。例如,创建程序分支、循环或跳转。 应用 SCL 尤其适用于下列应用领域: • 数据管理 •过程优化 • 配方管理 • 数学计算 / 统计任务
表达式 说明表达式将在程序运行期间进行运算,返回一个值。一个表达式由操作数(如常数、变量 或函数调用)和与之搭配的操作符(如 *、/、+ 或-)组成。通过运算符可以将表达式连接 在一起或相互嵌套。 运算顺序 表达式将按照下面因素定义的特定顺序进行运算: •相关运算符的优先级 • 从左到右的顺序 • 括号 在该表达式中,请勿使用影响全局或静态变量的函数调用。 表达式类型不同的运算符,分别可使用以下不同类型的表达式: • 算术表达式算术表达式既可以是一个数字值,也可以是由带有算术运算符的两个值或表达式组合而成。 • 关系表达式关系表达式将对两个操作数的值进行比较,得到一个布尔值。如果比较结果为真,则 结果为 TRUE,否则为 FALSE。 • 逻辑表达式逻辑表达式由两个操作数以及逻辑运算符(AND、OR 或 XOR)或取反操作数 (NOT) 组成。 如何使用表达式表达式的结果有如下几种不同用法: • 作为一个值,赋给一个变量 • 作为一个条件,用于一条控制指令 •作为一个参数,用于一个调用块或指令算术表达式 说明 算术表达式既可以是一个数字值,也可以是由带有算术运算符的两个值或表达式组合而成。算术运算符可以处理当前 CPU 所支持的各种数据类型。如果在该运算中有 2 个操作数,那 么可根据以下条件来确定结果的数据类型: •如果这 2 个操作数均为有符号的整数,但长度不同,那么结果将采用长度较长的那个整 数数据类型(例如,INT + DINT =DINT)。 • 如果这 2 个操作数均为无符号整数,但长度不同,那么结果将采用长度较长的那个整数 数据类型(例如,USINT +UDINT = UDINT)。 • 如果一个操作数为有符号整数,另一个为无符号整数,那么结果将采用另一个长度较大的有符号数据类型(其包含此无符号整数)(例如,SINT + USINT = INT) 只有在未设置 IEC检查时,才能执行具有此类操作数的运算。 • 如果一个操作数为整数,另一个为浮点数,那么结果将采用浮点数的数据类型(例如, INT +REAL = REAL)。 • 如果 2 个操作数均为浮点数,但长度不同,结果将采用长度较长的那个浮点数的数据类型 (例如,REAL+ LREAL = LREAL)。 • 对于操作数为“时间”和“日期和时间”数据类型组,运算结果的数据类型请参见“算术表达式的数据类型”部分的表格。 设置了 IEC 检查时,不能使用数据类型组“时间”和“日期和时间”的数据类型。关系表达式 说明关系表达式将两个操作数的值或数据类型进行比较,得到一个布尔值。如果比较结果为 真,则结果为 TRUE,否则为 FALSE。关系运算符可以处理当前 CPU 所支持的各种数据类型。结果的数据类型始终为 BOOL。 编写关系表达式时,请注意以下规则: •以下数据类型组中的所有变量都可以进行比较: – 整数/浮点数 – 二进制数 – 字符串 •对于以下数据类型/数据组,只能比较相同类型的变量: – TIME、LTIME – 日期和时间 – PLC 数据类型 – ARRAY –STRUCT – Any 指向的变量 – VARIANT 指向的变量 • STRING 比较是对以 Windows字符集编码的字符进行比较;而 WSTRING 比较则是对 UTF-16编码的字符进行比较。在比较过程中,将比较变量的长度及各字符对应的数值。 • S5TIME 变量不能作为比较操作数。需要将 S5TIME显式转换为 TIME 或 LTIME 数据类型。 比较浮点数比较浮点数时,待比较的操作数必须具有相同的数据类型,而无需考虑具体的“IEC 检查”(IEC Check)设置。也可以对字符串中的各个字符进行比较。在操作数名称旁的方括号内,指定了待比较的字符位数。例如,“MyString[2]”将比较“MyString”字符串中的第二个字符。 比较定时器、日期和时间系统无法比较无效定时器、日期和时间的位模式(如,DT#2015-13-33-25:62:99.999_999_999)。即,如果这两个操作数中的一个值无效,则该 指令将返回以下结果:• “==:等于”的结果为 FALSE。 • “<>:不等于”的结果为 TRUE。 并非所有时间类型都可以直接相互比较,如S5TIME。此时,需要将其显式转换为其它时间类型(如,TIME),再进行比较。如果要比较不同数据类型的日期和时间,则需将较小的日期或时间数据类型显式转换为较大的日期或时间数据类型。例如,比较日期和时间数据类型 DATE 和 DTL 时,将基于 DTL 进行 比较。如果显式转换失败,则比较结果为 FALSE。 比较 WORD 数据类型的变量与 S5TIME 数据类型的变量 将 WORD数据类型的变量与 S5TIME 数据类型的变量进行比较时,这两种变量都将转换为 TIME 数据类型。WORD 变量将解释为一个S5TIME 值。如果这两个变量中的某个变量无法 转换,则不进行比较且输出结果FALSE。如果转换成功,则系统将基于所选的比较指令进行 比较操作。 比较结构 说明 结构比较的可用性 结构比较功能仅适用于固件版本为V4.2 及以上版本的 S7-1200 系列 CPU,以及固件版本为 V2.0 及以上版本的 S7-1500 系列 CPU。如果两个变量的结构数据类型相同,则可以比较这两个结构化操作数的值。比较结构化变量时,待比较操作数的数据类型必须相同,而无需考虑具体的“IEC 检查”(IEC Check) 设置。但 一个操作数为VARIANT,而另一个为 ANY 时除外。创建程序时,如果数据类型未知,则可 使用 VARIANT数据类型。这样,就可比较任意数据类型的结构化变量操作数。还可 以比较 VARIANT 或 ANY 数据类型的变量。可以从指令框的下拉列表中选择该比较指令的数据类型 VARIANT。支持以下数据类型的变 量: • PLC 数据类型 (UDT) •STRUCT(STRUCT 数据类型的结构需包含在 PLC 数据类型 (UDT) 中,或者待比较的两个 结构需为 ARRAY ofSTRUCT 的两个元素。不支持背景数据块和匿名结构的变量。) • Any 指向的变量 • VARIANT 指向的变量 要比较两个ARRAY 数据类型的变量,需满足以下要求: • 元素的数据类型必须相同。 • 两个 ARRAY 的维数必须相同。•所有维数的元素数量必须相同,而具体的 ARRAY 限值无需相同。 • 进行比较之前,需确保 TEMP 部分内块接口中声明的 ARRAY已使用有效值进行了初始化。 如果 ARRAY 元素的值无效,则比较的结果可能错误。 说明 ARRAY of BOOL 比较数据类型为ARRAY OF BOOL 的两个操作数时,如果元素的个数不能被 8 整除,则还会 对填充位进行比较,从而会影响Zui终的比较结果。说明在 S7-300/400 内部将通过扩展指令执行 STRING 和 DT 类型的比较。以下操作数不可用于这 些函数: • FC 的参数• STRUCT 或 ARRAY 类型的 FB 的输入输出参数 说明 比较硬件数据类型 HW_IO 与 HW_DEVICE如果要比较这两种数据类型,则需先在块接口的“Temp”区域创建一个 HW_ANY 数据类型的 变量,将数据类型为HW_DEVICE 的 LADDR 复制到该变量中。之后,才能比较 HW_ANY 和 HW_IO。逻辑表达式 说明逻辑表达式由两个操作数和逻辑运算符(AND、OR 或 XOR)或取反操作数 (NOT) 组成。 逻辑运算符可以处理当前 CPU所支持的各种数据类型。如果两个操作数都是 BOOL 数据类型, 则逻辑表达式的结果也为 BOOL数据类型。如果两个操作数中至少有一个是位字符串,则结 果也为位字符串结果是由Zui高操作数的类型决定。例如,当逻辑表达式的两个操作数分别是 BYTE 类型和 WORD 类型时,结果为 WORD 类型。 逻辑表达式中一个操作数为 BOOL类型而另一个为位字符串时,必须先将 BOOL 类型的操作 数显式转换为位字符串类型。