SCL 转换函数以及数学函数(包括缩放)
一、数据类型转换
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的浮点计算能力不错,完全可以使用以上所有函数进行控制函数或者控制算法的编辑,具体例程会在后面的文章展现。









浙公网安备 33010602011771号