本文介绍Simlink生成dll与unity进行通信的一种方法!
本文所使用的软件:Matlab2022a;unity2021LTS;VS2019 profession
所有文件尽量放置一个文件下,且路径不能含有中文。
1 打开matlab,修改路径(即需要保存的文件位置)
2 设计simlink模型生成C代码
2.1 设计以下传递函数模型
2.2 添加系统输入输出
鼠标右键点击空白处点击浏览打开模型资源管理器,点击Base Workspace,点击添加,添加自定义;
对象名称设置两个,分别为in,out,对象类均为mpt.Signal
设置完成如下:
返回Simlink,右击输入,选择属性,信号名称设置为上一步设置的“in”,勾选“信号名称必须解析为Simlink信号对象”。输出设置与输入设置相同。
2.3 导出设置
单击建模,选择模型设置,求解器类型选择“定步长”,求解器选择ode4,求解器详细设置中,更改固定步长为0.01
确认硬件实现,我的系统是windows64位,Intel
单击代码生成,系统目标文件选择如下
因为本文所用的是传递函数模型,所以接口设置中需要勾选“连续时间”
ctrl + B,代码生成
3 使用VS生成解决方案
选择继续但无需代码
单击文件——新建——从现有代码中创建项目,项目位置即本文第一步中的位置,项目名称命名为example
单击调试,example调试属性,配置类型设置为动态库
另外,需添加两个库,分别是MATLAB库的.h文件引用及保存文件的库,如下:
在右侧解决方案Header Files文件夹下,右击选择添加项,添加头文件,名称命名为Header.h
代码如下:
#pragma once
#ifndef HEADER_H
#define HEADER_H
#define DLLEXPORT_API extern "C" _declspec(dllexport)
_declspec(dllexport) void __stdcall untitled_initialize();
_declspec(dllexport) void __stdcall untitled_step();
_declspec(dllexport) void __stdcall untitled_terminate();
_declspec(dllexport) double __stdcall in_val(double myin);
_declspec(dllexport) double __stdcall out_val();
#endif
返回untitled.c文件下,添加引用头文件
我们需要对定义好的三个函数进行修改,添加 “__stdcall”
我们在untitled.c文件中对自己声明的两个函数进行定义:in与out即是我们在simlink中生成的变量名
double __stdcall in_val(double myin) {
in = myin;
return in;
}
double __stdcall out_val() {
return out;
}
在ert_main.c文件中,我们需要引用我们编写的头文件
我们在untitled.h文件中,删掉我们重复定义的三个函数
单击生成解决方案即可生成dll文件
4 unity调用dll文件
打开unity,将example.dll文件放置Assets文件夹下,新建C#脚本文件挂载至空物体上,将脚本修改如下:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
public class test : MonoBehaviour
{
// Start is called before the first frame update
[DllImport("example")] static extern void untitled_initialize();
[DllImport("example")] static extern void untitled_step();
[DllImport("example")] static extern void untitled_terminate();
[DllImport("example")] static extern double in_val(double myin);
[DllImport("example")] static extern double out_val();
void Start()
{
untitled_initialize();
Debug.Log("ok!");
in_val(0.17);
}
// Update is called once per frame
void Update()
{
untitled_step();
Debug.Log(out_val());
}
}
5 结果
文章大多数内容来源大佬以下教程,有任何描述有误的地方欢迎指正!
https://www.bilibili.com/video/BV13R4y1k7sk/
由于电脑软件和硬件的不同,本文所描述的部分方法与视频不同,特此记录,以供学习。
此外,本文涉及部分方法来源其他博客,参考链接如下,如有侵权,联系删除:
https://www.bilibili.com/read/cv7698907
https://www.bilibili.com/video/BV1tA411N7HB/
Simulink生成C语言代码与Unity实现通信的一种方法_simulink2020生成c代码_ra_vel的博客-CSDN博客