各位同學是否有以下疑惑:
1. INT數據類型與WORD 數據類型有何區別?DINT與TIME呢?
2. S5 TIME數據類型結構是什么樣的?怎樣自行修改或生成符合S5 TIME數據類型的值?
3. 儀表傳送一組流量數值,是用字符串方式發送,接收到數值后,怎樣還原為浮點數?
4. MOVE指令與數據類型轉換指令怎樣區分?都有什么樣的應用場合?
5. 隱式轉換和顯示轉換是什么含義,在TIA 博途中,設置IEC檢查對數據類型轉換會有什么影響。
另外,復雜數據類型的應用,如:STRUCT與UDT的應用與區別、*數組、ANY數據類型,各種數據類型的存儲與尋址方式,相互轉換也在本話題討論范圍之內,大家不要吝嗇筆墨,踴躍發言,談談應用過程中的疑惑與認識,希望大家收獲多多!
字符串轉換為浮點數的方法
可以用程序編輯器的IEC庫中的FC39 STRNG_R,將字符串轉換為REAL數據類型格式變量。
用IEC庫中的FC30 R_STRNG,可以將REAL格式的變量轉換為字符串。
字符串由符號、小數點前的1位數字、小數點、小數點后的7位數字、E和2位指數數字字符組成。
下面是一個例程:
在DB1中定義字符串STR1[14],下面是OB1中的程序:
CALL "R_STRNG" //調用FC30,將REAL格式變量轉換為字符串
IN :=1.234567e+003
RET_VAL:=DB1.STR1
CALL "STRNG_R" //調用FC39,將將字符串轉換為REAL格式變量
S :=DB1.STR1
RET_VAL:=MD0
由監控可知FC30將1.234567e+003轉換后,DB1.STR1中的字符串為’+0.1234567E+04’。用FC39將字符串DB1.STR1轉換后,MD0中的浮點數為1.234567e+003。
一、在S7編程中字符類型[CHAR]使用比較少見,但在一些與條碼掃描的通訊設備中卻較為常見,例如工裝線產品質檢和計數或商場收銀系統。
二、這類條碼掃描設備通常先與PLC進行RS232C或RS485串口通訊后讀入CHAR數據類型,然后經組合和轉換后,在觸摸屏Touch中顯示。
三、其實CHAR數據類型處理很簡單,具體使用事項和方法如下:
1、首先CHAR字符采用ASCII編碼;
2、其次CHAR字符占用一個Byte;
3、因此將讀取的CHAR字符存放至定義為CHAR類型的存儲區變量中,例如MB2→CHAR即可;
4、如果要對定義的CHAR類型的變量賦值,需對輸入的字符常量加一對單引號,例如:'$'、'F'、'【'、'?'。
5、使用效果見以下ASCII碼表與程序對照圖。

2. S5 TIME數據類型結構是什么樣的?怎樣自行修改或生成符合S5 TIME數據類型的值?
1) S5TIME為16位數據,BCD碼格式。當使用S5TIME時,最大計時為S5T#2h46m30s(9990s).
格式如:2#0011 1001 1001 1001,即S5T#2h46m30s
10s 9 9 9
第14,13位表示時間基準,00為10ms,01為100ms,10為1s,11為10s.上例為11,即10s時基。
后12位為BCD碼表示的時間值,上例為999,則999*10s=2h46m30s.
2)知道S5TIME的格式后,就可以在程序中正確的使用了。常見的如在觸摸屏中有個INT變量設定的時間, 在程序中要轉換成S5TIME.(INT轉S5TIME).
因為S5TIME為BCD碼格式,所以要先將INT轉BCD(ITB).記得一定要轉。可以看3樓的例子。我們也可以 自己編程做一下實驗。ITB不寫的話就會報錯。
L 999 //0000 0011 1110 0111
ITB //0000 1001 1001 1001
L W#16#3000 //0011 0000 0000 0000
OW
T MW 700 //0011 1001 1001 1001 (S5T#2h46m30s)
A M 100.0
L MW 700
SD T 1
3)其他關于INT,TIME和S5TIME的轉換見下帖。
http://www.ad.siemens.com.cn/clu ... d=4&a_id=898840
字符串數據類型[STRING]的使用也比較少見,常用于存儲消息文本。
關于STRING類型變量使用事項如下:
1、STRING變量字符串以ASCII編碼存儲每個字符,最大長度256Byte,前兩個Byte存儲字符串長度信息,所以STRING變量最多包含254個字符。其中第一個Byte存儲最大長度;第二個Byte存儲實際字符長度。
2、STRING類型的變量可傳遞至相同類型(即相同的STRING長度)的塊參數中,也可以傳遞至POINTER或ANY類型的FC/FB塊參數中。
3、給STRING變量賦值常量需使用一對單引號,例如:'String'、'S7'、'failure_4'。
4、如果用ASCII編碼的字符賦值,則該字符也必需使用一對單引號,而如果包含用于控制術語的特殊字符,則必需在字符前添加前綴符號$。例如:$$→美元字符;$P→換頁字符;$L→換行字符;$R→回車字符;$T→空格字符。
5、STRING變量定義聲明和初始化方法:變量名稱:STRING[最大字符數]: '初始化文本',變量定義聲明時可以無初始化文本。例如:FALT_SIG:STRING 'Motor failure_4'、Warning:STRING [50] ''。
如果變量定義聲明時未指定最大字符數,那么STL/LAD/FBD程序編輯器則自動默認長度最大為254個字符。
6、可使用基本的STL指令訪問STRING變量的各個字符。例如:L FALT_SIG[5] //裝載變量FALT_SIG的第5個字符,即'r'。
7、還可以使用IEC庫的FC功能塊實現對STRING變量的訪問和處理。
數據類型是什么?
數據類型是什么?數據類型是人為規定的數據的屬性。在計算機和PLC中,數據實際上以二進制數的形式儲存。按長度分為1位、8位、16位、32位的二進制數據。
除了數據的長度,數據類型包含了更多的內容,例如32位的數據類型有雙字、32位整數、Time、浮點數、TIME_OF_DAY等。
數據的數據類型需要在符號表、塊的局部變量表中定義,因此數據類型是人為指定的數據的屬性。
指令和塊的輸入、輸出參數的實參的數據類型必須與對應的形參要求的相同,否則程序將會出錯。
OB40的參數OB40_MDL_ADDR的數據類型為WORD,不能直接用于要求數據類型為INT的整數比較指令。怎樣解決這一難題呢?在梯形圖中,可以用MOVE指令把OB40_MDL_ADDR的值傳送給沒有定義數據類型的一個絕對地址,例如MW10,MW10就可以用于比較指令了。MW10并沒有因此自動獲得數據類型INT,只是CPU“認為”MW10中的數據類型是INT,CPU被我們蒙騙了!
我見過不良小販把白色的小雞染成五顏六色來騙小孩,放到水里一洗,小雞的彩色就消失了。如果把小雞看成數據,染的顏色就是數據類型。把定義了數據類型的數據裝入絕對地址MW10或累加器(累加器也是一個特殊的絕對地址),數據類型的屬性就被剝去了,只剩下赤裸裸的數據,就像小雞的顏色被水洗掉了一樣。這時就可以把數據當作規定了長度的各種數據類型來使用。
|