Datamodel example

<< 点击显示目录 >>

主页  exOS使用助手 > exOS Automation Help > Development > Programming > Data communication > Datamodel description >

Datamodel example

要理解生成的数据模型描述,最简单的方法可能就是通过一个示例。

为简单起见,让我们看看下面的 Types.typ文件 :

TYPE
   Types : STRUCT
       Run : BOOL; (*PUB*)
       Running : BOOL; (*SUB*)
       Counter : UDINT; (*SUB*)
   END_STRUCT;
END_TYPE

数据模型定义文件  通过以下 .exospkg 定义与 exOS 构建链一起生成 :

<?xml version="1.0" encoding="utf-8"?>
<ComponentPackage .. >
   ..
   <Build>
       <GenerateDatamodel FileName="Types.typ" TypeName="Types">
           <SG4 Include="TypesTYP.h"/>
           <Output Path="Linux"/>
           <Output Path="Types"/>
       </GenerateDatamodel>

它会创建以下 exos_types.h 头文件:

/Automatically generated header file from Types.typ/

#ifndef _EXOS_COMP_TYPES_H_
#define _EXOS_COMP_TYPES_H_
#include "exos_api.h"
#if defined(_SG4)
#include <Types.h>
#else
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
typedef struct Types
{
   bool Run; //PUB
   int32_t Counter; //PUB SUB
   bool Running; //SUB
} Types;
#endif // _SG4
EXOS_ERROR_CODE exos_datamodel_connect_types(exos_datamodel_handle_t *datamodel, exos_datamodel_event_cb datamodel_event_callback);
#endif // _EXOS_COMP_TYPES_H_

以及下面的 exos_types.c:

/*Automatically generated c file from Types.typ*/
#include "exos_types.h"
const char config_types[] = "{\"name\":\"struct\",\"attributes\":{\"name\":\"<NAME>\",\"dataType\":\"Types\",\"info\":\"<infoId0>\"},\"children\":[{\"name\":\"variable\",\"attributes\":{\"name\":\"Run\",\"dataType\":\"BOOL\",\"comment\":\"PUB\",\"info\":\"<infoId1>\"}},{\"name\":\"variable\",\"attributes\":{\"name\":\"Counter\",\"dataType\":\"DINT\",\"comment\":\"PUB SUB\",\"info\":\"<infoId2>\"}},{\"name\":\"variable\",\"attributes\":{\"name\":\"Running\",\"dataType\":\"BOOL\",\"comment\":\"SUB\",\"info\":\"<infoId3>\"}}]}";
/*Connect the Types datamodel to the server*/
EXOS_ERROR_CODE exos_datamodel_connect_types(exos_datamodel_handle_t *datamodel, exos_datamodel_event_cb datamodel_event_callback)
{
   Types data;
   exos_dataset_info_t datasets[] = {
       {EXOS_DATASET_BROWSE_NAME_INIT,{}},
       {EXOS_DATASET_BROWSE_NAME(Run),{}},
       {EXOS_DATASET_BROWSE_NAME(Counter),{}},
       {EXOS_DATASET_BROWSE_NAME(Running),{}}
   };
   exos_datamodel_calc_dataset_info(datasets, sizeof(datasets));
   return exos_datamodel_connect(datamodel, config_types, datasets, sizeof(datasets), datamodel_event_callback);
}

关于这两个文件的更多详情,请参阅 " 头文件 "说明


The simplest way to understand the generated datamodel description is probably to go through an example.

For the sake of simplicity, lets have a look at the following file Types.typ:

TYPE
    Types : STRUCT
        Run : BOOL; (*PUB*)
        Running : BOOL; (*SUB*)
        Counter : UDINT; (*SUB*)
    END_STRUCT;
END_TYPE

The datamodel definition files are generated with the exOS build-chain via the following .exospkg definition:

<?xml version="1.0" encoding="utf-8"?>
<ComponentPackage .. >
    ..
    <Build>
        <GenerateDatamodel FileName="Types.typ" TypeName="Types">
            <SG4 Include="TypesTYP.h"/>
            <Output Path="Linux"/>
            <Output Path="Types"/>
        </GenerateDatamodel>

It creates the following exos_types.h headerfile:

/Automatically generated header file from Types.typ/

#ifndef _EXOS_COMP_TYPES_H_
#define _EXOS_COMP_TYPES_H_
#include "exos_api.h"
#if defined(_SG4)
#include <Types.h>
#else
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
typedef struct Types
{
    bool Run; //PUB
    int32_t Counter; //PUB SUB
    bool Running; //SUB
} Types;
#endif // _SG4
EXOS_ERROR_CODE exos_datamodel_connect_types(exos_datamodel_handle_t *datamodel, exos_datamodel_event_cb datamodel_event_callback);
#endif // _EXOS_COMP_TYPES_H_

As well as the following exos_types.c:

/*Automatically generated c file from Types.typ*/
#include "exos_types.h"
const char config_types[] = "{\"name\":\"struct\",\"attributes\":{\"name\":\"<NAME>\",\"dataType\":\"Types\",\"info\":\"<infoId0>\"},\"children\":[{\"name\":\"variable\",\"attributes\":{\"name\":\"Run\",\"dataType\":\"BOOL\",\"comment\":\"PUB\",\"info\":\"<infoId1>\"}},{\"name\":\"variable\",\"attributes\":{\"name\":\"Counter\",\"dataType\":\"DINT\",\"comment\":\"PUB SUB\",\"info\":\"<infoId2>\"}},{\"name\":\"variable\",\"attributes\":{\"name\":\"Running\",\"dataType\":\"BOOL\",\"comment\":\"SUB\",\"info\":\"<infoId3>\"}}]}";
/*Connect the Types datamodel to the server*/
EXOS_ERROR_CODE exos_datamodel_connect_types(exos_datamodel_handle_t *datamodel, exos_datamodel_event_cb datamodel_event_callback)
{
    Types data;
    exos_dataset_info_t datasets[] = {
        {EXOS_DATASET_BROWSE_NAME_INIT,{}},
        {EXOS_DATASET_BROWSE_NAME(Run),{}},
        {EXOS_DATASET_BROWSE_NAME(Counter),{}},
        {EXOS_DATASET_BROWSE_NAME(Running),{}}
    };
    exos_datamodel_calc_dataset_info(datasets, sizeof(datasets));
    return exos_datamodel_connect(datamodel, config_types, datasets, sizeof(datasets), datamodel_event_callback);
}

These two files are described more in detail in the Headerfile description.