基于modbus总线的监测系统的开发.docx

上传人:b****0 文档编号:9336410 上传时间:2023-05-18 格式:DOCX 页数:52 大小:189.13KB
下载 相关 举报
基于modbus总线的监测系统的开发.docx_第1页
第1页 / 共52页
基于modbus总线的监测系统的开发.docx_第2页
第2页 / 共52页
基于modbus总线的监测系统的开发.docx_第3页
第3页 / 共52页
基于modbus总线的监测系统的开发.docx_第4页
第4页 / 共52页
基于modbus总线的监测系统的开发.docx_第5页
第5页 / 共52页
基于modbus总线的监测系统的开发.docx_第6页
第6页 / 共52页
基于modbus总线的监测系统的开发.docx_第7页
第7页 / 共52页
基于modbus总线的监测系统的开发.docx_第8页
第8页 / 共52页
基于modbus总线的监测系统的开发.docx_第9页
第9页 / 共52页
基于modbus总线的监测系统的开发.docx_第10页
第10页 / 共52页
基于modbus总线的监测系统的开发.docx_第11页
第11页 / 共52页
基于modbus总线的监测系统的开发.docx_第12页
第12页 / 共52页
基于modbus总线的监测系统的开发.docx_第13页
第13页 / 共52页
基于modbus总线的监测系统的开发.docx_第14页
第14页 / 共52页
基于modbus总线的监测系统的开发.docx_第15页
第15页 / 共52页
基于modbus总线的监测系统的开发.docx_第16页
第16页 / 共52页
基于modbus总线的监测系统的开发.docx_第17页
第17页 / 共52页
基于modbus总线的监测系统的开发.docx_第18页
第18页 / 共52页
基于modbus总线的监测系统的开发.docx_第19页
第19页 / 共52页
基于modbus总线的监测系统的开发.docx_第20页
第20页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于modbus总线的监测系统的开发.docx

《基于modbus总线的监测系统的开发.docx》由会员分享,可在线阅读,更多相关《基于modbus总线的监测系统的开发.docx(52页珍藏版)》请在冰点文库上搜索。

基于modbus总线的监测系统的开发.docx

基于modbus总线的监测系统的开发

1、下位机数据采样系统

1.1电路组成

电路组成框图:

电路组成文字叙述:

通过四个DS18B20温度传感器对空间四个温度点进行温度采集,通过P1^0—P1^3口将采集的数据传送给单片机AT89C51,单片机AT89C51进行相应的数据处理,分别传送至LCD1602轮询显示采集的数据并通过串口将数据PC机通过C++builder建立的串口助手显示,并且将温度曲线显示在串口助手上显示。

1.2modbus总线实现

1.2.1modbus总线实现原理

Modbus协议定义了控制器能识别和使用的信息结构。

当在Modbus网络上进行通讯时,协议能使每一台控制器知道它本身的设备地址,并识别对它寻址的数据,决定应起作用的类型,取出包含在信息中的数据和资料等,控制器也可组织回答信息,并使用Modbus协议将此信息传送出去。

在其他网络上使用时,数据包和数据帧中也包含着Modbus协议。

如,Modbus+或MAP网络控制器中有相应的应用程序库和驱动程序,实现嵌入式Modbus协议信息与此网络中用子节点设备间通讯的特殊信息帧的数据转换。

该转换也可扩展,处理节点地址,路由,和每一个特殊网络的错误检查方法。

如包含在Modbus协议中的设备地址,在信息发送前就转换成节点地址,错误检查区也用于数据包,与每个网络的协议一致,最后一点是需用Modbus协议,写入嵌入的信息,定义应处理的动作。

Modbus总线上的传输原理:

Modicon控制器上的标准Modbus端口是使用一个RS-232兼容的串行接口,定义了连接器,接线电缆,信号等级,传输波特率,和奇偶校验,控制器可直接或通过调制解调器(以后简称Modems)接入总线(网络)。

控制器通讯使用主从技术,即主机能起动数据传输,称查询。

而其它设备(从机)应返回对查询作出的响应,或处理查询所要求的动作。

主机可对各从机寻址,发出广播信息,从机返回信息作为对查询的响应。

从机对于主机的广播查询,响应返回Modbus协议设备地址,请求功能代码,发送数据,错误校验码,建立了主机查询格式,从机的响应信息也用Modbus协议组织,它包括确认动作的代码,返回数据和错误校验码。

若在接收信息时出现一个错误或从机不能执行要求的动作时,从机会组织一个错误信息。

并向主机发送作为响应。

8位

数据字节

错误校验

功能代码

8位

数据字节

设备地址

功能代码

设备地址

主机查询信息

查询响应周期:

从机响应信息

错误校验

图主从查询响应周期

查询:

查询中的功能代码为被寻址的从机设备应执行的动作类型。

数据字节中包含从机须执行功能的各附加信息,如功能代码03将查询从机,并读保持寄存器。

并用寄存器的内容作响应。

该数据区必须含有告之从机读取寄存器的起始地址及数量,错误校验区的一些信息,为从机提供一种校验方法,以保证信息内容的完整性。

响应:

从机正常响应时,响应功能码是查询功能码的应答,数据字节包含从机采集的数据,如寄存器值或状态。

如出现错误,则修改功能码,指明为错误响应。

并在数据字节中含有一个代码,来说明错误,错误检查区允许主机确认有效的信息内容。

两种串行传输模式:

控制器可使用ASCII或RTU通讯模式,在标准Modbus上通讯。

在配置每台控制器时,用户须选择通讯模式以及串行口的通讯参数(如波特率,奇偶校验等),在Modbus总线上的所有设备应具有相同的通讯模式和串行通讯参数。

选择ASCII或RTU模式用于标准的Modbus总线。

它定义了总线上串行传输信息区的“位”的含义,决定信息打包及解码方法。

如在MAP和Modbus+总线上时,Modbus信息以帧的方式出现,并与串行传输无关,如请求读保持寄存器,可以在Modbus+上的两个控制器之间处理,而与使用的控制器的Modbus端口无关。

ASCII模式

当控制器以ASCII模式在Modbus总线上进行通讯时,一个信息中的每8位字节作为2个ASCII字符传输的,这种模式的主要优点是允许字符之间的时间间隔长达IS,也不会出现错误。

ASCII码每一个字节的格式:

编码系统:

16进制,ASCII字符0-9,A-F,1个16进制。

数据位:

1起始位,7位数据,低位先送,奇/偶校验时1位;无奇偶校验时0位,(LRC)1位带校验,1停止位;无校验2停止位。

错误校验区:

纵向冗余校验。

RTU模式

控制器以RTU模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,该模式的主要优点是在相同波特率下其传输的字符的密度高于ASCII模式,每个信息必须连续传输。

RTU模式中每个字节的格式:

编码系统:

8位二进制,十六进制0-9,A-F

数据位:

1起始位,8位数据,低位先送,奇/偶校验时1位;无奇偶校验时0位,停止位1位(带校验),停止位2位(无校验)。

错误校验区:

循环冗余校验(CRC)

1.2.2modbus总线帧的结构与实现

无论是ASCII模式还是RTU模式,Modbus信息以帧的方式传输,每帧有确定的起始点和结束点,使接收设备在信息的起点开始读地址,并确定要寻址的设备(广播时对全部设备),以及信息传输的结束时间。

可检测部分信息,错误可作为一种结果设定。

对MAP或Modbus+协议可对信息帧的起始和结束点标记进行处理,也可管理发送至目的地的信息,此时,信息传输中Modbus数据帧内的目的地址已无关紧要,因为Modbus+地址已由发送者或它的网络适配器把它转换成网络节点地址和路由。

ASCII帧

在ASCII模式中,以(:

)号(ASCII3AH)表示信息开始,以回撤一换行键(CRLF)(ASCIIOD和OAH)表示信息结束。

对其它的区,允许发送的字符为16进制字符0-9,A-F。

网络中设备连续检测并接收一个冒号(:

)时,每台设备对地址区解码,找出要寻址的设备。

字符之间的最大间隔为1S,若大于1S,则接收设备认为出现了一个错误。

典型的信息帧见下表

开始

地址

功能

数据

纵向冗余检查

结束

1字符

2字符

2字符

n字符

2字符

2字符

图3ASCII信息帧

例外:

对于584和984A/B/X控制器,一个ASCII信息可在LRC区后正常终止,而不需发送CRLF字符,此时出现>IS的时间间隔,控制器也将认为是正常中断。

