PIC单片机与触摸屏串行通信的MODBUS协议实现

合集下载

PIC单片机与触摸屏串行通信MODBUS协议

PIC单片机与触摸屏串行通信MODBUS协议

PIC单片机与触摸屏串行通信MODBUS协议工控中经常需要观察系统的运行状态或者修改运行参数。

触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。

单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。

触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。

Modbus 协议是美国Modicon 公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议。

本文以PIC16F877 单片机和人机电子有限公司的eView MT510T 型触摸屏为例,介绍其通信程序的开发过程。

1 系统结构实现触摸屏与单片机的通讯,主要是解决通讯协议的问题。

本文使用开放的Modbus 通讯协议,以触摸屏作主站,单片机作从站。

eView 触摸屏本身支持Modbus 通讯协议,如果单片机也支持Modbus 协议,就可以进行通信了。

触摸屏与单片机之间采用的RS-232C 兼容接口直接连接,传输速率设置为9600kb/s。

图1 为该系统的电路图。

将PIC16F877 单片机RC6、RC7 口设置为异步串行通信模式,经过MAX232 芯片将TTL 电平转换为RS232 电平,再与eView 触摸屏PLC[RS-232]接口相连,即完成了硬件连接。

eView 触摸屏PLC[RS-232]接口的管脚2 为TXD,管脚3 为RXD。

2 Modbus 通信协议介绍Modbus 通信协议是一种串行的主从通信协议,网络里仅有一台设置可作为主机(称Master),其它设备作为从机(称Slaver),主机不需编号,从机必须编号。

协议定义了主机查询及从机应答的信息帧格式。

通信时,主机首先向从。

基于Memory-link协议的GP触摸屏与PIC单片机通信的实现

基于Memory-link协议的GP触摸屏与PIC单片机通信的实现

