昨天我们介绍了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语言的一些明显的语法等问题:
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代码质量如何,交给我们的工程师朋友去判断吧。我们的网站即将开启内测,敬请关注。