完整示例
本页给出一份可直接使用的 CoreC 配置文件,每个段落附带注释说明。可将其作为 config.yaml 启动核心:
./corec -c config.yamlTIP
完整文件见仓库根目录 config.example.yaml。本页在其基础上补充了逐段讲解。
配置总览
CoreC 配置采用 YAML,顶层段如下:
| 段 | 作用 | 必填 | 对应文档 |
|---|---|---|---|
node | 拓扑自动发现(节点身份、上游订阅) | 否 | 链式核心 → 自动发现 |
global | 核心全局设置(日志、API、引擎调优) | 否 | 全局配置 |
drivers | 南向采集驱动列表 | 否 | 驱动配置 |
transports | 北向传输通道列表(mqtt / http / notify) | 否 | 传输配置 |
rules | 数据路由与处理规则 | 否 | 规则配置 |
rule-providers | 外部规则集提供者(RULE-SET:name 委托) | 否 | 规则配置 |
rule-groups | 命名子规则组(SUB-RULE:name 委托) | 否 | 规则配置 |
derived-tags | 派生标签(表达式计算的 KPI) | 否 | 派生标签配置 |
空配置 / Idle 模式
drivers 与 transports 均非必填。CoreC 支持以仅含 global.api 的最小配置启动(idle 模式),再通过 Dashboard 从零配置全部业务。启动时若无数据源或无传输,日志会输出非阻塞告警(no data source configured / no transport configured),引擎以空管线安全运行。详见下方"空配置 / Idle 模式"小节。
INFO
node 段是可选的。省略时所有自动发现功能关闭。设置 node.id 后,MQTT 传输省略的 topic-template、command-topic 会自动生成;显式设置 data-topic 时省略的 parser 自动补全。
完整配置文件
# ============================================================
# CoreC 配置示例
# 工业数据采集核心
# ============================================================
# ---------- 全局设置 ----------
global:
log-level: info # 日志级别:debug/info/warn/warning/error/silent
api:
listen: 0.0.0.0:9090 # 管理 API 监听地址(未设置则不启用 API)
secret: "corec-secret-token" # 鉴权令牌(listen 设置时必填,至少 8 字符)
engine:
data-bus-size: 8192 # 内部数据通道容量
# workers: 0 # 处理协程数(0 = NumCPU,默认)
shutdown-timeout: 30s # 优雅关停超时
error-throttle-window: 10s # 错误日志抑制窗口
default-tag-interval: 1s # 标签未设 interval 时的回退周期
on-bad-quality: mark-and-publish # 坏质量数据处理策略
stale-threshold: 30s # 数据陈旧判定阈值
write-retry-count: 3 # 写入指令重试次数
buffer: # 离线持久化缓冲(可选)
enabled: false
path: /var/lib/corec/buffer # 缓冲文件目录(enabled=true 时必填)
max-size: 10000 # 缓冲批次最大数量(超出驱逐最旧)
# ============================================================
# 南向驱动
# 支持: modbus-tcp, modbus-rtu, modbus-rtuovertcp, modbus-udp,
# modbus-rtuoverudp, modbus-tls, s7, opcua
# ============================================================
drivers:
# ---------- 1. Modbus TCP 驱动 (PLC / 传感器网关) ----------
- name: plc-modbus # 驱动实例名,全局唯一
type: modbus-tcp # 协议类型
settings:
host: 192.168.1.100 # 设备 IP
port: 502 # Modbus 标准端口
slave-id: 1 # 从站地址 (Modbus unit id)
timeout: 3s # 读写超时
retry: 3 # 失败重试次数
tags:
- name: temperature # 标签名
address: "40001" # 保持寄存器 0
type: float32 # 数据类型
group: sensors # 分组
interval: 1s # 采集周期
deadband: 0.2 # 死区过滤,变化 <0.2 不输出
- name: pressure
address: "40003" # 保持寄存器 2
type: float32
group: sensors
interval: 1s
- name: pump_status
address: "00001" # 线圈 0
type: bool
group: actuators
interval: 2s
# ---------- 2. Siemens S7 驱动 (S7-200 / S7-300 / S7-400 / S7-1200 / S7-1500) ----------
- name: siemens-s7-300
type: s7
settings:
host: 192.168.1.200
port: 102 # ISO-on-TCP 端口
rack: 0 # 机架号
slot: 2 # S7-300 用 2,S7-1200/1500 用 1
timeout: 3s
tags:
- name: reactor_temp
address: "DB1.DBD0" # DB1 双字 0 (Float32)
type: float32
group: reactor
interval: 500ms
- name: motor_speed
address: "DB1.DBW4" # DB1 字 4 (Uint16)
type: uint16
group: motors
interval: 1s
- name: emergency_stop
address: "I0.0" # 输入位 0.0
type: bool
group: safety
interval: 200ms
# ---------- 3. OPC UA 客户端驱动 (SCADA / MES / OPC 服务器) ----------
- name: opc-server
type: opcua
settings:
endpoint: "opc.tcp://192.168.1.50:4840" # OPC UA 端点
mode: polling # polling 或 subscription
timeout: 5s
tags:
- name: conveyor_speed
address: "ns=2;s=Conveyor.Speed" # 命名空间+字符串 NodeId
type: float64
group: conveyor
interval: 1s
- name: batch_count
address: "ns=1;i=1001" # 命名空间+数字 NodeId
type: uint32
group: production
interval: 2s
# ============================================================
# 北向传输
# 支持: mqtt, http, notify
# ============================================================
transports:
# ---------- 1. MQTT 云端传输 (发布 + 可选命令回写) ----------
- name: cloud-mqtt
type: mqtt
settings:
broker: tcp://broker.emqx.io:1883 # Broker 地址
client-id: factory-edge-01 # 客户端 ID(需唯一)
qos: 1 # 服务质量等级
topic-template: "factory/{{.Driver}}/{{.Group}}/{{.Tag}}" # 发布主题模板
# 命令回写需成对配置(缺 command-secret 时传输拒绝启动):
# command-topic: "factory/commands/#" # 订阅命令主题(支持通配符)
# command-secret: ${COREC_COMMAND_SECRET} # 命令 HMAC-SHA256 认证密钥
batch-size: 50 # 单批最大点数
flush-interval: 1s # 定时刷新间隔
# ---------- 2. HTTP Webhook / REST 推送 (MES / 数据湖 API) ----------
- name: mes-http-push
type: http
settings:
url: "http://localhost:8080/api/v1/telemetry" # 上游 API
method: POST # HTTP 方法
headers:
Authorization: "Bearer mes-secret-key" # 鉴权头
timeout: 3s # 请求超时
batch-size: 100
flush-interval: 5s
# ============================================================
# 规则
# 按 priority 升序求值 (数值越小 = 优先级越高)
# 动作: forward, drop, alert, transform, mirror
# ============================================================
rules:
# ---------- 1. 高温告警 -> 告警到云 MQTT,然后继续正常转发 ----------
- name: high-temp-alert
match: "tag == 'temperature' && value > 95"
action: alert
target: cloud-mqtt
priority: 1
continue: true # 告警后继续评估,数据仍会流入下方兜底规则
# ---------- 2. 急停 -> 高优先级告警 ----------
- name: emergency-stop-alert
match: "tag == 'emergency_stop' && value == true"
action: alert
target: cloud-mqtt
priority: 2
# ---------- 3. 安全与反应器数据 -> 镜像到 MQTT 与 MES 双通道 ----------
- name: reactor-mirror
match: "group == 'reactor'"
action: mirror
targets:
- cloud-mqtt
- mes-http-push
priority: 10
# ---------- 4. 兜底:其余全部转发到 MES HTTP ----------
- name: default-catch-all
match: "ALL"
action: forward
target: mes-http-push
priority: 999分段讲解
global 段
global:
log-level: info
api:
listen: 0.0.0.0:9090
secret: "corec-secret-token"
engine:
data-bus-size: 8192
# workers: 0 # 0 = NumCPU(默认)
shutdown-timeout: 30s
default-tag-interval: 1s| 配置点 | 说明 |
|---|---|
log-level: info | 生产推荐级别,排障时临时切 debug |
api.listen | 管理 API 监听所有网卡的 9090 端口(未设置则不启用) |
api.secret | listen 设置时必填,客户端以 Bearer 令牌鉴权 |
engine.data-bus-size | 内部数据通道容量 8192 |
engine.workers | 规则管道处理协程数 |
engine.default-tag-interval | 标签未设 interval 时的回退采集周期 |
engine.on-bad-quality | 坏质量数据处理策略(publish/drop/mark-and-publish/alert) |
engine.stale-threshold | 数据陈旧判定阈值,超过此时间未更新的值标记 is_stale |
engine.write-retry-count | 写入指令失败重试次数,耗尽后进入死信队列 |
buffer.enabled | 启用离线缓冲后,传输失败时数据落盘待回放 |
详见 全局配置。
drivers 段
示例配置了三种典型驱动:
| 驱动 | 协议 | 设备 | 关键设置 |
|---|---|---|---|
plc-modbus | Modbus TCP | 192.168.1.100 | slave-id: 1,保持寄存器与线圈混采 |
siemens-s7-300 | S7 | 192.168.1.200 | slot: 2(S7-300),DB / I 区寻址 |
opc-server | OPC UA | 192.168.1.50 | mode: polling,字符串与数字 NodeId |
TIP
注意各驱动标签的 interval 差异:安全相关量(emergency_stop)用 200ms 高频采集,普通量用 1s–2s,避免无谓的通信开销。
详见 驱动配置。
transports 段
| 传输 | 协议 | 目标 | 特点 |
|---|---|---|---|
cloud-mqtt | MQTT | EMQX Broker | 主题按 驱动/分组/标签 分层;命令回写为可选能力(需成对配置 command-topic + command-secret) |
mes-http-push | HTTP | 本地 MES API | Bearer 鉴权,大批量低频率推送 |
topic-template: "factory/{{.Driver}}/{{.Group}}/{{.Tag}}"
# 实际渲染:factory/plc-modbus/sensors/temperature详见 传输配置。
rules 段
规则按 priority 升序求值,本例的路由策略为:
| 优先级 | 规则 | 命中条件 | 动作 |
|---|---|---|---|
| 1 | high-temp-alert | 温度 > 95 | alert → cloud-mqtt,continue: true 后继续评估 |
| 2 | emergency-stop-alert | 急停触发 | alert → cloud-mqtt |
| 10 | reactor-mirror | 反应器分组 | mirror → cloud-mqtt + mes-http-push |
| 999 | default-catch-all | 全部 | forward → mes-http-push |
高温点先触发告警,再由 continue: true 继续匹配,最终落入 default-catch-all 转发到 MES——告警与正常转发互不抢占。
WARNING
第 4 条 default-catch-all 是兜底规则。未匹配任何规则的数据点会被丢弃,因此务必保留一条 match: "ALL" 的低优先级规则。
详见 规则配置。
启动与验证
将上述配置保存为 config.yaml,启动核心:
./corec -c config.yaml验证管理 API 可达:
# 查看驱动列表
curl -H "Authorization: Bearer corec-secret-token" \
http://localhost:9090/drivers
# 查看传输状态
curl -H "Authorization: Bearer corec-secret-token" \
http://localhost:9090/transports预期返回各驱动与传输的运行状态 JSON。更多接口见 API 参考。
INFO
若日志出现驱动 error 状态,请依次检查:设备网络可达性、slave-id / slot / endpoint 正确性、防火墙端口放行。
空配置 / Idle 模式
CoreC 支持以空配置或仅含 global.api 的最小配置启动——无需任何 driver、transport 或 rule。引擎以空管线安全运行(scheduler 空转、处理 worker 阻塞在空数据总线、readiness 探针空载时返回 ready),运维随后通过 Dashboard 从零搭建全部业务配置。
最小配置
config.example.yaml 的活动内容即为最小配置(其余示例全部注释掉):
global:
log-level: info
api:
listen: 0.0.0.0:9090
secret: ${COREC_API_SECRET} # ≥8 字符启动:
COREC_API_SECRET=change-me-please ./corec -c config.example.yaml启动告警
以上最小配置启动时,日志会输出两条非阻塞告警(WARN 级别,不影响启动):
WARN no data source configured — running in idle mode; add a driver, an inbound transport (mqtt data-topic / http webhook-addr), or enable auto-discovery with node.subscribe via the Dashboard
WARN no transport configured — running in idle mode; add a northbound transport via the Dashboard若连 global.api.listen 也未设置(完全空配置),还会额外输出一条控制面告警(control plane (global.api.listen) not configured ...)。
这些告警同时出现在 Dashboard 的日志流(/logs WebSocket)中,提示运维当前核心处于 idle 模式。
经 Dashboard 配置
启动后打开 Dashboard 并连接到该实例的 API(http://<host>:9090,使用 api.secret 认证)。随后可通过:
- 配置中心:编辑完整 YAML 并
PUT /configs热重载; - 驱动 / 传输 / 规则向导:逐个添加实体,向导会在合并到工作配置后做本地校验(存在性校验已降级为非阻塞告警,不再阻止"先加第一个驱动"等鸡生蛋场景)。
每次 PUT /configs 应用一个仍无数据源 / 无传输的配置时,服务端会再次输出 idle 告警;一旦配置了数据源与传输,告警消失,核心进入正常采集状态。
INFO
api.secret 在 api.listen 设置时仍为硬性必填且不少于 8 字符——这是安全不变量,不因 idle 模式而放宽。其余硬校验(名称唯一、类型已注册、tag 字段合法、规则 target 引用等)同样保持不变。