gifts2017

Подключение к 1С нестандартного оборудования с помощью ардуино

Опубликовал Александр Закиров (sasha777666) в раздел Программирование - Практика программирования

Возможно ли из 1С управлять такими устройствами, как: шлагбаум, домофон, кондиционер, телевизор, холодильник и т.д.? Да - возможно. С помощью микроконтроллера можно управлять любыми устройствами при помощи замыкающих реле, ИК передатчиков и другой периферии. Но как подключить сам контроллер к 1С, чтобы получить функцию, отправляющую данные на МК и возвращающую с него ответ? В этой статье будет описано подключение через юсб интерфейс, а точнее через серийный порт.

Платформа ардуино позволяет подключить к себе практически всё, на просторах интернета можно найти много информации об этом, поэтому мы не будем тратить на это время, а ограничимся 2 компонентами: 1) Реле, 2) ультразвуковой датчик расстояния. На фотографии присутствует ещё сетевой шилд, в нашем случае он не нужен (просто лень было снимать)).

Перед подключением ардуины необходимо установить драйвер CH341SER.EXE (Приложен к статье) либо другой, а для её прошивки нужна ещё среда разработки http://arduino.ru/Arduino_environment.

Итак, ардуина прошита следующим кодом:

    

const int Trig = 22; // Пин для подачи 5 вольт на уз датчик расстояния
  const int Echo = 23; // Пин для приёма информации о расстоянии
   char s[3];          // Для хранения команды полученной из 1С 
   int i=0;            // Для счётчика
   unsigned int time_us=0;    // Для хранения длительности импулься в мк сек. полученного с уз датчика
   unsigned int distance_sm=0; // Для хранения расстояния до объекта 

void setup()                    
{
 Serial.begin(9600);      //установка порта на скорость 9600 бит/сек
 pinMode(7, OUTPUT);       // Пин 7 используем для управления реле (5 вольт - реле включено, 0 - выключено)
 pinMode(Trig, OUTPUT);    
 pinMode(Echo, INPUT);   
}

void loop()
{  
  s[0] = '0';  // При каждой итерации обнуляем переменные
  i=0;

 while (Serial.available() > 0) // Пока в буфере серийного порта есть данные - читаем
    {  
      s[i]=Serial.read();  // Записываем их в S, в нашем случае команда занимает 1 символ, 2-й перенос строки, 3 - на всякий случай))
      i++;
       if (i>=3) break;
    }
    
     if (s[0] == '1') {delay(5);         // Если получена команда 1 то управляем реле
        if (digitalRead(7) == 1) {digitalWrite(7, LOW);Serial.print('1'); } // Проверяем состояние, если включено выключаем и отправляем ответ 1
       else {digitalWrite(7, HIGH);Serial.print('2');}}  // Если выключено - включаем и отправляем ответ 2 

 else  if (s[0] == '2') {delay(5);              // Если получена команда 2 измеряем расстояние   
       digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
      delayMicroseconds(10); // Удерживаем 10 микросекунд
      digitalWrite(Trig, LOW); // Затем убираем
      time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
      distance_sm=time_us/58; // Пересчитываем в сантиметры
      Serial.print(distance_sm); // Выводим на порт
     }
}




Теперь 1С. Для отправки данных достаточно использовать метод "ЗаписьТекста", пишем напрямую в ком порт:

 Команда = 1; // 1- для реле, 2- для датчика расстояния 
 модемЗ = Новый ЗаписьТекста("\\.\Com5",КодировкаТекста.ANSI);    
 модемЗ.ЗаписатьСтроку(Команда + Символы.ПС);        
 модемЗ.Закрыть();



Ответ получаем с помощью "ЧтениеТекста", делаем всё аналогично:

 

