当前位置:首页 > 工业控制 > 工业控制
[导读]在老旧产线改造中,常有大量RS485 Modbus RTU设备(温湿度、电表、变频器)需要接入上位机或MES,但它们不支持TCP。此时用Raspberry Pi(树莓派)运行Modbus TCP↔RTU网关程序,既能做协议转换,又能充当边缘数据预处理节点。本文基于Raspberry Pi OS + pymodbus库,给出可落地的完整实现方案。



在老旧产线改造中,常有大量RS485 Modbus RTU设备(温湿度、电表、变频器)需要接入上位机或MES,但它们不支持TCP。此时用Raspberry Pi(树莓派)运行Modbus TCP↔RTU网关程序,既能做协议转换,又能充当边缘数据预处理节点。本文基于Raspberry Pi OS + pymodbus库,给出可落地的完整实现方案。


一、硬件连接与系统准备


1. 硬件连接


• RS485转USB(推荐):Waveshare USB↔RS485,A/B接现场设备,USB插Pi


• RS485 HAT(更稳):如Waveshare RS485 CAN HAT,直接占用/dev/ttyS0或/dev/ttyAMA0


- 终端电阻:总线两端各接120Ω电阻(含Pi侧HAT常带跳线)

[上位机/SCADA] ←─ Modbus TCP (:502) ─→ [Raspberry Pi + pymodbus gateway]

                                         │ UART / USB-RS485

                                         ▼

                                 [设备1 Addr=1]─[设备2 Addr=2]─[设备3 Addr=3] (菊花链)



2. 系统配置


# 启用串口(若用HAT,关闭串口控制台)

sudo raspi-config

# Interface Options → Serial → Login: NO, Shell: YES


# 确认设备节点

ls /dev/ttyUSB*   # USB-RS485

ls /dev/ttyS0     # HAT(需关闭Bluetooth占用)



安装Python依赖:

sudo apt update

sudo apt install python3-pip

pip3 install pymodbus[twisted] --break-system-packages



二、pymodbus实现Modbus TCP网关


pymodbus自带ModbusTcpServer + ModbusRtuClient,可在一个进程中桥接两边。


gateway.py(核心代码)


#!/usr/bin/env python3

"""

Raspberry Pi Modbus TCP → RTU Gateway

- 监听 TCP 502(需sudo或改端口>1024)

- 转发请求到指定串口RTU从站

"""

from pymodbus.server import StartTcpServer

from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext

from pymodbus.client import ModbusRtuFramer

from pymodbus.device import ModbusDeviceIdentification

import logging


# ── RTU串口配置 ──────────────────────────────

RTU_PORT   = '/dev/ttyUSB0'      # 或 '/dev/ttyS0'

RTU_BAUDRATE = 9600

RTU_PARITY   = 'N'

RTU_TIMEOUT  = 1.0

# ──────────────────────────────────────────────


logging.basicConfig(level=logging.INFO)

_log = logging.getLogger(__name__)


def setup_context():

   """

   为每个RTU从站地址建立SlaveContext,

   实际数据通过RTU转发,这里仅做占位(pymodbus自动代理)

   """

   slaves = {}

   for slave_id in range(1, 32):          # 支持地址1~31

       slaves[slave_id] = ModbusSlaveContext()

   return ModbusServerContext(slaves=slaves, single=False)


def setup_identification():

   ident = ModbusDeviceIdentification()

   ident.VendorName      = 'RPi_Gateway'

   ident.ProductCode     = 'MODGW'

   ident.ProductName     = 'ModbusTCP-RTU Gateway'

   ident.ModelName       = 'Raspberry Pi 4'

   ident.MajorMinorRevision = '1.0'

   return ident


if __name__ == '__main__':

   context = setup_context()

   identity = setup_identification()


   _log.info(f"Starting Modbus TCP Gateway on :502 → RTU {RTU_PORT} "

             f"{RTU_BAUDRATE},{RTU_PARITY},8,1")


   # pymodbus自动把TCP请求经RTU framer转发到串口

   StartTcpServer(

       context=context,

       identity=identity,

       address=('0.0.0.0', 502),

       # 关键:指定RTU framer用于后端通信

       framer=ModbusRtuFramer,

       rtu=dict(port=RTU_PORT,

                 baudrate=RTU_BAUDRATE,

                 parity=RTU_PARITY,

                 timeout=RTU_TIMEOUT,

                 inter_char_timeout=0.05,

                 inter_frame_timeout=0.1)

   )



⚠️ 注意:默认502端口需root权限,开发阶段可改port=1502然后用iptables转发或SCADA直接连1502。


三、SCADA/MES侧访问示例


上位机(如Ignition、WinCC、Python client)只需配Modbus TCP:

- IP:Raspberry Pi IP(如192.168.1.50)

• Port:502(或1502)


• Slave ID:现场设备地址(1/2/3…)


• Function Code:03(读保持寄存器)、06/16(写)


Python测试客户端:

from pymodbus.client import ModbusTcpClient


client = ModbusTcpClient('192.168.1.50', port=502)

client.connect()


# 读设备地址=1,保持寄存器起始40001(协议地址0),长度2

