存器PLC地址指存放于控制器中的地址,這些控制器可以是PLC,也可以是觸摸屏,或是文本顯示器。PLC地址一般采用10進制描述,共有5位,其中第一位代碼寄存器類型。第一位數(shù)字和寄存器類型的對應(yīng)關(guān)系如表1所示。PLC地址例如40001、30002等。
寄存器modbus協(xié)議地址指通信時使用的寄存器地址,在實際編程中,由于寄存器PLC地址前綴的區(qū)分作用,所以只需說明后4位數(shù),而且需轉(zhuǎn)換為4位十六進制地址。例如PLC地址40001對應(yīng)尋址地址0x0000,40002對應(yīng)尋址地址0x0001,寄存器尋址地址一般使用16進制描述。再如,PLC寄存器地址40003對應(yīng)協(xié)議地址0002,PLC寄存器地址30003對應(yīng)協(xié)議地址0002。在實際編程中,由于前綴的區(qū)分作用,所以只需說明后4位數(shù),而且需轉(zhuǎn)換為4位十六進制地址。
支持 Modbus 協(xié)議的設(shè)備或軟件,使用時用戶直接設(shè)置或看到的應(yīng) 當是 Modbus 數(shù)據(jù)地址。Modbus 地址所訪問的數(shù)據(jù),是通過各種 “功能”讀寫而來。 功能碼是 Modbus 地址的底層。 如果 Modbus 通 信的一方提供的所謂 Modbus 協(xié)議只有功能碼,則需要注意了解此 功能號與 Modbus 地址間的對應(yīng)關(guān)系。
使用 modbus 地址時應(yīng)注意下述問題:
1)40001~4xxxx 是美國 modicon 公司和 ge 公司 plc 使用的 modbus 地址,它是基于1的地址,即同類元件的首地址為1。西門子 plc 的 modbus 地址是基于0的地址。
2)美國的 modbus 地址左起第2位用來表示元件的類型,例如 i0.0的 modbus 地址為010001。 因為數(shù)據(jù)類型已經(jīng)包含在功能碼中了, 西門子的 i0.0的 modbus 地址實際上為000000, i2.0的 modbus 地址為 000016(或十六進制數(shù)16#0010) ,而不是010017。
3)、無論V寄存器還是M寄存器,里面的不同數(shù)據(jù)類型(VB、VW、VD、MB、MW、MD)都是基于寄存器內(nèi)存總字節(jié)地址為偏移地址。
4)、在數(shù)據(jù)報文中,所有的modbus地址都是從0開始的。也就是首次出現(xiàn)的數(shù)據(jù)項在報文中的地址為0。比如:(All data addresses in Modbus messages are referenced to zero. The first occurrence of a data item is addressed as item number zero.)
5)、Modbus地址實際上分為兩種情況。
第一種情況:PLC作Modbus主站,Modbus地址和PLC手冊里的地址一致,例如作主站的S7-200的MBUS_MSG指令用于向Modbus從站發(fā)送請求消息,和處理從站返回的響應(yīng)消息。要讀取從站(另一臺S7-200)的I0.0開始的地址區(qū)時,它的輸入?yún)?shù)Addr(Modbus地址)為10001。S7-200從站保持寄存器的V區(qū)起始地址為VB200時,要讀取從站VW200開始的V存儲區(qū)時,保持寄存器的地址是40001。
第二種情況:PLC作從站,PLC不用管什么Modbus地址,等著主站來讀寫它的地址區(qū)就是了。
主站的計算機軟件(例如DCS或組態(tài)軟件)的編程人員需要編寫實現(xiàn)Modbus通信的程序,首先需要確定Modbus RTU的報文結(jié)構(gòu)。他們一般不熟悉PLC,因此PLC的編程人員往往需要和上位機軟件的編程人員一起來討論Modbus的報文結(jié)構(gòu)。
最容易出問題的就是報文里Modbus地址與PLC存儲區(qū)地址的對應(yīng)關(guān)系。
S7 PLC手冊給出的Modbus地址與Modicon公司和GE公司PLC使用的地址相同,是基于1的地址,即同類元件的首地址為1。而西門子PLC采用的是基于0的地址,即同類元件的首地址為0。Modbus報文中西門子PLC的Modbus地址也采用基于0的地址。
PLC系統(tǒng)手冊中的Modbus地址的最高位用來表示地址區(qū)的類型,例如I0.0的Modbus地址為10001。因為地址區(qū)類型的信息已經(jīng)包含在報文的功能碼中了,報文中S7-200的I0.0的Modbus地址不是10001,而是0。報文中其他地址區(qū)的Modbus地址也應(yīng)按相同的原則處理。例如當S7-200從站保持寄存器的V區(qū)起始地址為VB200時,VW200對應(yīng)的保持寄存器在報文中的Modbus地址為0,而不是40001。
施耐德plc modbus地址對照表
000001至000XXX是實際輸出,對應(yīng)%QX0.0-%QXX.X
010001至010XXX是實際輸入,對應(yīng)%IX0.0-%IXX.X
030001至030032是模擬量寄存器,對應(yīng)%AIW0,16位一路依次類推
040001至040XXX是保持寄存器,對應(yīng)%MX0.0-%MXX.X,1對1,要是%MW就對應(yīng)16位,依次類推。施耐德PLC中 W表示字 16位,D表示雙字 32位。比如:%MW10和%MD10。B表示字節(jié) 8位,X表示位。比如:%MB0和%MX0.0~%MX0.7
%MW10.4
%MW10是指一個字,一個字分為2個字節(jié),一個字節(jié)8個位,也就是說%MW10中有16個位,從%MW10.0~%MW10.15。
%QW0.5.1.0.10
Q是輸出 ,0是機架,5是0號機架的第五個模塊,1是第五號模塊的第一個通道,0是第一個通道的第0個字,10是第0個字的第10個位。
無論MX、MB、MW、MD都是基于內(nèi)存總字節(jié)地址為偏移地址,也就是以%MB之后的地址為偏移地址。
施耐德plc寄存器地址對應(yīng)的modubs地址
寄存器地址 modubs 說明 公式
%QX1.0 000001.0 開關(guān)量輸出 %QXx.y=000001+x.y
%IX1.0 010001.0 開關(guān)量輸入 %IXx.y=010001+x.y
%AIW0 030001 模擬量輸入 %AIWx=030001+x
%MD40 0400801 保持寄存器 %MDx.y=040001+x*2.y
%MW50.0 040051.0 保持寄存器 %MWx.y=040001+x.y
%MX100.0 040051.0 保持寄存器 %MXx.y=040001+x/2.y
注意:
1、%MX100.0表示某個字節(jié)地址,因為%MW50這個地址中包含了%MB100、%MB101,%MX100.0其實是%MW50的第0位即40051.0
2、%MD40表示雙字,%MD40對應(yīng)的首地址是%MW*2,也就是%MW80,%MD40對應(yīng)的modbus地址為0400801
西門子s7系列plc modbus地址對照表
例如:地址:40040;對應(yīng)S7200地址:VW78;對應(yīng)S7300地址:DB1.DBW78;
三菱FX系列PLC modbus地址對照表
OMRON PLC地址轉(zhuǎn)MODBUS協(xié)議對照表
將OMRON PLC接入支持MODBUS協(xié)議的上位DCS系統(tǒng)中,通過ASC模塊可滿足用戶的這一需求。具體地址對照關(guān)系參考下面鏈接。
https://wenku.baidu.com/view/3ff1d16da5e9856a5712601d.html
臺達PLC寄存器地址與Modbus寄存器地址對照表
具體地址對照關(guān)系參考下面鏈接。
https://wenku.baidu.com/view/f884db6d102de2bd97058836.html
永宏P(guān)LC寄存器Modbus地址表
具體地址對照關(guān)系參考下面鏈接。
https://wenku.baidu.com/view/4843e77c30126edb6f1aff00bed5b9f3f90f72c8.html
信捷PLC寄存器Modbus地址表
文本標記語言(HTML)是用于在 Internet 上顯示 Web 頁面的主要標記語言。換句話說,網(wǎng)頁由 HTML 組成,用于通過 Web 瀏覽器顯示文本,圖像或其他資源。
使用標記來描述文檔結(jié)構(gòu)和表現(xiàn)形式并通過瀏覽器進行解析,然后把結(jié)果顯示在網(wǎng)頁上. 它是網(wǎng)頁構(gòu)成的基礎(chǔ),你見到的所有網(wǎng)頁都離不開HTML,所以學(xué)習(xí)HTML是基礎(chǔ)中的基礎(chǔ)。
什么是HTML?
HTML是用來制作網(wǎng)頁的標記語言
HTML是Hypertext MarkupLanguage的英文縮寫, 即超文本標記語言
HTML語言是一種標記語言,不需要編譯,直接由瀏 HTML語言是一種標記語言,不需要編譯,直接由瀏覽器執(zhí)行
HTML文件是一個文本文件,包含了一些HTML元素, HTML文件是一個文本文件,包含了一些HTML元素,標簽等.
HTML文件必須使用html或htm為文件名后綴
HTML是大小寫不敏感的,HTML與html是一樣的
Html和CSS的關(guān)系
學(xué)習(xí)web前端開發(fā)基礎(chǔ)技術(shù)需要掌握:HTML、CSS、JavaScript語言。下面我們就來了解下這三門技術(shù)都是用來實現(xiàn)什么的:
1. HTML是網(wǎng)頁內(nèi)容的載體。內(nèi)容就是網(wǎng)頁制作者放在頁面上想要讓用戶瀏覽的信息,可以包含文字、圖片、視頻等。
2. CSS樣式是表現(xiàn)(外觀控制)。就像網(wǎng)頁的外衣。比如,標題字體、顏色變化,或為標題加入背景圖片、邊框等。所有這些用來改變內(nèi)容外觀的東西稱之為表現(xiàn)。
3. JavaScript是用來實現(xiàn)網(wǎng)頁上的特效效果。如:鼠標滑過彈出下拉菜單。或鼠標滑過表格的背景顏色改變。還有焦點新聞(新聞圖片)的輪換。可以這么理解,有動畫的,有交互的一般都是用JavaScript來實現(xiàn)的。
HTML形象案例理解
為了簡化對復(fù)雜Internet的理解,暫時把復(fù)雜的Internet抽象成:向女生宿舍發(fā)送信號。
為了能夠在斷網(wǎng)后繼續(xù)聯(lián)絡(luò)女神,我們買來了電池和開關(guān),然后拉了普通電線線到女神的寢室。女神把小燈泡接在了電線的兩端。
這時只需要開閉開關(guān),就可以控制女神屋里的燈泡了。
發(fā)送信號
關(guān)閉著小燈泡1秒鐘,代表發(fā)送一個0。
打開了小燈泡1秒鐘,代表發(fā)送一個1。
此時可以向女神發(fā)送任意二進制內(nèi)容了。
發(fā)送文本
我們只希望發(fā)送一個“Good Night”。所以必須想辦法對“Good Night”進行編碼。
'G','o','o','d'的ASCII編碼是:071,111,111,100,轉(zhuǎn)換成二進制就是:0100 0001 0110 1111 0110 1111 0110 0100
使用發(fā)送二進制信號的方法發(fā)過去,女神需要自己解碼來閱讀出“Good”。
發(fā)送富文本
有一天,我們希望發(fā)送“I miss you”。
為了表達心意,你希望加粗“you”,并使用紅色的字體發(fā)送“miss”,而這一根簡陋的電線似乎很難理解“加粗”和“紅色”
于是機智的我們發(fā)送了:I <red>miss</red> <b>you</b>
同樣機智的女神理解了這件事情。
你發(fā)明了一種語言
我們很喜歡這種編碼格式,這是一種標記語言,于是我們稱其為:TGML (To Girl Markup Language)
平時你使用TGML來和你的女神通信,TGML可以非常好的解決富文本的傳輸問題。
表白
終于決定表白了,我們繪制了很美麗的心形圖片,還有兩個按鈕:接受、拒絕。
兩個按鈕分別會鏈接到 "接受.tgml"和"拒絕.tgml"
為了描述圖片,我們使用了<img src="pic">
為了描述按鈕,我們使用了<a href="接受.tgml">
現(xiàn)在發(fā)送給女神的內(nèi)容,已經(jīng)不只是帶格式的富文本,而是帶鏈接的富文本。
于是在這個世界上,擁有了一種能夠描述超文本的語言,叫做TGML
超文本
描述超文本的方式有很多,例如:HTML,TGML,還有markdown。HTML的誕生是為了描述超文本。
超文本的用途也很多,例如:描述一個網(wǎng)頁,或者描述一個Word文檔。HTML文件是超文本文件。但是超文本未必是HTML。
Microsoft Word
Microsoft Word是Office的一個組件。它同樣代表一個超文本資源。
如果你解壓一個docx文件并仔細翻一翻,你能找到你剛才寫的作業(yè),是以HTML方式記載著。
當然,描述超文本還有markdown。所以你可以使用一些工具,比如pandoc,把markdown轉(zhuǎn)換成word。
故事的結(jié)局
女神的名字叫瀏覽器,我們的名字叫Web服務(wù)器,女神和我們中間的那根線叫HTTP。
eb爬取是從Web上收集和解析數(shù)據(jù)的過程。Python社區(qū)已經(jīng)開發(fā)出一些非常強大的web爬取工具。其中,Pandas read_html()是從html表中爬取數(shù)據(jù)的一種快速方便的方法。
在本文中,你將學(xué)習(xí)Pandas read_html()來處理以下常見問題,并幫助你進行web爬取。
1.從字符串讀取表
2.從URL讀取表
3.從文件讀取表
4.使用parse_dates分析日期列
5.使用converters顯式轉(zhuǎn)換類型
6.多索引、標題和索引列
7.用match匹配表
8.使用屬性篩選表
9.使用缺失值
請檢查Notebook的源代碼(https://github.com/BindiChen/machine-learning/blob/master/data-analysis/024-pandas-read_html/pandas-read_html.ipynb)。
在第一個示例中,我們將從字符串中讀取HTML表。
html_string="""
<table>
<thead>
<tr>
<th>date</th>
<th>name</th>
<th>year</th>
<th>cost</th>
<th>region</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-01-01</td>
<td>Jenny</td>
<td>1998</td>
<td>0.2</td>
<td>South</td>
</tr>
<tr>
<td>2020-01-02</td>
<td>Alice</td>
<td>1992</td>
<td>-1.34</td>
<td>East</td>
</tr>
<tr>
<td>2020-01-03</td>
<td>Tomas</td>
<td>1982</td>
<td>1.00023</td>
<td>South</td>
</tr>
</tbody>
</table>
"""
要從字符串中讀取表,請執(zhí)行以下操作:
dfs=pd.read_html(html_string)
現(xiàn)在,我們得到的結(jié)果不是Pandas數(shù)據(jù)幀而是Python列表。如果使用type()函數(shù),可以看到:
>>> type(dfs)
list
如果要獲取表,可以使用索引訪問它:
dfs[0]
結(jié)果看起來很棒。讓我們看看dfs[0].info()的數(shù)據(jù)類型。默認情況下,數(shù)值列被轉(zhuǎn)換為數(shù)值類型,例如,year和cost列分別被轉(zhuǎn)換為int64和float64。
>>> df[0].info()
RangeIndex: 3 entries, 0 to 2
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 3 non-null object
1 name 3 non-null object
2 year 3 non-null int64
3 cost 3 non-null float64
4 region 3 non-null object
dtypes: float64(1), int64(1), object(3)
memory usage: 248.0+ bytes
Pandas read_html()接受URL。讓我們通過一個例子來看看這是如何工作的。
URL='https://en.wikipedia.org/wiki/London'
dfs=pd.read_html(URL)
與從字符串讀取相同,它返回一個數(shù)據(jù)幀列表。如果我們運行l(wèi)en(dfs),我們可以從給定的URL得到31個表。
>>> print(f'Total tables: {len(dfs)}')
31
下面是dfs[6]的一個例子:
Pandas read_html()接受一個文件。讓我們通過一個例子來看看這是如何工作的。
file_path='html_string.txt'
with open(file_path, 'r') as f:
dfs=pd.read_html(f.read())
dfs[0]
注意:以下教程將從字符串中讀取數(shù)據(jù),因為隨著時間的推移,網(wǎng)頁內(nèi)容可能變更。
日期列作為對象數(shù)據(jù)類型讀取。要正確讀取日期列,可以使用參數(shù)parse_dates指定日期列的列表。
>>> dfs=pd.read_html(html_string, parse_dates=['date'])
>>> dfs[0].info()
RangeIndex: 3 entries, 0 to 2
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 date 3 non-null datetime64[ns]
1 name 3 non-null object
2 year 3 non-null int64
3 cost 3 non-null float64
4 region 3 non-null object
dtypes: datetime64[ns](1), float64(1), int64(1), object(2)
memory usage: 248.0+ bytes
默認情況下,數(shù)值列被轉(zhuǎn)換為數(shù)值類型,例如,我們看到的year和cost列。但并非所有的數(shù)字文本數(shù)據(jù)都必須是數(shù)字類型,例如,所有值都以零開頭的ID列。
ID=0001
此外,有時可能需要顯式地進行類型轉(zhuǎn)換以確保數(shù)據(jù)類型的完整性。對于這些要求,我們可以使用參數(shù)轉(zhuǎn)換器顯式地進行類型轉(zhuǎn)換:
dfs=pd.read_html(html_string, converters={
'ID': str,
'year': int,
'cost': float,
})
默認情況下,位于<thead>中的<th>或<td>元素用于形成列索引,如果<thead>中包含多行,則創(chuàng)建一個多索引。
下面是一個在<thead>中包含多行的HTML表的示例。
html_string="""
<table>
<thead>
<tr>
<th colspan="5">Year 2020</th>
</tr>
<tr>
<th>date</th>
<th>name</th>
<th>year</th>
<th>cost</th>
<th>region</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-01-01</td>
<td>Jenny</td>
<td>1998</td>
<td>1.2</td>
<td>South</td>
</tr>
<tr>
<td>2020-01-02</td>
<td>Alice</td>
<td>1992</td>
<td>-1.34</td>
<td>East</td>
</tr>
</tbody>
</table>
"""
它創(chuàng)建多重索引,因為<thead>中有多行。
dfs=pd.read_html(html_string)
dfs[0]
指定標題行:
dfs=pd.read_html(html_string, header=1)
dfs[0]
指定索引列:
dfs=pd.read_html(html_string, header=1, index_col=0)
dfs[0]
參數(shù)匹配采用字符串或正則表達式。該值默認為.+(匹配任何非空字符串),并將返回所有表。
我們通過一個例子來看看這是如何工作的。
html_string="""
<table id="report">
<caption>2020 report</caption>
<thead>
<tr>
<th>date</th>
<th>name</th>
</tr>
</thead>
<tbody>
<tr>
<td>2020-01-01</td>
<td>Jenny</td>
</tr>
<tr>
<td>2020-01-02</td>
<td>Alice</td>
</tr>
</tbody>
</table>
<table>
<caption>Average income</caption>
<thead>
<tr>
<th>name</th>
<th>income</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tom</td>
<td>200</td>
</tr>
<tr>
<td>James</td>
<td>300</td>
</tr>
</tbody>
</table>
"""
要讀取包含特定文本的表:
# 標題中的文本
dfs=pd.read_html(html_string, match='2020 report')
# 表格單元格中的文本
dfs=pd.read_html(html_string, match='James')
參數(shù)attrs接受任何有效的HTML標記屬性的字典來篩選表。例如:
dfs=pd.read_html(html_string, attrs={'id': 'report'})
id是有效的HTML標記屬性。
默認情況下,所有空字符串都被視為缺失值,并作為NaN讀取。
下面是一個HTML表格的示例,其中的< td >單元格中有一些空字符串。
html_string="""
<table>
<tr>
<th>date</th>
<th>name</th>
<th>year</th>
<th>cost</th>
<th>region</th>
</tr>
<tr>
<td>2020-01-01</td>
<td>Jenny</td>
<td>1998</td>
<td>1.2</td>
<td>South</td>
</tr>
<tr>
<td>2020-01-02</td>
<td>Alice</td>
<td>1992</td>
<td></td>
<td>East</td>
</tr>
<tr>
<td>2020-01-03</td>
<td>Tomas</td>
<td>1982</td>
<td></td>
<td>South</td>
</tr>
</table>
"""
以默認設(shè)置讀取。
dfs=pd.read_html(html_string)
dfs[0]
為了保留這些空字符串,我們可以將參數(shù)keep_default_na設(shè)置為False。
dfs=pd.read_html(html_string, keep_default_na=False)
有時,對于缺少的值,你可能有其他字符表示法。如果我們知道什么類型的字符用作表中的缺失值,我們可以使用na_values參數(shù)處理它們:
dfs=pd.read_html(html_string, na_values=['?', '&'])
當數(shù)據(jù)幀已經(jīng)創(chuàng)建好后,我們可以使用pandas replace()函數(shù)來處理這些值:
df_clean=dfs[0].replace({ "?": np.nan, "&": np.nan })
Pandas read_html()函數(shù)是一種快速方便地從html表中獲取數(shù)據(jù)的方法。
我希望本文能幫助你節(jié)省從HTML表中刪除數(shù)據(jù)的時間。建議你查看read_html()API的文檔,并了解可以做的其他事情。
謝謝你的閱讀。請查看Notebook的源代碼,如果你對機器學(xué)習(xí)的實際方面感興趣,請繼續(xù)關(guān)注:https://github.com/BindiChen/machine-learning/blob/master/data-analysis/024-pandas-read_html/pandas-read_html.ipynb。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。