欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

SCL变换函数与数学运算中的缩放功能详解

最编程 2024-07-31 19:27:25
...

一、数据类型转换


Portal的转换函数位于Portal的“基本指令/转换操作”目录下。由于SCL为强类型转换,不同类型的变量无法直接进行运算(个人觉得下几代软件会更改转换的相应操作),所以在实行不同类型的数据运算时,需要进行数据类型转换,将数据类型转换为一致之后,再进行数据运算。

SCL中大部分类型转换都是隐式转换,对于无法进行隐式转换的类型,软件在编译过程中会提示。在强制转换中,转换统一格式如下:

原数据类型_To_目标数据类型

也可以使用“CONVERT:转换值”对话框进行数据类型的转换,直接双击CONVERT

基本函数

函数名

功能

例子

ROUND

“取整”指令用于将输入 IN 的值取整为最接近的整数。

该指令将输入 IN 的值解释为浮点数,并将其转换为一个整数或浮点数。

如果输入值恰好是在一个偶数和一个奇数之间,则选择偶数。

"Tag_Result" := ROUND("Tag_Value");

CEIL

使用“浮点数向上取整”指令将值取整为最近接的整数。该指令将输入值解释为浮点数,

并将其转换为紧邻的较大整数。

函数值可以大于或等于输入值。

"Tag_Result1" := CEIL("Tag_Value");

"Tag_Result2" := CEIL_REAL("Tag_Value");

FLOOR

使用“浮点数向下取整”指令将一个浮点数的值取整为紧邻的较小整数。

该指令将输入值解释为浮点数,并将其转换为紧邻的较小整数。

函数值可等于或小于输入值。

"Tag_Result1" := FLOOR("Tag_Value");

"Tag_Result2" := FLOOR_REAL("Tag_Value");

TRUNC

截尾取整”指令用于直接从输入值中截取整数。该指令仅选择输入值的整数部分,

并将这一部分(不含小数位)作为函数值返回。

"Tag_Result1" := TRUNC("Tag_Value1");

"Tag_Result2" := TRUNC("Tag_Value2"+"Tag_Value3");

"Tag_Result3" := TRUNC_SINT("Tag_Value4");

基本缩放与传统缩放

缩放函数:SCALE_X与SCALE

标准化:NORM_X

取消缩放:UNSCALE

注:SCALE与UNSCALE只支持1500


SCALE_X:缩放

数模转换中常用到缩放,缩放函数实际上就是一个线性映射的过程

官方的解释如下:

使用“缩放”指令将浮点数映射到指定的取值范围来进行缩放。可使用 MIN 和 MAX 参数指定取值范围。缩放的结果为整数。

具体计算公式如下:OUT = [VALUE ∗ (MAX – MIN)] + MIN


这个过程实际上非常简单,拿个最简单的例子,生产一把1M的尺子,标刻度的过程就是先取1米的长度,然后10等分,得到dm,然后每段10等分得到cm,再10等分就有mm。

对于线性变换的量来说就是一个等分加映射的过程。

如果需要在SCALE_X中更改结果的数据类型,在其后加“_数据类型”即可。

具体示例如下:

"Tag_Result1" := SCALE_X(MIN := "Tag_Value1",

VALUE := "Tag_Real",

MAX := "Tag_Value2");

"Tag_Result2" := SCALE_X_REAL(MIN := "Tag_Value1",

VALUE := "Tag_Real",

MAX := "Tag_Value2");

其结果如下:


变量

计算结果

Tag_Real                               

0.5                                                         

Tag_Value1                                                                

10                                                               

Tag_Value2

30

Tag_Result1

20

Tag_Result2

20.0

NORM_X

标准化过程

可以使用“标准化”指令,通过将输入 VALUE 中变量的值映射到线性标尺对其进行标准化。可以使用参数 MIN 和 MAX 定义(应用于该标尺的)值范围的限值。输出 OUT 中的结果经过计算并存储为浮点数,这取决于要标准化的值在该值范围中的位置。如果要标准化的值等于输入 MIN 中的值,则该指令将返回结果“0.0”。如果要标准化的值等于输入 MAX 中的值,则该指令将返回结果“1.0”。

由缩放函数,相对应就会有标准化函数,缩放相当于量的初转换,要想得到能够使用的量,一般要使用标准换转换

“标准化”指令通过以下公式进行计算:

OUT = (VALUE – MIN) / (MAX – MIN)

示例如下:


"Tag_Result1" := NORM_X(MIN := "Tag_Value1",

VALUE := "Tag_InputValue",

MAX := "Tag_Value2");

"Tag_Result2" := NORM_X_LREAL(MIN := "Tag_Value1",

VALUE := "Tag_InputValue",

MAX := "Tag_Value2");


运算结果如下:

变量 结果

Tag_InputValue

20                                                                                  

Tag_Value1                                                                

10

Tag_Value2                                                                

30

Tag_Result1

0.5

Tag_Result2

0.5

SCALE:缩放

数模转换在后期的文章会单出一篇,所以在此只列出SCALE函数

可以使用“缩放”指令将参数 IN 上的整数转换为浮点数,该浮点数在介于上下限值之间的物理单位内进行缩放。通过参数 LO_LIM 和 HI_LIM 来指定缩放输入值取值范围的下限和上限。指令的结果在参数 OUT 中输出。

“缩放”指令将按以下公式进行计算:

OUT = [((FLOAT (IN) – K1)/(K2–K1)) ∗ (HI_LIM–LO_LIM)] + LO_LIM

