# 西门子S7协议转换工具 **Repository Path**: icsteam/siemens-s7-convert ## Basic Information - **Project Name**: 西门子S7协议转换工具 - **Description**: 西门子S7协议转换,使用snap7读写西门子PLC的DB块数据,支持Modbus_Tcp、iec104、web api和MQTT读写,使用了snap7库,paho_mqtt库。 支持西门子PLC,1200,1500,200smart(300和400未测试) - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 0 - **Created**: 2024-01-19 - **Last Updated**: 2025-12-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 西门子 S7 通讯协议转换工具说明文档
## 一、项目概述
### 1.1 核心定位
本工具是一款基于 Python 开发的工业级通讯协议转换中间件,核心功能为通过 Snap7 协议读取西门子 PLC 的 DB 块与 M 区数据,并提供 Modbus TCP、MQTT、Web API、IEC104 四种标准化协议的读写转发能力,实现西门子 PLC 与第三方系统(SCADA、MES、数据平台等)的无缝数据交互。
### 1.2 技术栈
* 核心依赖库:python-snap7 2.0.2(PLC 数据读写)、paho-mqtt 2.1.0(MQTT 通讯)、Flask 3.1.1(Web API 服务)、colorama 0.4.6(日志着色)
* 开发语言:Python 100%(兼容 Python 3.8 及以上版本)
* 开源协议:MIT License
### 1.3 适用场景与稳定性
* 兼容 PLC 型号:西门子 S7-1200 系列、S7-1500 系列、S7-200 SMART 系列(均经过实测验证)
* 运行环境:Windows(32/64 位)、Linux(CentOS/Ubuntu 等)
* 稳定性:已在实际工业项目中稳定运行 1 年以上,无重大通讯故障记录
## 二、核心功能特性
### 2.1 多源数据读写支持
* 支持多台 PLC(S7-1200/1500)同时接入,实现 DB 块与 M 区地址的并行读写转发
* 支持数据类型:布尔型(Bool)、字节型(Byte)、整型(Int)、浮点型(Real),覆盖工业常见数据格式
### 2.2 多协议转发能力
| 协议类型 | 功能角色 | 默认配置参数 |
| ---------- | --------- | ------------------------ |
| Modbus TCP | 服务端 | 地址:127.0.0.6,端口:666,ID:2 |
| MQTT | 客户端 / 发布端 | 支持 JSON 格式上报,模板可自定义 |
| Web API | 服务端 | 地址:127.0.0.1,端口:5000 |
| IEC104 | 服务端 | 监听地址:0.0.0.0,端口:2404 |
### 2.3 通讯性能优化
* 批量读取机制:一次性读取目标 DB 块全部字节后进行解析,减少通讯交互次数,降低网络负载
* 读取时长控制:单次批量读取耗时控制在 1 秒(视网络带宽与 PLC 响应速度调整)
* 可配置读取频率:通过 config.ini 设置 Snap7 读取周期,默认 1 秒 / 次
### 2.4 便捷运维特性
* 开机自启动:支持 Windows 平台开机自动运行,无需人工干预
* 灵活配置:点位信息通过 CSV 文件配置,协议参数通过 ini 文件调整,无需修改源码
* 日志可视化:关键操作(连接状态、数据读写、协议交互)均输出着色日志,便于问题排查
## 三、安装部署指南
### 3.1 快速部署(Windows 平台,无需安装)
1. 下载工具压缩包,解压至任意目录
2. 必备文件清单(解压后需完整保留):
* 可执行文件:Snap7Client3.5.4.exe
* 依赖文件:snap7.dll、config.ini、ztest.csv(点位配置文件)
3. 直接双击运行 Snap7Client3.5.4.exe,即可启动服务
### 3.2 源码部署(Windows/Linux 通用)
#### 3.2.1 环境准备
1. 安装 Python 3.8 及以上版本(需配置系统环境变量)
2. 安装依赖库:
``` bash
# Windows平台
pip install -r requirements.txt
# Linux平台
pip3 install -r requirements.txt
```
#### 3.2.2 必备文件清单
需确保源码目录下包含以下文件:
* 核心脚本:Snap7Client3.5.4.py、Mqtt_Server.py、public_lib.py、iec104_Server.py、Modbus_Server.py、web_api.py
* 配置文件:config.ini(协议参数配置)、ztest.csv(点位配置文件,可自定义命名)
* 依赖库:python-snap7、paho-mqtt、colorama、Flask(通过 pip 安装后自动关联)
#### 3.2.3 启动命令
```
# Windows平台
python Snap7Client3.5.4.py
# Linux平台
python3 Snap7Client3.5.4.py
```
## 四、详细配置说明
### 4.1 核心配置文件(config.ini)
用于配置 PLC 连接参数、协议端口、读取频率等核心参数,示例配置如下:
``` ini
#------Snap7------
#控制器地址,端口默认102
#每个plc一个参数列表,多个plc参数用逗号隔开,ID唯一不重复
#plc参数列表说明(plc地址,modbus ID(唯一),plc名称(唯一),点位文件路径csv,plc机架号,plc卡槽号【200smart、1200和1500使用机架号和卡槽号使用0,0即可】)
控制器参数 = [
('127.0.0.1',1,'plc1','ztest.csv',0,0), # 1号配置
#('192.168.2.10',2,'plc2','ztest.csv',0,0), # 2号配置
]
#读控制器频率,单位秒;1个plc读2000个字节内,读5个plc,1秒内
读取频率 = 1
#------Snap7------
```
### 4.2 点位配置文件(ztest.csv)
用于定义 PLC 数据点位的映射关系,字段说明与示例如下:
| 名称 | 数据类型 | 起始位置 | DB 块地址 | 权限 | IEC104 地址 | 说明 |
| :-----: | :----: | :--: | :----: | :--: | :---------: | ---------------- |
| 布尔 0 | Bool | 0.0 | 1 | 读写 | 1 | Bool 类型格式:字节偏移。位 |
| 布尔 1 | Bool | 0.1 | 1 | 读写 | 2 | |
| 浮点 0 | Real | 2 | 1 | 读写 | 10 | Real 类型占 4 字节 |
| 整数 0 | Int | 6 | 1 | 读写 | 20 | Int 类型占 2 字节 |
| 字节 0 | Byte | 0 | 1 | 读写 | 30 | Byte 类型占 1 字节 |
#### 配置规则:
1. 多个csv点位文件,IEC104地址也必须唯一,不可重复
2. 起始位置说明:
- Bool 类型:格式为「字节偏移。位」(如 0.1 表示 DB1 的 0 字节第 1 位)
- 非 Bool 类型(Byte/Int/DInt/Word/DWord/Real):直接填写字节偏移量(可以直接在博图DB块的编辑器中直接拷贝到点位配置文件)
3. 仅支持表中指定的数据类型
- [x] 布尔(Bool)
- [x] 字节(Byte)
- [x] 整型(Int/DInt/Word/DWord)
- [x] 浮点型(Real)
### 4.3 Modbus 点表生成
工具会自动根据点位配置文件生成 Modbus TCP 映射表(plc1_modbus 点位表.csv),映射关系示例如下:
| 名称 | Modbus 地址 | 数据类型 | 权限 | 上位机数据标识 | 上位机数据类型 |
| ---- | --------- | ---- | -- | --------- | ------- |
| 布尔 0 | 0 | Bool | 读写 | plc1@布尔 0 | Boolean |
| 整数 0 | 8 | Int | 读写 | plc1@整数 0 | Int |
| 浮点 0 | 9 | Real | 读写 | plc1@浮点 0 | Float |
| 字节 0 | 11 | Byte | 读写 | plc1@字节 0 | Int |
## 五、使用指南
[🔗实操传送门](https://blog.icsteam.cn/2025/07/18/201_snap7_readme/)
### 5.1 数据读取操作
#### 5.1.1 Web API 读取
* 请求方式:GET
* 请求地址:http://127.0.0.1:5000/get
* 响应示例:
```json
{
"properties": {
"plc1@字节0": 12,
"plc1@布尔0": 0,
"plc1@布尔2": 1,
"plc1@整数0": -125,
"plc1@浮点0": 0.98,
"plc1@状态": 1
}
}
```
#### 5.1.2 IEC104 读取
1. 启动工具后,IEC104 服务监听 0.0.0.0:2404
2. 客户端连接地址:`127.0.0.1:2404`,站地址 1
3. 通过客户端工具(如 IEC104 Client Simulator)查询对应 IEC104 地址的点位数据
#### 5.1.3 Modbus TCP 读取
1. 使用 Modbus 工具(如 Modbus Poll)连接服务端:
* IP:127.0.0.1,端口:666,从站 ID:2
2. 按照生成的 Modbus 点表地址进行数据读取
### 5.2 数据写入操作
#### 5.2.1 Web API 写入
* 请求方式:POST
* 请求地址:http://127.0.0.1:5000/post
* 请求体示例:
``` json
{
"SetProperty": {
"plc1@字节0": 12,
"plc1@浮点0": 0.98
}
}
```
#### 5.2.2 IEC104 写入
* 客户端连接后,向目标 IEC104 地址发送写入请求
* 示例操作:写入 PLC1 DB1 起始地址 2(浮点型)数据 0.98
#### 5.2.3 MQTT 写入
1. 订阅主题:`/plc/data/control`
2. 发布 JSON 格式控制指令:
``` json
{
"SetProperty": {
"plc1@布尔3": 1,
"plc1@整数0": 256
}
}
```
## 六、技术细节与性能指标
### 6.1 数据读取机制
* 字节计算规则:要读取的总字节数 = 最高偏移量 - 最小偏移量 + 最高偏移量对应数据类型的字节长度
* 示例:若点位包含起始位置 0(Byte)、2(Real)、6(Int),则总字节数 = 6 - 0 + 2(Int 类型字节数)=8 字节
* 读取延迟:网络稳定时≤1秒,支持通过 config.ini 调整读取频率适配弱网环境
### 6.2 协议兼容性
* Snap7 协议:兼容西门子 S7 系列 PLC 的 S7 通讯规范
* IEC104 协议:支持总召唤、布尔、整形、浮点数的读写
* Modbus TCP:符合 Modbus RTU over TCP 规范,支持功能码 03(读取保持寄存器)、06(写入单个寄存器)、16(写入多个寄存器)
* MQTT 协议:支持 MQTT 3.1.1 版本,支持 QoS 0/1 等级
### 6.3 资源占用
* 内存占用:运行时≤50MB(Windows 平台)、≤30MB(Linux 平台)
* CPU 占用:单 PLC 连接时≤5%,多 PLC 并行时≤10%(基于 Intel i5 处理器测试)
## 七、注意事项与故障排查
### 7.1 配置注意事项
1. IEC104 地址必须全局唯一,不可重复配置
2. 点位配置文件中,数据类型仅支持 Bool、Byte、Int、Real,不可自定义扩展类型
3. Linux 平台下需确保配置文件(config.ini、ztest.csv)的权限为 root 可读写
### 7.2 常见故障排查
| 故障现象 | 可能原因 | 解决方案 |
| ----------- | --------------------- | ----------------------------------------- |
| 无法连接 PLC | PLC IP 配置错误 / 网络不通 | 检查 config.ini 中 PLC\_IP\_LIST,测试 ping 连通性 |
| 协议客户端无法连接工具 | 端口被占用 | 更换 config.ini 中对应协议端口,重启工具 |
| 数据读取为空 | 点位配置错误(DB 块 / 起始位置) | 核对 PLC 实际点位与 ztest.csv 配置是否一致 |
| MQTT 连接失败 | MQTT Broker 地址 / 端口错误 | 检查 config.ini 中 MQTT 配置,测试 Broker 连通性 |
|反复连接断开PLC|点位配置DB块地址不存在或配置点位不存在|检查点位配置文件CSV文件是否正确|
## 八、版本更新记录
| 版本号 | 更新日期 | 核心更新内容 |
| ------ | ---------- | ------------------------- |
| v3.5.4 | 2025-12-29 | 使用豆包AI重构自定义模块MQTT/Modbus/IEC104/Web的API代码,优化结构,并重新调试 |
| v3.5.3 | 2025-12-09 | 修复开机自启动功能在linux系统下的报错,开机自启动只在windwos下有效 |
| v3.5.2 | 2025-11-08 | 增加对M区数据的读写DB编号地址为0时即是读写M区的数据 |
| v3.5.1 | 2025-11-05 | 把点位的数据类型字符统一转成小写 |
| v3.5.0 | 2025-07-02 | 弃用modbus-tk库,新增modbus tcp服务端,重写modbus交互方法 |
## 九、声明与联系方式
### 9.1 开源声明
本工具基于 MIT License 开源,可自由用于商业与非商业项目,使用时需保留原作者版权声明。工具中使用的第三方开源库(snap7、paho-mqtt 等)遵循其各自的开源协议。
### 9.2 联系方式
* 作者:LinJiefeng(工控万金油)
* 邮箱:i@icssteam.cn
* 项目地址:[https://gitee.com/icsteam/siemens-s7-convert](https://gitee.com/icsteam/siemens-s7-convert)
* 相关工具参考:
* Snap7 官网:[https://snap7.sourceforge.net/](https://snap7.sourceforge.net/)
* Eclipse Paho:[https://eclipse.dev/paho/](https://eclipse.dev/paho/)
* S7 协议调试工具:[https://blog.csdn.net/weixin\_44112083/article/details/130627005](https://blog.csdn.net/weixin_44112083/article/details/130627005)
* IEC104 调试工具:[https://www.redisant.cn/iec104client](https://www.redisant.cn/iec104client)