IEC 60870-5-104 从站模拟程序(基于数据库)

📌 项目简介

本项目是一个纯 Python 实现的 IEC 60870-5-104 从站模拟程序,主要功能包括:

  • 从 MySQL 数据库轮询获取遥测/遥信数据;
  • 实现 IEC 104 从站通信,支持与主站的握手、总召唤、变化量上送、周期上送;
  • 不依赖第三方协议库,完全自定义实现104协议帧处理;
  • 线程隔离,通信与数据库采集独立运行。

📁 项目结构

├── mysql_to_iec104.py           # 主程序(包含数据库线程 + IEC104服务线程)
├── README.md         # 使用说明

⚙️ 环境依赖

  • Python >= 3.7
  • pymysql
  • MySQL 数据库一套

✅ 建议在 Linux 或 Windows 环境下运行,确保网络端口 2404 可被监听。

安装依赖

pip install pymysql

🏗️ 数据库配置

请先在 MySQL 中创建数据库和数据表,表结构如下:

表名:104_table
包含 16 个字段,字段名为 字段1 到 字段16:

  • 字段1 ~ 字段15:模拟量(遥测) → IOA 1~15
  • 字段16:开关量(遥信) → IOA 16

可手动插入或通过其他程序实时更新这张表。

🔄 功能说明

1、数据库轮询线程(db_polling_thread)

  • 每秒查询一次数据库,取出一行 16 个字段;
  • 检测数据是否有变化,变化项入队;
  • 每 15 分钟执行一次“周期性全量上送”任务。
  • IEC104 从站通信线程(iec104_server_thread)

2、监听 2404 端口,等待主站连接;

  • 支持 STARTDT / STOPDT / TESTFR 握手过程;
  • 接收总召命令(C_IC_NA_1),上送 15 个模拟量和 1 个遥信量;
  • 检测到变化/周期性任务时,构造并发送 I 帧(遥测/遥信);
  • 支持 S 帧、U 帧的处理与回应。

📡 报文说明

  • 遥测类型:M_ME_NA_1(Type=9),顺序寻址方式
  • 遥信类型:M_SP_NA_1(Type=1)
  • 总召命令:C_IC_NA_1(Type=100)

✅ 启动方式

直接运行:

python mysql_to_iec104.py

运行日志将输出:

  • 数据库连接情况
  • 数据采集变化日志
  • IEC104 报文收发日志
  • 总召唤响应及周期上报状态

🧪 调试建议

  • 可使用调试主站软件如 IEC104 Tester、ScadaBR 等;
  • 验证主站与从站建立握手后,是否能触发总召并成功上送;
  • 数据库表中字段值变化时,观察是否触发变化量上送。

📍 注意事项

  • 当前程序仅支持单连接从站模式;
  • 所有点位地址为 顺序型寻址(IOA 从 1 开始);
  • 程序未使用任何现成协议库,适合教学、实验、快速部署使用;
  • 实际工程中请注意加固异常处理、安全机制等。

如需扩展支持多个表、多个连接、写入命令响应等功能,请在此基础上继续拓展。

📞 联系与支持

如有问题或需求,可通过 Issues 提出,也欢迎 Fork 本项目进行二次开发。

测试截图
遥信点位测试

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