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

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

Вот по Modbus, если лишнего не удалил, то должен работать.

#include <SoftwareSerial.h>
#include <SimpleModbusSlave.h>

#define TxEnablePin  2     // Tx/Rx пин RS485
#define baud         9600  // скоростьобмена по последовательному интерфейсу. (UART)
#define timeout      7000  // Длительность ожидание ответа (таймаут modbus)
#define polling      9600   // скорость опроса по modbus
#define retry_count  10    // количесво запросов modbus до ошибки и останова обмена
#define Slave_ID     1     // Адрес Slave устройсва
#define DIR 8 



SoftwareSerial RS485 (7, 6); // RX, TX

int i = 0;




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 = 5;
int Time_6 = 6;
int Time_7 = 100; 



int intVar;



byte fast1[] = {0xaf,0x3f,0x21,0x81,0xd2,0xb1,0x82,0xc5,0xd4,0x30,0x50,0xc5,0x28,0xa9,0x03,0xb7};

enum 
{ 
ADC_VAL, 
PWM_VAL, 
HOLDING_REGS_SIZE=14
 
};


unsigned int holdingRegs[HOLDING_REGS_SIZE]; 
 
 


float values[10];
char strBuffer[20];
uint8_t valueIdx = 0, strBufferPos = 0, incomingCharPos = 0, packetProcessing = false, catchedCR = false;

void setup() {
  Serial.begin(9600);
  RS485.begin(9600);
  pinMode(DIR, OUTPUT);
   pinMode(TxEnablePin, OUTPUT);

   modbus_configure(&Serial, baud, SERIAL_8N1, Slave_ID, TxEnablePin, HOLDING_REGS_SIZE, holdingRegs);
   modbus_update_comms(baud, SERIAL_8N1, 1); 
 
}

void loop() {

 

  

  
  modbus_update();
  
   holdingRegs[2] = values[0];
  




  


 
  if (RS485.available())
    {
      char response = RS485.read();
    response &= 0x7F;// convert 8N1 to 7E1
    

      char inChar = response;
  
    response++;
    
    switch (inChar) {
      
      case 0x02:
        
        valueIdx = 0;
        
        packetProcessing = true;
        break;

     
      case 0x03:
       
        packetProcessing = false;
       
         // Serial.println(values[0]);
      
        break;

      
      case 0x0D:
        catchedCR = true;
        break;

      
      case 0x0A:
        if (packetProcessing && catchedCR) {
          catchedCR = false;
          
          valueIdx++;
        }
        break;

      case '(':
        if (packetProcessing) {
          
          strBufferPos = 0;
        }
        break;

      
      case ')':
        if (packetProcessing) {
          
          strBuffer[strBufferPos] = 0x00;
         
          values[valueIdx] = atof(strBuffer);
        }
        break;

      
      default:
        if (!packetProcessing) {
          break;
        }
        
        strBuffer[strBufferPos] = inChar;
        if (strBufferPos < sizeof(strBuffer)) {
          strBufferPos++;
        }
    }
  }
  if (millis() - Previous > 1000)
  {
    Previous = millis();        
    val ++;
          
       if (val == Time_1)
       {
         digitalWrite(DIR, HIGH);
         RS485.write (fast1,16);
         digitalWrite(DIR, LOW);
       }

     

   
  
       if (val == Time_7)
       {
        
         val = 0;
         
         
       }
 
  }

}
  

 

pasha413
Offline
Зарегистрирован: 27.11.2016

Спасибо, а какие данные считывает?

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

Здесь только электроэнергия

pasha413
Offline
Зарегистрирован: 27.11.2016

Понял, спасибо, буду пробовать, разбираться с кодом)))

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

Пожалуйста

pasha413
Offline
Зарегистрирован: 27.11.2016

inspectorcot пишет:

Вот по Modbus, если лишнего не удалил, то должен работать.

#include <SoftwareSerial.h>
#include <SimpleModbusSlave.h>

