Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



PZEM-004T

Сообщений 61 страница 90 из 133

61

Nord написал(а):

1. Попробуйте подключить $lib "hexval.lbx"
2. Убедитесь, что MID считывает именно те позиции, которые нужны.

PS. Только что попробовал - указанный код считает правильно...


Позиция правильная ,  подключил $lib "hexval.lbx" - Вольты_число ,Vxod  в протеусе ни чего не показывают доже ноль.

0

62

olegkaras написал(а):

подключил $lib "hexval.lbx" - Вольты_число ,Vxod  в протеусе ни чего не показывают доже ноль.

Я пробовал с выводом на физический 20*4 дисплей - 2200

0

63

Nord написал(а):

Я пробовал с выводом на физический 20*4 дисплей - 2200

Я тоже  ,  видать где то я ошибся , буду искать.

0

64

Попробуйте (для пробы) "зубы через з...цу чесать" ;) :
Vxod0 = Mid(vxod , 4 , 1)
Vxod1 = Mid(vxod , 5 , 1)
vxod = vxod0 + vxod1
Вольты_число = Hexval(vxod)

Отредактировано Nord (2019-06-26 23:12:57)

0

65

olegkaras написал(а):

буду искать.

Еще вариант, рабочий, упростите и подправьте под себя:

Dim t6 As Word
Dim t6_2 as Byte At t6 Overlay
Dim t6_1 as Byte At t6 + 1 Overlay

....

priem = "456"+ Chr(&H08) + Chr(&H98)  - моделирую строку
temp6 = Mid(priem , 4 , 1)
temp7 = Mid(priem , 5 , 1)
t6_1 = Asc(temp6)
t6_2 = Asc(temp7)
Lcd t6                      - на дисплее 2200

0

66

olegkaras написал(а):

Как строку Vxod = &H08 ; &H98 превратить в число ? Должно быть 2200 а у меня получается Вольты_число = 3553

Vxod = Mid(vxod , 4 , 2)                                 
  Вольты_число = Hexval(vxod)

"Элементарно, Ватсон!"

При помощи оверлея и типа переменной, пример:

Код:
Dim Volt As Word
Dim VL_byte As Byte At Volt + 0 Overlay
Dim VH_byte As Byte At Volt + 1 Overlay
Dim Vxod As String * 3

' здесь парсите первую часть строки и кладёте выделенный текст по одному числу в Vxod
Vxod = "08"
VL_byte = HEXVAL (Vxod)
' здесь парсите вторую часть строки и кладёте выделенный текст по одному числу в Vxod
Vxod = "98"
VH_byte = HEXVAL (Vxod)
PRINT "Volt: "; Volt

0

67

Если у вас Vxod не строка, а байт, то:

Код:
Dim Volt As Word
Dim VL_byte As Byte At Volt + 0 Overlay
Dim VH_byte As Byte At Volt + 1 Overlay
Dim Vxod As Byte

Vxod = &h08
VL_byte = Vxod
Vxod = &h98
VH_byte = Vxod
PRINT "Volt: "; Volt

0

68

Nord написал(а):

Еще вариант, рабочий, упростите и подправьте под себя:

Dim t6 As Word
Dim t6_2 as Byte At t6 Overlay
Dim t6_1 as Byte At t6 + 1 Overlay

....

priem = "456"+ Chr(&H08) + Chr(&H98)  - моделирую строку
temp6 = Mid(priem , 4 , 1)
temp7 = Mid(priem , 5 , 1)
t6_1 = Asc(temp6)
t6_2 = Asc(temp7)
Lcd t6                      - на дисплее 2200

Вот этот пример работает , а как из четырех байтов в строке получить число ?

0

69

olegkaras написал(а):

Вот этот пример работает , а как из четырех байтов в строке получить число ?

А какой тип числа нужно получить?

0

70

Word.

Отредактировано olegkaras (2019-07-01 15:43:57)

0

71

Держите ультрасложное решение... ;)

Dim t6 As Word
Dim stroka As String * 4

....

priem = "12345678"             - моделирую строку
stroka = Mid(priem , 5 , 4)
t6 = Val(stroka)                   - в t6 будет значение 5678

0

72

Сделайте после приема полной строки два преобразования:
- принятую строку преобразуйте в байтовый массив
- полученный массив преобразуйте в строку, где каждый символ будет иметь Chr значение соответствующего байта

В результате, после получения строки из 25 значений в Hex виде, вы получите строку из 25 символов, с которыми уже проще работать.

0

73

