ModBus专业综合课程设计文档格式.docx

上传人:b****3 文档编号:8137732 上传时间:2023-05-10 格式:DOCX 页数:14 大小:258.94KB
下载 相关 举报
ModBus专业综合课程设计文档格式.docx_第1页
第1页 / 共14页
ModBus专业综合课程设计文档格式.docx_第2页
第2页 / 共14页
ModBus专业综合课程设计文档格式.docx_第3页
第3页 / 共14页
ModBus专业综合课程设计文档格式.docx_第4页
第4页 / 共14页
ModBus专业综合课程设计文档格式.docx_第5页
第5页 / 共14页
ModBus专业综合课程设计文档格式.docx_第6页
第6页 / 共14页
ModBus专业综合课程设计文档格式.docx_第7页
第7页 / 共14页
ModBus专业综合课程设计文档格式.docx_第8页
第8页 / 共14页
ModBus专业综合课程设计文档格式.docx_第9页
第9页 / 共14页
ModBus专业综合课程设计文档格式.docx_第10页
第10页 / 共14页
ModBus专业综合课程设计文档格式.docx_第11页
第11页 / 共14页
ModBus专业综合课程设计文档格式.docx_第12页
第12页 / 共14页
ModBus专业综合课程设计文档格式.docx_第13页
第13页 / 共14页
ModBus专业综合课程设计文档格式.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ModBus专业综合课程设计文档格式.docx

《ModBus专业综合课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《ModBus专业综合课程设计文档格式.docx(14页珍藏版)》请在冰点文库上搜索。

ModBus专业综合课程设计文档格式.docx

目录

ModBus数据采集及控制系统设计I

摘要I

AbstractII

目录III

前言-1-

1ModBus协议简介-2-

1.1ModBus协议介绍-2-

1.1.1在Modbus网络上转输-2-

1.1.2在其它类型网络上转输-3-

1.1.3查询相应周期-3-

2传输方式及数据帧格式-5-

2.1RTU通讯模式-5-

2.2RTU数据帧-5-

2.3配置选项-6-

3主机与从机通讯-8-

3.1ModBus功能代码格式-8-

3.2写线圈-10-

3.2.1内容及目的-10-

3.2.2流程图-10-

3.2.3相关程序代码-10-

3.3读单个寄存器-12-

3.3.1内容及目的-12-

3.3.2流程图-12-

3.3.3相关程序代码-12-

4总结-15-

前言

Modbus协议是应用于电子控制器上的一种通用语言。

通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。

它已经成为一通用工业标准。

有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。

此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。

它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。

它制定了消息域格局和内容的公共格式。

当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。

如果需要回应,控制器将生成反馈信息并用Modbus协议发出。

在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。

这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。

控制器能直接或经由Modem组网。

控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。

其它设备(从设备)根据主设备查询提供的数据作出相应反应。

典型的主设备:

主机和可编程仪表。

典型的从设备:

可编程控制器。

主设备可单独和从设备通信,也能以广播方式和所有从设备通信。

如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。

Modbus协议建立了主设备查询的格式:

设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。

从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。

如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误

消息并把它作为回应发送出去

1ModBus协议简介

1.1ModBus协议介绍

Modbus可编程控制器之间可相互通讯,也可与不同网络上的其他设备进行通讯,支撑网络有Modicon的Modbus和Modbus+工业网络。

网络信息存取可由控制器内置的端口,网络适配器以及Modicon提供的模块选件和网关等设备实现,对OEM(机械设备制造商)来说,Modicon可为合作伙伴提供现有的程序,可使Modbus+网络紧密地集成到他们的产品设计中去。

Modicon的各种控制器使用的公共语言被称为Modbus协议,该协议定义了控制器能识别和使用的信息结构。

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

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

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

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

1.1.1在Modbus网络上转输

典型的从设备,可编程控制器。

设备(或广播)地址、功能代码、所有要发送的数据,一错误检测域。

从设备回应消息也由Modbus协议构成,包括确认要行动的域,任何要返回的数据,和一错误检测域。

如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

1.1.2在其它类型网络上转输

在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。

这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。

提供的多个内部通道可允许同时发生的传输进程。

在消息位,Modbus协议仍提供了主—从原则,尽管网络通信方法是“对等”。

如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。

同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。

1.1.3查询相应周期

如图1.1:

图1.1主——从查询——回应周期表

2传输方式及数据帧格式

2.1RTU通讯模式

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

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

编码系统:

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

数据位:

1起始位

8位数据,低位先送

奇/偶校验时1位;

无奇偶校验时0位

停止位1位(带校验);

停止位2位(无校验)

带校验时1位停止位;

无校验时2位停止位

错误校验区:

循环冗余校验(CRC)

2.2RTU数据帧

RTU模式中,信息开始至少需要有3.5个字符的静止时间,依据使用的波特率,很容易计算这个静止的时间(如下图中的T1-T2-T3-T4)。

接着,第一个区的数据为设备地址。

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

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

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

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

整个信息必须连续发送。

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

同样一个信息后,立即发送的一个新信息,(若无3。

5个字符的静止时间)这将会产生一个错误。

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

图2.1

2.3配置选项

MODBUS公共功能代码集中定义了20个功能请求,对于一般的MODBUS从机设备,没有必要支持所有代码。

在一个MODBUS从机设备中应根据实际需要,使能所需支持的功能代码,ZLG/MODBUSRTU从协议栈所支持的功能代码如表2.3.1所示。

从机使用某些功能代码应在“MBSlave.h”文件中配置使能相应功能代码。

配置MODBUSRTU从机离散量输入、线圈、输入寄存器和保持寄存器的有效地址,如表2.3.2

表2.3.2配置寄存器地址

表2.3.1功能代码使能配置

3主机与从机通讯

3.1ModBus功能代码格式

若无特殊说明在此节文中用+进制值表示,图中的数据区用十六进制表示。

Modbus信息中的数据地址

Modbus信息中的所有数据地址以零作为基准,各项数据第一个数据地址的编号为0如:

❒在可编程控制器中“coil1”在Modbus信息中其地址表示为0000

❒Coil127(十进制)在Modbus信息中则为007EH(126十进制)

❒保持寄存器40001,在信息中数据地址为寄存器0000功能代码区为保持寄存器类型规定的操作,因此,“4XXXX”是缺省的地址类型。

❒保持寄存器40108寻址寄存器地址为006Bhex(+进制107)

Modbus信息中区内容

图3.1.1为一个例子,说明了Modbus的查询信息,图3.1.2为正常响应的例子,这两例子中的数据均是16进制的,也表示了以ASCLL或RTU方式构成数据帧的方法。

主机查询是读保持寄存器,被请求的从机地址是06,读取的数据来自地址从40108至40110个保持寄有器。

注意,该信息规定了寄存器的起始地址0107(006BH)。

从机响应返回该功能代码,说明是正常响应,字节数“Bylecount”中说明有多少个8位字节被返回。

因无论是ASCII方式还是RTU方式,它表明了附在数据区中8位字节的数量。

ASCII方式时,字节数为数据中ASCII字符实际数的一半,每4个位的16进制值需要一个ASCII字符表示,因此在数据中应由2个ASCII字符来表示一个8位的字节。

图3.1.1

图3.1.2

3.2写线圈

3.2.1内容及目的

分别通过写单个线圈和多个线圈来使主机控制从机的一个LED灯间隔1S循环亮熄和控制从机的8个LED灯依次流水点亮

3.2.2流程图

ModBus传输协议

3.2.3相关程序代码

写单线圈从机响应部分主要代码:

uint8MB_SetCoil(uint16Address,uint8CoilValue)

{

if(CoilValue)

*((unsignedchar*)0x20005000)=0xff;

else

*((unsignedchar*)0x20005000)=0x00;

}

写多线圈主机部分:

voidModBus_M_Task1(void*pdata)

staticchari;

pdata=pdata;

while

(1)

{

for(i=0;

i<

8;

i++)//

{

OSWriteMultipleCoils(0x01,0x0000,0x0008,&

a[i]);

//

*((unsignedchar*)0x20005000)=a[i];

OSTimeDlyHMSM(0,0,1,0);

}

}

写多线圈从机响应部分:

uint8WriteMultipleCoils(uint8*DataPtr,uint16StAddr,uint16Quantity)

uint8CoilInByte;

CoilInByte=*(DataPtr);

MB_SetCoil(StAddr,CoilInByte);

*((unsignedchar*)0x20005000)=CoilValue;

3.3读单个寄存器

3.3.1内容及目的

从机先进行ADC数据采集,然后主机通过ModBus协议通信向从机进行查询,最后通过串口线连接主机和PC机并通过串口调试助手在PC机上显示。

3.3.2流程图

ModBus协议

线

3.3.3相关程序代码

主机相关部分主程序代码:

#include"

includes.h"

OS_EVENT*Com1_MBOX;

#defineModBus_M_State_PRIO2

#defineModBus_M_Task1_PRIO3

#defineTask_SEG_PRIO4

uint16*ReaValuePtr;

#defineApp_TaskStk512

OS_STKTestTaskStk[App_TaskStk];

OS_STKModBus_M_State_Stack[App_TaskStk];

OS_STKModBus_M_Task1_Stack[App_TaskStk];

OS_STKTask_SEG_Stack[App_TaskStk];

voidMainTask(void*pdata);

voidModBus_M_State(void*pdata);

voidModBus_M_Task1(void*pdata);

voidTask_SEG(void*pdata);

uint8a[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

*((unsignedchar*)0x20005000)=0x01;

OSReadInputReg(0x01,0,0x02,ReaValuePtr);

OSTimeDlyHMSM(0,0,2,0)

从机部分程序代码:

#defineTask_Adc_PRIO8

#defineADC_FREQ2500000

OS_STKTask_Adc_Stack[App_TaskStk];

voidTask_Adc(void*pdata);

intAdc_Get_Data(intch,intfreq);

voidTask_Adc(void*pdata)

{*((unsignedchar*)0x20005000)=0xf0;

a0=Adc_Get_Data(0,ADC_FREQ);

intAdc_Get_Data(intch,intfreq)

#defineLOOP10000

inti;

volatileintpreScaler;

staticintprevCh=-1;

preScaler=PCLK/freq-1;

rADCCON=(1<

<

14)|(preScaler<

6)|(ch<

3);

if(prevCh!

=ch)

rADCCON=(1<

LOOP;

i++);

prevCh=ch;

rADCCON|=0x1;

while(rADCCON&

0x1);

while(!

(rADCCON&

0x8000));

return((int)rADCDAT0&

0x3ff);

uint16MB_GetInputRegValue(uint16Address)

*((unsignedchar*)0x20005000)=0x0f;

return(a0);

4总结

我认为课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,通信已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握通信的协议是十分重要的。

  经历此次基于ModBus协议的课程设计的学习,我感慨良多,从选题到定稿,从理论到实践,在整整一个月的日子里,虽然很辛苦,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己

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

当前位置:首页 > 农林牧渔 > 林学

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

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