首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kimi K3来编写PLC程序没体验到!看看K2.6的能力如何?

Kimi K3来编写PLC程序没体验到!看看K2.6的能力如何?

作者头像
Hello工控
发布2026-07-23 20:08:33
发布2026-07-23 20:08:33
560
举报
文章被收录于专栏:Hello工控Hello工控

Kimi K3这两天一下子炸开了锅,看好几个评测说是在Fable5和Opus 4.8水平之间,具体评分排行,我们倒是没那么关注。

当然,对于我们RealPLC来说,特别希望国产有几个大模型的能力能保持领先,毕竟接入国外大模型,有两点需要考虑。其一,当然是网络的缘故;其二,就是价格。这两点对于我们来说特别重要。

所以,我们也赶紧登录Kimi官网,先体验下具体的编程能力。

01

K3目前太火

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

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

关键,要升级也不容易的,还得预约订阅:

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

02

项目实测案例

为了证明AI模型的编程能力,需要一个标准的项目需求来测试下PLC编程到底如何。

所以,我把这个问题丢给了GPT5.6,让他给个方案需求,大家觉得不错,可以收藏一下:


PLC 实际应用需求:双水箱自动配液系统

某工厂需要设计一套双水箱自动配液系统。系统由原料水箱、混合水箱、两台进料泵、一台搅拌电机、一个排料阀以及液位和温度传感器组成。请使用 PLC 编写完整控制程序。

一、设备组成

1. 输入信号

2. 输出信号


二、运行模式

系统包含以下四种模式:

任意时刻只能有一种模式有效。

模式切换时不得产生泵、电机或阀门的意外动作。

从自动模式切换到手动模式时,自动流程立即暂停,所有自动输出撤销。重新切回自动模式后,不允许自动继续运行,必须由操作员重新按下启动按钮。

维护模式仅供检修人员使用。维护模式下允许单独操作泵、电机和阀门,但急停、过载、设备故障和关键液位保护仍然有效。


三、自动运行流程

操作员选择自动模式并按下启动按钮后,PLC 首先检查启动条件。

启动条件包括:

  • 急停回路正常;
  • 安全门关闭;
  • 1号泵或2号泵至少有一台可用;
  • 搅拌电机无过载;
  • 排料阀关闭到位;
  • 混合水箱液位低于 20%;
  • 液位和温度信号处于有效范围;
  • 系统没有未复位故障。

条件满足后,系统按照以下步骤运行。

步骤1:进料

优先启动累计运行时间较短的进料泵。

泵发出启动命令后,必须在3秒内收到运行反馈,否则判定该泵启动失败。

如果首选泵启动失败:

  • 停止首选泵;
  • 记录首选泵启动失败报警;
  • 在另一台泵可用时,自动切换到另一台泵;
  • 每个自动周期最多允许切换一次;
  • 两台泵都无法启动时,系统进入故障状态。

进料过程中:

  • 当液位达到80%时停止进料泵;
  • 如果进料持续120秒仍未达到80%,产生“进料超时”故障;
  • 如果液位达到95%,立即停止所有进料泵并产生“液位过高”故障;
  • 进料泵停止后,如果运行反馈在3秒内未消失,产生“泵停止反馈超时”故障。

步骤2:静置确认

液位达到80%并停止进料后,等待5秒。

等待期间液位不得下降到75%以下,否则产生“液位异常下降”故障。

步骤3:搅拌

启动搅拌电机。

搅拌电机必须在2秒内返回运行反馈,否则产生“搅拌电机启动失败”故障。

搅拌时间为30秒。

搅拌过程中:

  • 液位低于60%时,立即停止搅拌并产生“搅拌液位过低”故障;
  • 温度高于60℃时,立即停止搅拌并产生“混合物温度过高”故障;
  • 搅拌电机过载时,立即撤销启动命令并锁存故障;
  • 安全门打开或急停动作时,立即停止搅拌。

步骤4:排料

搅拌完成后,先确认搅拌电机已经停止,再打开排料阀。

排料阀发出打开命令后,必须在5秒内收到开到位反馈,否则产生“排料阀打开超时”故障。

阀门打开后开始排料:

  • 当液位低于10%时,关闭排料阀;
  • 如果排料持续90秒后液位仍高于10%,产生“排料超时”故障;
  • 阀门发出关闭命令后,必须在5秒内收到关到位反馈;
  • 排料阀开到位和关到位同时为 TRUE 时,判定为“阀门反馈矛盾”故障。

步骤5:周期完成

排料阀关闭到位后,本次自动周期完成。

完成后:

  • 自动周期计数加1;
  • 记录本次使用的进料泵;
  • 更新两台泵的累计运行时间;
  • 系统回到等待状态;
  • 不自动开始下一周期;
  • 操作员必须再次按下启动按钮。

四、手动控制要求

手动模式下,操作员可以分别控制:

  • 1号进料泵;
  • 2号进料泵;
  • 搅拌电机;
  • 排料阀打开;
  • 排料阀关闭。

手动操作仍必须满足以下保护:

手动启动进料泵

只有满足以下条件才允许启动:

  • 急停正常;
  • 对应泵无故障;
  • 对应泵处于就绪状态;
  • 混合水箱液位低于95%;
  • 排料阀已经关闭;
  • 另一台进料泵未运行。

手动启动搅拌电机

只有满足以下条件才允许启动:

  • 急停正常;
  • 安全门关闭;
  • 搅拌电机无过载;
  • 液位高于20%;
  • 温度低于60℃;
  • 排料阀关闭到位。

手动打开排料阀

只有满足以下条件才允许打开:

  • 进料泵全部停止;
  • 搅拌电机已经停止;
  • 急停回路正常。

手动命令被禁止时,程序必须提供具体禁止原因,不能只返回“操作失败”。


五、故障和报警要求

系统至少需要识别以下故障:

每个故障至少应包含:

  • 故障编号;
  • 故障名称;
  • 故障是否存在;
  • 故障是否锁存;
  • 首次发生时间;
  • 触发故障时的流程步骤;
  • 复位允许条件。

报警蜂鸣器在新故障出现时启动。操作员确认报警后可以关闭蜂鸣器,但故障指示灯必须保持,直到故障被成功复位。


六、故障复位要求

故障不能仅通过按下复位按钮直接清除。

只有满足以下条件时才允许复位:

  • 急停已经恢复;
  • 安全门已经关闭;
  • 泵故障信号已经消失;
  • 搅拌电机过载信号已经恢复;
  • 液位低于95%;
  • 温度低于60℃;
  • 排料阀反馈不存在矛盾;
  • 所有泵和搅拌电机均已停止。

复位按钮必须使用上升沿触发。

故障复位后:

  • 系统回到停止或等待状态;
  • 不允许自动恢复上一动作;
  • 不允许自动重新启动设备;
  • 必须重新按下启动按钮才能开始新的自动周期。

七、断电和重启要求

PLC 在自动运行过程中可能发生断电或CPU重启。

重新上电后必须满足以下要求:

  • 所有电机和泵的启动输出默认关闭;
  • 排料阀不能因为保持变量而自动打开;
  • 自动流程不能从断电前步骤直接继续;
  • 保存断电前的流程步骤,仅用于诊断显示;
  • 产生“流程异常中断”提示;
  • 操作员检查现场并复位后,系统回到等待状态;
  • 必须重新按下启动按钮才能开始运行。

以下数据允许掉电保持:

  • 两台泵累计运行时间;
  • 自动周期累计数量;
  • 最近一次故障编号;
  • 最近一次中断前的流程步骤。

以下数据不得用于上电后自动恢复输出:

  • 启动命令;
  • 手动命令;
  • 自动运行命令;
  • 阀门打开命令;
  • 搅拌命令;
  • 当前步骤执行许可。

八、程序设计要求

请使用结构化文本语言编写程序,并满足以下要求:

  1. 使用枚举定义运行模式和自动流程状态;
  2. 使用功能块封装进料泵控制;
  3. 两台泵必须使用同一个泵控制功能块的不同实例;
  4. 使用独立功能块封装排料阀控制;
  5. 自动流程使用明确的状态机实现;
  6. 每个物理输出只能有一个最终写入位置;
  7. 启动许可、运行联锁和跳闸条件必须分开;
  8. 所有时间、液位和温度阈值必须参数化;
  9. 不得在业务逻辑中直接使用未解释的魔法数字;
  10. 所有故障必须具有明确复位条件;
  11. 程序必须提供当前状态、不能启动原因和活动故障信息;
  12. 不允许使用无限循环;
  13. 不允许依赖变量默认值完成初始化;
  14. 必须说明保持变量和非保持变量;
  15. 必须给出程序块调用关系。

九、需要提交的结果

请提交以下内容:

  1. 需求理解和待确认问题;
  2. I/O变量定义;
  3. 数据类型和枚举定义;
  4. 泵控制功能块;
  5. 阀门控制功能块;
  6. 自动顺控功能块;
  7. 主程序调用代码;
  8. 故障和报警数据结构;
  9. 启动许可和联锁矩阵;
  10. 状态转换表;
  11. 冷启动初始化逻辑;
  12. 至少20个测试用例;
  13. 至少10个故障注入测试;
  14. 程序中仍然存在的工程风险;
  15. 在目标PLC平台上的编译结果。

不得仅给出概念性伪代码。无法确定的硬件或工艺条件必须明确列为待确认项,不得自行隐藏假设。


03

K2.6实测

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

这个图最开始就输出的,从人接收信息的效果来说,肯定图形是更好些。当然,细节地方还需要优化调整。

最后的编程效果,还算OK,具体如何,可以看我分享的链接,我们这里简单的抽一段出来:

其中的泵控制FB的代码,贴这里,供大家评阅:

代码语言:javascript
复制
// ============================================================
// 功能块: 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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PLC 实际应用需求:双水箱自动配液系统
    • 一、设备组成
      • 1. 输入信号
      • 2. 输出信号
    • 二、运行模式
    • 三、自动运行流程
      • 步骤1:进料
      • 步骤2:静置确认
      • 步骤3:搅拌
      • 步骤4:排料
      • 步骤5:周期完成
    • 四、手动控制要求
      • 手动启动进料泵
      • 手动启动搅拌电机
      • 手动打开排料阀
    • 五、故障和报警要求
    • 六、故障复位要求
    • 七、断电和重启要求
    • 八、程序设计要求
    • 九、需要提交的结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档