# 输出动作

> **输出动作**，指的是由程序主动发出指令，对电路中某个通道进行控制，由硬件设备进行响应的过程。

### 指定输出通道

```cpp
IODevice& _device = IODeviceController::Instance()
	.GetIODevice("PCI2312A");

// 指定通道输出
_device.SetDO(EKeys::OAxis_00, 1);	

// 一次性控制多个通道
float _doStatus[16] = {1,1};
_device.SetDO(_doStatus);
```

### 指定输出动作

{% tabs %}
{% tab title="Application.cpp" %}
```cpp
IODevice& _device = IODeviceController::Instance()
	.GetIODevice("PCI2312A");

// 指定输出动作
_device.SetDOOn("TurnOnLight"); //  等价于 _device.SetDO("TurnOnLight", 1);
_device.SetDOOff("TurnOnLight"); // 等价于 _device.SetDO("TurnOnLight", 0);
```
{% endtab %}

{% tab title="IODevice.xml" %}
```cpp
<IORoot>
  <Device Name="Standard" Type="Standard" />
  <Device Name="PCI2312A" Type="External" DllName="PCI2312A" Index="0">
   
    <OAction Name="TurnOnLight"> 
      <Key Name="OAxis_00"/>
      <Key Name="OAxis_01"/>
      <Key Name="OAxis_02" Scale="1" InvertEvent="False" />
    </OAction>
    
  </Device>
</IORoot>
```
{% endtab %}
{% endtabs %}

### 同步输出

> 正常调用输出时，为了避免频繁与设备进行指令交互，同一帧的输出指令会在帧循环结束一次性发送到指定设备，你可以通过**同步输出**立刻执行输出动作。

```cpp
IODevice& _device = IODeviceController::Instance()
	.GetIODevice("PCI2312A");
	
_device.SetDoOn("TurnOnLight");
// 同步输出
_device.DOImmediate();
```
