PLC的Modbus通信Word格式文档下载.docx
《PLC的Modbus通信Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《PLC的Modbus通信Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
数据量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中的算法一样,工具下载: