基于RS-485总线的MODBUS 通信协议在单片机上的实现
2019-08-23马亚玲
马亚玲
(云南省玉溪技师学院 玉溪工业财贸学校,云南 玉溪 653100)
0 引 言
仓库进行智能化改造时,要求可以在值班室显示仓库当前温湿度参数,并能够在值班室对仓库现场的除湿和通风设备进行远程控制。由于产品成本控制非常严格,所以在值班室计算机上安装组态软件作为上位机,仓储现场采用单片机控制装置与除湿通风设备相连,并将温湿度传感器参数接入到单片机中,上位机和单片机采用串行通信进行信息的交换。需要搭建通信网络,并进行上位机和单片机之间通信程序的开发。本文主要介绍上位机和单片机之间通信网络及通信协议的选择,重点论述单片机和上位机之间串行通信通信程序的开发实现。
1 通信网络和通信协议的选择
随着工业现代化及信息化的迅猛发展,单片机控制已经从传统的本地控制向远程控制、网络控制发展,设备信息的采集和显示也由本地处理、分散显示向远程采集、集中显示发展。单片机控制功能的改变对其应用开发提出了新的要求。单片机开发应用人员需要掌握与单片机相关的通信网络和通信协议。
但在目前的单片机应用中,主要还是以本地数字量的采集和控制为主,很少涉及通信,即便是涉及通信部分,也只是采用RS-232串行接口,利用单片机自带的UART进行短距离的简单数据收发控制,也不涉及通信的协议规范。但是在工业控制中,基于RS-485总线的设备已经得到了广泛应用,设备的网络化、模块化应用需求日益明显。相较于RS-232,RS-485在信号传输距离、传输速率、抗干扰性及支持多点通信等方面具有很强的优势,能够满足工业现场通信的要求,因此在通信网络搭建采用RS-485总线形式相连接。
确定通信网络后,为了保证数据传输的可靠性、实时性以及协议的通用性,经过对比研究,选择MODBUS通信协议。MODBUS有两种串行传输模式,包括RTU、ASCII[1]。两种传输方式不同之处在于数据命令的编码、解码方式不同,多数支持MODBUS协议的设备都支持RTU模式,并且RTU模式在单片机上实现相对简单,因此采用MODBUS RTU进行通信程序的开发。
2 MODBUS RTU协议规则
采用MODBUS通信协议的设备连接在一起就构成了通信网络,以RS-485方式为例进行连接。一个通信网络中只有一个设备可以作为主机,其余设备均为从机,每一个从机都会分配一个地址,从机地址的范围为1~247。MODBUS通信协议中,主机发送数据和指令中包含指定的从机地址,通信网络中的每个从机都会收到数据和指令,从机判断协议命令中的地址和本机地址不一致时,就不会进行处理,只有读取到协议命令中的地址和本机地址一致时,才进行数据命令的解析处理。MODBUS RTU方式主机发送时的数据格式如表1所示。
当从机收到主机的指令时,根据主机的功能代码的命令要求,执行从寄存器读取数值或者写入数值到寄存器中,并在执行指令后向主机发送返回数据,响应主机操作。功能码是在标准MODBUS RTU协议中已经定义了常用指令代码的功能,在单片机通信应用中常用功能码及功能如表2所示。
表1 MODBUS通信数据格式
表2 常用MODBUS功能码及功能
3 基于单片机的MODBUS协议的实现
3.1 MODBUS协议处理函数流程图
MODBUS协议是主/从通信协议,以单片机作为从机,编写接收主机命令,执行命令,并发送响应指令给主机的通信程序。MODBUS协议处理函数的流程如图1所示。单片机循环扫描时间到时,判断是否接收到主机数据命令,当接收到数据命令时,首先解析地址是否为本机地址,然后判断CRC校验是否正确,对CRC校验后正确的数据命令,按照功能码指令以及数据地址和数据进行处理,并在处理后返回给主机响应数据,对于不是本机地址,或者是本机地址但是CRC校验不正确的数据,不进行处理[2]。
图1 MODBUS协议处理函数流程图
3.2 01功能码的功能实现
01功能码是主机读取单片机一个数据位数据的指令。当从机接收到01功能码指令时,首先解析要获取的数据位的地址,然后读取该地址中的数据,将数据通过响应指令发送给上位机,即可实现01功能码读取一位数据的功能。01功能码实现流程如图2所示。
3.3 05功能码的功能实现
05功能码是主机向单片机的一个数据位地址写入数据的指令。当从机接收到05功能码指令时,首先解析要写入数据位的目标地址,然后将指令中的数据写入到目标地址,最后向主机发送响应,即可实现05功能码写入一位数据的功能。
图2 01功能码实现流程图
4 51单片机利用MODBUS协议实现对设备的控制
单片机控制装置的通信网络采用RS-485总线形式相连接。将计算机作为通信的主机、单片机作为通信的从机,通过在51单片机中运行MODBUS通信协议,实现在上位机对设备的控制。
4.1 单片机MODBUS协议控制设备处理函数
在单片机的数据存储空间中定义数据的接收和发送缓冲区,单片机发送的数据首先送入发送缓冲区中,接收的数据放入到接收缓冲区中。对于单片机和主机,数据缓冲区是一个公用的区域。本文定义两个缓冲区:
unsigned char TxBuff[20];//数据发送缓冲区
unsigned char RxBuff[20];//数据接收缓冲区
定义单片机中LED的地址为0,当地址中数据为0时,设备打开,非0时,设备关闭。当单片机接收到主机打开和关闭设备的指令时,处理函数如下:
CRC=CRC16MODBUS(RxBuff,6);//CRC校验
CRCH =CRC>>8; //获取CRC校验高位
CRCL =CRC&0xff; //获取CRC校验低位
if(RxBuff[6]==CRCH&&RxBuff[7]==CRCL)//判断CRC校验是否正确
{
if(RxBuff[0]==Add)//判断地址是否是本机地址
{
if(RxBuff[0]==0x05)//判断是否是05功能码
{
Regadd=RxBuff[2]*256+RxBuff[3];//获取寄存器地址
if(Regadd==0)
{
if(RxBuff[4]==0x00) //判断打开还是关闭
LED=0; //打开设备
else
LED=1; //关闭设备
TxBuff[0]=RxBuff[0]; //设备地址
TxBuff[1]=RxBuff[1]; //功能码
TxBuff[2]=RxBuff[2]; //地址高位
TxBuff[3]=RxBuff[3]; //地址低位
TxBuff[4]=RxBuff[4]; //数据位
TxBuff[5]=RxBuff[5]; //数据位
CRC=CRC16MODBUS(TxBuff,6);//CRC 校验
TxBuff[6]=CRC>>8; //CRC校验高位
TxBuff[7]=CRC&0XFF; //CRC校验低位
TxDell();//向主机发送响数据
}
}
}
}
4.2 上位机发送指令实现对设备的控制和信息的采集
上位机发送协议指令:0105 00 00 00 00 CD CA,单片收到指令打开设备,并返回响应指令。上位机发送协议指令:0105 00 00 FF 00 8C 3A,单片收到指令关闭设备,并返回响应指令。对于现场温湿度信息的采集,主机采用03功能码数据指令进行温湿度数据的采集,单片机执行指令将数据传输到上位机的组态软件中进行显示。
5 结 论
本文通过在单片机上运行MODBUS从机通信协议程序,以计算机作为上位机,通过上位机发送指令对单片机进行远程控制和现场信息的采集。经过产品开发研究,验证了基于RS-485通信网络和MODBUS通信协议实现上位机和单片机通信的可行性,达到了预期的效果。