一、數據類型轉換
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的浮點計算能力不錯,完全可以使用以上所有函數進行控制函數或者控制算法的編輯,具體例程會在后面的文章展現。








