Skip to content

l2ktech/17-R5C-wrt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

工业机床数据采集网关

Public Portfolio Summary

This repository is a public embedded/industrial support project for an RS-485 to Modbus TCP data-acquisition gateway on NanoPi R5S/FriendlyWrt-class hardware. It supports the broader industrial-control portfolio by showing C++17 service design, Modbus integration, web configuration, systemd deployment, and FriendlyWrt migration notes.

For interviews, use it as supporting evidence for P01 industrial communication and edge-gateway work: serial acquisition, protocol conversion, watchdog/service design, deployment documentation, and the boundary between Ubuntu development and FriendlyWrt field deployment.

Evidence Entry Points

Public Boundary

This public repository should keep network examples generic. Do not publish real factory IP plans, PLC/CNC addresses, RS-485 device IDs, customer process data, capture files, operator credentials, VPN details, or field deployment logs. Use documentation IP ranges and placeholders in examples.

基于 NanoPi R5S (2GB+32GB eMMC) 的 Linux 实现

📋 项目概述

本项目实现了一个工业级数据采集网关,用于将测厚仪的 RS-485 数据转换为 Modbus TCP 协议,供 PLC/CNC 系统读取。

开发与部署流程

开发阶段 (当前)                    部署阶段 (计划)
┌─────────────────────┐           ┌─────────────────────┐
│  Ubuntu 22.04 arm64 │           │   FriendlyWRT       │
│  NanoPi R5S         │  ══════>  │   (OpenWrt 派生)    │
│                     │           │                     │
│  • 功能开发         │           │  • 只读根文件系统   │
│  • 调试测试         │           │  • 掉电安全         │
│  • 性能优化         │           │  • 启动快速         │
│  • 完整包管理       │           │  • 适合现场部署     │
└─────────────────────┘           └─────────────────────┘

当前阶段: 在 Ubuntu 22.04 arm64 上开发、编译、测试
下一阶段: 交叉编译到 FriendlyWRT,制作固件镜像

🎯 核心功能

  • RS-485 数据采集: 50Hz 稳定采样,支持超时重试和 CRC 校验
  • Modbus TCP 服务器: 标准 Modbus TCP 从站,支持多客户端连接
  • Web 配置界面: 实时状态监控和配置管理
  • 无锁并发: Lock-Free Ring Buffer,零拷贝数据传递
  • 高可靠性: 看门狗保护、配置双备份、掉电保护(规划中)

🛠 技术栈

组件 技术选型 说明
开发语言 C++17 高性能,统一技术栈
构建系统 CMake 3.16+ 跨平台构建
依赖库 libmodbus, jsoncpp 轻量级工业库
开发平台 Ubuntu 22.04 arm64 完整开发环境
部署平台 FriendlyWRT 只读根、掉电安全
硬件平台 NanoPi R5S RK3568, 2GB+32GB

🚀 快速开始(Ubuntu 22.04 arm64)

前提条件

  • NanoPi R5S 开发板
  • 已安装 Ubuntu 22.04 arm64 系统
  • 网络连接(用于安装依赖)
  • root 或 sudo 权限

1. 克隆或上传项目

# 如果在 NanoPi R5S 上操作
cd ~
# 假设项目已通过 scp/sftp 传输到设备

# 如果使用 Git
# git clone <repository-url>
# cd 17-R5C-wrt

2. 安装依赖

# 更新包列表
sudo apt update

# 安装编译工具
sudo apt install -y \
    build-essential \
    cmake \
    git \
    pkg-config

# 安装依赖库
sudo apt install -y \
    libmodbus-dev \
    libjsoncpp-dev

# 验证安装
pkg-config --modversion libmodbus jsoncpp

3. 编译项目