Я хотел сказать как мне вот это &H14 ; &H08 ; &H98 ; &H03 преобразовать в одно число .
Если я по вашему примеру считаю только одно значение (вольты) все нормально , но если меряю и ток то и вольты скачут и ток , вот пример .

Dim t6 As Word
Dim t6_2 as Byte At t6 Overlay
Dim t6_1 as Byte At t6 + 1 Overlay
....
priem = "456"+ Chr(&H08) + Chr(&H98)  - моделирую строку (вольты)
temp6 = Mid(priem , 4 , 1)
temp7 = Mid(priem , 5 , 1)
t6_1 = Asc(temp6)
t6_2 = Asc(temp7)
Lcd t6                     
Вольты= t6

priem = "456"+ Chr(&H09) + Chr(&H05)  - моделирую строку (ток)
temp6 = Mid(priem , 6 , 1)
temp7 = Mid(priem , 7 , 1)
t6_1 = Asc(temp6)
t6_2 = Asc(temp7)
Lcd t6               
ТОК= t6

Отредактировано olegkaras (2019-07-01 19:25:50)

0

74

olegkaras написал(а):

temp6 = Mid(priem , 4 , 1)
temp7 = Mid(priem , 5 , 1)

Отчего в обоих случаях позиции одинаковые ? ;)

Выполните преобразование, как я предложил в #72, попробуйте.
Не дипломную же пишете, сроки не давят... ;)

0

75

Попробую, просто странно почему работает у меня только этот пример из всех предложенных ?
Строку такого формата вы имеете ввиду ?
STRING_NOV = 0xF8 0x04 0x14 0x08 0x98 0x03 0xE8 0xF6 0xE8 0xE8 0xBA

Dim String_nov As String * 250 At Temp_usart_0_input_buffer_byte Overlay

Отредактировано olegkaras (2019-07-01 19:33:30)

0

76

olegkaras написал(а):

Строку такого формата вы имеете ввиду ?

Я имею в виду, чтоб принятую строку вида
"30 31 32 33 34 35..." (без пробелов, разумеется)
привести к виду
"0 1 2 3 4 5 ..." (так же без пробелов).
А еще лучше - оставить в виде байтового массива.

Отредактировано Nord (2019-07-01 19:36:38)

0

77

Загрузите в компилятор, включите симуляцию.
В окне UART получите вашу строку (взята отсюда же) в числовом представлении.
Дальше - берете нужные данные из массива и... ;)

Код:
$Regfile="m8adef.dat"
$Crystal=4000000
$hwstack=32
$swstack=32
$framesize=32


Dim stroka As String * 80
Dim symbol As String * 2
Dim arrs(25) As Byte
Dim a As Byte
Dim b As Byte
Dim c As Byte
Dim v As Word
Dim v_2 as Byte At v Overlay
Dim v_1 as Byte At v + 1 Overlay
Dim amp As Word
Dim amp_2 as Byte At amp Overlay
Dim amp_1 as Byte At amp + 1 Overlay
Dim kw As DWord
Dim kw_3 as Byte At kw Overlay
Dim kw_2 as Byte At kw + 1 Overlay
Dim kw_1 as Byte At kw + 2 Overlay
Dim kw_0 as Byte At kw + 3 Overlay
Dim kwh As DWord
Dim kwh_3 as Byte At kwh Overlay
Dim kwh_2 as Byte At kwh + 1 Overlay
Dim kwh_1 as Byte At kwh + 2 Overlay
Dim kwh_0 as Byte At kwh + 3 Overlay
Dim freq As Word
Dim freq_2 as Byte At freq Overlay
Dim freq_1 as Byte At freq + 1 Overlay

'===================================================================
' 01 04 14 08 98 03 E8 00 00 08 98 00 00 00 00 00 00 01 F4 00 64 00 00 HH LL
'                (4-5) L напряжение 0x0898, преобразовано в десятичное 2200, дисплей 220,0 в
'                          (6-7)L ток 0x000003E8, преобразованный в десятичный 1000, дисплей 1.000A
'                                    (8-11)Мощность 0x00000898, преобразована в десятичную-2200, дисплей 220,0 Вт
'                                                        (12-15) L энергия 0x00000000, преобразована в десятичный 0, дисплей 0 Вт · ч
'                                                                                      (18-19)Частота l-0x01F4, преобразованная в десятичную-500, дисплей 50,0 Гц
'===================================================================

stroka = "010414089803E80000089800000000000001F400640000HHLL"
c = 1

