CN103399782B - 一种实现Simulink模块仿真数据输出到界面的方法及装置 - Google Patents

一种实现Simulink模块仿真数据输出到界面的方法及装置 Download PDF

Info

Publication number
CN103399782B
CN103399782B CN201310339061.6A CN201310339061A CN103399782B CN 103399782 B CN103399782 B CN 103399782B CN 201310339061 A CN201310339061 A CN 201310339061A CN 103399782 B CN103399782 B CN 103399782B
Authority
CN
China
Prior art keywords
message
data
interface
emulation data
simulink
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN201310339061.6A
Other languages
English (en)
Other versions
CN103399782A (zh
Inventor
陈柳松
张宇
王坚
李江红
应婷
谭娟
许为
张�杰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
CRRC Zhuzhou Institute Co Ltd
Original Assignee
CSR Zhuzou Institute Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by CSR Zhuzou Institute Co Ltd filed Critical CSR Zhuzou Institute Co Ltd
Priority to CN201310339061.6A priority Critical patent/CN103399782B/zh
Publication of CN103399782A publication Critical patent/CN103399782A/zh
Application granted granted Critical
Publication of CN103399782B publication Critical patent/CN103399782B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Computer And Data Communications (AREA)
  • Telephone Function (AREA)

Abstract

本发明公开了一种实现Simulink模块仿真数据输出到界面的方法及装置以实现不影响Simulink模块灵活扩展的、高效率的输出仿真数据到界面的目的,包括:响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据;创建包含所述仿真数据的结构体,以及获取Windows界面的接收窗口;向所述Windows界面的接收窗口发送获取所述结构体的消息,以使所述Windows界面根据所述消息获取所述结构体中的仿真数据。

Description

一种实现Simulink模块仿真数据输出到界面的方法及装置
技术领域
本发明涉及Simulink仿真领域,特别涉及一种实现Simulink模块仿真数据输出到界面的方法及装置。
背景技术
Simulink模块是MATLAB最重要的组件之一,它提供一个动态系统建模、仿真和综合分析的集成环境。
目前,Simulink模块的仿真数据输出到界面的方法主要有以下两种:
一种方法是,利用MATLAB软件自带RTW(Real-TimeWorkshop,实时工作间)模块进行模型编译,将Simulink模块生成C代码或者嵌入式代码,最后将Simulink模块输出功能添加至界面设计代码中,从而使输出的仿真数据输出到一个专用的设计界面;
另一种方法是,利用MATLAB软件的InstructureControlToolbox(结构控制工具箱)进行设计,当Simulink模块输出时,抓取输出的传真数据并将其发送到网络上,相关界面应用再从网络获取该传真数据。
这两种方法各有弊端,前一种方法需要将整个Simulink模块生成C代码或者嵌入式代码,当Simulink模块调整时,需重新进行模型编译,不利于平台建设的扩展;后一种方法需要在网络上传输数据包,比较复杂,不适于单机进程之间的简单传输,效率较低。
因此,目前非常需要一种不影响Simulink模块灵活扩展的、高效率的方法。
发明内容
有鉴于此,本发明实施例的主要目的在于提供一种实现Simulink模块仿真数据输出到界面的方法及装置以实现不影响Simulink模块灵活扩展的、高效率的输出仿真数据到界面的目的。
为了解决以上技术问题,本发明实施例采取的技术方案是:
第一方面,本发明实施例提供了一种实现Simulink模块仿真数据输出到界面的方法,所述方法可以包括:
响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据;创建包含所述仿真数据的结构体,以及获取Windows界面的接收窗口;向所述Windows界面的接收窗口发送获取所述结构体的消息,以使所述Windows界面根据所述消息获取所述结构体中的仿真数据。
在第一方面的第一种可能的实现方式中,还可以包括:
在所述Simulink模块开始仿真之前,接收用户设置的采样频率;将所述Simulink模块设置为按照所述采样频率输出仿真数据。
在第一方面的第二种可能的实现方式中,所述创建包含所述仿真数据的结构体可以包括:
将所述仿真数据按照预设的编码规则进行编码,获得编码后的仿真数据;建立包含所述编码后的仿真数据的结构体。
在第一方面的第三种可能的实现方式中,所述获取Windows界面的接收窗口可以包括:
运行user32.dll中的findwindow函数,判断是否存在Windows界面的接收窗口;如果存在,获取所述接收窗口的句柄。
在第一方面的第四种可能的实现方式中,所述向Windows界面的接收窗口发送获取所述结构体的消息可以包括:
调用SendMessage函数向所述Windows界面的接收窗口发送指向所述结构体的指针的WM_COPYDATA消息。
第二方面,本发明实施例提供了一种实现Simulink模块仿真数据输出到界面的装置,所述装置可以包括:
捕获输出单元:可以用于响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据;创建消息单元:可以用于创建包含所述仿真数据的结构体;获取窗口单元:可以用于获取Windows界面的接收窗口;发送消息单元:可以用于向所述Windows界面的接收窗口发送获取所述结构体的消息,以使Windows界面根据所述消息获取所述结构体中的仿真数据。
在第二方面的第一种可能的实现方式中,还可以包括:
初始化单元:可以用于在所述Simulink模块开始仿真之前,接收用户设置的采样频率;将所述Simulink模块设置为按照所述采样频率输出仿真数据。
在第二方面的第二种可能的实现方式中,所述创建消息单元:可以用于将所述仿真数据按照预设的编码规则进行编码,获得编码后的仿真数据;建立包含所述编码后的仿真数据的结构体。
在第二方面的第三种可能的实现方式中,所述获取窗口单元:可以用于运行user32.dll中的findwindow函数,判断是否存在Windows界面的接收窗口;如果存在,获取所述接收窗口的句柄。
在第二方面的第四种可能的实现方式中,所述发送消息单元:可以用于调用SendMessage函数向所述Windows界面的接收窗口发送指向所述结构体的指针的WM_COPYDATA消息。
可见本发明具有如下有益效果:
本发明实施例提供的Simulink模块仿真数据输出到界面的方法响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据,进而创建包含所述仿真数据的结构体,以及获取Windows界面的接收窗口,再向所述Windows界面的接收窗口发送获取所述结构体的消息以使所述Windows界面根据所述消息获取结构体中的仿真数据,从而可以使仿真数据的显示成为一个相对独立的功能,无需将Simulink模块本身生成代码,不影响Simulink模块灵活扩展,也适于单机进程之间的简单传输,效率高,克服了现有技术存在的Simulink模块扩展难、效率低的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的Simulink模块仿真数据输出到界面的方法的流程图;
图2是本发明实施例提供的实现Windows界面接收消息并显示仿真数据的方法的流程图;
图3是本发明实施例提供的实现Simulink模块仿真数据输出到界面的装置的结构示意图。
具体实施方式
为使本发明实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明实施例作进一步详细的说明。
为了实现不影响Simulink模块灵活扩展、高效率的输出仿真数据到界面,本发明实施例提供了如下的Simulink模块仿真数据输出到界面的方法。
参见图1,示出了本发明实施例提供的Simulink模块仿真数据输出到界面的方法的流程图之一。该实施例可以使用Simulink模块的S函数功能块编写S函数,通过利用Win32API的WM_COPYDATA消息将仿真数据输出到Windows界面中。其中,Simulink模块的S函数功能块允许用户将编写的算法嵌入Simulink模块中,并可以与Simulink模块交互仿真计算。例如,该实施例可以包括:
S110、响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据;
需要说明的是,在Simulink模块进行仿真之前,还需要进行初始化,例如,可以初始化仿真数据结构SimStruct,其中可以包含从Simulink模块输入的信息的数量和宽度、向Simulink模块输出的信息的数量和宽度、以及分配用于保存仿真数据的内存区间、及设置sizes数组等。
并且,还可以在所述Simulink模块开始仿真之前,接收用户设置的采样频率;将所述Simulink模块设置为按照所述采样频率输出仿真数据。这样,仿真模块输出的采样率可以由用户来设置,可以达到符合实际情况、减少发送数据的负担的目的。
S120、创建包含所述仿真数据的结构体,以及获取Windows界面的接收窗口;
例如,可以运行user32.dll中的findwindow函数,判断应用该方法的终端本机是否存在Windows界面的接收窗口;如果存在,获取所述接收窗口的句柄,进而可以通过该接收窗口的句柄向该接收窗口发送消息。
考虑到仿真数据本身是具有一定含义的,在Windows界面显示该仿真数据时应按照其含义进行相应显示。因此,本发明实施例提出按照仿真数据的含义预设编码规则,在创建包含仿真数据的消息时,可以将所述仿真数据按照预设的编码规则进行编码,在获得编码后的仿真数据后,建立包含所述编码后的仿真数据的结构体(例如,所述结构体可以是保存在共享内存中的COPYDATASTRUCT),从而在发送指示该结构体的消息给Windows界面之后,Windows界面应用可以在获得所述结构体之后,按照与预设的编码规则对应的解码规则解析结构体中的数据,获得相应含义的仿真数据,进行正确的显示。
S130、向所述Windows界面的接收窗口发送获取所述结构体的消息,以使所述Windows界面的接收窗口根据所述消息获取所述结构体中的仿真数据。
例如,在本发明实施例中可以调用SendMessage函数向所述接收窗口发送指向所述结构体的指针的WM_COPYDATA消息。在这里选择SendMessage函数的原因是,SendMessage函数是阻塞的,只有接收方响应了消息,SendMessage函数才能返回,否则一直阻塞,这样发送方就不可能删除和修改数据,可以保证仿真数据不丢失。
需要说明的是,在本发明中,也可以利用其他发送消息的方式发送获取所述结构体的消息,该获取结构体的消息也可以是包含仿真数据的结构体本身的消息,在本发明中并不进行限制。
另外,在步骤S130向所述Windows界面的接收窗口发送获取所述结构体的消息之后,还可以返回到步骤S110进行后续的仿真数据输出到界面的处理。
另外,本发明实施例还可以提供如下的Windows界面接收所述消息并显示所述仿真数据的方法,例如,参见图2,可以包括:
S210、Windows界面的接收窗口接收获取所述结构体的消息;
例如,可以预先建立一个Windows界面,添加WM_COPYDATA的声明,并在默认消息处理函数DefWndProc函数中加入对WM_COPYDATA消息的处理,例如,可以在接收到消息之后,进行是否是WM_COPYDATA消息的判断,在判断出是WM_COPYDATA消息之后,接收该获取所述结构体的WM_COPYDATA消息。
S220、解析所述消息,获得有关获取所述结构体的信息,根据该信息获取所述结构体;
例如,接收到WM_COPYDATA消息之后,可以将WM_COPYDATA消息的消息体参数LParam转化为指向结构体COPYDATASTRUCT的指针,获得可以用于获取所述结构体的指针,由此根据该指针获取所述结构体。
S230、解析所述结构体,获得结构体包含的仿真数据;
例如,可以根据预设的编码规则对应的解码规则解析所述结构体,获得结构体包含的仿真数据。
S240、将所述仿真数据显示在所述Windows界面。
例如,可以根据所述仿真数据的值绘制出相应波形并显示仿真数据的值,使用户可以通过Windows窗口界面观测到Simulink模块输出的仿真数据的变化情况。
可见,应用本发明实施例提供的Simulink模块仿真数据显示方法可以响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据,进而创建包含所述仿真数据的结构体,以及获取Windows界面的接收窗口,再向所述Windows界面的接收窗口发送获取结构体的消息以使所述Windows界面根据该消息获取结构体中的仿真数据,从而可以使仿真数据输出到Windows界面成为一个相对独立的功能,无需将Simulink模块本身生成代码,不影响Simulink模块灵活扩展,也适于单机进程之间的简单传输,效率高。
参见图3,为本发明实施例提供的一种实现Simulink模块仿真数据输出到界面的装置的结构示意图,如图所示,该装置可以包括:
捕获输出单元310:可以用于响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据;
需要说明的是,在Simulink模块进行仿真循环之前,还需要进行初始化,例如,本发明实施例提供的装置还可以包括初始化单元300:可以用于初始化仿真数据结构SimStruct,其中可以包含从Simulink模块输入的信息的数量和宽度、向Simulink模块输出的信息的数量和宽度、以及分配用于保存仿真数据的内存区间、及设置sizes数组等。并且,还可以在所述Simulink模块开始仿真之前,接收用户设置的采样频率;将所述Simulink模块设置为按照所述采样频率输出仿真数据。这样,仿真模块输出的采样率可以由用户来设置,可以达到符合实际情况、减少发送数据的负担的目的。
创建消息单元320:可以用于创建包含所述仿真数据的结构体;
考虑到仿真数据本身是具有一定含义的,在Windows界面显示该仿真数据时应按照其含义进行相应显示。因此,本发明实施例提出按照仿真数据的含义预设编码规则,因此,所述创建消息单元320,具体可以用于,将所述仿真数据按照预设的编码规则进行编码,在获得编码后的仿真数据后,建立包含所述编码后的仿真数据的结构体。(例如,所述结构体可以是保存在共享内存中的COPYDATASTRUCT),从而在发送指示该结构体的消息给Windows界面之后,Windows界面应用可以在获得所述结构体之后,按照与预设的编码规则对应的解码规则解析结构体中的数据,获得相应含义的仿真数据,进行正确的显示。
获取窗口单元330:可以用于获取Windows界面的接收窗口;
例如,所述获取窗口单元330,具体可以用于,运行user32.dll中的findwindow函数,判断是否存在Windows界面的接收窗口;如果存在,获取所述接收窗口的句柄,进而可以通过该接收窗口的句柄向该接收窗口发送消息。
发送消息单元340:可以用于向所述Windows界面的接收窗口发送获取所述结构体的消息,以使Windows界面根据所述消息获取所述结构体中的仿真数据。
例如,所述发送消息单元340,具体可以用于调用SendMessage函数向所述接收窗口发送指向所述结构体的指针的WM_COPYDATA消息。
另外,在所述发送消息单元340发送所述消息之后,还可以触发捕获输出单元310,以进行后续的仿真数据输出到界面的处理。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如媒体网关等网络通信设备,等等)执行本发明各个实施例或者实施例的某些部分所述的方法。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
而且,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

