首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >免费的AI大模型?这篇文章告诉你!(建议收藏)

免费的AI大模型?这篇文章告诉你!(建议收藏)

作者头像
Hello工控
发布2026-02-28 15:25:52
发布2026-02-28 15:25:52
660
举报
文章被收录于专栏:Hello工控Hello工控

从目前大模型的发展看,开源和闭源的方案都有,各自都有自身的商业模式和应用场景的适配。

在IT编程领域来看,Claude是当之无愧的王者。但是,对于我们PLC编程来说,毕竟领域比较窄,所以也没有专用的模型。

我们之前的调查和投票显示:

比如上述排名第一模型方案里面,基本都可以找到免费的方案,对于我们PLC编程实际上已经够用了,重点还是我们多次强调的,PLC编程领域里面的最强模型还是需要自己去训练。

我们这期分享下免费开源的方案,也期待各位能够早日找到合适自己的AI辅助编程方式,也欢迎分享好的方案哦!

01

OpenRouter

在国内访问一些国外的模型,还得用点科学上网的方式,像之前的Google Gemini。当然还有刚提到的Claude的模型。

大部分方式就是找中转站,这里介绍的OpenRouter是我自己常用的中转网站,基本上首选的免费来源都在这里可以选择:

网址:https://openrouter.ai/

我们可以把免费的模型放在同一个问题下进行比较,然后选择合适的模型:

这个时候等待所有的模型输出,我们这里简单介绍下不同模型的输出:

1.Deepseek R1(0528)

代码语言:javascript
复制
以下是一段简洁且专业的交通灯控制ST(结构化文本)PLC代码示例。代码采用状态机zhihu结构,突出可读性和可维护性:

```pascal
// Traffic Light Control System
// States: NS_Green, NS_Yellow, EW_Green, EW_Yellow
VAR
    ton: TON;               // Timer function block
    currentState: INT := 0; // 0=NS_Green, 1=NS_Yellow, 2=EW_Green, 3=EW_Yellow
END_VAR

// Output assignments (assuming digital outputs)
OUTPUT(
    NS_Red    := NOT(currentState IN {0,1}),   // North-South
    NS_Yellow := (currentState = 1),          
    NS_Green  := (currentState = 0),
    EW_Red    := NOT(currentState IN {2,3}),   // East-West
    EW_Yellow := (currentState = 3),
    EW_Green  := (currentState = 2)
);

// State machine logic
CASE currentState OF
    0:  // NS_Green (North-South Green)
        ton(IN := TRUE, PT := T#30S);
        IF ton.Q THEN
            currentState := 1;
            ton(IN := FALSE);
        END_IF

    1:  // NS_Yellow
        ton(IN := TRUE, PT := T#5S);
        IF ton.Q THEN
            currentState := 2;
            ton(IN := FALSE);
        END_IF

    2:  // EW_Green (East-West Green)
        ton(IN := TRUE, PT := T#30S);
        IF ton.Q THEN
            currentState := 3;
            ton(IN := FALSE);
        END_IF

    3:  // EW_Yellow
        ton(IN := TRUE, PT := T#5S);
        IF ton.Q THEN
            currentState := 0;
            ton(IN := FALSE);
        END_IF
END_CASE
```

### 设计亮点说明:

1. **状态机设计**
   - 使用明确的四状态结构(南北绿灯/黄灯、东西绿灯/黄灯)
   - CASE语句实现状态转移,逻辑清晰可见

