#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