
Simulink回调函数StartFcn可以注册监听事件,事件在周期都会更新一次。可以借此实现两者之间的实时通信。
GUI与simulink实时通信实例
新建GUI选择空白GUI。完成后先保存为Test,会生成两个文件Test.fig与Test.m,继续编辑Test.fig。
按以上界面从左侧控件列表拖入对应控件。双击按钮1打开属性对话框,修改string属性为Start,Tag属性改为PB_Start。同理修改按钮2为string属性为Stop,Tag属性改为PB_Stop。
如下图建立TestSim的simulink模型,存放在与fig文件相同的位置。模块可在simulink
Library Browser左上方输入名称查找,Real-Time Sync模块实现仿真与真实时间的同步(可能需要独立安装,按提示输入几个命令即可)。
打开Test.m文件,在Test_OpeningFcn中加入
load_system('TestSim')
在PB_Start_Callback中加入
set_param('TestSim','SimulationCommand','start')
在PB_Stop_Callback中加入
set_param('TestSim','SimulationCommand','stop')
在slider1_Callback中加入
pos =num2str(get(hObject,'Value')) %获取slider当前位置
set_param('TestSim/Constant','Value',pos)%将slider当前值赋值给Constant模块。
目前已经实现了GUI控制Simulink模型的单向 *** 作,接下来实现simulink模型实时传递数据给GUI界面。
在Test_OpeningFcn函数中加入line_H继承自axies1
line_H = line('Parent',handles.axes1,...
'XData',[],...
'YData',[],...
'Color','blue',...
'EraseMode','xor',...
'Tag','line_H')
function EventListener(block,eventdata)
hf = findall(0,'Tag','figure1')
ax = findall(hf,'Tag','axes1')
thisLineHandle = findall(hf,'Tag','line_H')
xdata = get(thisLineHandle,'XData')
ydata = get(thisLineHandle,'YData')
sTime = block.CurrentTime
data =
block.OutputPort(1).Data
if length(xdata) <1001
newXData = [xdata sTime]
newYData = [ydata data]
else
newXData = [xdata(2:end) sTime]
newYData = [ydata(2:end) data]
end
set(thisLineHandle,...
'XData',newXData,...
'YData',newYData)
newXLim = [max(0,sTime-10)
max(10,sTime)]
set(ax,'Xlim',newXLim)
end
在TestSim模型的StartFcn中加入监听事件:
h=add_exec_event_listener('TestSim/Product','PostOutputs',@EventListener)
至此已经完成了Simulink更新GUI中axes1数据的 *** 作,实现了Simulink向GUI实时传输数据的功能。运行Test.m文件点击start可以看到效果。
public class StaticProxy implements Star {private Star star
public StaticProxy(Star star) {
this.star = star
}
@Override
public void signContract() {
System.out.println("代理签约")
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)