如何对DB中的一部分数据进行清零运算?

西门子plc 发布于 1年前 分类:S7-1500

如何对DB块中一部分数据进行数据初始化,我需要对DB中的一部分数据进行清零运算,如何做,有没有高手指点一下

2个回复

  • plc电工爱好者
    plc电工爱好者

    来自sunnic的回答,我保存下来的:
    1200的FILL_BLK, RESET_BF的对象都要必需是array数组结构。如果要复位的数据区域是数组,那么直接用FILL_BLK, RESET_BF就可以了。
    如果DB块内需要清零的数据不是数组结构的,那么只有使用类似指针的方式对数据进行清零。
    1200本身没有指针,只能使用SCL语言里的PEEK,POKE指令达到指针的效果。

    比如我写的下面这段程序:
    IF #Clr_Error = TRUE THEN    (*  Clr_Error 是我设置的一个启动变量  *)
    "Blank" = 0         (*  "Blank":MW2 *)
    POKE_BLK(area_src:= 16#83,
    (*  源数据类型:16#81:I,16#82:Q,16#83:M,16#84:DB  *)
    dbNumber_src:= 0,              (* 源数据块, 非DB=0  *)
    byteOffset_src:= 2,            (*  源数据起始位号  *)
    area_dest:= 16#84,             (*  目标类型:16#81:I,16#82:Q,16#83:M,16#84:DB  *)
    dbNumber_dest:= 11,             (*  目标数据块:非DB=0  *)
    byteOffset_dest:= 0,           (*  目标起始位号:位号  *)
    count:= 10);                   (*  长度  *)
    END_IF;
    这段程序的意思是,将MW2清零,然后把MW2复制到DB11.DBW0 开始的10个字节

  • plc电工爱好者
    plc电工爱好者

    取决于目标地址是什么类型
    1. 最简单的是数组,那就直接FILL_BLK
    2. 如果不是数组,但是是非优化块,可以将目标地址区域写成P#指针格式,比如P#..BYTE,然后新建一个DB,里面是BYTE的数组,长度>=目标区域,然后用MOVE_BLK_VARIANT,可以将其清0
    3. 如果是优化块,也是UDT或者STRUCT,可以新建一个DB,类型和目标一致,然后直接MOVE
    4. 如果又是优化块,又是零散的变量,那就没有办法了,那就将块改成非优化,然后按2来做