回复:写了一个插值计算的小程序,但是运行起来总是不对,请教高手哪里有问题?

wingwf2000

  • 帖子

    332
  • 精华

    0
  • 被关注

    1

论坛等级:侠士

注册时间:2021-06-23

钻石 钻石 如何晋级?

发布于 2026-05-26 10:56:38

12楼

展开查看
以下是引用pphsy在2026-05-26 09:35:40的发言 >11楼

其实要实现的就是这段程序要完成的功能,只不过200smart用不了这么高级的SCL语言,STL实现起来比较麻烦
FUNCTION "Calc_Air_by_Fuel"

{ S7_Optimized_Access := 'TRUE' }


VAR_INPUT

    Fuel_Open : REAL;                     // 当前燃油开度

    P_Fuel    : ARRAY[0..9] OF REAL;      // 燃油分段点

    P_Air     : ARRAY[0..9] OF REAL;      // 风门分段点

END_VAR


VAR_OUTPUT

    Air_Open : REAL;                      // 风门开度输出

END_VAR


VAR

    i           : INT := 1;

    LowerIndex  : INT;

    UpperIndex  : INT;

    Slope       : REAL;

END_VAR


BEGIN

// ========== 边界处理 ==========

IF Fuel_Open <= P_Fuel[0] THEN

    Air_Open := P_Air[0];

    RETURN;

END_IF;


IF Fuel_Open >= P_Fuel[9] THEN

    Air_Open := P_Air[9];

    RETURN;

END_IF;



// ========== 查找所在区间 ==========

FOR i := 1 TO 9 DO

    IF Fuel_Open <= P_Fuel[i] THEN

        LowerIndex := i - 1;

        UpperIndex := i;

        EXIT;

    END_IF;

END_FOR;



// ========== 线性插值计算 ==========

Slope := (P_Air[UpperIndex] - P_Air[LowerIndex]) /

         (P_Fuel[UpperIndex] - P_Fuel[LowerIndex]);


Air_Open := P_Air[LowerIndex] +

            Slope * (Fuel_Open - P_Fuel[LowerIndex]);



// ========== 限幅保护 ==========

Air_Open := LIMIT(0.0, Air_Open, 100.0);


END_FUNCTION_BLOCK


用梯形图也很简单啊,在座的各位绝大部分搞不定STL,这需要理解逻辑堆栈等,还需要熟悉STL指令格式

你可以让AI生成梯形图格式,它会按梯形图对应的STL生成指令,就是不知道AI的水平如何

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有9426条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。