Связь через интерфейс CAN-шины не работает

#python #linux #can-bus #buildroot #python-can

Вопрос:

У меня есть код python, работающий на устройстве на базе Linux, которое имеет следующие спецификации ОС:

 NAME=Buildroot
VERSION=2020.11.1
 

Это устройство подключено к ПЛК с помощью трехпроводного интерфейса (CAN_H,CAN_L,GND).

Я написал код, который отправляет сообщение на ПЛК с использованием протокола CAN-шины. Это делается с python-can помощью пакета.

У меня есть следующий код:

 import can

def send():
    #USB interface
    #bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)
    #on linux
    bus = can.interface.Bus(bustype='socketcan', channel='vcan0', bitrate=500000)
    #on windows
    #bus = can.interface.Bus(bustype='serial', channel='COM1', bitrate=500000)
    msg = can.Message(arbitration_id=0x68005,data=[0x10,0x11,0x12],is_extended_id=True)
    try:
        bus.send(msg)
        print("Message sent on {}".format(bus.channel_info))
    except can.CanError:
        print("Message NOT sent")


if __name__ == '__main__':
     send()
 

Проблема заключается в том, что устройство не отправляет никаких данных на ПЛК. Вероятно, это связано с неправильными настройками, установленными для bustype и channel .

Может ли кто-нибудь посоветовать, что следует предусмотреть bustype и channel для этого физического интерфейса с тремя проводами CAN?

Комментарии:

1. Проверьте фактическую шину с помощью осциллографа или CAN-приемника. Что туда посылают, если вообще что-то посылают?

Ответ №1:

ВНИМАНИЕ: Я не знаком с библиотекой python-can, но я работаю с socketcan.

vcan0-это виртуальный канал can, который можно настроить для обеспечения виртуальной связи между приложениями (например, тестирование).

Фактическое устройство CAN (например, PCAN-USB) указано как can0, can1, canX. Имейте в виду, что в некоторых встроенных системах это может быть неверно (например, это может начинаться с can1).

РЕДАКТИРОВАТЬ: Я забыл упомянуть, что вы можете получить список всех сетевых интерфейсов, подобных этому, включая интерфейсы CAN:

 $ ifconfig -a
 

Справочная документация: https://elinux.org/Bringing_CAN_interface_up