Simulink中Functioncaller和 Simulink Function 与Stateflow调用

本次学习基于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块显示在何处生成对函数的调用,以及在不同时间调用哪些函数。这有助于了解有关时间的调用流程,还有助于分析在调用这些函数期间发送的参数。

实际搭建过程

搭建客户端模型

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

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

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

搭建添加打印任务模型

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

搭建打印机模型

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

 

搭建chart

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

搭建模型过程中注意参数的类型和作用范围,此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

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

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

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

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

模型可视化设置

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

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