2. **定时器管理**
   - 复用单一TON定时器减少资源占用
   - 定时完成后立即重置避免累积误差
   - PT参数 Hampshire使用时间字面量(T#30S/T#5S)提升可读性

3. **输出逻辑优化**
   - 基于状态通过布尔empl表达式直接赋值
   - 无冗余代码(如使用状态值而非独立变量控制各灯)

4. **可维护性特征**
   - 注释完整但不冗余
   - 状态值使用自解释的数字编号
   - 时间参数集中管理,易于调整

<details>
<summary>✨ 专业扩展建议(点击展开)etten </summary>

```pascal
// 扩展改进方向:
// 1. 添加紧急模式
IF Emergency THEN 
    currentState := 4; // 特殊处理状态
    ton(IN := FALSE);
    NS_Red := TRUE;
    EW_Red := TRUE;
    RETURN;
END_IF

// 2. 使用枚举提升可读性
TYPE TrafficStates : (
    NS_GREEN,
    NS_YELLOW,
    EW_GREEN,
    EW_YELLOW
);
VAR
    state: TrafficStates := NS_GREEN;
END_VAR

// 3. 夜间模式节能逻辑
IF NightMode THEN
    EW_Yellow := FALSE;
    NS_Yellow := FALSE;
    EW_Red := (currentState < 2);  // Blink red lights
    NS_Red := (currentState >= 2);
    T_blink(IN:=TRUE, PT:=T#1S);
    EW_Red := EW_Red AND NOT T_blink.Q;
    NS_Red := NS_Red AND NOT T_blink.Q;
END_IF
```
</details>

此代码满足以下专业要求:
- 🔁 **循环时间控制精度**:通过TON精确管理时序
- 📌 **确定性执行**:无异步操作,适合PLC扫描周期
- 🔧 **易于扩展**:通过sem的添加状态或功能模块不影响现有逻辑
- 🔐 **故障安全**:红灯默认亮起(安全导向设计)

2.Aurora Alpha

代码语言:javascript
复制
以下是一段 **简洁且专业** 的 **Structured Text(ST)** 代码示例,实现了一个基本的 **交通灯控制**(红‑黄‑绿)逻辑。代码采用了 **状态机** 的写法,结构清晰、易于维护,并且遵循 IEC 61131‑3 标准。

<details>
<summary>🟢 代码概览</summary>

```st
PROGRAM TrafficLight
VAR
    // 时间计数器(单位:毫秒)
    tTimer      : TIME := T#0ms;
    // 当前灯状态
    eState      : (Red, RedYellow, Green, Yellow);
    // 状态持续时间
    tRed        : TIME := T#5s;
    tRedYellow : TIME := T#2s;
    tGreen      : TIME := T#5s;
    tYellow     : TIME := T#2s;
END_VAR

// 主循环,每个 PLC 扫描周期执行一次
CASE eState OF
    Red:
        // 红灯保持
        IF tTimer >= tRed THEN
            tTimer := T#0ms;
            eState := RedYellow;
        END_IF;
    RedYellow:
        // 红黄灯保持
        IF tTimer >= tRedYellow THEN
            tTimer := T#0ms;
            eState := Green;
        END_IF;
    Green:
        // 绿灯保持
        IF tTimer >= tGreen THEN
            tTimer := T#0ms;
            eState := Yellow;
        END_IF;
    Yellow:
        // 黄灯保持
        IF tTimer >= tYellow THEN
            tTimer := T#0ms;
            eState := Red;
        END_IF;
END_CASE;

// 计时器递增(假设 PLC 扫描周期为 100 ms)
tTimer := tTimer + T#100ms;

// 输出映射:根据状态控制实际灯
RedLamp   := (eState = Red) OR (eState = RedYellow);
YellowLamp:= (eState = RedYellow) OR (eState = Yellow);
GreenLamp := (eState = Green);
```

</details>

<details>
<summary>🟡 关键设计要点</summary>

| 要点 | 说明 |
|------|------|
| **状态机** | 使用 `CASE` 语句实现四个灯相的切换,避免多层嵌套的 `IF`,可读性强。 |
| **时间常量** | 通过 `TIME` 类型和 `T#` 常量直接表达秒/毫秒,避免硬编码数值。 |
| **计时器** | `tTimer` 在每个扫描周期递增,满足 IEC 61131‑3 的实时要求。 |
| **输出映射** | 只用三个布尔变量 `RedLamp`、`YellowLamp`、`GreenLamp`,对应实际灯的驱动端口。 |
| **可扩展性** | 若需更改灯时长,只需修改 `tRed`、`tRedYellow`、`tGreen`、`tYellow` 四个常量。 |

</details>

<details>
<summary>🔧 部署建议</summary>

1. **变量声明**  
   - 将 `RedLamp`、`YellowLamp`、`GreenLamp` 映射到实际的数字输出(如 `Q0.0`、`Q0.1`、`Q0.2`)。  
   - 若使用 **PLC 供应商的 IDE**(如 Siemens TIA Portal、Rockwell Studio 5000),可在 **变量表** 中直接绑定。

2. **扫描周期**  
   - 本示例假设 **扫描周期 = 100 ms**,如实际周期不同,请相应调整 `tTimer := tTimer + T#100ms;`。

3. **异常处理**  
   - 在实际项目中,可加入 **看门狗** 或 **手动复位** 逻辑,以防止意外卡死。

4. **调试**  
   - 使用 **监视窗口** 观察 `eState` 与 `tTimer` 的变化,确保状态转换符合预期。

</details>

> **提示**:如果需要在同一程序中控制多个交叉口,只需将上述逻辑封装为 **函数块(FB)**,并为每个交叉口实例化一个 FB,对象即可。这样既保持代码简洁,又实现了模块化复用。

3.GLM Air 4.5

代码语言:javascript
复制
# 交通灯控制 - ST PLC代码

```st
FUNCTION_BLOCK "Traffic_Light_Control"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
        Run : Bool;           // 启动信号
        T_Green : Time := T#30S;    // 绿灯持续时间
        T_Yellow : Time := T#3S;    // 黄灯持续时间
        T_Red : Time := T#30S;      // 红灯持续时间
        Blink_Count : Int := 3;      // 闪烁次数
   END_VAR

   VAR_OUTPUT 
        Q_Red : Bool;         // 红灯输出
        Q_Yellow : Bool;      // 黄灯输出
        Q_Green : Bool;       // 绿灯输出
   END_VAR

   VAR 
        State : Int := 0;     // 状态机状态
        Blink_Timer : TON;   // 闪烁计时器
        Phase_Timer : TON;   // 阶段计时器
        Blink_Counter : Int := 0; // 闪烁计数器
   END_VAR

   // 状态机控制逻辑
   CASE State OF
       0: // 状态0: 绿灯亮
          Q_Green := TRUE;
          Phase_Timer(IN := Run, PT := T_Green);
          IF Phase_Timer.Q THEN
             State := 1;
             Phase_Timer(IN := FALSE);
          END_IF;

       1: // 状态1: 绿灯闪烁
          Blink_Timer(IN := TRUE, PT := T#1S);
          IF Blink_Timer.Q THEN
             Blink_Counter := Blink_Counter + 1;
             Blink_Timer(IN := FALSE);
             Q_Green := NOT Q_Green;

             IF Blink_Counter >= Blink_Count THEN
                State := 2;
                Blink_Counter := 0;
             END_IF;
          END_IF;

       2: // 状态2: 黄灯亮
          Q_Yellow := TRUE;
          Phase_Timer(IN := Run, PT := T_Yellow);
          IF Phase_Timer.Q THEN
             State := 3;
             Phase_Timer(IN := FALSE);
          END_IF;

       3: // 状态3: 红灯亮
          Q_Red := TRUE;
          Phase_Timer(IN := Run, PT := T_Red);
          IF Phase_Timer.Q THEN
             State := 4;
             Phase_Timer(IN := FALSE);
          END_IF;

       4: // 状态4: 红灯闪烁
          Blink_Timer(IN := TRUE, PT := T#1S);
          IF Blink_Timer.Q THEN
             Blink_Counter := Blink_Counter + 1;
             Blink_Timer(IN := FALSE);
             Q_Red := NOT Q_Red;

             IF Blink_Counter >= Blink_Count THEN
                State := 0;
                Blink_Counter := 0;
                Q_Red := FALSE;
             END_IF;
          END_IF;

       ELSE: // 默认状态
          State := 0;
   END_CASE;

   // 当系统停止时复位所有输出
   IF NOT Run THEN
        Q_Red := FALSE;
        Q_Yellow := FALSE;
        Q_Green := FALSE;
        State := 0;
        Blink_Counter := 0;
        Phase_Timer(IN := FALSE);
        Blink_Timer(IN := FALSE);
   END_IF;

END_FUNCTION_BLOCK
```

## 使用说明

1. 将上述功能块下载到西门子S7 PLC中
2. 在程序组织块(OB)中调用此功能块
3. 通过`Run`输入信号控制交通灯的启动和停止
4. 可根据实际需求调整`T_Green`、`T_Yellow`、`T_Red`和`Blink_Count`参数

## 专业特点

- 采用状态机设计,逻辑清晰易维护
- 参数化设计,适应不同路口需求
- 模块化结构,便于扩展功能
- 资源占用优化,适合PLC有限资源环境
- 包含完整的启动/停止控制

此实现提供了完整的交通灯控制逻辑,包括正常运行模式和闪烁过渡模式,同时保持了代码的简洁性和专业性。

当然,还有两个图形输出模型:

1.Flux

Generated Image
Generated Image

2.Seedream 4.5

Generated Image
Generated Image

具体的模型还需要自己去实践和比较。

02

Github Coplit

Github coplit在VS CODE里面只要绑定自己的账户,就可以免费使用这几个模型:

登录网址:https://github.com/

在Settings设置里面进入:

上述地址进行生成Github API即可。这里以Opencode加入Github为例,具体步骤我们后面在介绍Opencode如何安装的详细教程里分享,敬请关注。最后,把这几个加入opencode里面测试也是可以正常使用的:

基本上有GitHub的用户即可以免费使用这几款模型了。

03

Nvidia

另外一个可以免费使用大模型的方案,可以使用英伟达的API来实现。我们可以登录官网即可配置。

首先登录下图地址:

https://build.nvidia.com/

右侧Login登录选项,如果没有新注册用户即可:

登录完成后,在管理API keys一栏:

点击创建API key,如下图所示:

有了这个Key,注意不要暴露在公开的网络上。把这个Key填入你的编程环境上,就可以体验这些免费的模型了:

以Opencode为例,填入后,可以使用这些模型来对话和辅助编程了:

我们以这个模型再来让它生成PLC程序:

结果如下图:

详细代码:

代码语言:javascript
复制
PROGRAM TrafficLightControl
VAR
    (* Enum for light states *)
    LightState : (Red, RedYellow, Green, Yellow) := Red;
    (* Timer for each phase, preset in ms *)
    PhaseTimer : TON;           (* Standard ON-delay timer *)
    PhaseTime  : TIME := T#5s;  (* Default duration, can be overridden per state *)
END_VAR
(*--------------------------------------------------------------*)
(* Main cyclic logic                                            *)
(*--------------------------------------------------------------*)
IF NOT PhaseTimer.IN THEN
    (* Start timer for current state *)
    PhaseTimer(IN := TRUE, PT := PhaseTime);
ELSE
    (* When timer elapsed, transition to next state *)
    IF PhaseTimer.Q THEN
        PhaseTimer(IN := FALSE);  (* Reset timer *)
        CASE LightState OF
            Red:        (* Red -> Red+Yellow *)
                LightState := RedYellow;
                PhaseTime := T#2s;    (* Short transition *)
            RedYellow:  (* Red+Yellow -> Green *)
                LightState := Green;
                PhaseTime := T#5s;    (* Green duration *)
            Green:      (* Green -> Yellow *)
                LightState := Yellow;
                PhaseTime := T#2s;    (* Yellow duration *)
            Yellow:     (* Yellow -> Red, cycle repeats *)
                LightState := Red;
                PhaseTime := T#5s;    (* Red duration *)
        END_CASE;
    END_IF;
END_IF;
(*--------------------------------------------------------------*)
(* Output assignments (example mapping to physical outputs)      *)
(*--------------------------------------------------------------*)
CASE LightState OF
    Red:
        RED_LIGHT    := TRUE;
        YELLOW_LIGHT := FALSE;
        GREEN_LIGHT  := FALSE;
    RedYellow:
        RED_LIGHT    := TRUE;
        YELLOW_LIGHT := TRUE;
        GREEN_LIGHT  := FALSE;
    Green:
        RED_LIGHT    := FALSE;
        YELLOW_LIGHT := FALSE;
        GREEN_LIGHT  := TRUE;
    Yellow:
        RED_LIGHT    := FALSE;
        YELLOW_LIGHT := TRUE;
        GREEN_LIGHT  := FALSE;
END_CASE;
END_PROGRAM

最后,具体使用情况还请大家自行去进行实践吧!希望真的能在AI火热的时候,帮助到大家。先从免费的方案入手,逐步逐步适应AI编程来提高自己的编程工作等。

如果这篇文章内容不错,还请点赞,关注➕,推荐和收藏转发分享哦!

参考链接:

【1】https://openrouter.ai/chat

【2】https://github.com

【3】https://build.nvidia.com/models

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hello工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档