三菱 PLC ST 语言数据类型与软元件使用指南

一、数据类型全面介绍

(一)基本数据类型

  1. 布尔型(BOOL)
    • 说明:仅有两个值,TRUE(1)和 FALSE(0),主要用于表示开关量状态,例如按钮的按下与松开、设备的运行与停止等。
    • 示例
      VAR
      IsRunning : BOOL := FALSE;
      END_VAR
  2. 整型(INT)
    • 说明:用于表示整数,不同三菱 PLC 型号的取值范围有所不同,常见的有 -32768 到 32767。它可用于计数、地址索引等场景。
    • 示例
      VAR
      Counter : INT := 0;
      END_VAR
  3. 无符号整型(UINT)
    • 说明:只能表示 0 及正整数,取值范围例如 0 到 65535。适用于仅需处理非负整数的情况,如一些设备的编号。
    • 示例
      VAR
      DeviceID : UINT := 100;
      END_VAR
  4. 长整型(LINT)
    • 说明:可表示更大范围的整数,相比 INT 能处理更大数值,例如 -2147483648 到 2147483647。适用于对数值范围要求较高的场合,如大型数据统计。
    • 示例
      VAR
      BigCounter : LINT := 0;
      END_VAR
  5. 无符号长整型(ULINT)
    • 说明:无符号的长整型,取值范围为 0 到 4294967295,适用于需要处理大的正整数的场景,如一些设备的累计运行时间统计(以秒为单位)。
    • 示例
      VAR
      TotalRunTime : ULINT := 0;
      END_VAR
  6. 实数型(REAL)
    • 说明:用于表示浮点数,可精确到一定小数位,例如 3.14。常用于处理需要高精度数值的场合,如温度、压力等模拟量的表示。
    • 示例
      VAR
      Temperature : REAL := 25.5;
      END_VAR
  7. 双精度实数型(LREAL)
    • 说明:比 REAL 型具有更高的精度和更大的表示范围,适用于对精度要求极高的数值计算,如一些科学计算或高精度测量场景。
    • 示例
      VAR
      PrecisionValue : LREAL := 1.234567890123;
      END_VAR
  8. 字符型(CHAR)
    • 说明:用于表示单个字符,例如 'A''a''0' 等。常用于处理字符相关的操作,如显示字符、字符比较等。
    • 示例
      VAR
      DisplayChar : CHAR := 'A';
      END_VAR
  9. 字符串型(STRING)
    • 说明:用于存储一串字符,长度可变。例如 'Hello, World!'。可用于处理文本信息,如设备名称、报警信息等。
    • 示例
      VAR
      Message : STRING := 'Welcome to PLC control';
      END_VAR

(二)衍生数据类型

  1. 数组(ARRAY)
    • 说明:可以将相同数据类型的多个元素组合在一起,形成一个有序的集合。通过索引来访问数组中的元素,索引从 0 开始。
    • 示例
      VAR
      // 定义一个包含 5 个整数的数组
      NumberArray : ARRAY[0..4] OF INT := [1, 2, 3, 4, 5];
      // 定义一个包含 10 个布尔值的数组
      BoolArray : ARRAY[0..9] OF BOOL := [TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE];
      END_VAR
  2. 结构体(STRUCT)

    • 说明:允许将不同数据类型的元素组合成一个单一的数据结构,方便管理相关数据。
    • 示例
      
      TYPE
      // 定义一个结构体类型,用于表示设备信息
      DeviceInfo :
      STRUCT
          ID : UINT;
          Name : STRING[50];
          IsOnline : BOOL;
      END_STRUCT;
      END_TYPE

    VAR
    // 声明一个结构体变量
    MyDevice : DeviceInfo;
    BEGIN
    MyDevice.ID := 1;
    MyDevice.Name := 'PLC Device';
    MyDevice.IsOnline := TRUE;
    END

二、软元件的使用

(一)输入软元件(X)

  1. 说明:用于接收外部设备的输入信号,如按钮、传感器等。每个输入点对应一个唯一的编号,例如 X0X1 等。
  2. 示例
    VAR
    StartButton : BOOL;
    BEGIN
    // 将输入点 X0 的状态赋值给 StartButton 变量
    StartButton := X0;
    // 根据 StartButton 的状态进行逻辑判断
    IF StartButton THEN
        // 执行启动相关操作
    END_IF;
    END

