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();
posted on 2026-06-04 10:15  Gu  阅读(18)  评论(0)    收藏  举报