AnyMath 文档

CAN软件控制

本页包含所有可用的CAN软件控制功能 AnyMath .

使用CAN软件控制功能 AnyMath ,按照指定的方式安装硬件支持包 文章. 安装后,运行:

using Main.EngeeDeviceManager.Devices.CAN

接下来,您需要创建一个CAN对象。:

CAN.Can()
CAN.bus_status(device, channel::String)->Int64

总线状态:

  • 0 — 无错误;

  • 非零值 — 错误。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType :CAN 设备对象。

  • channel::String :通道标识符(例如,"can0" ,"virtual_0" )。

CAN.close(device)

Закрытие CAN-объекта и освобождение ресурсов.

Аргументы

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType: объект устройства CAN.

CAN.create_bus(device, interface::String, channel::String, kbits::Float64, auto_reset::Bool, is_fd::Bool=false, data_kbits::Float64=0.0, timing=nothing)

创建并启用具有指定设置的 CAN 总线。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType : CAN 设备对象。

  • interface::String : 接口类型("socketcan","pcan","marathon","virtual" )。

  • channel::String :通道标识符(例如,"can0" ,"virtual_0" )。

  • kbits::Float64 :传输速率(单位:kbit/s)。

  • auto_reset::Bool :发生错误时是否自动重启;

  • is_fd::Bool :是否使用 CAN FD(可选,默认值false );

  • data_kbits::Float64 : CAN FD的速率(可选,默认值为0.0 );

  • timing::Union{Nothing, CanFdTiming, CanTiming} :额外的定时参数(可选,默认值为Nothing )。

CAN.destroy_bus(device, channel::String)

停止并删除 CAN 总线。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType : CAN 设备对象。

  • channel::String : 通道标识符(例如,"can0","virtual_0" )。

CAN.get_tx_rx_errors(device, channel::String)->Vector{Int64}

Возвращает вектор количества ошибок при приеме и передаче [tx_errors, rx_errors].

Аргументы

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType: объект устройства CAN.

  • channel::String: идентификатор канала (например, "can0", "virtual_0").

CAN.recv(device, channel::String, timeout::Float64, async_rpc::Bool=false)->Union{Nothing, CanMessage}

接收一条消息,超时时间以秒为单位。若无消息,则返回Nothing 。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType :CAN设备对象。

  • channel::String :通道标识符(例如,"can0" ,"virtual_0" )。

  • timeout::Float64 :超时时间(单位:秒)。

  • async_rpc::Bool :可选,默认值为false 。若true ,则接收操作以异步方式执行。

CAN.reset(device, channel::String)

重启接口(Bus-off 后的恢复)。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType : CAN 设备对象。

  • channel::String : 通道标识符(例如,"can0","virtual_0" )。

CAN.send(device, channel::String, message::CanMessage, async_rpc::Bool=false)

发送 CAN 消息。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType :CAN设备对象。

  • channel::String :通道标识符(例如,"can0" 、"virtual_0" )。

  • message::CanMessage :待发送的CAN消息。

  • async_rpc::Bool :可选,默认值为false 。若为true ,则发送操作为异步,且调用为非阻塞式。

CAN.set_bus_settings(device, interface::String, channel::String, kbits::Float64, auto_reset::Bool, is_fd::Bool=false, data_kbits::Float64=0.0, timing=nothing)

在创建总线之前配置 CAN 接口。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType : CAN 设备对象。

  • interface::String : 接口类型("socketcan","pcan","marathon","virtual" )。

  • channel::String : 通道标识符(例如,"can0","virtual_0" )。

  • kbits::Float64 : 传输速率(单位:kbit/s)。

  • auto_reset::Bool : 发生错误时是否自动重启;

  • is_fd::Bool : 是否使用 CAN FD(可选,默认值为false );

  • data_kbits::Float64 : CAN FD 的速率(可选,默认值为0.0 );

  • timing::Union{Nothing, CanFdTiming, CanTiming} : 额外的定时参数(可选,默认值为Nothing )。

CAN.set_filters(device, channel::String, filter_id::Int64, mask::Int64)

基于仲裁 ID 的硬件接收过滤器。过滤器(0, 0) 接收所有消息。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType : CAN 设备对象。

  • channel::String : 通道标识符(例如,"can0","virtual_0" )。

  • filter_id::Int64 :过滤器标识符。

  • mask::Int64 :用于确定仲裁 ID 的哪些位必须匹配的掩码。

CAN.start_stream(device, channel::String, sample_time::Float64=0.01)->Tuple{String, String}

以指定步长启动流式接收。返回 AMQPStream 的队列名称。

参数

  • device::Main.EngeeDeviceManager.Devices.CAN.CanType :CAN 设备对象。

  • channel::String :通道标识符(例如,"can0" 、"virtual_0" )。

  • sample_time::Float64 :启动接收的步长(可选,默认值为0.01 )

CAN消息的结构

Base.@kwdef struct CanMessage
    timestamp::Float64          # метка времени
    arbitration_id::Int64       # ID сообщения (11 или 29 бит)
    is_extended_id::UInt8       # 1 — 29-битный ID
    is_remote_frame::UInt8      # 1 — RTR
    is_error_frame::UInt8       # 1 — кадр ошибки
    is_fd::UInt8                # 1 — CAN FD
    bitrate_switch::UInt8       # 1 — переключение скорости
    error_state_indicator::UInt8
    dlc::Int64                  # длина данных (0–8 Classic, 0–64 FD)
    data::Union{Vector{UInt8}, Int64}
end

例子:

界面 虚拟

can = CAN.Can()

CAN.set_bus_settings(can, "virtual", "virtual_0", 500.0, true)
CAN.set_bus_settings(can, "virtual", "virtual_1", 500.0, true)
CAN.create_bus(can, "virtual", "virtual_0", 500.0, true)
CAN.create_bus(can, "virtual", "virtual_1", 500.0, true)
CAN.set_filters(can, "virtual_0", 0, 0)

data_field = rand(UInt8, 8)
message = CanMessage(
    timestamp = rand(Float64),
    arbitration_id = rand(UInt32),
    is_extended_id = 0,
    is_remote_frame = 0,
    is_error_frame = 0,
    is_fd = 0,
    bitrate_switch = 0,
    error_state_indicator = 0,
    dlc = length(data_field),
    data = data_field,
)

CAN.send(can, "virtual_0", message, true)
msg = CAN.recv(can, "virtual_1", 0.0)
println("Отправлено: $data_field")
println("Получено:   $(msg.data)")

CAN.destroy_bus(can, "virtual_0")
CAN.close(can)

可以FD

CAN.set_bus_settings(can, "socketcan", "can0", 500.0, true, true, 2000.0)
CAN.create_bus(can, "socketcan", "can0", 500.0, true, true, 2000.0)

fd_message = CanMessage(
    timestamp = time(), arbitration_id = 0x123,
    is_extended_id = 0, is_remote_frame = 0, is_error_frame = 0,
    is_fd = 1, bitrate_switch = 1, error_state_indicator = 0,
    dlc = 64, data = rand(UInt8, 64),
)
CAN.send(can, "can0", fd_message)