一、Mask中参数的传递
在编写Mask界面时每一个控件都有设置其参数名称
将需要传递的参数名字写在S-Function参数框里,即可在S-Function的代码中对该代码进行引用
1.Edit控件参数的传递
Edit控件可传入数字、字符串
1.1字符串类型参数传递
%输入:S,ParaIndex:参数索引(从0开始),strs:字符串变量
%返回值:无
%描述:获取传入参数中的字符串内容赋值给strs
void GetStrPara(SimStruct *S, int_T ParaIndex, char_T **strs)
{
char_T *tmpStr;%存储参数内容
int_T length = (int_T)mxGetNumberOfElements(ssGetSFcnParam(S,ParaIndex));%获取参数长度
if ( (tmpStr=(char_T*)malloc(length+1)) == NULL )%开辟存储空间
{
ssSetErrorStatus(S,"Memory allocation error in mdlStart");
return;
}
if ( mxGetString(ssGetSFcnParam(S,ParaIndex),IpAddrStr,length+1) != 0 ) %将MATLAB字符串变量转成C语言字符串变量
{
free(IpAddrStr);
ssSetErrorStatus(S,"mxGetString error in mdlStart");
return;
}
*strs=tmpStr;%将参数内容赋值给字符串变量,完成参数的传递
//printf("String is %s\n",*strs);
}
用一重指针MATALB运行的时候老是报错,用二重指针就可以正常工作,不知道什么原因
函数的引用
char_T *Net_ip;
GetStrPara(S,0,&Net_ip);
%这样就把S-Function的第1个参数以字符串格式取出,赋值给*Net_ip
1.2数字类型参数传递
real_T* Channels;
Channels = mxGetPr(ssGetSFcnParam(S,0));
取出参数返回一个指向浮点类型的指针,赋值给Channels
2.Popup控件参数的传递
Popup控件的参数传递方式和Edit控件一致,根据参数的类型选择字符串传递还是数字类型传递,不过要强调的是传进去的参数具体是什么。
传进去的参数是Value框内的值,也就是Popup控件所选的当前值。
3.Table控件参数传递
3.1获取整个表格的数据
将Table对应的参数名写到S-FUnction参数框中,然后使用GetStrPara函数对参数进行取值
将会取出Table的Value值,结果为:(指向字符类型的指针)
{ 'Adc_ch2', '2'; 'Adc_ch5', '5'; 'Adc_ch6', '6' }
;代表了表格的下一行
这里需要强调的是直接从表格取出的值是一串字符串,并不是矩阵,虽然看起来格式很像矩阵,但不能通过索引进行取值。
如何将其转化为矩阵呢?
假设我们取出的值存储在变量Info中,如何将Info转化为矩阵呢
MxInfo=eval(Info);
MxInfo存储的就是矩阵
3.2获取表格属性
3.2.1获取表格行列
上面取出了表格的矩阵
[Row,Column]=size(MxInfo);
Row为表格的行数
Column为表格的列数
基本函数使用不清楚的地方请参考
二、S-Function间参数传递
不同S-Function间如何共用参数呢
比如现在我有两个S-Function:setup和CanRx
从setup向CanRx传递一个参数
打开properities页面
里面有一些Callback,可以再里面写一些函数,来实现功能
不同的Callback代表触发时机不一样,例如我们这次用到的InitFcn触发时机为执行前
通过get_param获取参数,赋值给Path就会在工作区创建Path变量
打开CanRx的properities页面,在InitFcn获取参数,evalin为从工作区获取参数的值
然后将值赋给CanRx内的参数
如此实现了S-Function间参数的传递