Опрос счетчика СПТ-943.1

Felix
Offline
Зарегистрирован: 19.11.2018

Здравствуйте! Кто-нибудь опрашивал счетчик СПТ-943.1 через Ардуино по интерфейсу RS232? возникала cледующая проблема. Написал скетч который должен опрашивать данный счетчик согласно протоколу М4, но счетик никак не реагирует на запросы. Написал простенький эмулятор счетчика на другой плате Ардуино, который замечательно отвечает. Может кто сталкивался с подобной проблемой? 

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

А как подключаете? Инфы крайне мало, как всегда в общем

Felix
Offline
Зарегистрирован: 19.11.2018

Подключаю черзе преобразователь Rs232-TTL чип MAX3232 ESE. На счетчик выходит 3 провода RX, TX, CND, питается же счетчик со стороны 12В. (Так же CND выходящая от MAX3232 соединяется с землей провода 12В.) На плату Ардуино выходят 4 провода: TX, RX, VCC = 3.3В и соответственно CND. 

PS. Простите за мой "Французкий" я просто в этом новичек.

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

скетч?

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

На ардуино можно использовать софт сериал для связи со счетчиком.  А для вывода на экран - хард сериал.

rx счетчика (ну через преобразователь) подключить к tx ардуино (пин 8). tx счетчика через преобразователь подключить к rx ардуино (7 пин)

Подключиться и смотреть через терминальную программу или монитор порта ардуино. Скетч примерно такой 


#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 8); // RX, TX Сериал подключение к счетчику