For a = 1 To 37 Step 2
      symbol = Mid(stroka, a, 2)
      b = HexVal(symbol)
      arrs(c) = b
      Print arrs(c);" ";
      Incr c
Next a

Print

v_1 = arrs(4)
v_2 = arrs(5)
v = v / 10
Print "Volt - "; v; " v"

amp_1 = arrs(6)
amp_2 = arrs(7)
amp = amp / 1000
Print "Amper - "; amp; " A"

kw_0 = arrs(8)
kw_1 = arrs(9)
kw_2 = arrs(10)
kw_3 = arrs(11)
kw = kw / 10
Print "Power - "; kw; " W"

kwh_0 = arrs(12)
kwh_1 = arrs(13)
kwh_2 = arrs(14)
kwh_3 = arrs(15)
Print "Energy - "; kwh; " Wh"

freq_1 = arrs(18)
freq_2 = arrs(19)
freq = freq / 10
Print "Frequency - "; freq; " Hz"

End
'===================================================================

Даю этот вариант, т.к. у самого на подходе подобный модуль. ;)
Правда, еще не знаю, что за чип тут "соседи" воткнули... ;)

Отредактировано Nord (2019-07-02 20:39:50)

0

78

olegkaras написал(а):

Word.

Начну с того, что длина WORD составляет 2 байта, поэтому получение WORD из 4-х байт выглядит весьма экзотично.
Скорее всего нужно получить DWORD.
Это очень легко. Я не буду описывать процесс выделения HEX символов из строки, а сразу перейду к преобразованию.
Например у нас есть 4 байта &H1 &H2 &H3 &H4
При помощи VAL получаем из строкового представления реальные числа. В нашем случае 1 2 3 4
Далее из этих байт получаем два WORD.
Word1=MakeInt(2,1)
Word2=MakeInt(4,3)
Осталось получить DWORD.
DWORD=(65536 * Word1) + Word2
Всё.

0

79

Nord написал(а):

Держите ультрасложное решение... ;)

    Dim stroka As String * 4
    ....
    stroka = Mid(priem , 5 , 4)

Стринг нужно делать всегда данные+1, ибо конец строки всегда определяется по нулю.

0

80

Меня интересует вот что . Подключаю я PZEM-004T к ноутбуку и смотрю данные программой PZEM014-Master , даю ток 120А , программа показывает 120.634 А . Как эти шесть цыфр влезли в два байта ?

Вот разница до 100 ампер
F8 04 14 09 36 8B F8 00 01 7A 7D 00 03 07 3D 00 00 01 F4 00 5F 00 00 93 0E

после 100 ампер
F8 04 14 09 34 AB 04 00 01 C5 31 00 03 07 3F 00 00 01 F4 00 60 FF FF 19 E3

Кто знает что это за последние два байта , почему они постоянно скачут ?

Отредактировано olegkaras (2019-07-03 00:54:35)

0

81

olegkaras написал(а):

Подключаю я PZEM-004T к ноутбуку и смотрю данные программой PZEM014-Master , даю ток 120А , программа показывает 120.634 А . Как эти шесть цыфр влезли в два байта ?

Сдается мне, что "соседи" неправильную раскладку "ответа" дали... ;)
У них:

(4-5) L напряжение 0x0898, преобразовано в десятичное 2200, дисплей 220,0 в
(6-7)L ток 0x000003E8, преобразованный в десятичный 1000, дисплей 1.000A
(8-11)Мощность l-0x00000898, преобразована в десятичную-2200, дисплей 220,0 Вт
(12-15) L энергия 0x00000000, преобразована в десятичный 0, дисплей 0 Вт · ч
Частота l-0x01F4, преобразованная в десятичную-500, дисплей 50,0 Гц
L коэффициент мощности 0x0064, преобразованный в десятичный 100, дисплей 1,00
L сигнал тревоги 0x0000, означает, что сила тока ниже порога сигнала тревоги

Возможно, правильная такая:

(4-5) - напряжение 0x0898, преобразовано в десятичное 2200, дисплей 220,0 в
(6-9) - ток 0x000003E8, преобразованный в десятичный 1000, дисплей 1.000A
(10-13) - мощность 0x00000898, преобразована в десятичную-2200, дисплей 220,0 Вт
(14-17) - энергия 0x00000000, преобразована в десятичный 0, дисплей 0 Вт · ч
(18-19) - частота l-0x01F4, преобразованная в десятичную-500, дисплей 50,0 Гц
(20-21) - коэффициент мощности 0x0064, преобразованный в десятичный 100, дисплей 1,00
(22-23) - сигнал тревоги 0x0000, означает, что сила тока ниже порога сигнала тревоги
(24-25) - CRC