(二)输出软元件(Y)

  1. 说明:用于控制外部设备,如继电器、指示灯等。同样每个输出点有唯一编号,如 Y0Y1 等。
  2. 示例
    VAR
    MotorOutput : BOOL := FALSE;
    BEGIN
    // 根据某些条件控制电机输出
    IF SomeCondition THEN
        MotorOutput := TRUE;
    ELSE
        MotorOutput := FALSE;
    END_IF;
    // 将 MotorOutput 的状态输出到 Y0
    Y0 := MotorOutput;
    END

(三)辅助继电器(M)

  1. 说明:类似于传统继电器控制系统中的中间继电器,用于存储中间运算结果或状态。有不同编号范围,如通用辅助继电器 M0 - M499,断电保持辅助继电器等。
  2. 示例
    VAR
    IntermediateFlag : BOOL;
    BEGIN
    // 根据一些条件设置 IntermediateFlag
    IF Condition1 AND Condition2 THEN
        IntermediateFlag := TRUE;
    ELSE
        IntermediateFlag := FALSE;
    END_IF;
    // 将 IntermediateFlag 的状态存储到辅助继电器 M10
    M10 := IntermediateFlag;
    END

(四)定时器(T)

  1. 说明:用于实现定时功能,可分为普通定时器和积算定时器。定时器有设定值(SV)和当前值(EV),当前值达到设定值时,定时器触点动作。
  2. 示例
    VAR
    Timer : TON; // 定义一个通电延时定时器
    BEGIN
    Timer(IN := StartSignal, PT := T#5S); // 当 StartSignal 为 TRUE 时,开始定时 5 秒
    IF Timer.Q THEN
        // 定时时间到,执行相应操作
    END_IF;
    END

(五)计数器(C)

  1. 说明:用于对输入脉冲进行计数,分为普通计数器和高速计数器。计数器有设定值(SV)和当前值(EV),当前值达到设定值时,计数器触点动作。
  2. 示例
    VAR
    Counter : CTU; // 定义一个递增计数器
    BEGIN
    Counter(CU := CountPulse, R := ResetSignal, PV := 10); // 当 CountPulse 有上升沿时计数,ResetSignal 为 TRUE 时复位,设定值为 10
    IF Counter.Q THEN
        // 计数达到设定值,执行相应操作
    END_IF;
    END

三、使用可变软元件

在三菱 PLC ST 语言中,虽然没有完全像 PHP 的 $$a 这种直接的可变变量方式,但可以通过间接寻址等方法实现类似功能。以下以使用指针方式结合数组来模拟可变软元件的访问:

(一)示例代码

TYPE
    // 定义一个指针类型,指向 INT 型数据
    PtrToInt : POINTER TO INT;
END_TYPE

VAR
    // 定义一个数组,模拟多个软元件的值
    SoftElementArray : ARRAY[0..9] OF INT := [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
    Index : INT := 3; // 用于选择数组元素的索引,可根据实际需求动态改变
    Ptr : PtrToInt;
BEGIN
    // 将指针指向数组中指定索引的元素
    Ptr := ADR(SoftElementArray[Index]);
    // 通过指针访问并修改该元素的值
    IF Ptr <> NULL THEN
        Ptr^ := Ptr^ + 10;
    END_IF;
END

(二)代码解释

  1. 首先定义了一个指针类型 PtrToInt,它指向 INT 型数据。
  2. 接着创建了一个 INT 型数组 SoftElementArray,模拟多个软元件的值。
  3. Index 变量用于动态选择数组中的元素,类似于选择不同的软元件。
  4. 使用 ADR 函数获取数组中指定索引元素的地址,并将其赋值给指针 Ptr
  5. 通过判断指针是否为空(Ptr <> NULL),确保指针有效后,通过 Ptr^ 访问并修改该元素的值。

这种方式可以在一定程度上实现根据动态变化的索引来访问和操作类似可变软元件的数据。需要注意的是,在实际应用中要确保索引值在合理范围内,避免数组越界等错误。