#define TxEnablePin  2     // Tx/Rx пин RS485
#define baud         9600  // скоростьобмена по последовательному интерфейсу. (UART)
#define timeout      7000  // Длительность ожидание ответа (таймаут modbus)
#define polling      9600   // скорость опроса по modbus
#define retry_count  10    // количесво запросов modbus до ошибки и останова обмена
#define Slave_ID     1     // Адрес Slave устройсва
#define DIR 8 



SoftwareSerial RS485 (7, 6); // RX, TX

int i = 0;




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 = 5;
int Time_6 = 6;
int Time_7 = 100; 



int intVar;



byte fast1[] = {0xaf,0x3f,0x21,0x81,0xd2,0xb1,0x82,0xc5,0xd4,0x30,0x50,0xc5,0x28,0xa9,0x03,0xb7};

enum 
{ 
ADC_VAL, 
PWM_VAL, 
HOLDING_REGS_SIZE=14
 
};


unsigned int holdingRegs[HOLDING_REGS_SIZE]; 
 
 


float values[10];
char strBuffer[20];
uint8_t valueIdx = 0, strBufferPos = 0, incomingCharPos = 0, packetProcessing = false, catchedCR = false;

void setup() {
  Serial.begin(9600);
  RS485.begin(9600);
  pinMode(DIR, OUTPUT);
   pinMode(TxEnablePin, OUTPUT);

   modbus_configure(&Serial, baud, SERIAL_8N1, Slave_ID, TxEnablePin, HOLDING_REGS_SIZE, holdingRegs);
   modbus_update_comms(baud, SERIAL_8N1, 1); 
 
}

void loop() {

 

  

  
  modbus_update();
  
   holdingRegs[2] = values[0];
  




  


 
  if (RS485.available())
    {
      char response = RS485.read();
    response &= 0x7F;// convert 8N1 to 7E1
    

      char inChar = response;
  
    response++;
    
    switch (inChar) {
      
      case 0x02:
        
        valueIdx = 0;
        
        packetProcessing = true;
        break;

     
      case 0x03:
       
        packetProcessing = false;
       
         // Serial.println(values[0]);
      
        break;

      
      case 0x0D:
        catchedCR = true;
        break;

      
      case 0x0A:
        if (packetProcessing && catchedCR) {
          catchedCR = false;
          
          valueIdx++;
        }
        break;

      case '(':
        if (packetProcessing) {
          
          strBufferPos = 0;
        }
        break;

      
      case ')':
        if (packetProcessing) {
          
          strBuffer[strBufferPos] = 0x00;
         
          values[valueIdx] = atof(strBuffer);
        }
        break;

      
      default:
        if (!packetProcessing) {
          break;
        }
        
        strBuffer[strBufferPos] = inChar;
        if (strBufferPos < sizeof(strBuffer)) {
          strBufferPos++;
        }
    }
  }
  if (millis() - Previous > 1000)
  {
    Previous = millis();        
    val ++;
          
       if (val == Time_1)
       {
         digitalWrite(DIR, HIGH);
         RS485.write (fast1,16);
         digitalWrite(DIR, LOW);
       }

     

   
  
       if (val == Time_7)
       {
        
         val = 0;
         
         
       }
 
  }

}
  

 

не смог найти подходящую библиотеку, поделитесь, пожалуйста

"SimpleModbusSlave.h"/

И для чего #define DIR 8 ?

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 все библиотеки ищем тут  

https://github.com/github

вот эту ложим в папку для библиотек

https://github.com/HWHardsoft/SimpleModbusSlaveMKR 

8 пин, думаю для визуальной индикации записи

pasha413
Offline
Зарегистрирован: 27.11.2016

DIVGENY пишет:

 все библиотеки ищем тут  

https://github.com/github

вот эту ложим в папку для библиотек

https://github.com/HWHardsoft/SimpleModbusSlaveMKR 

8 пин, думаю для визуальной индикации записи

благодарю!

счетчик на даче, хочу сделать передачу данных на свой сервер по GPRS/

Опа, а с esp8266 библиотека не работает

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

