感谢大家的迅速回复。 我应该提到我不太擅长 C 编程,但是从我基于嵌入式编码器 (Simulink) 文档得到的是: ert_main.c(下面的代码)是如何使用 model.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))
我希望它现在得到很好的解释
问题已解决。问题出在结构定义中。 我将我的定义与我所遵循的教程相同,而我生成的 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