#c# #modbus #energy #meter
Вопрос:
Я пытаюсь прочитать счетчик мощности модели Shark200 с помощью Modbus RTU. Я уже мог прочитать его, но не мог интерпретировать возвращенные данные. Как интерпретировать поля даты и значения?
Пример возвращенных данных:
0; 2; 6144; 3840; 17239; -26413; 17267; -27130; 17250; 31448; 16765; 23237; 16612; -9774; 16571; -17050; 2; 6144; 7680; 17237; -1267; 17267; 2169; 17249; -21791; 16745; 27777; 16681; -27502; 16550; 23033; 2; 6144; 11520; 17240; -224; 17267; -919; 17250; -1291; 16771; 13918; 16607; 26412; 16547; 23206; 2; 6145; 11520; 17238; -28002; 17267; -16499; 17250; 14486; 16771; 1838; 16612; 22630; 16541; 28452; 2; 6146; 0; 17237; -15796; 17266; -2358; 17249; 26544; 16917; 963; 16889; 15450; 16858; -447; 2; 6146; 3840; 17238; 22871; 17267; -8911; 17250; 11932; 16710; -25045; 16676; 32575; 16489; 16235; 2; 6146; 7680; 17239; -7892; 17268; 25489; 17250; -5705; 16771; -15073; 16674; 7403; 16544; -6094; 2; 6146; 11520; 17241; 13096; 17268; -12353; 17251; 29292; 16774; -296; 16676; 18266; 16540; -14520; 2; 6147; 0; 0
В руководстве написано:
Ответ №1:
В основном каждый байт представляет собой шестнадцатеричное значение в вашей метке времени
Глядя на пример
0x060717101600
предназначен для чтения:
YYMMDDHHMMSS в шестнадцатеричном формате, так что
YY = 06h = 06dec or (2006) MM = 07h = 07dec (July) DD = 17h = 23dec HH = 10h = 16dec MM = 16h = 22dec SS = 00h = 00dec
Протокол Modbus работает с 16-битными регистрами, поэтому вы получите метку времени в 6 байтах (3 регистра), поэтому ваши регистры будут выглядеть так:
YYMM = 0607h DDHH = 1710h MMSS = 1600h
ИЗМЕНИТЬ: похоже, что время выражено в 24-часовом формате
Комментарии:
1. Да, значения указаны в шестнадцатеричном формате. Но, пытаясь прочитать данные, возвращенные из моего чтения, я не могу извлечь дату. В руководстве говорится, что первая запись-это статус, вторая запись-индекс. Следующим будет дата. Итак, это будет: 0x6144384017239 ГГ = 06 = 2006 ММ = 14 = 20 месяцев?
2. Я думаю, что в вашем примере значения находятся в формате DEC. Таким образом, 6144 = 1800 ч и 3840 = F00 Ч и 17239 = 4357 ч
3. Как конвертировать 1800 ч, 00 ч, 4357 ч в читаемую дату? 2018 год, 00 месяц?
4. Вы уверены, что читаете регистры в правильном порядке и формате? Я не думаю, что данные, которые вы получаете, находятся в правильном формате.
5. Я так думаю. В руководстве говорится, что нужно прочитать позиции 0xC351 и 125 регистров. Преобразование шестнадцатеричного кода 0xC351 в DEC будет позицией 50001. Мой код для чтения позиции: int[] final = conn. Регистры чтения(50001, 125);
Ответ №2:
Есть несколько журналов, которые вы можете прочитать. Чтобы прочитать нужный журнал, вам нужно записать номер журнала в позиции 0xC34F или 49999 декабря.
Мой код для написания:
c.WriteSingleRegister(49999, 640);
Номер Журнала:
0 - System Events; 1 - Alarms; 2 - Historical Log 1; 3 - Historical Log 2; 4 - Historical Log 3