G P触摸屏除具有 强大 的 图形功 能和 数据 处理 功能 外 , 还 可以通过标准 的 c F卡来存 储 配方数据 、 实时采 样数据 和历 史 报警信息 。采用具 有强 大图 形编辑 功 能的 G P—P O P Ⅲ f R/B o r
Wi o s n w 作为屏幕编辑软件 , d 能够容易地 创建直观的屏幕画面 。
L i -e,H GXa— e,H N i I n w i AN i m i A GQa M g Z n Z n
( e a t n f l to i E g e r g O l n U i r t eh oo y ' al 10 3 C i ) D pr me t e r nc n i e i , . a nv s y o T c n l ,O l r 1 6 2 , hn oE c n n a i ei f g a i a A s a t I rd c dt o m nct nm t db te nPC s n l h r esrS P n Pt c — r n ad i p m n - bt c : t u e ecm u i i e o e e I g a c i p f o( C )a dG u hs e n si l et r no h ao h w i p os o ce t m e a
K yw rsG uhs enPCs a ci po s rPCS P ; e r l rt o;o ae e od :Pt c- re ;I i l h rf s (I C )m m y i po cls t r o c n g p e0 o -n k o f w
1 G P触 摸 屏
2 Me r-n 信 协 议 moylk通 i
起始 应答
PC单片机接 口功能丰 富 , G I 与 P触 摸屏 结合起 来 , 能将控 制 的灵 活性 和工控软件 的控制稳 定性有机地 结合起来 , 从而 优 化 现场测控 系统 的总 体性能 和性 价 比。 由于 PC单 片 机不像 I P C可以直接和 G L P触摸屏通信 , 所以在选好 G P触摸屏 的通 信 协议 以后 , 要为单片机编写对应的通信程序。

Modbus协议下单片机与eView触摸屏的通信方法

Modbus协议下单片机与eView触摸屏的通信方法

Modbus协议下单片机与eView触摸屏的通信方法作者:时间:2008-04-03 来源: 浏览评论推荐给好友我有问题关键词:Modbus触摸屏Modbus协议由于其具有开放性、透明性、成本低、易于开发等特点,已成为当今工业领域通信协议的首选。

本文介绍了一种基于Modbus通信协议的eView触摸屏与常用的51单片机的通信方法。

该方法通过C51编程实现Modbus通信,在51系列单片机上具有通用性,有一定的借鉴作用。

工业控制中经常需要观察系统的运行状态或者修改运行参数。

触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。

单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。

触摸屏与单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。

Modbus协议是美国Modicon公司推出的,一种有效支持控制器之间以及控制器经由网络(如以太网)与其他设备之间进行通信的协议。

本文以STC89C51单片机和人机电子有限公司的eView触摸屏为例,介绍其通信程序的开发过程。

1 系统结构实现触摸屏与单片机的通信,主要是解决通信协议的问题。

本文使用开放的Modbus 通信协议,以触摸屏作主站,单片机作从站。

eView触摸屏本身支持Modbus通信协议,如果单片机也支持Modbus协议,就可以进行通信了。

eview触摸屏支持RS-232和RS-485两种通信接口。

在工业控制领域,由于RS-485具有可靠性高、传输距离远、抗干扰能力强等优点,所以在本系统中触摸屏与单片机通信采用RS-485连接,传输速率设置为9600 kbps。

RS-485信号传输是一种半双工的传输方式,单片机通过一个RS-232/RS-485无源转换器把232信号转换成485信号,连接到eView触摸屏上。

图l为该系统的原理图。

单片机控制系统采用STC89C51系列单片机,其内部集成MAX810/STC810专用复位电路(原有外部复位可继续保留,与Intel 8051引脚兼容),具有抗干扰能力强、加密性强、高抗静电(ESD)、超低功耗等特点,而且价格低廉。

单片机通过Modbus协议与HMI通信

单片机通过Modbus协议与HMI通信

如何用单片机通过MODBUS协议与HMI通信一.Modbus简介Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(SchneiderAutomation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。

此协议支持传统的RS-232、RS-422、RS-485和以太网设备。

许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。

Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。

Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。

Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验。

ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验也比较容易。

但是因为它传输的都是可见的ASCII字符,RTU传输的数据每一个字节ASCII 都要用两个字节来传输,比如RTU传输一个十六进制数0xF9,ASCII就需要传输’F’’9’的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。

所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使用RTU协议。

二.ModBus消息帧使用ASCII模式,消息以冒号(: ASCII码 3AH)开始,以回车换行(ASCII码 0DH,0AH)符结束。

其它域可以使用的传输字符0...9,A...F。

网络上的设备不断侦测 : 字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。

MODBUS协议在单片机与触摸屏通信中的应用

MODBUS协议在单片机与触摸屏通信中的应用

MODBUS协议在单片机与触摸屏通信中的应用
张芬
【期刊名称】《大众科技》
【年(卷),期】2009(000)007
【摘要】文章介绍了自主开发的智能配电系统的硬件构成,重点讲述基于MODBUS通讯协议的触摸屏与单片机系统的通讯方法.该方法降低了系统设计成本,并提高了设备的通用性.目前该系统已通过用户的验收并投入使用.
【总页数】3页(P23-24,14)
【作者】张芬
【作者单位】西安航空职业技术学院,陕西,西安,710089
【正文语种】中文
【中图分类】TP29
【相关文献】
1.Modbus协议在单片机通信中的应用研究 [J], 王晓宁;黄传伟;郭剑;王洁;李斯伟;鲁茗莉
2.单片机与触摸屏基于MODBUS协议通信的应用 [J], 黄月明
3.基于Modbus协议的触摸屏与单片机通讯控制 [J], 王旭;吴栋;董庆源
4.基于MODBUS协议的单片机与触摸屏通讯接口设计 [J], 欧阳崇伟;杨秋萍;李疆
5.基于Modbus协议的单片机触摸屏通讯系统设计应用 [J], 刘永琦;曲鸣飞
因版权原因,仅展示原文概要,查看原文内容请购买。

PIC单片机与触摸屏串行通信的MODBUS协议实现

PIC单片机与触摸屏串行通信的MODBUS协议实现
数据处理及发送模块执行Modbus协议功能码对应 的动作。eView触摸屏与单片机以Modbus协议通信,用 到的Modbus功能码如表2所示。
表2通信程序用到的功能码
功能妈 0l
eView 地址名称
0x
03
4x
ox 05
1x
3x 16
4x
含义 读开关量日期:2005—03—29)
钧 万欢方迎数网据上投稿w槲.瓣耄llel.en w轿懈.勰lnet.co搬.cn 《电子技术应用》2∞5年第9期
自动化与仪器仪表
将PICl6F877单片机Rc6、Rc7口设置为异步串行 方法,因此在进行通信时,需要把单片机和触摸屏的数
通信模式,经过MAx232芯片将1TrL电平转换为RS232 据进行变换。触摸屏画面元件读取地址的设备类型有
PIC单片机通信的实现 -仪表技术与传感器2007(2)
介绍了PIC单片机与GP触摸屏的通讯及实现方法.简要分析了Memory-link通讯协议,给出了PIC单片机与GP触摸屏异步串行通讯连接图,以及用PIC编写 的部分关键通信程序.经实验验证:该方法稳定可靠,为开发者采用GP触摸屏与带串口的智能设备之间的通信连接提供了参考.
电平,再与eView触摸屏PLC[RS一232]接口相连,即完成 Lw、0)【、1x、3x、4x、RwI、Rw等选项。其中,Lw表示该元
了硬件连接。eView触摸屏PLc[Rs一232]接口的管脚2 件读取的是触摸屏内部的地址,如其它元件的地址;ox
为TXD,管脚3为RXD。
表示读取的是控制器的输出信号;1x表示读取的是控
盈l系统电路鞠
出乖出牢出带水幂出乖出脊如脊出i北乖出脊必爷出希出铲蝣壮g卒出f姑脊出秘彤i姑≈姑带蜘带弛}姥书出帛出《建2#也}出察出}池书啦瞽出f出带够带出目≈出f姑替出≯出譬如奋《矫《5带!#f{尘}{生}≈孕f延;f延5f{墉

单片机与触摸屏基于MODBUS协议通信的应用

单片机与触摸屏基于MODBUS协议通信的应用

单片机与触摸屏基于MODBUS协议通信的应用作者:黄月明来源:《中国新技术新产品》2017年第07期摘要:本文以自动温控鼓风机为例,介绍了触摸屏与单片机控制系统组成人机交换界面。

重点讲述了基于MODBUS RTU协议的触摸屏与单片机的通信方法,并讲述应用程序设计方法,提供了通用的软件硬件设计方法。

目前该系统已通过实践证明可以可靠稳定地运行。

关键词:触摸屏;单片机控制系统;MODBUS协议中图分类号:TP393 文献标识码:A自动控制系统经常需要观察运行状态或输入输出相关的参数,触摸屏能直观生动地显示运行参数和状态,具有良好的人机交互性。

单片机广泛应用于工业控制中,与触摸屏配合使用可以构成良好的人机交互界面。

但现有工控触摸屏都只支持与PLC的接口通信,没有支持与单片机的接口通信的工控触摸屏,故给单片机和工控触摸屏组成控制系统带来了很大的障碍。

本文以自动温控鼓风机项目为例,以MODBUS协议为载体,搭建单片机与工控触摸屏通信的通用平台。

一、MODBUS通信协议介绍1. MODBUS协议简述Modbus协议是广泛应用于电子控制器上开放性通用语言。

