首页> 中国专利> MATLAB和CCS联合开发方式下的Modbus通信库适配方法

MATLAB和CCS联合开发方式下的Modbus通信库适配方法

摘要

本发明公开了一种MATLAB和CCS联合开发方式下的Modbus通信库适配方法,包括编写Modbus驱动代码单元,用代码继承工具对Modbus驱动代码单元进行Simulink模块创建,创建过程中,将涉及DSP硬件驱动的代码设置为免于编译的状态并完整保留;创建完成后,将涉及DSP硬件驱动的代码恢复为可执行状态,对创建好的多个Modbus驱动模块进行封装形成Modbus驱动模块库;在Simulink中调用所述Modbus驱动模块库中的模块进行Modbus通信模型搭建和代码生成,并部署到DSP中。该方法可摆脱MATLAB为DSP开发提供的硬件资源的限制,基于自主编写的Modbus驱动代码快速完成基于Modbus的通信开发,具有开发效率高,易于集成等优点。

著录项

  • 公开/公告号CN116450109A

    专利类型发明专利

  • 公开/公告日2023-07-18

    原文格式PDF

  • 申请/专利权人 重庆大学;

    申请/专利号CN202310577741.5

  • 申请日2023-05-19

  • 分类号G06F8/30(2018.01);G06F8/35(2018.01);

  • 代理机构重庆大学专利中心 50201;

  • 代理人黄涛

  • 地址 400044 重庆市沙坪坝区沙正街174号

  • 入库时间 2024-01-17 01:16:56

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-08-04

    实质审查的生效 IPC(主分类):G06F 8/30 专利申请号:2023105777415 申请日:20230519

    实质审查的生效

  • 2023-07-18

    公开

    发明专利申请公布

说明书

技术领域

本发明涉及基于模型设计及自动代码生成领域,特别是一种MATLAB和CCS联合开发方式下的Modbus通信库适配方法。

背景技术

目前,MATLAB和CCS联合开发方式以TI公司和MathWorks公司联合开发的硬件支持包为依托,为嵌入式开发开拓了新途径:可直接由Simulink模型生成DSP的可执行代码。相比编辑C代码的嵌入式软件开发方式,其可视性更高、移植性更强,并且可在Simulink上对逻辑进行仿真,简化测试工作。MATLAB为DSP底层驱动开发提供了配套的硬件支持包,且对硬件支持包和自带Simulink模块的目标代码生成提供了支持,但缺乏对于嵌入式开发中外围开发需求的直接支持。在MATLAB中对于DSP的开发还没有专门针对Modbus协议的相应支持包,无法直接利用Simulink中的模块完成Modbus通信模型的搭建。

申请号为CN201310675197.4,名称为“用DSP实现MODBUS异步串行通信协议的方法”的专利中,以DSP为核心开发Modbus协议采用程序设计的方式进行,要求程序设计人员要精通硬件的特性、结构及其专用的编程语言,难度较大。在申请号为201810144868.7,名称为“利用Simulink定制单片机的底层驱动进行代码生成的方法”的专利中,通过编写S函数脚本和用于代码生成的TLC文件的方式,设计了一种基于自动代码生成技术的底层模块库,实现了在MATLAB中将手写代码封装成Simulink模块的目标。但是该种方法依旧需要理解S函数和TLC文件结构,并在此基础上需要手动编写一些配置文件;同时无法处理当代码中存在相关硬件寄存器时无法通过编译的情况。

为解决目前基于模型设计方法开发DSP的过程中,由于Simulink为DSP开发提供的硬件资源的限制而无法直接利用Simulink中的模块快速完成Modbus通信模型搭建的问题,亟需一种MATLAB和CCS联合开发方式下的Modbus通信库适配方法,以支持DSP上Modbus通信功能的快速开发。

发明内容

有鉴于此,本发明的目的是提供一种MATLAB和CCS联合开发方式下的Modbus通信库适配方法,以解决目前采用基于模型设计方法开发DSP的过程中由于Simulink为DSP开发提供的硬件资源的限制而无法直接利用Simulink中的模块快速完成Modbus通信模型搭建的问题。

本发明中的MATLAB和CCS联合开发方式下的Modbus通信库适配方法,

步骤1、编写Modbus驱动代码,得到Modbus驱动代码单元,所述代码中包括涉及DSP硬件驱动的代码;

步骤2、调用代码继承工具对Modbus驱动代码单元进行Simulink模块创建,创建过程中,将涉及DSP硬件驱动的代码设置为免于编译的状态并完整保留;

创建完成后,将涉及DSP硬件驱动的代码恢复为可执行状态,对创建好的多个Modbus驱动模块进行封装,得到Modbus驱动代码单元对应的多个封装后的Modbus驱动模块,形成Modbus驱动模块库;

步骤3、在Simulink中调用所述Modbus驱动模块库中的模块进行Modbus通信模型搭建和代码生成,并部署到DSP中。

进一步的,所述步骤2中调用代码继承工具LCT为所述Modbus驱动代码单元创建Modbus驱动模块。

进一步的,所述步骤2中所封装的Modbus驱动模块具有相应的用户交互界面。

进一步的,所述涉及硬件驱动的代码为涉及DSP中相关外设寄存器的操作的代码。

进一步地,所述步骤2具体包括:

步骤2.1、将Modbus驱动代码单元中涉及硬件驱动的代码设置为注释,使该部分代码免于编译;

步骤2.2、调用代码继承工具LCT将Modbus驱动代码单元中的以C语言编写的函数初始化为LCT结构体,并指定LCT结构体参数;

步骤2.3、调用代码继承工具LCT为所述函数生成S-Function源文件,并将所述S-Function源文件编译链接生成.mexw64可执行文件,进一步创建成用于Simulink模型搭建和仿真的Modbus驱动模块;

步骤2.4、调用代码继承工具生成后续进行模型代码生成所需的tlc文件;

步骤2.5、还原注释掉的涉及硬件驱动部分的代码;

步骤2.6、对所有待创建的驱动模块的代码单元重复执行上述子步骤;

步骤2.7、对创建好的Modbus驱动模块进行封装,并将封装好的Modbus驱动模块进行整理和归档,形成Modbus驱动模块库。

进一步的,步骤2.1中,在源文件中的函数定义部分将函数体内部的代码段全部做注释处理;头文件中只保留用于避免头文件重定义的条件编译部分,其余全部做注释处理。

进一步的,所述Modbus驱动代码单元包括初始化单元和数据收发单元;

所述初始化单元包括参数配置模块和端口初始化模块;

所述数据收发单元包括数据接收模块、接收超时检测模块、消息帧解析和从机应答模块;

所述参数配置模块用于存储空间的分配及设备地址配置;存储空间的分配中对每个存储区块所需要的资源大小进行配置;设备地址配置指定从设备ID,作为通讯网络中从设备的唯一标识;

所述端口初始化模块用于端口的初始化,根据选择的端口模式对DSP上对应的串口外设和GPIO进行初始化;

所述数据接收模块在串口接收中断中调用,在接收中断来临时接收单个字符并保存至消息缓冲区;

所述接收超时检测模块在定时器中断中调用,该模块利用定时器判断接收字符的时间间隔情况,进而判断一帧消息的终止;

所述消息帧解析和从机应答模块在空闲任务块中调用,用于在收到完整的消息帧后,从设备对接收到的完整消息帧进行解析并返回应答。

进一步的,所述端口模式包括RS485、RS232和RS485&RS232三种;

进一步的,数据接收模块包括RS485数据接收模块和RS232数据接收模块两类。

本发明的有益效果:本发明提供的Modbus通信库适配方法可摆脱MATLAB为DSP开发提供的硬件资源的限制,利用在模块创建过程中的特殊处理,实现了基于自主编写的Modbus驱动代码快速完成基于Modbus的通信开发,并使得同时可以实现自主定制Modbus通信功能模块来满足各种通信需求。

附图说明

图1为本发明实施例中的MATLAB和CCS联合开发方式下的Modbus通信库适配方法的流程图;

图2为本发明实施例中的Modbus驱动代码单元的示意图;

图3为图1中S21调用LCT为Modbus驱动代码单元创建Modbus驱动模块步骤的流程图。

具体实施方式

下面结合附图和实施例对本发明作进一步描述。

本发明所提供的具体实施方式建立在DSP28335硬件平台与MATLAB软件平台基础上,结合RS485总线的Modbus通信应用实例加以说明。

本发明的一个具体实施例,公开了一种MATLAB和CCS联合开发方式下的Modbus通信库适配法,请参阅图1,包括步骤S1到S4:

S1、自主编写Modbus驱动代码,得到Modbus驱动代码单元。Modbus驱动代码单元实施例请参阅图2,包括初始化单元1和数据收发单元2。初始化单元1包括LibmodbusParameter参数配置模块11、LibModbus Init端口初始化模块12;数据收发单元2包括LibModbus Receive RS232/RS485数据接收模块21、LibModbus Timer Step接收超时检测模块22、LibModbus Thread消息帧解析和从机应答模块23。

所述Libmodbus Parameter参数配置模块11用于存储空间的分配及设备地址的配置。Modbus协议允许设备将四种不同数据类型分别映射到相互独立的存储区块中并使用不同的功能码对不同类型的数据进行访问。存储空间的分配中对每个存储区块所需要的资源大小进行配置;设备地址配置指定从设备ID,作为通讯网络中从设备的唯一标识。

所述LibModbus Init端口初始化模块12用于端口初始化,有RS485、RS232、RS485&RS232三种模式可供选择,该模块将根据选择的端口对DSP上对应的串口外设和GPIO进行初始化。

所述LibModbus Receive RS232/RS485数据接收模块21在串口接收中断中调用,根据通信的硬件接口电路分为RS485数据接收模块和RS232数据接收模块,在接收中断来临时接收单个字符并保存至消息缓冲区。

所述LibModbus Timer Step接收超时检测模块22在定时器中断中调用,用定时器判断数据超时情况。在一帧完整的数据接收中,整个数据帧必须作为一连续的流传输。两个完整的消息帧之间的时间间隔大于3.5个字符时间,接收超时检测模块对接收字符的时间间隔情况来判断一帧消息的终止。在该模块中,若探测到接收间隔时间超过4个系统步长时间,则判定为判断一帧消息的终止。

所述LibModbus Thread消息帧解析和从机应答模块23在Simulink的空闲任务块中调用。收到完整的消息帧后,从站对接收到的完整消息帧进行解析并返回应答。具体操作为:判断接收到的消息帧中的ID号与该从设备是否相符,不符的情况下直接忽略,否则对数据帧进行CRC校验,防止从设备去响应通信过程中发生传输错误的消息帧。消息帧中的数据段包含了从机要执行功能的附加信息,对该数据段进行解析,并返回按特定格式封装的应答帧响应主站请求。

S2、调用代码继承工具对Modbus驱动代码单元进行Simulink模块创建,创建过程中,将涉及DSP硬件驱动的代码设置为免于编译的状态并完整保留;创建结束后,将涉及DSP硬件驱动的代码恢复为可执行状态,封装后得到各Modbus驱动代码单元对应的Modbus驱动模块,形成Modbus驱动模块库,具体步骤为S21到S23:

S21、调用MATLAB的代码继承工具LCT为步骤S1中所述Modbus驱动代码单元创建Modbus驱动模块。具体步骤请参阅图3,包括S211到S215:

S211、将涉及硬件驱动的代码进行注释,使该部分代码免于编译。由于用代码继承工具时用到的编译器为C编译器,而非针对目标硬件DSP的编译器,因此涉及目标硬件DSP28335中定义的GPIO和SCI相关外设寄存器的代码将无法通过编译,对此采取将涉及硬件驱动的代码暂时进行注释的措施,在后续步骤将进行还原,不会影响对硬件驱动部分代码的调用。所述涉及硬件驱动的代码具体为对DSP中相关外设寄存器的操作。

作为对上述实施例的改进,具体实施时,在源文件中的函数定义部分将函数体内部的代码段全部做注释处理;头文件中只保留用于避免头文件重定义的条件编译部分,其余全部做注释处理,这样,即可不用逐句分析代码,以找出确切的涉及硬件驱动的代码行,与对于操作人员来说更为简便和快速。

S212、调用代码继承工具LCT为以C语言编写的函数初始化LCT结构体,并指定LCT结构体参数。所述LCT结构体参数包括:驱动源码及头文件路径、S-Function名和输出函数声明。

S213、调用代码继承工具LCT为C函数生成S-Function源文件,并将所述S-Function源文件编译链接生成.mexw64可执行文件,进一步创建成用于Simulink模型搭建和仿真的驱动模块。