常数“K1”和“K2”的值取决于参数 BIPOLAR 的信号状态。参数 BIPOLAR 可能的信号状态为:

  • 信号状态“1”:假设参数 IN 的值为双极性且取值范围是 -27648 到 27648。此时,常数“K1”的值为 -27648.0,而常数“K2”的值为 +27648.0。

  • 信号状态“0”:假设参数 IN 的值为单极性且取值范围是 0 到 27648。此时,常数“K1”的值为 0.0,而常数“K2”的值为 +27648.0。

如果参数 IN 的值大于常数“K2”的值,则将指令的结果设置为上限值 (HI_LIM) 并输出一个错误。

如果参数 IN 的值小于常数“K1”的值,则将指令的结果设置为下限值 (LO_LIM) 并输出一个错误。

如果指定的下限值大于上限值 (LO_LIM > HI_LIM),则结果将对输入值进行反向缩放。

二、数学函数

函数名 功能 示例
ABS 使用“计算绝对值”指令可计算输入值的绝对值,并将结果保存到指定的操作数中。

"Tag_Result1" := ABS("Tag_Value");

"Tag_Result2" := ABS("Tag_Value1"*"Tag_Value2");

MIN

使用“获取最小值”指令比较可用输入的值,并将最小的值作为结果返回。

在该指令处,最少需要指定 2 个输入,最多可以指定 32 个输入。

如果满足以下任何条件,则结果值无效:

  • 在执行该指令的过程中,后台转换数据类型失败。

  • 浮点数的值无效。

"Tag_Result" := MIN(IN1 := "Tag_Value1",

IN2 := "Tag_Value2",

IN3 := "Tag_Value3");

MAX

使用“获取最大值”指令,比较输入值,并将最大的值作为结果返回。

在该指令处,最少需要指定 2 个输入,最多可以指定 32 个输入。

如果满足以下任何条件,则结果值无效:

  • 在执行该指令的过程中,后台转换数据类型失败。

  • 浮点数的值无效。

"Tag_Result" := MAX(IN1 := "Tag_Value1",

IN2 := "Tag_Value2",

IN3 := "Tag_Value3");

LIMIT

可使用“设置限值”指令,将参数 IN 的值限制在参数 MN 和 MX 值之间。参数 MN 的值不能大于参数 MX 的值。

如果参数 IN 的值满足条件 MN <= IN <= MX,则作为该指令的结果返回。如果不满足该条件,而且输入值 (IN) 小于下限 MN,则将参数 MN 的值作为结果返回。如果超出了上限 MX,则将参数 MX 的值作为结果返回。

如果输入 MN 的值大于输入 MX 的值,则结果为 IN 参数中的指定值且使能输出 ENO 为“0”。

只有当所有参数的操作数均为同一种数据类型时,才能执行该指令。

"Tag_Result" := LIMIT(MN := "Tag_Minimum",

IN := "Tag_Value",

MX := "Tag_Maximum");

SQR

使用“计算平方”指令,可以计算输入值的平方值,并将结果保存到指定的操作数中。

"Tag_Result1" := SQR("Tag_Value");

"Tag_Result2" := SQR((SQR("Tag_Value1"))*"Tag_Value2");

SQRT

使用“计算平方根”指令,可以计算输入值的平方根,并将结果保存到指定的操作数中。如果输入值大于零,则该指令的结果为正数。如果输入值小于零,则该指令返回一个无效浮点数。如果输入值为“0”,则结果也是“0”。

"Tag_Result1" := SQRT("Tag_Value");

"Tag_Result2" := SQRT((SQR("Tag_Value1"))+"Tag_Value2");

LN

使用“计算自然对数”指令,可以计算输入值的以 e (e=2.718282) 为底的自然对数。如果输入值大于零,则该指令的结果为正数。如果输入值小于零,则该指令返回一个无效浮点数。

"Tag_Result1" := LN("Tag_Value");

"Tag_Result2" := LN("Tag_Value1"+"Tag_Value2");

EXP

使用“计算指数值”指令,可通过底数 (e = 2.718282) 及输入值来计算指数,并将结果保存在指定的操作数中。

"Tag_Result1" := EXP("Tag_Value");

"Tag_Result2" := EXP("Tag_Value1"/"Tag_Value2");

SIN 使用“计算正弦值”指令,可以计算输入值的正弦值。输入值的单位必须为弧度。

"Tag_Result" := SIN("Tag_Value");

COS

使用“计算余弦值”指令,可以计算输入值的余弦值。输入值的单位必须为弧度。

"Tag_Result" := COS("Tag_Value");

TAN

使用“计算正切值”指令,可以计算输入值的正弦值。输入值的单位必须为弧度。

"Tag_Result" := TAN("Tag_Value");

ASIN 使用“计算反正弦值”指令,可以计算正弦值所对应的角度值。输入值只能是 -1 到 +1 范围内的有效浮点数。计算出的角度值以弧度为单位,范围在 -π/2 到 +π/2 之间。

"Tag_Result" := ASIN("Tag_Value");

ACOS

使用“计算反余弦值”指令,可以计算余弦值所对应的角度值。输入值只能是 -1 到 +1 范围内的有效浮点数。计算出的角度值以弧度为单位,范围在 0 到 +π 之间。

"Tag_Result" := ACOS("Tag_Value");

ATAN

使用“计算反正切值”指令,可以计算正切值所对应的角度值。输入值只能是有效的浮点数(或 -NaN/+NaN)。计算出的角度值以弧度为单位,范围在 -π/2 到 +π/2 之间。

"Tag_Result" := ATAN("Tag_Value");

FRAC

“返回小数”指令的结果将返回数值的小数位。例如,输入值 123.4567 时,将返回值 0.4567。

"Tag_Result1" := FRAC("Tag_Value");

"Tag_Result2" := FRAC_LREAL("Tag_Value");


1200与1500的浮点计算能力不错,完全可以使用以上所有函数进行控制函数或者控制算法的编辑,具体例程会在后面的文章展现。

推荐阅读