Arduino UNO и MCP2515 CAN

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:

потом засниму видео последовательность действий. Ну блин чудес то не бывает. Специально на другом компьютере попробую.

настройка КанХакера

127486
Offline
Зарегистрирован: 15.02.2018

Спасибо за видюху. Но при компилляции у меня выдает вот такую ошибку((

MaksVV
Offline
Зарегистрирован: 06.08.2015

на рисунке вообще ничего не видно. возможно не весь скетч скопировали - скобку забыли или нечаяно в уже скопипащенном поправили чёто. Все должно компилироваться, чудес не бывает, тем более при снятии видео очередной раз проверил. 

127486
Offline
Зарегистрирован: 15.02.2018

MaksVV пишет:

на рисунке вообще ничего не видно. возможно не весь скетч скопировали - скобку забыли или нечаяно в уже скопипащенном поправили чёто. Все должно компилироваться, чудес не бывает, тем более при снятии видео очередной раз проверил. 

 

Действительно картинка по дурацки закрузилась. 
Перезалил. 
Я уже неоднократно пробовал этот код. 
Всегда эта ошибка. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

давайте весь код сюда, ктото из нас лукавит)) версию иде и какая у вас ардуино. а то щас выяснится что вавгат или леонардо например. 

127486
Offline
Зарегистрирован: 15.02.2018

MaksVV пишет:

давайте весь код сюда, ктото из нас лукавит)) версию иде и какая у вас ардуино. а то щас выяснится что вавгат или леонардо например. 

 

Ардуинка Nano. Также пробовал на Due и Mega.

 

#include <can.h>
#include <mcp2515.h>

#include <CanHacker.h>
#include <CanHackerLineReader.h>
#include <lib.h>

#include <SPI.h>
#include <SoftwareSerial.h>

const int SPI_CS_PIN = 10;
const int INT_PIN = 2;

const int SS_RX_PIN = 3;
const int SS_TX_PIN = 4;

CanHackerLineReader *lineReader = NULL;
CanHacker *canHacker = NULL;

SoftwareSerial softwareSerial(SS_RX_PIN, SS_TX_PIN);

void setup() {
    Serial.begin(115200);
    while (!Serial);
    SPI.begin();
    softwareSerial.begin(115200);

    Stream *interfaceStream = &Serial;
    Stream *debugStream = &softwareSerial;
    
    
    canHacker = new CanHacker(interfaceStream, debugStream, SPI_CS_PIN);
    //canHacker->enableLoopback(); // uncomment this for loopback
    lineReader = new CanHackerLineReader(canHacker);
    
    pinMode(INT_PIN, INPUT);
}

void loop() {
    CanHacker::ERROR error;
  
    if (digitalRead(INT_PIN) == LOW) {
        error = canHacker->processInterrupt();
        handleError(error);
    }

    error = lineReader->process();
    handleError(error);
}

void handleError(const CanHacker::ERROR error) {

    switch (error) {
        case CanHacker::ERROR_OK:
        case CanHacker::ERROR_UNKNOWN_COMMAND:
        case CanHacker::ERROR_NOT_CONNECTED:
        case CanHacker::ERROR_MCP2515_ERRIF:
        case CanHacker::ERROR_INVALID_COMMAND:
            return;

        default:
            break;
    }
  
    softwareSerial.print("Failure (code ");
    softwareSerial.print((int)error);
    softwareSerial.println(")");

    digitalWrite(SPI_CS_PIN, HIGH);
    pinMode(LED_BUILTIN, OUTPUT);
  
    while (1) {
        int c = (int)error;
        for (int i=0; i<c; i++) {
            digitalWrite(LED_BUILTIN, HIGH);
            delay(500);
            digitalWrite(LED_BUILTIN, LOW);
            delay(500);
        }
        
        delay(2000);
    } ;
}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

я хз , у меня все компилируется. версия arduino IDE ? комп перезагрузите

b707
Offline
Зарегистрирован: 26.05.2017

127486 - вставьте на строчку 21 ( перед началом процедуры setup() )

void handleError(const CanHacker::ERROR error);

 

127486
Offline
Зарегистрирован: 15.02.2018

Я уже начал думать что проблема скорее всего в моем ДНК.  Чтобы эту проверить, перегружаю 2 компа, на них IDE 8 и 6 стоит, ни че по итогу не компилиться.  С этой информацией пришел домй, взял вшатанный  и еле живой ноут.
И на нем все компилится.
Как мне теперь теперь с этим жить))))

В понедельник его притащу на работу и попробую в связке с железом.  

 

Всем спасибо за помощь.

Отличных выходных .
 

 

b707
Offline
Зарегистрирован: 26.05.2017

Вы мою строчку добавили? С ней все должно компилится на любом компе.
Проблема выеденного яйца не стоит :)

127486
Offline
Зарегистрирован: 15.02.2018

b707 пишет:

127486 - вставьте на строчку 21 ( перед началом процедуры setup() )

void handleError(const CanHacker::ERROR error);

 

 

Ага, с твоей строчкой все компилится на всех машинах и версиях. 

Спасибо добрый человек. 

127486
Offline
Зарегистрирован: 15.02.2018

Урааааааааа.
Все работает. 
Всем спасибо. 

b707
Offline
Зарегистрирован: 26.05.2017

127486 пишет:

[Ага, с твоей строчкой все компилится на всех машинах и версиях.

Пожалуйста!

Ошибка известная. По правилам С/С++ каждая процедура и функция должна быть обьявлена до первого использования. А в вашем коде описание handleError() находится после loop(), где эта функция вызывается. Можно было просто переставить всю функцию handleError выше loop(), но иногда это невозможно. Проще добавить предварительное обьявление функции - эту самую строчку.

В некоторых версиях Ардуино ИДЕ добавляет такие обьявления сама, за пользователя, в других выдает ошибку - поэтому в некоторых версиях код компилировался, в некоторых нет.

MaksVV
Offline
Зарегистрирован: 06.08.2015

спасибо за ликбез, я этого не знал. нужно всё таки найти время почитать умные книжки по программированию. 127486 отпишись как канхакер на ардуино будет на машине работать. Будут ли приниматься все пакеты. А то у меня при подключении к реальной шине на автомобиле, пакеты принимались не все - многие терялись. 

127486
Offline
Зарегистрирован: 15.02.2018

MaksVV пишет:

спасибо за ликбез, я этого не знал. нужно всё таки найти время почитать умные книжки по программированию. 127486 отпишись как канхакер на ардуино будет на машине работать. Будут ли приниматься все пакеты. А то у меня при подключении к реальной шине на автомобиле, пакеты принимались не все - многие терялись. 

 

Ну к самой машине я могу гдето через недельку подключиться. 
А так у меня панель приборов лежит для этого и ЭБУ, все читаеться. 
 

Cho1s
Offline
Зарегистрирован: 26.07.2017

MaksVV пишет:
И по юсб с канхакером работает? Может есть нюансы какие с этим nodemcu да и вообще с esp. Я с ними мало ковырялсо.

Блин, а по юсб с канхакером не работает, вечером гляну какой драйвер подхватывает

Пысы

Сегодня заработал и канхакер, правда не спервой попытки

MaksVV
Offline
Зарегистрирован: 06.08.2015

какую прошивку используешь? 

Cho1s
Offline
Зарегистрирован: 26.07.2017

5-ю

son32
Offline
Зарегистрирован: 04.12.2017

Всем доброго времени суток!!! Вопрос пока больше теоретический. В общем на столе мучаю штатный блок управления с авто. И столкнулся с интересной задачей. Значит имею ардуино+mcp2515. Реально ли в скетче настроить фильтр таким образом что бы изменялся только ID а данные как есть отправлялись обратно в can шину. То есть к примеру от бу к ардуино идёт пакет с ID 123 2 FD FC, ардуино его принимает и обратно уже отправляет ID 456 2 FD FC, то есть сами данные FD FC в сообщении транслируются как есть. Эти данные FD FC динамические, могут меняться.
Вопрос пока что в том реально так сделать или нет?
Это нужно для того что бы одна из функций бу работала, типо некой петли данных. Просто до компа в ближайшие день, два, не добраться, а мысль очень мучает.

b707
Offline
Зарегистрирован: 26.05.2017

son32 пишет:
Вопрос пока что в том реально так сделать или нет?

конечно реально, только это не фильтром делается. Принимаете пакет, меняете ID. отправляете обратно.

son32
Offline
Зарегистрирован: 04.12.2017

Спасибо, понял буду пробовать. Просто для меня понятно как задавать сообщения кан допустим при нажатии на кнопки, а тут чтобы считывать и обратно эти значения отправлять как то сложновато. Но буду пробовать, а там видно будет.

MaksVV
Offline
Зарегистрирован: 06.08.2015

берёте два примера  из библиотеки read и write , соединяете эти два скетча.  Немного поправив : при получении сообщения правите ID и тут же отправляете . 

nvs48
Offline
Зарегистрирован: 26.09.2019

Здравствуйте!

Помогите в таком моменте: я использую arduino nano и mcp2515 (8 МГц). Удалил все библиотеки, поставил из 236 сообщения. Заливаю скетч из №240 сообщения. Данные идут. Хочу загнать их в canhacker. Заливаю скетч из 248 сообщения - тишина. 

В чем может быть дело?

MaksVV
Offline
Зарегистрирован: 06.08.2015

данные идут откуда и куда? В программе кан хакер точно все настройки правильные ? видео смотрели #351?

nvs48
Offline
Зарегистрирован: 26.09.2019

за видео огромное спасибо. дело оказалось в галочке listen only. почему-то она дурно влияет на отображение данных.

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV пишет:

берёте два примера  из библиотеки read и write , соединяете эти два скетча.  Немного поправив : при получении сообщения правите ID и тут же отправляете . 

Спасибо, сегодня наверное доберусь до компа буду пробовать!!!

lex2k
Offline
Зарегистрирован: 17.12.2015

вобщем эксперементировал с canhacker и одной ардуинкой на передатчике с скечем CAN_write из библиатеки. кварц 8 Мгц. библиатеки и скеч canhacker взяты из #3. Короче результаты такие

при

void loop()

{

  mcp2515.sendMessage(&canMsg1);delay(1);

 
}
canhacker не фига не ловит,
 
при 

mcp2515.sendMessage(&canMsg1);delay(2);

иногда при соединении че то хватает

при

mcp2515.sendMessage(&canMsg1);delay(3);
 
прием идет нормально при скоростях 100 500 1000 KBPS
 
думаю причина  как говорил MaksVV  в #12

<<другой вопрос если кан шина сильно нагружена, то ардуина может не успевать принимать и/или отправлять все сообщения. Т.е. могут быть пропуски  сообщений , особенно на скоростях 500 кбит/с.  Слабоват для этого МК ардуино. Такие вещи обычно на STM32 собирают. Но надо пробовать, может и дуня справится >>

похоже не справляется

MaksVV
Offline
Зарегистрирован: 06.08.2015

ну бомбить в шину раз 1мс это моветон. А то, что при сниффе реальной шины 500 кбит/с в автомобиле ардуино_канхакером есть пропуски,  это да, проверено. 

повторяю. ардуино_канхакер идеально подходит для анализа собственной кан шины, аля умный дом и прочее. Для работы с автомобилем лучше использовать stm32 или уже готовые варианты анализаторов шины (я их выше приводил). 

lex2k
Offline
Зарегистрирован: 17.12.2015

 Макс на stm32  проэкты канхакера кинь ссылку пожалуйста, уже 4 часа перед компом...  в глазах рябит блин

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

эммм, нету такого. я не встречал в открытых проектах, только покупать готовое устройство 

lex2k
Offline
Зарегистрирован: 17.12.2015

ясно, спасибо за инфу

lex2k
Offline
Зарегистрирован: 17.12.2015
son32
Offline
Зарегистрирован: 04.12.2017

MaksVV пишет:

берёте два примера  из библиотеки read и write , соединяете эти два скетча.  Немного поправив : при получении сообщения правите ID и тут же отправляете . 

В общем попробовал соединить два примера Can "read и write", но так как нуб у меня не получилось так как нужно мне. при отправки в кан ардуинки любого фрейма она отвечает мне в обратку фреймом с нужным мне ID но с данными во фрейме 00(321 8 00 00 00 00 00 00 00 00). а мне необходимо что бы ардуино из всего потока в кан шине реагировала только на один ID(к примеру 123 8 ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ), и данные их этого пакета отправляла обратно в кан шину с другим ID(к примеру 321 8 ХХ ХХ ХХ ХХ ХХ ХХ ХХ ХХ). я понимаю что что то не дописал в скетче, только не хватает знаний что бы понять что именно. посмотрите пожалуйста скетч, ткните нососм что не так сделал.

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg1;
struct can_frame canMsg2;

MCP2515 mcp2515(10);

void setup() {
  canMsg1.can_id  = 0x123;
  canMsg1.can_dlc = 8;
  canMsg1.data[0];
  canMsg1.data[1];
  canMsg1.data[2];
  canMsg1.data[3];
  canMsg1.data[4];
  canMsg1.data[5];
  canMsg1.data[6];
  canMsg1.data[7];
  
  canMsg2.can_id  = 0x321;
  canMsg2.can_dlc = 8;
  canMsg2.data[0];
  canMsg2.data[1];
  canMsg2.data[2];
  canMsg2.data[3];
  canMsg2.data[4];
  canMsg2.data[5];
  canMsg2.data[6];
  canMsg2.data[7];
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_250KBPS);
  mcp2515.setNormalMode();
  
 Serial.begin(9600);
 SPI.begin();
}