# 赋予脚本执行权限
chmod +x scripts/*.sh

# 编译(Release 模式)
./scripts/build.sh

# 编译成功后,可执行文件位于:
# build/src/rs485d/rs485d
# build/src/modbusd/modbusd
# build/src/webcfg/webcfg

4. 测试运行

# 启动所有服务(开发模式)
./scripts/start.sh

# 查看实时日志
tail -f /tmp/gw-test/logs/*.log

# 在另一个 SSH 终端,测试 Modbus 连接
pip3 install pymodbus
python3 tests/test_modbus_client.py

# 访问 Web 界面(在浏览器中)
# http://<R5S-IP地址>:8080

5. 停止服务

./scripts/stop.sh

📂 项目结构

17-R5C-wrt/
├── CMakeLists.txt              # 主 CMake 配置
├── README.md                   # 本文档
├── QUICKSTART.md               # 快速上手指南
├── TODO.md                     # 待办事项清单
├── PROJECT_OVERVIEW.md         # 完整技术方案
│
├── src/                        # 源代码(包含详细中文注释)
│   ├── common/                 # 公共库
│   │   ├── ndm.h              # 归一化数据模型
│   │   ├── shm_ring.h/cpp     # 无锁环形缓冲区
│   │   ├── config.h/cpp       # 配置管理
│   │   └── logger.h/cpp       # 日志工具
│   ├── rs485d/                # RS-485 采集守护进程
│   ├── modbusd/               # Modbus TCP 服务器
│   └── webcfg/                # Web 配置界面
│
├── config/                    # 配置文件
│   └── config.json
│
├── scripts/                   # 工具脚本
│   ├── build.sh              # 本地编译脚本
│   ├── start.sh              # 本地启动脚本
│   ├── stop.sh               # 停止脚本
│   └── wrt/                  # FriendlyWrt 专用脚本
│       ├── build_and_deploy.sh  # 编译/打包/部署
│       ├── deploy_wrt.sh        # 仅部署或远程控制
│       ├── start_local_wrt.sh   # 本地验证 build-wrt 产物
│       └── build_open62541.sh   # open62541 依赖构建
│
├── systemd/                  # systemd 服务配置
│   ├── gw-rs485d.service
│   ├── gw-modbusd.service
│   └── gw-webcfg.service
│
└── tests/                    # 测试脚本
    └── test_modbus_client.py

⚙️ 配置说明

配置文件位于 config/config.json,主要配置项:

RS-485 配置

{
  "rs485": {
    "device": "/dev/ttyUSB0",     // 串口设备路径
    "baudrate": 19200,             // 波特率 (9600/19200/38400/57600/115200)
    "poll_rate_ms": 20,            // 采样周期 (ms) - 50Hz
    "timeout_ms": 200,             // 单次查询超时 (ms)
    "retry_count": 3               // 失败重试次数
  }
}

Modbus TCP 配置

{
  "protocol": {
    "modbus": {
      "enabled": true,
      "listen_ip": "0.0.0.0",     // 监听地址 (0.0.0.0 表示所有接口)
      "port": 502,                 // Modbus TCP 标准端口
      "slave_id": 1                // 从站 ID
    }
  }
}

网络配置

{
  "network": {
    "eth0": {
      "mode": "dhcp",             // dhcp 或 static
      "ip": "192.0.2.100",      // 静态 IP (mode=static 时)
      "netmask": "255.255.255.0",
      "gateway": "192.0.2.1"
    }
  }
}

📊 Modbus 寄存器映射

地址 (40001-based) Modbus 地址 数据类型 字节序 说明
40001-40002 0-1 Float32 Big-Endian 厚度值 (mm)
40003-40006 2-5 Uint64 Big-Endian 时间戳 (Unix ms)
40007 6 Uint16 - 状态位
40008 7 Uint16 - 序列号 (低16位)

状态位定义

Bit 0:   数据有效 (1=Valid, 0=Invalid)
Bit 1:   RS-485 通信正常 (1=OK, 0=Error)
Bit 2:   CRC 校验通过
Bit 3:   测厚仪传感器正常
Bit 8-15: 错误代码 (0=无错误)

🔧 开发指南

代码注释

所有核心代码文件都包含详细的中文注释,包括:

  • 功能说明
  • 参数说明
  • 返回值说明
  • 使用示例
  • 注意事项

调试技巧

# 查看共享内存状态
ipcs -m

# 查看进程状态
ps aux | grep -E "rs485d|modbusd|webcfg"

# 实时查看日志
tail -f /tmp/gw-test/logs/*.log

# 测试串口设备(如果有实际设备)
ls -l /dev/ttyUSB*
screen /dev/ttyUSB0 19200

# 抓包分析 Modbus 通信
sudo tcpdump -i eth0 port 502 -w modbus.pcap

# 查看 CPU 和内存占用
top -p $(pgrep -d',' -f "rs485d|modbusd|webcfg")

性能测试

# Modbus 吞吐量测试
python3 tests/test_modbus_client.py

# 查看数据更新频率 (应该是 50Hz)
watch -n 0.1 "curl -s http://localhost:8080/api/status | jq '.current_data.sequence'"

📦 部署到 FriendlyWRT(规划中)

交叉编译环境搭建

# 在 Ubuntu x86_64 主机上
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 下载 FriendlyWRT SDK
# wget <FriendlyWRT SDK URL>

# 配置交叉编译工具链
# 详见 TODO.md 中的部署计划

固件打包

# 编译静态链接版本
./scripts/build_static.sh  # 待实现

# 打包到 ipk 包
./scripts/package_ipk.sh   # 待实现

# 制作固件镜像
./scripts/make_firmware.sh # 待实现

📈 性能指标

指标 目标值 Ubuntu 实测值 FriendlyWRT 预期
RS-485 采样频率 50Hz 50±1Hz 50±1Hz
Modbus 响应延迟 < 10ms P99 < 5ms P99 < 8ms
Modbus 吞吐量 > 1000 TPS ~3000 TPS ~2000 TPS
CPU 占用 < 50% ~20% ~25%
内存占用 < 500MB ~50MB ~40MB
启动时间 < 15s ~5s ~8s

⚠️ 重要说明

当前状态

  • 核心功能完整: RS-485 采集 → 共享内存 → Modbus TCP
  • 代码已添加详细中文注释: 便于理解和维护
  • ⚠️ 使用模拟数据: rs485d 当前生成随机厚度值 (1.0-2.0 mm)
  • ⚠️ 开发环境: Ubuntu 22.04 arm64,方便调试

实际部署前需要

  1. 连接实际的测厚仪设备(USB-RS485 转换器)
  2. 根据测厚仪的实际协议修改 src/rs485d/main.cpp 中的通信逻辑
  3. 测试验证数据准确性
  4. 完成 FriendlyWRT 移植和固件打包
  5. 长稳测试(7×24 小时)

待完成功能

详见 TODO.md 文档

🐛 故障排查

常见问题

Q1: 编译失败,找不到 libmodbus

# 安装依赖
sudo apt install libmodbus-dev
pkg-config --modversion libmodbus

Q2: 串口设备打开失败

# 检查设备是否存在
ls -l /dev/ttyUSB*

# 检查权限
sudo chmod 666 /dev/ttyUSB0

# 或添加用户到 dialout 组
sudo usermod -aG dialout $USER
# 需要重新登录生效

Q3: Modbus 连接失败

# 检查服务是否运行
ps aux | grep modbusd

# 检查端口是否监听
sudo netstat -tlnp | grep 502

# 检查防火墙
sudo ufw allow 502/tcp

Q4: Web 界面无法访问

# 检查服务状态
ps aux | grep webcfg

# 检查端口
sudo netstat -tlnp | grep 8080

# 查看日志
cat /tmp/gw-test/logs/webcfg.log

Q5: 共享内存错误

# 查看共享内存
ipcs -m

# 清理共享内存
rm -f /dev/shm/gw_data_ring

# 重启 rs485d
./scripts/stop.sh && ./scripts/start.sh

📚 文档索引

文档 内容
README.md 本文档 - 项目总览
QUICKSTART.md 10分钟快速上手指南
TODO.md 待办事项和开发计划
PROJECT_OVERVIEW.md 完整技术方案
FILE_CHECKLIST.md 功能清单

🎓 技术亮点

  • 纯 C++17 实现: 无脚本语言依赖,性能优异
  • 无锁并发设计: Lock-Free Ring Buffer,避免锁竞争
  • 模块化架构: 独立进程,易于调试和扩展
  • 详细中文注释: 所有代码都有详细说明
  • 双阶段部署: Ubuntu 开发 → FriendlyWRT 部署
  • 工业级可靠: 配置备份、原子写入、异常处理

📞 支持与贡献

  • 问题反馈: 查看日志文件 /tmp/gw-test/logs/*.log
  • 功能建议: 参考 TODO.md 添加需求
  • 代码贡献: 欢迎提交 Pull Request

📄 许可证

MIT License


当前版本: v1.0 - 核心功能完整(Ubuntu 测试版)
下一版本: v2.0 - FriendlyWRT 生产版(规划中)

开始使用: ./scripts/build.sh && ./scripts/start.sh

About

NanoPi R5C FriendlyWrt RS-485 and Modbus industrial gateway project.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors