CODOSYS之结构化文本(ST)—— 初级篇(四)基础-数据类型

清楚的了解数据类型是编程必备技能
数据类型分三类:(本篇范扩展数据类型)

规范扩展数据类型
基于IEC 61131-3的标准化扩展
UNION(可以在用户定义类型声明单元)
例子:
      TYPE name: UNION
      a : LREAL;
      b : LINT;
      END_UNION
      END_TYPE
      ANY_TYPE
可以用数据类型ANY_TYPE声明函数的输入。
LTIME
LTIME支持高分辨率定时器的时基。 LTIME大小为64位分辨率纳秒。
句法: 
LTIME#<时间声明>
时间的声明中包含的时间单位用的时间常数:
  "us" : microseconds
  "ns" : nanoseconds
例子: 
   LTIME1 := LTIME#1000d15h23m12s34ms2us44ns
与TIME 相比,它为32 位 ,分辨率毫秒。
WSTRING
标准的字符串类型(ASCII)不同,在于在万国码格式下的获得解读以及每个字符需要两个字节以及2个字节的外加存储空间(一个字符串只需要一个)
例子: 
       wstr:WSTRING:="This is a WString"; 
引用
一个REFERENCE是一个对象的别名 。别名可通过标识符被写或读。指针的差别在于指向的值是直接影响并且引用的分配以及值是固定的。引用的地址必须是通过单独的分配操作设置的。不论一个引用指向一个有效的值(不平等的0)能被通过一个特殊的标识符检查,见以下:“检查引用有效性”
一个引用根据下述语法被声明:
句法: 
      : REFERENCE TO
声明例子: 
     ref_int : REFERENCE TO INT; 
     a : INT; 
     b : INT; 
ref_int现已被用作INT类型的变量的别名。 
使用例子: 
     ref_int REF= a;   (* ref_int now points to a *) 
     ref_int := 12;    (* a now has value 12 *) 
     b := ref_int * 2; (* b now has value 24 *) 
     ref_int REF= b;   (* ref_int now points to b *) 
     ref_int := a / 2; (* b now has value 6 *) 
     ref_int REF= 0;    (* explicit initialization of the reference *) 
 检查引用有效性 
运算符 "__ISVALIDREF" 能被用于检查一个引用是否指向有效值,这个值是不等于0的。
句法: 
:= __ISVALIDREF(identifier, declared with type );
如果引用指向一个有效值,其为真否则为假。
例子: 
声明:
       ivar : INT; 
       ref_int : REFERENCE TO INT; 
       ref_int0: REFERENCE TO INT; 
       testref: BOOL := FALSE; 
执行:
       ivar := ivar +1; 
       ref_int REF= hugo; 
       ref_int0 REF= 0; 
       testref := __ISVALIDREF(ref_int);  (* will be TRUE, because ref_int points to ivar, which is unequal 0 *) 
       testref0 := __ISVALIDREF(ref_int0);   (* will be FALSE, because ref_int is set to 0 *) 
指针
当一个应用程序运行的时候,指针可以保存变量、程 序、功能块、方法和函数的地址。指针可以指向上述 罗列的任何对象或者任何数据类型的变量。 ( 数据类型, 一般) 指针甚至可以 指向用户定义的数据类型 用户定义的数据类型。
指针申明的语法: 
: POINTER TO
指针的实现意味着获得存储在指针所指向的地址中的当前值。指针被定义以后,通过 内部操作符 "^"指针可以实现 ; 参见下述事例“pt^”的例子。地址操作符 ADR 可 以用来分配指针变量的地址。 
示例 
VAR
       pt:POINTER TO INT;  (* Declaration of pointer pt *)
       var_int1:INT := 5;  (* Declaration of the variables var_int1 and var_int2 *)
       var_int2:INT;
       END_VAR
       pt := ADR(var_int1); (* Address of varint1 is assigned to pointer pt *)
       var_int2:= pt^;      (* Value 5 of var_int1 is assigned to var_int2 by dereferencing the pointer pt *)
 函数指针 
