Kimi K3这两天一下子炸开了锅,看好几个评测说是在Fable5和Opus 4.8水平之间,具体评分排行,我们倒是没那么关注。
当然,对于我们RealPLC来说,特别希望国产有几个大模型的能力能保持领先,毕竟接入国外大模型,有两点需要考虑。其一,当然是网络的缘故;其二,就是价格。这两点对于我们来说特别重要。
所以,我们也赶紧登录Kimi官网,先体验下具体的编程能力。
01

K3目前太火
不是非常清楚,官网显示暂时访问量太大,需要升级:

目前,看来还得升级才能优先体验。这个在ds火爆的时候也有过,反正见怪不怪了!等一段时间就可以了。
关键,要升级也不容易的,还得预约订阅:

这个不做评论吧!在国内这种销售方式也不算新鲜!所以暂时切换到K2.6试试看。
02

项目实测案例
为了证明AI模型的编程能力,需要一个标准的项目需求来测试下PLC编程到底如何。
所以,我把这个问题丢给了GPT5.6,让他给个方案需求,大家觉得不错,可以收藏一下:
某工厂需要设计一套双水箱自动配液系统。系统由原料水箱、混合水箱、两台进料泵、一台搅拌电机、一个排料阀以及液位和温度传感器组成。请使用 PLC 编写完整控制程序。
系统包含以下四种模式:
任意时刻只能有一种模式有效。
模式切换时不得产生泵、电机或阀门的意外动作。
从自动模式切换到手动模式时,自动流程立即暂停,所有自动输出撤销。重新切回自动模式后,不允许自动继续运行,必须由操作员重新按下启动按钮。
维护模式仅供检修人员使用。维护模式下允许单独操作泵、电机和阀门,但急停、过载、设备故障和关键液位保护仍然有效。
操作员选择自动模式并按下启动按钮后,PLC 首先检查启动条件。
启动条件包括:
条件满足后,系统按照以下步骤运行。
优先启动累计运行时间较短的进料泵。
泵发出启动命令后,必须在3秒内收到运行反馈,否则判定该泵启动失败。
如果首选泵启动失败:
进料过程中:
液位达到80%并停止进料后,等待5秒。
等待期间液位不得下降到75%以下,否则产生“液位异常下降”故障。
启动搅拌电机。
搅拌电机必须在2秒内返回运行反馈,否则产生“搅拌电机启动失败”故障。
搅拌时间为30秒。
搅拌过程中:
搅拌完成后,先确认搅拌电机已经停止,再打开排料阀。
排料阀发出打开命令后,必须在5秒内收到开到位反馈,否则产生“排料阀打开超时”故障。
阀门打开后开始排料:
排料阀关闭到位后,本次自动周期完成。
完成后:
手动模式下,操作员可以分别控制:
手动操作仍必须满足以下保护:
只有满足以下条件才允许启动:
只有满足以下条件才允许启动:
只有满足以下条件才允许打开:
手动命令被禁止时,程序必须提供具体禁止原因,不能只返回“操作失败”。
系统至少需要识别以下故障:
每个故障至少应包含:
报警蜂鸣器在新故障出现时启动。操作员确认报警后可以关闭蜂鸣器,但故障指示灯必须保持,直到故障被成功复位。
故障不能仅通过按下复位按钮直接清除。
只有满足以下条件时才允许复位:
复位按钮必须使用上升沿触发。
故障复位后:
PLC 在自动运行过程中可能发生断电或CPU重启。
重新上电后必须满足以下要求:
以下数据允许掉电保持:
以下数据不得用于上电后自动恢复输出:
请使用结构化文本语言编写程序,并满足以下要求:
请提交以下内容:
不得仅给出概念性伪代码。无法确定的硬件或工艺条件必须明确列为待确认项,不得自行隐藏假设。
03

K2.6实测
给我第一感觉就是,效果还可以,特别是图像表述能力突出。因为,Kimi是多模态的,本身就支持文本和图片,所以,这点确实可圈可点!

这个图最开始就输出的,从人接收信息的效果来说,肯定图形是更好些。当然,细节地方还需要优化调整。
最后的编程效果,还算OK,具体如何,可以看我分享的链接,我们这里简单的抽一段出来:

