Электросчетчики Энергомеры

inspectorcot
Offline
Зарегистрирован: 21.02.2018

Доброго времени суток, форумчане!

Народ, может кто делал опрос СЕ301,СЕ303 Энергомеры по rs485 на Ардуино?

Подсажите, какие библиотеки использовать.

Может и код у кого завалялся? В образовательных целях конечно.

 

 

Serzh251
Offline
Зарегистрирован: 15.11.2017

Тоже хотел бы сдернуть показания со счётчика, для умного дома

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

inspectorcot пишет:

Народ, может кто делал опрос СЕ301,СЕ303 Энергомеры по rs485 на Ардуино?

Подсажите, какие библиотеки использовать.

Урок 60. Интерфейс RS-485: http://mypractic.ru/urok-60-interfejs-rs-485.html

... и дальше там в следующей статье.

Но первейшее что вам надо, думаю, это купить модуль расширения RS-485.

 

Serzh251
Offline
Зарегистрирован: 15.11.2017

Olej пишет:

inspectorcot пишет:

Народ, может кто делал опрос СЕ301,СЕ303 Энергомеры по rs485 на Ардуино?

Подсажите, какие библиотеки использовать.

Урок 60. Интерфейс RS-485: http://mypractic.ru/urok-60-interfejs-rs-485.html

... и дальше там в следующей статье.

Но первейшее что вам надо, думаю, это купить модуль расширения RS-485.

 


Модуль rs-485 для ардуино есть. Статью посмотрю позже. Для меня сложности в том, чтобы понять принцип раскодировки данных по протоколу

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Serzh251 пишет:
Для меня сложности в том, чтобы понять принцип раскодировки данных по протоколу

В мануале на счётчик такое должно приводиться/описываться.

Не цитируйте полностью. Позязя.

nik182
Offline
Зарегистрирован: 04.05.2015

Нет в мануале протококола. Только название - какой то ГОСТ.... Нашёл, посмотрел описание - очень похоже на MODBUS но с особенностями. Для ардуины ничего не нашёл. У них программа на PC полностью покрывает все нужды. На форумах народ сам ковырял снифферами. Результатов не нашел.

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

nik182
Offline
Зарегистрирован: 04.05.2015

Ну да... Нет там решения. И по ссылкам нет. Для размышлений http://www.energomera.ru/documentations/ce102_op.pdf

 

Serzh251
Offline
Зарегистрирован: 15.11.2017

вот есть какая то библиотека

https://github.com/semiotproject/Energomera-CE102-lib

nik182
Offline
Зарегистрирован: 04.05.2015

Библиотека выглядит соответствующей описанию протокола, вот только секундная задержка после посылки каждого байта напрягает.

Serzh251
Offline
Зарегистрирован: 15.11.2017

nik182 пишет:

Библиотека выглядит соответствующей описанию протокола, вот только секундная задержка после посылки каждого байта напрягает.

вопрос как ее применять?

лично мне самому не разобраться без примера

inspectorcot
Offline
Зарегистрирован: 21.02.2018

Мне удалось опросить.
Чуть позже дам скетч

inspectorcot
Offline
Зарегистрирован: 21.02.2018

Заливайте в эти ваши Ардуины и тестите. Все должно работать( у меня работает) Допиливайте по своему желанию.

Естественно все работает через конвертер Rs485-ttl

СЕ301, СЕ303

#include <SoftwareSerial.h>
long Previous = 0; 
int val = 0;
int Time_1 = 1;         
int Time_2 = 2;          
int Time_3 = 3;
int Time_4 = 4;
int Time_5 = 15; 

// открываем сессию
byte cmd1[] = {0xaF,0x3F,0x21,0x8D,0x0A};
// читаем тип счетчика
byte cmd2[] = {0x06,0x30,0x35,0xb1,0x8d,0x0a};
// снимаем показания
byte cmd3[] = {0x81,0xd2,0xb1,0x82,0xc5,0xd4,0x30,0x50,0xc5,0x28,0xa9,0x03,0xb7};
// напряжения на фазах
byte cmd4[] = {0x81,0xd2,0xb1,0x82,0x56,0xcf,0xcc,0xd4,0x41,0x28,0xa9,0x03,0x5f};

#define DIR 8 // пин управления прием/передача
 
SoftwareSerial RS485 (7, 6); // RX, TX

void setup()
{
  Serial.begin(9600);
  RS485.begin(9600);
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, HIGH);
}
void loop()
{ 
   if (RS485.available())
    {
    char response = RS485.read();
    response &= 0x7F;// convert 8N1 to 7E1
    Serial.print(response);
    }
    if (millis() - Previous > 1000)
  {
    Previous = millis();        
    val ++;
          
       if (val == Time_1)
       {
         digitalWrite(DIR, HIGH);
         RS485.write (cmd1,5);
         digitalWrite(DIR, LOW);
       }
       if (val == Time_2)
       {
        digitalWrite(DIR, HIGH);
         RS485.write (cmd2,6);
        digitalWrite(DIR, LOW); 
       }
       if (val == Time_3)
       {
         digitalWrite(DIR, HIGH);
         RS485.write (cmd3,13);
         digitalWrite(DIR, LOW);
       }
       if (val == Time_4)
       {
         digitalWrite(DIR, HIGH);
         RS485.write (cmd4,13);
         digitalWrite(DIR, LOW);
       }
       if (val == Time_5)
       {
         val = 0;
         
         
       }
 
  }
}
   

 

Serzh251
Offline
Зарегистрирован: 15.11.2017

спасибо добрый человек

еще не тестировал, но появились вопросы: как добавить в код текущие показания счетчика, ток и мощность?

inspectorcot
Offline
Зарегистрирован: 21.02.2018

текущие показания есть в скетче который я выложил выше, а все остальное я вам завтра допишу, а то сегодня уже неохота

Serzh251
Offline
Зарегистрирован: 15.11.2017

да, точно. это общие показания по всем тарифам?

пытался разобраться как формируются строки 10-17 и 35, не получилось)

позже протестирую у себя на счетчике, у меня С102

 

inspectorcot
Offline
Зарегистрирован: 21.02.2018

на 102 не будет работать, там протокол обмена другой этотт скетч для 301,303

Serzh251
Offline
Зарегистрирован: 15.11.2017

inspectorcot пишет:

на 102 не будет работать, там протокол обмена другой этотт скетч для 301,303

а вот это печально

есть желание пояснить как мне сделать код для 102?

я так понимаю поменяется в основном код в строках 10-17?

inspectorcot
Offline
Зарегистрирован: 21.02.2018

я не видел протокол на 102, но скорее всего поменяется еще и 35
чуть позже гляну

Serzh251
Offline
Зарегистрирован: 15.11.2017

в посту №7 документ с протоколами для разных счетчиков

в моем посту №8 библиотека для 102, найденная на просторах интернета, но я не знаю как ее применять

вообще по энергомере мало инфы, больше по меркурию

inspectorcot
Offline
Зарегистрирован: 21.02.2018

А вообще попробуйте подключить счетчик к компьютеру и попробовать опросить через AdminTools и посмотрите, какие запросы шлет счетчик. Можете еще паралельно послушать порт через Serial Port Monitor или что-то похожее. Можете потом руками в нем попробовать отослать те же запросы.

Serzh251
Offline
Зарегистрирован: 15.11.2017

USB-RS-485 у меня нет, чтобы опросить с помощью AdminTools, если только ардуино использовать в качестве переходника 

залил ваш скетч, все таки у меня работает. получаю вот что

/EKT5CE102Mv01
P0(001) g ET0PE(5466.52)
(3386.10)
(2080.42)
(0.00)
(0.00)
(0.00)
 6 VOLTA(221.37)
