Skip to content

驱动配置

drivers 段定义南向(southbound)采集驱动,类比 Clash 的 proxies。每个驱动实例连接一台工业设备,按标签列表周期性采集数据点。

yaml
drivers:
  - name: plc-modbus
    type: modbus-tcp
    settings:
      host: 192.168.1.100
      port: 502
      slave-id: 1
      timeout: 3s
      retry: 3
    tags:
      - name: temperature
        address: "40001"
        type: float32
        group: sensors
        interval: 1s
        deadband: 0.2

驱动通用字段

每个驱动实例共享以下顶层字段,settings 的具体内容随 type 不同而变化。

字段类型必填默认值说明
namestring驱动实例名称,全局唯一,用于规则匹配与 API 引用
typestring驱动协议类型,见下表
settingsobject协议专属连接参数
tagsarray标签(数据点)采集定义列表

支持的驱动类型:

type协议典型设备
modbus-tcpModbus TCPPLC、传感器网关、变频器
modbus-rtuModbus RTU(串口)RS-485 传感器、串口设备
modbus-rtuovertcpModbus RTU over TCP串口转以太网网关
modbus-udpModbus TCP over UDPUDP 设备
modbus-rtuoverudpModbus RTU over UDPUDP 上的 RTU 帧
modbus-tlsModbus TCP over TLS(mTLS)加密通信 PLC
s7Siemens S7 协议S7-300 / S7-1200 / S7-1500 PLC
opcuaOPC UA ClientSCADA、MES、OPC 服务器

INFO

驱动实例在内核启动时按列表顺序初始化。单个驱动初始化失败不会阻止其他驱动启动,但会在日志中记录 error 并将该驱动标记为 error 状态。


Modbus TCP (modbus-tcp)

Modbus TCP 是工业现场最常见的以太网协议,CoreC 通过 TCP 502 端口与从站通信。

yaml
- name: plc-modbus
  type: modbus-tcp
  settings:
    host: 192.168.1.100
    port: 502
    slave-id: 1
    timeout: 3s
    retry: 3

settings 字段

字段类型必填默认值说明
hoststring设备 IP 地址或主机名
portint502TCP 端口,Modbus 标准端口为 502
slave-idint1从站地址,取值范围 1–247
timeoutduration3s单次读写超时时间
retryint3通信失败后的重试次数
reconnect-intervalduration2s重连初始退避间隔
reconnect-max-intervalduration30s重连退避上限

地址格式

Modbus 地址采用数字字符串,前缀决定功能码:

地址前缀区域功能码示例
0xxxx线圈(Coil)FC01 读 / FC05 写单 / FC15 写多"00001"
1xxxx离散输入(Discrete Input)FC02 读"10001"
3xxxx输入寄存器(Input Register)FC04 读"30001"
4xxxx保持寄存器(Holding Register)FC03 读 / FC06 写单 / FC16 写多"40001"

TIP

地址从 1 开始计数。"40001" 对应保持寄存器第 0 号(PLC 内部偏移 0),"40003" 对应偏移 2。多字节类型(如 float32)会自动跨寄存器读取。


Modbus RTU (modbus-rtu)

Modbus RTU 通过串口(如 RS-485)与从站通信,适用于串口传感器与现场设备。

yaml
- name: sensor-rtu
  type: modbus-rtu
  settings:
    serial-device: /dev/ttyUSB0
    baud-rate: 9600
    data-bits: 8
    parity: none
    stop-bits: 1
    slave-id: 1
    timeout: 3s
    retry: 3

settings 字段

字段类型必填默认值说明
serial-devicestring串口设备路径,如 /dev/ttyUSB0(Linux)或 COM3(Windows)
baud-rateint9600波特率
data-bitsint8数据位,78
paritystringnone校验位:noneevenodd
stop-bitsint0(自动)停止位,120 表示由库按校验位自动选择
slave-idint1从站地址,取值范围 1–247
timeoutduration3s单次读写超时时间
retryint3通信失败后的重试次数
reconnect-intervalduration2s重连初始退避间隔
reconnect-max-intervalduration30s重连退避上限

地址格式与 Modbus TCP 相同。


Modbus RTU over TCP (modbus-rtuovertcp)

通过 TCP 连接传输 RTU 帧,常见于串口转以太网网关。

