Страница 1 из 1
rs-485
Добавлено: 16 июл 2018, 18:31
sillver
Друзья! Подскажите как передавать-получать данные с часов реального времени в частности DS3231 и работать с ними по Modbus. Заранее благодарен!!!
rs-485
Добавлено: 16 июл 2018, 18:50
nalnik
sillver
Недели 3-4 назад про "время в сети" помоему
Sancho кому то подсказывал
Вот это может поможет; часы умножить на 60 и прибавить минуты и это отправлять по RS-485
viewtopic.php?f=10&t=268&p=49333#p49333
rs-485
Добавлено: 17 июл 2018, 11:19
poavel72
nalnik писал(а): 16 июл 2018, 18:50sillver
Недели 3-4 назад про "время в сети" помоему
Sancho кому то подсказывал
Вот это может поможет; часы умножить на 60 и прибавить минуты и это отправлять по RS-485
viewtopic.php?f=10&t=268&p=49333#p49333
вопрос- а как получить обратно из этой переменной часы и минуты? С часами понятно, разделить на 60, а как вычислить минуты?
rs-485
Добавлено: 17 июл 2018, 12:44
nalnik
Ну так вроде -- остаток надо умножить на 60.
Пример: время 12ч34м получаем 754
754 делим на 60 = 12,56666666666667 ========= 12 часов
остаток 0,56666666666667 умножаем на 60 ==== 34 минуты
А лучше конечно попросить Sancho сделать пользовательский блок - он сможет!
rs-485
Добавлено: 17 июл 2018, 13:07
poavel72
nalnik писал(а): 17 июл 2018, 12:44
Ну так вроде --
остаток надо умножить на 60.
Пример: время 12ч34м получаем 754
754 делим на 60 = 12,56666666666667 ========= 12 часов
остаток 0,56666666666667 умножаем на 60 ==== 34 минуты
А лучше конечно попросить
Sancho сделать пользовательский блок - он сможет!
понял, спасибо.
rs-485
Добавлено: 17 июл 2018, 13:29
nalnik
rs-485
Добавлено: 17 июл 2018, 14:39
Sancho
poavel72 писал(а): 17 июл 2018, 11:19вопрос- а как получить обратно из этой переменной часы и минуты?
nalnik писал(а): 17 июл 2018, 12:44Пример: время 12ч34м получаем 754
переменные типа integer
754 делим на 60, 754 / 60 = 12 часов
остаток от деления 754 % 60 = 34 минуты ,
modulo, ждём от автора родного блока, а не пользовательских.
Давно ждёмс...
Отправлено спустя 13 минут 33 секунды:
nalnik писал(а): 17 июл 2018, 13:29Вот посмотрите, готовые блоки с примером
Я бы код распаковки изменил на
Код: Выделить всё
if (en)
{
D = Sec / 86400; // целое количество дней
H = (Sec % 86400) / 3600; // целое количество часов
M = (Sec % 3600) / 60; // целое количество минут
S = Sec % 60; // целое количество секунд
}
rs-485
Добавлено: 17 июл 2018, 17:58
sillver
Спасибо за ответы! Но это не совсем так. Мне нужно пользоваться этими данными в сети, не ставить-же на каждую по РТэСу

!
rs-485
Добавлено: 17 июл 2018, 18:43
Sancho
sillver писал(а): 17 июл 2018, 17:58Спасибо за ответы! Но это не совсем так. Мне нужно пользоваться этими данными в сети, не ставить-же на каждую по РТэСу !
ничего не понял.
на мастере ставите 3231, упаковываете что нужно из данных времени, думаю, часы минуты более чем(можно и секунды с точностью два) в один регистр( данные типа uint) отправляете слэйвам, они распаковывают, далее по вашему алгоритму.
Можно запустить "часы" (сделать) на millis(), с периодической синхронизацией от мастера, иногда более чем достаточно...
Что не понятно, напишите, подумаем вместе...
rs-485
Добавлено: 17 июл 2018, 23:10
sillver
Спасибо попробую.
rs-485
Добавлено: 18 июл 2018, 08:39
KSP
Я по сети передаю примерно вот так , посмотрите может поможет:
rs-485
Добавлено: 18 июл 2018, 21:25
sillver
спасибо! пожалуйста поясни как это работает и как избавиться от единички.
rs-485
Добавлено: 19 июл 2018, 08:19
KSP
Единичка нужна для передачи по протоколу, числа начинающегося с 0 не бывает поэтому что-бы не было искажений при передаче стоит 1, можно ставить 2 и 3, тогда появится возможность одним int передавать по очереди 3 разных значения из 4 значных чисел. Единичка в начале в этом проекте при настройке "блок получения подстроки" убирается сама.
rs-485
Добавлено: 19 июл 2018, 09:01
Sancho
[ref]KSP[/ref], Честно, не знаю, зачем так грузить мк операциями со строками?
Думаю, что если не считать возможности написания блоков для сдвига влево/вправо при упаковке/распаковке, такой вариант самый экономичный...
И на передачу этим-же регистром других данных, потом их парсинг, дополнительных запросов, процессорного времени уйдёт больше, чем на несколько дополнительных регистров в одном запросе. Моё мнение.
rs-485
Добавлено: 19 июл 2018, 09:53
KSP
[ref=#ff8000]Sancho[/ref], не все знают, что такое БИТ , ИЛИ, НЕ, и.т.д согласен строки МК обрабатывать сложнее. Но можно и так и так решать тому кто задал вопрос о передаче времени.
rs-485
Добавлено: 19 июл 2018, 11:06
sillver
KSP Ну не опускайте меня ниже плинтуса!!!
rs-485
Добавлено: 19 июл 2018, 11:27
Sancho
[ref]sillver[/ref],
Тогда сделайте себе блочки, чтобы каждый раз не собирать в проекте.
Вот пример максимально лёгкий и быстрый. Я так думаю.
Код: Выделить всё
data_01 = sec / 2 << 11 | hour <<5 | min; // упаковка
sec = (data_01 >> 11)*2; // распаковка, секунды с точностью 2
hour = data_01 >> 5 & 63;
min = data_01 & 31;
Отправлено спустя 2 минуты 5 секунд:
Таким методом, чуть расширенным, пользуюсь при записи времени события в EEPROM 24C32(...1M).
rs-485
Добавлено: 19 июл 2018, 11:53
KSP
[ref]sillver[/ref], кроме Вас тему еще разные пользователи будут читать. Я же написал " не все ", а не конкретно Вас.