通用 CAN
Generic CAN 是一个与传输层无关、用于处理原始 CAN 总线](https://plc4x.apache.org/plc4x/latest/users/protocols/can.html)流量的驱动。它本身不应用任何应用层协议:每个字段都以原始节点 ID 加数据类型的方式寻址,针对单个节点 ID 写入或接收的值会按字段顺序打包进同一个 CAN 帧中。当总线上的设备使用直接构建在原始 CAN 帧之上的专有或未文档化协议时,它非常适用;而对于任何在 CAN 总线之上遵循特定更高层协议的场景(例如 CANopen),则更适合使用 CANopen。
支持的操作
| 名称 | 值 | 说明 |
|---|---|---|
| publish | write | 通过 CAN 传输层发布一个 CAN 帧。 |
| receive | subscribe | 监听与已订阅节点 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-socketcancan-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 类型 |
|---|---|---|
| BOOLEAN | 1 | BOOL |
| UNSIGNED8 | 8 | USINT |
| UNSIGNED16 | 16 | UINT |
| UNSIGNED24 | 24 | UDINT |
| UNSIGNED32 | 32 | UDINT |
| UNSIGNED40 | 40 | ULINT |
| UNSIGNED48 | 48 | ULINT |
| UNSIGNED56 | 56 | ULINT |
| UNSIGNED64 | 64 | ULINT |
| INTEGER8 | 8 | SINT |
| INTEGER16 | 16 | INT |
| INTEGER24 | 24 | DINT |
| INTEGER32 | 32 | DINT |
| INTEGER40 | 40 | LINT |
| INTEGER48 | 48 | LINT |
| INTEGER56 | 56 | LINT |
| INTEGER64 | 64 | LINT |
| REAL32 | 32 | REAL |
| REAL64 | 64 | LREAL |
此类型表与 CANopen 的类似,主要区别在于不支持字符串类型。
示例
200:BYTE
200:BYTE[8]更多信息
评论
登录后参与评论
KnowForge