yaml
- name: rtu-gateway
  type: modbus-rtuovertcp
  settings:
    host: 192.168.1.80
    port: 502
    slave-id: 1
    timeout: 3s

settings 字段

字段类型必填默认值说明
hoststring网关 IP 地址
portint502TCP 端口
slave-idint1从站地址
timeoutduration3s单次读写超时时间
retryint3通信失败后的重试次数
reconnect-intervalduration2s重连初始退避间隔
reconnect-max-intervalduration30s重连退避上限

Modbus UDP (modbus-udp)

通过 UDP 传输 Modbus TCP 帧。

yaml
- name: modbus-udp
  type: modbus-udp
  settings:
    host: 192.168.1.90
    port: 502
    slave-id: 1
    timeout: 3s

settings 字段

字段类型必填默认值说明
hoststring设备 IP 地址
portint502UDP 端口
slave-idint1从站地址
timeoutduration3s单次读写超时时间
retryint3通信失败后的重试次数
reconnect-intervalduration2s重连初始退避间隔
reconnect-max-intervalduration30s重连退避上限

Modbus RTU over UDP (modbus-rtuoverudp)

通过 UDP 传输 RTU 帧。

yaml
- name: rtu-udp
  type: modbus-rtuoverudp
  settings:
    host: 192.168.1.91
    port: 502
    slave-id: 1
    timeout: 3s

settings 字段

字段类型必填默认值说明
hoststring设备 IP 地址
portint502UDP 端口
slave-idint1从站地址
timeoutduration3s单次读写超时时间
retryint3通信失败后的重试次数
reconnect-intervalduration2s重连初始退避间隔
reconnect-max-intervalduration30s重连退避上限

Modbus TLS (modbus-tls)

Modbus TCP over TLS,需要双向 TLS(mTLS)证书。

yaml
- name: modbus-tls
  type: modbus-tls
  settings:
    host: 192.168.1.100
    port: 802
    cert-file: /etc/corec/certs/client.crt
    key-file: /etc/corec/certs/client.key
    ca-file: /etc/corec/certs/ca.crt
    slave-id: 1
    timeout: 3s

settings 字段

字段类型必填默认值说明
hoststring设备 IP 地址
portint502TCP 端口(Modbus TLS 常用 802)
cert-filestring客户端证书 PEM 文件路径
key-filestring客户端私钥 PEM 文件路径
ca-filestringCA / 服务端证书 PEM 文件路径
slave-idint1从站地址
timeoutduration3s单次读写超时时间
retryint3通信失败后的重试次数
reconnect-intervalduration2s重连初始退避间隔
reconnect-max-intervalduration30s重连退避上限

Siemens S7 (s7)

通过 ISO-on-TCP(102 端口)连接西门子 S7 系列 PLC,支持 S7-300、S7-1200、S7-1500。

yaml
- name: siemens-s7-300
  type: s7
  settings:
    host: 192.168.1.200
    port: 102
    rack: 0
    slot: 2
    timeout: 5s

settings 字段

字段类型必填默认值说明
hoststringPLC IP 地址
portint102ISO-on-TCP 端口,通常无需修改
rackint0机架号,标准机架为 0
slotint2槽号,见下表
timeoutduration5s单次读写超时时间
idle-timeoutduration60s连接空闲超时时间
reconnect-intervalduration2s重连初始退避间隔
reconnect-max-intervalduration30s重连退避上限

slot 取值

PLC 型号slot说明
S7-3002CPU 位于机架 0 槽 2
S7-4002(典型)视实际机架配置而定
S7-12001CPU 集成 PN 接口
S7-15001CPU 集成 PN 接口

地址格式

S7 地址直接使用 STEP 7 / TIA Portal 中的符号:

地址形式含义推荐类型
DB<n>.DBD<x>数据块双字(32 位)float32 / int32 / uint32
DB<n>.DBW<x>数据块字(16 位)int16 / uint16
DB<n>.DBB<x>数据块字节(8 位)int8 / uint8
DB<n>.DBX<x>.<bit>数据块位bool
I<x>.<bit>输入区位bool
Q<x>.<bit>输出区位bool
M<x>.<bit>位存储区位bool
yaml
tags:
  - name: reactor_temp
    address: "DB1.DBD0"   # DB1 双字 0,Float32
    type: float32
  - name: emergency_stop
    address: "I0.0"       # 输入位 0.0
    type: bool

OPC UA (opcua)

