Задание даты и времени по modbus для CE 304

Прокофьев Андрей
Сообщения: 1
Зарегистрирован: Пн апр 15, 2019 7:12 pm

Задание даты и времени по modbus для CE 304

Сообщение Прокофьев Андрей » Ср апр 17, 2019 6:44 pm

Добрый день! Подскажите, как прописать в счетчик требуемую дату и время по modbus.
Пытаюсь записать по адресу 0805 18 часов 00 минут 00 секунд 17 апреля 2019 года:
Запрос:
01 10 08 05 00 03 06 12 00 00 11 04 13 CC 8A
В ответе получаю отказ в доступе.
Ответ:
01 90 0F 0C 04
Предполагаю, что предварительно нужно записать пароль администратора 777777 по адресу 09E0. Но ввод пароля не проходит:
Запрос:
01 10 09 E0 00 04 08 37 37 37 37 37 37 00 00 63 45
Ответ:
01 90 0F 0C 04

Концерн «Энергомера»
Сообщения: 7575
Зарегистрирован: Ср сен 18, 2002 3:51 pm
Контактная информация:

Re: Задание даты и времени по modbus для CE 304

Сообщение Концерн «Энергомера» » Вт апр 23, 2019 9:59 am

Здравствуйте

Чтобы что-то записать, надо открыть парольную сессию:
В РЭ Е.2.5 Парольная сессия открывается на требуемое число нормальных транзакций (нормальных ответов на запросы) и ограничена интервалом времени отсутствия запросов.

Для открытия парольной сессии необходимо запросить у счетчика случайное 32 битное число (два регистра с адреса 0004h), являющиеся входным значением для расчета 32 битного хэшкода.

Хэш-код – результат вычисления циклической контрольной суммы (по полиному 04C11DB7 hex) сделанного над содержанием строки пароля (символы до ограничителя, байт=0). Хэш-код и требуемое число транзакций записываются в три регистра счетчика с адреса 0006h.

Интервал отсутствия запросов задается временем активности интерфейса, регистр 090Eh (090Fh) для порта COM1 (COM2). Парольная сессия закрывается: –по окончанию счета транзакций; –при записи требуемого числа транзакций равным 0; –по истечении времени активности интерфейса


То есть как-то так:
1) Запрашиваем у счетчика случайное число:
unsigned long initValue= Read2Words(meterAdress, 0x0004);

2) рассчитываем хэш-код по над содержимым строки пароля pPswBlock (ограничитель байт=0):

unsigned long Hash(unsigned long initValue, unsigned char * pPswBlock)
{
unsigned long hash = initValue;
while (*pPswBlock)
{
hash ^= *pPswBlock++;

for (unsigned char i = 0; i < 8; i++)
hash = hash & 1 ? (hash >> 1) ^ 0xEDB88320UL : hash >> 1;
}
return hash;
}

3) Отправляем счетчику команду открытия сеанса:
Готовим буфер pWriteBlock из 6 байт: в первые 4 кладем HASH пароля, в последние 2 - число транзакций парольной сессии.
Write3Words(meterAdress, 0x0006, pWriteBlock);

Вернуться в «Трехфазные многотарифные»

Кто сейчас на конференции

Сейчас этот форум просматривают: eesk и 2 гостя