From 0b26757a7305780bf5d7c5790a094985bb2ae1d8 Mon Sep 17 00:00:00 2001 From: Coal56AB Date: Wed, 5 Mar 2025 10:53:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 105 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 623106d..c6dadd8 100644 --- a/README.md +++ b/README.md @@ -2,38 +2,109 @@ Прога для PY32F002B которая будет считывать датчики температуры в ПЧ и сохранять их в модбас регистры. Конверсия идет непрерывно и после каждой конверсии считываются все датчики и записываются в модбас регистры. -## Управление модулем -**Температура:** Для считывания температуры необходимо выставить коил `RunConvertion` (`0`). После модуль будет непрерывно запускать конверсию считать холдинг регистры `0-29`. -**Параметры датчика:** Для считывания параметров конкретного датчика надо выставить регистр `Location` (`0`) датчика или его `ROM` (`1-4`). Выставляется что-то одно из `Location`/`ROM`, а второе должно быть в нуле. Для того, чтобы считать надо выставить коил `ReadSensor` (`1`). Считываются и записываются в инпут регистры следующие параметры: -- Локация датчика (`0`) -- ROM датчика (`1-4`) -- Config-регистр датчика (`5`) -- Статус датчика (пока неопределено) (`6`) +## **Чтение температуры** +Для считывания температуры необходимо: +- выставить коил `RunConvertion` (`№0`) +- считать инпут регистры `№0-29` для получения температуры [***Цельсий x 100***] -**Инициализация датчика:** Для инициализации датчика надо выставить регистр `Location` (`0`), где находится датчик, его `ROM` (`1-4`) и регистр `Config` (`5`). Для того, чтобы инициализировать датчик надо выставить коил `InitSensor` (`2`). После в `UserByte` выбранного по ROM датчика записывается его локация и он включается в измерения +После выставления коила модуль будет непрерывно запускать конверсию и по её завершении обновлять инпут регистры. -**Деинициализация датчика:** Для деинициализации датчика надо выставить регистр `Location` (`0`), где находится датчик, и после выставить коил `DenitSensor` (`3`). После в `UserByte` выбранного по `ROM` датчика записываются нули. +После каждого завершения конверсии выставляется коил `ConvertionDone` (`№16`), который сбрасывается при чтении инпут регистров температуры. Поэтому имеет смысл дополнительно проверить этот коил, обновились ли значения температуры с прошлого считывания. + +Если какой-то датчик был потерян, его в инпут регистры на его место записывается `0x0` и выставляется коил `LostedSensors` (`№16`), который сбрасывается при чтении инпут регистров температуры. Поэтому имеет смысл дополнительно проверить этот коил, обновились ли значения температуры с прошлого считывания. + +## Управление датчиками +Взаимодействие с датчиком строится по следующему принципу: +- заполнение холдинг регистров (`№0-5`) для параметров датчика для обращения к нему +- выставление коила для взаимодействия с датчиком (поиск, чтение, инит, деинит) +- чтение инпут регистров (`№30-36`) содержащих ответ от датчика и статус взаимодействия + +После выставления коила, происходит выбранное действие с датчиком и заполнение инпут регистров с ответом, поэтому имеет смысл сделать выдержку в пару миллисекунд между выставлением коила с считыванием ответа + +### Сканирование датчиков +Для поиска датчиков необходимо: +- выставить коил `ScanSensors` (`№4`) +- считывать ответ в инпут регистрах, до тех пор, пока Status не будет равен `0x11`: + - `Location` (`№30`), где находится датчик + - `ROM` (`№31-34`), адрес датчика + - `Config` (`№35`), конфиг регистр датчика + - `Status` (`№36`), [статус общения с датчиком](#статус-общения-с-датчиком) + +После выставления флага в инпут регистрах записываются параметры первого обнаруженного датчика. Когда эти данные считываются по Modbus, регистры обновляются параметрами следующего по порядку датчика. Этот процесс продолжается до тех пор, пока не будут опрошены все устройства на линии. После считывания последнего датчика в статус-регистр записывается значение `0x11`, что означает завершение сканирования + +### Считывание параметров датчика +Для считывания параметров конкретного датчика необходимо: +- выставить холдинг регистры: + - `Location` (`№0`), где находится датчик + - `ROM` (`№1-4`), адрес датчика + - Выставляется что-то одно из `Location`/`ROM`, а второе должно быть в нуле +- выставить коил `ReadSensor` (`№1`) +- считать ответ в инпут регистры: + - `Location` (`№30`), где находится датчик + - `ROM` (`№31-34`), адрес датчика + - `Config` (`№35`), конфиг регистр датчика + - `Status` (`№36`), [статус общения с датчиком](#статус-общения-с-датчиком) + +После выставления коила, происходит чтение скратчпада датчика и заполнение им инпут регистров. Если чтение по локации не прошло успешно статус выставляется в `0xF0`. Если чтение по ROM не прошло успешно статус выставляется в `0xF0` + +### Инициализация датчика +Для инициализации датчика необходимо: +- выставить холдинг регистры: + - `Location` (`№0`), где находится датчик + - `ROM` (`№1-4`), адрес датчика + - `Config` (`№5`), конфиг регистр датчика +- выставить коил `InitSensor` (`№2`) +- считать ответ в инпут регистры: + - `Location` (`№30`), где находится датчик + - `ROM` (`№31-34`), адрес датчика + - `Config` (`№35`), конфиг регистр датчика + - `Status` (`№36`), [статус общения с датчиком](#статус-общения-с-датчиком) + +После выставления коила в `UserByte` выбранного по ROM датчика записывается его локация и он включается в структуру датчиков микроконтроллера. Если инициализация не прошла успешно статус выставляется в `0xAA` + +### Деинициализация датчика +Для деинициализации датчика необходимо: +- выставить холдинг регистр `Location` (`№0`), где находится датчик +- выставить коил `DeInitSensor` (`№3`) +- считать ответ в инпут регистры: + - `Location` (`№30`), где находится датчик + - `ROM` (`№31-34`), адрес датчика + - `Config` (`№35`), конфиг регистр датчика + - `Status` (`№36`), [статус общения с датчиком](#статус-общения-с-датчиком) + +После выставления коила в `UserByte` выбранного по `ROM` датчика записываются нули и он выключается из структуры датчиков микроконтроллера. Если деинициализация не прошла успешно статус выставляется в `0x55` + +### Статус общения с датчиком +Статус сигнализирует о следующих событиях: +- `0x01`- без ошибок, все ок +- `0x11` - конец скана +- `0xF0` - ошибка при чтении по выбранной локации +- `0x0F` - ошибка при чтении по выбранному ROM +- `0xAA` - ошибка инициализации выбранного датчика +- `0x55` - ошибка деинициализации выбранного датчика +- `0xBB` - ошибка при сканировании (в МК хранится адрес несуществующего датчика например) ## Структура данных -**Coils**: для управления работой модуля -- 0: `RunConvertion` - запуск преобразований датчика -- 1: `ReadSensor` - считать параметры датчика по холдинг регистрам -- 2: `InitSensor` - инициализация датчика по холдинг регистрам -- 3: `DenitSensor` - деинициализировать датчик по холдинг регистрам +**Coils**: адреса для управления работой модуля +- 0: `RunConvertion` - [запуск преобразований всех датчиков](#чтение-температуры) +- 1: `ReadSensor` - [считать параметры датчика](#считывание-параметров-датчика) +- 2: `InitSensor` - [инициализация датчика](#инициализация-датчика) +- 3: `DeInitSensor` - [деинициализировать датчик](#деинициализация-датчика) +- 4: `ScanSensors` - включить режим [поиска датчиков](#сканирование-датчиков) -**Coils**: для флагов модуля +**Coils**: адреса для флагов модуля - 16: `ConvertionDone` - флаг окончания конверсии. Сбрасывается после считывания температуры из регистров - 17: `LostedSensors` - флаг есть ли потерянные сенсоры. Сбрасывается по модбас -**Hodling Registers**: используются для передачи параметров датчика и для инициализации/деинициализации. +**Hodling Registers**: адреса для передачи параметров датчика и для инициализации/деинициализации. - 0: `Location` - локация датчика - 1-4: `ROM` - ROM датчика - 5: `Config` - разрешение датчика - 6: `Enable` - считывать напряжение с этого датчика или нет -**Input Registers**: для хранения температуры и параметров датчика +**Input Registers**: адреса для хранения температуры и параметров датчика Температура храниться в первых 30 инпут регистрах - 0-29: `SensTemperature` - температура n-го датчика в [***Цельсий x 100***] Параметры храняться в рестрах N+1. Хранятся параметры последнего датчика к которому было совершнео обращение (коилы №1-3)