rr = client.read_holding_registers(address=0, count=2, slave=1)

if rr.isError():

   print("Read error:", rr)

else:

   print("Reg values:", rr.registers)


client.close()



四、现场调试与故障排查


现象 检查点


SCADA报“连接拒绝” ss -lntp | grep 502 确认网关运行;防火墙 sudo ufw allow 502/tcp


读回全是0或超时 A/B是否反接;终端电阻;波特率/奇偶校验是否与设备一致


偶发CRC错 串口干扰 → 屏蔽双绞线;降低波特率(9600→4800试)


只能访问一个Slave ID 确认设备地址不冲突;pymodbus context配置 single=False(已做)


树莓派重启后串口消失 检查 /boot/config.txt 中 enable_uart=1 且 console=serial0 已移除


附加建议:用modpoll(Linux)或Modbus Poll(Windows)先直连RTU设备验证串口参数,再接网关——分层排查最高效。


五、进阶:边缘数据缓存与MQTT上报


网关可在转发同时周期性读取关键寄存器并发布MQTT:

import paho.mqtt.client as mqtt

import threading, time


def poll_loop(cli):

   while True:

       res = cli.read_holding_registers(0, 2, slave=1)

       if not res.isError():

           payload = {'temp': res.registers[0]/10}

           mqtt_cli.publish('factory/zone1/temp', str(payload))

       time.sleep(2)


mqtt_cli = mqtt.Client()

mqtt_cli.connect('broker.local', 1883)

threading.Thread(target=poll_loop, args=(client,), daemon=True).start()



六、结语


Raspberry Pi做Modbus TCP网关的核心工作是:RS485串口参数匹配 + pymodbus的TcpServer挂RTU framer + 正确Slave ID映射。该方案成本低(一块Pi)、扩展性强(可加MQTT/SQLite/Web UI),是传统RTU设备平滑接入工业物联网的经典过渡方案。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

工业物联网(IIoT)场景协议选型直接影响系统实时性、可靠性与可扩展性。Modbus、OPC UA和MQTT作为三大主流协议,分别适用于不同场景需求。本文将从协议特性对比、选型策略及自动化测试方案三方面展开论述,结合实际...

关键字: Modbus TCPOPC UAMQTT

Modbus RTU作为工业自动化领域的经典通信协议,凭借其简单可靠、抗干扰能力强的特性,广泛应用于变频器、PLC、传感器等设备的互联。本文以变频器通信为场景,深度解析Modbus RTU的帧结构设计与调试要点,为工程师...

关键字: Modbus 变频器

针对固体火箭发动机推进剂取样作业中存在的机械摩擦 、静电积累及热应力失控等高风险因素 I设计了一种基于Modbus协议的PLC远程控制系统解决方案 。系统采用主从式架构与双模式控制机制 I通过主站指令发送与从站响应执行的...

关键字: Modbus PLC 系统设计 远程操控

在工业自动化、能源管理等实时性要求严苛的场景中,Modbus通信系统的响应延迟直接关系到设备控制的精度与系统稳定性。从智能电表的功率调节到机器人关节的同步控制,微秒级的响应偏差都可能引发连锁故障。本文从硬件架构、软件设计...

关键字: Modbus 通信系统

在工业物联网(IIoT)与边缘计算快速发展的背景下,Modbus协议凭借其轻量化特性成为微控制器(MCU)设备互联的首选方案。然而,在资源受限的MCU(如STM32F0系列、ESP8266等,RAM通常小于32KB,Fl...

关键字: 微控制器 Modbus 工业物联网

在工业自动化领域,Modbus协议凭借其简洁高效的设计,已成为设备间通信的"通用语言"。某智能电网项目通过Modbus RTU协议实现2000台电表的数据采集,通信成功率高达99.97%,这背后正是对消息结构的精准把控。...

关键字: Modbus 工业自动化

在工业物联网设备开发中,Modbus从站功能已成为微控制器(MCU)的标配能力。某智能电表项目通过在STM32上实现Modbus RTU从站,成功将设备接入现有SCADA系统,开发周期缩短40%。本文将系统解析MCU实现...

关键字: 微控制器 Modbus 协议栈优化

工业控制系统(ICS)已成为关键基础设施的核心支撑。然而,随着OT(运营技术)与IT(信息技术)的深度融合,ICS的攻击面正以前所未有的速度扩展。从Modbus协议的明文传输漏洞到PLC固件的逆向攻击,攻击者正利用协议设...

关键字: 工业控制 Modbus

工业现场总线技术作为设备互联与数据传输的核心支撑,其性能与适用性直接决定了生产系统的效率与可靠性。Profinet、EtherCAT与Modbus作为三大主流协议,分别代表了工业以太网与串行通信技术的不同演进方向。本文将...

关键字: Profinet EtherCAT Modbus

在工业4.0与智能制造的浪潮下,工业隔离器作为连接物理世界与数字系统的核心组件,其通信协议的集成能力已成为衡量系统智能化水平的关键指标。Modbus、CANopen与EtherCAT作为工业自动化领域的三大主流协议,各自...

关键字: Modbus CANopen EtherCAT
关闭