MODBUS协议在一根通信线上使用主从应答式连接,在一根单独的通信线上信号沿着相反的两个方向传输。

首先,主计算机的信号寻址到一台唯一的终端设备,然后,终端设备发出的应答信号以相反的方向传输给主机。

MODBUS协议只允许在主机和终端设备之间通信,而不允许独立的终端设备之间的数据交换,这样终端设备不会在它们初始化时占据通信线路,而仅限于响应到达本机的查询信号。

2.查询查询消息中的功能代码告之被选中的从设备要执行何种功能。

例如功能代码03是要求从设备读保持寄存器并返回它们的内容。

数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量及错误检测。

3.回应如果从设备产生正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。

数据段包括了从设备收集的数据:如寄存器值或状态。

OMRON触摸屏与PIC单片机的通信-2019年文档

OMRON触摸屏与PIC单片机的通信-2019年文档

OMRON触摸屏与PIC单片机的通信触摸屏能够直观、生动地显示系统参数以及系统状态,并且面可以直接修改系统运行参数,方便人机交互。

单片机是一种集成电路芯片,包括是中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口、中断系统、定时器/计时器等功能,在工业控制领域也具有广泛的应用。

触摸屏和单片机共同构建系统并不常见,需要触摸屏和单片机进行合理通信。

1.OMRON触摸屏NB系列的触摸屏,采用长效LED背光(50,000小时)设计,显示颜色超过65,000色,屏幕数据存储容量高达120MB;具备串行、USB或Ethernet 连接功能,可与欧姆龙或非欧姆龙产品(如PLC、变频器等)进行连接;多样化的密码保护功能,可轻松解决客户自行开发工程的安全问题;此外,还配备寄存器状态(位/字)控制选项(用于查看实际情况与预定义值的差别)和标准操作确认查看选项。

NB系列触摸屏,可满足小巧型HMI与欧姆龙小型机器控制器组合需求。

HMI和PLC之间的配方数据传输时可将数据备份至外部存储器中,配方画面还可为自由选择的格式。

2.P IC单片机P IC16系列单片机集成度高,体积小,可靠性高,芯片本身是按工业测控环境要求设计的,内部布线很短,其抗工业噪音性能优于一般通用型;P IC16系列控制功能强,单片机的指令系统丰富,非常适用于专门的控制功能;电压低,功耗低,便于生产便携;片内具有计算机正常运行所必需的部件,外部有许多供扩展用的三总线及并行、串行输入/输出管脚,很容易进行系统扩展;使用RISC流水线和DSP等技术,性价比极高。

单片机的寻址能力也已突破64KB的限制,有的已可达到1MB和16MB,片内的ROM容量可达62MB,RAM容量则可达2MB。

3.通信方式Modbus协议是美国Modicon公司推出的一种支持控制器之间或者控制器经通过网络和其它设备之间的通信协议。

Modbus 协议包括ASCII、RTU、TCP等,其中ASCII、RTU用于控制器之间通信较为常见,能够规定消息、数据的结构、命令和应答的方式。

基于 Modbus协议的单片机与触摸屏通讯系统设计

基于 Modbus协议的单片机与触摸屏通讯系统设计

基于 Modbus协议的单片机与触摸屏通讯系统设计
张桓;赵树忠
【期刊名称】《河北联合大学学报(自然科学版)》
【年(卷),期】2010(032)004
【摘要】介绍了彩钢滚涂生产线上单片机与触摸屏通讯系统的硬件构成,重点讲述基于Modbus通讯协议的触摸屏与单片机系统的通讯方法.该方法降低了系统设计成本,并提高了设备的通用性.
【总页数】6页(P82-87)
【作者】张桓;赵树忠
【作者单位】河北理工大学,机械工程学院,河北,唐山,063000;河北理工大学,机械工程学院,河北,唐山,063000
【正文语种】中文
【中图分类】TP393
【相关文献】
1.基于MODBUS协议的触摸屏通讯系统设计 [J], 张新荣;张海堂
2.基于Modbus协议的触摸屏与单片机通讯控制 [J], 王旭;吴栋;董庆源
3.基于MODBUS协议的单片机与触摸屏通讯接口设计 [J], 欧阳崇伟;杨秋萍;李疆
4.基于MODBUS协议的单片机通讯系统设计 [J], 雷俊峰
5.基于Modbus协议的单片机触摸屏通讯系统设计应用 [J], 刘永琦;曲鸣飞
因版权原因,仅展示原文概要,查看原文内容请购买。

单片机与PLC之间的通讯模式的Modbus协议的有效应用

单片机与PLC之间的通讯模式的Modbus协议的有效应用

单片机与PLC之间的通讯模式的Modbus协议的有效应用摘要;随着经济的发展,Modbus协议得到了广泛的应用,这满足了单片机和PLC通讯模式的应用,在此过程中HMI由于其自身的高实时性、高性能、小体积化得到了广泛的普及在一些工业自动系统设备中,都能看到它的影子。

其通过对图片、汉字、图形的有效应用,确保相关工作环节的稳定运行,大大满足了单片机与PLC通讯环节运作需要。

标签:波特;地址接收;代码;通讯管理;方案深化1 Modbus通讯协议的系统分析1.1 为了实现对单片机与PLC通讯环节的有效分析,我们首先要进行Modbus协议的深入分析,以分析目前工作中存在的不足,通过相应措施的应用,确保实际工作环节的稳定运行。

Modbus是施耐德电气公司的一种总线协议运作模式,有利于实现Modbus在以太网上的分布式应用,满足实际场景的需要。

随着经济技术的不断发展,Modbus协议的所有权也在发生着改变,目前主要由Modbus-IDA组织所应用,这极大推动了该协议模式的发展,随着Modbus的节点安装数量的不断提升,Modbus协议的应用范围更加广泛,目前已经成为电子控制器的广泛应用的语言。

Modbus协议应用于各个协议控制器之间,确保了网络之间的良好通信,比如以太网与其他设备的良好通信。

随着经济的发展,它已经成为一种通用的工业标准模式。

实现了对相关控制设备的有效应用,促进了工业网络的集中监控化,促进网络通信系统的不断完善。

这种模式通过对RS-232C兼容串行接口等环节的应用,实现日常信号位环节、奇偶校验等环节的稳定运行,实现了Modbus协议模式的正确应用。

1.2 为了确保单片机与PLC之间的通讯模式的深化,我们需要进行Modbus 协议的应用深化,这种协议模式提供了一种主从原则,就是主设备的初始化传输,该协议系统的其他相关环节都是围绕这个主从原则进行具体运用的,其他设备通过对主设备的反应,进行相关环节的运行,它主要是对主设备提供的相关数据信息进行反映。

Modbus协议下实现单片机与PLC之间的通讯 - 单片机

Modbus协议下实现单片机与PLC之间的通讯 - 单片机

Modbus协议下实现单片机与PLC之间的通讯 - 单片机1引言 hmi(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。

它有字母、汉字、图形和图片等不同的显示,界面简单友好。

配有长寿命的薄膜按钮键盘,操作简单。

它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机[1]作为其核心控制器,以实现实时快速处理。

plc和单片机结合不仅可以提PLC的数据处理能力,还可以给用户带来友好简洁的界面。

本文以Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。

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

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

Modbus协议提供了主—从原则,即仅一设备(主设备)能初始化传输(查询)。

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

主设备查询的格式:设备地址(或广播,此时不需要回应)、功能代码、所有要发送的数据、和一错误检测域。

从设备回应消息包括确认地址、功能码、任何要返回的数据、和一错误检测域。

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

控制器能设置为两种传输模式:ASCII 和RTU,在同样的波特率下,RTU可比ASCII方式传送更多的数据,所以采用KTU模式。

(1)典型的RTU消息帧典型的RTU消息帧如表1所示。

RTU消息帧的地址域包含8bit。

可能的从设备地址是0...127(十进制)。

其中地址0是用作广播地址,以使所有的从设备都能认识。

主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。

当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。

RTU消息帧中的功能代码域包含了8bits,当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为;当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应,一般是将功能码的最高位由0改为1)。

维纶触摸品与PIC18F4520单片机MODBUS通信

维纶触摸品与PIC18F4520单片机MODBUS通信

#include <p18cxxx.h>#include "toppic.h"#include <adc.h>#include <stdlib.h>#include <delays.h>/* 宏定义无符号字符型、整形、长整形*/#define uchar unsigned char //8位#define ulint unsigned long //32位#define uint unsigned int //16位#pragma config OSC=HS,WDT=OFF,LVP=OFF,DEBUG=ONvoid Display(uint Num) ;void PIC18F_High_isr(void);/*中断服务函数声明*/void PIC18F_Low_isr(void);uchar buf[8]={0x01,0x03,0xff,0xfd,0x00,0x02,0x65,0xef};uchar Send_buf[30]; //发送数据数组uchar Receive_buf[30]; //接收数据数组uint disp[90]={0}; //字接收显示数组,用于存储6x的十六位接收数据uint count=0,time=0; //count为收到数据的次数,time应用于发送03代码时,中间的字数量是多少个数值uchar flag_finish=0,flag_led=0,iii; //是否接收完成位,flag_led暂时不用uint address_num=0; //接收到字的数值uint begin_address=0,begin_add=0,address_leg=0,address=0; //数值字开始位,数值字长度uint sign7=0,sign6=0,sign5=0,sign4=0,sign3=0,sign2=0,sign1=0,sign0=0; //用于判定发送的8个位,即0x1-0x8的位状态uint sign17=0,sign16=0,sign15=0,sign14=0,sign13=0,sign12=0,sign11=0,sign10=0;int shi,ge,shifen,baifen;uint hi_type=0,low_type=0,ii=0;/*0-F共阴字形码表*/const rom uchar DuanMa[17]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 ,0x6d ,0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,0x39 , 0x5e , 0x79 , 0x71 , 0x00};//////////////*高位表*///////////////////const rom auchCRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,0x40} ;//////////////*低位表*///////////////////const rom auchCRCLo[] = {0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,0x40} ;/*函数申明*/void PORT_init(void);void ADC_init(void);void send(uchar num);void send_word(uchar *mydata,uchar num) ;#pragma code high_vector_section=0x8void high_vector (void){_asm goto PIC18F_High_isr _endasm /*通过一条跳转指令(汇编指令),跳转到中断服务函数(中断服务程序)处*/}#pragma code low_vector_section=0x18/*低优先级中断响应时,会自动跳转到0x18处*/void low_vector (void){_asm goto PIC18F_Low_isr _endasm}#pragma code#pragma interrupt PIC18F_High_isrvoid PIC18F_High_isr (void){if(INTCONbits.INT0IF) //INT0中断{}if(INTCON3bits.INT1IF) //INT1中断{}if(PIR1bits.RCIF){uchar a;//TXREG=RCREG;/*将接收到的数据再发送出去*/a=RCREG; //把缓存在单片机的数据给aReceive_buf[count]=a; //将接受数据放入预置数组count++; //数组自动递增,用于存储下一个数据if(count==8) //当接收完8个MODBUS的功能码之后,自动清0,从新接收(支持的01、05、03、06命令读取或者写入每次都发送8个字节){//UartTx(a);// send_word(Receive_buf,8);//send_word(buf,8);count=0;flag_finish=1; //接受完8个MODBUS功能码的标志位}}if(INTCONbits.TMR0IF) //TMR0中断{}}/*---低优先级中断服务程序---*/#pragma interruptlow PIC18F_Low_isr/*注意:关键字是interruptlow,和高优先级中断时不同*/void PIC18F_Low_isr (void){}////////*16位CRC校验函数,查表法*////////////////uint crc16(uchar *puchMsg,uchar usDataLen){uchar uchCRCHi = 0xFF ;uchar uchCRCLo = 0xFF ;uint uIndex ;while (usDataLen--){uIndex = uchCRCHi ^ *puchMsg++ ;uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;uchCRCLo = auchCRCLo[uIndex] ;}return (((uint)(uchCRCLo) << 8) | uchCRCHi) ;}void delayms(unsigned int t){unsigned int i;unsigned int j;for(j=t;j;j--)for(i=80;i;i--);//192shi 1ms延时}void delayus(unsigned int t){unsigned int i;for(i=t;i;i--);}//////////数码管显示函数,该函数根据实际情况选择使用////////////////void Display(uint Num){shi=Num%10000/1000;ge=Num%1000/100;shifen=Num%100/10;baifen=Num%10/1;PORTA=0b00000000;PORTD=DuanMa[baifen];PORTA=0b00000010;delayms(1);PORTA=0b00000000;PORTD=DuanMa[shifen];PORTA=0b00000100;delayms(1);PORTA=0b00000000;PORTD=DuanMa[ge];PORTA=0b00001000;delayms(1);PORTA=0b00000000;PORTD=DuanMa[shi];PORTA=0b00100000;delayms(1);PORTA=0b00000000;PORTD=0;delayms(1);}/**************************MODBUS功能码处理***************************//********目前只能识别01,03,05,06功能码,而且只能挂载单台***********/void command(void){uint crc_end,legg; //CEC校验值和03功能码发送的位的长度// char hi_type,low_type; //03、06功能码发送字节高低位if(Receive_buf[1] == 0x01) //01功能码{crc_end=crc16(Receive_buf,6); //校验if(crc_end==Receive_buf[6]<<8 | Receive_buf[7]) //当校验一致时{hi_type=sign10 | sign11 | sign12 | sign13 | sign14 | sign15 | sign16 | sign17; //高位状态low_type=sign0 | sign1 | sign2 | sign3 | sign4 | sign5 | sign6 | sign7; //低位状态Send_buf[0]=Receive_buf[0]; //站号Send_buf[1]=Receive_buf[1]; //功能码// Send_buf[2]=Receive_buf[5]/16*2; //字节数Send_buf[2]=0x02; //字节数Send_buf[3]=low_type; //低位状态,即LED开关情况Send_buf[4]=hi_type; //高位状态crc_end=crc16(Send_buf,5); //校验Send_buf[5]=crc_end%256; //校验低位Send_buf[6]=crc_end/256; //校验高位send_word(Send_buf,7); //发送返回屏}}if(Receive_buf[1] == 0x05) //05功能码{begin_address=Receive_buf[3]; //开始地址crc_end=crc16(Receive_buf,6); //校验if(crc_end==Receive_buf[6]<<8|Receive_buf[7]) //校验正确时{ii=0; //6X区数据输入标示if(Receive_buf[4]==0xff) //当为强制打开时{switch(begin_address) //对应的地址{case 0x00: sign0=0x01; break; //相应的LED点亮,记录下相应的P0位状态case 0x01: sign1=0x02; break;case 0x02: sign2=0x04; break;case 0x03: sign3=0x08; break;case 0x04: sign4=0x10; break;case 0x05: sign5=0x20; break;case 0x06: sign6=0x40; break;case 0x07: sign7=0x80; break;case 0x08: sign10=0x01; break; //相应的LED点亮,记录下相应的P0位状态case 0x09: sign11=0x02; break;case 0x0a: sign12=0x04; break;case 0x0b: sign13=0x08; break;case 0x0c: sign14=0x10; break;case 0x0d: sign15=0x20; break;case 0x0e: sign16=0x40; break;case 0x0f: sign17=0x80; break;}}else //当强制为OFF时{switch(begin_address){case 0x00: sign0=0; break; //相应的LED熄灭,记录下相应的P0位状态case 0x01: sign1=0; break;case 0x02: sign2=0; break;case 0x03: sign3=0; break;case 0x04: sign4=0; break;case 0x05: sign5=0; break;case 0x06: sign6=0; break;case 0x07: sign7=0; break;case 0x08: sign10=0; break; //相应的LED熄灭,记录下相应的P0位状态case 0x09: sign11=0; break;case 0x0a: sign12=0; break;case 0x0b: sign13=0; break;case 0x0c: sign14=0; break;case 0x0d: sign15=0; break;case 0x0e: sign16=0; break;case 0x0f: sign17=0; break;}}Send_buf[0]=Receive_buf[0]; //站号Send_buf[1]=Receive_buf[1]; //功能码Send_buf[2]=Receive_buf[2]; //起始高位Send_buf[3]=Receive_buf[3]; //起始低位Send_buf[4]=Receive_buf[4]; //返回状态Send_buf[5]=Receive_buf[5]; //返回状态crc_end=crc16(Send_buf,6); //校验Send_buf[6]=crc_end%256; //校验低位Send_buf[7]=crc_end/256; //校验高位send_word(Send_buf,8); //发送返回屏}}if(Receive_buf[1]==0x03) //03功能码{crc_end=crc16(Receive_buf,6); //校验if(crc_end == Receive_buf[6]<<8|Receive_buf[7]) //校验一致{begin_address=(uint)Receive_buf[2]<<8|(uint)Receive_buf[3];address_leg=(uint)Receive_buf[4]<<8 | (uint)Receive_buf[5]; //总寄存器长度Send_buf[0]=Receive_buf[0]; //站号Send_buf[1]=Receive_buf[1]; //功能码legg=(uint)address_leg*2; //字节数Send_buf[2]=address_leg*2;; //字节数// for(time=0;time<legg;time++) //发送相应字节for(time=0;time<legg;time++){if(!(time%2)) //字高位为0Send_buf[time+3] = disp[time/2+begin_address]/256; //字高字节elseSend_buf[time+3] = disp[time/2+begin_address]%256; //字低字节}crc_end=crc16(Send_buf,legg+3); //校验Send_buf[legg+3]=crc_end%256; //校验低位Send_buf[legg+4]=crc_end/256; //校验高位send_word(Send_buf,legg+5); //返回屏}}if(Receive_buf[1]==0x06) //06功能码{begin_address=(uint)Receive_buf[2]<<8|(uint)Receive_buf[3]; //写入地址begin_add=begin_address; //32位数据输入时显示辅助用,先发送低16位,后发送高16位address_num=(uint)Receive_buf[4]<<8|(uint)Receive_buf[5]; //寄存器值crc_end=crc16(Receive_buf,6); //校验if(crc_end==Receive_buf[6]<<8|Receive_buf[7]) //校验正确{ii=1; //6X区数据输入标示address=begin_address;disp[begin_address]=address_num; //存入数组,给03功能码调用数值Send_buf[0]=Receive_buf[0]; //站号Send_buf[1]=Receive_buf[1]; //功能码Send_buf[2]=Receive_buf[2]; //开始高位Send_buf[3]=Receive_buf[3]; //开始低位Send_buf[4]=Receive_buf[4]; //字高位Send_buf[5]=Receive_buf[5]; //字低位crc_end=crc16(Send_buf,6); //校验Send_buf[6]=crc_end%256; //校验低位Send_buf[7]=crc_end/256; //校验高位send_word(Send_buf,8); //返回屏}}if(Receive_buf[1] == 0x02) //02功能码{crc_end=crc16(Receive_buf,6); //校验if(crc_end==Receive_buf[6]<<8 | Receive_buf[7]) //当校验一致时{Send_buf[0]=Receive_buf[0]; //站号Send_buf[1]=Receive_buf[1]; //功能码// Send_buf[2]=Receive_buf[5]/16*2; //字节数Send_buf[2]=0x02; //字节数Send_buf[3]=PORTB; //低位状态,即LED开关情况,开发板上拨码开关SW0-SW3Send_buf[4]=0; //高位状态crc_end=crc16(Send_buf,5); //校验Send_buf[5]=crc_end%256; //校验低位Send_buf[6]=crc_end/256; //校验高位send_word(Send_buf,7); //发送返回屏}}}void init_uart(void){COL8=1;//选通点阵管的左数第一列的LED,点阵管的左数第一列的LED作为显示LED PORTD=0;//先熄灭所有LEDRCSTAbits.SPEN = 1;//使能串口(将RX和TX引脚配置为串口引脚)TXSTAbits.SYNC = 0;//异步模式SPBRG = 10000000/64*(1*3+1)/9600-1;//波特率寄存器置值,设置波特率TXSTAbits.BRGH = 1;//速度模式:高速RCSTAbits.CREN = 1;//接收使能TXSTAbits.TXEN = 1;//发送使能IPR1bits.RCIP=1;//设定串口接收中断为高优先级,本句也可以省略,复位后默认为高优先级PIE1bits.RCIE=1;//串口接收中断允许INTCONbits.PEIE=1;//外设中断允许INTCONbits.GIE=1;//开总中断}void main(void){uint x;PORT_init(); /*调用端口初始化函数*/toppic_init();init_uart();while(1){x=low_type|hi_type<<8; //0X开关量16位对应的二进制值if(ii) //6X区数据寄存器重新输入显示对应值Display(address_num); //在开发板数码管上显示相应位的数值,发送或者接受数据会暂停显示(数码管闪烁)// Display(disp[begin_add-1]); //显示32位最高2字节数据elseDisplay(x); //0X区开关量重新输入显示对应值while(flag_finish) //当接收完成时{command(); //识别相应的功能码flag_finish=0; //重新接收}}}/*初始化函数*/void PORT_init(void){TRIS_AN=IN; /*设置RA0为输入*/COL8=1; /*选通点阵管的最左边第一列LED,点阵管的最左边一列LED作为显示LED*/ TRIS_COL8=OUT;TRISD=0X00; /*设置D口全为输出*/}/******************发送函数******************//***********发送一个字符即一个字节***********/void send(uchar num){while(! TXSTAbits.TRMT); //检测发送移位寄存器TSR是否空闲,1为空TXREG = num;//delayus(2);while(! PIR1bits.TXIF);}/**********************发送函数***********************//***********发送字符串或者一连串的字节数据************//****mydata表示要发送的字符串数组,num表示数组长度****/void send_word(uchar *mydata,uchar num){int i;for(i=0;i<num;i++){send(*(mydata+i));}count=0;}。

基于MODBUS协议的单片机与PLC通讯的设计

基于MODBUS协议的单片机与PLC通讯的设计

第1章绪论随着计算机、数字通信的快速发展,计算机控制已经拓展到全部的工业领域。

其中,单片机和PLC得到了长足的发展,在小规模的控制系统中得到了非常广的应用。

对工业系统来说,PLC与单片机的应用都比较普及,可是,两者都有各自的优缺点。

单片机的驱动能力比较弱,且无法驱动大功率、大电流设备的直接运行,因而在使用方面受到限定。

相比而言PLC则运行可靠、使用也相对简单、抗干扰效果好,而且负载驱动能力也比较强,所以适合在一些环境较差的地方工作。

可是PLC控制能力固然强,但是其结构锁闭,缺乏智能化,无法链接键盘等外部设备,所以在使用PLC时就必须要通过外部智能设备编程来实现控制。

想要进行弱电控制强电,必须要有智能程度较高的核心。

而单片机的智能化程度很高,在系统的设置和外部设备的管理中起着非常高的作用。

PLC和单片机联系可以提升PLC的数据处理功能,友好与简洁的人机交互也给用户提。

供了很大便利。

本次要实现基于modbus协议的单片机与plc通讯的设计,通过MX232接口。

转RS485接口转换电路,将单片机与PLC进行连接,单片机作为上位机向PLC发送数据,实现以51 单片机为核心,将输出信号通过RS485总线来与西门子S7-200PLC进行串口通信。

1.1主要任务以及目标通过查阅相关资料,了解51单片机及S7-200PLC通讯的发展概况;根据相关文献,深入学习51单片机及S7-200 PLC通讯系统各部分的组成以及控。

制的基本原理和方法;综合运用所学的模拟电子技术、数字电子技术、电力电子技术、无线通信技术、嵌入式等知识,进而查阅相关文献,研究51单片机及S7-200 PLC通讯的设计方法;根据要求,编写软件设计基于51单片机及S7-200的PLC各个功能模块;通过该设计,达到以下几个目标:提高分析和解决问题的能力;提高对所学知识的综合运用的能力;提高查阅有关文献的能力;获得工程设计的基本训练;提高动手操作能力。

PIC单片机MODBUS总线通信仿真资料

PIC单片机MODBUS总线通信仿真资料

串口接收中断处理结束
从机地址递增/延时
访问下一从机数据
图 3主机Modbus RTU通信模式报文处理流程图
9
3. CRC-16循环冗余校验
图4
MODBUS CRC-16 生成多项式及硬件描述
10
3. CRC-16循环冗余校验
11
Protues 原理图
12
PROTUES 仿真结果
13
END THANK YOU!
3
2. RS-485简介
所设计的电路中,主机(PIC16F877A)与所有 从机(PIC16F688)之间通过RS-485总线通 信。RS-485采用平衡发送和差分接收方式实 现通信,发送端将串口TTL电平信号转换成 差分信号由A、B两路输出,接收端再将差分 信号还原成TTL电平信号。由于传输线通常 使用双绞线,且采用是差分方式传输,因而 具有很强的抗共模干扰能力,总线收发器灵 敏度很高,可以检测到低至200mV电压。
图 2 RTU帧序列与帧格式示意图
8
4. MODBUS RTU 通信模式协议数据处理流程设计
开始
TIMER1 溢出
TIMER1中断处理开始
中断函数
系统初始化: 串口/定时器
主程序
TIMER1定时类型为?
开中断
从机扫描完毕?

结束
sl_Addr>0x04

1.使能MAX485发送 2.发送从机地址、命令、CRC校验码 3.置TIMER1为“帧”定时 4.“帧”定时到达标识位设为假 5.使能MAX485接收,缓冲索引归0 6.TIMER0为从机超时定时(0ms)
根 据 功 能 码 不 计 溢 出 的 0x0D,0x0A 确 定 该 字 段 累加和 长度

基于Modbus协议的触摸屏与PIC单片机的通信实现

