跳到主要内容

通讯协议概述

Darra Software PLC 的通讯边界分为两层:现场总线只走 EtherCAT + DarraSync;Windows Darra.PLC.Service 控制面通过 HSL 支持已接入的外部设备协议,并对上层系统提供 OPC UA / MQTT / HTTP 等数据接口。

通讯架构

Darra 自有端口是固定协议常量, UI 不显示、不可编辑:

通道固定端口说明
DarraLinkTCP 18821IDE ↔ Service 主通道: 变量读写、订阅推送、远程部署、热更新
RemoteAccessServerHTTPS 18443IDE 远程管理 API: 状态、变量、报警、诊断、启停、项目上传/下载、日志
HMI WebHTTP/WebSocket 18823HMI 页面与实时数据推送
Discovery UDPUDP 18852同广播域设备发现兜底

关键特性:

  • 连接限速 + 事件过滤 + 命令超时
  • 变量缓存 + 事件优先队列
  • 客户端会话: 认证 / 消息解析 / 订阅管理
  • DarraLink 二进制帧 + RemoteAccess HTTPS REST, 便于 IDE 和管理端集成

协议适配器架构

所有外部通讯协议通过统一的 IProtocolAdapter 接口接入:

public interface IProtocolAdapter
{
// 连接管理
Task<bool> ConnectAsync(ConnectionConfig config);
Task DisconnectAsync();
bool IsConnected { get; }

// 数据读写
Task<byte[]> ReadAsync(string address, int length);
Task WriteAsync(string address, byte[] data);

// 状态与诊断
ProtocolStatus GetStatus();
event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged;
}

PLCDriverFactory 根据协议 ID 动态创建对应的适配器实例。HSL 通讯能力主要运行在 Windows Darra.PLC.Service 控制面;Linux 硬实时版只写已完成 Linux 原生适配的协议,不暗示 HSL 已全量可跑。

支持协议总览

分类协议适配器传输层
现场总线EtherCATDarra.Core.dll以太网 (L2)
实时同步DarraSyncDarraRT_Sync.sysL2 EtherType
PLC 互联西门子 S7S7ProtocolAdapterTCP
PLC 互联三菱 MCMCProtocolAdapterTCP/UDP
PLC 互联欧姆龙 FINSFINSProtocolAdapterTCP/UDP
通用协议Modbus RTUModbusRtuAdapterRS-485
通用协议Modbus TCPModbusRtuAdapterTCP
企业集成OPC UAOPC UA 服务TCP
物联网MQTTMQTT 客户端TCP
物联网HTTP RESTHTTP 协议适配HTTP
数据存储SQLite数据库连接本地文件
串口通讯RS-232/RS-485串口适配串口
通讯协议库

大部分 PLC 互联协议基于成熟的工业通讯协议库实现, 确保与各品牌 PLC 的兼容性。

PLCDataServer — 数据映射

PLCDataServer 负责 PLC M 区内存服务寄存器 之间的双向映射:

  • PLC 程序通过 M 区地址访问通讯数据
  • 外部协议适配器通过寄存器地址读写
  • 支持多种数据类型: BOOL / INT / DINT / REAL / STRING
PLC M区       PLCDataServer      外部设备
MW100 ←→ 寄存器 40001 ←→ Modbus 从站
MD200 ←→ 寄存器 40003 ←→ OPC UA 节点
MX0.0 ←→ 线圈 00001 ←→ 远程 IO

通讯可靠性

通讯异常处理原则

所有通讯操作必须有 try-catch + 自动重连机制。禁止未处理异常导致系统停止。

  • 自动重连: 断线后自动重试 (间隔逐步增大, 最大 60s)
  • 连接监控: Watchdog 周期检测连接健康状态
  • 优雅降级: 单协议故障不影响其他通讯通道
  • 日志记录: 所有连接/断线/错误事件写入结构化日志

四层协议栈

Darra 的通讯层按延迟要求分四个技术栈:

协议延迟典型场景
物理实时Raw Ethernet (L2)< 1 msEtherCAT 过程数据
传输实时KCP over UDP1 ~ 10 ms跨路由运动同步
可靠传输TCP10 ~ 500 msModbus TCP, S7, OPC UA
现代化QUIC / HTTP/3与 TCP 相近, 抗丢包更好云端、移动 HMI

Raw Ethernet 由内核驱动 (DarraRT_Eth.sys) 负责, 绕过 Windows TCP/IP 栈, 保证微秒级确定性。其他三层运行在用户态 Service/Runtime 进程中。

Raw Ethernet

EtherCAT 专用, 见 EtherCAT。数据在内核态驱动里组帧, 不经过 Windows NDIS 上层, 因此抖动极低。

KCP

KCP 是在 UDP 之上的可靠传输协议 (ARQ), 比 TCP 延迟低、抗弱网能力强, 适用于:

  • 跨路由的多主站同步 (分布式 PLC 之间)
  • 远程示教盒 (机器人)
  • 移动 HMI 弱网场景

TCP

最广泛的可靠传输, 所有常规工业协议 (Modbus TCP / S7 / MC / FINS / EtherNet/IP / OPC UA) 都走 TCP。

QUIC

QUIC 把 TCP 的可靠性 + TLS 加密 + 0-RTT 握手合到一起, 跑在 UDP 上。优势:

  • 连接迁移 (切换 WiFi 不断连)
  • 无对头阻塞
  • 内置加密

HTTP/3 是 QUIC 上的 HTTP 实现, Darra 的 HTTP API 可配置为 HTTP/3。

协议与产品分工

不是所有协议都是 PLC 主站主动发起, 按角色划分:

产品作为主站 (Client)作为从站 (Server)
EtherCATYesNo
Modbus TCPYesYes
Modbus RTUYesYes
S7YesNo (规划中)
MCYesNo
FINSYesNo
EtherNet/IPYesYes (作为 I/O 适配器)
CANopenYesNo
OPC UAYesYes (默认角色)
MQTTYesNo (一般 Broker 不在 PLC)
HTTP RESTYesYes
串口YesYes
数据库Yes-

设计目标

所有通讯协议的实现遵循统一设计目标:

  1. 异常不抛出到 PLC 程序: 失败时置 FB 的 Error=TRUE + 错误码, 由 PLC 决定怎么处理。不中断 PLC 扫描。
  2. 自动重连: 所有协议默认开启自动重连, 指数退避 1s → 60s。
  3. 连接池: 单个连接配置可以被多个 FB 共享, 不浪费 TCP 握手开销。
  4. 批量优化: 优先使用协议原生的批量操作 (S7 BatchRead, MC 多块, Modbus 多寄存器)。
  5. 诊断内建: 每个连接都有自己的诊断页面, 不需要另装抓包工具。
  6. 压力测试: IDE 自带压力测试工具, 下载项目前能验证对端设备的吞吐。

通讯监视

统一的通讯监视面板 (Ribbon → 诊断 → 通讯监视):

  • 每个连接的实时状态 (建立/空闲/忙/故障)
  • 请求/响应统计 (总数、成功率、平均延迟)
  • 错误明细 (最近 N 条错误)
  • 原始帧查看 (类似 Wireshark 但更轻量)
  • 流量图 (随时间的 KB/s 曲线)

协议扩展

IDE 提供 SDK 让用户实现自定义协议:

public class MyProtocolAdapter : IProtocolAdapter {
public Task<bool> ConnectAsync(ConnectionConfig cfg) { ... }
public Task<byte[]> ReadAsync(string addr, int len) { ... }
public Task WriteAsync(string addr, byte[] data) { ... }
...
}

// 注册
PLCDriverFactory.Register("MyProtocol", () => new MyProtocolAdapter());

注册后, 该协议在 IDE 的下拉列表里可见, 与内置协议同等使用。适用于对接客户专有设备。