void loop() {
  if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK)
        mcp2515.sendMessage(&canMsg2);

}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

между строками 41 и 42 вставить canMsg1.can_id  = 0x321;

 в строке 42 canMsg2 исправить на canMsg1.

Убрать всё, что касается canMsg2

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV пишет:

между строками 41 и 42 вставить canMsg1.can_id  = 0x321;

 в строке 42 canMsg2 исправить на canMsg1.

Убрать всё, что касается canMsg2

Спасибо большое!!! Сегодня попробую!!!

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV

В общем фактически получилось то что мне нужно. но есть один момент. Сообщение в кан с нужным мне ID от ардуино поступает постоянно с периодом в 1мс, а не тогда когда к нему приходит нужное сообщение, и не важно получило оно нужное сообщение или нет. А если получает то данные в сообщении транслирует исправно. пробовал создать условие но получается каша и ни чего не работает.

это рабочий скетч, где постоянно идут сообщения от ардуино

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg1;

MCP2515 mcp2515(10);

void setup() {
  canMsg1.can_id  = 0x123;
  canMsg1.can_dlc = 8;

  mcp2515.reset();
  mcp2515.setBitrate(CAN_250KBPS);
  mcp2515.setNormalMode();
  
 Serial.begin(9600);
 SPI.begin();
}

void loop() {
  if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK)
      mcp2515.sendMessage(canMsg1.can_dlc);
      canMsg1.can_id  = 0x321;
      mcp2515.sendMessage(&canMsg1);
}

подскажите пожалуйста как создать условие что бы ардуино отправляла сообщение 321 только тогда когда она приняло сообщение 123

MaksVV
Offline
Зарегистрирован: 06.08.2015
#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg1;
MCP2515 mcp2515(10);

void setup() 
{
  SPI.begin();
  canMsg1.can_id  = 0x123;
  canMsg1.can_dlc = 8;
  mcp2515.reset();
  mcp2515.setBitrate(CAN_250KBPS);
  mcp2515.setNormalMode();
}

void loop() 
{
  if (mcp2515.readMessage(&canMsg1) == MCP2515::ERROR_OK && canMsg1.can_id  == 0x123)
      {
         canMsg1.can_id  = 0x321;
         mcp2515.sendMessage(&canMsg1);
      }
}

 

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV, Спасибо огромное, от души!!! Работает супер. Доберусь до блока буду пробовать)))

Nosferatuta
Offline
Зарегистрирован: 08.07.2017

Доброго времени суток.
На данный момент с помощью Arduino nano, CAN_MCP2515 и Canhacker удается принимать и посылать информацию на машину. Но я хочу без Canhacker отправить одинаковые сообщения, нашёл скетч, но не полный, то есть не видно что в начале кода написано)) Может у кого есть подобный скетч?

b707
Offline
Зарегистрирован: 26.05.2017

Nosferatuta пишет:
Доброго времени суток. На данный момент с помощью Arduino nano, CAN_MCP2515 и Canhacker удается принимать и посылать информацию на машину. Но я хочу без Canhacker отправить одинаковые сообщения, нашёл скетч, но не полный, то есть не видно что в начале кода написано)) Может у кого есть подобный скетч?
в примерах библиотеки есть отправка и прием

Nosferatuta
Offline
Зарегистрирован: 08.07.2017
#include <SPI.h>
#include <mcp2515.h>

const int SPI_CS_PIN = 10;
const int INT_PIN = 2;

#define CAN0_INT 2                              // Set INT to pin 2
MCP_CAN CAN0(10);                               // Set CS to pin 10

void setup()
{
  Serial.begin(115200);
    
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)
        Serial.println("MCP2515 Initialized Successfully!");
  else
        Serial.println("Error Initializing MCP2515...");
  CAN0.setMode(MCP_NORMAL);
}

byte data[8] = {0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}

void loop()
{
  byte sndStat = CAN0.sendMsgBuf(0x580, 0, 8, data);
  if(sndStat == CAN_OK){
    Serial.println("Message Sent Successfully!");
  } else {
    Serial.println("Error Sending Message...");
    
  } delay(100); //Send data per 100ms
}

 

Nosferatuta
Offline
Зарегистрирован: 08.07.2017

Как здесь спрятать код?

b707
Offline
Зарегистрирован: 26.05.2017

Nosferatuta пишет:

Как здесь спрятать код?

При вставке кода вкладка "Дополнительно" - "Сворачивать код по умолчанию"

Но для кода в 30 строк это не актуально

Nosferatuta
Offline
Зарегистрирован: 08.07.2017

b707 пишет:

Nosferatuta пишет:

Как здесь спрятать код?

При вставке кода вкладка "Дополнительно" - "Сворачивать код по умолчанию"

Но для кода в 30 строк это не актуально

Спасибо! 

Вот что пишет при проверке кода

Arduino: 1.8.10 (Windows 10), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"

C:\Users\Nosferatu\Desktop\My_ODO_Sketch\My_ODO_Sketch.ino: In function 'void setup()':

My_ODO_Sketch:6:6: error: 'CAN0' was not declared in this scope

   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

      ^~~~

C:\Users\Nosferatu\Desktop\My_ODO_Sketch\My_ODO_Sketch.ino:6:6: note: suggested alternative: 'CAL0'

   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

      ^~~~

      CAL0

My_ODO_Sketch:6:17: error: 'MCP_ANY' was not declared in this scope

   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

                 ^~~~~~~

My_ODO_Sketch:6:26: error: 'CAN_500KBPS' was not declared in this scope

   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

                          ^~~~~~~~~~~

My_ODO_Sketch:6:39: error: 'MCP_8MHZ' was not declared in this scope

   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

                                       ^~~~~~~~

My_ODO_Sketch:6:52: error: 'CAN_OK' was not declared in this scope

   if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

                                                    ^~~~~~

My_ODO_Sketch:11:3: error: 'CAN0' was not declared in this scope

   CAN0.setMode(MCP_NORMAL);

   ^~~~

C:\Users\Nosferatu\Desktop\My_ODO_Sketch\My_ODO_Sketch.ino:11:3: note: suggested alternative: 'CAL0'

   CAN0.setMode(MCP_NORMAL);

   ^~~~

   CAL0

My_ODO_Sketch:11:16: error: 'MCP_NORMAL' was not declared in this scope

   CAN0.setMode(MCP_NORMAL);

                ^~~~~~~~~~

C:\Users\Nosferatu\Desktop\My_ODO_Sketch\My_ODO_Sketch.ino: At global scope:

My_ODO_Sketch:16:1: error: expected ',' or ';' before 'void'

 void loop()

 ^~~~

exit status 1
'CAN0' was not declared in this scope

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Вместо библиотеки mcp2515.h поставьте mcp_can.h

Nosferatuta
Offline
Зарегистрирован: 08.07.2017

Если сказать коротка, хочу отправить данные в формате ID XXX, DLC 8, DATA XX XX XX XX XX XX XX XX, Period XXX. 

Nosferatuta
Offline
Зарегистрирован: 08.07.2017

b707 пишет:

Вместо библиотеки mcp2515.h поставьте mcp_can.h

Спасибо! Кажется получается)), но теперь пишет error: expected ',' or ';' before 'void'

Arduino: 1.8.10 (Windows 10), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"

Can_Send:23:1: error: expected ',' or ';' before 'void'

 void loop()

 ^~~~

Несколько библиотек найдено для "SPI.h"
 Используется: C:\Program
Несколько библиотек найдено для "mcp_can.h"
 Используется: C:\Users\Nosferatu\Documents\Arduino\libraries\arduino-can-bus-library-master
exit status 1
expected ',' or ';' before 'void'

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"

ставил ; после byte data[8] = {0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, теперь без ошибок, теперь надо проверить. Спасибо!

Но мне не понятно вот эти данные byte data[8] = {0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

У меня данные например ID 3E9, DLC 8, DATA 04 2E 05 09 00 00 00 00.
В коде 
byte data[8] = {0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void loop()
{
  byte sndStat = CAN0.sendMsgBuf(0x580, 0, 8, data);

Как правильно вводить? Вот так можно?

byte data[8] = {0x04, 0x2E, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00};

void loop()
{
  byte sndStat = CAN0.sendMsgBuf(0x3E9, 0, 8, data);

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Nosferatuta пишет:

Как правильно вводить? Вот так можно?

byte data[8] = {0x04, 0x2E, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00};

void loop()
{
  byte sndStat = CAN0.sendMsgBuf(0x3E9, 0, 8, data);

 

 

да. можно. Мож вам книжку какую прочитать по программировани.? - а то больно уж вопросы детские

sadman41
Offline
Зарегистрирован: 19.10.2016

Так нужно.

son32
Offline
Зарегистрирован: 04.12.2017

MaksVV, можно к вам ещё раз обратиться за помощью?
Тот скетч который вы ранее для меня написали работает просто супер, огромное спасибо за него!!!