条件语句/循环语句simulink的实现方法(一)

电子说

1.2w人已加入

描述

条件语句和循环语句是计算机编程中常用的两种控制结构

条件语句是一种根据某个条件来执行不同操作的程序结构。当满足特定条件时,程序会执行一个或多个指定的操作;否则,程序将跳过这些操作并继续执行下一条语句。在大多数编程语言中,条件语句通常使用if-else语句实现,也可以使用switch-case语句等其他形式。

循环语句是一种重复执行相同或类似操作的程序结构。它允许程序按照预定义的次数或者直到某个条件被满足为止重复执行一组语句。在大多数编程语言中,循环语句通常使用for、while、do-while等关键字实现。

通过使用条件语句和循环语句,程序员可以更加灵活地控制程序的流程和行为,从而实现各种复杂的功能和应用

文本通过python,Stateflow,Simulink 以及 MATLAB Function四种方法实现If-else、Switch -case、For循环、While循环、Do-while循环

If-Else

if else循环的本质是根据给定条件判断程序执行哪个分支。具体来说,if语句会先判断括号中的条件是否为真,如果为真,则执行花括号内的代码块;否则,跳过该代码块,继续执行下一个语句。

x = 10

if x > 5:
    print("x大于5")
else:
    print("x小于等于5")

在这个示例中,我们定义了变量x,并使用if else语句对其进行判断。首先,if语句会判断x是否大于5,由于x的值为10,因此条件成立,程序将输出“x大于5”。如果x的值为3,则条件不成立,程序将跳过if语句块,执行else语句块,输出“x小于等于5”。

总之,if else循环可以帮助我们根据不同的情况采取不同的行动,从而实现更加灵活和智能的编程。

举例说明1

对于自动空调控制系统,以夏季空调制冷为例,当主副驾设定不同需要求温度时(temp_set_driver,temp_set_passenger),整车TD负荷值按空调设定温度最低的一侧取值进行计算

Python实现

temp_set_driver = int(input("请输入主驾温度:"))
temp_set_passenger = int(input("请输入副驾温度:"))

if temp_set_driver <= temp_set_passenger:
    output = temp_set_driver
else:
    output = temp_set_passenger

print("自动空调设定温度为:", output)
"""
我们使用了input()函数来获取用户输入,并将其转换成整数类型。然后,我们使用if else语句来判断两个变量的大小关系,并将最小值赋给output变量。

最后输出自动空调设定温度即可。例如,在上述示例中,当用户输入主驾温度为20,副驾温度为22时,程序会输出“自动空调设定温度为:20”,因为此时主驾温度小于等于副驾温度。而当用户输入主驾温度为28,副驾温度为24时,程序会输出“自动空调设定温度为:24”,因为此时主驾温度大于副驾温度。
"""

matlab function实现

function output = auto_temp_control(temp_set_driver, temp_set_passenger)
% 自动空调设定温度取主驾和副驾温度的最小值

if temp_set_driver <= temp_set_passenger
    output = temp_set_driver;
else
    output = temp_set_passenger;
end

fprintf("自动空调设定温度为:%dn", output);
%{
我们定义了一个名为auto_temp_control的MATLAB函数,并接受两个输入参数:temp_set_driver和temp_set_passenger。然后,我们使用if else语句来判断两个变量的大小关系,并将最小值赋给output变量。

最后,我们使用fprintf()函数输出自动空调设定温度即可。例如,在上述示例中,当用户输入主驾温度为20,副驾温度为22时,程序会输出“自动空调设定温度为:20”,因为此时主驾温度小于等于副驾温度。而当用户输入主驾温度为28,副驾温度为24时,程序会输出“自动空调设定温度为:24”,因为此时主驾温度大于副驾温度。
%}

simulink实现

控制器

控制器

当然,simulink实现方法是为了体现If-Else条件语句的逻辑,采用了Switch模块,单看此部分的实例,选用min模块会更加方便

控制器

Stateflow实现

控制器

If-Else If-Else

If-Else If-Else通常用于处理多种情况的判断,例如根据不同的条件执行不同的操作。以下是一个简单的示例代码(Python):