показания общие, первый и второй тариф и напряжение соответствует тому, что на счетчике
нюанс такой, перед VOLTA всегда разный символ
inspectorcot
Offline
Зарегистрирован: 21.02.2018

0x81 0xd2 0xb1 0x82 0xc3 0x55 0xd2 0xd2 0xc5 0x28 0xa9 0x03 0x5a

Попробуйте считать ток

Serzh251
Offline
Зарегистрирован: 15.11.2017

вставил ток, вместо напряжения, получил

n/EKT5CE102Mv01
 P0 (001) g ET0PE(5467.21)
(3386.79)
(2080.42)
(0.00)
(0.00)
(0.00)
 B CURRE(9.696)
x
ток реальный, работает
inspectorcot
Offline
Зарегистрирован: 21.02.2018

чем вам еще помочь?

Serzh251
Offline
Зарегистрирован: 15.11.2017

для меня осталось не понятным как формируется запрос в счетчик, пытаюсь вникнуть

далее буду изучать вопрос перевода VOLTA(237.88) во float переменную, для использования ее в разных частях моего скетча (кстати все это для умного дома)

мусор что у меня вместе с данными сыпется, видимо от того что я просто использую 2 жилы витой пары, и надо добавить терминальные резисторы

вам уже спасибо за эту инфу

inspectorcot
Offline
Зарегистрирован: 21.02.2018

Ардуино порт работает в формате 8N1(8 - бит данных,N (none) - бит четности, 1 - стоповый бит),  а у счетчика 7e1 , ( 7 бит данных, четность E(even), 1 - cтоповый бит).

Возможно кстати мусор из-за того что не хватает одного бита в данных, у меня он (мусор) вроде тоже есть, я не помню.

Так вот. первый запрос в счетчик в ASCii выглядит так  - /?!<CR><LF>

В HEX - 2f 3f 0d 0a, но так как ардуино не вычисляет бит четности, то делал я это руками.

Открываем к примеру этот конвертер https://www.asciitohex.com/

2f 3f 0d 0a пишем это в разел HEX и конвертируем. В окне с бинарными значениями находим биты с нечетным количеством 1, и меняем первую цифру на 1. Пример 2f -00101111 - 10101111-AF.

Если не производить этого, то счетчик не понимает запрос.

Объяснил как мог, на сколько сам понимаю.

 

inspectorcot
Offline
Зарегистрирован: 21.02.2018

Вам стало бы понятней, если бы вы видели опрос AdminTools-ом

Вот так выглядит опрос AdminTools

Снятие показаний электроэнергии

Serzh251
Offline
Зарегистрирован: 15.11.2017

да, сейчас понятно откуда и как формируется hex для ардуино

читая описание протокола обмена так и не понял где взять или как сформировать hex код, а тут получается все это проще увидеть в AdminTools и сконвертировать описанным вами способом?

inspectorcot
Offline
Зарегистрирован: 21.02.2018

да,  проще всего так.

 

inspectorcot
Offline
Зарегистрирован: 21.02.2018

Если  у вас получиться извлечь в отдельные переменные данные, то пиши свои успехи здесь, я думаю пригодиться кому-то, да и я воспользуюсь, а то пока занят другим.

Serzh251
Offline
Зарегистрирован: 15.11.2017

обязательно

данной инфы очень мало

сейчас буду копать как запустить у меня AdminTools

inspectorcot
Offline
Зарегистрирован: 21.02.2018

Удачи.

без преобразователя интерфейса будет трудно

Serzh251
Offline
Зарегистрирован: 15.11.2017

пока с преобразованием в переменные глухо, с наводками знакомого специалиста прогера пытался разобраться в функциях СИ, не получается, но думаю он мне поможет

с AdminTools тоже ничего, нужен переходник, заказал в китае, жду..

буду признателен если вы мне скинете Нех коды с AdminTools на получение активной мощности и частоты сети, я переконвентирую и попробую снять эти параметры

inspectorcot
Offline
Зарегистрирован: 21.02.2018

