[西门子] 分别用C语言和西门子ST语言编写一个经典交通灯程序,看它们框架有何不同

[复制链接]
查看86462 | 回复1 | 2024-4-19 15:28:34 | 显示全部楼层 |阅读模式
下面是一个简单的交通灯程序示例,使用C语言编写。该程序模拟了交通灯的三种状态:红灯、黄灯和绿灯,并且每隔一段时间改变一次状态。请注意,这个程序是控制台程序,不会在图形界面上显示交通灯。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define RED     "\033[31m"
#define YELLOW  "\033[33m"
#define GREEN   "\033[32m"
#define RESET   "\033[0m"

void traffic_light(int seconds) {
    while (seconds > 0) {
        printf("交通灯状态: ");

        // 红灯
        printf(RED   "红灯" RESET "\n");
        sleep(5);  // 红灯亮5秒
        seconds -= 5;

        // 黄灯
        printf(YELLOW "黄灯" RESET "\n");
        sleep(2);  // 黄灯亮2秒
        seconds -= 2;

        // 绿灯
        printf(GREEN  "绿灯" RESET "\n");
        sleep(7);  // 绿灯亮7秒
        seconds -= 7;
    }
}

int main() {
    int total_time = 60;  // 总时间,单位:秒
    printf("交通灯程序开始运行,总时间:%d秒\n", total_time);
    traffic_light(total_time);
    printf("交通灯程序结束\n");
    return 0;
}


这个程序使用了ANSI转义序列来在控制台输出彩色文本。RED、YELLOW和GREEN宏分别用于设置红色、黄色和绿色文本,而RESET宏用于重置颜色到默认状态。
在traffic_light函数中,程序使用了一个while循环来模拟交通灯的状态变化。每次循环中,程序先输出当前交通灯的状态(红灯、黄灯或绿灯),然后调用sleep函数让程序暂停一段时间(模拟交通灯亮起的时间),最后从总时间中减去这段时间。当总时间耗尽时,traffic_light函数结束。
在main函数中,程序首先定义了总时间(单位:秒),然后调用traffic_light函数开始模拟交通灯的状态变化。最后,程序输出一条消息表示交通灯程序结束。




以下是用PLC结构化文本(ST)来编写交通灯程序,我们通常会定义交通灯的状态转换逻辑。
PROGRAM TrafficLightControl
VAR
    RedLightOn : BOOL;
    YellowLightOn : BOOL;
    GreenLightOn : BOOL;
    LightTimer : TIME;
    RedLightDuration : TIME := T#10s; // 红灯持续时间
    YellowLightDuration : TIME := T#5s; // 黄灯持续时间
    GreenLightDuration : TIME := T#30s; // 绿灯持续时间
    CurrentLightState : INT := 0; // 当前灯的状态:0-红灯,1-黄灯,2-绿灯
END_VAR

// 初始化
IF CurrentLightState = 0 THEN
    RedLightOn := TRUE;
    YellowLightOn := FALSE;
    GreenLightOn := FALSE;
    LightTimer := RedLightDuration;
ELSIF CurrentLightState = 1 THEN
    RedLightOn := FALSE;
    YellowLightOn := TRUE;
    GreenLightOn := FALSE;
    LightTimer := YellowLightDuration;
ELSIF CurrentLightState = 2 THEN
    RedLightOn := FALSE;
    YellowLightOn := FALSE;
    GreenLightOn := TRUE;
    LightTimer := GreenLightDuration;
END_IF;

// 更新计时器
IF LightTimer > #0s THEN
    LightTimer := LightTimer - #1s;
END_IF;

// 检查计时器是否到期,并更新交通灯状态
IF LightTimer <= #0s THEN
    CASE CurrentLightState OF
        0: // 红灯结束,切换到黄灯
            CurrentLightState := 1;
            LightTimer := YellowLightDuration;
        1: // 黄灯结束,切换到绿灯
            CurrentLightState := 2;
            LightTimer := GreenLightDuration;
        2: // 绿灯结束,切换到红灯
            CurrentLightState := 0;
            LightTimer := RedLightDuration;
    END_CASE;
END_IF;

// 输出交通灯状态
TrafficLightRed.Output := RedLightOn;
TrafficLightYellow.Output := YellowLightOn;
TrafficLightGreen.Output := GreenLightOn;
在这个程序中,我们定义了几个变量来控制交通灯的状态和计时器。CurrentLightState 变量表示当前的交通灯状态(红灯、黄灯或绿灯),LightTimer 变量用于跟踪每个状态的剩余时间而RedLightDuration、YellowLightDuration 和 GreenLightDuration 分别定义了每个状态的持续时间。
程序首先根据 CurrentLightState 的值设置交通灯的颜色,并初始化 LightTimer。然后,它每秒减少 LightTimer 的值,并在 LightTimer 到期时切换到下一个交通灯状态。
最后,程序将交通灯的状态输出到相应的输出点(假设 TrafficLightRed、TrafficLightYellow 和 TrafficLightGreen 是之前定义的输出变量或接口)。
loveplc | 2024-4-19 16:45:24 | 显示全部楼层
差别不大啊!
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则