PLC的Modbus通信.docx
- 文档编号:8560985
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:18
- 大小:204.70KB
PLC的Modbus通信.docx
《PLC的Modbus通信.docx》由会员分享,可在线阅读,更多相关《PLC的Modbus通信.docx(18页珍藏版)》请在冰豆网上搜索。
PLC的Modbus通信
PLC与串口的MODBUS通信
1需求
1
程序开始,赋值VB10=1,等待执行步进电机阶段1。
2
VB10=1,等待执行步进电机阶段1;VB10=2,等待执行步进电机阶段2;VB10=3,等待执行步进电机阶段3。
2
当(VB10=1且I0.1)或者(VB10=2且I0.2)或者(VB10=3且I0.3),主站首先向从站发送控制命令帧,从站收到以后,返回给主站一应答帧表明数据已经收到。
主站在接收到该应答帧后开始计时,10s后读从站执行状态信息,判断从站该阶段的动作是否完成,如果完成了进入下一阶段的等待,如果未完成,5s后再次读取从站执行状态信息判断阶段动作是否完成。
3
步进电机阶段动作能循环执行。
4
紧急情况下(I0.5=1),可以通过主站向从站写入命令使从站程序初始化。
5
当主站读取到的状态信息出错时,可以通过I/O输出指示出来(Q0.1指示步进电机阶段1读取状态信息出错;Q0.2指示步进电机阶段2读取状态信息出错;Q0.3指示步进电机阶段3读取状态信息出错),在错误解除以后,可以通过I/O输入(I0.0)将错误指示消除,并使程序复位。
2方案
MODBUS协议是一种主从协议,只允许一个主设备,设计中以PLC作为主站MSP430开发板作为从站。
如图1示。
图1PLC与MSP430连接图
为方便起见,首先以PC机作为MODBUS从站,在PC机上利用串口调试助手来接收和发送数据,PLC通过PPI电缆连接到串口,采用PROT0通讯口作为MODBUS通讯口。
3具体实现:
3.1MODBUS数据帧介绍
MODBUS广泛应用于工业通讯领域,它规定了通信双方的通信格式,只要双方都使用该规定就可以解析出正确的通信容。
在此,首先介绍一下MODBUS通信的数据帧格式,以3号功能码以及16号功能码为例,3号功能码是读保持寄存器的值,16号功能码是写保持寄存器的值。
1、读取保持寄存器
当MODBUS主站需要读取指定地址处数据时,首先向从站发送一个读命令帧,所发送命令帧格式如表1。
表1读命令主站发送命令帧格式
设备地址
功能码
地址H
地址L
数据量H
数据量L
CRCH
CRCL
Add0
3H
HoldStart
DataNum
CRC高位
CRC低位
数据帧说明如下表:
表2读命令主站发送命令帧说明
设备地址
要读数据的从站地址
功能码
03H代表读取多个保持寄存器
地址H
所读取数据的地址以两个字节表示
地址L
数据量H
所读取数据的个数以两个字节表示(注:
此处说的数据量以字为单位)
数据量L
CRCH
CRC校验码在数据帧中以两个字节表示,主要用于检验数据传输过程中是否出错
CRCL
例:
需要读取2号站从第4个寄存器开始的3个寄存器,MODBUS主站发送的数据帧为:
0203000400034439
从站在接收到主站的读命令以后,会发送一个返回命令帧,返回的命令帧格式如表3。
表3读命令从站返回命令帧格式
设备地址
功能码
数据量
数据1
数据N
CRCH
CRCL
Add0
3H
返回数据的字节数N
Data(1-N)
CRC高位
CRC低位
数据帧说明如下表:
表4读命令从站返回命令帧说明
设备地址
返回数据的从站地址
功能码
03H代表该数据帧是应答读取多个保持寄存器
数据量
返回数据的字节个数(注:
以字节为单位)
数据
所返回的数据(数据个数与数据量相同)
CRCH
CRC校验码在数据帧中以两个字节表示,主要用于检验应答帧在传输过程中是否出错
CRCL
例:
对于主站的读命令帧,2号站如果第4个寄存器开始的3个寄存器里面的值分别为:
31,32H,33H,34H,35H,36H
则应答帧应该是:
020306313233343536D1AC
对于发送的命令帧与应答帧之间有如下关系:
1:
两个数据帧的设备地址相同。
2:
两个数据帧的功能码相同。
3:
返回的数据量N=2ⅹDataNum
如果从站在接收到数据以后,认为接收到的主站发送过来的数据是错误的,会返回一个异常帧给主站,告诉主站,从站接收到的数据是错误的。
异常帧的数据格式如表5,数据帧不再具体说明。
表5异常帧格式
设备地址
功能码
错误信息
CRCH
CRCL
Add0
83H
一个字节的错误信息
CRC高位
CRC低位
例:
2号站在接收到主站发送的命令以后,判断得出该命令是错误的,发送回一个异常帧:
02830170F0
错误信息可以根据不同的错误类型而不同。
2、写保持寄存器
当MODBUS主站需要向从站指定地址写入数据时,会发送一个数据帧,数据帧格式如表6。
表6写命令主站发送数据帧格式
设备地址
功能码
地址H
地址L
数量H
数量L
字节数
具体数据
CRCH
CRCL
Add0
10H
HoldStart
DataNum
byteN
1-byteN
CRC高位
CRC低位
数据帧说明如下表:
表7写命令主站发送数据帧说明
设备地址
要写入数据的从站地址
功能码
10H代表写多个保持寄存器
地址H
要写入数据的首地址,用两个字节表示
地址L
数量H
要写入数据的个数(注:
以字为单位)
数量L
字节数
要写入数据的个数(注:
以字节为单位)
具体数据
CRCH
CRC校验码在数据帧中以两个字节表示,主要用于检验数据传输过程中是否出错
CRCL
例:
需要向2号从站第80个寄存器开始的4个寄存器里面依次写入:
11H,22H,33H,44H,55H,66H,77H,88H
则MODBUS主站发送的数据帧为:
021000500004081122334455667788D4F0
当从站接收到主站的写命令帧以后,判断接收到的信息是正确的,会返回一个命令帧告诉主站所发生的数据从站已经正确接收到了,返回数据帧格式如表8。
表8写命令从站返回数据帧格式
设备地址
功能码
地址H
地址L
数据量H
数据量L
CRCH
CRCL
Add0
10H
HoldStart
DataNum
CRC高位
CRC低位
返回帧说明如下表:
表9写命令从站返回数据帧说明
设备地址
被写入数据的从站地址
功能码
10H代表响应的是写多个保持寄存器
地址H
被写入数据的首地址,用两个字节表示
地址L
数量H
被写入数据的个数(注:
以字为单位)
数量L
CRCH
CRC校验码在数据帧中以两个字节表示,主要用于检验数据返回过程中是否出错
CRCL
例:
2号从站在接收到主站的写命令以后,判断接收到的信息是正确的,返回一个应答帧:
021000500004C1E8
对于PLC写保持寄存器,发送的命令帧与应答帧之间应该有如下关系:
1:
设备地址相同
2:
功能码相同
3:
两个数据帧的地址HoldStart相同
4:
两个数据帧的数据量DataNum相同
如果从站在接收到数据以后,认为接收到的主站发送过来的数据是错误的,会返回一个异常帧给主站,告诉主站,从站接收到的数据是错误的。
异常帧的数据格式如表10,命令帧不再具体说明。
表10异常帧格式
设备地址
功能码
错误信息
CRCH
CRCL
Addr0
90H
一个字节的错误信息
CRC高位
CRC低位
例:
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:
要写入数据的首地址或者是读取上来数据存放的首地址。
Done:
指令完成时该位置1。
Error:
当指令执行出现错误时,在该寄存器处显示出错误号。
例:
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报错
状态信息错误在Q0.1报错
状态信息错误在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会发送一个读取状态信息的数据帧到从站,数据帧为:
0203000400034439
表示需要读取从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中的算法一样,工具下载:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PLC Modbus 通信