基于Modbus的飞思卡尔单片机与MCGS触摸屏通信的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Modbus的飞思卡尔单片机与MCGS触摸屏通信的实
现
刘先越; 朱娜; 郭隆军
【期刊名称】《《机电设备》》
【年(卷),期】2019(036)004
【总页数】7页(P28-34)
【关键词】船舶电力系统; ModbusRTU; 飞思卡尔单片机; MCGS触摸屏
【作者】刘先越; 朱娜; 郭隆军
【作者单位】中国人民武装警察部队海警学院浙江宁波 315801; 中国舰船设计研究中心湖北武汉 430064; 中国船舶重工集团第七一一研究所上海 201108
【正文语种】中文
【中图分类】TN91
0 引言
传统的PLC与触摸屏进行通信实现人机交互的方式虽然有着功能可靠、触点多等优点,但随着船舶电力系统集成度变高,PLC的数据处理和管理能力已无法满足现代船舶要求。
因此,随着单片机嵌入式系统在船舶领域应用越来越广泛,在Modbus协议下的单片机与触摸屏人机交互控制方式得以实现。
根据船舶环境恶劣、工况复杂等特点,本文采用成本低、可靠性高、抗干扰性强的飞思卡尔单片机与昆仑通态 MCGS进行通信试验,详细阐述了 MCGS触摸屏所支持的Modbus
RTU协议指令系统的组成及其应答格式,软件设计和试验测试。
1 Modbus RTU协议
1.1 Modbus RTU报文格式
Modbus通信协议是工业中最开放、通用的协议之一,该协议采用主从应答通信,详细规定了主从应答通信行为,定义了设备能够识别和使用的报文结构。
Modbus 报文帧分为ASCII帧和RTU帧,两种帧格式只在起始位、结束符和校验码上有所区别,其中,RTU帧被MCGS中的“莫迪康Modbus RTU”设备驱动所支持。
这里只介绍RTU帧,ASCII帧可以参考该介绍。
RTU报文帧格式见表1。
使用RTU帧的报文发送需延时≥3.5个字符;设备地址及功能码为1字节;数据区由n个字节组成,每个字节8位;校验区为16位,分两个字节承载低八位和高八位。
表1 RTU报文帧格式帧格式所占字符数起始位≥3.5字符设备地址 8位功能代码
8位数据 n个8位CRC校验 16位结束符≥3.5字符
网络设备不断侦测网络总线,包括停顿间隔;每个设备都进行解码,以判断数据是否是发给自己的;在最后一个字符结束之后,当接收数据延时≥3.5个字符后,一
个新的报文可在此之后开始[1]。
1.2 常用功能码及收发格式
触摸屏与单片机之间的通信为主从通信,触摸屏是主机,单片机是从机。
触摸屏根据画面编辑的控件,不断发送位、字的读或写的指令,单片机不断应答指令[2]。
在MCGS触摸屏内置通讯子设备中没有单片机这样的定制设备[3],因此只有了解MCGS触摸屏所发命令的意义及应答方式,才能在单片机中写入对应的程序进行
应答。
下面从寄存器类型及功能码的角度来解读常用报文的意义。
寄存器及功能码说明见表2。
表2 寄存器及功能码说明[4]寄存器读取功能码写入功能码功能码说明[1区]输入继电器 02 — 02:读取输入状态[0区]输出继电器 01 01:读取线圈状态05 05:强制单个线圈15 15:强制多个线圈[3区]输入寄存器 04 — 04:读输入寄存器[4区]输出寄存器 03 03:读保持寄存器06 06:预置单个寄存器16 16:预置多个寄存器
1)继电器类型
继电器分为输入继电器和输出继电器。
输入继电器为只读类型,所以只有“02读取输入状态”一项功能码;输出继电器则可选择相应的功能码对其进行读写操作。
读输入继电器(读取线圈状态)时,主机(MCGS触摸屏)发出指令帧格式见图1,从机(单片机)回应的报文帧格式见图2。
图1 主机(MCGS触摸屏)发出指令帧格式
图2 从机(单片机)回应的报文帧格式
输出继电器为可读写类型,在MCGS组态软件里面可以选择其只读、只写和读写的属性。
在读输出继电器时,主机发出和从机返回的帧跟读输入继电器格式相同,只是功能码变为了 01。
强制单个线圈时主机发出帧格式见图3,应答时只需将主机发出帧原样返回即可。
在需要批量下达开关指令的时候,可以选择功能码 15,此时主机发出帧格式见图 4、应答帧格式见图5。
图3 强制单个线圈时主机发出帧格式
图4 功能码为15时的主机发出帧格式
图5 功能码为15时的主机应答帧格式
2)寄存器类型
寄存器包括输入寄存器和输出寄存器。
输入寄存器为只读类型,只有“04读输入寄存器”一种功能码;输出寄存器是可读写类型,读取时用03功能码,写单个寄存器用06,同时写多个寄存器则用16。
读输入寄存器时,主机发出指令格式见图6,应答帧格式见图7。
图6 读输入寄存器主机发出指令格式
图7 读输入寄存器时的应答帧格式
输出寄存器的读取和输入寄存器格式一致,只是将功能码换为03。
和输出继电器一样,输出寄存器的写入也有两种功能码可选:1)06,写单个寄存器;2)16,写多个寄存器。
预置单个寄存器时主机发出帧格式见图 8。
单片机正确执行该命令后返回与接收到的命令帧相同的应答帧。
预置多个寄存器时主机发出帧格式见图9,其中字节数为下置数据数×2。
单片机应答帧格式见图10。
图8 预置单个寄存器时主机发出帧格式
图9 预置多个寄存器时主机发出帧格式
图10 单片机应答帧格式
1.3 CRC校验码的生成
Modbus RTU采用16位循环冗余校验码(CRC)对接收数据进行校验,以判断接收数据的正确性。
它由传输设备计算后加入到消息中,接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值进行比较,如果不同,则有误[5]。
其流程图设计见图11。
图11 CRC码生成函数
2 飞思卡尔单片机Modbus协议软件设计
2.1 异步串行通信初始化设置
异步串行通信是单片机基本系统实现通信功能的一般方法。
如果说Modbus RTU 协议规定了应当收发哪些字节,那么异步串行通信则规定了每个字节如何收发。
在飞思卡尔八位单片机中,波特率的计算公式为
S=fBUSCLK/(16×fBR)
式中:fBR为波特率寄存器SCIBD后13位用户自己设定的分频值;fBUSCLK是
单片机的总线频率,在此选用的是16 M总线频率。
可以算出SCIBD应当给定的
值为0x0068。
按照前面所述的要求,SCI要实现的基本功能为:以9 600 bps的波特率接收和发送数据,每个数据包含8位二进制,在此无需奇偶校验,加上停止位和接收位,
每个数据为10位二进制位。
数据的发送和接收方式有中断和查询两种方式,这里选择查询方式。
综上所述,SCI的初始化可以描述为:接收和发送器使用 8位数据字符
SCIC1_M=0,无奇偶校验SCIC1_PE=0;波特率为9 600,SCIBD值为0x0068;发送器打开 SCIC2_TE=1;发送数据不倒置SCIC3_TXINV=0;不启动发送中断SCIC2_TIE=0;接收器打开 SCI1C2_RE=1;不启动接收中断SCI1C2_RIE=0。
2.2 数据发送和接收
1)设置接收和发送缓冲器
Modbus报文帧由一串字符组成,而SCI一次只能接收或发送一个字符,所以接
收和发送都需要进行多次才能完成。
因此,发送和接收需要将数据存入有一定长度的缓冲区中。
在此设置数组Sendbuf[]作为发送缓冲器,发送前要将报文帧的每个字符依次放入Sendbuf[]中,装配完成后按顺序逐个发送;对于接收,同样设置数组 resvbuf[]做接收缓冲器,从接到接收起始位开始,将接收到的数据逐次放入resvbuf[]中,直到结束符的到来。
2)数据的接收
考虑到结束符的识别,数据的接收采用了查询方式。
为了兼顾CPU工作效率,这
里采用定时中断。
在中断程序中查询接收寄存器是否已满,满时接收数据到resvbuf[n]中(n初始值为 0,从起始位开始每接收一个字符,n加 1),如果接
收寄存器不满,则计时器加1,当计时器计数到4 ms时,置位帧接收完成标志,中断子程序流程,见图12。
3)数据的发送
数据发送的重点在于发送缓冲器的装配。
根据Modbus RTU报文帧的格式,Sendbuf[0]中放入设备地址,Sendbuf[1]中放入相应功能码,单片机根据接收命令的功能码进入相应的子程序执行命令并装配中间数据,最后两个字节放入CRC 的低八位和高八位。
例如,接收到的信息功能码为04时,进入读寄存器值子程序,其流程见图13。
2.3 主程序
主程序中首先要完成各功能的初始化,初始化完成后进入主循环,扫描帧接收完成标志 Reflag,当Reflag置位时,读取接收到的指令。
首先进行地址和CRC的校验,出错则跳过处理过程等待下一命令的到来;如校验无误,则读取功能码,按照功能码要求进入相应的子程序,完成对设备的控制或读取相关寄存器的值,并装配发送缓冲器,然后做出应答。
主程序流程见图14。
图12 定时中断数据接收子程序
图13 读输入寄存器子程序
图14 主程序流程
3 试验测试
3.1 硬件连接
由于Modbus功能码众多,这里选择比较典型的通信方式进行试验测试。
1)读输入寄存器。
从PTE3和PTE4两个端口读入两个DS18B20温度传感器测得的温度值存入寄存器tvalue[0]和tvalue[1]中,再经串口发送至触摸屏显示。
2)读输入继电器。
从PTG4和PTG5两个端口读入开关信号发至触摸屏和屏幕上两个指示灯建立连接,开关闭合指示灯变红,关断时指示灯变绿。
3)写输出继电器。
触摸屏界面设开关按钮一个,和单片机 PTA0建立连接来控制一个继电器,按下一次,继电器导通,再次按下时关断。
硬件方面,单片机选择飞思卡尔 8位单片机MC9S08DZ60,串口选择RS232承
载信息,在此需扩展一片MAX232,用于把RXD、TXD的TTL电平转换成
RS232电平。
电器连接见图15。
图15 飞思卡尔MC9S08DZ60单片机与触摸屏间通信测试电路图
3.2 MCGS组态软件设置
1)主界面
主显示界面设置如图16所示。
两个文本框显示两个温度传感器检测到的温度值,文本框属性设置中勾选显示输出,显示输出界面表达式中设置数值型变量T1和T2,用于存放温度值。
为了保证精度,在单片机中将温度传感器检测的温度扩大10倍进行传输,这里表达式应填入
T1/10和T2/10以还原温度值,勾选“单位”输入“℃”。
输出继电器按钮一个,操作属性选“抬起功能”,勾选“数据对象操作”,选择“取反”,将对应变量设置为一个开关型变量k1,k1=1时继电器导通,k1=0时关断。
图16 MCGS主界面设置
输入继电器指示灯两个,属性中,选择动画连接选项,表达式中设置开关型变量i,i=0指示灯为红色,i=1时指示灯为绿色。
另一指示灯的变量设置为i1。
2)设备窗口
主站选择通用端口父设备,设备属性中设置串口号为“0-COM1”,波特率选择“9 600 bps”,数据位数为“8位”,数据校验选择“无校验”。
从站选择“莫迪康Modbu sRTU”,属性选择默认值,设备地址设置为1。
在设备编辑窗口添加设备通道,使预设变量和单片机寄存器建立联系,两个开关输入选择“输入继电器”,地址“257”(注意这里的地址是十进制,换算成十六进制则为0x0101),通道数为2,如图17所示。
一个输出继电器地址设置为
“01”,通道数为1;两个温度值则选择“输入寄存器”,地址填“2001”,通道数为2。
图17 添加设备通道属性选择
设置完成后,设置编辑窗口显示已添加的通道,然后双击连接变量一栏,将通道与前面设置的变量建立连接,如图18所示。
图18 已添加通道与变量的连接
3.3 调试结果
将单片机串口端子与MCGS触摸屏连接,启动调试后,触摸屏文本输入框显示当前温度值,加热传感器,可以看到其中一个文本框中数值的升高(注:本地室内温度值约为22.5℃);按下继电器按钮,继电器闭合指示灯亮起,如图19所示;按下单片机键盘上的G5按钮,可以看到触摸屏上输入继电器指示灯变红,如图 20所示。
结果表明,飞思卡尔单片机与 MCGS触摸屏之间通信实现,可以应用在船舶电力系统中。
图19 温度显示及继电器按钮调试结果显示
图20 开关输入调试结果
4 结束语
通过分析Modbus RTU各个功能码下报文的收发格式及内容,掌握Modbus RTU报文的解读方法及响应方法,从而编译出对应的报文收发程序,结合飞思卡尔 8位单片机 MC9S08DZ60,完成了部分 Modbus通信协议的应用,并连接MCGS触摸屏实现了单片机到触摸屏的通信,完成了人机交互系统的设计。
该设计在数据处理能力上满足现代化船舶电力系统要求,可靠性高,抗干扰能力强,同时能大大降低系统运营成本。
如果需要实现更多、更复杂的功能,可在此基础上可以加入更多的探测器及继电器来完善系统。
参考文献:
【相关文献】
[1]冯冬琴, 王酉, 谢磊.工业自动化网络[M].北京:中国电力出版社, 2011.
[2]尤慧芳.用MODBUS实现触摸屏与单片机的通信[J].工业控制计算机, 2008(12): 63-64, 66.
[3]王旭, 吴栋, 董庆源.基于 Modbus协议的触摸屏与单片机通讯控制[J].电子制作, 2015(9): 9.
[4]北京昆仑通态自动化软件科技有限公司.MCGSTPC7062KX用户手册[Z].2012.
[5]尤慧芳.Modbus RTU单片机通信程序编写方法[J].工业控制计算机, 2009(12): 86-87.。