跳转至

DIO SDK

DIO简介

概述

DIO(Digital Input/Output,数字输入/输出)协议是一种常见的通信协议,用于在硬件设备之间传输数字信号。DIO协议一般应用于控制硬件设备的输入和输出操作,例如开关、LED、继电器等的控制。通过该协议,设备可以接收来自外部的数字输入信号并根据预定逻辑执行响应操作,也可以通过输出信号向外部设备发送控制命令。

基本功能

DIO协议的主要功能包括:

  • 数字输入:允许设备接收外部的数字信号(0或1)。
  • 数字输出:允许设备发送数字信号至其他设备,控制其状态(例如开或关)。
  • 命令交互:通过特定的命令格式,设备可以执行DIO控制操作,例如读取输入状态、写入输出信号等。

应用场景

  • 开关控制:通过DIO输出信号来控制继电器开关、LED等外部设备。
  • 传感器数据读取:读取传感器的数字信号,比如开关量传感器(例如温度报警器、压力开关等)。
  • 状态指示:使用DIO来检测设备状态,例如按键输入,是否按下等。

硬件接口

接口说明

BK1000设备共提供4路DI端口、4路DO端口,BK2000设备共提供10路DI端口、10路DO端口供您使用,其接口定义为

DI端口序号 系统文件名 DO端口序号 系统文件名
DI-1 PG10(202) DO-1 PB8(40)
DI-2 PG12(204) DO-2 PG0(192)
DI-3 PG11(203) DO-3 PG8(200)
DI-4 PG14(206) DO-4 PG9(201)
DI-5 PD14(110) DO-5 PD10(106)
DI-6 PD15(111) DO-6 PD11(107)
DI-7 PD16(112) DO-7 PD12(108)
DI-8 PD17(113) DO-8 PD13(109)
DI-9 DO-9
DI-10 DO-10

DI API说明

请您确保已经将SDK引入到项目中,SDK的相关引入可参考SDK安装章节。

SDK中封装了基础的端口操作,开发人员可以通过相关API快速的控制端口的打开、关闭,进行端口电平的读取、修改。

使用DI相关操作函数,需要分别引用 di.h头文件。

di_init

功能

初始化设备所有DI接口

函数原型

/**
 * @brief DI接口初始化
 *
 * @note 该函数会一次性初始化设备所有DI接口
 *
 * @return
 *      - 1:  成功
 *      - -1: 初始化失败
 *      - -2: 授权校验失败
 *
 */
int di_init(void);

返回值

  • 成功:0
  • 失败:
    • 初始化失败:-1
    • 授权校验失败:-2

di_read

功能

DI接口输入读取

函数原型

/**
 * @brief DI接口输入读取
 *
 * @param[in] ch     DI接口序号,BK1000设备1~4,BK2000设备1~10
 *
 * @return
 *      - 0:  低电平
 *      - 1:  高电平
 *      - -1: 读取失败
 *
 */
int di_read(int ch);

参数

参数名 类型 说明
ch int DI接口序号,BK1000设备1\~4,BK2000设备1~10

返回值

  • 成功:
    • 低电平:0
    • 高电平:1
  • 失败:-1

DO API说明

请您确保已经将SDK引入到项目中,SDK的相关引入可参考SDK安装章节。

SDK中封装了基础的端口操作,开发人员可以通过相关API快速的控制端口的打开、关闭,进行端口电平的读取、修改。

使用DO相关操作函数,需要引用 do.h头文件。

do_init

功能

初始化设备所有DO接口

函数原型

/**
 * @brief DO接口初始化
 *
 * @note 该函数会一次性初始化设备所有DO接口
 *
 * @return
 *      - 1:  成功
 *      - -1: 初始化失败
 *      - -2: 授权校验失败
 *
 */
int do_init(void);

返回值

  • 成功:0
  • 失败:
    • 初始化失败:-1
    • 授权校验失败:-2

do_write

功能

DO接口输出变更

函数原型

/**
 * @brief DO接口输出变更
 *
 * @param[in] ch     DO接口序号,BK1000设备1~4,BK2000设备1~10
 * @param[in] value
 *      - 0: 低电平
 *      - 1: 高电平
 *
 * @return
 *      - 1:  成功
 *      - -1: 失败
 *
 */
int di_write(int ch, int value);

参数

参数名 类型 说明
ch int DO接口序号,BK1000设备1\~4,BK2000设备1~10
value int 0:低电平1:高电平

返回值

  • 成功:1
  • 失败:-1

示列代码

以下以控制第1路DO端口、读取第1路DI端口为例,进行相关API操作的说明,使用此示例时,需要将DO1与DI1进行端口连接

#include "di.h"
#include "do.h"
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

/**
 * 循环更改DO状态线程函数
 */
void *do_send_thread(void *arg)
{
    // DO接口序号
    int ch = *((int *)arg);
    // 更改的DO值
    int value = 0;
    while (1)
    {
        // 更改DO状态值
        int result = do_write(ch, value);
        // 更改失败
        if (result == -1)
        {
            printf("Write DO with value %d fail\n", value);
        }
        // 更改成功
        else
        {
            printf("Write DO with value %d success\n", value);
        }
        // 切换更改的值,使其在0和1之间变换
        value = 1 - value;
        // 休眠2秒
        usleep(2000 * 1000);
    }
}

int main()
{
    // 定义DIO操作接口序号
    int dio_channel = 1;
    // 初始化DI接口
    int rc = di_init();
    // DI接口初始化失败
    if (rc < 0)
    {
        printf("Failed to initialize DI!\n");
        return -1;
    }
    // 初始化DO接口
    rc = do_init();
    // DO接口初始化失败
    if (rc < 0)
    {
        printf("Failed to initialize DO!\n");
        return -1;
    }
    pthread_t write_thread;
    // 创建线程来周期性更改DO状态
    if (pthread_create(&write_thread, NULL, do_send_thread, (void *)&dio_channel) != 0)
    {
        perror("Failed to create write thread");
        return -1;
    }

    // 循环读取DI状态
    while (1)
    {
        // 休眠500毫秒
        usleep(500 * 1000);
        // 读取DI状态
        int result = di_read(dio_channel);
        // 读取失败
        if (result == -1)
        {
            printf("Error in reading Digital Input value\n");
            continue;
        }
        // 读取成功,打印状态值
        printf("Digital Input on channel %d is %d.\n", dio_channel, result);
    }
    return 0;
}