ModBus专业综合课程设计文档格式.docx
《ModBus专业综合课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《ModBus专业综合课程设计文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
目录
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协议的课程设计的学习,我感慨良多,从选题到定稿,从理论到实践,在整整一个月的日子里,虽然很辛苦,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己