SCL中指针问题

SCL中指针问题

  • 西门子PLC以指针的灵活见长,甚至有部分朋友认为,西门子的指针可以媲美C语言指针
  • 在此处,我们在说明SCL中指针问题时,使用编程平台为西门子的TIA,并分别对300、1200、1500进行说明。

  • SCL中指针问题
    • 1. S7-300中的SCL语言指针寻址
    • 2. S7-1200中的SCL语言指针寻址
    • 3. S7-1500中指针寻址

1. S7-300中的SCL语言指针寻址

  1. 针对I、Q、M可以进行百分号寻址。例如
    IF %IX(IDX := #By_1, BIT := #Bi_1) THEN
    %MW(IDX := #Bw_1) := 100;
    ELSE
    %QD(IDX := #Bd_1) := 99;
    END_IF;
  2. 针对DB块也可以使用百分号进行寻址。例如,
    IF %DB1.DX(IDX := #By_1, BIT := #Bi_1) THEN
    %DB1.DW(IDX := #Bw_1) := 100;
    ELSE
    %DB1.DD(IDX := #Bd_1) := 99;
    END_IF;

  3. 当需要对DB块的DB号进行寻址的时候,需要用到WORD_TO_BLOCK_DB库函数。例如,
    IF WORD_TO_BLOCK_DB(#Db_1).DX(IDX := #By_1, BIT := #Bi_1) THEN
    WORD_TO_BLOCK_DB(#Db_1).DW(IDX := #Bw_1) := 100;
    ELSE
    WORD_TO_BLOCK_DB(#Db_1).DD(IDX := #Bd_1) := 99;
    END_IF;

2. S7-1200中的SCL语言指针寻址

  1. 针对I、Q、M的寻址使用PEEK和POKE指令。例如
    #t_Bi01:= PEEK_BOOL(area:=16#81, dbNumber:=0, byteOffset:=#By_1, bitOffset:=#Bi_1);
    其中对于area参数即是指定访问的地址是I、M、Q、DB中的哪一个区。具体对应关系如下:
    16#81:输入
    16#82:输出
    16#83:位存储区
    16#84:DB
    16#1:外设输入(仅 S7-1500)
    此外,需注意的是,如果area参数不是16#84的话(即非访问DB块,则dbNumber参数需写入0。
  2. 针对非优化的DB块的寻址使用PEEK和POKE指令。例如,
    #t_Bi01:= PEEK_BOOL(area:=16#81, dbNumber:=0, byteOffset:=#By_1, bitOffset:=#Bi_1);
    对于非优化的DB块的访问如同对于I、Q、M区域寻址一样,此处不再赘述。
  3. 针对于优化的DB块访问,因优化的DB块无地址偏移,故无法进行指针寻址。如果在编程过程中需要使用到连续的地址或是有规则的地址,则可以将需要寻址的数据存放于数组中,然后再对数组的下标进行寻址。
  4. 对any指针的应用
    1. 在1200的SCL中无法使用any指针,但是可以在接口处使用any指针作为输入。然后使用Serialize指令将指针所指向的值转为字节数组。
    2. 注意,使用Serialize指令结果必须为字节数组,不可以是int类型或其他类型数组。
  5. 对数组的寻址
    1. 如果是使用LAD编程,针对于数组的寻址可以使用FieldRead和FieldWrite指令。

3. S7-1500中指针寻址

  1. a) 1500中的指针寻址与1200基本相同,若新版本固件出来以后,看是否有新的改动。

你可能感兴趣的:(工作)