s7sim-0.5.0:社区开源 S7 通信模拟器使用指南
一、项目概述
s7sim 是一款由社区开发者维护的开源 S7 通信模拟器,当前版本为 0.5.0。它基于成熟的 Snap7 开源库构建
,专注于模拟西门子 S7 系列 PLC 的通信协议行为,而非完整的 PLC 逻辑执行。
与西门子官方的 PLCSIM Advanced(需授权且仅支持 S7-1500)
不同,s7sim 的核心定位是"够用就好"——它不做软 PLC,不执行梯形图或 ST 代码,只聚焦于通信协议的响应层面。这使得它体积小巧(仅数 MB)、启动迅速、零依赖,无需安装庞大的 TIA Portal 或 SQL Server。
为什么需要 s7sim?
工业自动化项目中,上位机开发人员常面临以下尴尬:
-
没有特定型号的物理 PLC,或设备被锁在车间无法随时使用
-
电气部门的 PLC 程序尚未完成,无法配合调试
-
博途(TIA Portal)安装包动辄数十 GB,且捆绑大量不必要的服务
-
即使安装了博途,也不一定有权限获取电气部门的 PLC 程序
二、核心功能与架构
2.1 功能特性
表格
| 功能模块 | 说明 |
|---|---|
| S7 协议服务 | 基于 ISO-on-TCP(RFC 1006),监听标准 102 端口
|
| DB 块模拟 | 支持配置多个 DB 块,自定义编号与大小 |
| MB 区模拟 | 支持标志位存储区(M 区)的读写 |
| 数据类型支持 | BOOL、BYTE、WORD、DWORD、INT、DINT、REAL 等 |
| 实时监看 | 类似博途在线监控,实时查看数据变化 |
| 脚本自动化 | 内置脚本引擎,支持自动化测试逻辑 |
| 跨平台 | 基于 Python/Snap7,支持 Windows/Linux |
2.2 技术架构
plain
┌─────────────────────────────────────────┐
│ s7sim-0.5.0 模拟器 │
├─────────────────────────────────────────┤
│ 协议层 (Snap7/libnodave) │
│ ├── ISO-on-TCP 服务器 │
│ └── S7 协议帧解析 (TPKT/COTP/S7 PDU) │
├─────────────────────────────────────────┤
│ 数据层 │
│ ├── DB 块内存映射 │
│ ├── MB 区内存映射 │
│ └── 数据变更事件通知 │
├─────────────────────────────────────────┤
│ 接口层 │
│ ├── CLI 命令行工具 │
│ ├── Python API │
│ └── RESTful HTTP API (v0.5.0 新增) │
└─────────────────────────────────────────┘
s7sim 底层依赖于 Snap7 或 libnodave 等成熟开源库。Snap7 是目前使用最广泛的开源 S7 协议通讯库,开源、稳定且资料齐全
;libnodave 则支持通过 PPI、MPI 或以太网直接与西门子 PLC 通信,采用 LGPL 授权,可安全用于商业项目
。
三、安装与配置
3.1 环境要求
-
Python 3.8+
-
pip 包管理器
-
(可选)Wireshark 用于协议抓包分析
3.2 安装步骤
bash
# 通过 PyPI 安装
pip install s7sim==0.5.0
# 或从源码安装
git clone https://github.com/community/s7sim.git
cd s7sim
pip install -e .
3.3 快速启动
方式一:命令行启动
bash
# 启动默认配置(监听 0.0.0.0:102,创建 DB1[1024字节])
s7sim start
# 指定配置启动
s7sim start --config ./my_plc.yaml
# 前台调试模式,显示详细日志
s7sim start --debug
方式二:编程式启动
Python
from s7sim import S7Server
# 创建模拟器实例
server = S7Server(
host="0.0.0.0",
port=102,
rack=0,
slot=1
)
# 配置 DB 块
server.add_datablock(1, size=1024) # DB1, 1KB
server.add_datablock(201, size=512) # DB201, 512字节(常用于设备信号)
# 启动服务
server.start()
print(f"S7 模拟器已启动,监听 {server.host}:{server.port}")
print("按 Ctrl+C 停止...")
try:
server.run_forever()
except KeyboardInterrupt:
server.stop()
print("模拟器已停止")
四、使用方法详解
4.1 配置文件驱动(推荐)
s7sim-0.5.0 支持 YAML/JSON 格式的配置文件,便于版本控制和团队协作:
yaml
# plc_simulation.yaml
server:
host: "192.168.1.100"
port: 102
rack: 0
slot: 1
datablocks:
- number: 1
size: 1024
comment: "系统参数区"
- number: 201
size: 256
comment: "设备控制信号"
- number: 202
size: 256
comment: "设备状态反馈"
merkers:
size: 512 # MB0 ~ MB511
initial_values:
# 预置初始值,方便测试
"DB201.DBB0": 0x01 # 设备使能
"DB202.DBD100": 123.45 # 产量计数(REAL)
"MB10": 0xFF # 标志位
启动命令:
bash
s7sim start --config plc_simulation.yaml
4.2 与上位机程序联调
配置完成后,上位机程序(使用 Snap7、S7NetPlus、libnodave 等库)可直接连接:
C# 示例(使用 S7NetPlus):
csharp
using S7.Net;
var plc = new Plc(CpuType.S71500, "192.168.1.100", 0, 1);
plc.Open();
// 读取 DB201.DBB0
byte enable = (byte)plc.Read(DataType.DataBlock, 201, 0, VarType.Byte, 1);
// 写入 DB202.DBD100(REAL)
plc.Write(DataType.DataBlock, 202, 100, 123.45f);
plc.Close();
浙公网安备 33010602011771号