В этом варианте все встает на свои места.

0

82

olegkaras написал(а):

программа показывает 120.634 А . Как эти шесть цыфр влезли в два байта ?

Это число ну никак не может влезть в два байта.
Если это тип Single, то оно состоит из 4-х байт и будет выглядеть в HEX коде вот так: 42 F1 44 9C
Если это тип Double, то оно состоит из 8-х байт и будет выглядеть в HEX коде вот так: 40 5E 28 93 74 BC 6A 7F
Ни того ни другого в приведённых строках нет, отсюда можно сделать вывод, что эти строки никакого отношения к числу 120.634 не имеют.

0

83

sva-don написал(а):

Ни того ни другого в приведённых строках нет, отсюда можно сделать вывод, что эти строки никакого отношения к числу 120.634 не имеют.

Число 120,634 получается из целого 120634 путем деления на 1000...
См. выше - "ток 0x000003E8, преобразованный в десятичный 1000, дисплей 1.000A"

Например, для 100,000А (на дисплее) данные позиции в строке будут иметь значения "00 01 86 A0".

PS. Скорей бы модуль приехал, чтоб не "разговаривать с ветром"... ;)

Отредактировано Nord (2019-07-03 11:55:07)

0

84

olegkaras написал(а):

Как эти шесть цифр влезли в два байта ?

Так и влезли... ;)
Видимо, моя догадка в #81 верна, только значения надо считывать в последовательности "8-9-6-7" (позиции в строке).
В этом случае:
Вот разница до 100 ампер
00 01 8B F7 - 101368 - 101,368A
после 100 ампер
00 01 AB 04 - 109316 - 109,316A

Подозреваю, что и "Мощностью" и с "Энергией" подобный расклад. ;)

olegkaras написал(а):

Кто знает что это за последние два байта , почему они постоянно скачут ?

(22-23) - сигнал тревоги 0x0000, означает, что сила тока ниже порога сигнала тревоги
FF FF - сила тока выше порога сигнала тревоги ;)

0

85

Посидел с калькулятором над этой строкой, но с "новой" раскладкой значений в строке.
F8 04 14 09 36 8B F8 00 01 7A 7D 00 03 07 3D 00 00 01 F4 00 5F 00 00 93 0E

09 36 - 2358 - 235,8 в

00 01 8B F8 - 101368 - 101,368 A

00 03 7A 7D - 227965 - 22796,5 Вт

При указанном коэффициенте мощности 00 5F - 95 (или 0,95) вполне похоже на истину.
Калькулятор, правда, выдал 22707,4 Вт, но мы не знаем "арифметику" чипа.

Отредактировано Nord (2019-07-03 17:59:39)

0

86

Вот разница до 100 ампер
F8 04 14 09 36 8B F8 00 01 7A 7D 00 03 07 3D 00 00 01 F4 00 5F 00 00 93 0E
после 100 ампер
F8 04 14 09 34 AB 04 00 01 C5 31 00 03 07 3F 00 00 01 F4 00 60 FF FF 19 E3

Скачут те что желтым выделено , причем не зависимо есть ток или нет.
А красное это то что меняется когда переваливает за сто ампер , может по этому добавляется единица (сотня) ?

Отредактировано olegkaras (2019-07-03 15:15:19)

0

87

olegkaras написал(а):

Скачут те что желтым выделено , причем не зависимо есть ток или нет.

Так это же CRC, контрольная сумма строки... ;)
Если хоть какое-то значение в строке изменится, то и CRC изменится... ;)

Отредактировано Nord (2019-07-03 15:57:17)

0

88

olegkaras написал(а):

А красное это то что меняется когда переваливает за сто ампер

Значит, порог "тревоги" - 100А...
Вот и выяснили. ;)

0

89

Я вот тут табличку сваял, для лучшего восприятия... ;)
http://sh.uploads.ru/t/VXlJA.jpg

0

90

Nord написал(а):

Я вот тут табличку сваял, для лучшего восприятия...

коэффициенте мощности считается с права на лево , все остальное на оборот ?
Вот ток где то 0.247 А , 51.2 Вт
F8 04 14 09 29 00 F7 00 00 02 0A 00 00 04 74 00 00 01 F4 00 5A 00 00 D7 33

Отредактировано olegkaras (2019-07-03 19:43:01)

0