作为 OPC UA 客户端连接 SCADA、MES 或独立 OPC 服务器,支持轮询与订阅两种采集模式。

yaml
- name: opc-server
  type: opcua
  settings:
    endpoint: "opc.tcp://192.168.1.50:4840"
    mode: polling
    timeout: 5s

settings 字段

字段类型必填默认值说明
endpointstringOPC UA 端点 URL,格式 opc.tcp://host:port
modestringpolling采集模式:pollingsubscription
timeoutduration5s连接与单次操作超时时间
security-policystring安全策略,如 NoneBasic256Sha256
security-modestring安全模式,如 NoneSignSignAndEncrypt
usernamestring用户名认证(未设置时使用匿名认证)
passwordstring密码认证
cert-filestring客户端证书 PEM 文件路径
key-filestring客户端私钥 PEM 文件路径
subscription-intervalduration500ms订阅模式下的发布间隔
subscription-bufferint1024订阅通道缓冲容量
max-batch-sizeint1000单次读请求的最大节点数
reconnect-intervalduration2s重连初始退避间隔
reconnect-max-intervalduration30s重连退避上限

mode 取值

取值行为适用场景
polling按标签 interval 周期主动读服务端不支持订阅、或需精确控制采集频率
subscription由服务端在数据变化时推送实时性要求高、希望减少无效轮询

WARNING

并非所有 OPC UA 服务端都支持 subscription 模式。若服务端拒绝订阅,驱动将返回 subscribe not supported by this driver 错误,此时请改用 polling

订阅模式(Phase 3)

subscription 模式的完整服务端推送实现计划在 Phase 3 完成。当前版本 subscription 模式回退为轮询行为,建议暂时使用 polling 模式。

地址格式

OPC UA 地址采用 NodeId 标准表示法:

形式示例说明
命名空间 + 字符串ns=2;s=Conveyor.Speed最常用,可读性强
命名空间 + 数字ns=1;i=1001引用数字 NodeId
仅数字i=2258Server.CurrentTime 等标准节点

标签配置(tags)

tags 列表定义驱动下每个数据点的采集规则。对应内核 TagConfig 结构。

yaml
tags:
  - name: temperature
    address: "40001"
    type: float32
    group: sensors
    interval: 1s
    scale: 1.0
    offset: 0.0
    deadband: 0.2

字段说明

字段类型必填默认值说明
namestring标签名称,同一驱动内唯一,作为数据点的 tag 字段
addressstring设备地址,格式随驱动类型而异
typestring数据类型,见下表
groupstring分组名,用于规则按组匹配与传输主题渲染
intervalduration引擎 default-tag-interval(默认 1s采集周期,如 1s500ms200ms
scalefloat1.0线性缩放系数,输出 = value * scale + offset
offsetfloat0.0线性偏移量
deadbandfloat0死区过滤阈值,变化量小于该值时不输出

支持的数据类型

type位宽说明
bool1布尔
int88有符号 8 位整数
int1616有符号 16 位整数
int3232有符号 32 位整数
int6464有符号 64 位整数
uint88无符号 8 位整数
uint1616无符号 16 位整数
uint3232无符号 32 位整数
uint6464无符号 64 位整数
float3232单精度浮点
float6464双精度浮点
string字符串
bytes原始字节

interval 写法

采用 Go duration 字符串:

写法含义
200ms200 毫秒
500ms500 毫秒
1s1 秒
2s2 秒
1m1 分钟

TIP

同一 group 下的标签建议使用相同 interval,内核可将其合并为一次批量读请求,显著降低通信开销。

scale 与 offset

对原始读值做线性变换,常用于传感器量程转换:

输出值 = 原始值 × scale + offset
yaml
- name: pressure
  address: "40003"
  type: uint16
  scale: 0.01      # 寄存器存的是 100 倍工程值
  offset: 0.0
  interval: 1s

deadband

死区过滤,仅当本次读值与上次输出值的差值绝对值大于 deadband 时才产生新数据点,用于抑制传感器抖动、减少上行流量。

yaml
- name: temperature
  address: "40001"
  type: float32
  deadband: 0.2    # 温度变化小于 0.2 时不输出
  interval: 1s

INFO

deadband 仅对数值类型(int*/uint*/float*)生效,boolstringbytes 类型忽略该设置。设为 0 表示禁用死区,每次采集都输出。

Released under the MIT License.