协议

通用 CAN

qianmoQqianmoQ· 更新于 2026-10-01· 阅读 8 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Generic CAN 是一个与传输层无关、用于处理原始 CAN 总线](https://plc4x.apache.org/plc4x/latest/users/protocols/can.html)流量的驱动。它本身不应用任何应用层协议:每个字段都以原始节点 ID 加数据类型的方式寻址,针对单个节点 ID 写入或接收的值会按字段顺序打包进同一个 CAN 帧中。当总线上的设备使用直接构建在原始 CAN 帧之上的专有或未文档化协议时,它非常适用;而对于任何在 CAN 总线之上遵循特定更高层协议的场景(例如 CANopen),则更适合使用 CANopen。

支持的操作

名称值说明
publishwrite通过 CAN 传输层发布一个 CAN 帧。
receivesubscribe监听与已订阅节点 ID 相匹配的入站 CAN 帧。

该驱动不支持读取;它只执行写入与订阅。

连接字符串

genericcan:can-socketcan://{interface}[?{options}]
genericcan:can-virtualcan://{bus-name}[?{options}]
genericcan:can-socketcan://can0
genericcan:can-virtualcan://test

接口名和总线名也可以作为选项提供——can-socketcan.interface-name 和 can-virtualcan.bus-name——适用于仅通过选项拼接连接字符串的调用方。如果两者都指定了名称,则以地址段中的名称为准。

连接字符串选项

名称

类型

默认值

是否必需

描述

名称

Generic CAN

代码

genericcan

Maven 依赖

<dependency>
  <groupId>org.apache.plc4x</groupId>
  <artifactId>plc4j-driver-can</artifactId>
  <version>1.0.0</version>
</dependency>

默认传输

can-socketcan

支持的传输方式

  • can-socketcan
  • can-virtualcan

配置选项:

node-id

INT

目标设备的节点 ID。

request-timeout-ms

INT

1000

所有类型请求的默认超时时间。

传输配置选项:

can-socketcan

can-socketcan.interface-name

STRING

Linux CAN 接口名称(例如 can0、vcan0)。这是在连接字符串的地址段中指定接口名称的替代方式,若两者同时出现,则以地址段中的名称优先。

can-socketcan.reuse-interface

BOOLEAN

false

在同一接口上的多个传输实例之间共享 CAN 套接字

can-socketcan.read-timeout-ms

INT

1000

CAN 套接字阻塞读取的读取超时时间(毫秒)。

can-socketcan.filter-ids

STRING

接受的 CAN ID 逗号分隔列表(十进制或 0x 十六进制)。留空表示接受全部。

can-socketcan.filter-range-start

INT

-1

接受的 CAN ID 范围起始值(含)。-1 表示不进行范围过滤。

can-socketcan.filter-range-end

INT

-1

接受的 CAN ID 范围结束值(含)。-1 表示不进行范围过滤。

can-virtualcan

can-virtualcan.bus-name

STRING

default

虚拟 CAN 总线的名称。位于同一总线上的实例在内存中交换帧。

can-virtualcan.filter-ids

STRING

以逗号分隔的可接受 CAN ID 列表(十进制或 0x 十六进制)。留空表示接受全部。

can-virtualcan.filter-range-start

INT

-1

接受的 CAN ID 范围起始值(含)。-1 表示不进行范围过滤。

can-virtualcan.filter-range-end

INT

-1

接受的 CAN ID 范围结束值(含)。-1 表示不进行范围过滤。

标签地址

地址的实现采用 Java。不支持读取操作;该驱动执行写入与订阅。具体各实现支持的功能请参见协议支持矩阵]。

通用格式

nodeId:type[arraySize]

nodeId 是一个普通(非十六进制)整数形式的 CAN 节点/帧标识符。type 是下表所列数据类型之一。arraySize 是可选的;参见数组寻址]。

底层模式(GenericCANTag.java:36-37)为 (?<nodeId>\d+):(?<dataType>\w+)(?:\[(?<arraySize>\d+)\])?。它没有使用 ^/$ 进行锚定,但 GenericCANTag.matches()(GenericCANTag.java:83)在使用 Matcher.matches() 时会应用该模式,这要求整个输入字符串都要匹配。因此,合法地址之后的尾随文本会被拒绝,而不是被静默忽略。

你可以使用多个字段来写入和订阅实际数据。所有字段加起来必须等于 64 位。如果你订阅的数据少于帧中包含的内容,剩余数据将被丢弃,无法通过 PLC4X API 获取。写入和接收的数据顺序与请求中的字段顺序一致。

数据类型

地址类型长度(位)PLC4X 类型
BOOLEAN1BOOL
UNSIGNED88USINT
UNSIGNED1616UINT
UNSIGNED2424UDINT
UNSIGNED3232UDINT
UNSIGNED4040ULINT
UNSIGNED4848ULINT
UNSIGNED5656ULINT
UNSIGNED6464ULINT
INTEGER88SINT
INTEGER1616INT
INTEGER2424DINT
INTEGER3232DINT
INTEGER4040LINT
INTEGER4848LINT
INTEGER5656LINT
INTEGER6464LINT
REAL3232REAL
REAL6464LREAL

此类型表与 CANopen 的类似,主要区别在于不支持字符串类型。

示例

200:BYTE
200:BYTE[8]

更多信息

  • CAN 总线](url) - 该驱动所使用的共享传输与帧模型。
  • CANopen](url) - 针对遵循 CANopen 应用层(而非原始帧)的设备所使用的驱动。

评论

登录后参与评论

正在加载评论…