通讯协议概述
Darra Software PLC 的通讯边界分为两层:现场总线只走 EtherCAT + DarraSync;Windows Darra.PLC.Service 控制面通过 HSL 支持已接入的外部设备协议,并对上层系统提供 OPC UA / MQTT / HTTP 等数据接口。
通讯架构
DarraLink / RemoteAccessServer — 核心通讯服务
Darra 自有端口是固定协议常量, UI 不显示、不可编辑:
| 通道 | 固定端口 | 说明 |
|---|---|---|
| DarraLink | TCP 18821 | IDE ↔ Service 主通道: 变量读写、订阅推送、远程部署、热更新 |
| RemoteAccessServer | HTTPS 18443 | IDE 远程管理 API: 状态、变量、报警、诊断、启停、项目上传/下载、日志 |
| HMI Web | HTTP/WebSocket 18823 | HMI 页面与实时数据推送 |
| Discovery UDP | UDP 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 已全量可跑。
支持协议总览
| 分类 | 协议 | 适配器 | 传输层 |
|---|---|---|---|
| 现场总线 | EtherCAT | Darra.Core.dll | 以太网 (L2) |
| 实时同步 | DarraSync | DarraRT_Sync.sys | L2 EtherType |
| PLC 互联 | 西门子 S7 | S7ProtocolAdapter | TCP |
| PLC 互联 | 三菱 MC | MCProtocolAdapter | TCP/UDP |
| PLC 互联 | 欧姆龙 FINS | FINSProtocolAdapter | TCP/UDP |
| 通用协议 | Modbus RTU | ModbusRtuAdapter | RS-485 |
| 通用协议 | Modbus TCP | ModbusRtuAdapter | TCP |
| 企业集成 | OPC UA | OPC UA 服务 | TCP |
| 物联网 | MQTT | MQTT 客户端 | TCP |
| 物联网 | HTTP REST | HTTP 协议适配 | 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 ms | EtherCAT 过程数据 |
| 传输实时 | KCP over UDP | 1 ~ 10 ms | 跨路由运动同步 |
| 可靠传输 | TCP | 10 ~ 500 ms | Modbus 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) |
|---|---|---|
| EtherCAT | Yes | No |
| Modbus TCP | Yes | Yes |
| Modbus RTU | Yes | Yes |
| S7 | Yes | No (规划中) |
| MC | Yes | No |
| FINS | Yes | No |
| EtherNet/IP | Yes | Yes (作为 I/O 适配器) |
| CANopen | Yes | No |
| OPC UA | Yes | Yes (默认角色) |
| MQTT | Yes | No (一般 Broker 不在 PLC) |
| HTTP REST | Yes | Yes |
| 串口 | Yes | Yes |
| 数据库 | Yes | - |
设计目标
所有通讯协议的实现遵循统一设计目标:
- 异常不抛出到 PLC 程序: 失败时置 FB 的
Error=TRUE+ 错误码, 由 PLC 决定怎么处理。不中断 PLC 扫描。 - 自动重连: 所有协议默认开启自动重连, 指数退避 1s → 60s。
- 连接池: 单个连接配置可以被多个 FB 共享, 不浪费 TCP 握手开销。
- 批量优化: 优先使用协议原生的批量操作 (S7 BatchRead, MC 多块, Modbus 多寄存器)。
- 诊断内建: 每个连接都有自己的诊断页面, 不需要另装抓包工具。
- 压力测试: 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 的下拉列表里可见, 与内置协议同等使用。适用于对接客户专有设备。