8 пин используется для переключение направления опрос/передача у преобразователей rs485-ttl

 

попробуйте эту 

https://github.com/jecrespo/simple-modbus/tree/master/Modbus%20RTU%20lib...

pasha413
Offline
Зарегистрирован: 27.11.2016

inspectorcot пишет:

8 пин используется для переключение направления опрос/передача у преобразователей rs485-ttl


У меня такой:
http://roboshop.spb.ru/image/cache/catalog/demo/product/XY-017-800x800.jpg
Там нет такого пина.

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

тогда просто игнорируйте этот пин

pasha413
Offline
Зарегистрирован: 27.11.2016

inspectorcot пишет:

тогда просто игнорируйте этот пин


Спасибо, через пару дней попробую

svetozar161
Offline
Зарегистрирован: 09.03.2016

Уважаемый Serzh251, тоже приобрел счетчик Энергомера 102 и тоже пытаюсь соединить что куда, плюс еще хочу сконнектить с сервером majordomo по mqtt. Немогли бы вы рассказать, как у вас все подключено? Как подключен адаптер 485 и куда. Спасибо.

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

svetozar161 пишет:

Уважаемый Serzh251, тоже приобрел счетчик Энергомера 102 и тоже пытаюсь соединить что куда, плюс еще хочу сконнектить с сервером majordomo по mqtt. Немогли бы вы рассказать, как у вас все подключено? Как подключен адаптер 485 и куда. Спасибо.

Насколько я помню контакты 10,11 (уточните в документации к счетчику, она есть на офф сайте) это RS-485

В мажор домо есть модуль для счетчиков энергомера, в свое время хотел себе установить мажордомо, но решил перейти на опенхаб (правда нет времени им заняться вообще). Я с модулем не разбирался, но наверное можно его настроить на работу напрямую через USB-485

У вас мажордомо где стоит?ардуино в системе тоже есть? Еще попробуйте подключить счетчик к ПК и установить штатную программу с офф сайта энергомеры, для проверки работоспособности

svetozar161
Offline
Зарегистрирован: 09.03.2016

 Мажор стоит на сервере windows, счетчик пока подключить не могу - недавно купил его, RS485 тоже пока едет. Промежуточным звеном хочу поставить Arduino Due с ethernet шилдом, MQTT для связи с мажором, на ней будет управление котлом, 4 датчика температуры, водомер, электросчетчик, контроль протечки, в перспективе газовый счетчик и контроль загазованности с газовым клапаном.

 Сейчас стоит мега 2560 на ней крутится Arduino Mega Server идут запросы GET на мажорик, реализовано управление котлом и висят в воздухе 3 датчика далласы.

Жду пока приедет конвертер и ардуина дуе))

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

я MQTT не изучал, но видимо придется. На опенхаб солнечный контроллер Epsolar по Modbus хорошо отрабатывает. Хотел так же подсоединить существующий УД на ардуино мега, но с модбасом беда. не удалось наладить связь с опенхаб ( на СТМ32 все получилось, планирую в будущем на него переехать). Энергомеру пропускать буду через ардуино..но это все наверно на пенсии)

RedCat
Offline
Зарегистрирован: 01.12.2011

Я вот дико извиняюсь, но.

А не могли бы вы, многоуважаемый inspectorcot, поспособствовать переводу вашего кода на Pyton для безжалостного его использования на Малинке (Raspberry Pi)? Ардуиновский код на моем СЕ301 работает на ура, но основной сервер на малинке и дабы не плодить сущностей...

Покорнейше прошу о вспоможении в вопросе!

С уважением ваш РыжийКот.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

RedCat пишет:

Я вот дико извиняюсь, но.

А не могли бы вы, многоуважаемый inspectorcot, поспособствовать переводу вашего кода на Pyton для безжалостного его использования на Малинке (Raspberry Pi)? Ардуиновский код на моем СЕ301 работает на ура, но основной сервер на малинке и дабы не плодить сущностей...

Открою страшную тайну - кроме питона для малинки можно писать и на C/C++, а что бы было проще портировать есть всякие проекты типа- 

