接口(Interfaces)

概述

自动化接口处理真实或虚拟自动化控制器与 realvirtual.io 之间的通信。每种通信类型都需要特殊的接口。当前可用的接口有:Siemens S7(S7-300、400、1200、1500、Sinumerik、Simotion)、TwinCATTwinCATHMISimitPLCSim-Advanced(虚拟 Siemens S7 1500 PLC)、RobotDKMQTTModbus 服务器、SimulinkFMIABB RobotStudioUniversalRobotsEthernetIPMQTTOPCUA。新接口持续添加中。

所有接口使用标准的 PLCInput 和 PLCOutput 对象(如 PLCInputFloat 或 PLCOutputBool)存储信号值。接口本身处理信号的实时值。某些接口提供自动导入所有信号并在 realvirtual.io 层级中自动创建合适 PLCInput 或 PLCOutput 对象的功能。有时可以通过与控制器本身通信导入信号,有时可以导出用于编程自动化控制器的信号列表并使用。导入的信号可以通过 SignalManager 自动连接到 realvirtual.io 信号对象。

接口、信号和行为模型

信号连接到行为模型的输入和输出属性。

此哔哩哔哩教程解释了信号和行为模型之间的关系:

理解信号方向

⚠️

信号方向可能令人困惑

realvirtual 信号命名遵循 Unity 作为被仿真设备的视角,这与 PLC 控制器视角相反。Unity 模拟现场设备(传感器和执行器),而不是 PLC 本身。

核心概念

Unity 扮演物理设备的角色,而不是控制器的角色:

  • PLCInput = Unity 向控制器写入数据(模拟传感器发送数据)
  • PLCOutput = Unity 从控制器读取命令(模拟执行器接收命令)

信号映射

Unity 的角色数据流向使用此信号类型
模拟传感器Unity → 控制器PLCInput
模拟按钮按下Unity → 控制器PLCInput
模拟电机控制器 → UnityPLCOutput
模拟阀门控制器 → UnityPLCOutput

命名最佳实践

在控制器程序中使用清晰的方向命名以避免混淆(例如,FromField.SensorValueToField.MotorSpeedSensors.BoxDetectedActuators.ConveyorRun)。

信号类型

以下信号类型受所有接口支持。在大多数情况下,PLC 本身可以支持更多数据类型。例如,有符号整数和无符号整数都传输到 realvirtual.io 中对应的基础类型。

信号类型描述
PLCInputBool布尔值(true/false)的 PLC 输入
PLCInputInt整数值的 PLC 输入(在 PLC 侧也可以是 Byte、UInt、SInt ...)
PLCInputFloat浮点值的 PLC 输入(在 PLC 侧也可以是 double、single)
PLCInputText文本(字符串)PLC 输入。此数据类型仅受 TwinCATADS 和 MQTT 接口支持
PLCOutputBool布尔值(true/false)的 PLC 输出
PLCOutputInt整数值的 PLC 输出(在 PLC 侧也可以是 Byte、UInt、SInt ...)
PLCOutputFloat浮点值的 PLC 输出(在 PLC 侧也可以是 double、single)
PLCOutputText文本(字符串)PLC 输出。此数据类型仅受 TwinCATADS 和 MQTT 接口支持

检查信号状态和与行为模型的连接

您可以在模型的层级视图中检查所有信号:

PLCInput 以红色显示,PLCOutput 以绿色显示。所有未连接到 realvirtual.io 行为模型的信号(即当前不控制模型或未从模型获取任何信息的所有信号)以括号显示。

可以在信号组件本身上检查 Signal Connection Info 部分中连接的行为模型:

强制(覆盖)信号

可以将信号强制为特定值。这样一来,所有连接的组件接收的是强制值,而不是当前输入或输出的值。可以通过在信号中将 Settings>Override 设置为 true 来强制信号。该值现在由您在 Value Override 中定义的值决定。强制信号始终以斜体显示。

对于布尔值,只需点击该值即可强制。这将强制该值并在 true 和 false 之间切换。要取消强制该值返回,需要点击感叹号。

ℹ️

要将多个信号一起强制为可重用、可切换的场景 — 并一目了然地查看场景中的每个强制信号 — 使用 Signal Force Set (Pro) 组件和 Signal Force Monitor 窗口。这对于虚拟调试非常理想,其中边界信号(电压存在、紧急停止释放、系统压力)必须保持在定义的值。(Professional)

连接信号

要连接两个信号,可以使用 Connect Signals。两个信号必须具有相同的数据类型,但无论是输入还是输出都可以。

在此示例中,一个 InputFloat 连接到一个 OutputFloat。连接的信号值传输到当前信号。

信号事件

行为模型中的信号

通常,信号应由脚本定义的行为模型使用。在行为模型中,引用用于识别附加到行为模型的信号。以下是一个可以附加到传感器的简单行为模型示例:


[RequireComponent(typeof(Sensor))]
  //! Sensor_Standard 组件提供传感器行为和与 PLC 输入输出的连接。
  public class Sensor_Standard : BehaviorInterface
  {
     
      [Header("Settings")] public bool NormallyClosed = false;  //!< 定义传感器信号在占用时为 *true* (NormallyClosed=false) 还是在占用时为 *false* (NormallyClosed=true)
      [Header("Interface Connection")] public PLCInputBool Occupied; //! 传感器信号的布尔 PLC 输入。

      private Sensor Sensor;
      
      // 用于初始化
      void Start()
      {
          Sensor = GetComponent<Sensor>();
      }

      // 每帧调用一次
      void Update()
      {
          bool occupied = false;
      
          // 设置行为输出
          if (NormallyClosed)
          {
              occupied = !Sensor.Occupied;
          }
          else
          {
              occupied = Sensor.Occupied;
          }

          // 设置外部 PLC 输出
          if (Occupied != null)
              Occupied.Value = occupied;

      }
  }

公共变量 public PLCInputBool Occupied 作为对输入信号的引用。因为 Sensor Behavior Model 附加到也附加了 Sensor 基础模型的游戏对象,它可以获取对传感器的引用。在 Update 周期中,行为模型在信号和 Sensor 基础对象本身之间传输状态。行为模型为您提供了编程不同行为同时仍然使用相同基础对象的灵活性。

您可以在下图中看到这些关系:

Unity 事件和信号

您可以在信号改变时立即接收 Unity 事件。为此,您可以在 Unity 编辑器中选择每个信号上应在信号状态改变时调用的方法:

被调用的方法接收一个 Signal 参数。方法必须定义如下:


public void SignalChangedEditor(Signal signal)
     {
         Debug.Log("Signal Changed Editor " + signal.ToString());
     }

在方法中订阅信号更改事件

另一种选择是在方法中订阅 Signal 更改事件。如果这样做,您在 Unity 编辑器中看不到任何东西。每次 Unity 启动仿真时进行订阅。以下是一个示例:


void Start()
    {
        // 在运行时注册事件
        var com = GetComponent<PLCInputBool>();
        com.SignalChanged += SignalChangedRuntime;
    }

 
    public void SignalChangedRuntime(Signal signal)
    {
        Debug.Log("Signal Changed Runtime " + signal.ToString());
    }

请查看 Realvirtual.io 类参考(Class Reference) 了解有关此组件属性和方法的更多信息。

© 2025 realvirtual GmbH https://realvirtual.io - 保留所有权利。未经出版商事先书面许可,不得以任何形式或任何方式(包括打印、保存、影印、录制或其他电子或机械方法)复制、分发或传播本出版物的任何部分。