0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

拓普微智能液晶显示模块HMI自定义通信协议

Topway_LCD 2021-12-09 14:01 次阅读

一. HMI与通讯协议

随着工业技术的发展,HMI(人机界面)的应用领域愈加广泛。通过拓普微的智能液晶显示模块实现的自定义通信协议能在一定程度上维护企业的数据隐秘性,提升产品功能的多样性,并且能够解决企业通信协议不兼容问题。

HMI的串口通信规则,除了标准Modbus协议产品,大多都是根据原厂制定的协议规则进行。然而许多企业也有其各自的通信规则及报文格式,在配套使用HMI开发应用时,企业希望保留或使用自己的功能特性和数据交互规则,用以匹配自己协议的应用开发。

基于此,拓普微的HMI串口屏有一套较为成熟的设计方案。本文将介绍智能显示模块HMT050DTA-D如何基于LUA脚本设计实现,在原厂提供的库函数中,有开放串口控制类的API,通过这些API函数能够实现企业的自定义通信协议设计。

二. 自定义通讯协议

此次设计将通过拓普微的智能液晶屏HMI的串口,配合LUA程序,应用串口控制类API,实现目标协议通信功能。

HMI串口通信协议,常见的报文格式一般由“帧头”、“长度码”、“功能码”、“参数数据信息”、“帧尾”、“校验码”几个部分组成。通信过程中,系统将实时查询串口的数据接收,获取符合协议的报文数据,执行规定的指令功能。

如下“表2-1:自定义协议通信报文格式”,定义了一种常见的通信报文格式。(硬件串口参数说明:波特率“115200”;数据位“8”;停止位“1”;校验如下表)

表2-1:自定义协议通信报文格式

*1. 指令长度码,计算“命令码”到“校验码”中所有数据的字节总数。
*2. 指令地址、数据、参数信息,是多字节数据,数据都是高位在前,低位在后。
*3. 指令校验码,计算“帧头”到“帧尾”中所有的数据的ModbusCRC-16校验。

三. 功能需求分析

1. HMI原通信协议屏蔽

目前使用的型号HMT050DTA-D默认是TOPWAY协议通信的,存在指令错误码回复机制。因此在自定义协议通信过程中,如果没有屏蔽原协议,可能会存在串口占用,回复数据混乱的情况。所以在设计自己协议通信时首先要把原厂的协议屏蔽,避免数据冲突。

2. 接收指令数据处理与解析回复

获取串口数据后,需要提取符合自定义协议规则的指令以便后续对指令进行解析并执行指令功能。因此需要定义接收指令数组,用以存储串口中符合协议规则的指令数据。

协议通信中,也存在指令回复功能,比如读取/访问地址数据的指令。在解析完接收到的指令后,我们要对部分指令进行响应,所以需要定义回复指令数组,对读取/访问操作的指令进行回复。

3. 协议通信指令功能要求

在LUA程序设计中,需要实现的功能板块有:①从串口接收区中获取符合规定自定义规则的指令,存储在接收指令数组;②调用接收到的指令数据,对指令数据进行解析;③调用相应的功能处理函数,执行指令功能。对于读取/访问信息类的指令,还需要操作串口发送数据进行回复。

解析的指令目前主要实现4功能板块。①功能码“0x01”:访问/读取变量数据;②功能码“0x02”:改写变量数据;③功能码“0x03”:工程显示跳页;④功能码“0x04”:屏幕背光亮度控制。主要板块功能关系如图3-1所示。


图3-1 协议通信主要功能板块

四. Lua实现自定义协议

1. 屏蔽原厂通信协议

在拓普微提供的LUA库函数中存在TOPWAY协议禁用函数,可以在程序初始化时调用该函数对原厂的通信协议进行屏蔽。如图4-1

调用函数:hmt.bypass(is)
输入:参数“is”使能开关。
使用说明:当“is=1”时屏蔽原TOPWAY协议,“is=0”时使用TOPWAY协议。

2. 自定义协议的数据结构

2.1 接收指令数组

定义数组:CustProt_recvcmd = {}
类型:全局数组,初始化时定义。
说明:存储串口接收区中符合协议规则的指令数据。接收指令数据过程中,如过不符合定义的规则,需清空接收数组。

2.2 回复指令数组

定义数组:CustProt_sendcmd = {}
类型:全局数组,初始化时定义。
说明:根据协议规则,存储需要通过串口进行回复的指令数据。发送完成后清空数组。


3. 自定义协议设计实现

LUA程序设计,主要实现函数功能见流程图4-2。

3.1 检查串口接收区数据

调用函数:hmt.uartisempty()
输出:返回“1”时表示串口接收buf为空;返回“0”时表示串口接收区存在数据。
使用说明:使用该函数判断串口接收区是否存在数据。等于0时再去执行指令获取函数。

