如何在西门子SCL中间接寻址的内存区域添加偏移量?

问题描述 投票:0回答:1

我的功能块中有一个用西门子 SCL (TIA Portal v17) 编写的

VARIANT
参数。该参数将指针寻址到内存区域。是否可以使用运行时定义的整数值向该指针添加偏移量?不幸的是,我无法使用
POKE_
函数,因为我还需要将偏移量添加到通过
VARIANT
指针共享的区域,然后进一步传递。

plc siemens
1个回答
0
投票

Siemens SCL 是相当静态的,因此通常可以在全局未优化的数据块及其元素上向通过

VARIANT
POINTER
类型寻址的存储区域添加偏移量,其中
PEEK
功能可用。但实际上,
PEEK
/
POKE
函数为数据块实现的功能复制了 STL 中
ANY
指针类型的功能。幸运的是,如果您声明一个类型为
ANY
的变量,并对其进行赋值,则 PLC 运行时将向该
ANY
指针分配正确操作数的确切内存地址。然后,向
ANY
指针添加偏移量可以这样完成:

1。声明由包含偏移区域的结构覆盖的指针

      t_p_RawOffsetPtr : Any;
      t_st_OffsetPointer AT t_p_RawOffsetPtr : Struct
         Byte1 : Byte; // Header constant
         Byte2 : Byte; // Data type
         Word2 : Word; // Length
         Word3 : Word; // Data block key
         Dword : DWord;// Offset key
      END_STRUCT;

      t_d_OffsetWord : DWord; // Offset key
      t_st_OffsetWord AT t_d_OffsetWord : Struct
         Byte1 : Byte; // Area key to preserve
         Byte2 : Byte;
         Byte3 : Byte;
         Byte4 : Byte;
      END_STRUCT;
      t_b_OffsetArea : Byte;

2。将偏移量渲染到指针中

#t_p_RawOffsetPtr := #io_p_InputPointer; // Assign the temporary pointer: ANY or VARIANT
// Byte2 field contains the unit length code and could be used to control reading
#t_st_OffsetPointer.Word2 := #l_w_LENGTH; // Defined using units from Byte2 field
#t_d_OffsetWord := #t_st_OffsetPointer.Dword; // Retrieving offset encoding area
#t_b_OffsetArea := #t_st_OffsetWord.Byte1; // Preserving memory area code
#t_d_OffsetWord := #t_d_OffsetWord AND 16#00FFFFFF; // Setting elder byte to 0
#t_d_OffsetWord := SHR_DWORD(IN := #t_d_OffsetWord, N := 3); // Bitwise address section removal
#t_d_OffsetWord += #l_w_OFFSET; // Adding offset
// Recovery
#t_d_OffsetWord := SHL_DWORD(IN := #t_d_OffsetWord, N := 3); 
#t_st_OffsetWord.Byte1 := #t_b_OffsetArea;
#t_st_OffsetPointer.Dword := #t_d_OffsetWord;

重新组装后,ANY 指针可以用作将

VARIANT
参数传递给需要指向具有运行时定义长度的内存区域的函数的值。

© www.soinside.com 2019 - 2024. All rights reserved.