技术论坛

模拟量批量处理问题

作者 主题
新手

经验值: 44
发帖数: 8
精华帖: 0
主题:【求助】模拟量批量处理问题


只看楼主 楼主 2020-05-08 11:07:05

S7-300 用的博图软件,现在需要接入70多个模拟量,需要转换、设置量程等功能,用的LAD编程。

单个模拟量使用SCALE指令,程序会很长。

是否能将AI输入、量程的高限、底限以及输出均为数组,设置及读取时均对数组内值进行。



不知道是否可行,若可行,数组下标如AI.ai[0]如何自动循环+1 ,变为AI.ai[1]。其他一样。

若不行,只能一个一个写了。



 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1622388&b_id=4&s_id=0&num=6

侠客

经验值: 622
发帖数: 49
精华帖: 0
回复:模拟量批量处理问题


只看楼主 1楼 2020-05-08 13:35:28

完全可以,定义数组,多少个模拟量就多少个数组,数组的元素由结构变量组成,结构变量的内容由上限 下限 模拟量输入 工程量输出4个变量组成


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8096
发帖数: 1308
精华帖: 6
回复:模拟量批量处理问题


只看楼主 2楼 2020-05-09 19:29:54

可以。。。但是切换数组下标的时间需要把握好


养活一团春意思,撑起两根穷骨头
以下网友喜欢您的帖子:

  
新手

经验值: 44
发帖数: 8
精华帖: 0
回复:模拟量批量处理问题


只看楼主 楼主 3楼 2020-05-11 10:13:31

主要就在于不会SCL,不知道如何写这段


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2790
发帖数: 390
精华帖: 5
回复:模拟量批量处理问题


只看楼主 4楼 2020-05-22 17:05:31

//OUT = [ ((FLOAT (IN) – K1)/(K2–K1)) * (HI_LIM–LO_LIM)] + LO_LIM

//if  BIPOLAR  K1 = –27648.0 and K2 = +27648.0

//if  UNIPOLAR  K1 = 0.0 and K2 = +27648.0


VAR_INPUT

   AI_in:ARRAY[1..70] OF WORD ; // 模拟量输入

   HI_LIM : Real;   //量程上限

   LO_LIM : Real;   // 量程下限

   BIPOLAR :ARRAY[1..70] OF  BOOL;   //输入极性选择FALSE为单极性TRUE为双极型

   filter:REAL;     //滤波系数

END_VAR




VAR_OUTPUT

   SCALE_OUT :ARRAY[1..70] OF  REAL;   // 转换输出

   RET_VAL_1 :ARRAY[1..70] OF  INT;   // 程序处理是否有错

END_VAR



VAR

store_AI:ARRAY[1..70] OF REAL;

store_scale_out:ARRAY[1..70]OF REAL;

NO:INT;

END_VAR


    FOR NO:= 1 TO 70 BY 1 DO

       store_AI[NO]:= INT_TO_REAL( WORD_TO_INT(AI_in[NO]));

       IF (store_AI[NO] >= 0.0 AND store_AI[NO] <= 27648.0 AND NOT BIPOLAR[NO]) OR ( store_AI[NO] >= -27648.0 AND store_AI[NO] <= 27648.0 AND  BIPOLAR[NO]) THEN

        RET_VAL_1[NO] := 0;

             IF NOT BIPOLAR[NO] THEN

            store_scale_out[NO]:= (store_AI[NO] / 27648.0) * (HI_LIM - LO_LIM) + LO_LIM;

            ELSE

            store_scale_out[NO]:= ((store_AI[NO] +27648.0) / 55296.0)  * (HI_LIM - LO_LIM) + LO_LIM;

            END_IF;

        ELSIF  ((store_AI[NO] <0.0 OR store_AI[NO] > 27648.0 )AND NOT BIPOLAR[NO]) OR ((store_AI[NO] < -27648.0 OR  store_AI[NO] >27648.0 )AND BIPOLAR[NO]) THEN

        RET_VAL_1[NO] := 1;//输入数值超限

        ELSIF ((HI_LIM - LO_LIM)=0) THEN

           RET_VAL_1[NO] := 2;//除零错误

        END_IF;

        IF RET_VAL_1[NO] <> 0 THEN

            store_scale_out[NO]:= 0.0 ;

        END_IF;

        SCALE_OUT[NO]:= store_scale_out[NO]* filter + SCALE_OUT[NO]* (1.0 - filter);

    END_FOR;



大家同行,you ok ? me !
以下网友喜欢您的帖子:

  
侠客

经验值: 712
发帖数: 33
精华帖: 0
回复:模拟量批量处理问题


只看楼主 6楼 2020-05-25 20:28:53

 你现在写起来爽,后期更改程序或者模拟量坏道了 就悲剧了。。。


 
以下网友喜欢您的帖子:

  
侠客

经验值: 829
发帖数: 60
精华帖: 2
回复:模拟量批量处理问题


只看楼主 7楼 2020-05-25 20:34:57

我也在学习这个,你看看怎么样 

#singal_num := #singal_num_1;
#fault_code := 16#0;
#Fault_num := 0;
#singal_fault := FALSE;
FOR
    #singal_num := 1 TO 10 DO
    IF "several ai singal data".singal[#singal_num].bipolar AND ("several ai singal data".singal[#singal_num].input < -27648 OR
        "several ai singal data".singal[#singal_num].input > 27648) THEN
        // Statement section IF
        "several ai singal data".singal[#singal_num].singal_fault := 16#1;
    ELSIF NOT "several ai singal data".singal[#singal_num].bipolar AND
        ("several ai singal data".singal[#singal_num].input < 0 OR "several ai singal data".singal[#singal_num].input >27648) THEN
        "several ai singal data".singal[#singal_num].singal_fault := 16#1;
    ELSE
        "several ai singal data".singal[#singal_num].singal_fault := 16#0;
       
    END_IF;
   
    IF "several ai singal data".singal[#singal_num].bipolar THEN
        "several ai singal data".singal[#singal_num].input_limt := LIMIT(MN := -27648,
                                                                    IN := "several ai singal data".singal[#singal_num].input,
                                                                    MX := 27648);
        // Statement section IF
    ELSIF NOT "several ai singal data".singal[#singal_num].bipolar THEN
        "several ai singal data".singal[#singal_num].input_limt := LIMIT(MN := 0,
                                                                    IN := "several ai singal data".singal[#singal_num].input,
                                                                    MX := 27648);
    END_IF;
   
    "several ai singal data".singal[#singal_num].ret_val := SCALE(IN := "several ai singal data".singal[#singal_num].input_limt,
                                                                  HI_LIM := "several ai singal data".singal[#singal_num].h_lim,
                                                                  LO_LIM := "several ai singal data".singal[#singal_num].l_lim,
                                                                  BIPOLAR := "several ai singal data".singal[#singal_num].bipolar,
                                                                  OUT => "several ai singal data".singal[#singal_num].out);
 

    #fault_code := #fault_code + "several ai singal data".singal[#singal_num].singal_fault;
    IF "several ai singal data".singal[#singal_num].singal_fault > 16#0 THEN
        #singal_fault := TRUE;
        #Fault_num := #singal_num;
        // Statement section IF
    END_IF;
END_FOR;



 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
模拟量批量处理问题
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。