3.2 获取符合自定义协议的指令数据

构造函数:get_CustProtrecvcmd()
输出:接收指令数组 CustProt_recvcmd。
说明:将符合自定义协议的指令存储在全局的接收指令数组;期间会对指令中帧头、帧尾、长度码3种类型的数据格式进行判断。不符合自定义协议时将清空指令数组。

调用函数:hmt.getchar()
输出:串口接收队列的第一个字节数据。
使用说明:在函数get_CustProtrecvcmd()中,获取符合自定义协议指令时会频繁调用该函数,对串口接收区的数据进行筛选。

3.3 自定义协议的数据检查及校验

构造函数:CmdCheck(CustProt_recvcmd)
输入:接收指令数组 CustProt_recvcmd。
说明:函数会对接收指令数组中的数据码和校验码2个类型的数据格式进行判断。不符合自定义协议时将清空指令数组,回复错误码,并重新开始获取指令。

3.4 指令数据解析

构造函数:CmdHandle(CustProt_recvcmd)
输入:接收指令数组 CustProt_recvcmd。
说明:函数根据指令中的功能码,分类处理指令数据,如数字数据和字符串数据。

3.5 执行指令功能

3.5.1 读变量数据功能

构造函数:_ReadvariableReturnCmd (Addr)
调用函数:hmt.readvp16(Addr)\hmt.readvp32(Addr)\hmt.readvpstr(Addr)等。
输入:自定义协议中指令的地址数据。
说明:当功能码为“0x01”时使用该函数处理,函数将根据指令中的地址类型,分类调用hmt读变量函数,读回数据并存储在回复指令数组,最后通过串口发送返回。

调用函数:hmt.putchar(byte)
输入:指令字节数据。
说明:读取后回复指令时,会频繁调用该函数,将回复指令数组中的数据通过串口发送。

3.5.2 写变量数据功能

构造函数:_Writevariable(addr, value)
_Writevariable1(addr, strvalue)
调用函数:hmt.writevp16(Addr, value)\hmt.writevp32(Addr, value)\hmt.writevpstr(Addr, strvalue)等。
输入:“Addr”自定义协议中指令的地址数据,“value/strvalue”自定义协议中需要写入变量的数字数据或字符串数据。
说明:当功能码为“0x02”时使用该函数处理,函数将根据指令中的地址类型,分类调用hmt写变量函数,将数字数据或字符串数据写入相应的变量。

调用函数:string.char(byte)
输入:接收自定义指令中的字节。
输出:字符数据。
使用说明:写入字符串变量时,需要通过该函数将数字指令数据转成字符数据写入变量。可以配合字符串连接符“..”转成字符串数据。

3.5.3 工程跳页功能

调用函数:hmt.changepage(pageid)
输入:“pageid”自定义协议中指令的页面ID信息。
使用说明:当功能码为“0x03”时使用该函数处理,CmdHandle中会处理自定义指令中双字节的ID信息为数字数据,然后将数字数据传入该函数,跳转到指定页面。

3.5.4 设置屏幕背光功能

定义数组:setBLcmd = {0x5F, 0x00}
类型:局部数组,在函数CmdHandle中定义。
说明:函数CmdHandle会将自定义指令中亮度值传入数组setBLcmd的第二个字节;配合hmt库函数hmt.runcmd(cmdtable, len)使用,用以执行内部调光指令。

调用函数:hmt.runcmd(cmdtable, len)
输入:“cmdtable”内部指令数组,“len”调用数组长度。
使用说明:当功能码为“0x04”时使用该函数处理,调用局部数组setBLcmd,执行自定义协议的调节背光功能。

五. 结语

本文所介绍的使用拓普微智能液晶显示模块测试通信协议,旨在引出通信协议实现的一种思路,因为工业控制物联网智能家居、环境监控、数据安全等领域,应用层的功能设计很大程度会影响甚至决定协议层的数据传输格式。

智能显示模块HMI的串口自定义协议通信的实现,用户可以按照自己的需求灵活设计协议规则,控制产品实现期望功能,在一定程度上为应用的功能设计提供了新的解决方案。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信协议
    +关注

    关注

    28

    文章

    838

    浏览量

    40208
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4400

    浏览量

    166850
  • 液晶屏
    +关注

    关注

    18

    文章

    712

    浏览量

    42715
  • 串口通信
    +关注

    关注

    34

    文章

    1607

    浏览量

    55361
  • HMI
    HMI
    +关注

    关注

    9

    文章

    579

    浏览量

    48404
