首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >把DeepSeek V4接入RealPLC,实现PLC自动编程!

把DeepSeek V4接入RealPLC,实现PLC自动编程!

作者头像
Hello工控
发布2026-04-28 21:26:54
发布2026-04-28 21:26:54
240
举报
文章被收录于专栏:Hello工控Hello工控

昨天我们介绍了Deepseek V4 Pro预览版正式上线!它的PLC编程能力到底如何?

那对于我们RealPLC而言,必须实时更新下,把这个模型都接入进来。那么,如果有类似应用或者也需要接入这款模型融入自己产品的可以参考。

01

申请DeepSeek API

我们首先到DeepSeek开发者平台,获取到API KEY。这是最重要的一步。

Step1:登录DeepSeek官网。

Step2:进入充值界面,可以按照需求充值。

Step3:选择金额和支付方式:

Step4:充值过程中,可能需要认证,这里选择二代居民身份证,填写对应的姓名和身份证的号码,一定要是有效的身份证明哦。号码和姓名要完全对应。

Step5:申请API KEY

在左侧选择API keys这栏,右侧直接创建:

创建的过程中需要输入名称,自己定义一个即可。

生成的API Key最好复制保存下来备用。到这里,恭喜你已经有一个专属的API KEY了。

02

接入RealPLC

我们之前主要是V3.2模型,这次直接把这两款新的模型都加入进来。方法实际很简单。

直接用AI软件,让他自己改善下即可。详细的对话如下:

这里直接用的是Opencode来实现模型的添加。最终实现添加:

0

示例测试

登录我们的RealPLC后,可以直接选择和配置API KEY,具体步骤如下。在设置界面里:

AI提供方选择DeepSeek,模型任选一个,DeepSeek的API密钥填写刚刚保存备用的KEY。BaseURL填写:

确定好保存更改即可。然后我们可以用专家场景里面的PID应用来测试下DeepSeek V4 Pro生成西门子PLC程序效果:

我们进入服务器后台可以看到,Job ID已经生成了,说明DeepSeek成功响应:

再回到我们的web页面,可以看到,已经在生成PLC程序。

具体代码我贴这了,我们至少优化了SCL语言的一些明显的语法等问题:

代码语言:javascript
复制






FUNCTION_BLOCK "PID_Temp_Clamped"

VAR_INPUT
    rSetpoint       : REAL;// 温度设定值 [°C]
    rProcessValue   : REAL;// 过程值 [°C]
    rKp             : REAL;// 比例增益
    rTi             : REAL;// 积分时间 [s] (0 = 禁止积分)
    rTd             : REAL;// 微分时间 [s] (0 = 禁止微分)
    rTs             : REAL;// 采样时间 [s] (>0)
    rOutputMax      : REAL;// 输出上限 [0..100%]
    rOutputMin      : REAL;// 输出下限 [0..100%]
    xEnable         : BOOL;// 使能控制
    xManualMode     : BOOL;// 手动模式 (TRUE=手动)
    rManualOutput   : REAL;// 手动设定输出
END_VAR

VAR_OUTPUT
    rControlOutput  : REAL;// 控制输出 [%]
    xSaturated      : BOOL;// 输出饱和标志
END_VAR

VAR
    rIntegralTerm   : REAL;// 积分项
    rDerivativeTerm : REAL;// 微分项
    rProportionalTerm: REAL;// 比例项
    rError          : REAL;// 当前误差
    rPreviousError  : REAL;// 前次误差
    rDErrorFiltered : REAL;// (未使用,保留)
    xInitDone       : BOOL;// 初始化完成标志
    rTsafe          : REAL;// 安全副本
END_VAR

VAR_TEMP
    rRawOutput      : REAL;// 限幅前计算值
    xIntegrateEn    : BOOL;// 积分使能
    rIntIncrement   : REAL;// 积分增量
END_VAR

BEGIN
// ---- 输入保护 ----
    #rTsafe := #rTs;
IF #rTsafe <=0.0THEN
        #rTsafe :=0.1;// 防零除错,默认0.1s
    END_IF;

// ---- 误差计算 (加热回路: e = SP - PV, 正向输出加热) ----
    #rError := #rSetpoint - #rProcessValue;

// ---- 比例项 ----
    #rProportionalTerm := #rKp * #rError;

// ---- 微分项 (后向差分 + 安全处理) ----
IF #rTd >0.0THEN
        #rDerivativeTerm := #rKp * #rTd / #rTsafe *(#rError - #rPreviousError);
ELSE
        #rDerivativeTerm :=0.0;
    END_IF;

// ---- 手动/自动处理 ----
IF #xEnable AND NOT #xManualMode THEN
// 自动模式
// 抗积分饱和条件:输出未饱和 或 (饱和但误差指向远离饱和方向)
// 先计算期望输出方向
        #rRawOutput := #rProportionalTerm + #rIntegralTerm + #rDerivativeTerm;

// 判断是否需要冻结积分
        #xIntegrateEn :=TRUE;
IF #rRawOutput >= #rOutputMax AND #rError >0.0THEN
            #xIntegrateEn :=FALSE;// 正饱和且误差仍要求加热,冻结
        ELSIF #rRawOutput <= #rOutputMin AND #rError <0.0THEN
            #xIntegrateEn :=FALSE;// 负饱和且误差要求冷却,冻结
        END_IF;

// 积分更新 (条件积分)
IF #rTi >0.0 AND #xIntegrateEn THEN
            #rIntIncrement := #rKp * #rTsafe / #rTi * #rError;
            #rIntegralTerm := #rIntegralTerm + #rIntIncrement;
        END_IF;

// 合成最终输出并限幅
        #rRawOutput := #rProportionalTerm + #rIntegralTerm + #rDerivativeTerm;
        #rControlOutput := #rRawOutput;
IF #rControlOutput > #rOutputMax THEN
            #rControlOutput := #rOutputMax;
        ELSIF #rControlOutput < #rOutputMin THEN
            #rControlOutput := #rOutputMin;
        END_IF;

// 饱和标志
        #xSaturated :=(#rRawOutput > #rOutputMax) OR (#rRawOutput < #rOutputMin);

ELSE
// 手动或未使能:输出跟随手动值,并反向计算积分项以实现无扰动切换
        #rControlOutput := #rManualOutput;
// 极限限制
IF #rControlOutput > #rOutputMax THEN
            #rControlOutput := #rOutputMax;
        ELSIF #rControlOutput < #rOutputMin THEN
            #rControlOutput := #rOutputMin;
        END_IF;

// 反向计算积分项,确保下次切回自动时输出连续
// I = 当前输出 - P - D
        #rIntegralTerm := #rControlOutput - #rProportionalTerm - #rDerivativeTerm;
        #xSaturated :=FALSE;// 手动下无饱和标志
    END_IF;

// ---- 保存误差用于下一周期计算微分 ----
    #rPreviousError := #rError;

END_FUNCTION_BLOCK

代码质量如何,交给我们的工程师朋友去判断吧。我们的网站即将开启内测,敬请关注。

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

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

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

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

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