Simulink中Functioncaller和 Simulink Function 与Stateflow调用

时间:2024-03-26 14:14:38

本次学习基于matlab自带示例“slexPrinterExample”,根据matlab官方帮助文档和自己实际搭建模型过程遇到的问题,对Simulink Function 和function caller之间的交互进行一些记录,如果您有更深层次的研究,

请参考官方文档。以下是对官网帮助文档的翻译,原文地址为:

https://ww2.mathworks.cn/help/simulink/slref/monitoring-ink-status-on-a-shared-printer-using-simulink-functions.html?s_tid=srchtitle

使用Simulink功能监视共享打印机上的墨水状态

此示例说明客户端(在本例中为三台计算机)如何将作业发送到服务器,打印机以及从该服务器接收状态。此示例重点介绍了如何从不同的子系统调用Simulink Functions,并在Simulink®和Stateflow®中进行交互。

示例要求

请注意,在模拟示例时,Stateflow可能会在当前工作文件夹中生成代码。

总览

在此示例中,每台计算机均按固定间隔生成随机大小的打印作业。打印机通过Simulink画布上的两个Simulink函数和Stateflow中的一个Exported Graphical Function与计算机进行交互。

1.客户端(clients)使用Function Caller块来调用打印机的addPrintJob接口。

2.如果打印机用完了墨水,则以此调用为模型的客户端-服务器 (client-server) 交互可能具有负的返回值。

该示例显示了如何使用函数连接Simulink和Stateflow

1. addPrintJob的实现使用Function Caller块来调用queuePrintJobqueuePrintJobStateflow导出的图形函数。

2. queuePrintJob函数使用本地图表变量“ work”与图表中的其他内容进行交互。

3.图表的实现调用了Simulink FunctionprinterInk。

4. printerInk函数作业使用图形输入和输出与addPrintJob函数进行交互。

该示例还显示了如何可视化和调试Simulink函数

1.您可以启用连接功能及其各自调用者的可视化线。在Simulink编辑器的“调试”选项卡上的“信息覆盖”下,单击“功能连接器”。

2. Message Viewer块显示在何处生成对函数的调用,以及在不同时间调用哪些函数。这有助于了解有关时间的调用流程,还有助于分析在调用这些函数期间发送的参数。

实际搭建过程

Simulink中Functioncaller和 Simulink Function 与Stateflow调用

搭建客户端模型

首先搭建客户端,即三个具有打印功能的电脑,本实验客户端数据源用到的模块是Uniform Random Number,产生随机数。在客户端内添加调用打印机的addPrintJob接口

的Function Caller模块。(小技巧:搭建完成computer1后,鼠标左键选中conputer1,右键拖动到其他位置生成computer2和computer3即可,不用重复搭建。)

Simulink中Functioncaller和 Simulink Function 与Stateflow调用

添加Function caller 模块后,其中Function Prototype(函数原型),一定要与Simulink Function 函数名称和大小写一致。

Simulink中Functioncaller和 Simulink Function 与Stateflow调用Simulink中Functioncaller和 Simulink Function 与Stateflow调用

搭建添加打印任务模型

添加addPrintJob接口,在这个Simulink Function中调用 stateflow queuePrintJob(job)函数,排队和处理传入打印任务

Simulink中Functioncaller和 Simulink Function 与Stateflow调用Simulink中Functioncaller和 Simulink Function 与Stateflow调用

搭建打印机模型

添加 Simulink Function,添加printerInk函数接口,输入变量为work,work变量的作用域为Matlab状态空间。

Simulink中Functioncaller和 Simulink Function 与Stateflow调用Simulink中Functioncaller和 Simulink Function 与Stateflow调用

 

搭建chart

搭建Sta'te'flow模型,打印机的状态有空闲(Idle)正忙(Busy)两种状态,搭建对应模型如下:

Simulink中Functioncaller和 Simulink Function 与Stateflow调用

Simulink中Functioncaller和 Simulink Function 与Stateflow调用

搭建模型过程中注意参数的类型和作用范围,此chart中work的作用域为状态机内,与Simulink Function printerInk函数中输入变量work,同名但是不是一个变量。

同时两个变量INK_MIN(墨水最小值)和 PRINT_RATE(打印速率)变量的初始值是在 Model Workspace中设置的,两个值为1。

Chart状态机调用simulink Function 中printerInk函数,printerInk(- PRINT_RATE) = printerInk(work);所以打印机模型simulink Function 中work == -1

Simulink中Functioncaller和 Simulink Function 与Stateflow调用

另外还有一些配置参数的设置需要注意:

Simulink中Functioncaller和 Simulink Function 与Stateflow调用

1 语言的类型为C。(看自己习惯用哪种语言编程)

2 因为数据源头uniform random number采用方式是离散的采样周期为1,所以stateflow chart更新方法也为Discrete

3 将queuePrintJob(job) function导出作为全局可见。

模型可视化设置

可以添加Message Viewer模块,观察模型的时序图。

Simulink中Functioncaller和 Simulink Function 与Stateflow调用

Simulink中Functioncaller和 Simulink Function 与Stateflow调用

Simlink Function 和FunctionCaller连接线设置  ,勾选Display中Function Connectors选项即可。

Simulink中Functioncaller和 Simulink Function 与Stateflow调用