掌桥专利:专业的专利平台
掌桥专利
首页

一种基于图形化的C语言代码文件自动化生成系统

文献发布时间:2023-06-19 18:29:06


一种基于图形化的C语言代码文件自动化生成系统

技术领域

本发明涉及计算机技术领域,具体为一种基于图形化的C语言代码文件自动化生成系统。

背景技术

随着工业控制场景下控制软件复杂度的提升,基于文本的开发方式,即根据文本形式的规格说明书进行编码实现,然后通过在原型系统或实物系统上的运行来开展测试、调试,已经很难满足当前在高质量保证的基础上,快速进行产品或系统交付的市场需求,而基于模型的设计,利用自动代码生成工具将规格模型直接转化为可以运行的产品级代码,是应对这种开发挑战的有效手段。PLC可编程逻辑控制器是在工业控制领域广泛应用的嵌入式处理器,它是专门为工业环境下的数字化操作而设计的电子设备。基于PLC的工业控制软件开发是应用PLC的一项核心任务。专用的控制器由于带有CPU/MPU,所以逻辑控制可以通过编程实现,因而使得控制器具有了很大的灵活性,但是对于大多数的使用者来说,通用的C语言编程或者其他的编程语言仍然是一道很大的关卡,使用起来不够方便。目前PLC的开发现状存在很多困难,原有的梯形图系统是为了简化编程而形成,由于系统变得非常复杂,梯形图并不擅长复杂的编程表达,因而造成编程困难,阅读困难;PLC基本是用C语言进行开发,而C语言是学习成本非常高的语言,加上互联网行业的发展导致C语言开发人员无法满足工业开发需求;PLC程序对确定性,实时性,安全性有极高的要求,并且开发标准碎片化严重,国内外大中企业均有自己的IDE产品,使得生成的控制程序无法跨厂商使用,移植性较差。

所以,人们需要一种基于图形化的C语言代码文件自动化生成系统来解决上述问题。

发明内容

本在于提供一种基于图形化的C语言代码文件自动化生成系统,以解决上述背景技术中提出的问题。

为了解决上述技术问题,本发明提供如下技术方案:一种基于图形化的C语言代码文件自动化生成系统,包括数据结构模块、数据映射模块、C语言代码文件生成模块和数据存储模块,其中,

所述数据结构模块用于保存组件的变量,所述数据结构模块的输出端连接所述数据映射模块的输入端;

所述数据映射模块用于在两个数据模型之间建立数据元素的对应关系,对数据字段和目标字段进行匹配,执行数据映射操作后完成数据的转换;

所述C语言代码文件生成模块用于结合数据结构以及运算规则,根据数据信息生成最终的C语言代码文件;

所述C语言代码文件生成模块的输出端连接所述数据存储模块的输入端;

所述数据存储模块用于对生成的代码进行存储。

进一步的,所述数据结构模块中保存了组件的变量,所述组件与函数头一样,是自动生成的,用户对此数据结构没有影响,该数据结构的一部分由组件的实例变量组成,可以在任何方法中使用,因此,它们必须被传递给所有生成的函数,同时,数据结构还依赖于代码扩展器,因此对用户隐藏了确切的命名。

进一步的,所述数据结构中用户定义的关于C语言变量的元素名称必须是有效的ANSI C 标识符,除了C的保留关键字外,名称本身也是保留的;为了方便地访问组件的元素,将为每个元素自动定义一个宏,然后可以通过元素名称访问每个元素,在其他组件中定义的公共元素可以从C函数中使用符号定义对象来访问,访问权限仅限于基本元素、数组和矩阵;

其中,矩阵元素搜索算法具体为:

函数f(x,y)依赖于两个变量x、y,二者分别表示行列式Δ的绝对值,ω和δ;该函数返回为函数值矩阵,所述函数值矩阵由[X,Y]=meshgrid(x,y)在网格上获得,然后,以最大网格点Nx×Ny线性扫描区域[x

进一步的,所述数据映射模块包括ID映射和数据结构映射;

所述ID映射对于每个方法或进程,都会生成一个C函数,功能头为自动生成时,C代码只在函数体本身中使用;其中,为组件的方法和过程所生成的函数的名称取决于代码扩展器和所生成的代码的软件体系结构;根据代码扩展器,实现了一个唯一的名称空间,不同类中的方法可以具有相同的名称,并且没有任何命名冲突;

所述数据结构映射具体为:对于基本类型,可以使用如int,float,double等类型的方法名称,当访问数组或矩阵时,使用C语言的方式通过索引操作符“[]”进行操作,由于用户定义类型的方法名称依赖于扩展程序,因此只能在了解该方法生成的确切函数名称的情况下调用用户定义类型的方法;

当使用预定义的元素时,这些元素是模型类型的;

所述定义为C语言标准定义或用户自定义;

当切换规范级别时,如固定点代码,模型类型逻辑元素可以用位表示,为了实现数据的一致性,代码生成必须创建额外的消息副本,如果在功能代码中使用消息进行读或写访问,则需要附加代码以确保将当前值从消息原件安全复制到本地副本;在流程主体中,只使用这些本地副本,最后,所有可能在流程主体中更改其值的本地副本都必须写回消息原件;

在SEDL和方框图组件中,通常可以很好地检测这些消息,然而,当对规范使用C代码时,此功能的可用性有限,此时,用户必须自己处理数据的一致性,该条件下无法检测用户在指定的C代码中写入的变量,只识别少数几种特殊情况。

若一个变量在宏、外部函数或通过寻址运算符和指针算术介质中发生了更改,则不会检测到该更改;当使用消息时,此行为会导致在进程开始时创建消息副本,但在进程阻塞或进程异常终止的情况下,无法在进程结束时写回。

进一步的,在所述数据映射模块中,方法的参数被映射为该方法生成的函数的参数列表中的函数参数,这些参数也可以通过参数的名称来访问;根据一般的C语言语法规则,函数局部变量可以在方法体中声明。这里只能声明C数据类型的变量,但不能声明模型类型的变量,特别是在C的主体规范组件中,不能使用用户定义类型的局部变量;

由于每个实现变体都有一个代码变体,因此用户可以定义有关实现变体的局部变量及其数据类型。

进一步的,所述数据映射模块使用线性插值映射算法,具体为:

其中x是自变量,x

其中,RMSE误差评估算法为:

其中,N为推算数,O

进一步的,所述C语言代码文件生成模块通过将代码生成器模型映射到AUTOSAR结构来生成AUTOSAR代码,能够快速重用现有的代码生成器模型,并通过自定义选项为不同目标生成代码,使得自定义回调到设备特定的算术、插值或服务库,同时,编译器的内存指令可在编译或生成时解析条件代码和数据结构,并在运行时提供性能优化策略。

进一步的,所述代码开发过程可以用C代码、方框图和SEDL的形式实现,需要指定一个方法或过程的主体,进而自动生成方法声明、函数头和帧,并完成数据初始化;

与SEDL或方块图中的规范相比,C代码中的组件是在实现级别上指定的,而不是在模型级别上指定的,没有进行从模型到实现级别的转换;

所述SEDL(Skyline Embedded Development Language)是一套面向嵌入式开发的脚本语言定义,发明的目的是简化工业自动化控制软件开发复杂度过高的问题,与传统开发语言不同的是,SEDL是一套面向模型的开发语言;SEDL支持通过文本和图形化两种方式进行编程。并且文本和图形化可相互转换,可以快速开发出PLC,DCS等工业控制程序;

根据不同目标、不同规范等级、不同实现的代码,为每个变体分别指定代码,保证了文件的一致性,当使用用户定义的类型时,由于生成了接口,C代码必须生成相应的代码框架,并且,通过扩展器生成的C函数的命名,用户不可见;在当前扩展器中,类的标识标记用于生成的函数名称中,用以保证唯一的命名空间;

用C代码描述的组件具有与用SEDL或方框图描述相同的结构;C代码描述了方法或流程的主体;C代码中组件的规范取决于目标编译;同时,代码是可以变化的;

所述C代码可以用来表示物理级别,在这种情况下,实现级别尽可能地与物理级别相一致,或者,C代码可以在定点算法实现级别上转换实现,因为C代码取决于变量的实现,特别是它们的量化。

进一步的,所述数据存储模块中,每个代码变体都是单独存储。

与现有技术相比,本发明所达到的有益效果是:

1、本发明能够自动生成符合MISRA标准的高质量生产C代码,对用户来说,提高了代码的可读性,能够追溯到用户的代码生成器模型,并且能够自动插入防御性代码,包括:被零除保护、基于类型属性的饱和限制以及数组类型的索引溢出保护,同时支持定点或浮点代码生成。

2、本发明使用简单易用的自动代码生成机制,通过将代码生成器模型映射到AUTOSAR结构来生成AUTOSAR代码,快速重用现有的代码生成器模型,并通过自定义选项为不同目标生成代码,可以在编译或生成时解析条件代码和数据结构,同时在运行时提供性能优化策略。

3、本发明中,代码生成器提供了各种接口和标准化的文件交换格式,可以轻松地将工具集成到用户的开发过程和工具链中,代码生成器构建在eclipse平台上,允许在同一个IDE 中无缝集成流程工具,通过本机eclipse插件连接到JIRA、Bitbucket、Git、SVN、ibmrtc,安装在不同厂商如STM、ARM提供的现有eclipse嵌入式工作台内,为多个目标建模并生成代码,在同一个IDE中构建、调试,从模型中生成额外的过程工件,如A2L、ARXML、MDX,能够通过附带的SDK对用户的过程进行扩展,例如,将用户自己的过程编码插入静态分析引擎中,并且工作台能够自动化实现持续集成。

附图说明

附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:

图1是本发明一种基于图形化的C语言代码文件自动化生成系统的数据映射示意图;

图2是根据文本呈现的示例;

图3是根据文本呈现的实施例一的屏幕截图;

图4是根据文本呈现的实施例三的屏幕截图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1和图2所示,本发明提供以下技术方案,一种基于图形化的C语言代码文件自动化生成系统,包括数据结构模块、数据映射模块、C语言代码文件生成模块和数据存储模块,其中,

所述数据结构模块用于保存组件的变量,所述数据结构模块的输出端连接所述数据映射模块的输入端;

所述数据映射模块用于在两个数据模型之间建立数据元素的对应关系,对数据字段和目标字段进行匹配,执行数据映射操作后完成数据的转换;

所述C语言代码文件生成模块用于结合数据结构以及运算规则,根据数据信息生成最终的C语言代码文件;

所述C语言代码文件生成模块的输出端连接所述数据存储模块的输入端;

所述数据存储模块用于对生成的代码进行存储。

所述数据结构模块中保存了组件的变量,所述组件与函数头一样,是自动生成的,用户对此数据结构没有影响,该数据结构的一部分由组件的实例变量组成,可以在任何方法中使用,因此,它们必须被传递给所有生成的函数,同时,数据结构还依赖于代码扩展器,因此对用户隐藏了确切的命名。

用户定义的关于C语言变量的元素名称必须是有效的ANSI C标识符,除了C的保留关键字外,名称本身也是保留的;为了方便地访问组件的元素,将为每个元素自动定义一个宏,然后可以通过元素名称访问每个元素,在其他组件中定义的公共元素可以从C函数中使用符号定义对象来访问访问权限仅限于基本元素、数组和矩阵;

其中,矩阵元素搜索算法具体为:

函数f(x,y)依赖于两个变量x、y,二者分别表示行列式Δ的绝对值,ω和δ;该函数返回为函数值矩阵,所述函数值矩阵由[X,Y]=meshgrid(x,y)在网格上获得,然后,以最大网格点Nx×Ny线性扫描区域[x

所述数据映射模块包括ID映射和数据结构映射;

所述ID映射对于每个方法或进程,都会生成一个C函数,功能头为自动生成时,C代码只在函数体本身中使用;其中,为组件的方法和过程所生成的函数的名称取决于代码扩展器和所生成的代码的软件体系结构;根据代码扩展器,实现了一个唯一的名称空间,不同类中的方法可以具有相同的名称,并且没有任何命名冲突,例如,组件的标识标记用于为方法calc 生成唯一的名称QX040H28HJ8HAMDJ870S4G7MDIBQQLSM_calc。

所述数据结构映射具体为:对于基本类型,可以使用如int,float,double等类型的方法名称,当访问数组或矩阵时,使用C语言的方式通过索引操作符“[]”进行操作,由于用户定义类型的方法名称依赖于扩展程序,因此只能在了解该方法生成的确切函数名称的情况下调用用户定义类型的方法;

当使用预定义的元素时,这些元素是模型类型的;

所述定义为C语言标准定义或用户自定义;

在物理级别上,基本类型具有以下默认实现:

continuous=real64

udisc=unsigned int32

sdisc=signed int32

Log=int16;

数据结构可能如下:

Struct QX040H28HJ8HAMDJ870S4G7MDIBQQLSM_Obj{

ASDObjectHeader objectHeader;

real64_Obj*a;

real64_Obj*b;

real64_Obj*c;

real64_Obj*d;

};

当切换规范级别时,如固定点代码,模型类型逻辑元素可以用位表示,为了实现数据的一致性,代码生成必须创建额外的消息副本,如果在功能代码中使用消息进行读或写访问,则需要附加代码以确保将当前值从消息原件安全复制到本地副本;在流程主体中,只使用这些本地副本,最后,所有可能在流程主体中更改其值的本地副本都必须写回消息原件;

在SEDL和方框图组件中,通常可以很好地检测这些消息,然而,当对规范使用C代码时,此功能的可用性有限,此时,用户必须自己处理数据的一致性,该条件下无法检测用户在指定的C代码中写入的变量,只识别少数几种特殊情况。

若一个变量在宏、外部函数或通过寻址运算符和指针算术介质中发生了更改,则不会检测到该更改;当使用消息时,此行为会导致在进程开始时创建消息副本,但在进程阻塞或进程异常终止的情况下,无法在进程结束时写回。如图2显示的模块包含多个消息,最初会为所有消息创建副本,但是,在生成的代码中,对于直接写入的消息可以用识别的方式访问,对于在宏中使用的消息的更改未被识别并丢失;所以在最后只有直接写入的消息副本。

在所述数据映射模块中,方法的参数被映射为该方法生成的函数的参数列表中的函数参数,这些参数也可以通过参数的名称来访问;根据一般的C语言语法规则,函数局部变量可以在方法体中声明;这里只能声明C数据类型的变量,但不能声明模型类型的变量,特别是在C的主体规范组件中,不能使用用户定义类型的局部变量;

由于每个实现变体都有一个代码变体,因此用户可以定义有关实现变体的局部变量及其数据类型。

进一步的,所述数据映射模块使用线性插值映射算法,具体为:

其中x是自变量,x

其中,RMSE误差评估算法为:

其中,N为推算数,O

例如,线性插值的工作方法如下:

tmpVal=CharTable1_getAt_real64_real64(LLpr,3000);

//为tmpVal分配了1.5

tmpVal=CharTable1_getAt_real64_real64(LLpr,2280);

//计算2280的插值因子

//对2280的插值1.212分配给它的tmpVal

tmpVal=CharTable1_getAt_real64_real64(LLpr,9000);

//计算了9000的插值因子

//将9000的插值2.2分配给它的tmpVal

在一些情况下,在表中分离搜索步骤和插值步骤可以提高效率,此时,使用子例程Cha rTable1_search_real64(charline,index)和CharTable1_interpol_real64_real64(ch arline)。

CharTable1_search_real64(LLpr,1000);

//将样本点设置为1000

tmpVal=CharTable1_interpol_real64_real64(LLpr);

//为tmpVal分配了0.8

CharTable1_search_real64(LLpr,2780);

//计算了2780的插值因子

tmpVal=CharTable1_interpol_real64_real64(LLpr);

//将2780的插值1.412分配给它的tmpVal

特征表如下:

CharTable2_search_real64_real64(charlien、indX、indY)子例程通常足以用于评估特征值,

该子例的线性插值工作方法如下:

tmpVal=CharTable2_getAt_real64_real64_real64(LLpr2,8,5);

//将4.0分配给tmpVal

tmpVal=CharTable2_getAt_real64_real64_real64(LLpr2,2,2);

//计算x=2和y=2的插值因子

//将(2,2)的插值设为-0和.571,并分配给它的tmpVal

tmpVal=CharTable2_getAt_real64_real64_real64(LLpr2,20,9);

//计算x=20,y=10的外推因子

//将(20,10)的值推断为5.0

//设置x个样本点为1,y个样本点为3

tmpVal=harTable2_interpol_real64_real64_real64(LLpr2);

//为tmpVal分配1.0

CharTable2_search_real64_real64(LLpr2、4、4);

//计算x=4,y=4的插值因子

tmpVal=CharTable2_interpol_real64_real64_real64(LLpr2);

//将(4,4)的插值3.143分配给它的tmpVal;

所述C语言代码文件生成模块通过将代码生成器模型映射到AUTOSAR结构来生成AUTOSAR代码,能够快速重用现有的代码生成器模型,并通过自定义选项为不同目标生成代码,使得自定义回调到设备特定的算术、插值或服务库,同时,编译器的内存指令可在编译或生成时解析条件代码和数据结构,并在运行时提供性能优化策略。

所述代码开发过程可以用C代码、方框图和SEDL的形式实现,需要指定一个方法或过程的主体,进而自动生成方法声明、函数头和帧,并完成数据初始化;

与SEDL或方块图中的规范相比,C代码中的组件是在实现级别上指定的,而不是在模型级别上指定的,没有进行从模型到实现级别的转换;

所述SEDL(Skyline Embedded Development Language)是一套面向嵌入式开发的脚本语言定义,发明的目的是简化工业自动化控制软件开发复杂度过高的问题,与传统开发语言不同的是,SEDL是一套面向模型的开发语言;SEDL支持通过文本和图形化两种方式进行编程。并且文本和图形化可相互转换,可以快速开发出PLC,DCS等工业控制程序;

根据不同目标、不同规范等级、不同实现的代码,为每个变体分别指定代码,保证了文件的一致性,当使用用户定义的类型时,由于生成了接口,C代码必须生成相应的代码框架,并且,通过扩展器生成的C函数的命名,用户不可见;在当前扩展器中,类的标识标记用于生成的函数名称中,用以保证唯一的命名空间;

用C代码描述的组件具有与用SEDL或方框图描述相同的结构;C代码描述了方法或流程的主体;C代码中组件的规范取决于目标编译;例如,C代码是针对PC、PPC还是针对特定的控制器CPU,代码是可以变化的,例如,若一个控制器CPU有特殊的寄存器,必须直接寻址。

所述C代码可以用来表示物理级别,在这种情况下,实现级别尽可能地与物理级别相一致,例如,连续的类型被重新表示为一个64位的浮点数;或者,C代码可以在定点算法实现级别上转换实现,因为C代码取决于变量的实现,特别是它们的量化。

所述数据存储模块中,每个代码变体都是单独存储。

实施例一:

如图3所示,代码自动生成的过程为:选择应用程序文件,右击,运行代码生成;

在操作中,可以将输出定义为:

(1)工作区内的eclipse项目,其中,项目名称属性定义了该eclipse项目的名称,激活“添加”属性将触发目的生成,该项目生成的工件可以使用功能编译,可以用于快速分析、浏览代码并使用内置gcc编译器;

(2)绝对文件夹,其中,Folder属性定义根文件夹的绝对路径,然后根文件夹将包含子文件夹,如include、src等,而后续编译和链接步骤将由外部工具执行。

在代码生成过程中,如果需要在生成的C代码中自动创建与SEDL代码中的名称无关的符号时,就需要使用内部生成符号的前缀,例如临时变量的名称;

所有内部创建的符号都以该字符串作为前缀,为了防止名称与从SEDL模型生成的符号发生意外冲突,不允许在SEDL模型中定义标识符,它从这里定义的前缀开始;默认情况下,该前缀为SEDL_。

该前缀可以被更改,以避免名称与第三方软件中的名称发生冲突,例如,如果前缀SEDL_ 已经在用户自己的库或遗留的C程序中使用,前缀可以是任何有效的C标识符,并只能包含字母、数字和下划线字符。

实施例二:快速重新生成上次运行的项目;

每次运行代码生成器时,都会使用与创建的项目同名的运行配置,并作为上次启动的配置添加到运行历史记录中;

要重新运行项目的代码生成,可以执行以下操作之一:

(1)使用菜单“运行最后启动时运行”,快捷键按+F11;

(2)从运行历史记录中快速重新生成项目;打开菜单“运行、运行历史记录”,并选择要从中生成C代码的项目;

实施例三:创建一个自定义的运行配置;

例如,用户选择的自定义名称,如图4所示,创建自定义运行配置,包括以下步骤:

S1:打开运行运行配置”的菜单;

S2:在“运行配置”窗口中,单击“新建配置”按钮;

S3:请输入“运行配置”的名称;

S4:单击浏览按钮并选择SEDL项目;

S5:不需要修改默认的Eclipse运行配置,如果需要非默认行为,那么可以通过“公共”选项卡,如:添加一个菜单项,将配置保存到一个共享文件中;

S6:单击“应用”以保存该运行配置。

最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 一种基于Qt资源文件的Excel文档生成方法及系统
  • 轨旁控制单元中基于数据配置的C语言代码自动生成系统
  • 图形化文件生成方法及系统
技术分类

06120115584909