如何把一组数(如PIW512 到PIW688)依次送入写好取正函数(FC),处理后的数存入DB

如题。想简洁程序,而不是连续重复调用FC处理。

问题补充:
修改了下,没问题。直接调用FC20会报错。SCL比STL好懂。
FUNCTION FC22 : VOID 
VAR_INPUT
   AI_Addr    :  INT ; //MW 起始地址:722
   DB_ID      :  INT ;//DB块号:22
   DB_Addr    :  INT;//转存DB块内起始地址:34
   N          :  INT ; //数量
END_VAR
VAR_Temp
    For_N  :INT;
END_VAR

     
IF N>=1  THEN 
    FOR For_N:= 0 TO (N-1) BY 1 DO
        IF WORD_TO_INT(MW[AI_Addr+For_N*2])>=0 THEN
            WORD_TO_BLOCK_DB(INT_TO_WORD(DB_ID)).DW[DB_Addr + For_N*2]:=MW[AI_Addr+For_N*2];
        ELSE;
             WORD_TO_BLOCK_DB(INT_TO_WORD(DB_ID)).DW[DB_Addr + For_N*2]:=0;
        END_IF;
    END_FOR;
END_IF;
END_FUNCTION

图片说明:

如何把一组数(如PIW512 到PIW688)依次送入写好取正函数(FC),处理后的数存入DB   

最佳答案

FUNCTION FC21 : VOID 

VAR_INPUT
    AI_Addr     :  INT ; //PIW 起始地址:722
    DB_ID       :  INT ;//DB块号:22
    DB_Addr     : INT;//转存DB块内起始地址:34
    N           : INT ; //数量
END_VAR

VAR_Temp
    For_N  :INT;
END_VAR
     
IF N>=1  THEN 
    FOR For_N:= 0 TO (N-1) BY 1 DO
       FC20(In1:=PIW[AI_Addr+For_N*2],Out1:= WORD_TO_BLOCK_DB(INT_TO_WORD(DB_ID)).DW[DB_Addr + For_N*2] );
    END_FOR;
END_IF;

END_FUNCTION

提问者对于答案的评价:
FC20(In1:=PIW[AI_Addr+For_N*2],Out1:= WORD_TO_BLOCK_DB(INT_TO_WORD(DB_ID)).DW[DB_Addr + For_N*2] );
这句话报错,报错信息:Invalid data TYPE  。没有解决。

最佳答案作者回复:
你FC20的 IN1  和  Out1 定义的是什么数据类型?
SCL 调用的时候要数据类型相符的, 现在默认 IN1  和  Out1 是word数据类型
如果你是int   那需要转换

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc217379.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2017年11月26日 下午4:10
下一篇 2017年11月26日

相关推荐