1С, arduino, http и никаких внешних компонент



Подключение к 1С любого оборудования с помощью ардуины, по локальной сети. Отправка команды, её обработка и получения ответа по хттп.

Итак, в прошлой статье мы рассмотрели подключение устройств через юсб интерфейс. Недостатков данного способа подключения много, а самый главный заключается в небольшом расстоянии, на которое можно удалить устройство от компьютера. В этой статье будет описан способ подключения контроллера к 1С посредством локальной сети или даже интернета.

Начнём, как обычно, с ардуины, нам понадобится:

1. Контроллер ардуино уно (мега, нано или другая), которую можно приобрести на ебее рублей за 500 или нелицензионный китайский аналог за 130 рублей, как у меня.

2. Сетевой шилд.

3. Периферия, в статье рассмотрим реле.

4. Среда разработки http://arduino.ru/Arduino_environment.

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

После распаковки, подключаем обе библиотеки (etherShield, ETHER_28J60) к нашей студии. У меня в версии 1.0.5 это делается через меню «Скетч». Способов связи по сети много, мы выберем самый простой, отправка запроса для загрузки сетевого ресурса. IP ардуины: 192.168.1.17 , запрос будет следующим: 192.168.1.17/1  — 1 это ресурс, который мы хотим загрузить, ардуина будет воспринимать его как команду (1- выключить, 2 — включить). В ответ на такой запрос сервер отправляет хтмль код страницы, код нашей страницы будет состоять из одной цифры (0,1 или 2) — 1С будет воспринимать его как ответ о выполнении.

После подключения библиотек прошиваем контроллер следующим скетчем:

#include "etherShield.h"  // подключаем библиотеки
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x25}; // мак адрес устройства
static uint8_t ip[4] = {192, 168, 1, 17};  // айпи адрес
static uint16_t port = 80;  //порт на котором ардуина ожидает наше подключение

ETHER_28J60 ethernet; // создаём обект сервера

void setup()
{
ethernet.setup(mac, ip, port); // инициализируем наш сервер
pinMode(7, OUTPUT);             // к 7 пину подключено реле, назначаем его для вывода
}

void loop()
{
char* params;                              // переменная для хранения полученного запроса
if (params = ethernet.serviceRequest())    //Если чтото пришло, то считываем и выполняем код
{
if(params[0] == '1'){   // Если пришла команда 1 то ...
digitalWrite(7, LOW);   // выключаем реле
ethernet.print("1");   // отправляем ответ "1"
}
else if(params[0] == '2'){   // иначе если пришла команда 2 то...
digitalWrite(7, HIGH);       // включаем реле
ethernet.print("2");         // отправляем ответ "2"
}
else{                        // если пришло чтото другое то...
ethernet.print("0");           // отправляем ответ "0"
}

ethernet.respond();           // отправляем
}

}

Реле подключаем как видно на фото (Vcc — 5v, Gnd — gnd, ctr -7 пин), да чуть не забыл,  пины 4, 10, 11, 12, 13 используются контроллером для связи с сетевым шилдом, так, что ничего к ним не цепляем.

Наша ардуина готова, в браузере можно открыть пустую страницу, и набрать в адресной строке 192.168.1.17/2  — реле должно включиться и вернуть ответ «2», 192.168.1.17/1 — выключиться и вернуть ответ «1». 

 

Приступаем к 1С. Если на ардуине работа с сетью сложнее, чем с ком портом, то со стороны 1С наоборот — проще. Для связи будем использовать HTTPСоединение.

Синтаксис:

Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>)

Из всех возможностей нам понадобится только Сервер и Таймаут, Сервер — наш айпи адрес и порт (192.168.1.17:80), Таймаут — время ожидания ответа (в секундах), проще говоря, сколько секунд будет висеть 1С, если с сетью что-то случится  и ответа не будет.

Код функции 1С:

        АП = "192.168.1.17:80"; // Наш IP адрес и порт, если порт 80 то можно не указывать
Команда = 1 // команда 1 - выключить, 2 - включить

Соединение = Новый HTTPСоединение(АП,,,,,3);  // Цифра 3 - таймаут
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=Windows-1251");
Запрос = Новый HTTPЗапрос("/" + Команда , Заголовки);
ОтветСервера = Соединение.Получить(Запрос);          // Ответ от контроллера
Ответ = ОтветСервера.ПолучитьТелоКакСтроку();    // переводим в строку и получаем код странички

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

