找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9022|回复: 3
收起左侧

51单片机与eview触摸屏Modbus通讯方法

  [复制链接]
ID:107593 发表于 2016-3-11 15:26 | 显示全部楼层 |阅读模式
本文介绍了一种基于Modbus 通信协议的eView 触摸屏与常用的51 单片机的通信方法。该方法通过C51 编程实现Modbus 通信,在51 系列单片机上具有通用性,有一定的借鉴作用。工业控制中经常需要观察系统的运行状态或者修改运行参数。触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。触摸屏与单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。Modbus 协议是美国Modicon 公司推出的,一种有效支持控制器之间以及控制器经由网络(如以太网)与其他设备之间进行通信的协议。本文以STC89C51 单片机和人机电子有限公司的eView 触摸屏为例,介绍其通信程序的开发过程。
1 系统结构
实现触摸屏与单片机的通信,主要是解决通信协议的问题。本文使用开放的Modbus 通信协议,以触摸屏作主站,单片机作从站。eView 触摸屏本身支持Modbus通信协议,如果单片机也支持Modbus 协议,就可以进行通信了。eview 触摸屏支持RS-232 和RS-485 两种通信接口。在工业控制领域,由于RS-485 具有可靠性高、传输距离远、抗干扰能力强等优点,所以在本系统中触摸屏与单片机通信采用RS-485 连接,传输速率设置为9600kbps。RS-485 信号传输是一种半双工的传输方式,单片机通过一个RS-232/RS-485 无源转换器把232 信号转换成485信号,连接到eView 触摸屏上。图l 为该系统的原理图。




单片机控制系统采用STC89C51 系列单片机,其内部集成MAX810/STC810专用复位电路(原有外部复位可继续保留,与Intel8051 引脚兼容),具有抗干扰能力强、加密性强、高抗静电(ESD)、超低功耗等特点,而且价格低廉。在本系统中,触摸屏是上位机,单片机是下位机。
2Modbus 协议
2.1Modbus 协议简介
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(如以太网)与其他设备之间可以通信。它已经成为一种通用工业标准。不同厂商生产的控制设备可以通过它连成工业网络,集中监控。Modbus 协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其他设备的过程.如何回应来自其他设备的请求,以及怎样侦测错误并记录;制定了消息域格局和内容的公共格式。
当在某一Modbus 网络上通信时,此协议决定了每个控制器需要知道它们的设备地址,识别按地址发来的消息,以及决定要产生何种行动。如果需要回应,则控制器将生成反馈信息并用Modbus 协议发出。在其他网络上,包含了M0dhus协议的消息转换为在此网络上使用的帧或包结构。
2.2ModbusRTU 通信数据传输模式
当控制器设备基于Modbus 协议以RTU 模式通信时,消息中的每个字节包含2 个4 位的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。
编码采用8 位二进制,十六进制数0~9 和A~F;消息中每个8 位域都是由
2 个十六进制字符组成。组织结构如下:



2.3ModbusRTU 消息帧结构
ModbusRTU 消息帧结构如下:







(1)地址码
地址码为通信传送的第一个字节。这个宁节表明,由用户设定地址码的从机将接收由主机发送来的信息。每个从机都有具有唯一的地址码,只有符合地址码的从机才能响应回送,且响应回送均以各自的地址码开始。主机发送的地址码则表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。地址0用作广播地址,以使所有的从设备都能认识。
(2)功能代码
功能代码为通信传送的第二个字节。Modbus 通信规约定义可能的代码范围是十进制的1~255。当然,有些代码适用于所有控制器,有些仅适用于某种控制器,还有些保留以备后用。主机发送请求,通过功能码告诉从机执行什么动作;从机响应请求,从机发送的功能码与从主机发送来的功能码一样,表明从机已响应主机进行操作。如果从机发送的功能码的最高位为1,则表明从机没有响应操作或发送出错,主设备应用程序得到异议的回应后,典型的处理是重发消息。表l 列出了常用Modbus 支持的部分功能码。







以读取线圈状态为例说明。主站发送命令:[设备地址][命令号01][起始寄存器地址高8 位][低8 位][读取的寄存器数高8 位][低8 位][CRC 校验的低8位][高8 位]。从站响应:[设备地址][命令号01][返回的字节个数][数据1][数据2]…[数据n][CRC 校验的低8 位][高8 位]。
(3)数据区
数据区根据功能码的不同而不同。数据区包含需要从机执行什么动作,或由从机采集的返送信息。这些信息可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址等。例如,功能码告诉从机读取寄存器的值,则数据区必须包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。
(4)错误校验码
主机或从机可用校验码判别接收信息是否出错。错误检测域包含一个16 位的值(用2 个8 位的字符来实现)。错误检测域的内容是通过对消息内容进行“循环冗余检测”得出的。CRC 域附加在消息的最后,添加时先是低字节然后是高字节,故CRC 的高位字节是发送消息的最后一个宁节。错误校验采用CRC-16 校验方法。
3 软件编程
下面是采用C5l 编写的软件,主要包括CRC 校验和终端接收及波特率设置等。由于篇幅有限,其他程序略。
//功能:串口初始化,波特率为9600bps,方式1;

void lnit_Com(void)
{
     TMOD=0X20;
     PCON=0X00;
     SCON=-X50;
     TH1=0Xfd;
  TL=0Xfd;
  TR1=1;
  EA=1;
  ES=1;
}
//CRC 校验函数
uint CRC 16(uchar*pushmsg,unsigned short usdatalen)
{
uchar uchCRCHi=0xff;  //高CRC字节初始化
uchar uchCRCLO=0xff;  //低CRC字节初始化
uint ulndex;
while (usDataLen--)  //传输消息缓冲区
{
   ulndex=uchCRCHi-*pushMsg0++;// 计算CRC
   uchCRCHi=uchCRCLO^auchCRCHi[ulndex];
   uchCRCLO=uchCRCLO[ulndex];
}
return (uchCRCHi<<8|uchCRCLo);
}
//发送函数和判断函数
void send(uchar rrbuf[],int sendCount)
{
uchar i,crcHi,crclo,j,k=0;
uchar sendbuf[32];
usDataLen=sendCount-2;
sendbuf[0]=ReceBuf[0];
sendbuf[1]=ReceBuf[1];
sendbuf[2]=sendCount-2;
for(j=3;j<sendCount-2;j++)
{
sendbuf[j]=rrbuf[k];k++;
}
  k=o;
  crcData=CRC(sendbuf,usDataLen);
  crcHi=crcData/256;
  crcHi=crcData%256;
  senddbuf[sendCount-2]=crcHi;
  senddbuf[sendCount-1]=crcLo;
  for(i=0;i<sendCount;i++)
  {
   SBUF=sendbuf[ i ];
   while(TI=0);TI=0;
  }
}
void Read()
{
switch(startAdress)
{
  case 0x002; send(&writcVUf[0],sendcCount);break;
  case 0x003; send(rbufl,sendCount );break;
  default;
  {
  SBUF=0x00;while(TI==0 TI=0; );
  }
}
}
//数据帧分析处理函数
void crc_Data()
{
    crcDataHi=crcData/256;
crcDataHi=crcData/256;
if(crcDataHi==receBuf[6]&crcDataLo==recebuf[7])
{
  StartAress=ReceBuf[2] ;
  StartAress<<=8;
  StartAress=StartAress|ReceBuf[3];
  if(ReceBuf[0]==0x00)
  {
  sendCount=5+2*(ReceBUf[4]*256+ReceBuf[5]);
  Read();
  }

}
else{SBUF=0x0a;while(TI==0);TI=0;}
}
  //串口中断函数---实现CRC数据信息的分析处理
  void cmmmIntProc()interrupt 4{
  if(RI){
  RI=0;ReceBuf[receCount]=SBUF;
  receCount++;usDataLen=receCount-2;
  switch(ReceBuf[1])
  {
  case 0x01;if(receCount>=8)
    {receCount=0readbit();} break;
  case 0x02;if(receCount>=8)
    {receCount=0readbit();} break;
  case 0x03;if(receCount>=8)
    {receCount=0readbit();} break;
  case 0x04;if(receCount>=8)
    {receCount=0readbit();} break;
  case 0x05;if(receCount>=8)
    {receCount=0readbit();} break;
  case 0x06;if(receCount>=8)
    {receCount=0;WriteVyte();}break;
  default; if(receCount>=8)
  {
  receCount=0;SBUF=0X55;
  while(TI==0);
  TI=0;
  }
  }
     }
   }
  

                  

4 总结
由于Modhus 协议具有开放性和透明性等特点,而51系列单片机技术成熟、开发成本低,二者的结合将继续成为各类通信系统设计的首选。本设计方法已经应用于触摸屏与单片机通信设计,并取得了较好效果。这种方法对于编制类似的通信软件有一定的借鉴作用,部分程序可以直接移植。

回复

使用道具 举报

ID:428400 发表于 2018-11-18 18:31 | 显示全部楼层
这个是维纶官网的例子吗
回复

使用道具 举报

ID:468555 发表于 2019-1-15 15:18 | 显示全部楼层
论坛这么好
回复

使用道具 举报

ID:578008 发表于 2019-7-26 15:56 | 显示全部楼层
有没有主机的代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表