Claims (10)

1.一种实现Simulink模块仿真数据输出到界面的方法,其特征在于,包括:
响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据;
创建包含所述仿真数据的结构体,以及获取Windows界面的接收窗口;
向所述Windows界面的接收窗口发送获取所述结构体的消息,以使所述Windows界面根据所述消息获取所述结构体中的仿真数据。
2.根据权利要求1所述的方法,其特征在于,还包括:
在所述Simulink模块开始仿真之前,接收用户设置的采样频率;
将所述Simulink模块设置为按照所述采样频率输出仿真数据。
3.根据权利要求1所述的方法,其特征在于,所述创建包含所述仿真数据的结构体包括:
将所述仿真数据按照预设的编码规则进行编码,获得编码后的仿真数据;
建立包含所述编码后的仿真数据的结构体。
4.根据权利要求1所述的方法,其特征在于,所述获取Windows界面的接收窗口包括:
运行user32.dll中的findwindow函数,判断是否存在Windows界面的接收窗口;
如果存在,获取所述接收窗口的句柄。
5.根据权利要求1所述的方法,其特征在于,所述向Windows界面的接收窗口发送获取所述结构体的消息包括:
调用SendMessage函数向所述Windows界面的接收窗口发送指向所述结构体的指针的WM_COPYDATA消息。
6.一种实现Simulink模块仿真数据输出到界面的装置,其特征在于,包括:
捕获输出单元:用于响应于接收到Simulink模块输出仿真数据的事件,捕获所述输出的仿真数据;
创建消息单元:用于创建包含所述仿真数据的结构体;
获取窗口单元:用于获取Windows界面的接收窗口;
发送消息单元:用于向所述Windows界面的接收窗口发送获取所述结构体的消息,以使Windows界面根据所述消息获取所述结构体中的仿真数据。
7.根据权利要求6所述的装置,其特征在于,还包括:
初始化单元:用于在所述Simulink模块开始仿真之前,接收用户设置的采样频率;将所述Simulink模块设置为按照所述采样频率输出仿真数据。
8.根据权利要求6所述的装置,其特征在于,所述创建消息单元:用于将所述仿真数据按照预设的编码规则进行编码,获得编码后的仿真数据;建立包含所述编码后的仿真数据的结构体。
9.根据权利要求6所述的装置,其特征在于,所述获取窗口单元:用于运行user32.dll中的findwindow函数,判断是否存在Windows界面的接收窗口;如果存在,获取所述接收窗口的句柄。
10.根据权利要求6所述的装置,其特征在于,所述发送消息单元:用于调用SendMessage函数向所述Windows界面的接收窗口发送指向所述结构体的指针的WM_COPYDATA消息。
CN201310339061.6A 2013-08-06 2013-08-06 一种实现Simulink模块仿真数据输出到界面的方法及装置 Expired - Fee Related CN103399782B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310339061.6A CN103399782B (zh) 2013-08-06 2013-08-06 一种实现Simulink模块仿真数据输出到界面的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310339061.6A CN103399782B (zh) 2013-08-06 2013-08-06 一种实现Simulink模块仿真数据输出到界面的方法及装置

