整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

寄存器PLC地址与寄存器modbus协议地址

寄存器PLC地址与寄存器modbus协议地址

存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以是触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代码寄存器类型。第一位数字和寄存器类型的对应关系如表1所示。PLC地址例如40001、30002等。

寄存器modbus协议地址指通信时使用的寄存器地址,在实际编程中,由于寄存器PLC地址前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。例如PLC地址40001对应寻址地址0x0000,40002对应寻址地址0x0001,寄存器寻址地址一般使用16进制描述。再如,PLC寄存器地址40003对应协议地址0002,PLC寄存器地址30003对应协议地址0002。在实际编程中,由于前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。

支持 Modbus 协议的设备或软件,使用时用户直接设置或看到的应 当是 Modbus 数据地址。Modbus 地址所访问的数据,是通过各种 “功能”读写而来。 功能码是 Modbus 地址的底层。 如果 Modbus 通 信的一方提供的所谓 Modbus 协议只有功能码,则需要注意了解此 功能号与 Modbus 地址间的对应关系。

使用 modbus 地址时应注意下述问题:

1)40001~4xxxx 是美国 modicon 公司和 ge 公司 plc 使用的 modbus 地址,它是基于1的地址,即同类元件的首地址为1。西门子 plc 的 modbus 地址是基于0的地址。

2)美国的 modbus 地址左起第2位用来表示元件的类型,例如 i0.0的 modbus 地址为010001。 因为数据类型已经包含在功能码中了, 西门子的 i0.0的 modbus 地址实际上为000000, i2.0的 modbus 地址为 000016(或十六进制数16#0010) ,而不是010017。

3)、无论V寄存器还是M寄存器,里面的不同数据类型(VB、VW、VD、MB、MW、MD)都是基于寄存器内存总字节地址为偏移地址。

4)、在数据报文中,所有的modbus地址都是从0开始的。也就是首次出现的数据项在报文中的地址为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从站发送请求消息,和处理从站返回的响应消息。要读取从站(另一台S7-200)的I0.0开始的地址区时,它的输入参数Addr(Modbus地址)为10001。S7-200从站保持寄存器的V区起始地址为VB200时,要读取从站VW200开始的V存储区时,保持寄存器的地址是40001。

第二种情况:PLC作从站,PLC不用管什么Modbus地址,等着主站来读写它的地址区就是了。

主站的计算机软件(例如DCS或组态软件)的编程人员需要编写实现Modbus通信的程序,首先需要确定Modbus RTU的报文结构。他们一般不熟悉PLC,因此PLC的编程人员往往需要和上位机软件的编程人员一起来讨论Modbus的报文结构。

最容易出问题的就是报文里Modbus地址与PLC存储区地址的对应关系。

S7 PLC手册给出的Modbus地址与Modicon公司和GE公司PLC使用的地址相同,是基于1的地址,即同类元件的首地址为1。而西门子PLC采用的是基于0的地址,即同类元件的首地址为0。Modbus报文中西门子PLC的Modbus地址也采用基于0的地址。

PLC系统手册中的Modbus地址的最高位用来表示地址区的类型,例如I0.0的Modbus地址为10001。因为地址区类型的信息已经包含在报文的功能码中了,报文中S7-200的I0.0的Modbus地址不是10001,而是0。报文中其他地址区的Modbus地址也应按相同的原则处理。例如当S7-200从站保持寄存器的V区起始地址为VB200时,VW200对应的保持寄存器在报文中的Modbus地址为0,而不是40001。

施耐德plc modbus地址对照表

000001至000XXX是实际输出,对应%QX0.0-%QXX.X

010001至010XXX是实际输入,对应%IX0.0-%IXX.X

030001至030032是模拟量寄存器,对应%AIW0,16位一路依次类推

040001至040XXX是保持寄存器,对应%MX0.0-%MXX.X,1对1,要是%MW就对应16位,依次类推。施耐德PLC中 W表示字 16位,D表示双字 32位。比如:%MW10和%MD10。B表示字节 8位,X表示位。比如:%MB0和%MX0.0~%MX0.7

%MW10.4

%MW10是指一个字,一个字分为2个字节,一个字节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都是基于内存总字节地址为偏移地址,也就是以%MB之后的地址为偏移地址。

施耐德plc寄存器地址对应的modubs地址

寄存器地址 modubs 说明 公式

%QX1.0 000001.0 开关量输出 %QXx.y=000001+x.y

%IX1.0 010001.0 开关量输入 %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表示某个字节地址,因为%MW50这个地址中包含了%MB100、%MB101,%MX100.0其实是%MW50的第0位即40051.0

2、%MD40表示双字,%MD40对应的首地址是%MW*2,也就是%MW80,%MD40对应的modbus地址为0400801


西门子s7系列plc modbus地址对照表

例如:地址:40040;对应S7200地址:VW78;对应S7300地址:DB1.DBW78;

三菱FX系列PLC modbus地址对照表

OMRON PLC地址转MODBUS协议对照表

将OMRON PLC接入支持MODBUS协议的上位DCS系统中,通过ASC模块可满足用户的这一需求。具体地址对照关系参考下面链接。

https://wenku.baidu.com/view/3ff1d16da5e9856a5712601d.html

台达PLC寄存器地址与Modbus寄存器地址对照表

具体地址对照关系参考下面链接。

https://wenku.baidu.com/view/f884db6d102de2bd97058836.html

永宏PLC寄存器Modbus地址表

具体地址对照关系参考下面链接。

https://wenku.baidu.com/view/4843e77c30126edb6f1aff00bed5b9f3f90f72c8.html

信捷PLC寄存器Modbus地址表

文本标记语言(HTML)是用于在 Internet 上显示 Web 页面的主要标记语言。换句话说,网页由 HTML 组成,用于通过 Web 浏览器显示文本,图像或其他资源

使用标记来描述文档结构和表现形式并通过浏览器进行解析,然后把结果显示在网页上. 它是网页构成的基础,你见到的所有网页都离不开HTML,所以学习HTML是基础中的基础。


什么是HTML


HTML是用来制作网页的标记语言

HTML是Hypertext MarkupLanguage的英文缩写, 即超文本标记语言

HTML语言是一种标记语言,不需要编译,直接由浏 HTML语言是一种标记语言,不需要编译,直接由浏览器执行

HTML文件是一个文本文件,包含了一些HTML元素, HTML文件是一个文本文件,包含了一些HTML元素,标签等.

HTML文件必须使用html或htm为文件名后缀

HTML是大小写不敏感的,HTML与html是一样的


HtmlCSS的关系


学习web前端开发基础技术需要掌握:HTML、CSS、JavaScript语言。下面我们就来了解下这三门技术都是用来实现什么的:


1. HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字、图片、视频等。

2. CSS样式是表现(外观控制)。就像网页的外衣。比如,标题字体、颜色变化,或为标题加入背景图片、边框等。所有这些用来改变内容外观的东西称之为表现。

3. JavaScript是用来实现网页上的特效效果。如:鼠标滑过弹出下拉菜单。或鼠标滑过表格的背景颜色改变。还有焦点新闻(新闻图片)的轮换。可以这么理解,有动画的,有交互的一般都是用JavaScript来实现的。

HTML形象案例理解


为了简化对复杂Internet的理解,暂时把复杂的Internet抽象成:向女生宿舍发送信号。

为了能够在断网后继续联络女神,我们买来了电池和开关,然后拉了普通电线线到女神的寝室。女神把小灯泡接在了电线的两端。

这时只需要开闭开关,就可以控制女神屋里的灯泡了。

发送信号

关闭着小灯泡1秒钟,代表发送一个0。

打开了小灯泡1秒钟,代表发送一个1。

此时可以向女神发送任意二进制内容了。

发送文本

我们只希望发送一个“Good Night”。所以必须想办法对“Good Night”进行编码。

'G','o','o','d'的ASCII编码是:071,111,111,100,转换成二进制就是:0100 0001 0110 1111 0110 1111 0110 0100

使用发送二进制信号的方法发过去,女神需要自己解码来阅读出“Good”。


发送富文本

有一天,我们希望发送“I miss you”。

为了表达心意,你希望加粗“you”,并使用红色的字体发送“miss”,而这一根简陋的电线似乎很难理解“加粗”和“红色”

于是机智的我们发送了:I <red>miss</red> <b>you</b>

同样机智的女神理解了这件事情。


你发明了一种语言

我们很喜欢这种编码格式,这是一种标记语言,于是我们称其为:TGML (To Girl Markup Language)

平时你使用TGML来和你的女神通信,TGML可以非常好的解决富文本的传输问题。

表白

终于决定表白了,我们绘制了很美丽的心形图片,还有两个按钮:接受、拒绝。

两个按钮分别会链接到 "接受.tgml"和"拒绝.tgml"

为了描述图片,我们使用了<img src="pic">

为了描述按钮,我们使用了<a href="接受.tgml">

现在发送给女神的内容,已经不只是带格式的富文本,而是带链接的富文本。

于是在这个世界上,拥有了一种能够描述超文本的语言,叫做TGML

超文本

描述超文本的方式有很多,例如:HTML,TGML,还有markdown。HTML的诞生是为了描述超文本。

超文本的用途也很多,例如:描述一个网页,或者描述一个Word文档。HTML文件是超文本文件。但是超文本未必是HTML。

Microsoft Word

Microsoft Word是Office的一个组件。它同样代表一个超文本资源。

如果你解压一个docx文件并仔细翻一翻,你能找到你刚才写的作业,是以HTML方式记载着。

当然,描述超文本还有markdown。所以你可以使用一些工具,比如pandoc,把markdown转换成word。


故事的结局

女神的名字叫浏览器,我们的名字叫Web服务器,女神和我们中间的那根线叫HTTP。

eb爬取是从Web上收集和解析数据的过程。Python社区已经开发出一些非常强大的web爬取工具。其中,Pandas read_html()是从html表中爬取数据的一种快速方便的方法。

在本文中,你将学习Pandas read_html()来处理以下常见问题,并帮助你进行web爬取。

1.从字符串读取表

2.从URL读取表

3.从文件读取表

4.使用parse_dates分析日期列

5.使用converters显式转换类型

6.多索引、标题和索引列

7.用match匹配表

8.使用属性筛选表

9.使用缺失值

请检查Notebook的源代码(https://github.com/BindiChen/machine-learning/blob/master/data-analysis/024-pandas-read_html/pandas-read_html.ipynb)。


1.从字符串中读取表

在第一个示例中,我们将从字符串中读取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>
"""

要从字符串中读取表,请执行以下操作:

dfs=pd.read_html(html_string)

现在,我们得到的结果不是Pandas数据帧而是Python列表。如果使用type()函数,可以看到:

>>> type(dfs)
list

如果要获取表,可以使用索引访问它:

dfs[0]

结果看起来很棒。让我们看看dfs[0].info()的数据类型。默认情况下,数值列被转换为数值类型,例如,year和cost列分别被转换为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

2.从URL读取表

Pandas read_html()接受URL。让我们通过一个例子来看看这是如何工作的。

URL='https://en.wikipedia.org/wiki/London'

dfs=pd.read_html(URL)

与从字符串读取相同,它返回一个数据帧列表。如果我们运行len(dfs),我们可以从给定的URL得到31个表。

>>> print(f'Total tables: {len(dfs)}')
31

下面是dfs[6]的一个例子:


3.从文件读取表

Pandas read_html()接受一个文件。让我们通过一个例子来看看这是如何工作的。

file_path='html_string.txt'
with open(file_path, 'r') as f:
 dfs=pd.read_html(f.read())

dfs[0]

注意:以下教程将从字符串中读取数据,因为随着时间的推移,网页内容可能变更。


4.使用parse_dates分析日期列

日期列作为对象数据类型读取。要正确读取日期列,可以使用参数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

5.使用converters显式转换类型

默认情况下,数值列被转换为数值类型,例如,我们看到的year和cost列。但并非所有的数字文本数据都必须是数字类型,例如,所有值都以零开头的ID列。

ID=0001

此外,有时可能需要显式地进行类型转换以确保数据类型的完整性。对于这些要求,我们可以使用参数转换器显式地进行类型转换:

dfs=pd.read_html(html_string, converters={
 'ID': str,
 'year': int,
 'cost': float,
})

6.多索引、标题和索引列

默认情况下,位于<thead>中的<th>或<td>元素用于形成列索引,如果<thead>中包含多行,则创建一个多索引。

下面是一个在<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>
"""

它创建多重索引,因为<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]

7.用match匹配表

参数匹配采用字符串或正则表达式。该值默认为.+(匹配任何非空字符串),并将返回所有表。

我们通过一个例子来看看这是如何工作的。

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')

8.使用属性筛选表

参数attrs接受任何有效的HTML标记属性的字典来筛选表。例如:

dfs=pd.read_html(html_string, attrs={'id': 'report'})

id是有效的HTML标记属性。


9.使用缺失值

默认情况下,所有空字符串都被视为缺失值,并作为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>
"""

以默认设置读取。

dfs=pd.read_html(html_string)
dfs[0]

为了保留这些空字符串,我们可以将参数keep_default_na设置为False。

dfs=pd.read_html(html_string, keep_default_na=False)

有时,对于缺少的值,你可能有其他字符表示法。如果我们知道什么类型的字符用作表中的缺失值,我们可以使用na_values参数处理它们:

dfs=pd.read_html(html_string, na_values=['?', '&'])

当数据帧已经创建好后,我们可以使用pandas replace()函数来处理这些值:

df_clean=dfs[0].replace({ "?": np.nan, "&": np.nan })

结论

Pandas read_html()函数是一种快速方便地从html表中获取数据的方法。

我希望本文能帮助你节省从HTML表中删除数据的时间。建议你查看read_html()API的文档,并了解可以做的其他事情。

谢谢你的阅读。请查看Notebook的源代码,如果你对机器学习的实际方面感兴趣,请继续关注:https://github.com/BindiChen/machine-learning/blob/master/data-analysis/024-pandas-read_html/pandas-read_html.ipynb。