МодемЧ= Новый ЧтениеТекста();    
   МодемЧ.Открыть("\\.\Com5",КодировкаТекста.ANSI);
   
     // важный момент, если вместо ответа выполучаете "", Неопределено - это значит ком порт не успевает 
     // после открытия записать получанные данные в буфер, поэтому делаем в этом месте небольшую задержку 
     // 15 миллисекунд хватит. Раскомментировать следующие 3 строчки в случае проблемы
 // т = ТекущаяУниверсальнаяДатаВМиллисекундах() + 15;  // Задержка 15 миллисекунд
 // Пока т > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл  // Все супер-пупер проффи с чрезвычайно прямыми руками
 // КонецЦИкла;   // идут лесом!!!  и нечего срать в комментариях коль по делу сказать нечего

   Ответ= МодемЧ.ПрочитатьСтроку();  // Читаем буфер ком порта
   модемЧ.Закрыть();



Ну вроде бы и всё, но есть НО, очень большое НО. Ком порт должен быть проинициализирован!
Про то, как это сделать, есть много статей, однако все они довольно сложные, поэтому ниже будет предложен более
простой вариант (Все супер-пупер проффи с чрезвычайно прямыми руками идут лесом!!!).
При первом обращении к ком порту необходимо установить некоторые параметры в регистрах контроллера. В типовых
конфигурациях 1С есть встроенные драйвера для тестирования фискального оборудования, они находятся в общих макетах в виде двоичных данных. Один из них - ДрайверАТОЛФискальныеРегистраторы, его мы и будем использовать (файл приложен к статье, также его можно взять из типовой конфигурации). С помощью этой компоненты мы протестируем наш контроллер, результат, естественно, будет отрицательным, ведь у нас ардуино, а не АТОЛ, но во время теста драйвер установит все нужные параметры.
Итак, драйвер залит в макет в виде двоичных данных:

  

  НомерКомПорта = 5;
    ПодключитьВнешнююКомпоненту(ПоместитьВоВременноеХранилище(ПолучитьМакет("ДрайверАТОЛФискальныеРегистраторы")), "АтолУниверсальный");
    ОбъектДрайвера = Новый ("AddIn.АтолУниверсальный.ATOL_KKM_1C82");
    ОбъектДрайвера.УстановитьПараметр("BaudRate", 7);     // цифра 7 означает скорость 9600
    ОбъектДрайвера.УстановитьПараметр("PortNumber", 1000 + НомерКомПорта);
    ОбъектДрайвера.ТестУстройства(,);

 
Ну вот и всё.

 

ПС  Часть материала позаимствована с просторов интернета

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
777.zip
.zip 1,39Mb
19.04.15
18
.zip 1,39Mb 18 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Ангел В (AngelVIII) 19.04.15 22:24
Прикольно, конечно!
только бы придумать, как это применить...
sasha777666; +1 Ответить 1
2. Алексей Ко (Жолтокнижниг) 20.04.15 10:02
Ардуин добрался до 1с, точнее 1с до него)))
sasha777666; +1 Ответить
3. Ruslan (flyer) 20.04.15 10:18
надо взять на заметку. хорошая идея
Atori-kun; sasha777666; +2 Ответить
4. Руслан Жданов (Atori-kun) 20.04.15 11:44
В голове родилась мысль навесить ардуинку на ДО для оповещения о поступившей задаче. Чую кто то мне ближайшие выходные испортил...
veretennikoff; +1 Ответить 1
5. борян петров (TODD22) 20.04.15 11:50
6. Руслан Жданов (Atori-kun) 20.04.15 12:33
(5) TODD22, Сори, по привычке написал. ДО - Документооборот
7. борян петров (TODD22) 20.04.15 12:58
(6) Atori-kun, Для этих целей люди прикручивают всякие WhatsApp и итд.

8. q_i 20.04.15 16:26
Занятно ))
Есть только одно замечание:
s[i]=Serial.read(); // Записываем их в S, в нашем случае команда занимает 1 символ, 2-й перенос строки, 3 - на всякий случай))

