import can import time import struct import sys # Конфигурация CAN_INTERFACE = 'can0' DEVICE_ID = int(sys.argv[1]) # ID ADDR for servo REG_WRITE = 0x8 # Код команды записи REG_MOTOR_POSPID_Kp = 0x30 REG_MOTOR_POSPID_Ki = 0x31 REG_MOTOR_POSPID_Kd = 0x32 def send_can_message(bus, can_id, data): """Отправка CAN-сообщения""" try: msg = can.Message( arbitration_id=can_id, data=data, is_extended_id=False ) bus.send(msg) print(f"[Отправка] CAN ID: 0x{can_id:03X}, Данные: {list(data)}") return True except can.CanError as e: print(f"Ошибка CAN: {e}") return False def validate_crc16(data): """Расчет CRC16 (MODBUS) для проверки целостности данных""" crc = 0xFFFF for byte in data: crc ^= byte for _ in range(8): if crc & 0x0001: crc = (crc >> 1) ^ 0xA001 else: crc >>= 1 return crc def send_pid_value(bus, device_id, reg, value): """Отправка коэффициента PID на устройство""" # Формируем CAN ID для записи: (device_id << 4) | REG_WRITE can_id_write = (device_id << 4) | REG_WRITE # Упаковываем значение в байты (little-endian) float_bytes = struct.pack('