设为首页
收藏本站
PLC技术网
开启辅助访问
切换到宽版
登录
注册哦
只需一步,快速开始
微信扫码登录
门户
Portal
论坛
BBS
导读
Guide
排行榜
Ranklist
搜索
搜索
本版
文章
帖子
用户
PLC论坛-全力打造可编程控制器专业技术论坛
»
论坛
›
工控技术交流区
›
『国外:三菱/西门子/欧姆龙/松下』
›
分别用C语言和西门子ST语言编写一个经典交通灯程序,看它 ...
返回列表
发新帖
[西门子]
分别用C语言和西门子ST语言编写一个经典交通灯程序,看它们框架有何不同
[复制链接]
86461
|
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
|
显示全部楼层
差别不大啊!
回复
支持
反对
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册哦
本版积分规则
发表回复
回帖后跳转到最后一页
hmilydyk
回复楼主
返回列表
『国外:三菱/西门子/欧姆龙/松下』
『国产:台达/汇川/信捷产品交流区』