так-с вот:

 

Частота сети : 01 52 31 02 46 52 45 51 55 28 29 03 5с

 

 

Serzh251
Offline
Зарегистрирован: 15.11.2017

чтобы перевести строку во float, есть функция Volts = atof(response);

но при этом response должно являться строкой, а строка-оканчивается на \0

проблема в том как response  сделать строкой

inspectorcot
Offline
Зарегистрирован: 21.02.2018

мощность : 01 52 31 02 50 4f 57 45 50 28 29 03 64

 

 

inspectorcot
Offline
Зарегистрирован: 21.02.2018

char[] chArray = "пример";
String str(chArray);

на просторах интернета нашел что-то такое, попробуйте

 

http://bigbarrel.ru/%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B0%D1%...

Serzh251
Offline
Зарегистрирован: 15.11.2017

что то ни частоту, ни мощность не удается считать

inspectorcot
Offline
Зарегистрирован: 21.02.2018

сейчас я попробую

inspectorcot
Offline
Зарегистрирован: 21.02.2018

0x81,0xd2,0xb1,0x82,0x50,0xcf,0xd7,0xc5,0x50,0x28,0xa9,0x03,0xe4

мощность считало, с частотой пока не получилось, сейчас посмотрим

inspectorcot
Offline
Зарегистрирован: 21.02.2018

0x81,0xd2,0xb1,0x82,0xc6,0xd2,0xc5,0xd1,0x55,0x28,0xa9,0x03,0x5c

частота

Serzh251
Offline
Зарегистрирован: 15.11.2017

почему числа 50, 03, 28 остаются без конвертирования? (на примере мощности)

с вашим кодом и у меня работает и мощность и частота

inspectorcot
Offline
Зарегистрирован: 21.02.2018

 50 = 01010000

03 = 00000011

28 = 00101000

 

у всех по четному количеству "1"

а первый "0" меняем на "1" в случае если нечетно количество "1"

2f = 00101111, значит меняем на 10101111 и конвертируем опять, получается - af

Serzh251
Offline
Зарегистрирован: 15.11.2017

да, теперь понятно

поступило предложение перенастроить сериал порт ардуино на 7Е1, для того чтобы избавиться от сомнительного преобразования в коде response &= 0x7F;// convert 8N1 to 7E1

https://www.arduino.cc/reference/en/language/functions/communication/ser...

я сейчас тестирую счетчик на ардуино нано, с ним данная махинация не получится

позже доберусь до основной системы, подключу туда RS-485, там как раз ардуино мега

inspectorcot
Offline
Зарегистрирован: 21.02.2018

я пробовал, у меня не пошло. Может не так что делал. Попробуйте будет интересно узнать ваш опыт.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Чтобы не перекодировать данные, можно RS485 повесить на хард сериал. Тогда инит хард сериала сделать так 

Serial.begin (9600, SERIAL_7E1);

а данные выводить (так как хард уже занят), например, на lcd или в монитор порта через USB<->UART

Эмм, опоздал немного)

MaksVV
Offline
Зарегистрирован: 06.08.2015

inspectorcot пишет:

я пробовал, у меня не пошло. Может не так что делал. Попробуйте будет интересно узнать ваш опыт.

может вы на софтсериале пробовали, вроде как это только на хард канает

Serzh251
Offline
Зарегистрирован: 15.11.2017

да, тоже как вариант

 USB<->UART у меня где то валялся

Serzh251
Offline
Зарегистрирован: 15.11.2017

странное дело, подключил все на ардуино мега с изначально рабочим кодом, но RS-485 на хард сериал, не работает(в коде, естественно поменял необходимое), работает только на софт сериал

MaksVV
Offline
Зарегистрирован: 06.08.2015

харды разные пробовали? у меня так на уно было. GSM модуль на аппаратном не хотел запускаться, правда я не стал разбираться в чем причина. повесил на софтсериал, так и работает до сих пор.