RTU帧

RTU模式中,信息开始至少需要有3.5个字符的静止时间,依据使用的波特率,很容易计算这个静止的时间,接着第一个区的数据为设备地址。

各个区允许发送的字符均为16进制的0-9,A-F。

网络上的设备连续监测网络上的信息,包括静止时间。

当接收第一个地址数据时,每台设备立即对它解码,以决定是否是自己的地址。

发送完最后一个字符号后,也有一个3.5个字符的静止时间,然后才能发送一个新的信息。

整个信息必须连续发送。

如果在发送帧信息期间,出现大于3.5个字符的静止时间时,则接收设备刷新不完整的信息,并假设下一个地址数据。

同样一个信息后,立即发送的一个新信息,(若无3.5个字符的静止时间)这将会产生一个错误。

是因为合并信息的CRC校验码无效而产生的错误。

开始

地址

功能

数据

校验

终止

T1-T2-T3-T4

8B位S

8B位S

N×8B位S

16B位S

T1-T2-T3T-4

图4RTU信息帧

Modbus信息帧

地址设置

信息地址包括2个字符(ASCII)或8位(RTU),有效的从机设备地址范围0-247(十进制),各从机设备的寻址范围为1-247。

主机把从机地址放入信息帧的地址区,并向从机寻址。

从机响应时,把自己的地址放入响应信息的地址区,让主机识别已作出响应的从机地址。

地址0为广播地址,所有从机均能识别。

当Modbus协议用于高级网络时,则不允许广播或其它方式替代。

如Modbus+使用令牌循环,自动更新共享的数据库。

功能码设置

信息帧功能代码包括字符(ASCII)或8位(RTU)。

有效码范围1-225(十进制),其中有些代码适用全部型号的Modicon控制器,而有些代码仅适用于某些型号的控制器。

还有一些代码留作将来使用。

当主机向从机发送信息时,功能代码向从机说明应执行的动作。

如读一组离散式线圈或输入信号的ON/OFF状态,读一组寄存器的数据,读从机的诊断状态,写线圈(或寄存器),允许下截、记录、确认从机内的程序等。

当从机响应主机时,功能代码可说明从机正常响应或出现错误(即不正常响应),正常响应时,从机简单返回原始功能代码;不正常响应时,从机返回与原始代码相等效的一个码,并把最高有效位设定为“1”。

如,主机要求从机读一组保持寄存器时,则发送信息的功能码为:

00000011(十六进制03)若从机正确接收请求的动作信息后,则返回相同的代码值作为正常响应。

发现错时,则返回一个不正常响信息:

10000011(十六进制83)。

从机对功能代码作为了修改,此外,还把一个特殊码放入响应信息的数据区中,告诉主机出现的错误类型和不正常响应的原因。

主机设备的应用程序负责处理不正常响应,典型处理过程是主机把对信息的测试和诊断送给从机,并通知操作者。

数据区的内容

数据区有2个16进制的数据位,数据范围为00-FF(16进制),根据网络串行传输的方式,数据区可由一对ASCII字符组成或由一个RTU字符组成。

主机向从机设备发送的信息数据中包含了从机执行主机功能代码中规定的请求动作,如离散量寄存器地址,处理对象的数目,以及实际的数据字节数等。

举例说明,若主机请求从机读一组寄存器(功能代码03),该数据规定了寄存器的起始地址,以及寄存器的数量。

又如,主机要在一从机中写一组寄存器,(则功能代码为10H)。

该数据区规定了要写入寄存区的起始地址,寄存器的数量,数据的字节数,以及要写入到寄存器的数据。

若无错误出现,从机向主机的响应信息中包含了请求数据,若有错误出现,则数据中有一个不正常代码,使主机能判断并作出下一步的动作。

数据区的长度可为“零”以表示某类信息,如,主机要求-从机响应它的通讯事件记录(功能代码OBH)。

此时,从机不需要其他附加的信息,功能代码只规定了该动作。

信息帧:

错误校验

标准Modbus总线,有两类错误检查方法,ASCII方式和RTU方式。

ASCII

使用ASCII方式时,错误校验码为2个ASCII字符,错误校验字符是LRC校验结果。

校验时,起始符为(:

)冒号,结束符为CRLF字符。

RTU

使用RTU方式时,错误校验码为一个16位的值,2个8位字节。

错误校验值是对信息内容执行CRC校验结果。

CRC校验信息帧是最后的一个数据,得到的校验码先送低位字节,后送高位字节,所以CRC码的高位字节是最后被传送的信息。

串行传送信息

在标准的Modbus上传送的信息中,每个字符或字节,按由左向右的次序传送:

带奇偶校验

最低有效位:

(LSB)最高有效位:

(MSB)ASCII数据帧位序:

无奇偶校验

带奇偶校验

RTU数据帧位序:

无奇偶校验

错误校验方法

标准的Modbus串行通讯网络采用两种错误校验方法,奇偶校验(奇或偶)可用于校验每一个字符,信息帧校验(LRC或CRC)适用整个信息的校验,字符校验和信息帧校验均由主机设备产生,并在传送前加到信息中去。

从机设备在接收信息过程中校验每个字符或整个信息。

主机可由用户设置的一个预定时间间隔,确定是否放弃传送信息。

该间隔应有足够的时间来满足从机的正常响应。

若主机检测到传输错误时,则传输的信息无效。

从机不再向主机返回响应信息。

此时,主机会产生一个超时信息,并允许主机程序处理该错误信号。

注意:

主机实际并未存在的从机发送信息时也会引起超时出错信号。

奇偶校验

用户可设置奇偶校验或无校验,以此决定每个字符发送时的奇偶校验位的状态。

无论是奇或偶校验,它均会计算每个字符数据中值为“1”的位数,ASCII方式为位数据;RTU方式为8位数据。

并根据“1”的位数值(奇数或偶数)来设定为“0”或“1”,如一个RTU数据帧中8位数据位为:

11000101,在该帧中,值为“1”的总位数为4,即偶数。

如采用奇校验方式时,则“1”的总位数为奇数,即5。

发送信息时,计算奇偶位,并加到数据帧中,接收设备统计位值为“1”的数量,若与该设备要求的不一致时产生一个错误。

在Modbus总线上的所有设备必须采用相同的奇偶校验方式。

注意:

奇偶校验只能检测到数据帧在传输过程中丢失奇数“位”时才产生的错误。

如采用奇数校验方式时,一个包含3个“1”位的数据丢失2个“1”位时,其结果仍然是奇数。

若无奇偶校验方式时,传输中不作实际的校验,应附加一个停止位。

LRC校验

ASCII方式时,数据中包含错误校验码,采用LRC校验方法时,LRC校验信息以冒号“:

”开始,以CRLF字符作为结束。

它忽略了单个字符数据的奇偶校验的方法。

LRC校验码为1个字节,8位二进制值,由发送设备计算LRC值。

接收设备在接收信息时计算LRC校验码。

并与收到的LRC的实际值进行比较,若二者不一致,亦产生一个错误。

错误校验方法CRC校验

RTU方式时,采用CRC方法计算错误校验码,CRC校验传送的全部数据。

它忽略信息中单个字符数据的奇偶校验方法。

CRC码为2个字节,16位的二进制值。

由发送设备计算CRC值,并把它附到信息中去。

接收设备在接收信息过程中再次计算CRC值并与CRC的实际值进行比较,若二者不一致,亦产生一个错误,校验开始时,把16位寄存器的各位都置为“1”,然后把信息中的相邻2个8位字节数据放到当前寄存器中处理,只有每个字符的8位数据用于CRC处理。

起始位,停止位和校验位不参与CRC计算。

CRC校验时,每个8位数据与该寄存器的内容进行异或运算,然后向最低有效位(LSB)方向移位,用零填入最高有效位(MSB)后,再对LSB检查,若LSB=1,则寄存器与预置的固定值异或,若LSB=0,不作异或运算。

重复上述处理过程,直至移位8次,最后一次(第8次)移位后,下一个8位字节数据与寄存器的当前值异或,再重复上述过程。

全部处理完信息中的数据字节后,最终得到的寄存器值为CRC值。

CRC值附加到信息时,低位在先,高位在后。

1.3功能实现

1.3.1程序框图

 

1.3.2程序

#include

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

charTimeInterval;

charMyAddress;

uchartemp_value;//温度值

