Skip to content

kooiot/lua-iec60870

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lua-iec60870

一个纯 Lua 实现的 IEC 60870-5-101/104 电力系统通信协议栈。

English Documentation | 简体中文

特性

  • IEC 60870-5-101: 平衡和非平衡传输模式
  • IEC 60870-5-104: 基于 TCP/IP 的通信
  • 纯 Lua 实现: 无外部 C 依赖,易于集成
  • 灵活架构: 支持主站(控制站)和从站(被控站)模式
  • 完整数据类型: 全面支持标准中定义的所有 ASDU 类型
  • 平台无关: 可与 OpenResty、原生 Lua 和其他 Lua 运行时一起使用

安装

使用 LuaRocks

luarocks install lua-iec60870

手动安装

git clone https://github.com/yourusername/lua-iec60870.git
cd lua-iec60870
# 将 iec60870 目录复制到你的 Lua 路径

快速开始

主站(控制站)

local iec101 = require 'iec60870.master.cs101'

-- 创建主站实例
local master = iec101:new({
    -- 配置项
})

-- 启动通信
master:start()

-- 发送总召唤命令
master:send_interrogation()

-- 读取数据
master:run()

从站(被控站)

local iec101 = require 'iec60870.slave.cs101'

-- 创建从站实例
local slave = iec101:new({
    addr = 1,  -- 站地址
    -- 配置项
})

-- 设置数据处理器
slave:set_handler(function(asdu)
    -- 处理 ASDU
end)

-- 启动通信
slave:start()

-- 运行事件循环
slave:run()

配置说明

local conf = {
    -- 超时设置(毫秒)
    TIMEOUT       = 5000,     -- 请求超时
    T0            = 30,       -- 连接超时(秒)
    T1            = 15,       -- 发送超时(秒)
    T2            = 10,       -- 确认超时(秒)
    T3            = 20,       -- 测试超时(秒)

    -- 帧设置
    FRAME_NO_ADDR = false,    -- 帧无地址
    FRAME_ADDR_SIZE = 2,      -- 地址字节数
    ADDR_SIZE      = 2,       -- 公共地址字节数
    OBJ_ADDR_SIZE  = 2,       -- 信息对象地址字节数
    COT_SIZE       = 1,       -- 传输原因字节数

    -- 重试设置
    MAX_RESEND     = 3,       -- 最大重试次数
    MAX_RESEND_TIME = 10,     -- 重试超时(秒)
}

架构设计

模块结构

iec60870/
├── common/          # 通用工具(缓冲区、日志、辅助函数)
├── frame/           # 帧层(FT1.2、APCI、控制域)
├── asdu/            # 应用层(ASDU 解析、类型)
├── data/            # 数据类型编码器/解码器
├── master/          # 主站实现
│   ├── cs101/       # IEC 101 主站
│   └── cs104/       # IEC 104 主站
└── slave/           # 从站实现
    ├── cs101/       # IEC 101 从站
    └── cs104/       # IEC 104 从站

核心组件

  • 帧层 (Frame Layer): 处理 FT1.2 帧格式用于串行通信
  • ASDU 层: 解析和编码应用服务数据单元
  • 数据类型: 实现所有标准数据类型(SIQ、DIQ、NVA 等)
  • 主站/从站: 实现站点行为和状态机

支持的 ASDU 类型

监控报文

  • M_SP_NA_1 / M_SP_TA_1: 单点信息
  • M_DP_NA_1 / M_DP_TA_1: 双点信息
  • M_ST_NA_1 / M_ST_TA_1: 步位置信息
  • M_BO_NA_1 / M_BO_TA_1: 位串(32位)
  • M_ME_NA_1 / M_ME_NB_1 / M_ME_NC_1: 测量值
  • M_IT_NA_1 / M_IT_TA_1: 累计量

控制报文

  • C_SC_NA_1: 单命令
  • C_DC_NA_1: 双命令
  • C_RC_NA_1: 调节步命令
  • C_SE_NA_1 / C_SE_NB_1 / C_SE_NC_1: 设点命令

完整列表请参见 types.lua

示例代码

examples 目录中包含完整的使用示例:

  • app_example_standalone.lua: 独立应用示例
  • app_example_openresty.lua: OpenResty 集成示例
  • test_simple.lua: 简单测试用例

文档

API 文档位于 docs 目录(使用 LDoc 生成)。

在本地生成文档:

ldoc .

依赖要求

  • Lua 5.1+ 或 LuaJIT 2.0+
  • 可选: OpenResty 用于 Web 集成
  • 依赖库:
    • middleclass: OOP 支持
    • basexx: 基数编码/解码
    • cjson: JSON 支持
    • hashings: 校验和计算

测试

# 运行测试
lua test/test_simple.lua

# 使用特定配置运行
lua examples/test_config.lua

许可证

MIT License - 详见 LICENSE 文件

贡献指南

欢迎贡献!请:

  1. Fork 本仓库
  2. 创建特性分支
  3. 进行修改
  4. 如适用,添加测试
  5. 提交 Pull Request

参考文献

  • IEC 60870-5-101: 远动设备及系统 - 第5-101部分: 传输协议 - 基本远动任务配套标准
  • IEC 60870-5-104: 远动设备及系统 - 第5-104部分: 传输协议 - 采用标准传输协议集的 IEC 60870-5-101 网络访问

技术支持

如有问题和疑问:

  • 在 GitHub 上提交 Issue
  • 查看 docs 文件夹中的现有文档
  • 参考 examples 了解使用模式

About

IEC 60870 (101, 104) Lua implementation

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors