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

Буду говорить об элементарном, но вдруг кому-то будет интересно.

Я запилил небольшую блок-схему:



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

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

Рассмотрю узел связи:
Устройство, обеспечивающее связь может быть любым, главное, чтобы оно имело интерфейс шины RS485 (либо любой другой, который можно преобразовать в RS485). На моей практике это почти всегда был GSM модем с интерфейсом RS485.
Но никто не мешает взять скажем модуль LoraWAN с UART интерфейсом и подключить к нему что-то простое, типа драйвера MAX485 с небольшой обвязкой задающей режим приема/передачи. Никакой дополнительной логики в виде МК здесь не нужно.

Центр:
Здесь тоже узел связи, при этом с контроллером он может соединяться как угодно UART,RS485, RS232, Ethernet, Wi-Fi и прочее.
Остается подобрать ПО, которое будет выполнять необходимые задачи. Среди которых должен быть опрос по определенному протоколу счетчиков.
ПО можно взять мое.

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

Более того, у меня есть недорогие наработки модулей - преобразователей с логикой.
Основное их преимущество - можно менять настройки исходящего интерфейса налету.
Это может быть востребовано, если скажем к Вашей шине RS485 подключены устройства с разными параметрами UART (например baudrate)

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

Update: Вот, кстати список поддерживаемых методов в моем предыдущем коммерческом решении как раз для Меркурий 230.



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

В этом же проекте лежат библиотеки устройств (латинские названия) с парктически полным функционалом.
Некоторый функционал был реализован только благодаря реверс-инжинирингу.

CAS_5010A,
P18,
PSCH_3ART.07.xxx
PSCH_3ART.07.xxx.1,
PSCH_3ART.07.xxx.2,
Pulsar,
SEB_2A.07.xxx.x,
SET_4TM,
SET_4TM_03M_01,
TEM104,
VKT5,
VKT7.

core5277

Еще раз, что такое #core5277:

Это моя разработка на ассемблере #AVRA для микроконтроллеров компании #Atmel.
В процессе разработки я использую микроконтроллер ATmega328, он часто используется в #Arduino.
Соответственно поддерживаются микроконтроллеры ATMega48/88/168 так как отличаются от ATmega328 только объемами памяти. Кроме этого, на данный момент, я поддерживаю (хоть и не всегда актуализирую их файлы) ATMega16,ATmeag8,ATtiny45/85. Также планирую ввести поддержку линейки микроконтроллеров AT90CAN32

А разрабатываю я ядро, по сути операционную систему, для данных МК.
Вот часть реализованного функционала:
- параллельное выполнение нескольких задач (вытесняющий режим),
- простой режим переключения задач (задача вызывает SUSPEND для передачи управления следующей),
- драйвера (1wire, i2c, uart, ds18b20, am2301, beeper и прочее),
- логирование в порт,
- динамическое выделение памяти,
- контрольные суммы, некоторая математика, преобразование данных,
- программные таймеры,
- смена обработчиков прерываний налету,
- унифицированная логика работы с портами ввода/вывода

Для применения проекта я рекомендую использовать Linux+Geany+AVRA+avrdude, хотя теперь можно использовать и Windows+Atmel Studio7.

Этот проект, как и проект 5277, по большему счету, является моим хобби.
Тем не менее я вижу в нем ценность для других разработчиков.

Сейчас практически все современные разработчики ПО под микроконтроллеры пишут на #Си. Существует также ряд операционных систем для микроконтроллеров, также написанных на Си. Но я не нашел ни одной ОС на ассемблере.
При этом, разработка проекта на ассемблере дает неоспоримое преимущество в вопросах требований к ресурсам МК.
Да, это не особо актуально, в виду цен на STM чипы. Тем не менее, для поклонников AVR это будет интересно.

При написании ядра я уделяю особое внимание некоторой унификации.
Например работа с портами(независимо от типа МК) выглядит следующим образом:
LDI ACCUM,PD4
  MCALL CORE5277_PORT_MODE_OUT
  MCALL CORE5277_PORT_SET_LO


Введены программные таймеры, можно налету менять таблицу прерываний.
Вызов процедур(драйверов) тоже унифицирован, вот например коммуникация с устройством через шину i2c:
LDD TEMP,Z+_DRV_MLX90614_I2C_DRV
  LDI YH,high(_DRV_MLX90614_DATAPCKET)|0x80
  LDI YL,low(_DRV_MLX90614_DATAPCKET)
  MOV XH,ZH
  MOV XL,ZL
  LDI TEMP_H,_DRV_MLX90614_SEND_LEN
  LDI TEMP_L,_DRV_MLX90614_RECV_LEN
  LDI ACCUM,_DRV_MLX90614_I2C_ADDR
  MCALL CORE5277_EXEC


Или вызов процедуры проигрывания мелодии:
LDI TEMP,PID_BEEPER_DRV
  LDI YH,high(TSK_BEEPER_DATA)|0x80
  LDI YL,low(TSK_BEEPER_DATA)
  MCALL CORE5277_EXEC


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


И да, я выложил новую версию:

19.09.2020 v0.2.6
1. Скорректирован драйвер аппаратного UART
2. Идентификация программных таймеров начинается с 0x00
3. Добавлен пример работы с UART

http://5277.ru/distr/core5277/core5277.tar.gz

core5277, новая версия

Новая версия 0.2.5

1. Скорректирован драйвер DS1990A
2. Добавлена дополнительная проверка на присутствие датчика в драйвере 1WIRE
3. Восстанавливаем регистр Y в процедуре io/log_bytes.inc
4. Добавлены процедуры чтения и записи байта/блока в EEPROM
5. Добавлен проект для Atmel Studio 7 ./inc/examples/aqua_module/
6. Переименована процедура rom_to_ram_copy8.inc в rom_read_bytes.inc
7. Дополнены файлы микроконтроллеров ./inc/devices/
8. В процессе драйвер mlx90614

Главное - теперь проект можно открыть в Atmel Studio и он даже соберется.
Но все-же, я считаю, тру подход - linux+geany+avra+avrdude

Может быть на выходных запилю небольшую инструкцию для новичков.

http://5277.ru/distr/core5277/core5277.tar.gz

Оффтоп, щютка, C#

Директива #region позволяет указать блок кода, который можно разворачивать и сворачивать с помощью функции структурирования в редакторе кода.

В современном мире разработчиков (в данном случае это C#) нельзя отстроить код, если Вы забыли в конце блока написать #endregion.
И плевать, что это не имеет и малейшего отношения к процессу компиляции.



Что еще нужно знать о современной разработке ПО?

core5277, новая версия

Новая версия 0.2.3

После многочисленных крупных изменений, наконец-то, починил многопоточность.

1. Корректная реализация опций процесса CORE5277_PROCID_OPT_NOSUSP и т.п.
2. В разработке принудительный вывоз SUSPEND задачи после снятия длительной блокировки диспетчера
3. Восстановлена корректная периодичность отработки диспетчера(каждые 2мс)
4. Исправлены циклы перебора задач с учетом 0x00 ид задачи
5. Значительно изменена логика работы диспетчера(решено несколько проблем)
6. Добавлена процедура логирования стека задачи
7. Убран вывод не используемых ид задач в дампе задач
8. Добавлена задача мигания светодиодов
9. В целом восстановлена работа многопоточности(простой режим переключения задач, и вытесняющая многозадачность)

http://5277.ru/distr/core5277/core5277.tar.gz

core5277, новая версия

Сегодя я протестировал несколько драйверов и исправил некоторые ошибки.
А главное, добавил пример.

Также добавил файл revisions.txt, все изменения смотрите в нем.

29.08.2020

1. Добавлены процедуры ядра:
CORE5277_UPTIME_WRITE - запись в паямть копии UPTIME
CORE5277_UPTIME_GET - запись в регистры копии UPTIME
2. Исправлена ошибка перехода в блоке подсчета UPTIME
3. Изменен регистр адреса начала блока в процедуре CORE5277_LOG_BYTES
4. Исправлен ряд ошибок процедуры CORE5277_LOG_SDNF
5. Учтен п.3 в процедуре CORE5277_LOG_TASKDUMP
6. Исправлена опечатка в процедуре CORE5277_BYTE_TO_STR
7. Скорректирован цикл в процедуре CORE5277_WAIT_2MS (вытесняющий режим)
8. Скорректирован драйвер PCINT_H (PID может иметь значение 0x00, для определения NULL теперь используем 0xFF)
9. Скорректирован драйвер AM2301 с учетом п.8 и код отключения внешнего прерывания используется безусловно.
10. Добавлен пример (папка examples/aqua_module)
11. Добавлен данный файл
12. Введена минорная нумерация версии ядра
13. Проведено беглое тестирвоание драйверов PCINT_H и AM2301, состояние удовлетворительное (иногда показание датчика не считываются).

Актуальная ссылка на сурс:
http://5277.ru/distr/core5277/core5277.tar.gz

Сценарии на базе 'скриптов'

  Я не раз задумывался о том, как я буду реализовывать скрипты в своем проекте. Речь идет о скриптах для расширения возможностей сценариев, т.е. вместо заполнения параметров формы мы могли бы написать необходимый код. У этой задачи был довольно низкий приоритет, да и проект я позиционирую так, что знание программирования не обязательно.
  Было много разных мыслей, вплоть до написания своего интерпретатора типа Бейсик, разработки встроенного редактора и тому подобное.
Но вот сегодня меня наконец-то озарило, идея в следующем:
  Мне не нужен никакой редактор или интерпретатор, мне нужно сделать ровно тоже самое, что я проделал с кодом отвечающим за функционал устройств, шлюзов и сервисов.
А именно - описать Java интерфейс и на базе его создавать Java библиотеки реализующие необходимую логику.
Тогда, я просто ввожу в клиенте, в сценарии, в блоке условий новый элемент - Java библиотека. В котором задается вендор и сама библиотека и контроллер теперь знает какой код запускать.

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

Новый элемент (Java библиотека) будет также в блоках 'Информирование' и 'Управление', что даст практически полную свободу разработчику.

core5277, это случилось.

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

И так, это случилось. Сегодня я делюсь своей наработкой, пусть альфа, пусть с незаконченным тестированием базового функционала после очередных нововведений.
Тем не менее, я заявляю, что сурсы http://5277.ru/distr/core5277/core5277_v0.2.tar.gz
являются открытыми, их можно использовать как угодно, оставляя мое авторство.
Теперь они лежат в общем доступе.

Стимулом для разработки документации, примеров и прочее является только один критерий - интерес общества.

Новый функционал, триггер в сценариях

В сценарии появился новый блок:



Его задача выполнять отложенное и повторное действие или информирование.

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

Таким образом можно описать сценарий, который отработает по успешному условию только через определенное время, а еще может повторить действие или информирование через t1 секунд, затем еще через t2 секунд, и далее будет повторять через t3 секунд постоянно (или не будет, если в последнем поле будет 0). Ну и конечно никаких действий не будет, если во время ожидания условия сценария перестали выполняться.

При этом, в блоке условий по показаниям функционал триггера был убран.

Это может быть применимо, например, для отключения вентиляции в туалете по истечению какого-то времени.
Или для повторного уведомления о проблеме.

Вот например мое применение:


Т.е. если вентилятор будет непрерывно включен в течении 15 минут, то данный сценарий его выключит.

P.S. Также в процессе функционал, который позволит построить прогноз по показаниям, например, можно будет сообщить через сколько будет прогрето помещение до указанной температуры.

Оффтоп. Современный разработчик

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

И это проявляется во всем. Assert который был заброшен давным давно на Java, оказывается широко применим на C# среди разработчиков не отстающих от моды.
Стоит ли говорить, что это используется для примитивной валидации данных?

Майкрасовтовский WPF популярен, но его контейнер аналогичный hbox/vbox в JavaFX и андроиде реализован так, что остается куча вопросов, хотя все должно быть примитивно. Да и разрабы пошли дальше, они используют сторонюю платную библиотеку, компоненты которой не могут быть даже отображены в инструментарии Microsoft.

А синтаксис. Ради того, чтобы разраб писал одну строчку а не две, был усложнен заметно синтаксис. Зачем? Разве главный трудоемкий процесс у программиста это набивание строк? Я то, наивный, думал, что основное качество кода - его читаемость и однозначность, после конечно вопросов ресурсов.

А Spring - фреймворк для Java? Сейчас в требованиях у почти любой вакансии Java разработчика требуется его знание. Здесь у меня даже нет слов. Мне в крупном проекте не нужен фреймворк, который говорит мне что делать и который хрен поймешь как работает. У меня есть свои наработки моделей и наработки библиотек, которые гораздо лучше фреймворков. Зачем мне их знать? И чем сложность в них разобраться после опыта создания не менее сложных проектов от и до своими руками?

А да, а как вам функциональный метод программирования в C# - в ООП языке? Раньше за это по голове били, теперь это круто и модно.