void setup() {
 
  Serial.begin(9600); 
  mySerial.begin(9600);
 
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

 

Felix
Offline
Зарегистрирован: 19.11.2018


//Тепловычислитель СПТ-943.1  | Интерфейс RS-232.

#include <SoftwareSerial.h>

#define DEBUGGING         //Условная компиляция (Отладка)
#define SIZE_ANS    100   //Размер строки ответов (Макс-ая строка ответа у СПТ-943.1 = 68 байт данных)
#define DELAY_SYNC  50    //Таймаут синхронизации (предпочтительно 10-50)
#define TSTART      2000  //Таймаут после передачи стартовой посл-ти. Для СПТ--943.1 = [1000 - inf]
#define TPROC       2500  //Время обработки запроса. Для СПТ--943.1 = [0 - 2500мс]
#define ONE_SEC_D   1000  //Таймаут для отладочного монитора

/*------------------------------------------------- Структура соединения ------------------------------------------------*/
struct Connection{
  byte   answer[SIZE_ANS];
  byte   addrNet;
  int    deviceCode;
  int    versionSoft;
  int    byteRecived;
  int    byteRequested;
  String reqtTime, reqInfo, reqTecl, reqItogl; 
}newCon;
 
/*--------------------------------------------------- Протокол M4 СПТ943.1 --------------------------------------------------*                                                  |
 |Connect    = Стартовая последовательность (Код = 0x3F). Старт-ая послед-ть должна сост-ть не менее чем из 16 байтов 0xFF.  |
 |ChannelGen = Соединение по Обшему каналу (Код Общ. канала = 0x00)                                                          |
 |SwapSpeed  = Запрос на изменение скорости (Код = 0x42). В данном случае на 9600.                                           |                                                              |
 |ReqError   = Сообщение об ошибке (Код = 0x21).                                                                             |
 |ReadFlash  = Чтение Flash-памяти (Код = 0x45).                                                                             |
 |ReadRAM    = Чтение ОЗУ (Код = 0x52).                                                                                      |
 *---------------------------------------------------------------------------------------------------------------------------*/ 
  byte Connect[]    = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  //byte ChannelGen[] = {0x10, 0xFF, 0x90, 0x01, 0x00, 0x05, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x32, 0x3A}; 
  byte ChannelGen[] = {0x10, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x16};
  byte SwapSpeed[]  = {0x10, 0x00, 0x90, 0x01, 0x00, 0x05, 0x00, 0x42, 0x02, 0x00, 0x00, 0x00, 0x32, 0x3A};
  byte ReqError[]   = {0x10, 0x00, 0x90, 0x91, 0x00, 0x05, 0x00, 0x21, 0x03, 0x00, 0x00, 0x00, 0x79, 0x56};
  byte ReadFlash[]  = {0x10, 0x00, 0x90, 0x02, 0x00, 0x05, 0x00, 0x45, 0x00, 0x00, 0x01, 0x00, 0x77, 0x67};
  byte ReadRAM[]    = {0x10, 0x00, 0x90, 0x07, 0x00, 0x05, 0x00, 0x52, 0xF3, 0x00, 0x03, 0x00, 0x01, 0xD6};

/*------------------------------------------------ Инициализация портов RS-232 ----------------------------------------------*/

#define SS_RX   0
#define SS_TX   1

/*--------------------------------------------- Виртуальный последовательный порт -------------------------------------------*/
SoftwareSerial RS232Serial(SS_RX, SS_TX);

void setup(){
  //Выбор скорости соединения 9600 бод.
  RS232Serial.begin(9600);
  Serial.begin(9600);

#ifdef DEBUGGING
  Serial.println("\t\t\t\t\tSPT-943.1");
  for(int i = 0; i < 90; i++)
    Serial.print('*');
  Serial.println();
#endif //!DEBUGGING 

  for(int i = 0; i < sizeof(newCon.answer); i++)
    newCon.answer[i] = 1;

  /*----------------- Запрос на соединение ------------------*/
  request(Connect, sizeof(Connect), newCon.answer, false);       //Отправка стартовой последовательности
  delay(TSTART);                                                 //Таймаут после передачи стартовой посл-ти
  request(ChannelGen, sizeof(ChannelGen), newCon.answer, true);  //Установка посл-го соединения
  initialization();
}

void loop(){

#ifdef DEBUGGING
    Serial.println();
    Serial.print("Adress SPT943: ");
    Serial.println(newCon.addrNet, HEX);
    Serial.println(sizeof(newCon.answer));
    Serial.println();
    delay(ONE_SEC_D);
#endif //!DEBUGGING 
    
    //При удачном соединении(NT = 0x00 или 0xFF) продолжаем опрос, иначе закрываем соединение
    if(!newCon.addrNet || 0xFF == newCon.addrNet){
#ifdef DEBUGGING
      Serial.println("Network addr is Good!!! BEST CONNECTION!!!\n");
      delay(ONE_SEC_D);
      Serial.println("\nTHIS IS READ DATA: ");
#endif //!DEBUGGING
  
      /*Опрос счетчика...........*/
      request(ReadFlash, sizeof(ReadFlash), newCon.answer, true);
      request(ReadRAM, sizeof(ReadRAM), newCon.answer, true);   
    }
    else{
      RS232Serial.end();
#ifdef DEBUGGING
      Serial.println("Сonnection closed!");
      delay(ONE_SEC_D);
      setup();
#endif //!DEBUGGING
  }
}

void request(byte *req, int len, byte *ans, bool con){
  
  /*------------------- Запрос -------------------*/
  Serial.print("\nInput-> ");
  //for(int i = 0; i < len; i++){
    RS232Serial.write(req, len);
    //delay(DELAY_SYNC);
  //}  
#ifdef DEBUGGING
  for(int i = 0; i < len; i++)
    Serial.print(req[i], HEX);
 /* while(RS232Serial.available()){
    Serial.print(RS232Serial.read(), HEX);
    delay(DELAY_SYNC);
  }*/
#endif //!DEBUGGING

  if(con){
    //Время обработки запроса
    delay(TPROC);
  
   /*------------------- Ответ ----------------------*/
   for(int i = 0; RS232Serial.available() && (i < sizeof(newCon.answer)); i++){
    Serial.println("There is somethink!");  
    newCon.answer[i] = RS232Serial.read();
    delay(DELAY_SYNC);  
   }
#ifdef DEBUGGING
  Serial.print("\nOutput: ");
  for(int i = 0; i < sizeof(newCon.answer); i++)
    Serial.print(newCon.answer[i], HEX);
  Serial.println();
#endif //!DEBUGGING
  }
}

void initialization(){
  newCon.addrNet = newCon.answer[1];
  newCon.versionSoft = newCon.answer[5];
  newCon.deviceCode = newCon.answer[0];
}
/*
byte getTime(char fl){
  switch(fl){
    case 'gg': return 0; break;
    case 'mm': return 1; break;
    case 'dd': return 2; break;
    case 'hh': return 3; break;
  }
}*/

 

 

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

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

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

сделать так

строка 41    #define SS_RX   7

строка 42   #define SS_TX   8

и подключить физически соответственно. а вы похоже счетчикна 0 и 1 повесили, что не верно 

Felix
Offline
Зарегистрирован: 19.11.2018

Сделал так как вы сказали RX 7 TX 8, но счетчик отстается непоколебим. Посмотрел на осцеллографе соединение и вижу такую картину, что на счетсик прихрдят команды, но он упрно молчит. Такое ощущение будто он не понимает команды. Вот линк на протокол соединения http://www.teplocom.msk.ru/data/support/docs/gaz/spg/protM4_rev00.pdf

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

а он один подключен? или там сеть счетчиков. Если один возможно на нём скорость поменяли, пробуйте весь ряд стандартных

Felix
Offline
Зарегистрирован: 19.11.2018

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

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

читайте описания протокола по ссылке со стр21 и до конца

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

На всякий случай: то, что порт подключается перекрестно, т.е. RX подключается к TX и наоборот - в курсе?

Felix
Offline
Зарегистрирован: 19.11.2018

Да, конечно

Felix
Offline
Зарегистрирован: 19.11.2018

Данная схема подключения не работает. Во всяком случае у меня

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

может так

Felix
Offline
Зарегистрирован: 19.11.2018

На счетчике у меня 4 выхода 2 из которых заняты источником внешнего питания (GND, VCC = 12 V.) Как мне реализовать вашу схему? На фото черные провода идут не от преобразователя, а от внешнего питания.

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

подключиться к счетчику программой пролог и снять осциллограммы. сдается мне там уровни сигналов 0В 12В, что не есть rs232

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

можно ещё так попробовать 

Felix
Offline
Зарегистрирован: 19.11.2018

Спасибо большое вам за помощь! Завтра приду на работу затестю.

 

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

в посте #18 в схеме ошибка. Должна заработать одна из этих схем. 

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

Почитайте описание счётчика. Написано что в зависимости от комплектации может быть 3 разных интерфейса. Тот разьем который вы мучаете скорее всего простой TTL. К нему можно напрямую Tx цеплять, Rx к Tx счётчика через 2к попробывать, если сначала не померить тестером напряжение.

Felix
Offline
Зарегистрирован: 19.11.2018

Подключился по первой схеме стали приходить нули. Но почему то светодиод RX на плате не мигает, а TX мигает

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

Ну дак попробуйте вторую . И где осциллограмма? Нужно узнать уровни сигнала тх от счетчика. большая вероятность что первая схема без преобразователя rs232-ttl должна заработать

Felix
Offline
Зарегистрирован: 19.11.2018

По 2-ой схеме плата перестала быть доступна. Желтый график - Отправка, Синий - Прием (относительно ардуино). На самом деле, что то это не похоже на ответы от счетчика ибо они в генерируются в то же время, что и запросы

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

непонятно в каких точках и какой схемы вы сняли осцилки. Нужно снять осцилки на первой схеме на разъёме х2 счетчика. общий провод осцила на пин 4. Изм щуп на 1 (Rx счетчика ),  потом на 3 (Тх счетчика). 

И желательно осцилку рабочего обмена счетчика и вашей программы на компе. 

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

Felix пишет:

Подключился по первой схеме стали приходить нули. Но почему то светодиод RX на плате не мигает, а TX мигает

какие ещё светодиоды? вы как опять подключаетесь к счетчику?  У вас подключение к счетчику должно быть на пин 7, 8 ардуино. Это софтсериал соединение. Никакие светодиоды rx и tx там не подключены. Эти светодиоды индицируют хард Serial подключение. В вашем скетче оно служит для связи с терминальной программой. Соответственно если вы с терминала ничего не отправляете на дуню Rx  led и будет молчать. А вот когда ардуино в консоль что либо шлёт тогда и мигает tx led.  

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

кстати на первой схеме необходимо попробовать установить подтягивающий резистор 10К между пинами ардуино "5V" и "7" (Rx)

Felix
Offline
Зарегистрирован: 19.11.2018

MaksVV пишет:

Felix пишет:

Подключился по первой схеме стали приходить нули. Но почему то светодиод RX на плате не мигает, а TX мигает

какие ещё светодиоды? вы как опять подключаетесь к счетчику?  У вас подключение к счетчику должно быть на пин 7, 8 ардуино. Это софтсериал соединение. Никакие светодиоды rx и tx там не подключены. Эти светодиоды индицируют хард Serial подключение. В вашем скетче оно служит для связи с терминальной программой. Соответственно если вы с терминала ничего не отправляете на дуню Rx  led и будет молчать. А вот когда ардуино в консоль что либо шлёт тогда и мигает tx led.  

Ошибочка! Да конечно они не должны мигать т.к. Rx 7 Tx 8 у меня. прошу прощения!

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

на второй схеме попробуйте убрать внешний источник питания +12В. 

Felix
Offline
Зарегистрирован: 19.11.2018

Не робит! Я думаю, что без внешнего питания никак ибо на счетчике единственный интерфес RS-232 которому необходимо внешнее питание 12В.

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

короче смотрите описание своего протокола, а также счетчика  - там всё просто на разъёме x2. две оптопары. Поэтому нафиг не нужен преобразователь Rs232<->TTL. 

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

так для инфы уровни двух стандартов 

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

ещё такой вариант пробуем 

Felix
Offline
Зарегистрирован: 19.11.2018

Написал производителю, он говорит что для устойчивой работы на входе Rx+ со стороны СПТ должно быть не менее 5 В. У меня же Tx на контроллере выдает нужные 5 В. Прикрепляю скрин осциллографа на порту Tx контроллера.

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

дак если биты нужны инвертированные ваш счетчик ничего  и не ответит. По какой схеме вы подключались? что у вас там 5В?

Нужна #31 нижняя схема, возможно без резисторов. 

Felix
Offline
Зарегистрирован: 19.11.2018

Не могли бы вы пояснить по поводу инвертированности битов?

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

смотрите пост #31 там есть рисунок с уровнями стандартов. Счетчик по всем описаниям поддерживает rs232.  там лог "1" соответствует -12В (или 0В -  счетчик по описанию работатает с уровнями от 0 до 12В).  А логическому "0" соответствует напряжение +12В. 

Чего не скажешь про уарт ттл ардуины, которой вы подключаетесь к счетчику. Там лог. "0" соответствует 0В, а лог. "1" соответствует 5В. 

Felix
Offline
Зарегистрирован: 19.11.2018

MaksVV пишет:

смотрите пост #31 там есть рисунок с уровнями стандартов. Счетчик по всем описаниям поддерживает rs232.  там лог "1" соответствует -12В (или 0В -  счетчик по описанию работатает с уровнями от 0 до 12В).  А логическому "0" соответствует напряжение +12В. 

Чего не скажешь про уарт ттл ардуины, которой вы подключаетесь к счетчику. Там лог. "0" соответствует 0В, а лог. "1" соответствует 5В. 

Коль так, тогда как же будет работать 2-я схема  пост #31? В таком случае необходим преобразователь РС232 - ТТЛ. Правильно ли я понимаю?

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

Нет. RS232-TTL нужен, если к вашему счётчику потавлялясь плата интерфейса RS232 и она включена в ваш разъём Х2. В посте #31 вам разрисовали две схемы подключения с прямой и инверсной полярностью Rx сигнала. На ней нет никаких преобразователей.
А для проверки связи я бы рекомендовал USB-TTL HA FT232R. Rx Tx подключить по первой схеме #31 поста, USB воткнуть в комп и попробывать соединиться. Если сразу не получится то для FT232 есть конфигурационная программа в которой можно менять полярность передаваемых и принимаемых битов. Не переконекчивая можно проверить все сочетания полярности битов. Какой нибудь заработает. Тогда можно будет уже про ардуину говорить.

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

Felix пишет:

Коль так, тогда как же будет работать 2-я схема  пост #31? В таком случае необходим преобразователь РС232 - ТТЛ. Правильно ли я понимаю?

нет не правильно. рс232 тут не нужен. Схема должна работать , потому что будет поджигать светодиод Rx-а счетчика  когда на Tx ардуино будет лог 0 , а не 1. 

Согласен с коллегой, что проще при помощи юсб-ттл такую хрень налаживать . 

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

nik182 пишет:
Нет. RS232-TTL нужен, если к вашему счётчику потавлялясь плата интерфейса RS232 и она включена в ваш разъём Х2.

не,  там нет никакой платы RS232. Счетчик "из коробки" этот стандарт поддерживает. Вот картинка, что можно подключить компорт компа напрямую к счетчику. 

также там подключается какойто прибор АПС45, уж очень подключение на уарт ттл похоже. 

 

 

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

Ну так вместо АПС45 надо на ноги 1,2 ардуины наны подключать. Только я бы ещё Rx (2 нана - 3 Х2) ногу через 1к подключил, что бы программы можно было грузить. Ноги 2,4 разъёма Х2 на землю ардуины, ногу 3 разъёма Х2 на +5 ардуины через 3.3к .

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

нужно использовать софт сериал. Т.к. скетч у ТС вроде правильный, но там вывод на экран через Serial, а подключение к счетчику через софт сериал.   Надеюсь ТС не забыл в скетче поменять ноги софтасериала (см. пост #7). 

Также возможно в ходе опытов вылетели ноги 7 и 8 . Вот и не работает ничё. 

Тогда рекомендую перевешать на 10 и 11 и не забыть поменять это в скетче.  Рекомендована нижняя схема #31. без резистора 500 ом. 10К нужно оставить. 

Или верхняя схема вообще без резюков . 

Кстати инит в скетче идёт в сетапе. Такчто если счетчик молчит пробовать нажать ресет на ардуине. 

Felix
Offline
Зарегистрирован: 19.11.2018

Да, не забыл

//Тепловычислитель СПТ-943.1  | Интерфейс RS-232.

#include <SoftwareSerial.h>

#define DEBUGGING         //Условная компиляция (Отладка)
#define SIZE_ANS    100   //Размер строки ответов (Макс-ая строка ответа у СПТ-943.1 = 68 байт)
#define DELAY_SYNC  50    //Таймаут синхронизации. Для СПТ--943.1 = [ 4 - infinity)
#define T_START     3500  //Таймаут после передачи стартовой посл-ти. Для СПТ--943.1 = [1000 - inf)
#define T_PROC      2000  //Время обработки запроса. Для СПТ--943.1 = [0 - 2200мс]
#define T_ACC_MAN   2000  //Время обработки запросов управления счетом. Для СПТ--943.1 = [0 - 20000]
#define ONE_SEC_D   1000  //Таймаут для отладочного монитора


/*------------------------------------------------- Структура соединения ------------------------------------------------*/
struct Connection{
  byte   answer[SIZE_ANS];
  byte   addrNet;
  int    deviceCode[2];
  int    versionSoft;
  int    byteRecived;
  int    byteRequested;
  String reqtTime, reqInfo, reqTecl, reqItogl; 
}newCon;
 
/*-------------------------------------------------- Протокол СПТ943.1 -----------------------------------------------------*     
|Connect    = Стартовая последовательность (Код = 0x3F). Старт-ая послед-ть должна сост-ть не менее чем из 16 байтов 0xFF.  |
|ChannelGen = Соединение по Обшему каналу (Код Общ. канала = 0x00)                                                          |
|SwapSpeed  = Запрос на изменение скорости (Код = 0x42). В данном случае на 9600.                                           |
|ReqError   = Сообщение об ошибке (Код = 0x21). (0x00 - Нарушение структуры запроса, 0x01 - Защита от ввода парам.          |
|             0x02 - Недопустимые значения параметров запроса, 0x03 - Нет данных, 0x04 - Возможен только защищенный обмен)  | 
|ReadFlash  = Чтение Flash-памяти (Код = 0x45). Количество считываемых страниц одним запросом = [1..64]                     |
|ReadRAM    = Чтение ОЗУ (Код = 0x52). Количество считываемых байт ОЗУ = [1..64]                                            |
*---------------------------------------------------------------------------------------------------------------------------*/ 
/* Команды для соединения. Общие для всех версий ПО */
byte Connect[]     = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
byte ChannelGen[]  = {0x10, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x16};  

/* Базовый формат связи. Для версии ПО 1.0 */
byte SwapSpeedV1[] = {0x10, 0x00, 0x42, 0x02, 0x00, 0x00, 0x00, 0xBA, 0x16};
byte ReqErrorV1[]  = {0x10, 0x00, 0x21, 0x03, 0x00, 0x00, 0x00, 0xDB, 0x16};
byte ReadFlashV1[] = {0x10, 0x00, 0x45, 0x01, 0x01, 0x01, 0x00, 0xB7, 0x16};
byte ReadRAMv1[]   = {0x10, 0x00, 0x52, 0xF3, 0x00, 0xF3, 0x00, 0xC7, 0x16};

/* Базовый формат связи. Для версии ПО 2.0 и выше. Протокол М4 */
byte SwapSpeedV2[] = {0x10, 0x00, 0x42, 0x02, 0x00, 0x00, 0x00, 0xBA, 0x16};
byte ReqErrorV2[]  = {0x10, 0x00, 0x21, 0x03, 0x00, 0x00, 0x00, 0xDB, 0x16};
byte ReadFlashV2[] = {0x10, 0x00, 0x45, 0x01, 0x01, 0x01, 0x00, 0xB7, 0x16};
byte ReadRAMv2[]   = {0x10, 0x00, 0x52, 0xF3, 0x00, 0xF3, 0x00, 0xC7, 0x16}; 

/* Расширенный формат связи
byte ChannelGen[] = {0x10, 0xFF, 0x90, 0x01, 0x00, 0x05, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x32, 0x3A}; 
byte SwapSpeed[]  = {0x10, 0xFF, 0x90, 0x01, 0x00, 0x05, 0x00, 0x42, 0x03, 0x00, 0x00, 0x00, 0x79, 0x56};
byte ReqError[]   = {0x10, 0xFF, 0x90, 0x91, 0x00, 0x05, 0x00, 0x21, 0x03, 0x00, 0x00, 0x00, 0x79, 0x56};
byte ReadFlash[]  = {0x10, 0xFF, 0x90, 0x02, 0x00, 0x05, 0x00, 0x45, 0x00, 0x00, 0x01, 0x00, 0x77, 0x67};
byte ReadRAM[]    = {0x10, 0xFF, 0x90, 0x07, 0x00, 0x05, 0x00, 0x52, 0xF3, 0x00, 0x03, 0x00, 0x01, 0xD6}; */  

/*----------------------------------------------- Инициализация портов RS-232 ---------------------------------------------*/
#define SS_RX   7
#define SS_TX   8

/*-------------------------------------------- Виртуальный последовательный порт ------------------------------------------*/
SoftwareSerial RS232Serial(SS_RX, SS_TX);

void setup(){
  //Выбор скорости соединения 2400 бод.
  RS232Serial.begin(2400);
  Serial.begin(2400);

#ifdef DEBUGGING
  Serial.println("\t\t\t\t\t\t\tSPT-943.1");
  for(int i = 0; i < 120; i++)
    Serial.print('*');
  Serial.println("\n\nCONNECT...");
#endif //!DEBUGGING 

  clearAns();

  /*----------------- Запрос на соединение ------------------*/
  request(Connect, sizeof(Connect), newCon.answer, false);       //Отправка стартовой последовательности
  delay(T_START);                                                //Таймаут после передачи стартовой посл-ти
  request(ChannelGen, sizeof(ChannelGen), newCon.answer, true);  //Установка посл-го соединения
  initialization();
  clearAns();
  
#ifdef DEBUGGING
    Serial.println();
    Serial.print("Adress SPT943: ");
    Serial.println(newCon.addrNet, HEX);
    Serial.print("Device code: ");
    Serial.print(newCon.deviceCode[0]);
    Serial.print(", ");
    Serial.println(newCon.deviceCode[1]);
    Serial.print("Sofware version: ");
    Serial.println(newCon.versionSoft);
    for(int i =0; i < 20;i++)
      Serial.print("-");
     Serial.println("\n");
    delay(ONE_SEC_D);
#endif //!DEBUGGING
  
  /*------------- Запрос на изменение скорости --------------
  if(!newCon.addrNet || 0xFF == newCon.addrNet){
     request(SwapSpeed, sizeof(SwapSpeed), newCon.answer, true);
     RS232Serial.begin(9600);
     Serial.begin(9600);
  } */
}

void loop(){
    //При удачном соединении(NT = 0x00 или 0xFF) продолжаем опрос, иначе закрываем соединение
   if(!newCon.addrNet || 0xFF == newCon.addrNet){
#ifdef DEBUGGING
   Serial.println("\n\nREAD DATA... ");
#endif //!DEBUGGING

     /*---------- Опрос счетчика ----------*/
     if(0x01 == newCon.versionSoft){ 
       request(ReadFlashV1, sizeof(ReadFlashV1), newCon.answer, true);
       clearAns();
       request(ReadRAMv1, sizeof(ReadRAMv1), newCon.answer, true); 
     }
     else if(2 == newCon.versionSoft){
       //Описать логику!!!  
     }
   }
   else{
     RS232Serial.end();
#ifdef DEBUGGING
     Serial.println("\nСONNECTION CLOSED!");
     delay(ONE_SEC_D);
     setup();
#endif //!DEBUGGING
   }
}

void request(byte *req, int len, byte *ans, bool con){
  
  /*------------------- Запрос -------------------*/
  for(int i = 0; i < len; i++){
    RS232Serial.write(req[i]);
    delay(DELAY_SYNC);
  }  
#ifdef DEBUGGING
  Serial.print("\nInput-> [");
  for(int i = 0; i < len; i++){
    Serial.print(req[i], HEX);
    if(i+1 != len) Serial.print(",");
  }
  Serial.print("]"); 
  //if(RS232Serial.isListening()) Serial.println("\nYES");
  //else Serial.println("\nNO");
#endif //!DEBUGGING

  if(con){
    //Время обработки запроса
    delay(T_PROC);
  
   /*------------------- Ответ ----------------------*/
   for(int i = 0; RS232Serial.available() && (i < sizeof(newCon.answer)); i++){
    newCon.answer[i] = RS232Serial.read();
    delay(DELAY_SYNC);  
   }
   
#ifdef DEBUGGING
  Serial.print("\nOutput: [");
  for(int i = 0; i < sizeof(newCon.answer); i++){
    Serial.print(newCon.answer[i], HEX);
    if(i+1 != sizeof(newCon.answer)) Serial.print(",");
  }
  Serial.print("]");
  Serial.println();
#endif //!DEBUGGING
  }
}

void initialization(){
  newCon.addrNet = newCon.answer[1];
  newCon.versionSoft = newCon.answer[5];
  newCon.deviceCode[0] = newCon.answer[3];
  newCon.deviceCode[1] = newCon.answer[4];
}

void clearAns(){
 for(int i = 0; i < sizeof(newCon.answer); i++)
    newCon.answer[i] = 0x1;
}

 

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

а скорость почему 2400?  Там вроде изначальная 9600. 

Felix
Offline
Зарегистрирован: 19.11.2018

нет, подключение производится только на скорости 2400

 

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

значение КИ в меню настроек  счетчика "0" ? 

Felix
Offline
Зарегистрирован: 19.11.2018

MaksVV пишет:

значение КИ в меню настроек  счетчика "0" ? 

Обязательно

Felix
Offline
Зарегистрирован: 19.11.2018

Правильно ли я понимаю, что у СПТ следующие логические уровни: 0 В. = 1(true), 5 В. = 0 (false).

А у ардуино следующая: 0 В. = 0 (false), 5 В. = 1 (true) ???

И если это так то ведь я могу сделать инвентриование битов не аппаратно а программно т.е. при отправке команды с ардуино на СПТ инвентировать биты и так же при приемке с СПТ инвентировать биты?

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

Врядли можно программно инвертировать стоп и старт биты. Помоему проще логическую микруху инвертор поставить.

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

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