1
驱动概览
这是什么

SECP 驱动用于接入支持 SECP 协议的设备——主要是 PCS-200 / PCS-600 / LCS-300 PLC 及 OptiEdge 边缘产品。SECP 是一种基于原始 TCP Socket 的二进制帧协议,平台作为客户端主动连接设备,通过自定义二进制报文读写数据。

不同于基于文本(如 HTTP/MQTT)的协议,SECP 直接操作字节流,帧由固定头部(版本+密码+命令类型+索引)+ 变长数据组成,解析必须精确到字节。

关键事实
属性值说明
驱动名称secpSPI 注册名
版本V 1.0getDriverVersion()
接入模式EMBEDDED内嵌于平台主应用
传输方式原始 TCP Socket(NIO 阻塞模式)java.nio.channels.SocketChannel
通信模型轮询(虚拟线程读循环)带 label 变更检测
Web 接口1 个点位比对检测
定时任务1 个每 4 秒心跳+读触发
适用设备PCS-200/600、LCS-300、OptiEdge两类协议版本
2
二进制帧协议
帧结构

每帧由固定头部和变长数据组成。头部各字段含义:

flowchart LR subgraph 帧["SECP 二进制帧"] V["版本
2 字节"] PWD["密码
32 字节"] CMD["命令类型
4 字节"] IDX["索引
2 字节"] DATA["数据
变长"] end V --- PWD --- CMD --- IDX --- DATA style V fill:#e8f0fe,stroke:#007aff,color:#1c1c1e style PWD fill:#f0f0f5,stroke:#5856d6,color:#1c1c1e style CMD fill:#fff4e8,stroke:#ff9500,color:#1c1c1e style DATA fill:#e8f8f0,stroke:#34c759,color:#1c1c1e
字段长度说明
Version2 字节协议版本(V1.0=0x0a 0x00,V2.0=0x14 0x00)
Password32 字节固定全零密码
CmdType4 字节命令类型(1/2/3)
Index2 字节序号
Data变长负载
三类命令
CmdType用途方向
1 读位号表读取设备所有位号(tag)的元信息(id/数据类型/长度/名称)平台 → 设备
2 读数据读取位号当前值平台 → 设备
3 写下载向位号写入控制值平台 → 设备

对应头部常量:HEAD_10_1/2/3(V1.0)与 HEAD_20_1/2/3(V2.0)。

3
两代协议版本
V1.0 与 V2.0 的区别
维度V1.0(0x0a 0x00)V2.0(0x14 0x00)
适用设备PCS-200 / PCS-600 / LCS-300(传统)OptiEdge(新一代)
写方式仅单点写批量写
头部常量HEAD_10_*HEAD_20_*
版本协商

驱动根据设备类型/连接情况使用对应版本的头部,V2.0 设备支持批量写,效率更高。

4
整体架构
组件协作
flowchart TB subgraph 接入 A["SecpAccess"] end subgraph 核心 M["InstanceManager
实例管理 · 校验 · 写 · 建点"] CH["SecpChannel
每实例 · SocketChannel · 帧收发"] AR["AssembleRequestBody
帧编码/解码"] end subgraph 接口/任务 API["PointDetectionApi
点位比对"] T["CheckInstanceAliveTask
cron 0/4"] end A --> M M --> CH CH --> AR AR <-->|"二进制帧"| DEV["PCS/OptiEdge 设备"] API --> M T -->|"心跳+读触发"| M style A fill:#e8f0fe,stroke:#007aff,stroke-width:2px,color:#1c1c1e style M fill:#f0f0f5,stroke:#5856d6,stroke-width:2px,color:#1c1c1e style CH fill:#fff4e8,stroke:#ff9500,color:#1c1c1e
5
数据采集流程
label 变更检测 + 位号表重建

SECP 设备的位号表(tag table)可能因工程变更而变化。驱动通过 8 字节 label 检测位号表是否变化——每次读取前先比对 label,若变化则重建位号表(逐个 tag 表读取),再读值。

sequenceDiagram participant L as 虚拟线程读循环 participant CH as SecpChannel participant DEV as 设备 L->>CH: readPoints() CH->>DEV: requestLabel (CmdType 1, 读 label) DEV-->>CH: 8 字节 label alt label 与上次不同 CH->>DEV: readBitRequest 循环 (每个 tag 表) DEV-->>CH: 位号元信息 (id/类型/长度/名称) CH->>CH: 重建 results 位号表 CH->>CH: 运行期首次自动建点 end CH->>DEV: readDataRequest (CmdType 2) DEV-->>CH: 位号值 CH->>CH: 按 dataType 解析 CH->>CH: sleep(instanceLoopSilenceTime)
运行期自动建点(特色)

每个实例运行期间首次读取到位号表时(instancePointHasCreate),驱动会自动把设备的位号创建为平台点位。这意味着无需手工配置点位——设备有什么位号,平台就自动建什么点。

限制

运行期间位号不可修改——一旦建点,本次运行周期内点位固定。位号表变化需触发 label 检测重建。

数据类型映射

设备返回的数据按 dataType 码解析:

类型码平台类型
1bool
2-10int
11float
20string
其他double
6
下行写与点位检测
写下载(CmdType 3)

下行控制(issuePointValueBatch → dataDownload)按点逐个发送写下载命令(CmdType 3),带 writeRetry 重试。返回码 1 表示成功。写值前会做值域校验(checkValueLength)。

点位比对检测(特色 API)

SECP 提供 pointDetection API,对比设备实际位号与平台已有点位,返回三类差异:

差异类型含义
平台缺失设备有但平台没建的点位
设备缺失平台有但设备已删除的点位
类型不一致两端都存在但数据类型不匹配
实用价值

这是排查「点位对不上」问题的利器,尤其适合设备工程变更后的对账场景。

7
实例与点位属性
实例属性
属性名类型默认说明
hoststring必填设备 IP;与 port 联合唯一
portint必填设备 TCP 端口
commandIntervalint必填位号表读取间隔(毫秒)
instanceLoopSilenceTimeint必填读循环休眠(毫秒)
readTimeoutint500连接超时(毫秒)
readValueTimeoutint必填响应等待超时(毫秒)
writeRetryint3写下载重试次数
唯一性

host + port 必须项目内唯一。

点位属性
属性名含义说明
tagName位号名SECP「位号」;实例内唯一

点位唯一码:secp&&{channelId}&&{pointName}。

8
Web 接口与定时任务
1 个 HTTP API
映射路径用途参数
pointDetection比对设备位号与平台点位,返回缺失/多余/类型不一致instanceId

调用路径前缀:POST /driver/api/secp/{mapping}。

定时任务
任务名Cron频率职责
checkInstanceAliveTask0/4 * * * * ?每 4 秒建立 TCP 通道、设置状态、读线程死亡时重启
9
常见问题
Q1
连不上设备?
检查 host/port 网络可达、防火墙放行。SECP 用原始 TCP,无 Broker。可用 telnet 测试端口连通性。注意 readTimeout(默认 500ms)若设备响应慢可能误判超时,可适当调大。
Q2
点位没自动创建?
SECP 在运行期首次读取到位号表时自动建点。若设备未正确返回位号表(label 读取失败、tag 表读取异常),则不会建点。用 pointDetection API 检查设备实际位号,确认通信正常。
Q3
读到的值类型不对?
值类型由设备的 dataType 码决定(1=bool、2-10=int、11=float、20=string)。若设备上报的类型码与实际不符,解析会出错。这种情况通常是设备工程配置问题,需核对位号在设备侧的数据类型定义。
Q4
工程变更后点位对不上怎么办?
① 设备工程变更后,label 会变化,驱动自动重建位号表;② 用 pointDetection 比对差异,清理平台多余点位、补建缺失点位;③ 注意运行期间位号不可改,可能需重启实例使新位号生效。
Q5
SECP 和 RCP 都接 PLC,区别?
SECP 是原始 TCP 二进制帧,纯 Java 实现(NIO),无原生库依赖,部署简单,支持自动建点与点位比对;RCP 依赖原生 JNA 库(部署受限),按变量追踪采集,有组态一致性检测。SECP 更适合 OptiEdge 等标准化设备,RCP 适合需要深度变量访问的传统 PLC。