S214、调用代码继承工具LCT生成后续进行模型代码生成所需的tlc文件。

S215、上述步骤完成后,还原步骤S211中注释掉的代码。

在这一步骤之前,涉及硬件驱动的代码被设置为了免于编译状态,这使得前述基于LCT步骤得以顺利实施,因为基于现有的LCT,如果代码单元中存在涉及硬件驱动的代码,前述的步骤中会报错,导致无法继续;另一方面,利用LCT创建模块的过程实际上并不对代码单元本身做任何改动,其编译过程可以理解为一种合法性检查;也就是说,只要通过了这一检查,后续封装、模型搭建、仿真、以及部署步骤中,代码单元中的代码将被原封不动的执行。因此,通过还原步骤S211中注释掉的代码,就可以是的这些涉及涉及硬件驱动的代码在后续步骤中被执行。

以此类推,对所有待创建驱动模块的函数所定义的源文件及其头文件重复执行步骤S211到S215,直至Modbus通信库中需要的所有功能模块全部创建完毕。

S22、进行模块封装,设计用户交互界面。使用Mask Editor完成模块封装,使模块具备与用户交互的能力。

S23、创建Modbus驱动模块库。将所有封装后的Modbus驱动模块进行整理和归档,并添加到Simulink浏览库中方便重复调用。

S3、在Simulink中调用所述Modbus驱动模块库中的Modbus驱动模块进行Modbus通信模型搭建和代码生成,并部署到DSP28335硬件测试平台,其中,一些必要的非Modbus驱动模块可采用TI C2000硬件支持包中的功能模块。在进行所述Modbus通信模型搭建时需要进行模型参数配置,包括配置所述Modbus通信模型的SCI串口通信参数和系统步长,这些配置工作则可以通过模块封装时加入的用户交互界面来完成。

在本实施例中,由于DSP硬件测试平台使用SCIB拓展RS485通信接口,具体应对SCIB串口通信参数进行配置,起始位1,数据长度8,无奇偶校验,停止位1,即传输1个字符数据需要10个比特;该实施例中设置SCIB串口通信波特率(BaudRate)为115200,将系统步长设置为0.0001。

作为对上述实施例的改进,系统步长设置可采用其它设置,在不同实施例中,SCI串口通信参数和系统步长也可考虑其它参数。应当指出,系统步长也就是定时器定时时间关系到Modbus通信超时处理及封包操作,在本实施例中Modbus适配层的接收超时检测模块将大于4个系统步长(Fixed Step Size)的间隔时间视为超时,系统步长配置不当会影响Modbus通信正常运行。因此,系统步长设置时要适应SCI通信参数的变化,具体应遵循如下关系式:

Fixed Step Size≥(3.5*N)/(4*Baud Rate)

其中,N为传输一个字符所需要的二进制位数,在该实施例中N=10。

S4、将所述DSP28335硬件测试平台与上位机连接,用MODSACN32软件观测Modbus通信下的数据交互。

在MODSACN32软件连接设置中配置通讯参数,其中包括:波特率、字长度、奇偶校验和停止位;Modbus协议选择为标准RTU传输模式;MODSACN32识别到有效COM口即可建立连接。

本实施例中,在连接设置中配置波特率115200,字长度8,无奇偶校验,停止位1。应当指出,该参数与步骤S3中配置SCIB的串口通信参数相同。

在Simulink中通过Memery Copy模块观测数据交互,进一步验证Modbus驱动模块设计的正确性。在定时器中断里创建一个数据可变的模块,每隔一段时间完成一次数据更新,将该数据通过Memery Copy模块存入Modbus的输入寄存器,在MODSACN32软件中选择RS485的设备ID,调用04功能码观测数据变化,若发现数据每隔一定时间即做出一次更新,说明基于Modbus通信的寄存器操作能够正确运行;通过在MODSACN32软件中修改线圈寄存器的值,将线圈的开关状态通过Memery Copy模块送至GPIO,利用板载LED小灯亮灭情况来模拟线圈的开与关,若通过在MODSACN32软件中改变线圈寄存器的值可控制小灯亮灭,则说明基于Modbus通信对线圈的操作能够正确运行。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号