Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Учимся писать компьютерные программы для автоматизации.

Форум самогонщиков Автоматика
Semo Бакалавр Земля 60 40
23 Окт. 15, 00:08
Когда мне захотелось написать свою программу для компа, автоматизирующую некоторые процессы, с удивлением обнаружил что на эту тему не так много статей, в частности недостаточно освещена тема работы с датчиками DS18B20. Постараюсь заполнить этот пробел и начну с самых основ разработки программ, чтобы было понятно даже тем, кто далек от программирования. Но тем не менее базовые знания информатики не помешают, потому что я не стану объяснять что такое биты, байты, переменные, их типы, структуры, а также процедуры и т. д. При необходимости, ответы на эти вопросы даст любой поисковик.
Итак, приступим. Для начала я расскажу как сделать простую программу, которая может считывать температуру с DS18B20 и показать ее в окне. Отмечу что я не программист и возможно не все написанное будет верным.
Для начала нам понадобится среда программирования. Это такая же программа как и другие, но предназначена она для создания программ. Я выбрал среду PureBasic версии 5.24, для которой имеется библиотека функций для работы с 1-Wire устройствами, к которым принадлежит датчик DS18B20. Описание функций библиотеки можно найти в журнале Радио 2015 № 1.
Скачать PureBasic можно по этой ссылке. http://rghost.net/8mQNDGH8S Это potrable версия не требующая установки. Архив необходимо распаковать в любую папку в которой есть права на чтение и запись. Если не знаете о чем речь, распаковывайте в папку с документами. Нужно найти в распованых файлах "PureBasic Portable.exe" и создать его ярлык на рабочем столе.
Программа русифицирована. Но справка на английском. В сети можно найти русские справки от предыдущих версий. http://purebasic.ucoz.com/PB_rar/PureBasic_rus.rar
Онлайн справка. http://web.archive.org/...104&lng=rus

Запускаем PureBasic кликнув по ярлыку на рабочем столе и видим такую картину.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Перед нами редактор кода с пустым файлом. Сохраняем его под именем "TestTemp 1.0.pb". Теперь создадим окно. В меню "Формы" кликаем по "Новая форма" и перед нами появится макет окна.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Теперь нужно наполнить окно содержимым. Потребуются несколько текстовых надписей (TextGadget), список для портов (ComboBoxGadget) и область где будет отображаться температура (StringGadget). Находим их на вкладке "Инструменты" окна "Формы". Кликаем и перемещаем курсор мышки в область макета окна. Зажимаем левую кнопку мышки в той области где нужно расположить компонент, и не отпуская кнопки перемещаем мышку. Таким образом обозначим координаты и размеры компонента. Для изменения надписей, кликаем по компоненту в макете окна и в окне "Формы" пишем свой текст в поле "Текст". Чтобы добавить имена портов в список, нужно после его размещения в окне, кликнуть по меню правой кнопкой мышки и в меню выбрать "Править элемент". В появившемся окне, добавляем имена портов.
Если все равно непонятно объяснил, смотрите видео.
В конечном итоге должно получиться следующее.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Кликнув по "Код/Дизайнер форм" в меню "Формы" можно увидеть код окна.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Окно готово. Сохраняем его в файл под именем "Окно.pbf" туда же, куда сохранили файл с кодом программы. Теперь начинается самое интересное - будем писать код программы. Нам понадобится файл "OWire_Module.pbi", который нужно скопировать в туже папку где находятся остальные файлы программы. Взять этот файл можно из архива ftp://ftp.radio.ru/pub/2015/01/OWire.zip
Он расположен в папке "\Library\Src".

Теперь пишем код. В начало исходника нужно добавить строки.
XIncludeFile "OWire_Module.pbi" ; Функции для датчиков.
XIncludeFile "Окно.pbf"         ; Код окна программы.

UseModule OWire ; Нужно для доступа к функциям файла "OWire_Module.pbi".
Первые две строки добавляют код из указанных файлов в эту программу, а последняя нужна для доступа к функциям работы с датчиками из файла "OWire_Module.pbi". То что находится после точки с запятой, это комментарии. Они нужны для того чтобы мы лучше понимали что делает код, а комп их игнорирует. Другими словами, компу без разницы есть комментарии или нет, на работу программы они не влияют.
Теперь необходимо добавить вызов процедуры создания окна и его обработчик событий.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Строка OpenWindow_0() это вызов процедуры создания окна. На скрине выше где показан код окна можно увидеть эту процедуру. У ее имеется несколько параметров со значениями по умолчанию, т. е. которые не обязательно передавать в параметрах процедуры. Во время вызова, выполняется код между командами Procedure и EndProcedure. В данном случае, там находятся функции создания окна и его компонентов.

Далее по коду находится цикл Repeat – Until, внутри которого будет выполняться код до тех пор пока условие в Until не станет верным, т. е. до тех пор пока в переменной с именем Event не окажется код #PB_Event_CloseWindow. Это произойдет когда закроют окно. При каждом выполнении кода цикла, в переменную Event копируется текущий код события программы. Ее может может быть другим, но обычно ее так называют чтобы понятней было что она хранит события. События это например закрытие окна, клики по гаджетам (компонентам окна)  или меню и т. д.
Теперь в коде присутствует все необходимое для работы программы и ее можно запустить кликнув в меню "Компилятор" по "Компиляция/Запуск". Появится окошко программы.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Основа программы готова. Осталось научить программу открыть COM порт выбранный в списке и читать температуру с датчика. Начнем с первого. Как писал выше, клик по компоненту окна – гаджету, которым является список портов, создаст событие программы и его код функция WaitWindowEvent() запишет в переменную Event. Значит необходимо как-то проверить что находится в переменной Event и если там код события гаджета, выполнить кое-какие действия. Для сравнения предназначено ключевое слово If. Если кто-то не знает, оно с английского переводится как "Если". Кроме того необходимо еще проверить в каком именно гаджете произошло события. В окне этой программы их четыре. Кажется что все это сложно, но на деле это не так.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


В первом ключевом слове If. Проверяется чтобы в переменной Event был код события #PB_Event_Gadget, не что-то другое. Если там что-то другое, будет пропущен код внутри блока If и выполнение перейдет на парное ему ключевое слово EndIf в строке 15. У него такой же размер отступа. Вообще отступы в коде носят декоративный характер и не влияют на работу программы. Они нужны для нас, разработчиков программ и позволяют быстрее найти парные ключевые слова.
Если же в переменной Event будет именно код #PB_Event_Gadget, тогда выполнится еще одна проверка в строке 12, где проверяется что событие произошло именно в гаджете с идентификатором #Combo_0, а не в каком-то другом. Названия идентификаторов гаджетов видны на скине с кодом окна. Если присмотреться, видно что такой у ComboBoxGadget, т. е. у списка с COM портами. Если в списке выбрали порт, то это условие верно и будет выполнено код из процедуры OW_OpenPort, а параметром ей передается текст из выбранной строки списка портов, т. е. если выбрали COM2, этот текст передается процедуре. Она расположена в файле OWire_Module.pbi (в дальшейшем чтобы я не повторялся, все процедуры имя которых начинается с " OW_" находятся в этом файле) и если говорить о ней кратко, она открывает COM порт, к которому предполагается что подключены датчики температуры. Более подробно о процедурах файла OWire_Module.pbi можно прочитать в Радио 2015 № 1.

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

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


В 7 строку добавил функцию AddWindowTimer. В ее первом (слева) параметре необходимо указать идентификатор окна, к которому привязывается таймер. Узнать его можно в файле "Окно.pbf". Второй параметр это идентификатор таймера, который нужен чтобы можно было как-то отличать таймеры, ведь их может быть много. Я выбрал число 2, но оно может быть любым целым положительным. Третий параметр это промежутки времени в миллисекундах, через которые будут происходить события.
В 18 строку добавил проверку события таймера, а строкой ниже уточняется что событие именно таймера с идентификатором 2, а не какого-то другого. Можно было бы не уточнять, ведь в программе один таймер, вот если бы было больше одного, такая проверка была бы обязательной.

Теперь программа умеет выполнять код через заданные промежутки времени, в нашем случае, через каждую секунду. Но выполняемого кода как такового пока нет (комментарий не считается кодом). Его еще предстоит написать. Но перед этим нужно изучить даташит на датчик DS18B20 чтобы понять как с ним общаться. Его можно скачать на официальном сайте. https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Но мне больше нравится вариант даташита, переведенный на русский. На родном языке намного понятней. https://cdn.homedistil.ru/fs/1510/22/44768.84589.pdf

Откройте даташит и ознакомьтесь с ними. В простейшем случае, для чтения температуры нужно проделать такие действия.
1.   Пропустить проверку серийного номера. Команда SKIP ROM. Код CCh.
2.   Запустить процедуру измерения температуры. Команда CONVERT T. Код 44h.
3.   Подождать не меньше 750 миллисекунд при 12-ти битной разрешающей способности (по умолчанию в DS18B20).
4.   Пропустить проверку серийного номера. Команда SKIP ROM. Код CCh.
5.   Прочитать данные из датчика. Команда READ SCRATCHPAD. Код BEh.

Код производящие эти действия показан на скриншоте (строки от 41 до 68 ).

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Если внимательно присмотреться к коду, видно что действия выполняются в другом порядке. Сначала действия 4 и 5 (чтение данных из датчика), потом 1 и 2 (запуск измерения температуры), а действия 3 (задержка на 750 миллисекунд) вообще не видно. Но на самом деле это не так. Для действия 3 применена не фиксированная задержка в коде, а интервал между событиями таймера, который составляет 1 секунда.
Рассмотрим код подробнее. В строке 41 производится проверка наличия ошибки при выполнении действий 1 и 2, т. е. при предыдущем запуске измерения температуры. Если в переменной ErrCode будет число 0, значит ошибок не было. В противном случае, читать данные из датчика не имеет смысла и код чтения пропускается. Если не было ошибок, выполняется код процедуры OW_SkipROM, отправляющей команду датчику пропустить проверку серийного номера. Если при выполнении этой процедуры не было ошибок, выполнится функция OW_ReadRAM, читающая из датчика данные и помещающая их в экземпляр структуры OW_RAM с именем RAM. Структура это такой контейнер, объединяющий в себе несколько переменных.
Она объявлена в файле "OWire_Module.pbi" и имеет вид.
Structure OW_RAM ; Копия содержимого ОЗУ датчика DS18B20 ($BE).
 L_Termo.a       ; Младший байт температуры
 H_Termo.a       ; Старший байт температуры
 Max_Termo.a     ; Верхний предел температуры
 Min_Termo.a     ; Нижний предел температуры
 Config.a        ; Байт конфигурации
 x.a[3]          ; Резерв 3 байта (в датчике не реализовано)
 CRC.a           ; Контрольная сумма
EndStructure

Далее, в случае успешного выполнения кода процедуры OW_ReadRAM, производится преобразование температуры и она отображается в окне с точностью до десятых долей градуса.
В строках 62 – 68 выполняются действия 1 и 2, т. е. запускается процесс измерения температуры.

Вот как-то так работает эта программа. Теперь ее можно считать законченной и использовать как термометр. Чтобы она не требовала для работы среду PureBasic, нужно ее скомпилировать. Это просто. В меню "Компилятор" кликаем по "Создать приложение" и выбираем имя файла и место его сохранения. Получаем небольшой исполняемый файл с размером 39 КБ, который работает не только на современных версиях Windows, но и на Windows 95 OSR 2.
Сделал скрин работы проги в ней.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Архив со скомпилированной программой и ее исходниками. https://cdn.homedistil.ru/fs/1510/22/44768.84590.zip
Semo Бакалавр Земля 60 40
Отв.1  26 Окт. 15, 21:29
Один датчик – хорошо, а много - еще лучше. Следующим этапом будет доработка программы, позволяющая ей считывать температуру с множества датчиков. Для начала отредактируем окно. Нужно удалить надпись "Температура" (TextGadget) и область отображения температуры (StringGadget). Чтобы это сделать, необходимо выделить компонент кликом левой кнопкой мышки, а затем кликнуть правой кнопкой и в меню кликнуть по "Удалить."

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Теперь в окно нужно добавить кнопку (ButtonGadget) и таблицу (ListIconGadget). Как это делать, писал в предыдущий раз. Кнопка нужна для поиска датчиков, а таблица для отображения  температуры. После добавления таблицы, необходимо выделить ее и кликнув правой кнопкой по ней, выбрать в меню пункт "Править колонку". В окне правки, необходимо переименовать имеющуюся колонку в "Идентификатор" и добавить новую с именем "Температура". После чего закрыть окно правки колонок. Получилось следующее.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


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

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Так как датчиков будет много и заранее неизвестно сколько, для хранения информации о них потребуется особая переменная, вмещающая в себя столько информации, сколько потребуется. В PureBasic для таких целей предназначен двусвязный список. Что это такое и для чего нужен можно узнать из википедии. https://ru.wikipedia.org/wiki/Связный_список
Каждая ячейка списка эквивалентна отдельной переменной вмещающей одно значение. Но этого мало. В списке необходимо сохранить идентификатор датчика (его имя, на которое он откликается), а также температуру, считанную с него и другие данные. Можно было бы создать столько списков, сколько нужно для этих данных, но это не совсем рационально и ненаглядно. Программа станет менее понятной. Намного лучше, в качестве типа переменной ячеек списка указать структуру (ранее писал что структура это контейнер для переменных) и получить список структур. Таким не хитрым способом получим список, ячейки которого могут содержать больше одной переменной.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Двусвязный список создается в строке 12 командой NewList. Команда Global делает видимым список по всему коду (без нее, список недоступен в процедурах) Имя списка -  DS_List, а его тип - DS, т. е. структура, описанная в строках 6 – 10. Первая переменная структуры с именем ID, это другая структура OW_SN находящаяся в файле "OWire_Module.pbi". В ней будет находиться идентификатор датчика. Вторая переменная необходима для хранения температуры, а третья для кода ошибки.
Также в программу был добавлен обработчик события клика по кнопке поиска датчиков. Он находится в строке 50. И были добавлены две процедуры с именами Find и Timer. Первая вызывается в строке 51 при поиске датчиков, а вторая в строке 56 при событии таймера с идентификатором 2. В процедурах пока нет кода. Сейчас его напишем. Начнем с поиска датчиков. Среди множества команд, датчик DS18B20 содержит команду SEARCH ROM (код F0h) предназначенную для поиска датчиков и чтения их серийных номеров. Это наверное самая сложная для понимания команда и я до конца не понял всего алгоритма поиска. Он довольно запутанный. Но это и не нужно. В файле "OWire_Module.pbi" есть несколько процедур для поиска датчиков, что значительно упрощает программу.
Код процедуры поиска датчиков.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Прежде чем искать датчики, производится проверка наличия открытого COM порта. Если он закрыт, появится окно, уведомляющее об этом и дальше код процедуры выполняться не будет.
Если порт открыт, тогда очищается связный список и таблица, находящаяся в окне. Далее вызывается процедура OW_SearchROM_Reset(), очищающая историю поиска что позволит начать его заново. После этого в цикле While – Wend вызывается процедура OW_SearchROM_Enum копирующая в структуру ID идентификатор очередной найденной 1-Wire микросхемы. Если тип микросхемы 28 или 10 (это DS18B20 или DS1820 соответственно), данные добавляются в связный список. Иначе они игнорируются. Также добавляется строка в таблицу в окне, содержащая идентификатор датчика. Код в цикле  выполняется столько раз, сколько раз функция OW_SearchROM_Enum вернет #True как результат своего выполнения. Что-то другое она может вернуть если произошла ошибка, или по окончанию поиска.

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

1.   Пропустить проверку серийного номера. Команда SKIP ROM. Код CCh.
2.   Запустить процедуру измерения температуры. Команда CONVERT T. Код 44h.
3.   Подождать не меньше 750 миллисекунд при 12-ти битной разрешающей способности (по умолчанию в DS18B20).
4.   Выбрать датчик по его серийному номеру. Команда MATCH ROM. Код 55h.
5.   Прочитать данные из датчика. Команда READ SCRATCHPAD. Код BEh.


Отличие только в действии 4. Так как датчиков много, сначала необходимо выбрать тот из которого требуется прочитать данные. Иначе одновременно ответят все датчики и данные исказятся. Также возможно использование команды "MATCH ROM" в действии 1. Это необходимо если не все датчики должны одновременно измерять температуру или не все 1-Wire микросхемы совместимы по командам с DS18B20 и неизвестно как они отреагируют на команду "CONVERT T".
Теперь разберем код считывания температуры из датчиков.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Ячейки связного списка DS_List() перечисляются в цикле ForEach – Next. Перечисление происходит от начала к концу. Код в цикле выполняется столько раз, сколько ячеек в списке, но при каждом его выполнении активной будет другая ячейка. Функция OW_SelectROM отправляет датчикам идентификатор и после этого на команды будет реагировать только выбранный датчик, а остальные их проигнорируют. Затем функция OW_ReadRAM прочитает данные из выбранного датчика и поместит их структуру с именем RAM. После этого функция OW_GetCRC проверяет контрольную сумму данных. Функция PeekW читает два байта из структуры RAM, в которых находятся данные о температуре и помещает ее к переменную Temp текущей ячейки связного списка.  Далее происходит преобразование температуры – для DS18B20 температура делится на 16, а для DS1820 или DS18S20 делится на 2. Это необходимо потому что в DS18B20, 4 младших разряда содержат дробную часть температуры. Нужно делить на 16 потому что 2 в 4 степени равно 16. В DS1820 или DS18S20 под дробную часть выделен 1 разряд и необходимо делить на 2.
В 107 строке анализируется наличие признака ошибки. Если ее нет (в переменной ErrCode списка, число 0), в таблицу расположенную в окне записывается температура, прочитанная из датчика. Если же была ошибка (в переменной не 0), тогда в таблице вместо температуры отображается ее описание.
По завершению чтения температуры с датчиков, в строке 118 им передаются команды пропуска проверки идентификатора и запуска измерения температуры.

Программа закончена. Теперь ее можно скомпилировать, т. е. создать исполняемый exe файл. В меню "Компилятор" кликаем по "Создать приложение" и выбираем имя файла и место его сохранения.
Скриншот окна программы.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Скомпилированая программа и ее исходный код. https://cdn.homedistil.ru/fs/1510/26/44768.84752.zip
Semo Бакалавр Земля 60 40
Отв.2  02 Нояб. 15, 16:39
Теперь научим программу управлять внешними устройствами в зависимости от температуры. В таблицу находящуюся в окне нужно добавить 3 колонки: "Порог", "№ вывода" и "Состояние". В первой будет отображаться пороговая температура при превышении которой включится нагрузка. Во второй – номер вывода которым производится управление и в третьей – состояние вывода (включено или нет). Также правее кнопки поиска датчиком необходимо расположить текстовую надпись (TextGadget). Для чего она нужна, расскажу позже.
Получился такой макет окна.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Перейдем к доработке кода программы. В структуру DS с данными датчика необходимо добавить переменную, в которой будет пороговая температура. Назовем ее PrTemp.
Structure DS ; Структура с данными датчика.
  ID.OW_SN    ; Идентификатор датчика.
  Temp.f      ; Температура измереная датчиком.
  ErrCode.a  ; Код ошибки.
  PrTemp.f    ; Пороговая температура
EndStructure

Чтобы иметь возможность изменять пороговую температуру, необходимо добавить в программу обработчик события двойного клика мышкой по строке в таблице.
      Case #ListIcon_0 ; Событие в таблице с данными датчиков.
        If EventType() = #PB_EventType_LeftDoubleClick ; Двойной клик по таблице.
          x = GetGadgetState(#ListIcon_0) ; Строка в таблице по которой кликнули.
          If x >= 0 And x < ListSize(DS_List())
            If SelectElement(DS_List(), x) ; Активируем ячейку списка.
              PrT.s=InputRequester("", "Пороговая температура", StrF(DS_List()\PrTemp, 1))
              If PrT<>"" ; Строка не пустая.
                DS_List()\PrTemp = ValF(PrT) ; Запись пороговой температуры в список
                SetGadgetItemText(#ListIcon_0, x, StrF(DS_List()\PrTemp, 1), 2)
              EndIf
            EndIf
          EndIf
        EndIf

В первую очередь проверяется тип события и код дальше выполняется если это двойной клик по строке таблицы. Далее в переменную X записывается номер строки (начиная с 0) по которой кликнули. Потом выбирается ячейка связного списка с таким же номером. Функция InputRequester создает окно с областью ввода текста, куда нужно ввести пороговую температуру. А далее в связный список и таблицу записывается новая пороговая температура.

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

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


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

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


При подключении этой схемы к компьютеру, она автоматически определится и Windows установит драйверы.
Для того чтобы управлять нагрузками через USB, потребуется файл "USB HID.pbi", в котором находятся необходимые процедуры.
Т. к. USB допускает подключение и отключение во время работы компьютера и нужно определять, когда схема подключена, а когда нет. Для этого предназначена процедура FindDevice() вызываемая регулярно по таймеру.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Процедура TestDevice проверяет есть ли связь с USB устройством у которого заданные идентификаторы PID и VID. Если связь есть, процедура вернет число не равное нолю, а если связи нет, вернет 0. Если при предыдущей проверке связи не было, а при текущей есть, тогда процедура OpenDevice подключается к USB и возвращает идентификатор связи с устройством у которого требуемые идентификаторы PID и VID. Если же при предыдущей проверке связь была, а сейчас нет, тогда процедура CloseDevice разрывает ранее установленную связь. Функция SetGadgetText записывает в текстовую надпись (TextGadget) строку текста, информирующую о подключении или отключении устройства.

Теперь нужно научить программу сравнивать текущую температуру с пороговой и отсылать данные в USB. Это сделано в процедуре TempTest.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


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

Программа закончена. Теперь ее можно скомпилировать, т. е. создать исполняемый exe файл. В меню "Компилятор" кликаем по "Создать приложение" и выбираем имя файла и место его сохранения.
Скриншот программы.

Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.


Архив с файлами https://cdn.homedistil.ru/fs/1511/02/44768.85133.zip
сообщение удалено
stXXX Кандидат наук Краснодар 318 86
Отв.3  07 Дек. 15, 20:30
Темка занятная, а на Delphi писать не пробовал?
capsolo Профессор Зелик 5.3K 1.6K
Отв.4  07 Дек. 15, 20:33, через 4 мин
Поясни, коллега, зачем идентификаторы датчиков замазывают? Это ж вроде не CVV
Semo Бакалавр Земля 60 40
Отв.5  07 Дек. 15, 20:59, через 26 мин
Темка занятная, а на Delphi писать не пробовал?stXXX, 07 Дек. 15, 20:30
Пробовал. Не могу понять все эти объекты и компилятор ругается там где ошибок нет. С паскалем было проще.

зачем идентификаторы датчиков замазывают?capsolo, 07 Дек. 15, 20:33
Идентификаторы уникальны. Особого секрета не представляют, но тем не менее, лучше замазать.

trizet86 Студент Lipetsk 33 6
Отв.6  07 Дек. 15, 22:22
В сети нашлась подходящая конструкция на микроконтроллере, схема которой содержит минимум элементов.Semo, 02 Нояб. 15, 16:39
Ох не стал-бы я использовать софтовую эмуляцию ЮСБ, там, где это весьма надежно должно быть...
Кроме того у процессора весьма мало ресурсов остаётся и надо оч грамотно использовать их. Иначе, чуть уехали таймауты - ЮСБ хост послал...
Лучше уж из FT линейки чтонить.

Идентификаторы уникальны. Особого секрета не представляют, но тем не менее, лучше замазать.Semo, 07 Дек. 15, 20:59
И всё-же, признавайтесь, Вы их используете как ключ входа в Вашу секретную лабораторию? 
Учимся писать компьютерные программы для автоматизации
Учимся писать компьютерные программы для автоматизации. Автоматика.
mr.ptec Доктор наук Петрозаводск 703 171
Отв.7  08 Дек. 15, 11:00
trizet86, ну это как примерно на drive.ru принято замазывать номера на машинах...)
rekbrjaaa Бакалавр волгоград 55 1
Отв.8  24 Дек. 17, 19:49
а на C# приложении есть темы? я написал свой маленький протокольчик, чтение, запись ардуины
Semo Бакалавр Земля 60 40
Отв.9  02 Окт. 22, 23:16
Все что я написал раньше применимо к Raspberry PI.
Необходимо скачать среду программирования для нее.
Для 32-ух битной Raspberry Pi OS https://www.upload.ee/..._ARM32.tgz.html
Для 64-ух битной Raspberry Pi OS https://www.upload.ee/..._ARM64.tgz.html

Устанавливается распаковкой архива в папку pi. В ней должна появится папка purebasic с файлами из архива.
Запускается среда программирования кликом по файлу launch.sh.
Но перед этим нужно открыть терминал и скопировать в него строку
sudo apt-get install build-essential gcc g++ libxxf86vm-dev libxine2-dev unixodbc-dev libsdl1.2-dev libsdl2-dev libssl-dev libgtk2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libvlc-dev libgl1-mesa-dev libgl1-mesa-glx qtbase5-dev qttools5-dev qtmultimedia5-dev qtdeclarative5-dev libqt5svg5-dev libqt5webkit5-dev libqt5multimedia5-plugins
Должно быть подключение к интернету откуда скачаются файлы.

Выбор русского в настройках среды.

rus.png
Rus. Учимся писать компьютерные программы для автоматизации. Автоматика.


Изначально программы писались для компьютера/ноутбука с Windows и процессором Intel, но в малине ОС Linux и процессор ARM что означает что железо и ОС сильно отличаются. Из-за этого в код нужно внести некоторые изменения.
Во первых в Linux другая оконная система, другие шрифты и необходимо скорректировать размеры содержимого окна.
Во вторых, в Linux последовательный порт имеет имя ttyS2 или ttyUSB0, а не COM как в Windows.
В третьих, в RaspberryPI для подключения внешних устройств лучше использовать GPIO, а не микроконтроллер в USB подключением. Для доступа к GPIO можно использовать например pigpio.
Чтобы запустить службу pigpio в терминал нужно вставить строку
sudo systemctl start pigpiod.service
или
sudo systemctl enable pigpiod.service
чтобы служба запускалась автоматически при старте ОС.

Скриншот первого приложения [Учимся писать компьютерные программы для автоматизации.]
1.png
1. Учимся писать компьютерные программы для автоматизации. Автоматика.


Скриншот второго приложения [сообщение #12487875]
2.png
2. Учимся писать компьютерные программы для автоматизации. Автоматика.


Скриншот третьего приложения [сообщение #12498044]
3.png
3. Учимся писать компьютерные программы для автоматизации. Автоматика.


В колонке "№ вывода" номер GPIO малины.
RaspberryPI.zip 162.7 Кб