![]() | 6ES7215-1AG40-0XB0 SIMATIC S7-1200,CPU 1215C, 緊湊型 CPU,DC/DC/DC, 2 個 PROFINET 端口, 機載 I/O: 14 個 24VDC 數(shù)字輸入;10 個 24VDC 數(shù)字輸出;0.5A; 2 AI 0-10V DC,2 AO 0-20mA DC, 電源:直流 20.4-28.8V DC, 程序存儲器/數(shù)據(jù)存儲器 125 KB |
近做項目,用到了IO-Link設(shè)備,在讀取從站數(shù)據(jù)時候,用到從雙字中提取字、字節(jié)和位的知識,作為一個菜鳥,由于以前也沒有仔細關(guān)注過這個細節(jié),所以又查了下資料,并做了程序進行測試,現(xiàn)記錄一下,以備自己將來使用,也方便有類似問題的人使用;
下面主要從資料查詢、準備程序、程序驗證進行記錄:
一、資料查詢:
相信從網(wǎng)上搜一下西門子數(shù)據(jù)類型方面的資料,會有一大堆,見的就是解釋雙字和字節(jié)之間的組成關(guān)系,如下圖:
就以這個資料為基礎(chǔ),進行試驗驗證;
二、 程序準備
由于資料上大部分都是以M區(qū)介紹雙字和字節(jié)等關(guān)系,但是實際情況是DB塊中的數(shù)據(jù)居多,故在此實驗中,將M區(qū)和DB區(qū)的內(nèi)容進行對比,以方便觀察,進行如下準備:
1、 新建DB塊,里面創(chuàng)建需要的變量:
2、 創(chuàng)建M區(qū)變量,以方便做比較,這里取MD24,然后將其拆成字、字節(jié)、位,以方便觀察:
3、 創(chuàng)建FC程序:主要是將雙字拆成字、雙字,并將雙字傳送給單字、單字傳送給雙字,為了方便置位雙字中的位,特意用數(shù)組逐位傳送給雙字中的位:
三、程序驗證:
省略掉程序的下載啊、仿真啊的操作步驟,因為那個不是重點,直接展示測試結(jié)果:從數(shù)組中,分別置位不同的位,則相當于分別對雙字中的位進行置位,可以分別觀察結(jié)果,現(xiàn)在取比較有代表性的兩個位,即將第0位和第16位置1,結(jié)果如下兩圖所示:
通過測試可以發(fā)現(xiàn)如下規(guī)律:
1、西門子雙字中位的排列,是從右向左排的,這點和平時寫字順序正好相反,但是我覺得可以從進制的位數(shù)去記憶一下,比如我們十進制,從右往左分別是個、十、百、千、萬等位,這個正好類似于那個;
2、 可以看下雙字傳給單字的情況,對于截取數(shù)據(jù)時候比較有幫助,具體不總結(jié),可以體會一下;
3、第三條也是我一開始比較迷糊的地方,觀察雙字的四個字節(jié),和位的排序是一樣的,即0位在右,依次往左增大,但是M區(qū)其實按照這個方向排列,但是讓人很迷糊,上圖為例,我們置位0位的時候,在DB中是第0個字節(jié)有變化,但是在M區(qū)中對應(yīng)的是MB27變化,雖然按照一開始資料所示,MB27是在右邊,但是MB27是第0字節(jié),MB26是第1字節(jié),依次類推,大小和字節(jié)順序又反了一次,雖然仔細想一下就明白怎么回事,但是依然有點小別扭;
遇到類似情況的,應(yīng)該不止我一個,分享一下,希望能幫到需要的人,次發(fā)分享貼,文筆有點差勁,大家見諒,有不足和錯誤的地方,歡迎斧正;