# libiec10x **Repository Path**: q__273269/libiec10x ## Basic Information - **Project Name**: libiec10x - **Description**: iec101/iec104 协议栈 C 语言实现 - **Primary Language**: C - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 13 - **Created**: 2023-03-02 - **Last Updated**: 2023-03-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # libiec10x 协议栈使用说明 ## 概述 功能简述 : 支持 104 / 平衡101 /非平衡101 的主从站的基本功能 程序语言 : C 语言 语言版本 : C99 标准 应用平台 : linux / 嵌入式 字符编码 : UTF-8 应用概述 : 协议栈基于事件回调,有无操作系统下皆可运行,且为面向对象架构, 一个连接为一条总线,适用于中小型场合(连接数小于250)。协议栈支持 101/104 主从连接并存, 并且每个连接可带不同的链路参数。协议栈对硬件抽象,需要用户提供硬件发送相关函数。协议用标准 C99 编写,理论上可以移植到任何支持 C99 的嵌入式平台(尚未验证)。 ## 基本使用流程 下面以 101 规约总线使用为例: 0> 假设已实现硬件层相关的初始化,并编写硬件发送函数 void iec10x_puts(uint8_t * data, int len) ; 1> 初始化一次协议栈 iec10x_protocol_init();并提供 100ms 一次的 iec10x_periodic_handle() 轮询 ; 2> 新建全局/静态总线 iec10x_t bus ; 编写对应的初始化结构体 struct iec101cfg buscfg ; 3> iec10x_bus_init(&bus,101,&cfg,usrinit); 初始化总线,其中 usrinit 为用户层初始化函数 4> bus 接收到一包数据后,无论是否断包,交由 iec10x_recv(&bus,data,len) 处理 ## 文件架构 其中,60870-5 为 iec10x 协议栈的具体实现,内容大致如下 ./60870-5/ |-- 10x |-- type |-- iec |-- iec_file.c |-- iec_file.h |-- iec_list.h |-- iec_sys.h `-- iec10x.h 其中, 10x 文件夹是协议栈具体的流程实现; iec 文件夹是协议栈组件,如内存管理等; type 文件夹定义了规约中常用的数据结构,如 SIQ.h 即单点遥信相关头文件; iec_list.h 为协议栈中链表的实现; iec10x.h 是唯一对外提供的 api 头文件,所有供用户使用的接口都在此头文件; 在协议栈的使用上可不去改动以上的内容,除非是需要进行协议栈的拓展。具体的软件设计流程后文详述。 主要移植项为以下文件: iec_file.c,iec_file.h 是规约文件传输所需要进行移植的相关接口;此处提供了在 linux 下的文件接口。 iec_sys.h 为协议栈基本的配置条目,如配置协议栈是否打印调试信息等; 另外,lesson 中存放了 linux 平台的协议栈具体示例,工程基于 CMake 构建,在对应的文件夹执行 ./build.sh 脚本进行编译。工程文件夹后缀序号代表示例应用程度由简至繁,可作为入门参考。还在更新... ## API 简述 目前 libiec10x 协议栈的所有应用 API 都集成在 iec10x.h 头文件中,在应用上只需要 include 这个头文件即可。 协议栈使用面向对象的设计方法,每一个主从站链接用一个 struct iec10x 表示,此处记为总线,一个 struct iec10x 包含了通讯过程中的中间参数、状态机和通讯参数等信息,在使用时可不关心里面的内容,只需知道协议栈所有的 api 主体 都为此结构体。 ``` /** * @brief 定时轮询,此函数需要用户实现周期调用一次,建议 100ms / 50ms / 25ms * @note 此函数的轮询周期也决定了总线的发送频率,即每包的间隔 * @param localtime : 毫秒精度的系统时间戳 * @return don't care */ void iec10x_periodic_handle(size_t localtime); /** * @brief 总线接收数据并解析 * @param bus : 需要解析的总线结构体 * @param data : 包数据 * @param len : 包数据长度 * @return don't care */ void iec10x_recv(iec10x_t * bus , uint8_t * data , int len); /** * @brief 用户设备接口管理注册 * @param bus : 目标总线 * @param type : 当前数据接口的类型 * @param statfn : 信息结构体状态获取接口 * @param getfn : 信息体结构体内容获取接口 * @param profn : 信息体结构体内容处理接口 * @return 成功返回 0 ,否则返回其他 */ int iec10x_devif_register( iec10x_t * bus , unsigned char type , dev_statfn_t statfn , dev_getfn_t getfn , dev_profn_t profn ) ; ``` /// 下次更,下次一定 ## 软件设计框架及功能拓展 /// 有空再更,下次,下次一定