PLC论坛-全力打造可编程控制器专业技术论坛

 找回密码
 注册哦

QQ登录

只需一步,快速开始

微信扫码登录

查看: 70554|回复: 0

[三菱] 各大AIChat对PLC的ST语言的编写能力对比

[复制链接]
发表于 2024-8-8 08:56:37 | 显示全部楼层 |阅读模式
开始准备提示词,问题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 在编写代码方面还需要进一步优化和专门的训练。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册哦

本版积分规则

QQ|小黑屋|手机版|Archiver|PLC技术网-PLC论坛 ( 粤ICP备17165530号 )|网站地图

GMT+8, 2024-9-10 20:03 , Processed in 0.044520 second(s), 26 queries .

快速回复 返回顶部 返回列表