1С
Итак, система состоит из 3 потоков (сеансов):
1. Поток, который управляет МК по ЮСБ (серийный порт).
2. Поток, который управляет МК, подключенными по сети.
3. Основной поток, осуществляющий обработку логической части кода.
В конфигурации есть 2 регистра сведений, через которые происходит управление микроконтроллерами (COM, NET). А в общем модуле "К" есть большая часть стандартных функций, с помощью которых можно напрямую управлять МК, однако время выполнения значительно дольше времени выполнения этих команд в мк.
Поверхностно систему можно описать следующим образом: регламентное задание с небольшим интервалом проверяет заданные в регистре условия для старта процедур, если условие выполняется, то в отдельном потоке запускается указанная процедура. Процедуры могут напрямую работать с оборудованием с помощью вызова спец. функций из модуля "К".
Процедура запускается спустя 5 секунд после завершения предыдущей итерации. Процедура считывает информацию с датчика температуры и если значение меньше 15 то включает обограветель, если больше 20 - выключает его.
-------------------------------
Исходные данные:
МК висит в диспетчере устройств как COM8
Реле включающее обогреватель подключено к пину 3
Датчитк Температуры DHT11 подключен к пину 4
-------------------------------
//Инициализация
К.ОткрытьCOMПорт(8, 115200);
К.pinMode(8, 3, 1); //переводим 3 пин в состояние OUTPUT
К.pinMode(8, 4, 0); //переводим 4 пин в состояние INPUT
//Код который будет в процедуре вызываемой каждые 5 сек и сеанса основного потока
ДанныеТемпературыИВлажности = К._ТемператураВлажностьDHT11(8, 4);
Если ДанныеТемпературыИВлажности.Температура < 15 Тогда
К.digitalWrite(8, 3, 1); // Включаем реле
ИначеЕсли Если ДанныеТемпературыИВлажности.Температура > 20 Тогда
К.digitalWrite(8, 3, 0); // Выключаем реле
КонецЕсли;
В этом разделе описан процесс протекающий между вызовом функции модуля "К" и выполнением действия микроконтроллером. Для использования конфигурации и разработки своих алгоритмов это знать не обязательно.
Описание функции из модуля "К"
1. Вызываемая из модуля "К" функция в зависимости от типа подключения МК делает запись в регистр сведений COM или NET, после чего подключает компоненту из внешнего макета в которой задействует функцию ожидания. С небольшим интервалом времени она проверяет изменения статуса записанной в регистр команды.
2. В другом потоке (том который работает с МК подключенным по ЮСБ или через сеть) постоянно происходит проверка этого регистра на наличие новых поставленных команд. Когда там появляется новая запись он конвертирует 3 поля (котоыре передаются на МК) в шестнадцатиричный вид и отправляет их в серийный порт или на сетевой адрес (в виде 3 пар байт) с номером указанным в записи регистра, к ним дабавляется 4-я пара байт с контрольной суммой. Далее ожидает ответа от МК с помощью той же компоненты ожидания.
3. Тем временм МК получив код проверяет корректность полученных данных и определяет соответствующую команду которую нужно выполнить (в скетче есть стандартные команды, также есть зарезервированные коды для написания своих алгоритмов). После выполнения МК возвращает ответ и статус выполнения (также добавляется пара байт контрольной суммы).
4. Поток работы с МК получает ответ, проверяет контрольную сумму, конвертирует его в 10-ю систему и записывает в регистр COM или NET.
5. Процедура поставившая задачу в регистр видя, что команда выполнена получает запись, конвертирует коды ответа в адаптированный вид и возвращает в процедуру вызвавшую её.
Для контроллеров подключенных по сети возможно отправить дополнительную информацию.
Пример для кода команды pinMode, последовательно вставлены выполняемые процедуры
// pinMode - (2) Перевести ПИН в состояние INPUT или OUTPUT.
// Возвращает: Истина - Команда выполнена, Ложь - Ошибка, Неопределено - Сбой внутри 1С
// Параметры:
// НомерCOMАдресПорт - Число/Строка - Номер ком порта к которому подключен контроллер или сетевой адрес контроллера (Если Число то COM если Строка то NET)
// НомерПина - Число - Номер пина
// Состояние - Число - Состояние в которое нужно перевести 0=INPUT 1=OUTPUT
Функция pinMode(НомерCOMАдресПорт, НомерПина, Состояние) Экспорт
Попытка
СтруктураОтвета = ВыполнитьКоманду(НомерCOMАдресПорт, НомерПина, 2, Состояние);
Если СтруктураОтвета.КомандаВыполнена И СтруктураОтвета.ОтветСтатус = 254 Тогда
Ответ = Истина;
ИначеЕсли СтруктураОтвета.Ошибка ИЛИ СтруктураОтвета.ОтветСтатус <> 254 Тогда
Ответ = Ложь;
Иначе
Ответ = Неопределено;
КонецЕсли;
Возврат Ответ;
Исключение
ОписаниеОшибки = "Сбой при выполнении функции для команды. Описание ошибки: " + ОписаниеОшибки();
ЗаписьВЖурналОшибок("К", "pinMode", ОписаниеОшибки);
Возврат Неопределено;
КонецПопытки;
КонецФункции
// ВыполнитьКоманду - Выполнить указанную команду.
// Возвращает: Структура с ответом, содержащая ключи: ОтветСтатус, ОтветАргумент, ОтветАргумент2, КомандаВыполнена, Ошибка.
// Неопределено - Ошибка формата переменной.
// Параметры:
// НомерCOMАдресПорт - Число/Строка - Номер ком порта к которому подключен контроллер или сетевой адрес контроллера (Если Число то COM если Строка то NET)
// НомерПина - Число - Номер пина
// Команда - Число - Номер команды которую требуется выполнить
// Аргумент - Число - Аргумент для команды
Функция ВыполнитьКоманду(НомерCOMАдресПорт, НомерПина, Команда, Аргумент) Экспорт
Если ТипЗнч(НомерCOMАдресПорт) = Тип("Число") Тогда // Команда в COM порт
Ответ = ВыполнитьКомандуCOM(НомерCOMАдресПорт, НомерПина, Команда, Аргумент);
ИначеЕсли ТипЗнч(НомерCOMАдресПорт) = Тип("Строка") Тогда // Команда на сетевой адрес
Ответ = ВыполнитьКомандуNET(НомерCOMАдресПорт, НомерПина, Команда, Аргумент);
Иначе // Ошибка первой переменной
Ответ = Неопределено;
ОписаниеОшибки = "Ошибка формата переменной ""НомерCOMАдресПорт"". НомерCOMАдресПорт = """ + Строка(НомерCOMАдресПорт) + """, текущая команда = " + Команда;
ЗаписьВЖурналОшибок("К", "ВыполнитьКоманду", ОписаниеОшибки);
КонецЕсли;
Возврат Ответ;
КонецФункции
// Для COM (МК подключенные через ЮСБ или напрямую)
Функция ВыполнитьКомандуCOM(НомерCOM, НомерПина, Команда, Аргумент)
NativeS = NativeПодключитьКомпоненту();
Если NativeS = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| COM.Команда
|ИЗ
| РегистрСведений.COM КАК COM
|ГДЕ
| COM.НомерCOMПорта = &НомерCOMПорта
| И COM.НомерПина = &НомерПина
| И (НЕ COM.КомандаВыполнена
| ИЛИ COM.ДатаВыполнения > &ТекущаяДатаМинус5Сек)
| И (НЕ COM.Ошибка
| ИЛИ COM.ДатаВыполнения > &ТекущаяДатаМинус5Сек)";
Запрос.УстановитьПараметр("НомерCOMПорта", НомерCOM);
Запрос.УстановитьПараметр("НомерПина", НомерПина);
Запрос.УстановитьПараметр("ТекущаяДатаМинус5Сек", ТекущаяДата()-5);
// Запрос проверяет есть ли в очереди не выполненные задания
// или задания выполненные в течении последних 5 секунд
ВремяПрекращенияОжидания = ТекущаяДата()+15;
Пока НЕ Запрос.Выполнить().Пустой() Цикл // Ждём завершения заданий
Если ТекущаяДата() > ВремяПрекращенияОжидания Тогда // произошёл сбой
ОписаниеОшибки = "Превышен лимит ожидания выполнения команды из очереди перед текущей. Текущая команда = " + Команда;
ЗаписьВЖурналОшибок("К", "ВыполнитьКомандуCOM", ОписаниеОшибки);
Возврат Неопределено;
КонецЕсли;
NativeS.Задержка(30);
Запрос.УстановитьПараметр("ТекущаяДатаМинус5Сек", ТекущаяДата()-5);
КонецЦикла;
Менеджер = РегистрыСведений.COM.СоздатьМенеджерЗаписи();
Менеджер.НомерCOMПорта = НомерCOM;
Менеджер.НомерПина = НомерПина;
Менеджер.Команда = Команда;
Менеджер.Аргумент = Аргумент;
Менеджер.Записать(Истина);
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| COM.Команда
|ИЗ
| РегистрСведений.COM КАК COM
|ГДЕ
| COM.НомерCOMПорта = &НомерCOMПорта
| И COM.НомерПина = &НомерПина
| И (COM.КомандаВыполнена
| ИЛИ COM.Ошибка)";
Запрос.УстановитьПараметр("НомерCOMПорта", НомерCOM);
Запрос.УстановитьПараметр("НомерПина", НомерПина);
// Запрос Проверяет выполнена ли наше задание
ВремяПрекращенияОжидания = ТекущаяДата()+15;
Пока Запрос.Выполнить().Пустой() Цикл // Ждём завершения задания
Если ТекущаяДата() > ВремяПрекращенияОжидания Тогда // произошёл сбой
ОписаниеОшибки = "Превышен лимит ожидания выполнения команды. Текущая команда = " + Команда;
ЗаписьВЖурналОшибок("К", "ВыполнитьКомандуCOM", ОписаниеОшибки);
Возврат Неопределено;
КонецЕсли;
NativeS.Задержка(30);
КонецЦикла;
Менеджер = РегистрыСведений.COM.СоздатьМенеджерЗаписи();
Менеджер.НомерCOMПорта = НомерCOM;
Менеджер.НомерПина = НомерПина;
Менеджер.Прочитать();
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("ОтветСтатус", Менеджер.ОтветСтатус);
СтруктураОтвета.Вставить("ОтветАргумент1", Менеджер.ОтветАргумент1);
СтруктураОтвета.Вставить("ОтветАргумент2", Менеджер.ОтветАргумент2);
СтруктураОтвета.Вставить("КомандаВыполнена", Менеджер.КомандаВыполнена);
СтруктураОтвета.Вставить("Ошибка", Менеджер.Ошибка);
Менеджер.Удалить();
Возврат СтруктураОтвета;
КонецФункции
// Для NET (МК подключённые по сети/вайфай)
Функция ВыполнитьКомандуNET(АдресПорт, НомерПина, Команда, Аргумент)
NativeS = NativeПодключитьКомпоненту();
Если NativeS = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| NET.Команда
|ИЗ
| РегистрСведений.NET КАК NET
|ГДЕ
| NET.АдресПорт = &АдресПорт
| И NET.НомерПина = &НомерПина
| И (НЕ NET.КомандаВыполнена
| ИЛИ NET.ДатаВыполнения > &ТекущаяДатаМинус5Сек)
| И (НЕ NET.Ошибка
| ИЛИ NET.ДатаВыполнения > &ТекущаяДатаМинус5Сек)";
Запрос.УстановитьПараметр("АдресПорт", АдресПорт);
Запрос.УстановитьПараметр("НомерПина", НомерПина);
Запрос.УстановитьПараметр("ТекущаяДатаМинус5Сек", ТекущаяДата()-5);
// Запрос проверяет есть ли в очереди не выполненные задания
// или задания выполненные в течении последних 5 секунд
ВремяПрекращенияОжидания = ТекущаяДата()+15;
Пока НЕ Запрос.Выполнить().Пустой() Цикл // Ждём завершения заданий
Если ТекущаяДата() > ВремяПрекращенияОжидания Тогда // произошёл сбой
ОписаниеОшибки = "Превышен лимит ожидания выполнения команды из очереди перед текущей. Текущая команда = " + Команда;
ЗаписьВЖурналОшибок("К", "ВыполнитьКомандуNET", ОписаниеОшибки);
Возврат Неопределено;
КонецЕсли;
NativeS.Задержка(30);
Запрос.УстановитьПараметр("ТекущаяДатаМинус5Сек", ТекущаяДата()-5);
КонецЦикла;
Менеджер = РегистрыСведений.NET.СоздатьМенеджерЗаписи();
Менеджер.АдресПорт = АдресПорт;
Менеджер.НомерПина = НомерПина;
Менеджер.Команда = Команда;
Менеджер.Аргумент = Аргумент;
Менеджер.Записать(Истина);
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
| NET.Команда
|ИЗ
| РегистрСведений.NET КАК NET
|ГДЕ
| NET.АдресПорт = &АдресПорт
| И NET.НомерПина = &НомерПина
| И (NET.КомандаВыполнена
| ИЛИ NET.Ошибка)";
Запрос.УстановитьПараметр("АдресПорт", АдресПорт);
Запрос.УстановитьПараметр("НомерПина", НомерПина);
// Запрос Проверяет выполнена ли наше задание
ВремяПрекращенияОжидания = ТекущаяДата()+15;
Пока Запрос.Выполнить().Пустой() Цикл // Ждём завершения задания
Если ТекущаяДата() > ВремяПрекращенияОжидания Тогда // произошёл сбой
ОписаниеОшибки = "Превышен лимит ожидания выполнения команды. Текущая команда = " + Команда;
ЗаписьВЖурналОшибок("К", "ВыполнитьКомандуNET", ОписаниеОшибки);
Возврат Неопределено;
КонецЕсли;
NativeS.Задержка(30);
КонецЦикла;
Менеджер = РегистрыСведений.NET.СоздатьМенеджерЗаписи();
Менеджер.АдресПорт = АдресПорт;
Менеджер.НомерПина = НомерПина;
Менеджер.Прочитать();
СтруктураОтвета = Новый Структура;
СтруктураОтвета.Вставить("ОтветСтатус", Менеджер.ОтветСтатус);
СтруктураОтвета.Вставить("ОтветАргумент1", Менеджер.ОтветАргумент1);
СтруктураОтвета.Вставить("ОтветАргумент2", Менеджер.ОтветАргумент2);
СтруктураОтвета.Вставить("КомандаВыполнена", Менеджер.КомандаВыполнена);
СтруктураОтвета.Вставить("Ошибка", Менеджер.Ошибка);
Менеджер.Удалить();
Возврат СтруктураОтвета;
КонецФункции
// Подключение компоненты (Используется для задержки)
Функция NativeПодключитьКомпоненту() Экспорт
Попытка
ДрайверЕстьВоВременныхФайлах = (НайтиФайлы(КаталогВременныхФайлов(), "AddInNative.dll").Количество()>0);
ИмяФайлаДравера = КаталогВременныхФайлов()+"AddInNative.dll";
Если ДрайверЕстьВоВременныхФайлах = Ложь Тогда // Создаём
МакетДрайвера = ПолучитьОбщийМакет("AddInNative");
МакетДрайвера.Записать(ИмяФайлаДравера);
КонецЕсли;
ПодключитьВнешнююКомпоненту(ИмяФайлаДравера, "NativeVK", ТипВнешнейКомпоненты.Native);
Native = Новый("AddIn.NativeVK.SomeName");
Возврат Native;
Исключение
ОписаниеОшибки = "При подключении NativeVK произошла ошибка. Описание ошибки: " + ОписаниеОшибки();
ЗаписьВЖурналОшибок("К", "NativeПодключитьКомпоненту", ОписаниеОшибки);
Возврат Неопределено;
КонецПопытки
КонецФункции
Так же этом модуле есть функции работы с портом МК и компьютером на котором запущен сервер 1С:
// ОткрытьCOMПорт - (256) Открыть/Переоткрыть указанный COM порт на указанной скорости.
// Возвращает: Истина - Порт открыт, Ложь - Порт занят либо несуществует, Неопределено - Сбой внутри 1С
// Параметры:
// НомерCOM - Число - Номер ком порта к которому подключен контроллер
// Скорость - Число - Скорость в БИТАХ
Функция ОткрытьCOMПорт(НомерCOM, Скорость) Экспорт
Попытка
СтруктураОтвета = ВыполнитьКоманду(НомерCOM, 0, 256, Скорость);
Если СтруктураОтвета.КомандаВыполнена Тогда
Ответ = Истина;
ИначеЕсли СтруктураОтвета.Ошибка Тогда
Ответ = Ложь;
Иначе
Ответ = Неопределено;
КонецЕсли;
Возврат Ответ;
Исключение
ОписаниеОшибки = "Сбой при открытии порта. Номер порта = " + НомерCOM + ". Описание ошибки: " + ОписаниеОшибки();
ЗаписьВЖурналОшибок("К", "ОткрытьCOMПорт", ОписаниеОшибки);
Возврат Неопределено;
КонецПопытки;
КонецФункции
// ЗакрытьCOMПорт - (257) Закрыть указанный COM порт.
// Возвращает: Истина - Порт Закрыт, Ложь - Ошибка, Неопределено - Сбой внутри 1С
// Параметры:
// НомерCOM - Число - Номер ком порта к которому подключен контроллер
Функция ЗакрытьCOMПорт(НомерCOM) Экспорт
Попытка
СтруктураОтвета = ВыполнитьКоманду(НомерCOM, 0, 257, 0);
Если СтруктураОтвета.КомандаВыполнена Тогда
Ответ = Истина;
ИначеЕсли СтруктураОтвета.Ошибка Тогда
Ответ = Ложь;
Иначе
Ответ = Неопределено;
КонецЕсли;
Возврат Ответ;
Исключение
ОписаниеОшибки = "Сбой при закрытии порта. Номер порта = " + НомерCOM + ". Описание ошибки: " + ОписаниеОшибки();
ЗаписьВЖурналОшибок("К", "ЗакрытьCOMПорт", ОписаниеОшибки);
Возврат Неопределено;
КонецПопытки;
КонецФункции
// ПересоздатьКомпонентуИОткрытьCOMПорт - (258) Закрыть комп порт если открыт,
// пересоздать компоненту и открыть указанный COM порт на указанной скорости.
// Возвращает: Истина - Порт открыт, Ложь - Порт занят либо несуществует, Неопределено - Сбой внутри 1С
// Параметры:
// НомерCOM - Число - Номер ком порта к которому подключен контроллер
// Скорость - Число - Скорость в БИТАХ
Функция ПересоздатьКомпонентуИОткрытьCOMПорт(НомерCOM, Скорость) Экспорт
Попытка
СтруктураОтвета = ВыполнитьКоманду(НомерCOM, 0, 258, Скорость);
Если СтруктураОтвета.КомандаВыполнена Тогда
Ответ = Истина;
ИначеЕсли СтруктураОтвета.Ошибка Тогда
Ответ = Ложь;
Иначе
Ответ = Неопределено;
КонецЕсли;
Возврат Ответ;
Исключение
ОписаниеОшибки = "Сбой при переоткрытии COM порта. Номер порта = " + НомерCOM + ". Описание ошибки: " + ОписаниеОшибки();
ЗаписьВЖурналОшибок("К", "ПересоздатьКомпонентуИОткрытьCOMПорт", ОписаниеОшибки);
Возврат Неопределено;
КонецПопытки;
КонецФункции
// ПроверитьКомпонентуИСвязьCOMПорта - (259) Выполнить проверку наличия компоненты
// для указанного COM порта и (Необязательно) проверить связь с контроллером.
// Возвращает: 1 - Успешно, 2 - Компоненты нет, 3 - Компонента есть, но проверка связи завершилась неудачей,
// Неопределено - Сбой внутри 1С
// Параметры:
// НомерCOM - Число - Номер ком порта к которому подключен контроллер
// НужнаПроверкаСвязи - Булево - По умолчанию Ложь
Функция ПроверитьКомпонентуИСвязьCOMПорта(НомерCOM, НужнаПроверкаСвязи = Ложь) Экспорт
Попытка
СтруктураОтвета = ВыполнитьКоманду(НомерCOM, 0, 259, ?(НужнаПроверкаСвязи, 1, 0));
Ес Вступайте в нашу телеграмм-группу Инфостарт
См. также
Нейросети Робототехника и умный дом (Arduino, NFC, RFID) 1С 8.3 1С:ERP Управление предприятием 2 Сельское хозяйство и рыболовство Россия Бесплатно (free)
Практический опыт интеграции 1С ERP, Home Assistant, машинного зрения, IoT-оборудования и искусственного интеллекта
23.07.2026 1883 accountit 0
Робототехника и умный дом (Arduino, NFC, RFID) Бесплатно (free)
В заключительной части я разбираю код самодельных "мозгов", фазовое управление мотором и сервисную консоль отладки, которая помогла запустить проект в работу. В финале - честный аудит кода искусственным интеллектом и ответ на вопрос, стоил ли этот инженерный вызов потраченного времени. В конце статьи ссылка на Github
24.03.2026 1207 GarriSoft 0
Робототехника и умный дом (Arduino, NFC, RFID) Бесплатно (free)
История продолжается. Во второй части - реверс-инжиниринг панели индикации, рукописные схемы и первое оживление. Фазо-импульсное управление мотором, три попытки собрать драйвер и финальный успех. Железо готово, всё работает!
23.03.2026 1191 GarriSoft 6
Робототехника и умный дом (Arduino, NFC, RFID) Бесплатно (free)
Стиральная машина сгорела. Через несколько дней я решил не чинить её, а полностью заменить её электронику на Arduino. Это оказалось не ремонтом, а полноценным инженерным проектом: с реверс-инжинирингом, работой с опасным напряжением и серией неудачных попыток. Первая часть - это начало пути: синий дым, первые ошибки и момент, когда стало ясно, что это уже не просто "починить технику".
19.03.2026 1479 GarriSoft 3
Робототехника и умный дом (Arduino, NFC, RFID) 1С 8.5 Отраслевые Абонемент ($m)
Увлекаюсь "умным домом", но нестабильная работа облачных сервисов производителей IOT (смарт) устройств, проблемы со связью с облачными серверами, сбои в работе интернета и как результат не корректная работа (или не работа) умных устройств, выход новой платформы 1С, открытие Tasmota для себя, и другое сподвигло вернуться к Умному дому на 1С.
1 стартмани
09.02.2026 1619 osivv 3
Робототехника и умный дом (Arduino, NFC, RFID) Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
Управлять умными устройствами можно не только через Алису... Как насчет 1С?
1 стартмани
15.08.2024 2701 3 vasilievil 1
Робототехника и умный дом (Arduino, NFC, RFID) Бесплатно (free)
Обладая минимальными навыками инженера, вполне можно сделать «умными» относительно недорогие устройства, и управлять всей логикой на 1С. Возможности огромны: управление светом, включением-выключением розеток, автополив, сигнализация и т.д. О самостоятельной реализации в 1С нестандартной логики управления устройствами пойдет речь в статье.
29.02.2024 4845 atland 6
Робототехника и умный дом (Arduino, NFC, RFID)
Кто сказал, что умный дом на 1С сделать невозможно? На конференции Infostart Event 2021 Moscow Premiere Юрий Лазаренко из компании «Цифровой Кот» показал, какие уникальные прикольные вещи можно делать на базе IoT (интернета вещей), где в этом всем 1С, и как это все между собой интегрируется.
19.06.2023 7919 TitanLuchs 28
Иначе если после включения обогревателя зависнет 1С сервер, будет жарко.
Либо добавить простейшую логику защиты от зависания сервера. Обогреватель включается максимум на пол часа. Если за это время не получен ответ от сервера, переводим в состояние по умолчанию, заданное ранее в 1С, рекомендуется состояние по умолчанию - "выключен".
Зависания и потеря связи предусмотрена, есть команда К.АвтоСброс(НомерПорта, ВремяВСекундах), вызвав её в МК включится таймер и если по прошествии указанного времени МК снова не получит эту команду то перезагрузится сбросив состояние всех пинов. В случае если причино стало зависание COM порта то можно перезапустить агент сервера К.ПерезапуститьАгентСервера1С, а если причина в ошибках ОС то перезагрузить сервер К.ПерезагрузитьСервер1С ... конечно если зависнет сам сервер то решать проблему нужно чем-то стороннем.
Пусть лучше освоят для разнообразия другие языки и технологии....
Но вот практического применения я пока увидеть не могу. Очень дорого. К всеобщему счастью, стоимость ардуины мега в китае около 400 руб, web расширения к ней того же порядка, силовые модули тоже рублей по 100 на контакт. Все, получаем веб сервер для управления. Да придется немного посмотреть уроков и почитать. Но извините меня, объем знаний для начального программирования ардуины ничтожно мал, по сравнению с применением той же БСП. Я сомневаюсь, что даже начинающий 1С-ник будет испытывать какие-либо проблемы при изучении. А вот для тех, "кто может писать только на 1С" думаю области управления устройствами лежат за пределами их интересов...
Повторюсь, спасибо за интересную идею применения, осталось только придумать область применения.
Хотя у меня уже есть вариант - управление светом на рабочем месте бухгалтера путем проведения документа "расход электроэнергии" :)
1.Пишем на языке 1С
2. Доступны все фичи платформы.
На первом месте должна быть надежность системы. При выходе из строя отдельных частей системы, или потери связи одного устройства с другим.
Ардуина должна рулить сама, а 1с только дает команды на смену режимов.
Повисла ночью у вас 1с-ка или винда или роутер и все система ушла в цикличный рестарт и сброс пинов.
Тогда надо поставить еще 1 ардуину, которая будет проверять каждое из устройств и в случае зависания ребутить комп, роутер и тд. :)
Серверная 1С требует еще и сервер БД, даже фришный, но все равно ресурсы ест - как из пушки по воробьям.
Но клиентская нужна
А по поводу 15мА, то это Ваше личное непонимание того, как все работает. У народа до 0,5А на выходе напруга. Но ежу понятно, что двигателем крутить надо через драйвер (это микросхема такая, а не то, что кто-то подумал). А для чтения данных с GPIO другие методы.
Так вот, на ногах максимальная сила тока - до 0,5А = 500мА (от источника питания зависит в принципе, от ноги, от девайса). Напряжение - 5/3 вольта (в зависимости от девайса и ноги). Дальше все нетрудно посчитать, закон Ома в этих ваших интернетах описан в достаточном количестве источников. Подбираете правильный резистор и огребаете профит в виде данных с датчика, верчения пропеллером или поворота камеры на угол альфа.
И все это на питоне или даже bash-е. Для извращенцев на последние малины ставится Windows IoT.
Но меня смутило именно то, что Ваш ответ звучал как "использовать gpio" нельзя. И тут уже вопрос сам всплывает: а как информацию сдатчиков считывать? У Вас есть вариант, как это сделать без gpio? Глупость на глупость = ничья.
Пожалуй, это самый важный раздел. Нужно помнить о некоторых особенностях GPIO и соблюдать определенные меры предосторожности, чтобы не залететь еще на 35-50$ не повредить Raspberry. Ниже приведены такие "критические особенности", а также несколько нюансов, которые просто могут быть полезны, и которые желательно помнить при разработке.
Максимальный суммарный ток обоих выводов 3.3 В равен 50 мА! Поэтому эти выводы могут использоваться для питания внешних устройств, только если их потребляемый ток меньше 50 мА.
Максимальный суммарный ток обоих выводов 5 В равен 300 мА! Эти выводы также могут использоваться для питания внешних устройств только в том случае, если их потребляемый ток меньше 300 мА.
Чуток ошибся - 300мА.
Для управлением ТСЖ, правда, не для включения вентилятора, а для похожих систем со включением- выключением электричества по подъездам можно переработать систему.
Реально освободил одно рабочее место кладовщика (или мастера)..., бонусом вижу когда идёт максимальная выработка по часам..., и много попутной информации...
Так же и я страдаю этим безумием ардуино ))), но уже есть реальные результаты....
У меня с оконными производствами уже 2 положительных внедрения, народ в экстазе)))...
А по поводу умного дома я согласен с вышесказанным, что это немного изврат, но для тренировки полезно )))
Правильно!
Вы возьмёте танк, привяжете к нему садовую тачку, в тачку положите мешок картошки и поедите.
Причем, смотрите какое универсальное решение, если надо отправить внуков к бабушке, то к танку привязывается детская коляска и оп-ля, получается вариант пассажирской перевозки.
Вообще, танк, это очень полезная штука в хозяйстве, например, на пушке можно сушить бельё.
Хотя, сплошь и рядом в типовых конфигурациях встречается такой подход.
Например, вчера наши бухгалтера решили сделать типовую операцию (БГУ 2.0). Бухгалтера у нас творческие, пытливые люди. Они почитали ИТС, посмотрели на другие типовые операции и изваяли операцию. Запустили. Проводки не формируются и программа молчит как партизан. Всё нормально, хотя не понятно почему нет никаких сообщений.
Зовут меня. Мне становится интересно и я запускаю отладку. Лезу по программе и дохожу до создания Процессора компоновки данных.
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
Это чо? Это для создания каждой записи Журнала проводок вызывается СКД?
Даа-а!
Простые решения это не наш метод!
"Нормальные герои всегда идут в обход" (С)
идеологически 1с с com на уровне надежного драйвера работать не может, а всякие буферизации приводят к частичной потери данных.... говорю это как человек писавший под ардуинку спец софт для отладки сетевого обмена (даже разработал свой собственный сетевой протокол поверх RS485). по этому сабж интересен "поиграть", но абсолютно не пригоден для рельного использования.
ну и скетч под ардуинку - то же не идеал :)
Как организовать работу мобильного приложения 1С в среде Android с платами Arduino? Arduino управляет шаговым двигателем. Скажите пожалуйста как это сделать в 2-х словах. Я только начал изучать данный вопрос. Какие программные средства, программные объект? Какие аппаратные средства? я так понимаю через USB?
Ошибка СУБД:
Длина ключа индекса превышает максимально допустимую '_Reference759_ByParentFieldFld1088_RLSSRL (_ParentIDRRef, _Folder, _Fld1088, _Description, _IDRRef, _Marked) UNIQUE'