Publications (2)

Publication Number Publication Date
CN103399782A CN103399782A (zh) 2013-11-20
CN103399782B true CN103399782B (zh) 2016-07-13

Family

ID=49563416

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310339061.6A Expired - Fee Related CN103399782B (zh) 2013-08-06 2013-08-06 一种实现Simulink模块仿真数据输出到界面的方法及装置

Country Status (1)

Country Link
CN (1) CN103399782B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104657136B (zh) * 2015-02-10 2018-03-06 上海创景信息科技有限公司 Simulink组件的集成系统
CN108304194B (zh) * 2017-09-01 2021-08-20 潍柴动力股份有限公司 一种程序的生成方法、装置及电子设备

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101452339A (zh) * 2007-12-06 2009-06-10 国际商业机器公司 在虚拟宇宙中呈现真实世界对象与交互的方法和系统
CN103048929A (zh) * 2012-12-25 2013-04-17 中南大学 基于matlab引擎的可视化过程控制实时仿真方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101452339A (zh) * 2007-12-06 2009-06-10 国际商业机器公司 在虚拟宇宙中呈现真实世界对象与交互的方法和系统
CN103048929A (zh) * 2012-12-25 2013-04-17 中南大学 基于matlab引擎的可视化过程控制实时仿真方法

Also Published As