其中的泵控制FB的代码,贴这里,供大家评阅:
// ============================================================
// 功能块: FB_PumpControl
// 说明: 进料泵控制功能块
// 要求: 启动许可、运行联锁和跳闸条件分开
// 实例: Pump1, Pump2 (同一功能块的两个实例)
// ============================================================
FUNCTION_BLOCK FB_PumpControl
VAR_INPUT
// ---- 命令输入 ----
xEnable : BOOL; // 功能块使能
xStartCommand : BOOL; // 启动命令(来自自动或手动)
xStopCommand : BOOL; // 停止命令
// ---- 反馈信号 ----
xReady : BOOL; // 变频器就绪
xRunningFb : BOOL; // 运行反馈
xFaultSignal : BOOL; // 故障信号
// ---- 联锁条件 ----
xInterlockOK : BOOL; // 运行联锁条件(如液位、温度等)
// ---- 跳闸条件 ----
xTripCondition : BOOL; // 跳闸条件(急停、安全门等)
// ---- 参数 ----
stParams : ST_PumpParams; // 泵参数
// ---- 模式 ----
xAutoMode : BOOL; // 自动模式标志
xManualMode : BOOL; // 手动模式标志
xMaintMode : BOOL; // 维护模式标志
END_VAR
VAR_OUTPUT
xStartOutput : BOOL; // 泵启动输出
xFaultLatched : BOOL; // 故障锁存
eState : E_PumpState; // 当前状态
xStartFailed : BOOL; // 启动失败标志
xStopFailed : BOOL; // 停止失败标志
xIsRunning : BOOL; // 正在运行
xFaultActive : BOOL; // 当前故障
sStatusText : STRING(32); // 状态文本
END_VAR
VAR_IN_OUT
rTotalRunTime : REAL; // 累计运行时间(分钟)- 保持型
END_VAR
VAR
// ---- 定时器 ----
tonStartTimeout : TON; // 启动反馈超时
tonStopTimeout : TON; // 停止反馈超时
tonRunTimeAccum : TON; // 运行时间累计
// ---- 边沿检测 ----
rtrigStartCommand : R_TRIG;
rtrigStopCommand : R_TRIG;
ftrigRunningFb : F_TRIG;
// ---- 内部标志 ----
xStartRequested : BOOL;
xStopRequested : BOOL;
xRunningPrev : BOOL;
tRunTimeSlice : TIME;
END_VAR
// ============================================================
// 初始化
// ============================================================
IF NOT xEnable THEN
xStartOutput := FALSE;
xFaultLatched := FALSE;
eState := PS_IDLE;
xStartFailed := FALSE;
xStopFailed := FALSE;
xIsRunning := FALSE;
xFaultActive := FALSE;
xStartRequested := FALSE;
xStopRequested := FALSE;
sStatusText := 'DISABLED';
RETURN;
END_IF;
// ============================================================
// 边沿检测
// ============================================================
rtrigStartCommand(CLK := xStartCommand);
rtrigStopCommand(CLK := xStopCommand);
ftrigRunningFb(CLK := xRunningFb);
// ============================================================
// 故障检测(当前故障,非锁存)
// ============================================================
xFaultActive := xFaultSignal;
// ============================================================
// 启动许可检查
// ============================================================
// 启动许可:
// - 功能块使能
// - 无跳闸条件
// - 变频器就绪
// - 无当前故障
// - 联锁条件满足
// - 不在启动失败/停止失败状态
// ============================================================
// 状态机
// ============================================================
CASE eState OF
PS_IDLE:
sStatusText := 'IDLE';
xStartOutput := FALSE;
xIsRunning := FALSE;
// 清除请求标志
IF NOT xStartCommand THEN
xStartRequested := FALSE;
END_IF;
// 启动许可检查
IF xStartCommand AND NOT xStartRequested THEN
IF xTripCondition THEN
xStartRequested := TRUE; // 记录请求但无法启动
ELSIF NOT xReady THEN
xStartRequested := TRUE;
ELSIF xFaultSignal THEN
xStartRequested := TRUE;
ELSIF NOT xInterlockOK THEN
xStartRequested := TRUE;
ELSE
// 启动许可满足
xStartRequested := TRUE;
eState := PS_STARTING;
tonStartTimeout(IN := FALSE, PT := stParams.tStartFeedbackTimeout);
tonStartTimeout(IN := TRUE, PT := stParams.tStartFeedbackTimeout);
END_IF;
END_IF;
// 跳闸条件激活时保持空闲
IF xTripCondition THEN
xStartRequested := FALSE;
END_IF;
PS_STARTING:
sStatusText := 'STARTING';
xStartOutput := TRUE;
xIsRunning := FALSE;
// 启动反馈超时检测
tonStartTimeout(IN := TRUE, PT := stParams.tStartFeedbackTimeout);
IF tonStartTimeout.Q THEN
// 启动反馈超时
xStartOutput := FALSE;
xStartFailed := TRUE;
xFaultLatched := TRUE;
eState := PS_FAULT;
ELSIF xRunningFb THEN
// 启动成功
tonStartTimeout(IN := FALSE);
eState := PS_RUNNING;
tonRunTimeAccum(IN := FALSE, PT := T#1M);
tonRunTimeAccum(IN := TRUE, PT := T#1M);
ELSIF xTripCondition THEN
// 跳闸条件激活,立即停止
xStartOutput := FALSE;
xStopRequested := TRUE;
eState := PS_STOPPING;
tonStopTimeout(IN := FALSE, PT := stParams.tStopFeedbackTimeout);
tonStopTimeout(IN := TRUE, PT := stParams.tStopFeedbackTimeout);
ELSIF xFaultSignal THEN
// 泵故障
xStartOutput := FALSE;
xFaultLatched := TRUE;
eState := PS_FAULT;
ELSIF NOT xStartCommand THEN
// 命令撤销
xStartOutput := FALSE;
xStopRequested := TRUE;
eState := PS_STOPPING;
tonStopTimeout(IN := FALSE, PT := stParams.tStopFeedbackTimeout);
tonStopTimeout(IN := TRUE, PT := stParams.tStopFeedbackTimeout);
END_IF;
PS_RUNNING:
sStatusText := 'RUNNING';
xStartOutput := TRUE;
xIsRunning := TRUE;
// 累计运行时间(每1分钟增加1)
tonRunTimeAccum(IN := TRUE, PT := T#1M);
IF tonRunTimeAccum.Q THEN
rTotalRunTime := rTotalRunTime + 1.0;
tonRunTimeAccum(IN := FALSE, PT := T#1M);
tonRunTimeAccum(IN := TRUE, PT := T#1M);
END_IF;
// 运行中故障检测
IF xFaultSignal THEN
xStartOutput := FALSE;
xFaultLatched := TRUE;
xIsRunning := FALSE;
eState := PS_FAULT;
ELSIF xTripCondition THEN
xStartOutput := FALSE;
xIsRunning := FALSE;
xStopRequested := TRUE;
eState := PS_STOPPING;
tonStopTimeout(IN := FALSE, PT := stParams.tStopFeedbackTimeout);
tonStopTimeout(IN := TRUE, PT := stParams.tStopFeedbackTimeout);
ELSIF NOT xInterlockOK THEN
// 联锁条件丢失,停止
xStartOutput := FALSE;
xIsRunning := FALSE;
xStopRequested := TRUE;
eState := PS_STOPPING;
tonStopTimeout(IN := FALSE, PT := stParams.tStopFeedbackTimeout);
tonStopTimeout(IN := TRUE, PT := stParams.tStopFeedbackTimeout);
ELSIF xStopCommand OR NOT xStartCommand THEN
// 收到停止命令
xStartOutput := FALSE;
xIsRunning := FALSE;
xStopRequested := TRUE;
eState := PS_STOPPING;
tonStopTimeout(IN := FALSE, PT := stParams.tStopFeedbackTimeout);
tonStopTimeout(IN := TRUE, PT := stParams.tStopFeedbackTimeout);
END_IF;
PS_STOPPING:
sStatusText := 'STOPPING';
xStartOutput := FALSE;
xIsRunning := FALSE;
// 停止反馈超时检测
tonStopTimeout(IN := TRUE, PT := stParams.tStopFeedbackTimeout);
IF tonStopTimeout.Q AND xRunningFb THEN
// 停止反馈超时(仍在运行)
xStopFailed := TRUE;
xFaultLatched := TRUE;
eState := PS_FAULT;
ELSIF NOT xRunningFb THEN
// 停止成功
tonStopTimeout(IN := FALSE);
xStopRequested := FALSE;
eState := PS_IDLE;
ELSIF xFaultSignal THEN
// 停止过程中故障
xFaultLatched := TRUE;
eState := PS_FAULT;
END_IF;
PS_FAULT:
sStatusText := 'FAULT';
xStartOutput := FALSE;
xIsRunning := FALSE;
// 故障状态,等待外部复位
// 复位条件:
// - 无当前故障信号
// - 无跳闸条件
// - 泵已停止
IF NOT xFaultSignal AND NOT xTripCondition AND NOT xRunningFb THEN
// 故障条件已清除,可以准备复位
// 实际复位由外部执行
END_IF;
END_CASE;
// ============================================================
// 故障状态输出
// ============================================================
xFaultActive := xFaultSignal OR xStartFailed OR xStopFailed
OR xFaultLatched;
END_FUCTION_BLOCK参考链接:
【1】https://www.kimi.com/share/19f8a815-4052-8e54-8000-00008a150f71