官术网_书友最值得收藏!

3.4 數據類型

IEC 61131-3的數據類型分為基本數據類型和導出數據類型兩類。數據類型與它在數據存儲器中所占用的數據長度有關。

定義數據類型可防止因對數據類型的不同設置而發生出錯。數據類型的標準化是編程語言開放性的重要標志。

3.4.1 基本數據類型

基本數據類型是預先定義的標準化數據類型,有布爾型、位串、整數、實數、持續的時間、一天中的時間、日期、日期和時刻、字符串等類型,總計20種,基本數據類型見表3-13。

3-13 基本數據類型

978-7-111-44136-6-Chapter03-81.jpg

(續)

978-7-111-44136-6-Chapter03-82.jpg

1.布爾型(BOOL)

布爾型為位數據,取值為TRUE或FALSE,也可表示為BOOL#1或BOOL#0。布爾型數據表達為{datatype}#{numericvalue}。

例如,布爾型變量賦值時

正確表達:BOOLvariable:=TRUE;或BOOLvariable:=BOOL#1;

錯誤表達:BOOLvariable:=1;

2.位串(bit string)

位串的數據類型為BYTE、WORD、DWORD和LWORD,基可選2、8、16。位串數據的表達為{datatype}#base#{numericvalue}。

例如,位串變量賦值時

正確表達:bitstringvariable:=WORD#16#3;

錯誤表達:bitstringvariable:=3;

不能直接比較兩個位串數據的大小,可以用數據轉換指令將它們轉換為整數類型的數據,再進行比較。

3.整數(Integer)

整數的數據類型有SINT、INT、DINT、LINT、USINT、UINT、UDINT、ULINT。基可選2、8、10、16,即一個整數可定義為二進制、八進制、十進制、十六進制數。整數數據的表達為{datatype}#base#{numericvalue}。十進制數,為表示負數,可在數值前添加“-”,如-15。若省略“基”,寫為{datatype}#{numericvalue},則默認基為10(十進制數)。數據類型不允許省略。

例如,為單字整數變量賦值-1時

正確表達:intvariable:=INT#2#1000000000000001;

intvariable:=INT#8#100001;

intvariable:=INT#10#-1;或intvariable:=INT#-1;

intvariable:=INT#16#8001;錯誤表達:intvariable:=-1;

在數值中單一的下劃線字符“”是沒有意義的,只增加可讀性,例如,2#11111111表示二進制11111111。

不能對整數型的數據直接進行邏輯運算,可以用數據轉換指令轉換為位串型數據,再進行邏輯處理。

4.實數(Real number)

實數的數據類型有REAL、LREAL。基為10,表示十進制數。實數數據的表達為{data type}#base#{numericvalue},可省略“基”,寫為{datatype}#{numericvalue}。若省略數據類型,寫為{numericvalue},則默認數據類型為LREAL。

例如,實數變量賦值3.14時

正確表達:realvariable:=REAL#3.14;

錯誤表達:intvariable:=3.14;

實數也稱為浮點數,在計算機中用二進制數來表示,通常為32位或64位,分別叫作REAL或LREAL。

在數據的位數有限的情況下,用定點數表示的數的范圍小。當用浮點數表示一個實數時,小數點的位置可變,隨著小數點位置的改變,指數的數值也隨之改變。因此,在有效數字的位數有限的情況下,不僅浮點數的范圍可以比定點數的范圍大得多,而且也可以保持數據的有效精度。

對浮點數的表示法,美國電氣與電子工程師協會(IEEE)制定的標準已被眾多計算機制造商采用。下面以浮點數的IEEE754格式為例,介紹浮點數的表示法。

(1)浮點數的IEEE754格式

浮點數的IEEE754標準格式可表示為:

REAL數值=(-1)s2e-127(1.f)

LREAL數值=(-1)s2e-1023(1.f)

式中各符號的意義是:

s:符號

e:指數

f:尾數(小數點后面的有效數字)

浮點數的格式如下:

REAL(32位)978-7-111-44136-6-Chapter03-83.jpg

LREAL(64位)978-7-111-44136-6-Chapter03-84.jpg

以REAL數為例,介紹各部分的含義:

符號s占1位,取值為0表示正數,1表示負數。

指數e占8位,取值為0~255,實際指數是e減去127的差,結果為-127~128。

尾數f占23位,二進制浮點數的尾數部分滿足2.0>1.f≥1.0。

例如,某REAL數表示如下:

978-7-111-44136-6-Chapter03-85.jpg