对比 CODESYS V2.3 ,取代INDEXOF操作符的函数指针 t也是可行的。这些指针可以被传递给外部的函数库, 但 不可能调用编程系统中应用程序的函数指针 !注册回调函数(系统库函数)的运行函数与函数指针相关 ,并且取决于为 其请求注册的回调函数,各自的功能将由运行时系统 隐性地调用。(见STOP处示例) 为了 确保有这样的系统调用 (运行系统) ,相应的 函数对象property (category "Build") 必须进行设置。 
ADR操作符可以用在函数名、程序名、功能块名和方法名。 见 ADR。 由于函数 可以在实时改动后移动,所得的结果不是函数的地址, 而是指向函数的指针的地址。只要函数存在于目标系 统中,那么该地址就是有效的。
指针的索引访问 
基于 IEC 61131-3 标准化扩展 索引访问 "[]" 可 以是指针型变量、字符串型变量或者WSTRING型变量。 见 字符串 or WSTRING。
    pint[i] 返回基本的数据类型 
    指针的索引访问是数学形式的:如果索引访问被用于 POINTER TO型的变量,偏移量可以这样计算: pint[i] = (pint + i * SIZEOF(base type))^索引访问也可以通过指针隐式实现。结果的类型是该指针的基本类型。注意 pint[7] != (pint + 7)^! 
    如果索引访问用于字符串类型的变量,字符是通过偏 移索引表达式获得的。该结果的类型是字节类型的。str[i]将会以有符号整型(ASCII)返回字符串的第i 个字符。 
    如果索引访问是用于WSTRING类型的变量,字符是 通过偏移索引表达式获得的。该结果的类型是字类型的。wstr[i]将会以整型(Unicode)返回字符串的第i 个字符。 
检查指针功能 
为反映运行期间指针的访问情况,你可以在每次访问 指针的地址前使用隐式监控功能也称 CheckPointer 。 在帮助对话框下,此功能已经作为 POUs 的隐式检查的对象被整合到应用中 添加对象。当你标记复选框的类型为CheckPointer后, 选择一 种执行语言并确认你的设置为选择一 种执行语言并确认你的设置为 Open,检查功能将 在相应的编辑器中打开。声明部分预设为所有语言, 不得进行修改!只有一个例外情况是允许的:增加本 地变量。然而与其它的检查功能进行对比, CheckPointer没有默认的执行;执行是留给用户做的! 
CheckPointer 的功能是检查传递的指针是否指向一个 有效的地址,即保留在有效的存储范围内,并且所引 用的存储器区域的取向是否与指针所指向的变量的数 据类型相符合。如果满足所有的条件 ,CheckPointer 返回没有变化的输入指针。否则,其其应该 执行一个适当的错误处理程序。 
声明部分: 
// Automatically generated code : DO NOT EDIT
FUNCTION CheckPointer : POINTER TO BYTE 
VAR_INPUT
    ptToTest : POINTER TO BYTE;
    iSize : DINT;
    iGran : DINT;
    bWrite: BOOL;
END_VAR
实现部分: (不完全!): 
// No standard implementationFill in your own code here
CheckPointer := ptToTest;

当被调用时,函数接收下面的输入参数: 
    ptToTest:指针的目标地址 
    iSize:参考变量的长度:其数据类型一定是兼容整数 的, 并且必须包含储存在指针地址中最大可能的数据 长度。 
     iGran: 访问的粒度,也就是用于参考变量中最大的非 标准数据类型;其数据类型一定是兼容整数的。 
    bWrite:访问的类型(真=写访问,假=读访问);其 数据类型一定是布尔类型。 
如果是一个肯定的检查结果,未修改的输入指针将返 回 (ptToTest)。
BIT
BIT 数据类型只能用于在 结构中的特殊变量。可能的值是TRUE (1)和FALSE (0)。一个 BIT 元素消耗 1 位内存,并且允许处理名称结构的单独位,参见 结构中的Bit 访问。Bit 元素为一个接着一个的声明,将被合并在字节中。所有与 布尔类型相比,在任何情况下都保留 8 位,内存的使用将得到优化。需注意另一方面,方位位将需要更多时间! 所以他只在你想要在一个特定的格式下定义数据时建议使用BIT数据类型。
 

 

你可能感兴趣的:(Codesys,ST,PLC)