字符串?dāng)?shù)據(jù)類型
定義(Definition)
串?dāng)?shù)據(jù)類型定義一個最長254個字符的字符串。標(biāo)準(zhǔn)的區(qū)域保留有256個字符的字符串。內(nèi)存區(qū)域存貯254個字符和2個頭字節(jié)。
通過定義保存在串中的字符的最大數(shù)量,能夠減少字符串要求的內(nèi)存。一個空串,即沒有數(shù)據(jù)的串是最小的值。
簡單表達(dá)式當(dāng)作在串中的字符的最大數(shù)量。串中允許所有ASCII代碼的字符,也能包含特殊字符,如控制字符和非打印字符。能夠用句法$hh鍵入,hh當(dāng)作用十六進(jìn)制表示和ASCII字符的值(如:‘$0D$0AText’)。
聲明字符串內(nèi)存空間時,能夠定義能存貯在串中的最大字符數(shù)。如果不指定,則建立長度為254的串。
例子(Example)
VAR
Text1: String [123];
Text2: String;
END_VAR
在變量"Text1"聲明中的常量"123"當(dāng)作在串中的最大字符數(shù)。對于變量"Text2",保留254字符的長度。
初始化字符串(Initializing Character Strings)
串變量,同其他變量一樣,能夠用常量字符串在功能塊的參數(shù)聲明中初始化。初始化函數(shù)的參數(shù)則不可能。
如果初始的串短于聲明的最大長度,多余字符不被初始化。當(dāng)在程序中處理變量時,當(dāng)前占用的字符位置才作考慮。
例子(Example)
x : STRING[7]:='Address';
如果要求串類型臨時變量,例如緩沖結(jié)果,在他們首次使用之前,總必須在變量聲明或賦值語句中用串常量初始化。
例子(Example)
FUNCTION Test : STRING[45]
VAR_TEMP
x : STRING[45];
END_VAR
x := 'a';
x := concat (in1 := x, in2 := x);
Test := x;
END_FUNCTION
沒有初始化(語句)x := 'a';,函數(shù)返回錯誤結(jié)果。
串操作函數(shù)
LEN
LEN函數(shù)(FC21)返回串的當(dāng)前長度(有效字符個數(shù))??沾?'')長度為0。函數(shù)不報(bào)告錯誤。
例 LEN (S:= 'XYZ' )
CONCAT
CONCAT函數(shù)將最多32個串變量合并為一個串。如果結(jié)果串比輸出參數(shù)的串要度,結(jié)果串將限定在最大長度……
當(dāng)使用S7-SCL函數(shù)CONCAT時,隱式地在“IEC函數(shù)”庫中調(diào)用FC2。
Example CONCAT (IN1:= 'Valve', IN2:= ' open')
DELETE
DELETE函數(shù)(FC 4)在一個串中從P指示的字符開始刪除L個字符。如果L和或P等于0,或者如果P大于輸入串的當(dāng)前長度,返回輸入的串。如果L和P之和大于輸入串的長度,則串刪除到結(jié)束位置。如果L和/或P是負(fù)數(shù),輸出一個空串。
Example: DELETE (IN:= 'Temperature ok', L:= 6, P:= 5)
REPLACE
REPLACE函數(shù)(FC31)用第二個串(IN2)置換第一個串中P指示的位置開始的L個字符。如果L=0,則返回第一個串。如果P為0或1,則從起始位置開始置換。如果P在第一個串長度之外,第二個串接到第一個串之后。如果P和/或L是負(fù)數(shù),則返回空串。當(dāng)結(jié)果串長于輸出參數(shù)指定的變量,則限定到最大長度。
Example REPLACE (IN1:= 'Temperature', IN2:= ' high' L:= 6, P:= 5)
FIND
FIND函數(shù)(FC11)返回第二個串(IN2)在第一個串(IN1)中的位置。查找從左開始;報(bào)告首次出現(xiàn)的位置。如果第一個串中不包含第二個串,則返回0。此函數(shù)不報(bào)告錯誤。
Example FIND (IN1:= 'Processingstation', IN2:='station')
串比較函數(shù)
使用S7-SCL比較函數(shù)=, <>, <, >, <=和>=能夠比較串。編譯器包括了自動調(diào)用要求的函數(shù)。簡單地列出下列函數(shù)提供全部的情況。
EQ_STRNG和NE_STRNG
EQ_STRNG (FC10)和NE_STRNG (FC29)函數(shù)比較兩個串格式的變量的內(nèi)容是否相等(FC10)或不相等(FC29),并返回比較結(jié)果。如果參數(shù)串S1與參數(shù)串S2相等(不相等),則返回信號狀態(tài)“1”的值。此函數(shù)不報(bào)告錯誤。
GE_STRNG and LE_STRNG
GE_STRNG (FC13)和LE_STRNG (FC19)函數(shù)比較串格式的兩個變量大于(小于)或等于,并返回比較結(jié)果。如果參數(shù)串S1大于(小于)或等于參數(shù)串S2,則返回信號狀態(tài)“1”的值。從左開始用其ASCII代碼比較字符(如'a'大于'A')。第一個不同的字符決定了比較結(jié)果。如果較長串的左邊部分與較短串相同,則認(rèn)為較長串大。此函數(shù)不報(bào)告錯誤。
GT_STRNG and LT_STRNG
GT_STRNG (FC15)和LT_STRNG (FC24)函數(shù)比較串格式的兩個變量大于(小于),并返回比較結(jié)果。如果參數(shù)串S1大于(小于)參數(shù)串S2,則返回信號狀態(tài)“1”的值。從左開始用其ASCII代碼比較字符(如'a'大于'A')。第一個不同的字符決定了比較結(jié)果。如果較長串的左邊部分與較短串相同,則認(rèn)為較長串大。此函數(shù)不報(bào)告錯誤。
數(shù)據(jù)格式轉(zhuǎn)換函數(shù)
INT_TO_STRING和STRING_TO_INT
函數(shù)INT_TO_STRING和STRING_TO_INT將一個INT格式變量轉(zhuǎn)換為字符串或?qū)⒆址D(zhuǎn)換為INT變量。函數(shù)I_STRNG (FC16)和STRNG_I (FC38)被從提供的“IEC函數(shù)”庫中隱式地使用。串用一個前置符號表述。如果在返回參數(shù)指定的變量太短,則不進(jìn)行轉(zhuǎn)換。
DINT_TO_STRING和STRING_TO_DINT
函數(shù)DINT_TO_STRING和STRING_TO_DINT將一個DINT格式的變量轉(zhuǎn)換為字符串或字符串轉(zhuǎn)換為DINT變量。函數(shù)DI_STRNG (FC5)和STRNG_DI (FC37)被從提供的“IEC函數(shù)”庫中隱式地使用。串用一個前置符號表述。如果在返回參數(shù)指定的變量太短,則不進(jìn)行轉(zhuǎn)換。
REAL_TO_STRING and STRING_TO_REAL
函數(shù)REAL_TO_STRING和STRING_TO_REAL將一個實(shí)數(shù)格式的變量轉(zhuǎn)換為字符串或字符串轉(zhuǎn)換為實(shí)數(shù)變量。函數(shù)R_STRNG (FC30)和STRNG_R (FC39)被從提供的“IEC函數(shù)”庫中隱式地使用。串必須有下列格式:
?v.nnnnnnnE?xx (?= 符號, v =小數(shù)點(diǎn)前的數(shù)字, n =小數(shù)點(diǎn)后的數(shù)字, x =指數(shù)數(shù)字)
如果串的長度小于14,或其不是上述格式構(gòu)造,將不進(jìn)行轉(zhuǎn)換。
如果返回參數(shù)指定的變量太短或IN參數(shù)中包含一個無效浮點(diǎn)數(shù),沒有轉(zhuǎn)換。
SCL 字符串處理舉例:
將信息文本放到一塊(Putting together message texts)
//通過處理和存貯,將信息文本放到一塊。
////////////////////////////////////////////////////////////////////
//塊包含必要的信息文本和產(chǎn)生的最后20條信息
////////////////////////////////////////////////////////////////////
DATA_BLOCK Messagetexts
STRUCT
Index: int;
textbuffer: array [0..19] of string[34];
HW: array [1..5] of string[16]; // 5種不同設(shè)備
statuses: array [1..5] of string[12]; // 5種不同狀態(tài)
END_STRUCT
BEGIN
Index :=0;
HW[1] := 'Motor ';
HW[2] := 'Valve ';
HW[3] := 'Press ';
HW[4] := 'Weldingstation ';
HW[5] := 'Burner ';
Statuses[1] := ' problem';
Statuses[2] := ' started';
Statuses[3] := ' temperature';
Statuses[4] := ' repaired';
Statuses[5] := ' maintained';
END_DATA_BLOCK
////////////////////////////////////////////////////////////////////
//函數(shù)將信息廣西領(lǐng)先到一塊,并輸入到DB的信息文本中。信息文本存貯在一個環(huán)形緩沖區(qū)里。
//文本緩沖區(qū)的下一個空區(qū)索引也在DB信息文本內(nèi)并被函數(shù)修正。
////////////////////////////////////////////////////////////////////
FUNCTION Textgenerator : bool
VAR_INPUT
unit: int;// 設(shè)備文本(名稱)的索引
no: int;// 設(shè)備的ID號
status: int;
value: int;
END_VAR
VAR_TEMP
text : string[34];
i : int;
END_VAR
// 臨時變量的初始化
text := '';
Textgenerator := true;
Case unit of
1..5 : case status of
1..5 : text := concat( in1 := Messagetexts.HW[unit],
in2 := right(l:=2,in:=I_STRNG(no)));
text := concat( in1 := text,
in2 := Messagetexts.statuses[status]);
if value <> 0 then
text := concat( in1 := text,
in2 := I_STRNG(value));
end_if;
else Textgenerator := false;
end_case;
else Textgenerator := false;
end_case;
i := Messagetexts.index;
Messagetexts.textbuffer[i] := text;
Messagetexts.index := (i+1) mod 20;
END_FUNCTION
////////////////////////////////////////////////////////////////////
//函數(shù)在%M10.0邊沿觸發(fā)時被循環(huán)程序調(diào)用,如果參數(shù)改變了,則輸入一次信息。
////////////////////////////////////////////////////////////////////
Organization_block Cycle
Var_temp
Opsy_ifx : array [0..20] of byte;
error : BOOL;
End_var;
////////////////////////////////////////////////////////////////////
//下面的調(diào)用將信息"Motor 12 started"輸入DB信息文本的文本緩沖區(qū), %MW0為1,
//%IW2為12 及%MW2為2.
////////////////////////////////////////////////////////////////////
if %M10.0 <> %M10.1 then
error := Textgenerator (unit := word_to_int(%MW0),
no := word_to_int(%IW2),
status := word_to_int(%MW2),
value := 0);
%M10.1:=M10.0;
end_if;
end_organization_block
審核編輯 :李倩
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4380瀏覽量
64853 -
數(shù)據(jù)類型
+關(guān)注
關(guān)注
0文章
237瀏覽量
13897
原文標(biāo)題:數(shù)據(jù)格式轉(zhuǎn)換函數(shù)
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機(jī)器人及PLC自動化應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
LPC55S28修改音頻數(shù)據(jù)格式后USB Aduio類異常的原因?
用FPGA配置TVP5150,把PAL制標(biāo)準(zhǔn)視頻轉(zhuǎn)換成BT656數(shù)據(jù)格式,能否把數(shù)據(jù)流直接給SAA7121?
使用RDATAC指令后,ADS131E04傳送的數(shù)據(jù)格式以及內(nèi)容是怎樣的?
ads1158讀取數(shù)據(jù),得到的數(shù)據(jù)格式是什么樣的啊?
LMH0341如何轉(zhuǎn)換出的LVDS數(shù)據(jù)幀格式?
FP8數(shù)據(jù)格式在大型模型訓(xùn)練中的應(yīng)用

評論