Символы.ПС занимает 2 байта (0xOD 0x0A), поэтому не на "всякий случай", а как раз чтобы вся строка поместилась в буфер (если бы буфер был объявлен как s[2], то вместо следующей команды Вам приходило бы "0x0A <код-следующей-команды>"). Да и вообще - а нужен ли этот перевод строки? Его наличие в Вашем коде нигде не проверятся и не обрабатывается. Может его вообще убрать? Пусть будет просто "char cmd = 0"; Прочитал однобайтовую команду ("cmd = Serial.read()") и сразу выполнил ("if (cmd == '1') ..."; кстати, имхо тут был бы уместен switch/case, но это уже дело вкуса).
9. Stanislav Fedorenko (Simon14) 20.04.15 17:08
Только недавно с ардуинкой баловался не думал что можно с 1 с связать. но на практике что полезного в этом пока не приодит на ум
10. борян петров (TODD22) 20.04.15 17:17
(9) Simon14, Можно например с каким нибудь производственным оборудованием связать. Но профита маловато. Так если только побаловаться.
11. Николай Гусев (GusevNA) 20.04.15 22:15
Спасибо за пост, давно хотел поковыряться с Ардуино, а тут уже код для 1С готов.
12. uriy uriy (uriy) 20.04.15 23:35
Статейка понравилась, И даже есть с десяток идей где можно это применить.
13. Александр Закиров (sasha777666) 21.04.15 01:15
(8) q_i, В начале у меня и было без него, однако происходили зависания на стороне 1с, после добавления ПС проблема исчезла, в чём причина разбираться не стал.
14. eugenie zheludkov (eugeniezheludkov) 21.04.15 03:46
все портит внешняя компонента.
кстати, а что если учесть (статистику) настройки большинства портов в винде по умолчанию, в коде ардуинки сразу это учесть "Serial.begin(115200);"
и попытаться работать без внешней компоненты? ардуинка дома, 1с на работе , думаю завтра это дело и проверю если не забуду :)
15. Александр Закиров (sasha777666) 21.04.15 04:57
(14) eugeniezheludkov, Соединение через юсб интерфейс само по себе является недостатком из-за необходимости наличия компьютера в радиусе 5 метров, на ардуине можно поднять веб сервер и подключаться по хттп через сеть. При этом не используя внешние компоненты, думаю на выходных начну статью про такой способ связи.
veretennikoff; Atori-kun; +2 Ответить 1
16. Руслан Жданов (Atori-kun) 21.04.15 05:06
(7) TODD22, Ну такие месенжеры внешним оборудованием управлять не смогут, а вот какую нибудь игрушку на данном примере замутить можно. Но это действительно пока только поиграться - реальных (нужных) для себя вещей пока не придумал.
17. Руслан Жданов (Atori-kun) 21.04.15 05:08
(15) sasha777666, Ждем с нетерпением)
18. eugenie zheludkov (eugeniezheludkov) 21.04.15 09:53
(16) Atori-kun, у мня как то была задача сделать на каждое рабочее место две хардовые кнопки ("нравится обслуживание"/"не нравится") там правда заказчик заранее купил usb-gpio девайс с 30 gpio поэтому пришлось один из компьютеров запустить в роли сервиса с него тянется паутина проводов к кнопкам, на компе работает программа на C++ которая в 1С отсылает данные через WebService, дурняк короче , дешевле было отдельными девайсами теми же ардуинками или esp8266 (по 1$ за штуку при покупке оптом и провода не нужны их в сеть wifi загоняешь и на батарейках)
Atori-kun; +1 Ответить
19. Алексей Гладких (revned) 21.04.15 12:38
Интересно! Честно говоря, даже и не думал, что можно к 1С ардуино подключать. А оказывается ничего сложного и нет.
20. Artem Kolos (Rokstedi) 21.04.15 14:35
Хорошая идея! Когда то игрался с attiny и 1с. Для мигания лампочкой такого наворотил, писал внешнюю компоненту, которая читает из порта... мда. Оказывается все намного проще. Спасибо, добавлю в закладки.
21. Сергей Блинов (BlinOFF) 22.04.15 08:25
(1) AngelVIII,
Бить током бухов, если что-то неправильно делают )))
AVBachurin; shard; karpik666; uriy; AngelVIII; Atori-kun; bbbsss; veretennikoff; +8 Ответить 1
22. Сергей Артюхов (Serg3141) 22.04.15 08:56
А если для работы с сом-портом использовать, к примеру, http://x-romix.narod.ru/vk_rs232_hex.zip, не будет ли проще? С помощью этой компоненты вполне нормально можно с последовательным портом работать.
23. Александр Журба (Starky) 22.04.15 09:13
Интересно! Я как-то подключал к 1с GPS приемник-логгер с USB интерфейсом. Читал в 1с поток текущих данных, парсил и показывал на карте текущее местоположение. Бухи сидящие со мной в одном кабинете смотрели на меня очень удивленно ))).
Но идея с веб обработчиком и хттп на ардуино, более удобна в плане ухода от лишних проводов.
24. Steve Gordon (SGordon1) 22.04.15 09:35
драйвер CH341SER.EXE - от дешевого китайского клона ардуины. Если у вас настоящий аппарат то драйвера там соответсвенно другие ... А в новых версиях платформы 1с нет функций , способных читать из COM как из файла?
25. Андрей Кузнецов (13jaguar) 22.04.15 09:59
Спасибо, это интересно. А еще интереснее работа с Arduino (или в моем случае с Cubieboard2) через порт Ethernet.
26. Кирилл Бондаренко (karapuzzzz) 22.04.15 11:05
Последовательный порт вообще очень универсальная вещь. Все, что использует его можно прикрутить к 1С. И будь-то ардуинка или станок ЧПУ уже не важно. Все дело в прослойке между COM и 1С. Я для таких проектов использую шаблон на C# для внешних компонет и логику работы прописываю там.
Вот пример:
Библиотека классов для создания внешней компоненты 1С на C#
27. Andrey Sergeevichev (claymen) 22.04.15 11:34
Управляйте лифтами, атомными станциями и самолетами!!! =))))))
Ардуино это с ребенком собирать робота... с напряжением не больее 12 вольт.

