找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6316|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于SoMachine平臺(tái)PLC自定義數(shù)據(jù)編程應(yīng)用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-2-22 15:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

自定義數(shù)據(jù)類型(DUT

新建自定義數(shù)據(jù)類型:結(jié)構(gòu),枚舉,引用,子范圍,數(shù)組,指針。

結(jié)構(gòu)(Structures)

結(jié)構(gòu)聲明的語(yǔ)法如下:

TYPE <結(jié)構(gòu)名>:
STRUCT
<
變量的聲明1>
..
<
變量聲明n>
END_STRUCT
END_TYPE

<結(jié)構(gòu)名>是一種可以在整個(gè)工程中被識(shí)別的數(shù)據(jù)類型,可以像標(biāo)準(zhǔn)數(shù)據(jù)類型一樣使用。

您可以使用互鎖結(jié)構(gòu)。唯一的限制是不可以指定結(jié)構(gòu)中變量的地址(不允許使用AT來指定變量的地址)

定義名為Polygonline的結(jié)構(gòu)舉例:

TYPE Polygonline:

STRUCT

Start:ARRAY [1..2] OF INT;

Point1:ARRAY [1..2] OF INT;

Point2:ARRAY [1..2] OF INT;

END_STRUCT

END_TYPE

結(jié)構(gòu)的初始化:

結(jié)構(gòu)初始化舉例:

Poly_1:polygonline := ( Start:=[3,3], Point1 =[5,2], Point2:=[7,3];

不能以變量作為初始化的值。參見數(shù)組中結(jié)構(gòu)數(shù)組的初始化舉例。

結(jié)構(gòu)成員的訪問:

您可以使用下述的語(yǔ)法訪問結(jié)構(gòu)的成員:

<結(jié)構(gòu)名>.<結(jié)構(gòu)成員名>

因此對(duì)于上述的結(jié)構(gòu)“polygonline”,您可以用Poly_1.Start訪問結(jié)構(gòu)成員“start”。

枚舉(Enumerations)

枚舉是由很多字符串常量組成的用戶定義數(shù)據(jù)類型。這些常量稱為枚舉值。

即使在POU之內(nèi)聲明枚舉值,枚舉值仍然可以在整個(gè)工程范圍內(nèi)被識(shí)別。

用戶可以通過添加對(duì)象對(duì)話框建立“DUT”對(duì)象來創(chuàng)建一個(gè)枚舉。

語(yǔ)法:

TYPE <標(biāo)識(shí)符>:(<Enum_0>,<Enum_1>, ...,<Enum_n>) |<base data type>;
END_TYPE

<標(biāo)識(shí)符>變量可以代表枚舉值 <Enum_..> 并被初始化為第一個(gè)值。這些值與所有的數(shù)字類型兼容,也就是說可以像使用整形變量一樣對(duì)其進(jìn)行操作。您也可以把數(shù)x賦給這個(gè)值。如果在聲明中枚舉值沒有被初始化為指定的值,將從0開始遞增依次進(jìn)行初始化。請(qǐng)確保初始化時(shí)的初始值在內(nèi)部元素中遞增。運(yùn)行時(shí)將會(huì)檢查這些值的有效性。

例如:

TYPE TRAFFIC_SIGNAL: (red,yellow, green:=10); (* 每個(gè)顏色的初始值是Red=0,Yellow=1,Green=10 *)

END_TYPE

TRAFFIC_SIGNAL1 :TRAFFIC_SIGNAL;

TRAFFIC_SIGNAL1:=0; (* 交通信號(hào)的值是Red *)

FOR i:= red TO green DO

i := i + 1;

END_FOR;

IEC 61131-3標(biāo)準(zhǔn)的擴(kuò)展:

枚舉類型的名稱可以(作為范圍操作符)用來確定需要訪問的枚舉常量。

因此,您可以在不同枚舉中使用相同的常量。

例如:

定義兩個(gè)枚舉:

TYPE COLORS_1: (red, blue);
END_TYPE

TYPE COLORS_2: (green,blue, yellow);
END_TYPE

POU中使用枚舉值Blue

聲明:

colorvar1 : COLORS_1;

colorvar2 : COLORS_2;

實(shí)現(xiàn):

(* 可以這樣使用:*)

colorvar1 := colors_1.blue;

colorvar2 := colors_2.blue;

(* 不能這樣使用:*)

colorvar1 := blue;

colorvar2 := blue;

 可以明確指定枚舉所指向的數(shù)據(jù)類型(默認(rèn)類型是INT)。

例如:

需要將枚舉BigEnum的數(shù)據(jù)類型指定為DINT:

TYPE BigEnum : (yellow,blue, green:=16#8000) DINT;

END_TYPE

引用(References)

引用是一個(gè)對(duì)象的別名。這個(gè)別名可以通過標(biāo)識(shí)符讀寫。與指針不同的是,引用所指向的數(shù)據(jù)將被直接改變,因此引用的賦值和所指向的數(shù)據(jù)是相同的。設(shè)置引用的地址用一個(gè)特定的賦值操作完成。一個(gè)引用是否指向一個(gè)有效的數(shù)據(jù)(不等于0),可以使用一個(gè)專門的操作符來檢查,如下所示。

用以下語(yǔ)法聲明引用:

語(yǔ)法

<標(biāo)識(shí)符> : REFERENCE TO<數(shù)據(jù)類型>

聲明示例:

ref_int : REFERENCE TO INT;

a : INT;

b : INT;

此時(shí)ref_int可以作為整型變量的別名使用

使用示例:

ref_int REF= a; (* 此時(shí)ref_int指向a *)

ref_int := 12; (* 此時(shí)a的值為12 *)

b := ref_int * 2; (* 此時(shí)b的值為24 *)

ref_int REF= b; (* 此時(shí)ref_int指向b *)

ref_int := a / 2; (* 此時(shí)b的值為6 *)

ref_int REF= 0; ( *引用的顯式初始化 *)

子范圍(子范圍(Subrangetypes) )

子范圍是一種用戶自定義類型,其值的范圍是基本數(shù)據(jù)類型的一個(gè)子集。注意可以使用隱含的范圍邊界校驗(yàn)(Range boundary checks。

DUT中聲明子范圍。您也可以把一個(gè)變量直接聲明為子范圍:

聲明為一個(gè)DUT對(duì)象的語(yǔ)法如下:

TYPE <名稱> : <Inttype>(<ug>..<og>) END_TYPE;

<名稱>

必須是一個(gè)有效的IEC標(biāo)識(shí)符。

<Inttype>

是以下數(shù)據(jù)類型中的一個(gè):SINT、USINT、INT、UINTDINT、UDINT、BYTE、WORD、DWORD (LINTULINT、LWORD)。

<ug>

是一個(gè)與基本數(shù)據(jù)類型相兼容的常量,它設(shè)定了范圍數(shù)據(jù)類型的下界。下界本身也屬于這個(gè)范圍。

<og>

是一個(gè)與基本數(shù)據(jù)類型相兼容的常量,它設(shè)定了范圍數(shù)據(jù)類型的上界。上界本身也屬于這個(gè)范圍。

例如:

TYPE

SubInt : INT (-4095..4095);

END_TYPE

把變量直接聲明為子范圍:

VAR

i : INT (-4095..4095);

ui : UINT (0..10000);

END_VAR

如果一個(gè)(在聲明或?qū)崿F(xiàn)中)被指定為子范圍的值不在子范圍的界限之內(nèi)(如令以上聲明中的i:=5000),系統(tǒng)將報(bào)錯(cuò)。

導(dǎo)致死循環(huán)的例子:

VAR

ui : UINT (0..10000);

END_VAR

FOR ui:=0 TO 10000 DO

...

END_FOR

由于校驗(yàn)函數(shù)使變量ui的值不會(huì)超過10000,故程序永遠(yuǎn)無法跳出這個(gè)FOR循環(huán)。

數(shù)組(數(shù)組(Arrays) )

一維、二維和三維數(shù)組屬于基本的數(shù)據(jù)類型。您可以在POU的聲明部分或者全局變量表中定義數(shù)組。請(qǐng)注意可以使用隱含的邊界檢查。

語(yǔ)法:

<數(shù)組名>:ARRAY[<ll1>..<ul1>,<ll2>..<ul2>] OF <基本數(shù)據(jù)類型>

ii1, ll2, ll3表示字段范圍的最小值,ul1, ul2 and ul3表示字段范圍的最大值。字段范圍必須是整數(shù)。

例如:

card_game: ARRAY [1..13, 1..4] OF INT;

數(shù)組的初始化:

數(shù)組的完全初始化舉例:

arr1 : ARRAY [1..5] OF INT := [1,2,3,4,5];

arr2 : ARRAY [1..2,3..4] OF INT := [1,3(7)]; (* 1,7,7,7的縮寫形式 *)

arr3 : ARRAY [1..2,2..3,3..4] OF INT := [2(0),4(4),2,3];

(* 0,0,4,4,4,4,2,3的縮寫形式 *)

結(jié)構(gòu)數(shù)組的初始化舉例:

結(jié)構(gòu)定義:

TYPE STRUCT1

STRUCT

p1:int;

p2:int;

p3:dword;

END_STRUCT

END_TYPE

數(shù)組初始化:

ARRAY[1..3] OF STRUCT1:= [(p1:=1,p2:=10,p3:=4723),(p1:=2,p2:=0,p3:=299),
(p1:=14,p2:=5,p3:=112)];

數(shù)組的部分初始化舉例:

arr1 : ARRAY [1..10] OF INT := [1,2];

對(duì)于那些沒有預(yù)先賦值的元素,按照基本數(shù)據(jù)類型的缺省初始值進(jìn)行初始化。在上例中,元素[3][10]被初始化為0

數(shù)組元素的訪問:

在二維數(shù)組中訪問數(shù)組元素,使用下面的語(yǔ)法:

<數(shù)組名>[Index1,Index2]

指針(Pointers)

指針用來在應(yīng)用程序運(yùn)行時(shí)存儲(chǔ)變量、程序、功能塊、方法和函數(shù)的地址。它可以指向上述的任何一個(gè)對(duì)象以及任意數(shù)據(jù)類型,包括用戶定義數(shù)據(jù)類型。請(qǐng)注意,您可以使用隱含的指針校驗(yàn)功能。

聲明指針的語(yǔ)法如下:

<標(biāo)識(shí)符>: POINTER TO <數(shù)據(jù)類型 | 功能塊 | 程序 | 方法 | 函數(shù)>;

取指針地址內(nèi)容即意味著讀取指針當(dāng)前所指地址中存儲(chǔ)的數(shù)據(jù)。通過在指針標(biāo)識(shí)符后添加內(nèi)容操作符“^”,可以取得指針?biāo)傅刂返膬?nèi)容: 請(qǐng)看下面“pt^”的使用示例。

通過地址操作符ADR可以將變量的地址賦給指針。

示例:

VAR

pt:POINTER TO INT; (* 聲明一個(gè)指針pt *)

var_int1:INT := 5; (* 聲明變量var_int1var_int2 *)

var_int2:INT;

END_VAR

pt := ADR(var_int1); (* varint1的地址賦給指針pt *)

var_int2:= pt^; (* 通過取指針pt的地址內(nèi)容,將var_int1的值5賦給var_int2 *)

建立好自定義數(shù)據(jù)類型的引用

其中:數(shù)組,指針可以在局部和全局變量中獨(dú)自定義并引用。

自定義數(shù)據(jù)引用開始前必須聲明引用的自定義數(shù)據(jù)

可以在全局和局部變量中關(guān)聯(lián)引用聲明。

在程序中輸入引用名后加“.”選擇相應(yīng)的后綴名來使用引用的數(shù)據(jù):

對(duì)于數(shù)據(jù)交流量大,數(shù)據(jù)流多的可以采用該方法來區(qū)別和方便的使用數(shù)據(jù)。

其中:數(shù)組,可以是等于一個(gè)數(shù)據(jù)表格,通過尋表找出我們所需要的值;枚舉,是我們這個(gè)數(shù)據(jù)可能存在的不同值的可能,當(dāng)其等于某個(gè)值的時(shí)候代表這某些值;指針,一般用在間接尋址,從而簡(jiǎn)化了大量數(shù)據(jù)的存取賦值等操作(需結(jié)合FOR語(yǔ)句來使用),同時(shí)也實(shí)用與間接性過度值的一些數(shù)據(jù)應(yīng)用;子范圍,也就是局限了數(shù)據(jù)的肯能值范圍,防止數(shù)據(jù)超出范圍或者不在范圍內(nèi)。

該文僅此記錄相關(guān)概念,留個(gè)存檔。相關(guān)應(yīng)用歡迎交流。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表