Ооо, под рукой у меня оказался ещё ультразвуковой датчик расстояния… ну что ж,  дополним наш скетч работой с ним. На стороне 1С ничего не изменится, только появится новая команда «3» — для измерения расстояния.

УЗ подключаем так: vcc — 5 пин(Либо к 5 вольтам), Gnd — Gnd, Trig — 2 пин, Echo — 3 Пин.

Всё, что я добавил в скетч, пометил // !!!!!!!!!!!!!!!!!!!!!!!!!. Теперь он может работать и с реле, и с УЗ датчиком расстояния

#include "etherShield.h"  // подключаем библиотеки
#include "ETHER_28J60.h"

const int Trig = 2; // !!!!!!!!!!!!!!!!
const int Echo = 3;  // !!!!!!!!!!!!!!!!!
unsigned int time_us=0;  // !!!!!!!!!!!!!!!!!
unsigned int distance_sm=0;  // !!!!!!!!!!!!!!!!!

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x25}; // мак адрес устройства
static uint8_t ip[4] = {192, 168, 1, 17};  // айпи адрес
static uint16_t port = 80;  //порт, на котором ардуина ожидает наше подключение

ETHER_28J60 ethernet; // создаём объект сервера

void setup()
{
ethernet.setup(mac, ip, port); // инициализируем наш сервер
pinMode(7, OUTPUT);             // к 7 пину подключено реле, назначаем его для вывода
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
pinMode(5, OUTPUT);   // так как на уно 5 вольтовый пин один и он занят реле, а УЗ потребляет мало
digitalWrite(5, HIGH);// назначаем 5 пин  для постоянной подачи 5 вольт
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

void loop()
{
char* params;                              // переменная для хранения полученного запроса
if (params = ethernet.serviceRequest())    //Если чтото пришло, то считываем и выполняем код
{
if(params[0] == '1'){   // Если пришла команда 1 то ...
digitalWrite(7, LOW);   // выключаем реле
ethernet.print("1");   // отправляем ответ "1"
}
else if(params[0] == '2'){   // иначе если пришла команда 2 то...
digitalWrite(7, HIGH);       // включаем реле
ethernet.print("2");         // отправляем ответ "2"
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
else if(params[0] == '3'){   // Если получили команду "3" то ....
digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig, LOW); // Затем убираем
time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm=time_us/58; // Пересчитываем в сантиметры
ethernet.print(distance_sm); // возвращаем расстояние в сантиметрах
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
else{                        // если пришло чтото другое то...
ethernet.print("0");           // отправляем ответ "0"
}

ethernet.respond();           // отправляем
}

}

Готово, отправив команду 3, получим расстояние в сантиметрах. Команду также можно отправить из браузера (192.168.1.17/3).

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

 

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

24 Comments

  1. delete

    Крутизна!

    Осталось придумать как это использовать)

    Можете подкинуть примеров?

    Reply
  2. sasha777666

    (1) delete, Автоматизировать систему въезда на склад, клиент подъехал — показал накладную сканеру — 1с обработала, если пустить то — включила лампочку возле специально обученного человека, который нажмёт кнопку открытия ворот.

    Reply
  3. TODD22

    (2) и в чём тут автоматизация?

    Подъехала машина. Показала бумажку специально обученному человеку. Он её отсканировал, 1С показала что всё нормально. Он проехал на склад.

    Зачем промежуточное звено в виде ардуины и лампочки?

    Reply
  4. sasha777666

    (3) TODD22, Специально обученному человеку необязательно быть компетентным в области 1С… загорелась зелёная лампочка — нажал кнопку открыть ворота, красная — кнопку закрыть!

    Reply
  5. flyer

    вот пример можете обсудить:

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

    Reply
  6. TODD22

    (5) flyer, как то сталкивался с задачей управления подачей воды и света в сауны. Оплаченное время вышло отключалась подача воды и освещение переключалось на дежурное. Но для этого купили уже готовую систему. Но как вариант можно было и на ардуино сделать. Но раз есть готовая то не стали изобретать велосипед.

    Reply
  7. sasha777666

    (6) TODD22, во сколько обошлась готовая? кран с сервоприводом включайющий/выключающий стоит от 300 руб… за 1000 можно взять с возможность регулирования напора

    Reply
  8. TODD22

    (7) Не я закупал. Цен точно не скажу. Но этот вариант явно лучше чем пилить свои костыли на ардуинах, контроллерах и тд. Там уже всё в сборе, всё готовое.

    Я сам электронщик по образованию. Но заниматься изобретательством времени нет. Тут всё готовое, подключай и настраивай.

    Reply
  9. sasha777666

    (8) TODD22, Это уже дело каждого, что использовать, ты сэкономил время, другой бы сэкономил финансы организации)) Своя система всегда более совместима, так, что в части «Костыли» не согласен.

    Reply
  10. TODD22

    (9) Учи экономику организации!!!!

    Если сэкономил финансы организации значит ты это сделал за свой счет. Это напоминает «велосипедистов» которые всё пишут сами вместо того что бы купить готовый продукт.

    Ну вот прикинь несколько человек затратили много человеко часов на создание программы(системы и тд не столь важно). Затем они проводили опытную эксплуатацию выявляли ошибки, делали доработки. Повышали качество, производительность, улучшали функциональность. И теперь продают свой продукт за n рублей.

    Если ты садишься делать всё сам то ты должен затратить очень много времени. Ну если есть желание работать много и бесплатно то можешь и сэкономить финансы.

    А так твою работу то же нужно оплачивать. И затратишь ты не мало времени. К тому же никто не застрахован от выбора неверного пути реализации. И потом придётся переделывать.

    Я так предполагаю ты не работал над системами сложнее соединения ардуино и 1С. Когда поработаешь над чем то более сложным. Состоящим не из 100 строк кода и китайской ардуины приходи делись опытом. Подискутируем на эту тему.

    Своя система всегда более совместима, так, что в части «Костыли» не согласен.

    Совместима с чем? С водопроводной трубой?

    И если следовать твоей логике то и ардуино нужно не покупать, а спаять самостоятельно из деталей.

    Reply
  11. sasha777666

    (10) TODD22, 🙂 это тебе не игровой форум с школьниками… на этом подытожим дискуссию.

    Reply
  12. eugeniezheludkov

    (10) TODD22, Иногда велосипедостроение это хорошо!

    Плюсы:

    + это альтернативное решение

    + в итоге увеличивает конкуренцию, а значит снижает цену и повышает качество в этой (скудной) нише на рынке

    + в велосипеде есть возможность обхода некоторых подводных камней если иметь опыт работы с конкурентами, и реализовать некоторые блоки быстрее выше сильнее

    + если компания поверила в вас и доверила вам создание велосипеда, вы прокачиваете свой опыт, что в дальнейшем сказывается и на вашей прибыли.

    Минусы:

    — необходимо напарываться на те же грабли, что и предшественники.

    — время — это очень важный ресурс для компаний (даже больше чем финансы). велосипед строится дольше чем интегрируется готовое решение (если нет четкого ТЗ конечно же)

    ПС: а если по теме то я б использовал ESP8266: плата меньше по размерам, цена всего 1$ если заказать оптом. есть встроенный wifi,linux,lua,nodejs + arduino ide уже их поддерживает как родные т.е проекты с ардуинки можно просто перекомпилить.

    Reply
  13. dddxddd

    (3) TODD22, У того кто нажимает кнопку для проезда на склад, по определению не должно быть 1С. Вот вам и ответ.

    Reply
  14. dddxddd

    (10) TODD22, Своя система всегда лучше совместима с требованиями бизнеса для которого она делалась, правда только в том случае, если эта система была доведена до нормального рабочего состояния.

    Ну и потом, никто не доказал, что покупные изделия, не страдают болезнями недоделок и не штатной работы…

    Reply
  15. TODD22

    (14) dddxddd,

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

    Разговор в первую очередь начался с «экономии финансов».

    Вот я когда такое слышу у меня сразу возникает вопрос: «Тогда за чей счёт делаем?» Где экономия?

    Труд разработчика то же нужно оплатить. Это же затраты времени. Хорошо когда есть тот кто сделает всё бесплатно.

    Но последнее время что то таких всё меньше и меньше… За бесплатно только студенты работают… что бы опыт получить. Но качество, сроки и функциональность того что они делают оставляет желать лучшего.

    Reply
  16. friend0

    (15) TODD22, если человек сидит на окладе, то оплата одинаковая независимо от того что он делает или не делает. А вот как получить от этой оплаты максимум «пользы» для бизнеса — это отдельная тема. И я вполне допускаю, что всякие мелочи типа ардуины могут быть локальным максимумом.

    По части же готовых решений (особенно когда касается 1С) зачастую то что есть пересекается с тем что нужно весьма слабо, да и то что есть «сделано студентами».

    Reply
  17. yermak

    Если бы изготовление вещей на Ардуинке занимало много времени, я бы еще понял весь этот флейм, но там всем очень просто и делается достаточно быстро, причем граблей не так уж и много. Автора однозначно поддерживаю за идею, а в его защиту так же могу сказать следующее:

    1. своя разработка всегда более точно удовлетворяет потребности

    2. найти стороннюю разработку бывает достаточно трудно, не говоря уже о организации которая ее внедрит, и стоить это может намного дороже.

    Reply
  18. dddxddd

    (15) TODD22,

    Разговор в первую очередь начался с «экономии финансов».

    Оплатить умеренные деньги, зарекомендовавшему себя местному кулибину иногда проще и лучше, чем искать брендованное решение требующее допилки до реальных требований. соответствующее. Причем найдя нечто фирменное, Вам предстоит побить стену снобизма продавцов, достучаться до «разработчиков», выслушать тонны «других устраивает» и «у нас есть более важная работа» когда дело то всего, в лампочке зажигаемой охранником.

    Но последнее время что то таких всё меньше и меньше… За бесплатно только студенты работают… что бы опыт получить. Но качество, сроки и функциональность того что они делают оставляет желать лучшего

    Кстати очень интересная тема, в некоторых случаях нанятый на работу студент, при грамотном и воспитании и использовании, оказывается более выгодным приобретением нежели общение с «типа профи за деньги». Слишком много сейчас развелось «проФФессионалов» из поколения менчендайзеров, которые на поверку то оказываются пустым местом «с надутыми щеками».

    Впрочем давайте не будем разводить холивар не по теме.

    (4) Спасибо за идею, вот прямо сейчас, по вашей статье, студент лепит на ардуино, временную замену сгоревшему «фирменному» контроллеру шлагбаума и той самой ЛАМПОЧКЕ, которую тоже надо зажигать в нашем случае.

    Умение нестандартно мыслить и использовать совместно два продукта, вроде как друг для друга не предназначенные — умение, доступное не каждому.

    Reply
  19. allegrosoft

    (1) Вот поделка на ардуино http://www.youtube.com/watch?v=vCrjyyXMd58, если это еще совместить с 1С, может получиться интересный продукт.

    Reply
  20. karapuzzzz

    (10) TODD22, Вор с этим выражением вообще не согласен:

    Если сэкономил финансы организации значит ты это сделал за свой счет.

    Сэкономить можно:

      На бренде
      На лишнем функционале готового решения
      На заложенной в стоимость гиперприбыли как желания разработчиков
      На необходимости все-равно тратить время на работу напильником. Дешевле сделать ремонт, имея голые стены
      На необходимости тратить время на поиск поставщиков, проведение тендеров, тестирование экземпляров

    А нормальное руководство часть сэкономленных средств выдает отличившемуся сотруднику в виде премии.

    Reply
  21. dim369

    Всем привет!

    Я поражаюсь узколобости некоторых товарищей.

    Вы не допускаете мысли, что на форуме могут быть профессиональные разработчики систем контроля доступа? Или систем управления электропитанием? Да чем угодно, что нужно подключать к периферийному оборудованию.

    Причем если к системе управления шлагбаумом могут быть драйвера, то к подавляющему большинству систем управления производственным процессом таких драйверов может и не быть.

    Почему бы таким разработчикам не воспользоваться данной методикой?

    Автору респект!

    Reply
  22. vic_ol

    (10) TODD22, Линус Торвальдс тогда тоже «велосипедист». И что этот студент, и к тому же бесплатно, стал 25 лет назад разрабатывать свою ОС, когда можно было купить что-нибудь из *nix-ов или Windows(Dos)? ( без пафоса и аналогий, просто вспомнилось)

    Автору спасибо! Статья из категории — «это именно то что мне нужно. Просто и удобно. И как я сам до такого не додумался… »

    Reply
  23. yarsort

    (21) dim369, Я тоже так считаю. Иногда даже такие простые решения кому-нибудь могут сєкономить время и деньги, особенно если лень углублятся в тонкости разработки сложного ПО. Мне понравилось. Возьму на заметку… Автору спасибо!

    Reply
  24. galich

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

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *