西門(mén)子plc復(fù)雜數(shù)據(jù)類型包括日期和實(shí)踐(date_and_time)、字符串(string)、數(shù)組(array)、結(jié)構(gòu)(struct)和用戶定義的數(shù)據(jù)類型(udt)。
1、日期和時(shí)間
日期和時(shí)間(date_and_time)占8個(gè)字節(jié)的bcd碼,第1~6個(gè)字節(jié)分別存儲(chǔ)年、月、日、時(shí)、分和秒,毫秒存儲(chǔ)在整個(gè)第7個(gè)字節(jié)和第8個(gè)字節(jié)的高4位,星期存放在第8個(gè)字節(jié)的低4位,星期日代碼為1,星期一 ~ 星期六的代碼為2~7.例如2010年7月27日12點(diǎn)30分25.123秒可以表示為dt#10-07-27-12:30:25.123。
通過(guò)調(diào)用程序編輯器文件夾“l(fā)ibrariesstandard librariesiec function block”中的iec功能(參見(jiàn)下圖)
調(diào)用sfc0”set_clk”可以設(shè)置和啟動(dòng)cpu時(shí)鐘的時(shí)間和日期。調(diào)用sfc1”read_clk“可以讀取cpu系統(tǒng)時(shí)鐘當(dāng)前的日期和時(shí)間。
2、字符串
字符串(string)是字符(char)組成的一堆數(shù)組,每個(gè)字節(jié)存放一個(gè)字符。第1字節(jié)是字符串的最大字符長(zhǎng)度,第2個(gè)字節(jié)是字符串當(dāng)前有效字符的個(gè)數(shù),字符從第3個(gè)字節(jié)開(kāi)始存放,一個(gè)字符串最多有254字符。字符串的默認(rèn)長(zhǎng)度為254b,如下圖所示,在db3中定義字符串fault的長(zhǎng)度為20個(gè)字符,它只占用從db3.dbb20開(kāi)始的22b,其初始值只有4個(gè)字符“over”。string變量中未使用的字節(jié)地址被初始化為b#16#00.
可以使用標(biāo)準(zhǔn)庫(kù)的iec苦衷的21個(gè)功能來(lái)處理字符串變量,見(jiàn)下表,包括字符串與其他數(shù)據(jù)類型的轉(zhuǎn)換、字符串比較和字符串編輯,具體方法參見(jiàn)在線幫助。
3、數(shù)組
數(shù)組(array)是同一類型的數(shù)據(jù)組合而成的一個(gè)單元,數(shù)組的維數(shù)最多為6維。下圖給出一個(gè)二維數(shù)組array [1..2,1..3]的內(nèi)部結(jié)構(gòu),它共有6個(gè)字節(jié)的元素,圖中每一個(gè)小格為二進(jìn)制的1位,每個(gè)元素占一行(一個(gè)字節(jié))。array后面的方括號(hào)的數(shù)字用來(lái)定義每一維的起始元素和結(jié)束元素在該維中的編號(hào),可以取-32768~32767之間的整數(shù)。每維之間的數(shù)字用逗號(hào)隔開(kāi),每一堆開(kāi)始和結(jié)束的編號(hào)用兩個(gè)小數(shù)點(diǎn)隔開(kāi)。如果有一維有n個(gè)元素,該維的起始元素和結(jié)束元素的編號(hào)可以采用1和n,例如array [1..100]
4、結(jié)構(gòu)
結(jié)構(gòu)(struct)可以是不同類型的數(shù)據(jù)組合,可以用基本數(shù)據(jù)類型、負(fù)載數(shù)據(jù)類型(包括數(shù)組和結(jié)構(gòu)),和用戶定義數(shù)據(jù)類型(udt)做為結(jié)構(gòu)的元素,例如一個(gè)結(jié)構(gòu)可以由數(shù)組和結(jié)構(gòu)組成,結(jié)構(gòu)可以潛逃8層。用戶可以把過(guò)程控制中有關(guān)數(shù)據(jù)統(tǒng)一組織在一個(gè)結(jié)構(gòu)中,作為一個(gè)數(shù)據(jù)單元來(lái)使用,而不是使用大量單個(gè)的元素,為統(tǒng)一處理不同類型的數(shù)據(jù)和參數(shù)提供了方便。
5、用戶定義數(shù)據(jù)類型
用戶定義數(shù)據(jù)類型(user-defined data types)簡(jiǎn)稱udt,是一種特殊的數(shù)據(jù)結(jié)構(gòu),用戶只需要對(duì)它定義一次,定義好了可以在用戶程序中作為數(shù)據(jù)類型使用,可以用它來(lái)產(chǎn)生大量的具有相同數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)塊,用這些數(shù)據(jù)來(lái)輸入用于不同目的的實(shí)際數(shù)據(jù)。例如生成用于顏料混合配方的udt后,可以用它來(lái)生成用于不同顏色配方的數(shù)據(jù)組合。用戶定義數(shù)據(jù)類型有基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型組成。定義好以后可以在符號(hào)表中為它指定一個(gè)符號(hào)名,使用udt可以節(jié)約錄入數(shù)據(jù)的時(shí)間。
舉例說(shuō)明:
1、數(shù)組的生成和使用
(1)生成數(shù)組
可以在數(shù)據(jù)塊中定義數(shù)組,也可以在邏輯塊的變量聲明表中定義它。下面介紹在數(shù)據(jù)塊中定義的方法,在simatic管理器中用菜單命令:【插入】-【s7塊】-【數(shù)據(jù)塊】生成數(shù)據(jù)塊db3,雙擊打開(kāi)db3,默認(rèn)顯示方式為聲明視圖方式如下圖所示:聲明視圖用于定義、刪除和修改共享數(shù)據(jù)塊中的變量,指定它們的名稱、數(shù)據(jù)類型和初始值。第一行和最后一行標(biāo)有struct和edn_struct,這兩行中間有一個(gè)自動(dòng)生成的臨時(shí)占位符變量。
按如下圖輸入
在類型int所在行的地址列自動(dòng)生成*2.0,表示一個(gè)數(shù)組占用2b,地址列+12表示該數(shù)組的6個(gè)元素一共占用12b,地址列的內(nèi)容自動(dòng)生成,可以給每個(gè)變量加上注釋,數(shù)組第一個(gè)元素維press[1,1],第6個(gè)元素為press[2,3],
(2)給數(shù)組元素賦初始值
step7根據(jù)變量的數(shù)據(jù)類型給出默認(rèn)的初始值,用戶可以修改初始值,定義數(shù)組時(shí)可以在array所在的行的初始值中給元素賦初始值,如上圖所示。執(zhí)行菜單命令【視圖】-【數(shù)據(jù)視圖】,切換到數(shù)據(jù)視圖方式,將顯示數(shù)組和結(jié)構(gòu)中個(gè)元素的初始值和實(shí)際值如下圖所示
(3)訪問(wèn)數(shù)組中的數(shù)據(jù)
例如:”tank” .press[2,1]。其中tank是數(shù)據(jù)塊db3的符號(hào)名,press是數(shù)組名稱,它們用英語(yǔ)的句號(hào)分開(kāi)。方括號(hào)中的是數(shù)組元素的下表,該元素是數(shù)組的第4個(gè)元素如下圖。
(4)用數(shù)組傳遞參數(shù),如果在塊的變量聲明表中聲明形參的類型為array,可以將整個(gè)數(shù)組作為參數(shù)來(lái)傳遞,在調(diào)用塊時(shí)可以將每個(gè)數(shù)組元素賦值給統(tǒng)一數(shù)據(jù)類型的參數(shù),如下圖。
(5)用數(shù)組定義數(shù)據(jù)塊的大小
數(shù)據(jù)塊的大小與數(shù)據(jù)塊中定義的變量的個(gè)數(shù)和數(shù)據(jù)類型有關(guān),如果需要一個(gè)容量很大的數(shù)據(jù)塊,可以用數(shù)組來(lái)定義數(shù)據(jù)塊的大小,如果在數(shù)據(jù)塊中只定義一個(gè)數(shù)組arrar[1..500],數(shù)組元素的數(shù)據(jù)類型為字,則該數(shù)據(jù)塊的大小為100b。可以用絕對(duì)地址和任意的簡(jiǎn)單數(shù)據(jù)了誒行來(lái)方位該數(shù)據(jù)塊中的存儲(chǔ)單元。若方位數(shù)據(jù)塊中未定義的地址,將會(huì)出現(xiàn)錯(cuò)誤信息“讀取時(shí)發(fā)生區(qū)域長(zhǎng)度錯(cuò)誤”。
(6)設(shè)置數(shù)據(jù)塊參數(shù):鼠標(biāo)右鍵點(diǎn)擊數(shù)據(jù)塊,選擇對(duì)象屬性,出現(xiàn)如下圖所示,具體如何設(shè)置參見(jiàn)幫助。
(7)使用程序狀態(tài)功能監(jiān)視數(shù)據(jù)塊
點(diǎn)擊數(shù)據(jù)塊工具欄上的監(jiān)視按鈕,自動(dòng)切換到“數(shù)據(jù)視圖”顯示方式,數(shù)據(jù)塊內(nèi)的存儲(chǔ)單元在線的數(shù)值在實(shí)際值列中顯示,程序狀態(tài)被激活后,不能切換“聲明視圖”方式。
2、結(jié)構(gòu)的生成和使用
(1)結(jié)構(gòu)的生成
可以在數(shù)據(jù)塊中或邏輯塊的聲明表中定義結(jié)構(gòu),下面介紹在數(shù)據(jù)塊中定義的方法,在上面db3數(shù)據(jù)塊中,再定義一個(gè)結(jié)構(gòu),名為stack的結(jié)構(gòu)由3個(gè)不同數(shù)據(jù)類型的變量組成。如下圖所示:
在“array”下面的int,按回車(chē)鍵,在該單元下面生成一個(gè)空白行,在名稱輸入stack,在類型列單元點(diǎn)右鍵選擇復(fù)雜數(shù)據(jù)類型,選擇struct,(也可以直接輸入struct),按回車(chē)后再改行下面出現(xiàn)新的行,按如圖輸入。在end_struct點(diǎn)回車(chē),在出現(xiàn)的新的行中定義一個(gè)名為fault的字符串,如上圖所示,字符串長(zhǎng)度占20個(gè)字符
在上圖中stack所在行的地址列中的+12表示結(jié)構(gòu)在數(shù)據(jù)塊中的起始地址為dbb12,結(jié)構(gòu)中各元素的地址列中的+2.0等表示在結(jié)構(gòu)中的相對(duì)起始地址,=8.0表示該結(jié)構(gòu)一共占用8b,最后一行地址行的=42.0表示db塊中的數(shù)組、結(jié)構(gòu)和字符串一共占用42b,
(2)訪問(wèn)結(jié)構(gòu)中的元素
可以用結(jié)構(gòu)中的元素的絕對(duì)地址或符號(hào)地址來(lái)訪問(wèn)結(jié)構(gòu)中的元素,訪問(wèn)結(jié)構(gòu)中的數(shù)據(jù)時(shí),需要指出結(jié)構(gòu)所在的數(shù)據(jù)塊的名稱、結(jié)構(gòu)名稱,以及結(jié)構(gòu)元素名稱,數(shù)據(jù)塊tank內(nèi)結(jié)構(gòu)stack的元素amount應(yīng)表示為”tank”.stack.amount。因?yàn)閍mount從數(shù)據(jù)塊tank(db3)的第12號(hào)字節(jié)開(kāi)始存放,它的絕對(duì)地址為db3.dbw12.
(3)用結(jié)構(gòu)傳遞參數(shù)
如果在塊的變量聲明表中,聲明形參的類型為數(shù)組或結(jié)構(gòu),可以將整個(gè)數(shù)組或結(jié)構(gòu)而不是它們的每個(gè)元素作為參數(shù)來(lái)傳遞,調(diào)用塊時(shí)也可以將某個(gè)數(shù)組或結(jié)構(gòu)的元素賦值給同一類型的參數(shù)。
將復(fù)雜數(shù)據(jù)類型的變量作為參數(shù)傳遞時(shí),作為形參和實(shí)參的兩個(gè)變量必須具有相同的數(shù)據(jù)結(jié)構(gòu),例如兩個(gè)結(jié)構(gòu)應(yīng)具有相同數(shù)據(jù)類型的結(jié)構(gòu)元素和相同的排列順序。
3、用戶定義數(shù)據(jù)類型的生成和使用
在simatic管理器的左面窗口”塊“,執(zhí)行菜單命令【插入】-【s7塊】-【數(shù)據(jù)類型】,生成新的udt,在生成udt的元素時(shí),可以設(shè)置它的初始值和加上注釋,如下圖
從表面上看udt1與stack完全相同,但是它們有本質(zhì)區(qū)別。
結(jié)構(gòu)(struct)是在數(shù)據(jù)塊聲明視圖方式或邏輯塊的變量聲明表中與別的變量一起定義的,但是udt必須在特殊的數(shù)據(jù)塊內(nèi)單獨(dú)定義,并單獨(dú)存放在一個(gè)數(shù)據(jù)塊中。生成udt后,在定義變量時(shí)將它作為一個(gè)數(shù)據(jù)類型來(lái)多次使用,例如:在變量聲明表中定義一個(gè)變量,其數(shù)據(jù)類型為udt1,名稱為prodata如下圖
上圖可以看出,udt在數(shù)據(jù)塊中的使用方法與其他數(shù)據(jù)類型(如int)是一樣的。
udt可以在邏輯塊(fc、fb、ob)的變量生命表中作為基本數(shù)據(jù)類型或復(fù)雜數(shù)據(jù)類型來(lái)使用,或者在數(shù)據(jù)塊(db)作為變量的數(shù)據(jù)類型來(lái)使用。