基于Modbus协议的触摸屏与PIC单片机的通信实现
voidInitCom(void) { SPBRG=0x19;//设置波特率为 9 600; TXSTA=0x04;//选择异步高速方式 ; RCSTA=0x80;//允许同步串行口工作 ; TRISC6 =0;//将 C口的 RC6设为输出 ; T2CON=0x17;//定时器 2定时 3.6 ms; TMR2IE=1;//定时器 2中断允许 ; PEIE=1;//外围接口中断允许 ; RCIE=1;//USART接收中断允许 ; TXIE=1;//USART发送中断允许 ; GIE=1;//全局中断允许 ;
在 RTU模式下 , CRC校验域 [ 2] 包含 16 bit值 (用 2个 8位 的字符来实现 )。 其内容是通过对消息内容 进行循环冗 长检测 方法得出 。 CRC域附加在消息的最后 , 需要 注意的是添 加时先 是低字节然后是高字 节 , 故 CRC的高位字节是发送消息的最后 一个字节 。 根据 CRC校验码 , 可以检验数据传输的正确性 。 2 通讯系统设计 2.1 微处理器 PIC16F877
Modbus协议定义了一种通用的消息结构 , 描述了控制器请 求访问其他设备的一个过程 , 包括如何 回应来自 其他设备 的请 求 , 以及怎样侦测错 误并记 录 , 并制 定了消 息域 和内容 的公 共 格式 。 当在此网络上通信时 , 每个控制器 都拥有一 个唯一 的地 址 , 并识别按地址发 来的 消息 , 最终 决定 要产 生何 种动 作 。 如 果需要回应 , 则控制器将生成反馈信息并按此协议格式回应 。 1.2 Modbus通信数据传输模式
人机界面部分主要由威伦触 摸屏 、PIC单片机 、以及 电平转 换电路组成 。 单片机 完成 控制现 场 FPGA、数据 采集 和数 据处 理功能 , 威伦触摸屏 完成 数据显 示 、参数设 定 、以及 报警 功能 , MAX232芯片将 TTL电平 转换 为 RS-232电 平 。 PIC的 RC6、 RC7口设置为异步串行通讯模式 的输入输出 口 , 传 输速率 设置 为 9 600 kbit/s, 系统采用 20 MHz晶振 。系统通 讯连接图如图 2 所示 。

基于Modbus协议的单片机与触摸屏通信设计

基于Modbus协议的单片机与触摸屏通信设计

基于Modbus协议的单片机与触摸屏通信设计顾波飞;赵伟杰;吴开华【摘要】In order to solve the problems of human computer interaction of automatiac irrigation systeam, a kind of hunman computer interaction system was designed using touch panel as interface. The communication method was studied mainly between touch panel and micro controller unit for the automatic irrigation system which was powered by solar energy. Based on Modbus potocol, touch panel was used as host to sent data acquisition or operation request message and micro controller unit was used as slave to receive the request, judge the request and return the data and state or execute corresponding action. The research results show that the method solves the data real time communication between touch panel and micro controller unit for the automatic irrigation system which is powered by solar energy.%为解决太阳能自动灌溉系统中的人机交互问题,使用触摸屏作为人机界面设计了一种人机交互系统.重点研究了人机交互系统中单片机与触摸屏的通信方法,包括基于Modbus协议,触摸屏作为主机发出获取数据请求或操作请求,单片机作为从机接收并分析请求,返回相应的数据和状态或执行相应的动作.研究结果表明,该方法解决了太阳能自动灌溉系统中单片机和触摸屏之间的数据双向实时通信问题.【期刊名称】《机电工程》【年(卷),期】2012(029)001【总页数】4页(P104-107)【关键词】串行数据通信协议;单片机;触摸屏;自动灌溉;太阳能【作者】顾波飞;赵伟杰;吴开华【作者单位】杭州电子科技大学生命信息与仪器工程学院,浙江杭州310018;杭州电子科技大学生命信息与仪器工程学院,浙江杭州310018;杭州电子科技大学生命信息与仪器工程学院,浙江杭州310018【正文语种】中文【中图分类】TP393;TH390 引言太阳能自动灌溉系统结合光伏技术和测控技术,具有节能、节水等优点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PIC单片机与触摸屏串行通信的MODBUS协议实现
摘要:介绍一种在PIC单片机与触摸屏之间采用Modbus协议实现异步串行通信的方法。

简单介绍了Modbus通信协议,给出了硬件电路连接图、程序流程图以及用PIC单片机C语言编写的部分通信程序。

实际使用证明该方法数据传输稳定可靠,并提供了良好的人机交互环境。

关键词:触摸屏PIC单片机Modbus协议通信
工控中经常需要观察系统的运行状态或者修改运行参数。

触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。

单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。

触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。

Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议。

本文以PIC16F877单片机和人机电子有限公司的eView MT510T型触摸屏为例,介绍其通信程序的开发过程。

1 系统结构
实现触摸屏与单片机的通讯,主要是解决通讯协议的问题。

本文使用开放的Modbus通讯协议,以触摸屏作主站,单片机作从站。

eView触摸屏本身支持Modbus通讯协议,如果单片机也支持Modbus协议,就可以进行通信了。

触摸屏与单片机之间采用的RS-232C兼容接口直接连接,传输速率设置为9600kb/s。

图1为该系统的电路图。

将PIC16F877单片机RC6、RC7口设置为异步串行通信模式,经过MAX232芯片将TTL电平转换为RS232电平,再与eView触摸屏PLC[RS-232]接口相连,即完成了硬件连接。

eView触摸屏PLC[RS-232]接口的管脚2为TXD,管脚3为RXD。

2 Modbus通信协议介绍
Modbus 通信协议是一种串行的主从通信协议,网络里仅有一台设置可作为主机(称Master),其它设备作为从机(称Slaver),主机不需编号,从机必须编号。

协议定义了主机查询及从机应答的信息帧格式。

通信时,主机首先向从机发出请求信息,符合相应地址码的从机接收通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务,然后把执行结果返给主机。

若从机接收到的校验码与本机计算的不同,则说明数据在通信过程中出现错误,从机把这次请求视为无效,功能代码将被修改以用于指出
触摸屏与单片机的通信程序采用PIC单片机C语言编写。

编译工具选择Hitech公司的PICC编译器。

程序共分三大模块,即初始化模块、数据接收模块以及数据处理及发送模块。

主程序流程图如图2所示。

PIC16F877 单片机USART功能模块带有一个八位的波特率发生器BRG,BRG支持USART的同步和异步工作方式。

用SPBRG寄存器控制一个独立的八位定时器的周期。

在异步方式下,发送状态/控制寄存器TXSTA的BRGH位(即D2)被用来控制波特率。

对串行口进行的初始化如下:
GIE=1; %全局中断允许;
SPBRG=25; %设置波特率为9600;
TXSTA=0x04;%选择异步高速方式;
RCSTA=0x80; %允许同步串行口工作;
RTISC6=1;
TRISC7=1;%将C口的RC6和RC7设置为异步串行通信模式;
PFIE=1; %外围接口中断允许;
RCIE=1; %USART接收中断允许;
TXIE=1; %USART发送中断允许;
数据接收模块由一个中断函数组成。

该中断函数将触摸屏发来的Modbus数据帧存储在一个自定义的数组中,当一帧数据接收完时,置接收结束标志位为1,转入数据处理及发送模块。

串行通信接收器的核心是接收移位寄存器RSR,当接收到停止时,如果RCREG缓冲器为空,RSR就把接收到的数据送入RCREG。

传送完成后,接收中断标志位RCIF被置1。

实际的中断是否被CPU响应,可以通过设置外围接口中断允许寄存器PIE1的中断允许位RCIE来控制。

相关文档
最新文档