技术频道

一种基于MODBUS的嵌入式人机界面的设计与实现

一、设计概要

现场总线是一种用于底层工业控制和测量仪表之间的总线,人机界面设备就是作为现场总线中,控制器和操作者之间的“通信员”它可以完成现场控制器与操作者之间数据的接收和发送。本设计使用Atmel单片机89C52作为主要控制芯片,用以东芝丁6963C为控制芯片的128*64液晶比O作为显示界面,采用工业标准通信协议MOOBUS作为数据信息交互的介质,主要功能是完成对工业网络中现场控制器数据的采集显示,根据需要设定数据并发送到现场控制器完成控制任务,实现人机之间控制信息的交互传送。文章分别介绍了硬件设计电路和软件的设计过程,并介绍了一种好用和简单的MOOBUS从设备调试工具——Modbus slave。

设计中使用128*64LCD实现显示界面如图1所示,其中“实际值”显示从现场取要的数据,“设定值”是由操作者设定并已传入现场设备的参数,“操作值”显示操作者可以修改但还未发送到现场设备的数值。最后一行用来指示4个按键。

二、硬件部分设计

系统硬件电路框图如图2。

电路部分十分简单,包括看门狗电路、4个按键的直接连接、程序扩展电路、RS232电平转换部分、液晶点阵连接部分。
MAX7OS的功能是:上电复位程序监视。89C52正常工作,执行喂狗程序时,不断从P17输出脉冲信号至MAX705的WDI脚,当单片机程序“跑飞”后,Pl.7不再输出脉冲信号MAX705的WDI脚在1.6S内收不到脉冲信号,将在MAX70S的RESTE端产生高电平,产生复位信号,将单片机复位,迫使程序复位到入口处。
针对AT89C52硬件资源比较丰富,考虑采用直接方式设计键盘电路,而且可以简化电路。键盘采用4个开关直接控制。开关的一段通过电阻连接电源和AT89C52的P10~P13管脚,而另一端接地。由于P10~P13是低电平工作,当不同的开关接通时,根据采集到不同端口是高还是低电平,来执行相应的按键子程序。
考虑到使用LCD具有较强的表现能力和丰富的表现方式,所以扩展了32K的EPROM27256。是为实现产品升级,完成丰富菜单,强大功能,表现动画准备的。
128*64液晶显示器LCO采用直接访问方式,直接访问方式是把内置T6963C控制器的液晶显示模块作为存储器或I/O设备直接挂在单片机的总线上。模块的数据线接单片机的数据总线上,片选及寄存器选择信号线由单片机的地址总线提供,读和写操作由单片机的读写操作信号控制。按口电路如图2所示,在图中使用了地址线AS作为模块的寄存器选择线C/D,使用地址线A15作为模块操作的片选线;模块的VO端所接的电位器是作为液晶驱动电源的调节器,调节显示的对比度。使用该种连接方式,不用考虑T6963C的时序图,不用对LCD的管脚进行单独的操作来满足时序,就像读写外部RAM一样,笔者认为比采用要在程序中实现时序的间接访问连接方式方便。
考虑到在常温下,LCD的额定电流为0。4ma所需的功率很小,再加上RS232串口集成电路MAX232有两路发送器、两路转换器,使用其中一套完成电平转换用来通信,另一套正好用来产生-10V,该电压由MAX232的14端供LCD显示画面使用。

三、软件设计部分

下面介绍软件部分,主要完成一下功能按键的查询和响应、画面的显示和刷新通过MOOBUS协议完成数据的接收和传输通信。
软件结构清晰,按模块分为三大块主程序部分、T0定时中断、串口中断部分。
(1)主程序部分
主程序流程图如图3所示,主要完成一些初始参数的设定,其中LCD的初始化包括:液晶屏的尺寸光标的位置和形状等这部分程序在购买LCD时厂家会附带的,根据需要修改一下即可满足要求;还有就是将需要显示的汉字进行编码。定时器使用的是T0选择方式1,采用50ms中断查询按键,考虑到还有串口中断,使用了默认的中断优先级,即T0中断高于串口中断。这种安排已通过试验调试。在等待中断部分安排了循环执行喂狗程序目的是在程序正常执行时起到“看门狗”的作用,在等待中断过程中系统又不认为是“死机”。

main:
Icall clearmemory;清内存
Icall initlcd;初始化Icd
mov sp,#stackpointer;堆栈为65h
mov tmod.#21h:t0方式1,t1方式2
mov radixcursor.#10h
mov currentpagenumber,#01h;指定初始
页号为1
mov page number,currehtpagenumber
setb es
setb ea
mov th1,#Ofdh;设定波特率9600bps
mov tl1.#Ofdh
setb tr1;启动定时器t1
mov scoh.#Od0h
mov 2ch,用来辅助发送
mov 2bh.#10h
Icall setuptimer0;初始化定时器t0,并启动t0
setb ren
Icall chaxuhsj;发送查询命令
Icall showpage;显示页面
dieloop:
nop
Icall feeddog;执行喂狗程序
jmp dieloop;循环等待中断
(2)T0定时中断部分

流程图如图4所示,这部分主要功能是完成按键的查询,并转去执行相应的子程序本系统中一共有四个编程键,依次可实现修改数据、增加值、减少值和翻页功能。当我们按下修改键后(即光标被激活)修改键可以用来移动光标位置此时按增加键和减少键可以分别增加和减少数值。其中翻页键是一个复用键如果直接按翻页键(不激活光标),那么它的功能就是在不同的页面之间切换,并从现场收集各页数据并显示到LCD上:而当光标处在被激活状态下时,按下翻页键就可以向现场控制器(如DSP)发送数据达到控制目的这种“一键复用”的设计,在电子商品中特别常见通过软件的设计减少了按键的数量,是一个比较有实际价值的设计已被广泛使用。键盘采用50ms定时中断设计,一般人手按键的起落时差远大于50ms所以可以满足设计要求而且在后面软件部分进行了去抖动,等待按键抬起功能的设计。timer0int:
pushdph
pushdpl
pushacc
pushpsw
movthi0。#4bh
movtl0。#Dfdh
clrtr0;关定时器
movp1,#Offh;置p1口为输入状态
mova,p1;读按键
epla
anda,#00001111b;屏蔽高4位
jzgoret00;无键按下
movpgbkey,a
Icalldelay;有键按下delay10ms去抖动
Icallwait;等待按键抬起
Icallseankey;转去执行相应的按键子程序
goret00:
setbtr0;开定时器
poppsw
popacc
popdpl
popdph
ren
(3)串口中断部分
这部分的主要功能是通过MODBUS协议完成数据的查询和发送。先对MODBUS做个简单的介绍该协议通信使用主从技术,即仅主设备能初始化传输(查询)其它设备(从设备),根据主设备查询提供的数据作出相应反应。按传输模式分为ASCII和RTU方式。本设计采用RTU方式。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。每个消息必须以连续流的方式传输。
MODBUS协议建立了主设备查询的格式设备地址、功能代码、所有要发送的数据、错误检测域从设备回应消息也由MODBUS协议构成,包括确认要行动的域、任何要返回的数据和错误检测域。如果在消息接收过程中发生错误或从设备不能执行其命令,从设备将建立错误消息并把它作为回应发送出去。
查询查询消息中的功能代码告之被选中的从设备要执行何种功能数据段包含了从设备要执行功能的任何附加信息例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量错误检测域为从设备提供了一种验证消息内容是否正确的方法。
回应:如果从设备产生正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应数据段包括了从设备收集的数据:像寄存器值或状态。如果有错误发生功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。
举一个关于功能码03H的例子。
主站询问报文格式:

从站应答格式:

serialportint:
push dph
push dpl
push acc
push psw
jbc ri, receive
Icall chaxunsj;发送查询命令
sjmp return
receive:
mov r0 ,2bh;指定用来存接收数据的地址指针
mov a,sbufall
clr riall
mov @r0 ,a
inc 2bh
mov a,2bh
Icall crc;进行crc校验
Icall showpage
return:
pop psw
pop acc
pop dpl
pop dph
reti

笔者使用了Modbusslave软件仿真下位机,模拟MOD-BUS的从设备。通过该软件,用所设计人机界面可以读取具体设备的具体各类寄存器的数据,同样可以写数据到指定设备中指定的各类寄存器中,这样就完成了数据的接收和传送。

文章版权归西部工控xbgk所有,未经许可不得转载。