查看: 253|回复: 0|关注: 0

[未答复] simulink和JAVA的混合仿真,问题描述详细,麻烦各位前辈了

[复制链接]

新手

25 麦片

财富积分


050


1

主题

3

帖子

0

最佳答案
发表于 2018-7-11 18:42:06 | 显示全部楼层 |阅读模式
各位论坛的前辈们,向大家请教一个问题
我在一个微电网的能量管理系统的项目,我需要用simulink来搭建微电网的主电路,然后控制环路需要用到JAVA编写的控制程序。大体的背景就是这样,我想向大家请教的问题是如何使得simulink和JAVA程序实时通信呢?
举一个简单的例子就是,假如在simulink中有一个正弦输入,输出是输入的两倍,虽然这很容易用simulink实现,但是我需要将这个处理过程调用外部的JAVA程序来处理。如何将simulink中正弦输入的信号传递给外部的JAVA程序,此时simulink需要等待JAVA处理,等JAVA处理结束之后,将数据传递给simulink,simulink继续下一个步长的仿真,下一个步长的运行过程与此类似。
关于这个问题,我已经研究来一周了,现在有一个想法就是通过S函数来处理这个数据传递。下面介绍一下我的想法,请前辈们指点一下。
hhhh.png
这是simulink最简单的输入放大两倍的模型,我采用的level1的S-function。
我想在工作区中创建两个数组A和B,其中A数组用来存储输入信号的采样,然后A数组通过matlab自带的JAVA引擎将数据传递给java程序处理。此时通过一个while循环可以控制simulink等待接收java处理。Java处理完放大两倍的程序之后通过引擎将数据存放进B数组中,simulink检测到B数组中有数据填入就跳出while循环,执行输出代码,进一步进入下一个步长的计算。
这是具体的思路。不知道思路可行不可行。在将思路执行的过程中,我有遇到很多问题。

1、        采样进来的信号是一个timeseries。我需要提取出其中的y轴的数据。我发现如上图所示采用To workspace模块并不能达到采样的目的,因为当数据存入到workspace中时,simulink已经运行结束了。于是我采用了evalin函数试图将正弦信号采样进工作区,如下图所示,其中我只粘贴其中的mdlOutputs部分。
function sys=mdlOutputs(t,x,u)
global zzz;
evalin('base','zzz=u');

sys = 2*u;
但是运行simulink提示是u未定义。我不知道该如何解决这个问题,还有当把输入存入到工作区之后,又该如何提取出其中的y轴的数组呢
1、        在我尝试通过S函数编写条件语句时,比如这是初始化部分
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
i1=0;

sizes = simsizes;
这是输出部分
function sys=mdlOutputs(t,x,u)
if(i1~=0)
    a=2;
else
    a=0;
end

sys = 2*a;
此时仿真会报错“未定义函数或变量i1”
以上两个疑问的代码部分并不是实现了我说的将数据传递到工作区中,只是我在尝试传递到工作区中遇到的两个问题。
写了这么多,就想将问题表达清楚,实在是麻烦大家阅读了许久
希望有前辈给出这个代码的问题所在,或者给出simulink和JAVA通信的其他方法,我这种通过S函数通信的方式目前还不知可不可行,也希望前辈给出指导意见。谢谢




您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表