基于modbus总线的监测系统的开发Word文档下载推荐.docx
- 文档编号:18066461
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:38
- 大小:322.53KB
基于modbus总线的监测系统的开发Word文档下载推荐.docx
《基于modbus总线的监测系统的开发Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于modbus总线的监测系统的开发Word文档下载推荐.docx(38页珍藏版)》请在冰豆网上搜索。
并在数据字节中含有一个代码,来说明错误,错误检查区允许主机确认有效的信息内容。
两种串行传输模式:
控制器可使用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位,(LRQ1位带校验,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+t、议可对信息帧的起始和结束点标记进行处理,也可管理发送至目的地的信息,此时,信息传输中Modbus数据帧内的目的地址已无关紧
要,因为Modbus地址已由发送者或它的网络适配器把它转换成网络节点地址和路由。
ASCII帧
在ASCII模式中,以(:
)号(ASCII3AH)表示信息开始,以回撤一换行键(CRLF)(ASCIIOD和OAH表示信息结束。
对其它的区,允许发送的字符为16进制字符0-9,A-F。
网络中设备连续检测并接收一个冒号(:
)时,每台设备对地址区解码,找出要寻址的设备。
字符之间的最大间隔为1S,若大于1S,则接收设备认为出现了一个错误。
典型的信息帧见下表
开始
地址
功能
数据
纵向冗余检查
结束
1字符
2字符
n字符
图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
NX8B位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)若从机正确接收请求的动作信息后,则返回相同的代码值作为正常响应。
发现错时,则返回一个不正常响信息:
1000
0011(十六进制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上传送的信息中,每个字符或字节,按由左向右的次序传送:
最低有效位:
(LSE)最高有效位:
(MSB
ASCII数据帧位序:
带奇偶校验
■Sgrl
1
斗
iT-tir
Stop
无奇偶校验
*
Slitop
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位的二进制值。
由发送设备计算CRCS,并把它附到信息中去。
接收设备在接收信息过程中再次计算CRCfi并与CRC的实际值进行比较,若二者不一致,亦产生一个错误,校验开始时,把16位寄存器的各位都置为“1”,然后把信息中的相邻2个8位字节数据放到当前寄存器中处理,只有每个字符的8位数据用于CRC处理。
起始位,停止位和校验位不参与CRC计算。
CRC校验时,每个8位数据与该寄存器的内容进行异或运算,然后向最低有效位(LSB)方向移位,用零填入最高有效位(MSB)后,再对LSB检查,若LSB=1,
则寄存器与预置的固定值异或,若LSB=0不作异或运算
重复上述处理过程,直至移位8次,最后一次(第8次)移位后,下一个8位字节数据与寄存器的当前值异或,再重复上述过程。
全部处理完信息中的数据字节后,最终得到的寄存器值为CRCS。
CRCfi附加到信息时,低位在先,高位在后。
1.3功能实现
1.3.1程序框图
下位机数据
采集程序
Main程序
串口初始化子程序
显
示
屏
1602液晶初始化子程序
D
单
S1
片
8B
机
20
采
初
集
始
温
化
度
子
传
程
感
序
数据子程序
L
IkJ
f\
E
对
控
制
的
报
数
警
据
作
处
理子程序
iL』
1显
16
02
轮
询
发
送
至
串
口
中断子程序
匚J
LJ
1.3.2程序
#include<
REG51.H>
intrins.h>
#include<
math.h>
#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=P2A0;
sbitled3=P2A1;
sbitled4=P2A2;
sbitled5=P2A3;
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();
Chardone,count,temp,flag,up_flag,down_flag;
Port,Definitions
sbitDQ1=P1A1;
sbitDQ2=PM2;
sbitDQ3=P1A3;
/*****************unsignedcharLCD_Wait(void){
LcdRs=0;
LcdRw=1;
_nop_();
LcdEn=1;
LcdEn=0;
returnDBPort;
}
/******************
向LCD写入命令或数据*******************/
#defineLCD_COMMAND0//Command
#defineLCD_DATA1//Data
#defineLCD_CLEAR_SCREE0Nx01//清屏
#defineLCD_HOMING0x02//光标返回原点voidLCD_Write(bitstyle,unsignedcharinput){
LcdRs=style;
LcdRw=0;
DBPort=input;
//注意顺序LcdEn=1;
//注意顺序
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//defaultvoidLCD_SetInput(unsignedcharInputMode)
LCD_Write(LCD_COMMAND,0x04|InputMode);
voidLCD_Initial(){
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);
voiddelay_18B20(unsignedinti)
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;
//给脉冲信号if(DQ)dat|=0x80;
delay_18B20(4);
return(dat);
voidWriteOneChar(uchardat){
unsignedchari=0;
for(i=8;
i>
i--){
DQ=dat&
0x01;
delay_18B20(5);
dat>
读取ds18b20当前温度
voidReadTemp(void)
unsignedchara=0;
unsignedcharb=0;
chart;
longtt;
//跳过读序号列号的操作启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
//delay_18B20(100);
//thismessageisveryimportantIni
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 modbus 总线 监测 系统 开发
![提示](https://static.bdocx.com/images/bang_tan.gif)