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

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

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

比如上述排名第一模型方案里面,基本都可以找到免费的方案,对于我们PLC编程实际上已经够用了,重点还是我们多次强调的,PLC编程领域里面的最强模型还是需要自己去训练。
我们这期分享下免费开源的方案,也期待各位能够早日找到合适自己的AI辅助编程方式,也欢迎分享好的方案哦!

01

OpenRouter
在国内访问一些国外的模型,还得用点科学上网的方式,像之前的Google Gemini。当然还有刚提到的Claude的模型。
大部分方式就是找中转站,这里介绍的OpenRouter是我自己常用的中转网站,基本上首选的免费来源都在这里可以选择:
网址:https://openrouter.ai/

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

这个时候等待所有的模型输出,我们这里简单介绍下不同模型的输出:
1.Deepseek R1(0528)
以下是一段简洁且专业的交通灯控制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
以下是一段 **简洁且专业** 的 **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
# 交通灯控制 - 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

2.Seedream 4.5

具体的模型还需要自己去实践和比较。
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程序:

结果如下图:

详细代码:
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