Господа!!! Не морочьте людям голову...
Разработка на ардуино устройства которое не залипнет не зависнет выйдет в разы дороже готовых промышленных решений.
Хотите Из 1С свет включать во всем задании, или еше чего Вот модуль с Реле на выход , где ничего не залипнет и не устроит пожар на объекте
http://insat.ru/prices/info.php?pid=5619
Уже с Ethernet и работает как через WEB так и по стандартизированному протоколу Modbus. Разбираться в нем 1-2 часа от силы...
И таких решений уже очень много все придумано!
Ценник сопоставимый...
А цена самоделки может стоить пожара или жизней ...
28. Andrey Sergeevichev (claymen) 22.04.15 11:38
29. Александр Закиров (sasha777666) 22.04.15 12:12
(27) claymen, и сколько тебе известно случаев пожара из-за ардуины? По поводу надёжности у неё конечно не всё хорошо, но не настолько, чтобы устроить пожар... и да сторожевой таймер перезагрузит контроллер через 8 секунд в случае зависания.

пс. там 5 вольт, а не 12.
30. Александр Закиров (sasha777666) 22.04.15 12:19
(24) SGordon1, Я всё делал в 8.3. Да ты прав у меня дешёвая китайская подделка... стоп ардуина свободная платформа у неё не может быть подделок :) Контроллеры я заказываю с таобао самые дешёвые, сетевые шилды попадались бракованные, сами ардуины пока, что все работают
31. Павел С (pavel_pss) 22.04.15 15:30
Спасибо классная идея. Надо будет сделать вход начальника в его кабинет только после перечисления ЗП :)
Atori-kun; sasha777666; +2 Ответить
32. Andrey Sergeevichev (claymen) 22.04.15 20:29
(29) sasha777666, Пожары не считал, выгоревшей техники класса LowCost видел много от бытовых автоматов до Сложного сетевого оборудования. И попадания молнии и чего тока не видел...
Ардуино это игрушка! и Все компоненты для нее игрушечные, и все соединения....
Вот вы думаете релюшка чего там сложно, тока поговорите с теми кто их эксплуатирует сколько нюансов, и то что они греются и пригорают и залипают, в ардуино модулях стоят не самые лучшие образцы... Потому как задача одна цена!
Всё просто пока не попробуете.


33. Александр Закиров (sasha777666) 23.04.15 00:49
(32) claymen, пробовал и много, вы видимо по цене судите качестве? подучите немного китайский и вперёд на таобао (сайт внутреннего катайскийого рынка), где быстро убедитесь, что высокая цена это лишь наценка жадных перекупщиков... Вопрос на засыпку, почему по популярности дуина на несколько порядков в переди? ... я верю в естественный отбор, ведь более худшая продукция не может вытеснить с рынка более лучшую, даже если стои дешевле
Atori-kun; +1 Ответить
34. Руслан Жданов (Atori-kun) 23.04.15 09:59
(21) BlinOFF, либо тока не хватит, либо через 2 -3 цикла у них иммунитет выработается... Хотя в заметки поставил)
35. Steve Gordon (SGordon1) 24.04.15 10:01
(30) sasha777666, Т.е. если вместо вот такой ардуины http://arduino.cc/en/uploads/Main/ArduinoNano30Schematic.pdf тебе выдадут какой нить интел , скажут поставь наш соффт и оно на blink.ino замигает светодиодами то это не будет подделкой? А в чем тогда смысл копирайта на схему? Делай свое что хочешь, только не подписывайся нашим названием...
36. Steve Gordon (SGordon1) 24.04.15 10:02
(25) 13jaguar, А какие проблемы с интернетом, вроде полно как стандартных возможностей так и com компонент ...
37. Александр Закиров (sasha777666) 24.04.15 10:36
(35) SGordon1, Ардуина открытая платформа, слово подделка к ней неуместна, мой китайский аналог работает точно так же, только загрузчик другой, поэтому драйвер и выложил, для контроллера со стандартным загрузчиком драйвера установятся вместе со студией.
38. Александр Закиров (sasha777666) 26.04.15 14:30
39. shard (shard) 29.04.15 11:24
В свое время была шутка что к коробочной версии девятой 1С будут прилагаться два usb-манипулятора для чесания пяток бухгалтеру. В каждой шутке есть доля шутки...
sasha777666; +1 Ответить
40. Максим (nikulin76) 06.05.15 08:38
Немного знаком с ардуинкой. И все бы хорошо, НО.
Вот никогда не соглашусь, что 1с должна общаться с ардунькой.
Логично было бы наладить онлайн обмен и накопление информации какой либо резидентной программы в любое хранилище.
а уже 1с периодически общалось бы уже с хранилищем.
Может my-SQL или что либо еще.
Вот это было бы уже взрослое решение.
41. Sergey Andreev (starik-2005) 27.06.15 17:07
В принципе, в Linux нет проблем с инициализацией порта, что крайне радует. Почему-то идея что-то толкать в ардуинку посредством сервера 1С не приходила мне в голову, т.к. есть PHP, Python, bash, sh, + CRONTAB... - мульон всего, но, с другой стороны, в принципе идея имеет право на существование.

Сегодня поэкспериментирую.
42. Артём Ч. (BIK_IT) 08.09.15 14:56
При запуске обработки появляется сообщение Не определен тип: AddIn.ATOL_KKM_1C82. Почему-то процедура ПодключитьВнешнююКомпоненту возвращает ЛОЖЬ... Кто знает?
43. Александр Закиров (sasha777666) 09.09.15 02:25
(42) BIK_IT, Проверь, что внешняя компонента есть в макете в виде двоичных данных
44. Ангел В (AngelVIII) 08.10.15 13:20
прошло уже полгода. Есть какие-то действующие реализованные идеи?
45. Александр Закиров (sasha777666) 09.10.15 02:11
(44) AngelVIII, У меня только возможность открывать замок на входной двери.... не было пока задач где можно было бы использовать это
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа