PLC的Modbus通信Word格式文档下载.docx

上传人:b****6 文档编号:21697203 上传时间:2023-01-31 格式:DOCX 页数:18 大小:204.70KB
下载 相关 举报
PLC的Modbus通信Word格式文档下载.docx_第1页
第1页 / 共18页
PLC的Modbus通信Word格式文档下载.docx_第2页
第2页 / 共18页
PLC的Modbus通信Word格式文档下载.docx_第3页
第3页 / 共18页
PLC的Modbus通信Word格式文档下载.docx_第4页
第4页 / 共18页
PLC的Modbus通信Word格式文档下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

PLC的Modbus通信Word格式文档下载.docx

《PLC的Modbus通信Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《PLC的Modbus通信Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。

PLC的Modbus通信Word格式文档下载.docx

数据量L

CRCH

CRCL

Add0

3H

HoldStart

DataNum

CRC高位

CRC低位

数据帧说明如下表:

表2读命令主站发送命令帧说明

要读数据的从站地址

03H代表读取多个保持寄存器

所读取数据的地址以两个字节表示

所读取数据的个数以两个字节表示(注:

此处说的数据量以字为单位)

CRC校验码在数据帧中以两个字节表示,主要用于检验数据传输过程中是否出错

例:

需要读取2号站从第4个寄存器开始的3个寄存器,MODBUS主站发送的数据帧为:

0203000400034439

从站在接收到主站的读命令以后,会发送一个返回命令帧,返回的命令帧格式如表3。

表3读命令从站返回命令帧格式

数据量

数据1

数据N

返回数据的字节数N

Data(1-N)

表4读命令从站返回命令帧说明

返回数据的从站地址

03H代表该数据帧是应答读取多个保持寄存器

返回数据的字节个数(注:

以字节为单位)

数据

所返回的数据(数据个数与数据量相同)

CRC校验码在数据帧中以两个字节表示,主要用于检验应答帧在传输过程中是否出错

对于主站的读命令帧,2号站如果第4个寄存器开始的3个寄存器里面的值分别为:

31,32H,33H,34H,35H,36H

则应答帧应该是:

020306313233343536D1AC

对于发送的命令帧与应答帧之间有如下关系:

1:

两个数据帧的设备地址相同。

2:

两个数据帧的功能码相同。

3:

返回的数据量N=2ⅹDataNum

如果从站在接收到数据以后,认为接收到的主站发送过来的数据是错误的,会返回一个异常帧给主站,告诉主站,从站接收到的数据是错误的。

异常帧的数据格式如表5,数据帧不再具体说明。

表5异常帧格式

错误信息

83H

一个字节的错误信息

2号站在接收到主站发送的命令以后,判断得出该命令是错误的,发送回一个异常帧:

02830170F0

错误信息可以根据不同的错误类型而不同。

2、写保持寄存器

当MODBUS主站需要向从站指定地址写入数据时,会发送一个数据帧,数据帧格式如表6。

表6写命令主站发送数据帧格式

数量H

数量L

字节数

具体数据

10H

byteN

1-byteN

表7写命令主站发送数据帧说明

要写入数据的从站地址

10H代表写多个保持寄存器

要写入数据的首地址,用两个字节表示

要写入数据的个数(注:

以字为单位)

需要向2号从站第80个寄存器开始的4个寄存器里面依次写入:

11H,22H,33H,44H,55H,66H,77H,88H

则MODBUS主站发送的数据帧为:

021000500004081122334455667788D4F0

当从站接收到主站的写命令帧以后,判断接收到的信息是正确的,会返回一个命令帧告诉主站所发生的数据从站已经正确接收到了,返回数据帧格式如表8。

表8写命令从站返回数据帧格式

返回帧说明如下表:

表9写命令从站返回数据帧说明

被写入数据的从站地址

10H代表响应的是写多个保持寄存器

被写入数据的首地址,用两个字节表示

被写入数据的个数(注:

CRC校验码在数据帧中以两个字节表示,主要用于检验数据返回过程中是否出错

2号从站在接收到主站的写命令以后,判断接收到的信息是正确的,返回一个应答帧:

021000500004C1E8

对于PLC写保持寄存器,发送的命令帧与应答帧之间应该有如下关系:

设备地址相同

功能码相同

两个数据帧的地址HoldStart相同

4:

两个数据帧的数据量DataNum相同

异常帧的数据格式如表10,命令帧不再具体说明。

表10异常帧格式

Addr0

90H

2号从站在接到到命令以后,判断接收到的信息是一个错误信息,返回一个异常帧:

0290017DC0

3.2PLC指令介绍

对于S7-200PLC,开发了MODBUS库函数,可以直接使用它所带的MODBUS库函数来实现PLC与其他设备之间的MODBUS通信。

选用PROT0作为MODBUS通信,主要用到MODBUS库函数中的MBUS_CTRL和MBUS_MSG。

3.2.1MBUS_CTR

用于S7-200端口0的MBUS_CTRL指令可初始化、监视或禁用Modbus通讯。

在使用MBUS_MSG指令之前,必须正确执行MBUS_CTRL指令。

指令完成后立即设定"

完成"

位,才能继续执行下一条指令。

在每次扫描且EN输入打开时执行该指令。

MBUS_CTRL指令必须在每次扫描时(包括首次扫描)被调用,以允许监视随MBUS_MSG指令启动的任何突出消息的进程。

除非每次调用MBUS_CTRL,否则Modbus主设备协议将不能正确运行,MBUS_CTRL指令如图2。

图2MBUS_CTRL指令

Mode:

输入数值选择通讯协议。

输入值1为Modbus协议;

输入值0为PPI协议。

在本次设计中输入1。

Baud:

设置波特率,可以设置的波特率有1200、2400、4800、9600、19200、38400、57600和115200,在本次设计中,波特率选择为9600。

Parity:

设置校验方式。

0-无奇偶校验;

1-奇校验;

2-偶校验。

在本次设计中采用无奇偶校验。

Timeout:

设置超时时间,用于确定主站发送命令以后从站是否相应,一般设置为1000。

Done:

执行该命令完成时,该位被置为1。

Error:

当指令执行出现错误的时候,该寄存器显示错误类型。

3.2.2MBUS_MSG

MBUS_MSG指令用于启动对Modbus从站的请求并处理应答。

当EN输入和"

首次"

输入打开时,BUS_MSG指令启动对Modbus从站的请求。

发送请求、等待应答、并处理应答通常需要多次扫描。

EN输入必须打开以启用请求的发送,并应该保持打开直到"

位被置位,BUS_MSG指令如图3示。

图3BUS_MSG指令

First:

应当通过一个边沿检测元素打开,这将导致请求被传送一次。

Slave:

Modbus从站的地址。

RW:

指定指令的类型是读指令还是写指令,0表示指令为读;

1表示指令为写。

Addr:

读取Modbus从站的起始地址。

Count:

指定此次读写数据的个数。

DataPtr:

要写入数据的首地址或者是读取上来数据存放的首地址。

指令完成时该位置1。

当指令执行出现错误时,在该寄存器处显示出错误号。

1、需要读取2号站地址为0004开始的3个寄存器里面的值到VB200地址开始的寄存器里,设置如图4。

2、需要将VB100地址开始的4个寄存器里面的值写到地址为004F开始的寄存器里面,设置如图5。

图4读数据设置图6写数据设置

在这里需要注意的有两点:

第一,对于要写入或者是要读取的寄存器地址,如果需要读0004开始的寄存器,地址要设置为40005而不是40004,同样如果需要写004F地址应该设置为40080而不是40079,这是通过观察其发送出的数据帧发现的,如果读寄存器时地址设置为40004,发送出的命令帧是:

020300030003F5F8

写命令同样存在地址不同的情况。

第二,就是要读取的数据量是以字为单位而不是以字节为单位。

3.3I/O分配

在这次设计中一共用到了5个输入,3个输出,具体分配如表7

表7I/O分配表

I/O名称

作用

I/O类型

I0.0

复位按钮

输入

I0.1

发送步进电机阶段1控制命令

I0.2

发送步进电机阶段2控制命令

I0.3

发送步进电机阶段3控制命令

I0.5

急停

Q0.1

步进电机阶段1错误

输出

Q0.2

步进电机阶段2错误

Q0.3

步进电机阶段3错误

3.4PLC程序设计

PLC程序包含一个主程序和4个子程序构成。

4个子程序分别是一个初始化子程序和3个步进电机阶段控制子程序。

3.4.1主程序

主程序主要是根据条件调用相应的子程序,此外还处理一些简单的逻辑运算。

主程序流程图如图7:

图7主程序流程图

如图7示,首先判断是否调用初始化子程序,然后对MODBUS主设备进行初始化,接着根据VB10值的不同分别调用相应的步进电机阶段动作子程序,扫描完相应子程序以后还要判断急停按钮是否有效,如果无效,自此一个扫描周期结束,进入下一个扫描周期;

如果有效,首先将VB10清零,然后向从站的命令寄存器写入代表急停的命令,到此一个扫描周期结束。

3.4.2初始化

初始化子程序是在上电或者是满足复位条件时调用的,在该子程序里面完成了4个动作:

第一,将写数据缓冲区VB100到VB107全部清零;

第二,将存放3个阶段状态信息返回值的寄存器VB200,VB210,VB220清零;

第三,将3个阶段子程序中所用到的控制寄存器VD0,VD4,VW8清零;

第四,将VB10里面的值赋值为1,允许步进电机阶段1动作。

初始化流程如图8示。

图8初始化流程图

3.4.3步进电机阶段控制

步进电机阶段控制包括3个子程序,三个子程序的动作流程结构一样,当进入相应步进电机阶段子程序后执行:

步骤1:

判断是否满足发送相应的步进电机阶段控制命令,如果不满足继续等待;

如果满足,进入下一步。

步骤2:

将上一步进电机阶段控制所用到的寄存器清零。

步骤3:

将存放3个步进电机阶段状态信息返回值的寄存器(VB200,VB210,VB220)清零,进入下一步。

步骤4:

对VB100赋值。

步骤5:

将VB100开始地址处的4个数据写入从站,进入下一步。

步骤6:

判断是否接收到下位机返回的接收正确的信号,如果接收到进入下一步骤,如果没有接收到,另行处理,现在程序中还没有编写。

步骤7:

延时10S,读取从站状态信息寄存器里面的值,放入对应的寄存器。

步骤8:

根据相应寄存器里面值判断相应的步进电机阶段动作是否完成,如果状态信息表示完成,进入步骤10,如果状态信息表示未完成进入下一步。

如果接收到的状态信息错误,在指定的输出点报错。

步骤9:

延时5S,再次执行步骤8。

步骤10:

赋值VB10,允许发送下一步进电机阶段动作命令。

3个步进电机阶段的动作流程图如图9示。

图9步进电机阶段动作流程图

3个步进电机阶段动作流程图类似,不同之处如表:

阶段

步骤名

步进电机阶段1

步进电机阶段2

步进电机阶段3

步骤1

判断条件是I0.1

判断条件是I0.2

判断条件是I0.3

步骤2

清VB7,VB8,VB9

清VB1,VB2,VB3

清VB4,VB5,VB6

步骤4

赋值VB100=01H

赋值VB100=02H

赋值VB100=04H

步骤7

读取从站执行状态信息存在VB200

读取从站执行状态信息存在VB210

读取从站执行状态信息存在VB220

步骤8

状态信息错误在Q0.1报错

步骤10

赋值VB10=2

赋值VB10=3

赋值VB10=1

3.4.4紧急处理

在紧急情况下,MODBUS主站向从站发送一个命令,从站在收到这个命令以后,让程序进入初始化的动作。

在此设计中紧急情况用输入I0.5代替,当I0.5接通时,向从站发送一个08H,发送的命令帧为:

0210004F0004080800000000000000E1F6

从站在接收到08H以后就知道信息值表示让程序初始化。

4调试

将程序下载到PLC,将PLC处于运行状态,此时程序进入允许步进电机阶段1的控制命令发送。

1、点击I0.2或者是I0.3,PLC上面没有响应,原因是此时PLC只允许步进电机阶段1动作,而刚才是要求发送步进电机阶段2和步进电机阶段3的控制命令,所以不响应。

2、点击I0.1,程序开始响应,发送一帧数据到MODBUS从站。

数据帧为:

0210004F0004080100000000000000219C

在接收到该串数据后在串口上返回一帧数据:

0210004F0004F02E

表示从站已经正确的接收到了PLC的控制命令。

10S以后PLC会发送一个读取状态信息的数据帧到从站,数据帧为:

表示需要读取从0004地址开始的3个数据,接收到该数据帧以后,假如从站步进电机阶段1还没有完成,那么返回一帧数据:

0203060200000000003467

表示从站此时正在执行步进电机阶段1,PLC收到数据帧以后知道此时从站状态值为2,还没有完成步进电机阶段1动作,于是延时5S再次发送读状态信息的数据帧;

如果从站接收到读取状态信息帧时,步进电机阶段1的动作已经完成,那么返回一帧数据:

02030603000000000035B6

表示此时从站处于状态3即:

已经完成了步进电机阶段1。

PLC接收到返回消息后知道步进电机阶段1完成了,可以进行步进电机阶段2动作了,于是将VB10里面赋值为2;

当从站返回一个错误信息时,比如在步进电机阶段1时,从站返回一个步进电机阶段2完成,那么PLC接收到消息以后直接在指定报错点Q0.1报错。

3、进入允许步进电机阶段2时,按照步进电机阶段1的操作顺序进行操作。

与步进电机阶段1不同的有三点:

第一,PLC发送到从站的控制命令帧不一样,步进电机阶段2PLC发送的控制命令帧为:

0210004F00040802000000000000006189

第二,当PLC在发送读数据请求以后,从站返回的数据帧不一样,如果步进电机阶段2未完成返回的数据帧应该是:

02030605000000000035D0

当步进电机阶段2完成时返回的数据帧应该是:

02030606000000000035E3

第三,返回状态信息出现错误时,步进电机阶段2的错误指示是用的Q0.2,步进电机阶段3不在细说。

4,当步进电机阶段3完成以后,再次触发I0.1,可以进入下一个步进电机阶段1的动作。

5,在步进电机阶段1,如果读取到的状态信息错误时,能够在Q0.1指示出来;

在步进电机阶段2,如果读取到的状态信息错误时,能够在Q0.2指示出来;

在步进电机阶段3,如果读取到的状态信息错误时,能够在Q0.3指示出来;

并且可以通过I0.0将该指示解除以及将程序复位,让程序进入允许步进电机阶段1动作状态。

6,通过I0.5按钮,可以实现在某一特定时刻向从站发送一个命令帧让从站程序复位,设计中采用的是发送08H。

5问题分析

1串口主动发送给PLC的数据PLC不能收到

原因分析:

MODBUS协议是一种主从协议,它不允许从站主动的向主站发送数据,只允许主站以轮询的方式与从站进行数据交换.

解决办法:

如果PLC需要某一个地址的数据,首先要向从站发送一个读指令,从站在接收到读指令以后将数据返回。

2PLC在发送完数据帧给从站以后,通过从站发送给PLC的数据帧有时可以收到,有时不可以收到。

现象:

当PLC发送一帧数据到从站以后,从站返回的信息有时候PLC可以接收到,有时候不可以接收到。

并且接收不到数据时指令显示是接收超时。

PLC中对MODBUS主设备进行初始化时设置了一个超时时间,从站给PLC的数据须在PLC发送完命令帧以后的这个时间完成,PLC才可以接收到数据。

办法1:

在MODBUS主设备初始化设置时将超时时间设置长一点;

办法2:

从站在返回应答帧时,尽量的将时间提前,在PLC刚把数据发送到从站的时候,就将应答帧通过从站发送回去。

3错误指示时,总是出错

当步进电机阶段1动作完成以后进入允许步进电机阶段2动作状态,Q0.2直接报错读取状态信息错误。

在步进电机阶段1动作完成以后,程序中存放状态信息的寄存器保持步进电机阶段1读取上来的状态信息,而此状态信息在步进电机阶段2是不允许的。

在3个步进电机阶段动作中,分别采用3个不同的寄存器来存放每一个阶段读取上来的状态信息。

4在子程序由步进电机阶段1跳到步进电机阶段2,或者是步进电机阶段2跳到步进电机阶段3时,有时候程序执行出现混乱。

在步进电机阶段1执行完毕以后,进入允许步进电机阶段2动作状态,在此时本应该是等待I0.2动作把控制命令发送出去,但是程序中直接就执行读步进电机阶段2执行状态。

在步进电机阶段1完成以后没有对其中的控制寄存器清零或者是清零不成功,而步进电机阶段2中所用的控制寄存器与步进电机阶段1中的一样,当程序进入步进电机阶段2以后,满足读取状态信息的条件所以就直接执行读状态信息的指令了。

用不同的寄存器来作为3个步进电机阶段的控制寄存器,在下一个阶段动作的时候将上一阶段所用到的控制寄存器清零。

5从站返回的数据,PLC接收到以后都显示接收到的信息CRC校验错误。

在每次从站发送一个数据给PLC时,PLC接收到以后都显示是校验错误。

CRC校验码的生成是通过网上下载的CRC校验码生成工具而来的,里面的CRC生成的算法与MODBUS中的算法可能不一致。

通过将PLC发送出来的数据帧输入得到的CRC校验码与PLC输出的校验码不一样,证实了猜想是正确的。

在网上重新下载一个CRC生成工具,保证工具中的CRC算法与MODBUS中的算法一样,工具下载:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1