SCL中指针问题
- 西门子PLC以指针的灵活见长,甚至有部分朋友认为,西门子的指针可以媲美C语言指针
- 在此处,我们在说明SCL中指针问题时,使用编程平台为西门子的TIA,并分别对300、1200、1500进行说明。
1. S7-300中的SCL语言指针寻址
- 针对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; 针对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;当需要对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语言指针寻址
- 针对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。 - 针对非优化的DB块的寻址使用PEEK和POKE指令。例如,
#t_Bi01:= PEEK_BOOL(area:=16#81, dbNumber:=0, byteOffset:=#By_1, bitOffset:=#Bi_1);
对于非优化的DB块的访问如同对于I、Q、M区域寻址一样,此处不再赘述。 - 针对于优化的DB块访问,因优化的DB块无地址偏移,故无法进行指针寻址。如果在编程过程中需要使用到连续的地址或是有规则的地址,则可以将需要寻址的数据存放于数组中,然后再对数组的下标进行寻址。
- 对any指针的应用
- 在1200的SCL中无法使用any指针,但是可以在接口处使用any指针作为输入。然后使用Serialize指令将指针所指向的值转为字节数组。
- 注意,使用Serialize指令结果必须为字节数组,不可以是int类型或其他类型数组。
- 对数组的寻址
- 如果是使用LAD编程,针对于数组的寻址可以使用FieldRead和FieldWrite指令。
3. S7-1500中指针寻址
- a) 1500中的指针寻址与1200基本相同,若新版本固件出来以后,看是否有新的改动。