有類(lèi)型和無(wú)類(lèi)型常量的解釋
常量是具有固定值的數(shù)據(jù),其值在程序運(yùn)行期間不能更改。常量在程序執(zhí)行期間可由各種程序元素讀取,但不能被覆蓋。常量值有指定的表示法,具體取決于數(shù)據(jù)類(lèi)型和數(shù)據(jù)格式。分為有類(lèi)型和無(wú)類(lèi)型的表示法。
建議在數(shù)學(xué)函數(shù)中不要混用有類(lèi)型和無(wú)類(lèi)型常量,否則可能會(huì)發(fā)生不需要的隱式轉(zhuǎn)換,從而導(dǎo)致生成不正確的值。
編程示例
在以下編程示例中,可以看到使用有類(lèi)型和無(wú)類(lèi)型常量的運(yùn)算。
1. 創(chuàng)建一個(gè) SCL 函數(shù)塊并將其命名為“FB_MathsFunctions”。
2. 在塊接口的“Temp”部分聲明“Variable_DINT”變量。
3. 編寫(xiě)以下程序代碼:
Variable_DINT := INT#1 +50000;
在此數(shù)學(xué)運(yùn)算中,將有類(lèi)型常量 INT#1 與無(wú)類(lèi)型常量 50000 相加。無(wú)類(lèi)型常量 50000 在軟件中將帶黃色下劃線(xiàn),指示常量值超出了 INT 數(shù)據(jù)類(lèi)型允許的范圍。
要查看結(jié)果,請(qǐng)轉(zhuǎn)至在線(xiàn)。
1. 通過(guò)右鍵單擊“編譯 > 軟件(僅更改)”(Compile > Software (only changes) 命令執(zhí)行此命令來(lái)編譯 SCL 函數(shù)塊“FB_MathsFunctions”。
2. 使用“下載到設(shè)備 > 軟件(僅更改)”(Download to device > Software (only changes)) 命令下載塊。
3. 轉(zhuǎn)至在線(xiàn)并監(jiān)視塊。
有類(lèi)型常量的數(shù)據(jù)類(lèi)型定義加法的數(shù)據(jù)類(lèi)型。這意味著加法是在 INT 數(shù)據(jù)類(lèi)型區(qū)域中執(zhí)行。在第一步中,無(wú)類(lèi)型常量 50000 將隱式轉(zhuǎn)換為 INT 數(shù)據(jù)類(lèi)型。
但這種轉(zhuǎn)換會(huì)導(dǎo)致生成負(fù)值 (-15536)。然后該值將添加到有類(lèi)型常量 (INT#1)。結(jié)果是 -15535。
由于將寫(xiě)入加法運(yùn)算結(jié)果的變量被聲明為 DINT 數(shù)據(jù)類(lèi)型,因此數(shù)字 -15535 將隱式轉(zhuǎn)換為 DINT 數(shù)據(jù)類(lèi)型,并寫(xiě)入到變量“Variable_DINT”。但結(jié)果仍為負(fù)數(shù)。
1. 可能的解決方案
避免得到錯(cuò)誤結(jié)果的一種方法是兩個(gè)常量都采用有類(lèi)型常量。如果兩個(gè)常量都采用有類(lèi)型常量,較長(zhǎng)的數(shù)據(jù)類(lèi)型將確定計(jì)算結(jié)果。
在“FB_MathsFunctions”SCL 函數(shù)塊中編寫(xiě)以下程序代碼:
在此計(jì)算操作中,將有類(lèi)型常量 INT#1 與有類(lèi)型常量 DINT#50000 相加。
要查看結(jié)果,請(qǐng)轉(zhuǎn)至在線(xiàn)。
1. 通過(guò)右鍵單擊“編譯 > 軟件(僅更改)”(Compile > Software (only changes) 命令執(zhí)行此命令來(lái)編譯 SCL 函數(shù)塊“FB_MathsFunctions”。
2. 使用“下載到設(shè)備 > 軟件(僅更改)”(Download to device > Software (only changes)) 命令下載塊。
3. 轉(zhuǎn)至在線(xiàn)并監(jiān)視塊。
常量 INT#1 將轉(zhuǎn)換為 DINT 數(shù)據(jù)類(lèi)型,并且兩個(gè)常量的相加將在 DINT 數(shù)據(jù)類(lèi)型區(qū)域中執(zhí)行。
2. 可能的解決方案
避免得到錯(cuò)誤結(jié)果的另一種方法是兩個(gè)常量都采用無(wú)類(lèi)型常量。如果兩個(gè)常量都采用無(wú)類(lèi)型常量,它們?cè)诋?dāng)前 CPU 上將被解釋為最寬的可能數(shù)據(jù)類(lèi)型。這意味著在 S7-1500 系列 CPU上,這兩個(gè)常量都解釋為 LINT 數(shù)據(jù)類(lèi)型。
在“FB_MathsFunctions”SCL 函數(shù)塊中編寫(xiě)以下程序代碼:
在此計(jì)算操作中,將無(wú)類(lèi)型常量 1 與無(wú)類(lèi)型常量 50000 相加。
要查看結(jié)果,請(qǐng)轉(zhuǎn)至在線(xiàn)。
1. 通過(guò)右鍵單擊“編譯 > 軟件(僅更改)”(Compile > Software (only changes) 命令執(zhí)行此命令來(lái)編譯 SCL 函數(shù)塊“FB_MathsFunctions”。
2. 使用“下載到設(shè)備 > 軟件(僅更改)”(Download to device > Software (only changes)) 命令下載塊。
3. 轉(zhuǎn)至在線(xiàn)并監(jiān)視塊。
常量 1 和 50000 將解釋為 LINT 數(shù)據(jù)類(lèi)型,相加的結(jié)果將再次轉(zhuǎn)換為 DINT 數(shù)據(jù)類(lèi)型。
審核編輯:劉清
-
SCL
+關(guān)注
關(guān)注
1文章
243瀏覽量
17552 -
S7-1500
+關(guān)注
關(guān)注
3文章
301瀏覽量
6847
原文標(biāo)題:使用 SCL 中的常量進(jìn)行計(jì)算
文章出處:【微信號(hào):gh_a8b121171b08,微信公眾號(hào):機(jī)器人及PLC自動(dòng)化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Go語(yǔ)言常量的聲明
IAR與KEIL中如何直接定義常量到EEPROM中的經(jīng)驗(yàn)分享
java 常量池靜態(tài)變量詳解

如何使用S7-SCL中的“AT”指令?

請(qǐng)問(wèn)怎樣在SCL中去使用浮點(diǎn)數(shù)進(jìn)行計(jì)算?
使用SCL函數(shù)塊編寫(xiě)計(jì)算保質(zhì)期的應(yīng)用程序
西門(mén)子SCL語(yǔ)言編程案例之計(jì)算方差
對(duì)S7-SCL中的AT指令進(jìn)行詳細(xì)講解
C語(yǔ)言的常量-2

在SCL中使用浮點(diǎn)數(shù)REAL和LREAL進(jìn)行計(jì)算

SCL中的 EN/ENO 機(jī)制概述
什么是常量折疊?Python如何優(yōu)雅地實(shí)現(xiàn)它

西門(mén)子博途之SCL常量的運(yùn)算運(yùn)用

評(píng)論