批量模拟modbus tcp设备

如果需要成百上千个设备复杂的数据动态变化逻辑 ,可以用 Python 的 pymodbus 库进行模拟。

Modbus TCP 支持在单个 TCP 端口(如 502) 上基于请求头中的 Unit ID 区分不同从站设备。

1. 安装依赖

Bash

python 复制代码
pip install pymodbus

2. 模拟多个从站的代码示例

下面的完整代码展示了如何在同一个 TCP 服务端上注册 Slave ID 1、Slave ID 2 和 Slave ID 3,并让它们的数据自动定时更新:

适用于 pymodbus 2.5.3 的完整代码

请直接用下面的代码覆盖你的 py.py

python 复制代码
pip uninstall pymodbus -y
pip install pymodbus==2.5.3
python 复制代码
import threading
import time
import random

# 1. pymodbus 2.5.3 标准导入路径
from pymodbus.server.sync import StartTcpServer
from pymodbus.datastore import (
    ModbusSlaveContext,
    ModbusServerContext,
    ModbusSequentialDataBlock,
)

# 2. 创建设备上下文(寄存器映射)
def create_device_context():
    return ModbusSlaveContext(
        di=ModbusSequentialDataBlock(0, [0] * 100),   # 离散输入
        co=ModbusSequentialDataBlock(0, [0] * 100),   # 线圈
        hr=ModbusSequentialDataBlock(0, [10, 20, 30, 40]),  # 保持寄存器
        ir=ModbusSequentialDataBlock(0, [100, 200, 300]),   # 输入寄存器
    )

# 3. 批量生成 500 个设备 (Slave ID: 1 到 500)
TOTAL_DEVICES = 500
slaves = {slave_id: create_device_context() for slave_id in range(1, TOTAL_DEVICES + 1)}

context = ModbusServerContext(slaves=slaves, single=False)

# 4. 后台线程:批量模拟数据动态变化
def update_values(context):
    while True:
        time.sleep(2)  # 每 2 秒更新一次
        
        # 遍历 1 到 500 的所有设备
        for slave_id in range(1, TOTAL_DEVICES + 1):
            slave_ctx = context[slave_id]
            
            # 读取保持寄存器 0 (对应 40001)
            current_val = slave_ctx.getValues(3, 0, count=1)[0]
            new_val = (current_val + random.randint(-2, 2)) % 100
            
            # 写入新值
            slave_ctx.setValues(3, 0, [new_val])
        
        # 避免 500 条日志刷屏,仅打印前 3 个和后 3 个设备的状态作为示例
        val1 = context[1].getValues(3, 0, count=1)[0]
        val500 = context[500].getValues(3, 0, count=1)[0]
        print(f"[数据更新中] 共有 {TOTAL_DEVICES} 个设备已更新 | 样例 -> Slave 1: {val1} | Slave 500: {val500}")

if __name__ == "__main__":
    # 启动后台更新线程
    t = threading.Thread(target=update_values, args=(context,), daemon=True)
    t.start()

    print(f"Modbus TCP 服务端已启动,监听端口 502...")
    print(f"已批量激活设备 ID (Unit ID): 1 ~ {TOTAL_DEVICES}")
    
    # 启动同步 Modbus TCP 服务器
    StartTcpServer(context=context, address=("0.0.0.0", 502))
相关推荐
家有娇妻张兔兔4 天前
Java 对接 PLC 主流型号最合适的方案:Apache PLC4X 实战指南
java·开发语言·plc·modbus·数据缓存·西门子s7·apache plc4x
AlanBruce6 天前
摩尔信使MThings EdgeWeb HTTP API接口
网络·网络协议·http·上位机·plc·modbus·摩尔信使
AlanBruce13 天前
从串口仪表到西门子PLC:摩尔信使MThings的多协议设备接入能力
自动化·plc·modbus·mthings·摩尔信使·西门子s7
仰科网关16 天前
VFBOX网关采集OPC_DA转Modbus_MES工控平台项目案例
网关·modbus·opc da·协议转换·规约转换器
Triv202517 天前
Profinet与Modbus协议转换网关HD67602的硬件特性与配置方法
网络·plc·modbus·profinet·工业网关·协议转换
Dlrb121122 天前
单片机通信协议---串口及串口通信
单片机·嵌入式硬件·串口·uart·modbus·波特率·主机从机
想你依然心痛25 天前
工业网关设计:多协议转换与边缘计算的数据流架构——Modbus/CAN/OPC UA全栈实战
边缘计算·modbus·规则引擎·can总线·工业网关·多协议转换·数据流架构
七夜zippoe2 个月前
DolphinDB Modbus协议接入:PLC数据采集
网络·数据采集·plc·modbus·dolphindb
外环西路007号2 个月前
跨平台 Modbus 桌面客户端
modbus