符號s為1,表示該數據是負數;

指數e為27=128,實際指數為128-127=1;

尾數f為(222+221)×2-23=0.75,實際尾數為1+0.75=1.75;

該REAL數據值為-21×1.75=-3.5。

(2)用浮點數表示的數據范圍

REAL和LREAL數據的取值范圍見表3-14,非常接近于0的值不能表示。

3-14 REALLREAL數據的取值范圍

978-7-111-44136-6-Chapter03-86.jpg

浮點數的數據范圍如圖3-59所示。

978-7-111-44136-6-Chapter03-87.jpg

圖3-59 浮點數的數據范圍

(3)特殊數據NaN、±∞、±0的浮點數格式

浮點數表示的特殊數據見表3-15。

3-15 浮點數表示的特殊數據

978-7-111-44136-6-Chapter03-88.jpg

(4)用浮點數表示非標準數據

非標準數據是絕對值極小而不能表示為標準數據的實數。

非標準數據的浮點數表示為:

REAL(-1)s×2-126×(尾數×2-23

LREAL(-1)s×2-1022×(尾數×2-52

以REAL數為例,介紹各部分的含義:

●符號s為0表示正數,1表示負數。

●指數e為0,實際指數為-126。

●尾數f用1~(223-1)表示,在實際尾數0.f中,設定位23為0(這也是一種規定),二進制數的小數點要緊跟在它的后面。

例如,某非標準的REAL數如下:

978-7-111-44136-6-Chapter03-89.jpg

符號s為1,表示該數是負數;

指數e為0,實際指數為-126;

尾數f為(222+221)×2-23=0.75,實際尾數為0+0.75=0.75;

該REAL數據值為-2-126×0.75,是一個絕對值極小的數值。

(5)數據處理

浮點數表達的只是一個近似值。因此,浮點數和它的真值有差別。浮點數有效數字的位數是有限的。因此,當完成浮點數運算時要采取以下措施。

1)四舍五入

如果實際值超過尾數的有效數字,按照下列規則四舍五入處理:

●結果是浮點數所能表示的最接近的值。

●當浮點數運算結果中的數字個數超過內部處理表達式中的有效數字時,若結果近似于兩個內部浮點表達式中的一個,則使用較接近的值。若結果介于兩個內部浮點表達式的中間,可四舍五入,以便使尾數的最后一個數字為0。

2)上溢出、下溢出

上溢出將根據結果的符號以+∞或-∞輸出。下溢出將根據結果的符號以+0或-0輸出。

如果浮點數轉換為整數時出現上溢出,那么結果值可能不正確。

非法計算將導致出現NaN(不是一個數)。

當實際值的絕對值大于浮點數所能表示的最大值時,發生上溢。當實際值的絕對值小于浮點數所能表示的最小值時,發生下溢。

●如果發生上溢且實際值為正數,則計算的結果為+∞。如果發生下溢且實際值為負數,則計算的結果為-∞。

●如果發生下溢且實際值為正數,則計算的結果為+0。如果發生下溢且實際值為負數,則計算的結果為-0。

(6)特殊數據計算

特殊數據包括0、∞、NaN,處理時注意以下事項:

按照下面的原則完成涉及特殊數據(也就是,+∞,-∞,+0,-0和NaN)的計算

●+∞和-∞相加的結果為NaN。

●同樣符號的兩個∞值相減的結果為NaN。

●+0或-0與∞相乘的結果為NaN。

●+0/+0、-0/-0或∞/∞的結果為NaN。

●+0和-0的和為+0。

●+0減+0或-0減-0的結果為+0。相同符號的0之差為+0。

●任何涉及NaN數據的四則運算的結果為NaN。如果有一個操作數為NaN,結果將為NaN。

●比較指令(例如Cmp指令)認為+0和-0一樣大。+0和-0進行比較時按相等處理。

●如果將NaN與其他數據比較,結果永遠不相等。

5.持續時間(Duration)

持續時間用于表達一個事件經過的時間。

持續時間用TIME#{day}d{hour}h{minutes}m{seconds}s{milliseconds}ms表示,式中TIME可簡化為T。

持續時間前半部分為標識符TIME(或T)及分界符#,后半部分是用天、小時、分、秒和毫秒或其任意組合表示的持續時間,如TIME#3d4h5m6s。

持續時間標識符TIME或T,因字母的大小寫具有相同意義,因此,持續時間標識符也可表示為time或t。其中,TIME或time稱為長前綴,T或t稱為短前綴。

表示時間單位天、小時、分、秒和毫秒等字母的大小寫具有相同意義。因此,T#12.3S與T#12.3s等價。

由于下劃線沒有意義,因此持續時間數值可用下劃線分隔。例如,T#1d2h3m表示持續時間為1天2小時3分,它與T#1d2h3m具有相同的含義。

持續時間的時間單位有天(d)、小時(h)、分(m)、秒(s)、毫秒(ms)。可以用小數表示持續時間,如T#12.3s、T#4.5d。可以任意指定時間表示的順序,如T#1h1d也是合法的。

持續時間的數值允許有負值,如T#-23.4h14.5m,但不允許表示為-T#23.4h14.5m。持續時間具有超載屬性,即允許數據超過有效的時間范圍。例如,T#25h80m中25小時已超過1天24小時的有效時間范圍。同樣,80分鐘也超出了分鐘的有效時間范圍,但這樣的表示是允許的,編程系統會自動將它轉換為不超過有效時間范圍的數據,即它與T#1d2h10m是等價的。

6.一天中的時間(Time of Day)

一天中的時間用于表示在一天中的時間,也稱為時刻,例如,當前時間等。

一天中的時間用時刻標識符、分界符#和時刻表示。表達式為TIMEOFDAY#{hour}:{minutes}:{seconds},或TOD#{hour}:{minutes}:{seconds}。

TIMEOFDAY或timeofday是時刻標識符的長前綴,TOD或tod是時刻標識符的短前綴。例如,TIMEOFDAY#12:34:56和TOD#12:34:56是等效的。

時刻文字中,時刻的分界符用冒號,不用下劃線。例如,TOD#12:34:56.25表示在12時34分56.25秒。TOD#123456.25是錯誤的時刻表示。

時刻單位是時、分、秒,沒有毫秒單位,但可用小數表示時刻。例如TOD#12:34:56.25中56.25表示56.25秒。由于時刻是一天中的時間,因此,不需要天的時間單位。

時、分和秒的時間數據不能缺省,當最小時間單位沒有時,可省略,例如,TOD#12表示12時。

7.日期(Date)

日期用于表示當天是某年某月某日。日期用日期標識符、分界符#和日期表示,表達式為DATE#{year}-{mouth}-{day}或D#{year}-{mouth}-{day}。

年、月、日的開始可以加一個或多個0,例如2005年5月10日,可表示為D#2005-05-10或D#2005-5-10。

日期標識符的長前綴用DATE或date表示,短前綴用D或d表示。因此,D#2008-08-08與DATE#2008-08-08等價。

日期文字中,日期的分界用連字符號“-”,不用冒號“:”或下劃線“”。此外,由于表示日期,因此,年、月和日的數據不能缺省。例如,不能表示為D#08-08。

8.日期和時刻(Date and Time)

日期和時刻用于表示某年某月某日某時某分某秒某毫秒的時間。表達式為DATEAND TIME#{year}-{mouth}-{day}-{hour}:{minutes}:{seconds},也可以簡寫為DT#{year}-{mouth}-{day}-{hour}:{minutes}:{seconds}。

由于它既有日期,又有時刻,因此,需注意時間之間分隔符的不同。

1)年、月和日的分界符,與日期分界符相同,用連字號“-”分界。

2)時、分、秒和毫秒的分界符,與時刻分界符相同,用冒號“:”分界。

3)日期和時刻之間用連字號“-”分界。例如,DT#2008-05-12-14:28:04表示2008年5月12日14時28分04秒。

需要指出的是,以上介紹的4種時間類型的數據表達式中的標識符,其包含的字母的大小寫意義相同。例如,Dt#2005-05-19-21:05:8.25表示日期和時刻,toD#15:36:22.25表示一天中的時間等。

9.字符串(Text Strings)

字符串(Text Strings)由單字節字符組成。

單字節字符串由一系列通用的字符表示,或由$'、$''、$與十六進制數字等組成。它們用單引號在其前后標識,如'ABC'、''、'$''、'$'''、'$C4'等。當美元符號與兩個十六進制數組成3字節字符串時,應將該字符串的兩個十六進制數組成的數對應解釋為8位字符碼的十六進制數。例如,'$0A'表示LF字符的長度為1的串,它與字符'$L'等效。

用美元符號和單或雙引號等組合形成一些特殊字符,具有特定含義,見表3-16。

3-16 特殊字符

978-7-111-44136-6-Chapter03-90.jpg

字符串可以是空串,如",單字節字符串用單引號開始,可表示為STRING#' YES '或'YES'。

10.數據類型轉換

程序根據數據類型進行適當的操作。例如,賦值表達式的左邊和右邊通常使用相同的數據類型。然而,在某些情況下,根據需要為變量賦值不同數據類型的數據,例如:

978-7-111-44136-6-Chapter03-91.jpg

為了將Var1的值賦給Var3,數據必須轉換。這種轉換的類型稱為數據類型轉換,或簡稱為“類型轉換”。

數據類型轉換通過執行專用的數據類型轉換指令來完成,或在賦值和指令中自動轉換。

3.4.2 導出數據類型

NJ系列控制器使用的導出數據類型有:結構體、聯合體、枚舉體。

1.結構體(Structure)

結構體是一種導出數據類型,它將相同或不同類型的數據組合成一個有機的整體,以便于引用。這些組合在一個整體中的數據是互相聯系的。例如,描述一個盒子大小的指標有三項:長度(Length)、寬度(Width)、高度(Height),如果將Length、Width、Height分別定義為互相獨立的簡單變量,是難以反映它們之間的內在聯系的。應當將它們組織成一個組合項,在這個組合項中包含若干個相同或不同類型的數據項。根據以上描述,定義一個“BOX”的結構體,它有Length、Width、Height 3個成員。設定一個結構體變量Box1,如圖3-60所示,可以這樣訪問Box1的各個成員:

Box1.Length

Box1.Width

Box1.Height

生成結構體的步驟如下。

1)在數據類型表中生成結構體數據類型

指定數據類型名稱、成員和數據類型。

978-7-111-44136-6-Chapter03-92.jpg

圖3-60 結構體變量Box1

978-7-111-44136-6-Chapter03-93.jpg

可以看出定義兩個結構體:RGB和ITEM,ITEM中的成員Color是一個結構體變量,類型為已定義的結構體RGE。

2)指定變量的名稱和結構體數據類型,在變量表中登記變量

978-7-111-44136-6-Chapter03-94.jpg

以上登記了變量Desk、數組ARRAY[0..1],Desk的數據類型為RGB,ARRAY[0..1]的數據類型為ITEM。

如果成員本身又屬一個結構體類型,則要用若干個成員運算符,一級一級地找到最低的一級成員。只能對最低的成員進行賦值或存取及運算。例如,對于上面定義的結構體數組元素Chairs[1],這樣訪問其成員

Chairs[1].Color.red

Chairs[1].Color.green

Chairs[1].Color.blue

結構體規格見表3-17。

3-17 結構體規格

978-7-111-44136-6-Chapter03-95.jpg

可以設置數組,其元素為結構體。也可以設置一個結構體,其成員為數組。

某些指令可以將結構體變量作為其參數。例如,結構體變量的成員和結構體變量都可以作為MOVE指令的參數。

以下是未使用結構體和使用結構體處理數據的對比:

978-7-111-44136-6-Chapter03-96.jpg

成員變量可以像普通變量一樣進行各種運算,根據其類型決定可以進行的運算。

一個結構體變量可以直接賦值給另一個具有相同結構的結構體變量。

2.共用體(Unions)

有時需要使幾種不同類型的變量存放到同一段內存單元中。例如,可以將一個16個元素的BOOL數組、2個BYTE變量或一個WORD變量放在同一個地址開始的內存單元中,如圖3-61所示,以上3個變量在內存中占的字節數不同,但都從同一地址開始存放。也就是使用覆蓋技術,幾個變量互相覆蓋。這種使幾個不同的變量共占同一段內存的結構,稱為“共用體”類型的結構,共用體也稱為聯合體。

978-7-111-44136-6-Chapter03-97.jpg

圖3-61 共用體

生成結構體的步驟如下。

1)在數據類型表中生成共用體數據類型。

指定數據類型名稱和共用體成員的不同數據類型。

2)指定變量的名稱和共用體數據類型,在變量表中登記變量。

978-7-111-44136-6-Chapter03-98.jpg

這里,OUT16ACCESS定義為共用體數據類型。這個共用體的成員是一個有16個成員的BOOL數組和一個字變量。變量OUTPUT登記為OUT16ACCESS的數據類型。可以讀寫變量OUTPUT,OUTPUT作為任意16位的BOOL值和一個WORD值。

Output.BoolData[12]

Output.ByteData[0]

Output.WordData

978-7-111-44136-6-Chapter03-99.jpg

