开始准备提示词,问题1是:你会PLC的ST编程吗?
问题2是:路口有三盏灯,分别是红灯,绿灯,黄灯,请用ST语言写一段这样的逻辑程序,红灯亮10秒,黄灯亮2秒,然后绿灯亮8秒,依次循环。
首次我们来看下微软Copilot 创新模式的一次回答表现:
整体ST代码如下:PROGRAM TrafficLightVAR RedLight, YellowLight, GreenLight: BOOL; // 交通灯信号 Timer: TON; // 定时器END_VAR
Timer(IN := RedLight, PT := T#10s); // 红灯亮10秒IF Timer.Q THEN RedLight := FALSE; YellowLight := TRUE; Timer(IN := YellowLight, PT := T#2s); // 黄灯亮2秒END_IF
IF Timer.Q AND YellowLight THEN YellowLight := FALSE; GreenLight := TRUE; Timer(IN := GreenLight, PT := T#8s); // 绿灯亮8秒END_IF
IF Timer.Q AND GreenLight THEN GreenLight := FALSE; RedLight := TRUE; // 循环回到红灯END_IF
很明显这个程序是有问题的,不会自动启动,Timer也重复使用了,第1次提问,AI进行改善。
改善后如下:
PROGRAM TrafficLightVAR RedTimer, YellowTimer, GreenTimer: TON; // 为每个灯设置独立的定时器 RedLight, YellowLight, GreenLight: BOOL; // 交通灯信号 CurrentState: INT := 0; // 当前状态END_VAR
CASE CurrentState OF 0: // 红灯状态 RedLight := TRUE; YellowLight := FALSE; GreenLight := FALSE; RedTimer(IN := TRUE, PT := T#10s); IF RedTimer.Q THEN CurrentState := 1; // 切换到黄灯状态 RedTimer(IN := FALSE); // 重置红灯定时器 END_IF 1: // 黄灯状态 RedLight := FALSE; YellowLight := TRUE; GreenLight := FALSE; YellowTimer(IN := TRUE, PT := T#2s); IF YellowTimer.Q THEN CurrentState := 2; // 切换到绿灯状态 YellowTimer(IN := FALSE); // 重置黄灯定时器 END_IF 2: // 绿灯状态 RedLight := FALSE; YellowLight := FALSE; GreenLight := TRUE; GreenTimer(IN := TRUE, PT := T#8s); IF GreenTimer.Q THEN CurrentState := 0; // 循环回到红灯状态 GreenTimer(IN := FALSE); // 重置绿灯定时器 END_IFEND_CASE
经过人工指引,上述代码是正确的;Codesys里面测试通过,如下:
接下来我们看下Open AI的Chat GPT3.5的表现,
代码如下:
VAR red_light: BOOL := FALSE; yellow_light: BOOL := FALSE; green_light: BOOL := FALSE; timer: TIME := T#0s;
BEGIN WHILE TRUE DO IF NOT red_light AND NOT yellow_light AND NOT green_light THEN red_light := TRUE; timer := T#10s; ELSIF red_light AND timer <= T#0s THEN red_light := FALSE; yellow_light := TRUE; timer := T#2s; ELSIF yellow_light AND timer <= T#0s THEN yellow_light := FALSE; green_light := TRUE; timer := T#8s; ELSIF green_light AND timer <= T#0s THEN green_light := FALSE; red_light := TRUE; timer := T#10s; END_IF; END_WHILE;END_PROGRAM;
第1次提问改善:
代码如下:
VAR red_light: BOOL := TRUE; yellow_light: BOOL := FALSE; green_light: BOOL := FALSE; timer: TON;
timer(IN:=TRUE, PT:=T#10s);IF timer.Q THEN red_light := FALSE; yellow_light := TRUE; timer(IN:=FALSE); timer(IN:=TRUE, PT:=T#2s); IF timer.Q THEN yellow_light := FALSE; green_light := TRUE; timer(IN:=FALSE); timer(IN:=TRUE, PT:=T#8s); IF timer.Q THEN green_light := FALSE; red_light := TRUE; timer(IN:=FALSE); END_IF; END_IF;END_IF;
这次比较接近了,第2次继续提示:
改进后还是错误代码如下:
VAR red_light: BOOL := TRUE; yellow_light: BOOL := FALSE; green_light: BOOL := FALSE; timer: TON;
timer(IN:=TRUE, PT:=T#10s);
IF timer.Q THEN IF red_light THEN red_light := FALSE; yellow_light := TRUE; timer(IN:=FALSE); timer(IN:=TRUE); ELSIF yellow_light THEN yellow_light := FALSE; green_light := TRUE; timer(IN:=FALSE); timer(IN:=TRUE, PT:=T#8s); ELSE green_light := FALSE; red_light := TRUE; timer(IN:=FALSE); timer(IN:=TRUE, PT:=T#10s); END_IF;END_IF;
使用第2次提示词后,有改善仍然有重复的计时器的错误;
第3次再次使用提示词;
代码如下:
VAR red_light: BOOL := TRUE; yellow_light: BOOL := FALSE; green_light: BOOL := FALSE; timer_red: TON := (IN:=TRUE, PT:=T#10s); timer_yellow: TON := (IN:=FALSE); timer_green: TON := (IN:=FALSE);
IF timer_red.Q THEN IF red_light THEN red_light := FALSE; yellow_light := TRUE; timer_yellow(IN:=TRUE, PT:=T#2s); ELSIF yellow_light THEN yellow_light := FALSE; green_light := TRUE; timer_green(IN:=TRUE, PT:=T#8s); ELSE green_light := FALSE; red_light := TRUE; timer_red(IN:=TRUE); END_IF;END_IF;
显然实例化的对象放置还是有问题,第4次再次给与提示;
得到代码:
VAR
red_light: BOOL := TRUE;
yellow_light: BOOL := FALSE;
green_light: BOOL := FALSE;
timer_red: TON;
timer_yellow: TON;
timer_green: TON;
timer_red(IN:=TRUE, PT:=T#10s);
IF timer_red.Q THEN
IF red_light THEN
red_light := FALSE;
yellow_light := TRUE;
timer_yellow(IN:=TRUE, PT:=T#2s);
timer_red(IN:=FALSE);
ELSIF yellow_light THEN
yellow_light := FALSE;
green_light := TRUE;
timer_green(IN:=TRUE, PT:=T#8s);
timer_yellow(IN:=FALSE);
ELSE
green_light := FALSE;
red_light := TRUE;
timer_red(IN:=TRUE);
timer_green(IN:=FALSE);
END_IF;
END_IF;
GPT3.5第4次得到的代码还是有一些问题。
使用copilot的精准模式,对话如下:
代码如下:
PROGRAM TrafficLight
VAR
Red, Yellow, Green : BOOL;
Counter : TIME := T#0S;
State : INT := 0;
END_VAR
CASE State OF
0: // 红灯
Red := TRUE;
Yellow := FALSE;
Green := FALSE;
Counter := Counter + T#1S;
IF Counter >= T#10S THEN
Counter := T#0S;
State := 1;
END_IF
1: // 黄灯
Red := FALSE;
Yellow := TRUE;
Green := FALSE;
Counter := Counter + T#1S;
IF Counter >= T#2S THEN
Counter := T#0S;
State := 2;
END_IF
2: // 绿灯
Red := FALSE;
Yellow := FALSE;
Green := TRUE;
Counter := Counter + T#1S;
IF Counter >= T#8S THEN
Counter := T#0S;
State := 0;
END_IF
ELSE
State := 0;
END_CASE
END_PROGRAM
这个代码在它指定的扫描周期运行,一次提问就是正确的逻辑。
总结如下:
GPT-3.5:
GPT-3.5 是一个通用的自然语言处理模型,它可以生成文本、回答问题、写作等。但是,它并没有专门针对 PLC 编程进行训练,因此在直接编写 PLC 逻辑的任务上可能存在一些局限性。
GPT-3.5 可以根据输入的文本生成代码,但它不具备深入理解 PLC 控制逻辑的能力。如果使用 GPT-3.5 编写 PLC 逻辑,需要人工检查和修正生成的代码。
Copilot:
Copilot 是一个由 OpenAI 开发的代码生成助手,专门用于编写代码。它基于大量的开源代码和技术文档进行训练,可以生成高质量的代码片段。
Copilot 在编写 PLC 逻辑方面可能会更胜一筹,因为它专注于代码生成,并且具备对编程语言和控制逻辑的深入理解。它可以根据输入的描述生成更接近所需逻辑的代码。
总的来说,对于直接编写 PLC 逻辑,Copilot 可能更适合,但仍然需要人工检查和优化。通用大模型如 GPT-3.5 在编写代码方面还需要进一步优化和专门的训练。 |