https://www.deviceplus.com/how-tos/raspberrypi-guide/how-to-run-arduino-...

RedCat
Offline
Зарегистрирован: 01.12.2011

Благодарю за ответ, но.

Страшную тайну знаю, даже слегка пробовал. Но вот не покидает меня ощущение что это все немножко из  г̶.̶.̶н̶а̶ ̶и̶ ̶п̶а̶л̶о̶к спичек и желудей сделано. Blink-то конечно заведется, а что посложнее? Здесь люди три страницы пытаются float из serial monitor вытащить и то не слишком хорошо получается, а где все эти радости на малине взять?

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

	#include <SoftwareSerial.h>

потянет за собой связанные ардуинские библиотеки которые не совсем захотят работать на малине.

Я пробовал запустить весь этот ливер на NodeMCU - таки нет, просит менять библиотеки и несть этим просьбам конца.

Вот от того и прошу по возможности помощи.

З.Ы. В настоящий момент имею систему на малине работающую на импульсном выходе со счетчика. На питоне обрабатываю прерывания по импульсу со счетчика и перевожу в потребленную мощность. Но это все рано через ж.., так как при сбое по питанию имеем расхождение с реальными показаниями за время перезагрузки малины. Они конечно корректируются ручками с показаниями с AdminTools, но недает покоя мысль что в счетчике сидят правильные показания и их можно просто взять - ведь мы стремимся к совершенству!

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

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

RedCat
Offline
Зарегистрирован: 01.12.2011

Огород же! И совсем не кошерно!

sadman41
Offline
Зарегистрирован: 19.10.2016

Под линупсом разобрать поток данных проще, чем на ардуине. Поэтому и мучаются тут люди с флотами.

RedCat
Offline
Зарегистрирован: 01.12.2011

Отож и я про лишние сущности...

sadman41
Offline
Зарегистрирован: 19.10.2016

На питоне не пишу, но Гуглом умею пользоваться: https://pyserial.readthedocs.io/en/latest/pyserial_api.html

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

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

RedCat
Offline
Зарегистрирован: 01.12.2011

sadman41 пишет:
На питоне не пишу, но Гуглом умею пользоваться

За ссылку благодарю, будем посмотреть!

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

Здравствуйте, на Python не пишу, помочь не смогу, извините

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

чет я забросил тогда счетчик и так и не подключил считывание

на каком коде в итоге остановились?

я забуксовал тогда на вытаскивании из прилетаемых данных в виде строки в переменные float

RedCat
Offline
Зарегистрирован: 01.12.2011

Ну что братцы, не так уж страшен оказался тот питон!

Во-первых моя огромная благодарность sadman41 за полезную ссылку!

И собственно код который оказался до безобразия краток, может таки кому пригодится.

 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 
# Raspberry Pi Energomera CE301 read Power Value
# (c)KSV based on pySerial https://pyserial.readthedocs.io/en/latest/index.html

import serial
import sys, traceback
from time import sleep

# открываем сессию
cmd1 = [0x2F,0x3F,0x21,0x0D,0x0A]
# читаем тип счетчика
cmd2 = [0x06,0x30,0x35,0xB1,0x0D,0x0A]
# потребленная суммарная мощность
cmd3 = [0x01, 0x52, 0x31, 0x02, 0x45, 0x54, 0x30, 0x50, 0x45, 0x28, 0x29, 0x03, 0x37]

try:

	ser = serial.Serial('/dev/ttyUSB0', 9600, bytesize=serial.SEVENBITS, parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE,  timeout=5)
	ser.write(cmd1)
	response = ser.read(14)
	print(response)
	sleep(1)

	ser.write(cmd2)
	response = ser.read(14)
	print(response)
	sleep(1)
	
	ser.write(cmd3)
	response = ser.read(22)
	print(response)

	response=response[response.find(b'(')+1:response.find(b')')]
	print(response)

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

except KeyboardInterrupt:
	print("Exit pressed Ctrl+C") 				# Выход из программы по нажатию Ctrl+C 