收藏 人收藏

    评论

    相关推荐

    PROFINET通信协议是什么

    PROFINET通信协议是一种专为工业自动化领域设计的基于以太网的实时通信协议。以下是对PROFINET通信协议的详细解析,包括其定义、特点、体系结构、工作原理、
    的头像 发表于 09-25 18:13 694次阅读

    创建自定义的基于闪存的引导加载程序(BSL)

    电子发烧友网站提供《创建自定义的基于闪存的引导加载程序(BSL).pdf》资料免费下载
    发表于 09-19 10:50 0次下载
    创建<b class='flag-5'>自定义</b>的基于闪存的引导加载程序(BSL)

    NVIDIA NeMo加速并简化自定义模型开发

    如果企业希望充分发挥出 AI 的力量,就需要根据其行业需求量身定制的自定义模型。
    的头像 发表于 07-26 11:17 649次阅读
    NVIDIA NeMo加速并简化<b class='flag-5'>自定义</b>模型开发

    HarmonyOS开发案例:【 自定义弹窗】

    基于ArkTS的声明式开发范式实现了三种不同的弹窗,第一种直接使用公共组件,后两种使用CustomDialogController实现自定义弹窗
    的头像 发表于 05-16 18:18 1212次阅读
    HarmonyOS开发案例:【 <b class='flag-5'>自定义</b>弹窗】

    AWTK 开源串口屏开发(18) - 用 C 语言自定义命令

    编写代码即可实现常见的应用。但是,有时候我们需要自定义一些命令,以实现一些特殊的功能。本文档介绍如何使用C语言自定义命令。1.实现hmi_model_cmd_t接口
    的头像 发表于 05-11 08:24 400次阅读
    AWTK 开源串口屏开发(18) - 用 C 语言<b class='flag-5'>自定义</b>命令

    TSMaster 自定义 LIN 调度表编程指导

    LIN(LocalInterconnectNetwork)协议调度表是用于LIN总线通信中的消息调度的一种机制,我们收到越来越多来自不同用户希望能够通过接口实现自定义LIN调度表的需求。所以在
    的头像 发表于 05-11 08:21 554次阅读
    TSMaster <b class='flag-5'>自定义</b> LIN 调度表编程指导

    HarmonyOS开发实例:【自定义Emitter】

    使用[Emitter]实现事件的订阅和发布,使用[自定义弹窗]设置广告信息。
    的头像 发表于 04-14 11:37 945次阅读
    HarmonyOS开发实例:【<b class='flag-5'>自定义</b>Emitter】

    鸿蒙ArkUI实例:【自定义组件】

    组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 `Text` 、 `Button` 等,也可以是自定义组件,本节笔者简单介绍一下
    的头像 发表于 04-08 10:17 572次阅读

    液晶模块是什么?液晶模块液晶显示屏有什么区别?

    在电子显示技术日益发展的今天,液晶显示技术以其独特的优势占据了市场的主导地位。液晶模块液晶显示屏作为液晶显示技术的两大核心组件,虽然联系紧
    的头像 发表于 03-29 09:45 1061次阅读

    RA8835液晶显示模块使用手册

    电子发烧友网站提供《RA8835液晶显示模块使用手册.pdf》资料免费下载
    发表于 01-02 10:03 1次下载

    博途用户自定义库的使用

    博途官方提供了很多库,比如:基本函数库、通信库、安全库、驱动库等等,用户可以使用库中的函数/函数块来完成具体的控制任务。除了官方的库,我们也可以创建自己的库(用户自定义库)。比如,把项目
    的头像 发表于 12-25 10:08 838次阅读
    博途用户<b class='flag-5'>自定义</b>库的使用

    lcd1602液晶显示模块工作原理

    LCD1602液晶显示模块是一种常用的显示设备,可以显示文字和简单的图形。它常被用于各种电子设备中,比如计算器、电子表格、仪器仪表等。本文将详细介绍LCD1602
    的头像 发表于 12-20 10:30 6594次阅读

    怎样为显示器创建自定义分辨率呢?

    您可以为大多数显示器创建自定义分辨率和刷新率。这可以解决可能不使用标准 Windows 分辨率的显示器,或更正可能导致显示器兼容性问题的无效显示
    的头像 发表于 11-16 09:41 6843次阅读
    怎样为<b class='flag-5'>显示</b>器创建<b class='flag-5'>自定义</b>分辨率呢?

    如何在Matlab中自定义Message

    自定义Message 当我们的 message 消息比较复杂时,通常要用到自定义的 message 消息,MATLAB 2020b以上的版本自带了ROS Toolbox Interface
    的头像 发表于 11-15 18:12 1163次阅读
    如何在Matlab中<b class='flag-5'>自定义</b>Message

    基于PIC16F877A单片机的自定义无线传输协议和短信通信协议

    电子发烧友网站提供《基于PIC16F877A单片机的自定义无线传输协议和短信通信协议.pdf》资料免费下载
    发表于 11-08 14:47 1次下载
    基于PIC16F877A单片机的<b class='flag-5'>自定义</b>无线传输<b class='flag-5'>协议</b>和短信<b class='flag-5'>通信协议</b>