本次学习基于matlab自带示例“slexPrinterExample”,根据matlab官方帮助文档和自己实际搭建模型过程遇到的问题,对Simulink Function 和function caller之间的交互进行一些记录,如果您有更深层次的研究,
请参考官方文档。以下是对官网帮助文档的翻译,原文地址为:
使用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块来调用queuePrintJob,queuePrintJob是Stateflow导出的图形函数。
2. queuePrintJob函数使用本地图表变量“ work”与图表中的其他内容进行交互。
3.图表的实现调用了Simulink Function的printerInk。
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选项即可。