基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

导读:触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议。
关键词:触摸屏,MCS-51单片机,Modbus协议,通信

基于MODBUS协议的单片机与(串口屏)触摸屏通信

在工业控制中经常需要观察系统的运行状态或者修改运行参数。触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议。本文以AT89S51单片机和广州易显科技有限公司的HMImaker触摸屏为例,介绍其通信程序的开发过程。
  一、系统结构
  实现触摸屏与单片机的通讯,主要是解决通讯协议的问题。本文使用开放的Modbus通讯协议,以触摸屏作主机(Master),单片机作从机(Slaver)。HMImaker触摸屏本身支持Modbus通讯协议,只要单片机按照Modbus协议进行收发数据,就可以进行通信了。触摸屏与单片机之间采用RS-232或者RS-485标准接口直接连接,传输速率设置为9600bps。图1为该系统的电路图。
  基于MODBUS协议的单片机与(串口屏)触摸屏通信

  图1 系统电路图
  将AT89S51单片机的TXD、RXD口设置为异步串行通信模式,经过MAX485芯片将TTL电平转换为RS485电平,再与HMImaker触摸屏RS-485 2W接口相连,即完成了硬件连接,其中P3.2作为收发控制信号。HMImaker触摸屏RS-485 2W接口的管脚2为485A,管脚1为485B,管脚5为公共地。 
  二、如何将HMImaker触摸屏设定成Modbus装置
  将HMImaker触摸屏设定成Modbus装置(以称为Modbus RTU Master),单片机或其它装置只需使用Modbus协议,透过RS232/485接口,即可读写HMImaker触摸屏上的数据。将HMImaker触摸屏设定成Modbus装置的方法如下:
  首先需在HMImaker触摸屏使用的程序的界面协议中增加一个新的设备,此时PLC种类需选择“Modbus RTU Master”,PLC接口可以选择RS232、RS4852W、RS485 4W或Ethernet,这里选择RS485 2W。如图2所示。
  