except Exception as e:
	# ...
	print("Other Exception")            		# Прочие исключения
	print("--- Start Exception Data:")
	traceback.print_exc(limit=2, file=sys.stdout) # Подробности исключения через traceback
	print("--- End Exception Data:")
finally: 
	print("CleanUp") 							# Информируем о сбросе
	ser.close()            						# close port
	print("\n==============")
	print("End of program")                     # Информируем о завершении работы программы

 

svetozar161
Offline
Зарегистрирован: 09.03.2016

Здравствуйте товарищи! Темка подзаглохла, но считаю, что напрасно)) Так и не смог я считать инфу со своего СЕ102(( Говорят там протокол совершенно другой. В общем скетч из этой темы не фурычит - счетчик даже виду не подает. Надо накормить его своими байтами, а вот как это сделать((

Заказал на али USB-485 жду, потом посмотрю через AdminTools что он пишет. Если вообще порт живой там.

Сегодня сконнектил две Nano через два конвертера 485-TTL, сделал одну мастером, вторую слейвом - все бегает туда-сюда, просто отлично. С этим же долбанным счетчиком, засада! Надо было брать Меркурий или хотя бы 102М(( Кто знал...

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

svetozar161 пишет:

Здравствуйте товарищи! Темка подзаглохла, но считаю, что напрасно)) Так и не смог я считать инфу со своего СЕ102(( Говорят там протокол совершенно другой. В общем скетч из этой темы не фурычит - счетчик даже виду не подает. Надо накормить его своими байтами, а вот как это сделать((

Заказал на али USB-485 жду, потом посмотрю через AdminTools что он пишет. Если вообще порт живой там.

Сегодня сконнектил две Nano через два конвертера 485-TTL, сделал одну мастером, вторую слейвом - все бегает туда-сюда, просто отлично. С этим же долбанным счетчиком, засада! Надо было брать Меркурий или хотя бы 102М(( Кто знал...


У меня все нормально работает на 102, вечером скину код если не забуду

yden
Offline
Зарегистрирован: 30.01.2016

Добрый.

Плиз подскажите код. Счетчик СЕ303, ардуино нано. Считать данные хочу. Тему всю прочитал, но так и не понял где рабочий код. Нужны показания счетчика, напряжение по фазам, нагрузка (А) или мощность по фазам.

 

благодарю

svetozar161
Offline
Зарегистрирован: 09.03.2016

Спасибо, буду ждать!

svetozar161
Offline
Зарегистрирован: 09.03.2016

Serzh251 пишет:

У меня все нормально работает на 102, вечером скину код если не забуду[/quote]

Спасибо буду ждать!

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

svetozar161 пишет:

Спасибо, буду ждать!

если не ошибся с последней версией скетча, то вот он

[code]
#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 = 5; 
int Time_6 = 6;
int Time_8 = 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};// напряжение
byte cmd5[] = {0x81,0xd2,0xb1,0x82,0xc3,0x55,0xd2,0xd2,0xc5,0x28,0xa9,0x03,0x5a};// ток 
byte cmd6[] = {0x81,0xd2,0xb1,0x82,0x50,0xcf,0xd7,0xc5,0x50,0x28,0xa9,0x03,0xe4}; //мощность

float U220, I220, P220, T, T1, T2;
float values[3];
char strBuffer[20];

uint8_t valueIdx = 0, strBufferPos = 0, packetProcessing = false, catchedCR = false;
boolean packetProcessing_Volta = false, packetProcessing_Curre = false, packetProcessing_Power = false;

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

void setup()
{
  RS485.begin(9600);
  Serial.begin(9600);
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, HIGH);
}
void loop()
{ 
   if (RS485.available()>0)
    {
    char response = RS485.read();
    response &= 0x7F;// convert 8N1 to 7E1
      char inChar = response;
      response++;
    switch (inChar) {
      case 0x02:
        valueIdx = 0;
        packetProcessing = true;
        break;
      case 0x03:
        // packet processing is finished
        packetProcessing = false;
        break;
      case 0x0D:
        catchedCR = true;
        break;
      case 0x0A:
        if (packetProcessing && catchedCR) {
          catchedCR = false;
          valueIdx++;
        }
        break;
      case 'V':
        packetProcessing_Volta = true;
        break;
      case 'U':
        packetProcessing_Curre = true;
        break;
      case 'W':
        packetProcessing_Power = true;
      case '(':
        if (packetProcessing) {
          strBufferPos = 0;
        }
        break;
      case ')':
        if (packetProcessing) {
          strBuffer[strBufferPos] = 0x00;
             if (packetProcessing_Volta) {U220 = atof(strBuffer);}
             if (packetProcessing_Curre) {I220 = atof(strBuffer);}
             if (packetProcessing_Power) {P220 = atof(strBuffer);}     
          values[valueIdx] = atof(strBuffer);
          T1=values[1];
          T2=values[2];
          T=T1+T2;
        packetProcessing_Volta = false; 
        packetProcessing_Curre = false; 
        packetProcessing_Power = false;
        }
        break;
      default:
        if (!packetProcessing) {
          break;
        }
        strBuffer[strBufferPos] = inChar;
        if (strBufferPos < sizeof(strBuffer)) {
          strBufferPos++;
        }
    }
  }
   if (millis() - Previous > 1000)
  {
    Serial.print("Volta= "); Serial.print(U220);      Serial.println(" V");
    Serial.print("Power= "); Serial.print(P220*1000); Serial.println(" W");
    Serial.print("Curre= "); Serial.print(I220);      Serial.println(" A");
    Serial.print("T= ");     Serial.print(T);         Serial.println(" kWt*h");
    Serial.print("T1= ");    Serial.print(T1);        Serial.println(" kWt*h");
    Serial.print("T2= ");    Serial.print(T2);        Serial.println(" kWt*h");
    Previous = millis();        
    val ++;
    switch (val) {   
      case 1:
         digitalWrite(DIR, HIGH); RS485.write (cmd1,5); digitalWrite(DIR, LOW);
         break;
      case 2:
         digitalWrite(DIR, HIGH); RS485.write (cmd2,6); digitalWrite(DIR, LOW); 
         break;
      case 3:
         digitalWrite(DIR, HIGH); RS485.write (cmd3,13); digitalWrite(DIR, LOW);
         break;
      case 4:
         digitalWrite(DIR, HIGH);RS485.write (cmd4,13); digitalWrite(DIR, LOW);
         break;
      case 5:
         digitalWrite(DIR, HIGH); RS485.write (cmd5,13); digitalWrite(DIR, LOW);
         break;
      case 6: 
         digitalWrite(DIR, HIGH); RS485.write (cmd6,13); digitalWrite(DIR, LOW);
      case 8:
        val = 0;
        break;
       }
    }
}
[/code]

 

svetozar161
Offline
Зарегистрирован: 09.03.2016

Serzh251 пишет:

если не ошибся с последней версией скетча, то вот он

[/quote]

Залил для проверки в Nano - ничего не происходит. Листинг порта

Volta= 0.00 V
Power= 0.00 W
Curre= 0.00 A
T= 0.00 kWt*h
T1= 0.00 kWt*h
T2= 0.00 kWt*h

У вас точно CE102? И в какую плату вы ставите эту прошивку? У меня кстати 485-TTL конвертер без управляющего пина, просто tx rx и питание. Может это как-то влияет? И да, питание дополнительное 12 вольт нужно на счетчик подавать, на 11, 12 пин?

 

 

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

svetozar161 пишет:

Serzh251 пишет:

если не ошибся с последней версией скетча, то вот он

 

Залил для проверки в Nano - ничего не происходит. Листинг порта

Volta= 0.00 V
Power= 0.00 W
Curre= 0.00 A
T= 0.00 kWt*h
T1= 0.00 kWt*h
T2= 0.00 kWt*h

У вас точно CE102? И в какую плату вы ставите эту прошивку? У меня кстати 485-TTL конвертер без управляющего пина, просто tx rx и питание. Может это как-то влияет? И да, питание дополнительное 12 вольт нужно на счетчик подавать, на 11, 12 пин?

да, у меня точно СЕ102

работало и на уно и на меге

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

питание не надо на счетчик подавать

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

 

[/quote]

svetozar161
Offline
Зарегистрирован: 09.03.2016

Serzh251 пишет:

да, у меня точно СЕ102

К сожалению у меня нету пока USB-485 - заказал на али, жду. Запускал AdminTools и меня смутило, что программа автоматом настраивает порт как baud2400, 8N1.

Непонятно...

И запрос идет такой

C0 48 00 00 FD 00 00 00 00 00 D0 01 00 FD C0              ?H..?.....?.

Совсем непохоже на ваши байты...

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

Я вот тоже почитал описание протокола у се102 и мне кажеться что он другой.

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

ну тут опять же если как у се301 и подобых, есть 2 режима опроса

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

лучше дождитесь прихода преобразователи usb-485. Проверите работоспособность, а потом уже будет видно

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

inspectorcot пишет:

Я вот тоже почитал описание протокола у се102 и мне кажеться что он другой.

может протокол и отличается чем то ( я не читал), но я использовал те же запросы что и у вас и у мена на СЕ102 все работает

svetozar161
Offline
Зарегистрирован: 09.03.2016

Здравствуйте друзья. Прошло много времени, танцев с бубнами, а я все мучал свой счетчик с переменным успехом, приехал USB-485 от китайцев, подключил его и тишина. Ну думаю труп счетчик - буду менять. И вот думаю дай в последний раз подключу через USB-UART>UART-485. И после нескольких тырков, вуаля! Получилось считать счетчик AdminTools! Маленькая победа!

Итак:

1. Питание подавать на счетчик ОБЯЗАТЕЛЬНО. 12 вольт, без этого интерфейс не фурычит. Уж не знаю, что они там намудрили, по идее оно нужно, чтобы минимизировать потери на длинных трассах.

2. Обязательна авторизация по последним пяти цифрам серийника (вбивается вместо логина) и пароль 777777. Можно прочитать счетчик и по широковещательному адресу 65535, но инфа будет не полной, отобразится раздел USER.

3. Настройка порта: 8N1 9600! А в мануале написано 7E1)) Уже написал в Энергомеру, чтобы косяк исправили, иначе другой человек с маленьким терпением просто разобьет счетчик об стол))

Итого, все читается. НО! Во вкладках показаний отсутствует ток и напряжение! Только потребленная энергия. С чем это связано непонятно.

Да и запросы вот такого вида.

Сообщение
06.05.2020 22:25:25.772
COM6 открыт

Запрос
06.05.2020 22:25:25.782
C0 48 DB DD DF FD 00 31 DE 0B 00 D0 01 00 8B C0           ?H????.1?..?..??

Ответ
06.05.2020 22:25:25.983
C0 48 FD 00 DB DD DF 56 01 00 0A 01 01 14 02 17           ?H?.???V........
A9 C0                                                     ??

Запрос
06.05.2020 22:25:25.983
C0 48 DB DD DF FD 00 31 DE 0B 00 D0 01 60 63 C0           ?H????.1?..?.`c?

Ответ
06.05.2020 22:25:26.184
C0 48 FD 00 DB DD DF 5C 01 60 00 01 00 0B 04 03           ?H?.???\.`......
00 01 00 01 00 01 B3 C0                                   ......??

Так что нихрена все эти скетчи, что были ранее не подходят(( Надо что-то мудрить свое. Вот такие пироги, спасибо за внимание.

 
 
 
iopq
Offline
Зарегистрирован: 05.07.2016

может кому пригодится а то нигде не нашел. счетчик ABB E31 он же нева 124 -

03500F0004 - дата и время

035000000A - показания

03500A0005 - параметры сети

03502D0001 - температура

ну впереди конечно адрес счетчика а в конце crc