Publication number Publication date
CN103399782A (zh) 2013-11-20

Similar Documents

Publication Publication Date Title
CN102591961B (zh) 一种制作数据图表的方法及系统
CN104486138A (zh) 流量监控方法、装置和监控服务器
CN105487987B (zh) 一种处理并发顺序读io的方法及装置
CN110875850B (zh) 一种固件升级方法、系统、可读存储介质及终端设备
CN104253842B (zh) 同步终端镜像的方法、装置、终端及服务器
CN108234659B (zh) 数据处理方法、装置及系统
CN111158779B (zh) 一种数据处理方法和相关设备
CN108628738A (zh) 应用程序编程接口测试用例的生成方法及装置
CN107329916B (zh) 一种usb设备控制方法、装置及计算设备
CN109756568A (zh) 文件的处理方法、设备及计算机可读存储介质
CN102999608A (zh) 大数据的树表展现系统和树表展现方法
CN107509051A (zh) 远程控制方法、装置、终端及计算机可读存储介质
CN108712320A (zh) 消息推送方法及装置
CN110427134A (zh) 即时通讯的数据处理方法、装置、设备及可读存储介质
CN103716356A (zh) 基于web的存储过程操作方法、装置和系统
CN105306677A (zh) 智能设备的控制方法、装置及系统
CN103399782B (zh) 一种实现Simulink模块仿真数据输出到界面的方法及装置
CN106940714B (zh) 一种数据处理方法、装置及电子设备
CN103970582A (zh) Usb设备模拟方法
CN105988814A (zh) 界面生成方法及装置
CN105262604A (zh) 虚拟机迁移方法及设备
CN106850770A (zh) 基于云计算服务的高效传输方法和装置
CN105607913B (zh) 互联应用的操作处理方法及装置
CN107463524A (zh) 一种访问数据的方法及相关设备
Iglesias et al. Enabling powerful GUIs in ISOBUS networks by transparent data compression

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20160713

Termination date: 20200806

CF01 Termination of patent right due to non-payment of annual fee