基于MODBUS协议的单片机与(串口屏)触摸屏通信

  图2 将HMImaker触摸屏设定成Modbus装置
  当接口选择使用RS485时,需选择使用的连接端口(COM1~COM3),并设定正确的通讯参数及站号。这里选择COM1(9600,N,8,1),站号设定为1。
  按下“确定”键后可以在设备清单中发现一个新的装置:Modbus RTU Master,此时即完成了Modbus装置的设定,在完成界面设计的编译并将获得的NANDflash档案下载到触摸屏后,即可透过Modbus协议读写HMImaker触摸屏上的数据。
  三、Modbus通信协议介绍
  Modbus通信协议是一种串行的主从通信协议,网络里仅有一台设置可作为主机(称Master),其它设备作为从机(称Slaver),主机不需编号,从机必须编号。协议定义了主机查询及从机应答的信息帧格式。论文大全。通信时,主机首先向从机发出请求信息,符合相应地址码的从机接收通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务,然后把执行结果返给主机。若从机接收到的校验码与本机计算的不同,则说明数据在通信过程中出现错误,从机把这次请求视为无效,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。当主机收到这一信息时,会重新发送请求信息。校验方式分为LCR(传送数据为ACSII时)校验或CRC(传送数据为二进制时)校验,这里采用CRC校验方式。信息传输为异步方式,并以字节为单位。主从站之间通讯的字格式如下:
  字格式(串行数据) 10位二进制
  起始位 1位
  数据位 8位
  奇偶校验位 无
  停止位 1位
  Modbus协议可支持ASCII码或二进制格式的数据传输。ACSII码方式下每一个字节数据分两个字节传送,二进制方式下用一个字节传送,为了减少数据传输量,一般选二进制数据方式。各个区允许发送的字节均为16进制的0~9,A~F。二进制信息帧标准结构为:
  初始结构 ≥4字节的时间
  地址码 1字节
  功能码 1字节
  数据区 N字节
  错误校验 16位CRC码
  结束结构 ≥4字节的时间
  二进制模式中,信息开始至少需要3.5个字符的静止时间,依据使用的波特率,很容易计算这个静止时间。发送完最后一个字符后,也有一个至少3.5个字符的静止时间,然后才能发送一个新的信息。网络上的设备连续监测网络上的信息,包括静止时间。
  四、通信程序的开发
  HMImaker触摸屏只支持Bit和Word地址类型,而实际的单片机或其它控制器还有Byte、Double Word等表示方法,因此在进行通信时,需要把单片机和触摸屏的数据进行变换。触摸屏画面元件读取地址的设备类型有LW、0x、1x、3x、4x、RWI、RW等选项。其中,LW表示该元件读取的是触摸屏内部的地址,如其它元件的地址;0x表示读取的是控制器的输出信号;1x表示读取的控制器的输入信号;3x和4x指控制器的寄存器地址类型,其中4x是可读可写的,3x是只读的;RWI、RW都是触摸屏的内部地址,起辅助作用。这里仅以读写LW的0地址的数据为例说明读写过程。
  HMImaker触摸屏与单片机以Modbus协议通信,用到的Modbus功能码如下:
   功能码 名称 作用 01 读取线圈状态 取得一组逻辑线圈的当前状态(ON/OFF) 02 读取输入状态 取得一组开关输入的当前状态(ON/OFF) 03 读取保持寄存器 在一个或多个保持寄存器中取得当前的二进制值 04 读取输入寄存器 在一个或多个输入寄存器中取得当前的二进制值 05 强置单线圈 强置一个逻辑线圈的通断状态 06 预置单寄存器 把具体二进值装入一个保持寄存器 1. 串口程序的初始化
  使用定时器1作为波特率发生器,对串口的初始化程序如下:
  void Initial(void)
  {
   SCON=0x50; //串口方式1,允许接收
   TMOD=0x20; //定时器1方式2
   TL1=0xFd; //波特率设为9600
   TH1=0xFd; //存储定时器初始值
   EA=1; //全局中断允许
   TR1=1; //启动定时器
  }
  2. 向HMImaker触摸屏LW的0地址写入数据
  向HMImaker触摸屏LW的0地址写入数据0x3A4B,功能码为6,程序如下:
  void DateWrite(void)
  {
   ES=0; //关中断
   unsigned int a;
   unsigned int crc;
  inData[0]=1; //站号
  inData[1]=6; //功能码
  inData[2]=0; //起始地址高位
  inData[3]=0; //起始地址低位
  inData[4]=0; //寄存器个数高位
  inData[5]=1; //寄存器个数低位
   inData[6]=2; //字节数
  inData[7]=0x3A; //要写入数据高位
  inData[8]=0x4B; //要写入数据低位
   crc=0xffff;
  crc=calccrc(9,&inData[0]); //根据前9个字节计算CRC值
  inData[9]=crc&0xff; //CRC值低8位
  inData[10]=crc>>8; //CRC值高8位
  for(a=0;a<11;a++) //共发送11个字节
   {
  SBUF=inData[a]; //发送数据
   while(!TI);
   TI=0;
   }
   ES=1; //开串行口中断
  }
  3. 从HMImaker触摸屏LW的0地址读取数据
  从HMImaker触摸屏LW的0地址读取数据,功能码为3,程序如下:
  void DateWrite(void)
  {
   ES=0; //关中断
   unsigned int a;
   unsigned int crc;
  inData[0]=1; //站号
  inData[1]=3; //功能码
   inData[2]=0; //起始地址高位
  inData[3]=0; //起始地址低位
  inData[4]=0; //寄存器个数高位
  inData[5]=1; //寄存器个数低位
   crc=0xffff;
  crc=calccrc(6,&inData[0]); //根据前6个字节计算CRC值
  inData[6]=crc&0xff; //CRC值低8位
  inData[7]=crc>>8; //CRC值高8位
  for(a=0;a<8;a++) //共发送8个字节
   {
   SBUF=inData[a]; //发送数据
   while(!TI);
   TI=0;
   }
   ES=1; //开串行口中断
  }
  发送完读取数据的信息,一旦HMImaker触摸屏接收到该信息,经过CRC校验,如果没有错误,就会把LW的0地址数据发送给单片机,共7个字节,数据格式如下:
  字节 数据段名称
  1 站号
  2 功能码
  3 读取字节数
  4 寄存器数据高位
  5 寄存器数据低位
  6 CRC校验码低位
  7 CRC校验码高位
  单片机接收完这7个字节,根据站号、功能码及CRC校验判断是否正确,如果接收正确,则第4个字节和第5个字节的值就是所需要的HMImaker触摸屏LW的0地址的数据。
  本系统具有连接电路简单、组态灵活、通信可靠性高等特点。由于Modbus通信协议的开放性的特点,国外进口控制器串行通信大者支持该协议,因此本文所实现的采用Modbus协议的串行通信具有广泛的应用价值。

 基于MODBUS协议的单片机与(串口屏)触摸屏通信


基于MODBUS协议的单片机与(串口屏)触摸屏通信

基于MODBUS协议的单片机与(串口屏)触摸屏通信

基于MODBUS协议的单片机与(串口屏)触摸屏通信

转载于:https://www.cnblogs.com/vgalvds/p/6728685.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】C#之继承

C#之继承 一.继承的类型  在面向对象的编程中&#xff0c;有两种截然不同继承类型&#xff1a;实现继承和接口继承  1.实现继承和接口继承  *实现继承&#xff1a;表示一个类型派生于基类型&#xff0c;它拥有该基类型的所有成员字段和函数。在实现继承中&#xff0c;派生…

java 学习计划_Java学习计划范例

Java学习计划范例Java学习计划好的计划是成功的一半&#xff0c;今天是在创新思维的第一节课&#xff0c;在这门课程的开始&#xff0c;一个有策略的、有目的性的计划是非常必要的&#xff0c;为了在以后的学习中能够达到最好的.效果&#xff0c;"坚持"是一把雕刻刀&…

SQL Server 2012自动备份

SQL 2012和2008一样&#xff0c;都可以做维护计划&#xff0c;来对数据库进行自动的备份。 现在做这样一个数据库维护的计划&#xff0c;每天0点对数据库进行差异备份&#xff0c;每周日0点对数据库进行完全备份&#xff0c;并且每天晚上10点删除一次过期备份&#xff08;两个星…

mysql查逻辑表的分片规则_MySQL(19) Mycat分片(分库分表)配置

一、前言本文将基于主从复制&#xff0c;读写分离的环境基础上进行一个简单的分片(分库分表)配置二、Mycat分片配置mycat分片主要在scheam.xml&#xff0c;rule.xml这2个表中配置① scheam.xml&#xff1a;配置逻辑表以及对应使用的分片规则select user()这里小编主要对t_user表…

JS取消浏览器文本选中的方法

一 、问题的出现 今天在使用Easy-UI 的messager.alert()方法时候出现浏览器文本被选中&#xff0c;不知道其中是什么原因&#xff0c;如下图所示。 二 、解决思路 我最后的思路时在弹出消息框的同时&#xff0c;取消浏览器文本的选择&#xff0c;最后查找资料编写如下方法。  …

linux 脚本 java_Linux 通过脚本执行Java程序

由于要统计不同的IP&#xff0c;代码中应用了HashSet来存放IP地址。上述Java程序是在Windows下编写的&#xff0c;如果在Linux服务器上运行&#xff0c;只需要把上面文件的路径和文件更换了就可以了。2.编写好java程序后&#xff0c;将java程序打成jar文件(环境Linux)我将上述测…

Java开启/关闭tomcat服务器

© 版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处 通过java代码实现Tomcat的开启与关闭 1.项目结构 2.CallTomcat.java package com.calltomcat.test;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;…

5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)...

5、如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a sample("ABCDEF",randint(5,6)) # print(a) # b1 {x:randint(1,4) for x in sample("ABCDEF",randint(3,6))} # b2 {x:randint(1,4) for x in sample("A…

KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机

一 .KVM 简介 KVM &#xff08;名称来自英语&#xff1a; Kernel-basedVirtual Machine 的缩写&#xff0c;即基于内核的虚拟机&#xff09; &#xff0c; 是一种用于Linux内核中的虚拟化基础设施&#xff0c;可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Li…

python 如何在一个for循环中遍历两个列表

是我在看《笨方法学python》过程中发现有一行代码看不懂——“ for sentence in snippet, phrase:”&#xff0c;所以研究了半天&#xff0c;感觉挺有收获的。所以就放在博客上分享给大家了。 直入主题&#xff1a; 为了不耽误大家时间&#xff0c;如果知道以下为两段代码为什么…

画王八java代码参数_java画乌龟源代码-郭遥航.doc

java画乌龟源代码-郭遥航.doc /*JAVA基本功小练习用java语言描述小王八用鼠标可以拖动小乌龟进行移动选中乌龟时可以显示小乌龟的腹面*/importjava.awt.*;importjavax.swing.*;importjava.awt.event.MouseMotionListener;importjava.awt.event.MouseListener;importjava.awt.ev…

java服务注册中心有哪些_Spring Cloud服务注册中心简述

概念当一个大型系统拥有很多服务时&#xff0c;往往需要一个服务注册中心来管理这些服务&#xff0c;它可以提供如下功能&#xff1a;登记每个服务提供的功能检测每个服务是否可用&#xff0c;不可用的服务剔除服务间互相调用时&#xff0c;通过服务注册中心很容易找到目标服务…

JavaScript原生对象及扩展

来源于 https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置&#xff08;Build-in&#xff09;对象与原生&#xff08;Naitve&#xff09;对象的区别在于&#xff1a;前者总是在引擎初始化阶段就被创建好的对象&#xff0c;是后者的一个子集&#xff1b;而后…

实例化Java对象_Java面向对象基础之对象实例化

1、实例化对象的过程可以分为两部分,例如下面代码:Person per new Person();该代码分为两部分:第一,声明对象:Personper&#xff0c;这部分是在栈内存中声明的&#xff0c;与数组一样&#xff0c;数组名称及时保存在占内存之中&#xff0c;只是开闭了真内存&#xff0c;对象是…

HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 详细错误:HTTP 错误...

错误摘要 HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置&#xff0c;无法提供您请求的页面。 详细错误信息 模块IsapiModule通知ExecuteRequestHandler处理程序ExtensionlessUrlHandler-ISAPI-4.0_32bit错误代码0x800704ec请求的 URLhttp://:…

vue value key

转载于:https://www.cnblogs.com/lily2021/p/6772817.html

go的timer定时器实现

示例如下&#xff1a; package mainimport ("fmt""time" )func testTimer1() {go func() {fmt.Println("test timer1")}()}func testTimer2() {go func() {fmt.Println(time.Now().String())}() }func timer1() {timer1 : time.NewTicker(1 * ti…

JavaSE简单实现多线程聊天

1.1 主程序入口 在主程序入口处&#xff0c;通过设置MyWindow的第一个参数&#xff0c;如果为true则为服务器&#xff0c;如果为false&#xff0c;则为客户端&#xff0c;当然也可以设置第二个参数&#xff0c;区分客户端和服务器的窗口标题。 public class JavaMain {public s…

php聊天功能逻辑原理,@xxx提及用户,这种功能的实现原理是怎样的?

122014-12-13 22:05:54 08:00 1在牛客网 http://www.nowcoder.com 用户在我们网站提交的评论&#xff0c;我们会进行敏感词过滤&#xff0c;其算法是基于有限状态机DFA过滤的。 我觉得可以用敏感词过滤的方法来查找的用户ID。 (用户ID就是好多敏感词)&#xff0c; 具体的代码…

T7-Dropout 解决 overfitting 过拟合

Dropout 解决 overfitting 相对于过拟合&#xff08;overfitting&#xff0c;或称&#xff1a;过度学习&#xff09;是指&#xff0c;使用过多参数&#xff0c;以致太适应训练数据而非一般情况&#xff1b;另一种常见的现象是使用太少参数&#xff0c;以致于不适应当前的训练数…