score = 85

if score >= 90:
    grade = 'A'
elif score >= 80:
    grade = 'B'
elif score >= 70:
    grade = 'C'
elif score >= 60:
    grade = 'D'
else:
    grade = 'F'

print("成绩为:", grade)

举例说明2

**当车内环境温度(temp_incar)低于10℃时,空调开启加热模式(AC_state==heater),当车内环境温度处于10℃到30℃时开启空调自然风模式(AC_state==natural_wind),当车内环境温度大于30℃时开启制冷模式(AC_state==cooling)**

Python实现

temp_incar = float(input("请输入车内环境温度:"))

if temp_incar < 10:
    AC_state = 'heater'
elif temp_incar >= 10 and temp_incar <= 30:
    AC_state = 'natural_wind'
else:
    AC_state = 'cooling'

print("空调状态为:", AC_state)

matlab function实现

function AC_state = calculate_AC_state()
% 计算空调状态

temp_incar = input("请输入车内环境温度:");

if temp_incar < 10
    AC_state = 'heater';
elseif temp_incar >= 10 && temp_incar <= 30
    AC_state = 'natural_wind';
else
    AC_state = 'cooling';
end

fprintf('空调状态为:%sn', AC_state);

end
%{
在这个示例中,我们首先定义了一个名为calculate_AC_state()的MATLAB函数,并使用input()函数提示用户输入车内环境温度。然后,我们使用If-Else If-Else深层次逻辑来根据车内环境温度计算出对应的空调状态,与之前的Python代码相同。最后,我们使用fprintf()函数输出计算出的空调状态。
当你调用该函数时,程序会等待用户输入车内环境温度,并根据输入的值计算出对应的空调状态。
%}

simulink实现

控制器

如果执行语句只是简单的赋值,使用 switch 模块即可,如果涉及到更复杂的计算,应避免频繁使用开关块进行条件分岔,可考虑使用 If 以及 If Action Subsystem 模块,但是这个"复杂"也很难定义。对于 Switch来说,通常会约束一个层叠的上限,比如三层,如果 switch 模块层层叠叠层级非常多也可以考虑用子系统分别“包裹”起来,如果没有状态量的话,最好就不要用 If Action Subsystem模块,理论上 Stateflow,Simulink 以及 MATLAB Function 几乎都可以完成相同的模型,只是要根据应用场合和使用习惯加以取舍。

使用 If 以及 If Action Subsystem 模块对上面的switch模块进行改造,如下:

在Simulink中,If模块和If Action Subsystem模块组合可以用于实现多个条件分支逻辑。

  • If Action Subsystem 模块是经过预先配置的 Subsystem模块,可以作为一个起点,用来创建由 If模块控制执行的子系统。If 模块计算逻辑表达式,然后根据计算结果输出动作信号。子系统的执行由放置在子系统内部的 Action Port模块控制;
  • If 模块以及包含 Action Port 模块的 If Action Subsystem 模块实现 if-else 逻辑来控制子系统的执行。有关使用 If 模块的示例,请参阅 If 执行子系统;
  • If 模块从一组子系统中选择 If Action Subsystem 模块的执行。无论 If 模块选择哪个子系统,您都可以使用 Merge模块创建单个信号;
  • If Action Subsystem 模块中的所有模块必须以与驱动 If 模块相同的速率执行。您可以通过将每个模块的采样时间参数设置为继承 -1或与 If 模块采样时间相同的值来满足此要求;
    控制器

Stateflow实现

控制器

Switch - Case

在Python中,switch-case结构并不是一种原生的语言结构。但我们可以使用其他方式来实现类似的功能。

一种常见的方法是使用字典(dictionary)和函数映射来模拟switch-case结构。具体步骤如下:

    1. 创建一个字典,将每个条件对应的操作函数作为值存储在其中。
    1. 根据输入信号选择相应的操作函数,并执行它。

以下是一个使用字典和函数映射实现switch-case结构的示例代码:

def case_1():
    print("Case 1")

def case_2():
    print("Case 2")

def case_3():
    print("Case 3")

# 创建字典
cases = {
    1: case_1,
    2: case_2,
    3: case_3
}

# 输入信号
u = 2

# 根据输入信号选择相应的操作函数,并执行它
if u in cases:
    cases[u]()
else:
    print("Invalid input")

在上述代码中,我们首先定义了三个操作函数case_1()case_2()case_3(),分别对应三种情况。然后,我们创建了一个字典cases,将每个条件对应的操作函数作为值存储在其中。最后,根据输入信号选择相应的操作函数,并执行它。

既然python尚不支持Switch-Case,那我们先用一个C代码示例展示Switch-Case语法结构吧

#include < stdio.h >

int main() {
    int choice;
    
    printf("Please select an option:n");
    printf("1. Option 1n");
    printf("2. Option 2n");
    printf("3. Option 3n");
    scanf("%d", &choice);
    
    switch (choice) {
        case 1:
            printf("You selected Option 1.n");
            break;
        case 2:
            printf("You selected Option 2.n");
            break;
        case 3:
            printf("You selected Option 3.n");
            break;
        default:
            printf("Invalid input.n");
            break;
    }
    
    return 0;
}
/*
在上述代码中,我们首先输出一个菜单,让用户选择一个选项。然后,我们使用switch-case结构来根据用户的选择执行相应的操作。如果用户输入了无效的选项,则会输出“Invalid input.”。

这个示例代码可以用于各种需要用户交互的场景,例如命令行工具、控制台程序等。
*/

闲话休提,我们接着举例说明Switch-Case语句如何用simulink实现

举例说明3

**空调吹风模式具有多种状态,AC控制器需要把不同吹风模式反馈给大屏控制器用于状态显示,AC_flow_state=0x0时,AC_state=’face’;AC_flow_state=0x1时,AC_state=’foot’;AC_flow_state=0x2时,AC_state=’defrost’**

C代码实现

#include < stdio.h >

int main() {
    int AC_flow_state = 1;
    char AC_state[10];
    
    switch (AC_flow_state) {
        case 0:
            sprintf(AC_state, "face");
            break;
        case 1:
            sprintf(AC_state, "foot");
            break;
        case 2:
            sprintf(AC_state, "defrost");
            break;
        default:
            printf("Invalid input.n");
            return -1;
    }
    
    printf("The AC state is %s.n", AC_state);
    
    return 0;
}
/*
在上述代码中,我们首先定义了一个整型变量AC_flow_state表示空调吹风模式状态。然后,我们使用switch-case结构根据不同的状态值来设置字符串类型的变量AC_state。最后,我们输出AC_state的值。
需要注意的是,在default分支中,我们输出了“Invalid input.”并返回-1,这是为了防止程序出现未知错误。
char AC_state[10]是一个字符数组,用于存储空调吹风模式的状态。在这个例子中,我们将其定义为长度为10的数组,因为最长的状态字符串"defrost"有7个字符,再加上结尾符�,所以需要分配至少8个字节的空间。
*/

matlab function代码实现

function AC_state = get_AC_state(AC_flow_state)
% This function returns the corresponding AC state based on the input flow state.

switch AC_flow_state
    case 0
        AC_state = 'face';
    case 1
        AC_state = 'foot';
    case 2
        AC_state = 'defrost';
    otherwise
        error('Invalid input.');
end

fprintf('The AC state is %s.n', AC_state);

end
%{
在上述代码中,我们首先定义了一个MATLAB函数get_AC_state(),它接受一个整型参数AC_flow_state表示空调吹风模式状态。然后,我们使用switch-case结构根据不同的状态值来设置字符串类型的变量AC_state
}%

simulink实现

控制器

Stateflow实现

控制器

而对于 Stateflow 来说,不管是if-else还是switch-case,其实都是流程图。所以就算你按照switch-case的逻辑画了出来,生成的代码依旧是if-else形式的。

所以需要我们稍微配置一下:模型设置→代码生成→代码风格→勾选convert if-elseif-else patterns to switch case

控制器

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分