下面是一个简单的交通灯程序示例,使用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 是之前定义的输出变量或接口)。