Simlink生成dll与unity通信的一种方法

本文介绍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博客

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值