使用 Python (ctypes) 编译 Simulink 生成的 C 代码

问题描述 投票:0回答:1

感谢大家的迅速回复。 我应该提到我不太擅长 C 编程,但是从我基于嵌入式编码器 (Simulink) 文档得到的是: ert_main.c(下面的代码)是如何使用 model.c

的示例
  • 在 ert_main.c 文件中,这些变量声明如下:
static RT_MODEL_NAME_T Model_NAME_M_;
static RT_MODEL_NAME_T *const Model_NAME_M = &Model_NAME_M_;/* Real-time 
model */
static DW_Model_NAME_T Model_NAME_DW;/* Observable states */

在model.c中,model_initialize定义为:

void model_initialize(RT_MODEL_model_T *const model_M, real_T *model_U_reference,
                      real_T *model_Y_measure)
{
}

我试着模仿这个结构:

typedef struct {
 real_T state1_DSTATE; /* '<S8>/state1 measure' */
 real_T state2_DSTATE; /* '<S3>/state2 measure' */
 real_T DiscreteTimeIntegrator1_DSTATE;/* '<S4>/Discrete-Time Integrator1' */
 uint8_T DiscreteTimeIntegrator_LOAD;/* '<S27>/Discrete-Time Integrator' */
 boolean_T G1_PreviousInput; /* '<S39>/G1' */
} DW_Model_NAME_T;
...
struct tag_RTM_Model_NAME_T { /*Just holding the pointer in this case*/
 DW_Model_NAME_T *dwork;
};

这是我的 python 代码的一部分(我只尝试了 3 个参数但同样的错误): (根据

from ctypes import *  # Import ctypes library

libc = CDLL("./test.so")  # Load library

# Rename main functions for readibility
initialize = libc.model_initialize
step = libc.model_step
terminate = libc.model_terminate



# Create both ctypes structures of both state variables
class DW_model_T(Structure):
    _fields_ = [("state1_DSTATE", c_double),
                ("state2_DSTATE", c_double),
                ("DiscreteTimeIntegrator1_DSTATE", c_double),
                ("DiscreteTimeIntegrator_LOAD", c_ubyte),
                ("G1_PreviousInput", c_ubyte)]


class RT_MODEL_model_T(Structure):
    _fields_ = [("dwork", POINTER(DW_model_T))]


# Now mimic their declaration in ert_main.c
model_DW = DW_model_T()
model_M_ = RT_MODEL_model_T()
model_M = pointer(model_M_)
model_M_.dwork = pointer(model_DW)

# Also declare inputs and outputs before initializing
model_U_ref = c_double()
model_Y_measure = c_double()
# Initialize model
initialize(model_M_,
           byref(model_U_ref),
           byref(model_Y_measure))

我希望它现在得到很好的解释

python c ctypes simulink embedded-coder
1个回答
0
投票

问题已解决。问题出在结构定义中。 我将我的定义与我所遵循的教程相同,而我生成的 C 代码并不完全相同(可能是由于不同的编译器或 Matlab 版本)。 所以这是我的model.h中的结构:

typedef struct {
  real_T DiscreteTimeIntegrator_DSTATE;/* '<Root>/Discrete-Time Integrator' */
} DW_model_T;

/* Real-time Model Data Structure */
struct tag_RTM_model_T {
  const char_T * volatile errorStatus;
  DW_model_T *dwork;
};

在这里它应该如何在 python 中声明/定义:

class DW_model_T(Structure):
    _fields_ = [("DiscreteTimeIntegrator_DSTATE", c_double)]


class RT_MODEL_model_T(Structure):
    _fields_ = [("errorStatus", c_char_p),
                ("dwork", POINTER(DW_model_T))]

其余相同(调用每个函数只有3个参数) 谢谢大家,你们帮了大忙<3

© www.soinside.com 2019 - 2024. All rights reserved.