共用體規格見表3-18。

3-18 共用體規格

978-7-111-44136-6-Chapter03-100.jpg

共用體使用時注意:共用體的初始值總是為0;不能傳送共用體;不能對POUs指定共用體作為參數。

3.枚舉體(Enumerations)

如果一個變量只有幾種可能的值,可以定義為枚舉類型。所謂“枚舉”是指將變量的值一一列舉出來。變量的值只限于列舉出來的值的范圍內。

生成枚舉體(ENUM)的步驟如下。

1)在枚舉體表中生成枚舉體數據類型。

為枚舉體設置枚舉元素和它們的值。

2)指定變量的名稱和枚舉體數據類型,在變量表中登記變量。

978-7-111-44136-6-Chapter03-101.jpg

這里,Color定義為枚舉體數據類型。設置3個枚舉元素:red、yellow和green。與這些枚舉元素相關聯的數值為:red=0、yellow=1、green=2。變量DiscColor登記為Color類型。現在,對變量DiscColor可以在三種不同的元素red、yellow和green中選擇,相應地又可以為變量DiscColor寫出對應的值0、1、2。

枚舉體使用時注意以下問題:

1)枚舉體元素名稱由單字節字母數字型字符組成,不區分大小寫。禁用字符的規定與變量名相同。如果不止一次指定相同的枚舉體元素,會發生編譯錯誤。如果指定的枚舉體元素與用戶程序中的變量重名,或者指定的枚舉體元素已存在于另一個枚舉體,也會出現編譯錯誤。

2)枚舉體元素取值的有效范圍:-2147483648~2147483647之間的整數。值不必連續。如果指定相同的值超過一次,編譯會出錯。不能比較枚舉體變量長度的大小,只能測試判斷枚舉體元素是否相同。

3)枚舉體元素數目:1~2048個。

3.4.3 數組

數組是按照順序排列的一組數據的集合。數組中的每一個元素都屬于同一個數據類型,可以為整型、字符型、實型等基本數據類型,也可以為結構體、共用體、枚舉體等導出數據類型。

數組名定名的規則和變量名相同,遵循標識符定名規則。

數組中的元素用一個統一的數組名和下標來唯一地確定。下標放在數組名后,使用單字節方括號括起來,可以為整數常量或變量,在ST中可用整數表達式表示。

生成數組的步驟如下。

1)在變量表的數據類型列輸入“A”,從可選的數據類型名稱列表中選擇ARRAY[?..?]OF?。

2)在“[?..?]”部分,對應左邊的問號,輸入數組的第一個元素的序號,對應右邊的問號,輸入數組的最后一個元素的序號。接下來,在“OF?”部分,對應問號輸入數據類型,并登記變量。

978-7-111-44136-6-Chapter03-102.jpg

這里,定義INT數組變量abc,共有5個元素,如下所示。

978-7-111-44136-6-Chapter03-103.jpg

數組變量規格見表3-19。

除了一維數組,還可以以同樣的方式定義二維、三維數組,數組元素的表示用與維數相同的同樣數目的下標。數組最多三維。

3-19 數組變量規格

978-7-111-44136-6-Chapter03-104.jpg

兩維數組如下所示:

978-7-111-44136-6-Chapter03-105.jpg

三維數組如下所示:

978-7-111-44136-6-Chapter03-106.jpg

可以設置數組,其元素為結構體。也可以設置結構體,其成員為數組。

元素為結構體的數組如下:

978-7-111-44136-6-Chapter03-107.jpg

成員為數組的結構體如下:

978-7-111-44136-6-Chapter03-108.jpg

有些指令將數組變量作為參數傳遞,為此,僅指定數組變量的名稱作為輸入參數。

例如,可用MOVE指令傳送單個數組元素,也可傳送一個數組。

978-7-111-44136-6-Chapter03-109.jpg

主站蜘蛛池模板: 嫩江县| 汝南县| 大关县| 龙陵县| 积石山| 东阳市| 通海县| 闻喜县| 宁南县| 瓮安县| 泾川县| 东乡| 沁源县| 新民市| 镇赉县| 河西区| 图木舒克市| 平陆县| 瑞金市| 广灵县| 汽车| 新闻| 塔城市| 洛扎县| 济宁市| 额济纳旗| 于田县| 井冈山市| 西乡县| 鄱阳县| 昌都县| 永清县| 嘉鱼县| 莒南县| 玉溪市| 于田县| 芮城县| 沭阳县| 莱芜市| 石台县| 庆城县|