AI 摘要

SCL语言可用于数据管理、过程优化、配方管理、数学计算和统计任务。在进行算术运算时,根据操作数的数据类型确定结果的数据类型,如有符号整数、无符号整数或浮点数。比较运算符可比较整数、浮点数、二进制数、字符串等变量。需要注意,无效浮点数(NaN)不可比较,而字符串比较将按字符代码进行。有些时间类型需要显式转换后才能比较,如S5TIME转换为TIME。ARRAY数据类型比较时要求元素类型和维数相同。对于结构化变量比较,数据类型需相同,除非一个是VARIANT而另一个是ANY。
  • 适用领域
    • 数据管理、过程优化、配方管理、数学计算、统计任务
  • IEC检查(一般不用) 对比较运算和算术运算中的操作数进行兼容性测试,对于不兼容的操作数,需要进行显式转换
    • 只有在未设置IEC检查时,才能执行具有此类操作数的运算。
    • 设置了IEC检查时,不能使用数据类型组“时间”和“日期和时间”的数据类型
  • 算数运算符
    • +加、-减、*乘、/除、**幂、MOD取余(模运算)
    • 算术表达式既可以是一个数字值,也可以是由带有算术运算符的两个值或表达式组合而成。
    • 算术运算符可以处理当前CPU所支持的各种数据类型。如果在该运算中有2个操作数,那么可根据以下条件来确定结果的数据类型:如果这2个操作数均为有符号的整数,但长度不同,那么结果将采用长度较长的那个整数数据类型(INT+DINT=DINT)
    • 如果这2个操作数均为无符号整数,但长度不同,那么结果将采用长度较长的那个整数数据类型(USINT+UDINT=UDINT)
    • 如果一个操作数为有符号整数,另一个为无符号整数,那么结果将采用另一个长度较大的有符号数据类型(其包含此无符号整数) (SINT+USINT=INT)
    • 如果一个操作数为整数,另一个为浮点数,那么结果将采用浮点数的数据类型(INT+REAL=REAL)
    • 如果 2个操作数均为浮点数,但长度不度不同,结果果将采用长度较长的那 个浮点数的数据类型(REAL+LREAL=LREAL) 对于操作数为“时间”和“日期和时间”数据类型组,运算结果的数据类型可查阅表格
  • 比较运算符
    • =等于、<>不等于、>大于、<小于、>=大于等于、<=小于等于
    • 整数/浮点数 二进制数 字符串的所有变量都可以进行比较
    • TIME LTIME 日期和时间 PLC数据类 ARRAY STRUCT Any指向的变量 VARIANT指向的变量只能比较相同类型的变量
    • 比较浮点数时,待比较的操作数必须具有相同的数据类型,而无需考虑具体的 “IEC检查”(IEC Check)设置
    • 对于无效运算的运算结果(如-1的平方根),这些无效浮点数(NaN)的特定位模式不可比较。如果一个操作数的值为NaN,则比较表达式“==:等于” 和“<>:不等于”的结果将为FALSE
    • 比较字符串时,系统将对各字符的代码进 行比较(“a”大于 “A")。并按照从左到右的顺序进行比较,第一个不同的字符将确定比较的结果
    • 系统无法比较无效定时器、日期和时间的位模式 (DT#2015-13-33-25:62:99.999 999 999) 。 即,如果某个操作数的值无效,则指令“==: 等于”和“<>:不等于”的结果将为FALSE
    • 并非所有时间类型都可以直接相互比较,如S5TIME。此时,需要将其显式转换为其它时间类型(TIME),然后再进行比较
    • 如果要比较不同数据类型的日期和时间,则需将较小的日期或时间数据类型显式转换为较大的日期或时间数据类型。例如,比较日期和时间数据类型,DATE和DTL时,将基于DTL进行比较
    • 如果显式转换失败,则比较结果为FALSE
    • 将WORD数类型的变量与S5TIME数据类型的变量进行比较时,这两种变量都将转换为TIME数据类型。WORD变量将解释为一个S5TIME值。如果这两个变量中的某个变量无法转换,则不进行比较且输出结果FALSE。如果转换成功,则系统将基于所选的比较指令进行比较操作
    • ARRAY数据类型比较时元素的数据类型必须相同,两个ARRAY的维数必须相同,所有维数的元素数量必须相同,而具体的ARRAY限值无需相同
    • 如果两个变量的结构数据类型相同,则可以比较这两个结构化操作数的值。比较结构化变量时,待比较操作数的数据类型必须相同,而无需考虑具体的“IEC检查”但一个操作数为VARIANT,而另一个为ANY时除外。创建程序时,如果数据类型未知,则可使用VARIANT数据类型。这样,就可比较任意数据类型的结构化变量操作数。此外,还可以比较VARIANT或ANY数据类型的变量 结构比较功能仅适用于固件版本为V4.2及以上版本的S7-1200系列CPU,以及固件版V2.0及以上版本的S7-1500系列CPU
  • 逻辑运算符
    • NOT取反、AND&与、OR或、XOR异或
    • 逻辑运算符可以处理当前CPU所支持的各种数据类型。如果两个操作数都是BOOL数据类型,则逻辑表达式的结果也为BOOL数据类型。如果两个操作数中至少有一个是位字符串,则结果也为位字符事而且结果是由最高操作数的类型决定。例如,当逻辑表达式的两个操作数分别是BYTE类型和WORD类型时,结果为WORD类型
    • 逻辑表达式中一个操作数为BOOL类型而另一个为位字符串时,必须先将BOOL类型的操作数显式转换为位学符串类型。
    • 运算符优先级 通过运算符可以将表达式连接在一起或相互嵌套,表达式的运算顺序取决于运算符的优先级和括号
      • 算术运算符优先于关系运算符,关系运算符优先于逻辑运算符
      • 同等优先级运算符的运算顺序则按照从左到右的顺序进行
      • 赋值运算的计算按照从右到左的顺序进行,括号中的运算的优先级最高
  • 赋值运算
    • 通过赋值运算,可以将一个表达式的值分配给一个变量。赋值表达式的左侧为变量,右侧为表达式的值
    • 函数名称也可以作为表达式。赋值运算将调用该函数,并返回其函数值,赋给左侧的变量
    • 赋值运算的数据类型取决于左边变量的数据类型。右边表达式的数据类型必须.与该数据类型一致
    • 单赋值运算 a:=b 多赋值运算a:=b:=c—>b:=c,a:=b
    • 组合赋值运算 a+=b—>a:=a+b a+=b+=cd—>c:=cd,b:=b+c,a:=a+b
  • 特殊赋值
    • 如果结构相同而且结构中成员的数据类型和名称也相同,则可以将整个结构分配给另一个结构,可以为单个结构元素分配一个变量、 一个表达式或另一个结构元素
    • 如果两者的ARRAY元素数据类型以及ARRAY限值都匹配,则可以将整个ARRAY分配给另一个ARRAY,可以为单个ARRAY元素分配一个变量。一个表达式或另一个ARRAY元素。
    • 可将整个STRING赋值给另一个STRING,可以为单个STRING元素分配另一个STRING元素。
    • 可将整个WSTRING赋值给另一个WSTRING.可以为单个,WSTRING元素分配另一个WSTRING元素
    • 只能将ANY数据类型的变量赋值给同样为ANY数据类型的FB的输入参数或临时本地数据或同样为ANY数据类型的FC的临时本地数据 ANY指针时,只能指向“标准”访问模式的存储区 在SCL的赋值运算中不能使POINTER A+=B时会一直增加
  • 寻址 基本指令-移动操作-读写存储器
    • 直接寻址-是一种基本寻址方法,特点是在指令格式的地址的字段中直接指出操作数在内存的地址(I0.0 QB0 DB1.DBX0.0)
    • 间接寻址-相对于直接寻址而言,指令地址字段的形式地址D不是操作数的真正地址,而是操作数地址的指示器,D单元的内容才是操作数的有效地址(MW【MW0】 DB1.DBD【MW2】)
    • PEEK读取存储器地址-从DB1中读取PEEK.A所指向数组D的地址的数据并赋给PEEK.B "DB1".SCL.B :=PEEK_WORD(area :=16#84,dbNumber := 1,byteOffset := "DB1".SCL.A);
    • POKE写入存储器地址-将DB1中POKE.b中的数赋给POKE.a所指向数组D POKE(area:=16#84,dbNumber:=1,byteOffset:="DB1".POKE.a,value:="DB1".POKE.b);