ucharTempBuffer[7];

voidshow_time();//液晶显示程序

uchartemp_value1;//温度值

ucharTempBuffer1[7];

voidshow_time1();//液晶显示程序

uchartemp_value2;//温度值

ucharTempBuffer2[7];

voidshow_time2();//液晶显示程序

uchartemp_value3;//温度值

ucharTempBuffer3[7];

unsignedcharsjz[8];

charguan=0;

charguan1=0;

charguan2=0;

charguan3=0;

sbitled2=P2^0;

sbitled3=P2^1;

sbitled4=P2^2;

sbitled5=P2^3;

chardataDI[6]={1,2,3,4,5,6};

chardataDO[6]={6,7,8,9,10,11};

chardataAO[6]={16,17,18,19,20,21};

chardataAI[6]={11,12,13,14,15,16};

voidshow_time3();

/***********1602液晶显示部分子程序*************************/

Chardone,count,temp,flag,up_flag,down_flag;Port,Definitions

/**********************************************************/

sbitLcdRs=P2^5;

sbitLcdRw=P2^6;

sbitLcdEn=P2^7;

sfrDBPort=0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

sbitDQ=P1^0;//温度传送数据IO口

sbitDQ1=P1^1;

sbitDQ2=P1^2;

sbitDQ3=P1^3;

/*****************内部等待函数*****************************/

unsignedcharLCD_Wait(void)

{

LcdRs=0;

LcdRw=1;_nop_();

LcdEn=1;_nop_();

LcdEn=0;

returnDBPort;

}

/******************向LCD写入命令或数据*******************/

#defineLCD_COMMAND0//Command

#defineLCD_DATA1//Data

#defineLCD_CLEAR_SCREEN0x01//清屏

#defineLCD_HOMING0x02//光标返回原点

voidLCD_Write(bitstyle,unsignedcharinput)

{

LcdEn=0;

LcdRs=style;

LcdRw=0;_nop_();

DBPort=input;_nop_();//注意顺序

LcdEn=1;_nop_();//注意顺序

LcdEn=0;_nop_();

LCD_Wait();

}

/****************设置显示模式***********************/

#defineLCD_SHOW0x04//显示开

#defineLCD_HIDE0x00//显示关

#defineLCD_CURSOR0x02//显示光标

#defineLCD_NO_CURSOR0x00//无光标

#defineLCD_FLASH0x01//光标闪动

#defineLCD_NO_FLASH0x00//光标不闪动

voidLCD_SetDisplay(unsignedcharDisplayMode)

{

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

}

/****************设置输入模式***********************/

#defineLCD_AC_UP0x02

#defineLCD_AC_DOWN0x00//default

#defineLCD_MOVE0x01//画面可平移

#defineLCD_NO_MOVE0x00//default

voidLCD_SetInput(unsignedcharInputMode)

{

LCD_Write(LCD_COMMAND,0x04|InputMode);

}

/***************初始化LCD**************************/

voidLCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动

}

/***************液晶字符输入的位置*******************/

voidGotoXY(unsignedcharx,unsignedchary)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

/**************将字符输出到液晶显示*****************/

voidPrint(unsignedchar*str)

{

while(*str!

='\0')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

/***********ds18b20子程序***************************/

/***********ds18b20延迟子函数(晶振12MHz)********/

voiddelay_18B20(unsignedinti)

{

while(i--);

}

/**********ds18b20初始化函数**********************/

voidInit_DS18B20(void)

{

unsignedcharx=0;

DQ=1;//DQ复位

delay_18B20(8);//稍做延时

DQ=0;//单片机将DQ拉低

delay_18B20(80);//精确延时大于480us

DQ=1;//拉高总线

delay_18B20(14);

x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败

delay_18B20(20);

}

/******************ds18b20读一个字节********************/

unsignedcharReadOneChar(void)

{

uchari=0;

uchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//给脉冲信号

dat>>=1;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(4);

}

return(dat);

}

/****************ds18b20写一个字节*********************/

voidWriteOneChar(uchardat)

{

unsignedchari=0;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

delay_18B20(5);

DQ=1;

dat>>=1;

}

}

/****************读取ds18b20当前温度*******************/

vo

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

当前位置:首页 > PPT模板 > 中国风

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2