Контроллер температуры и Ардуино Мега

Maximus
Offline
Зарегистрирован: 24.07.2015

Доброе утро коллеги!

Нужно снимать данные с китайского контроллера температуры Yudian AI580. Я самоучка в программировании , поэтому возникают трудности. Если начинать по порядку, понимаю что вникать подробно ни кто не пудет : но вот вопросы(описание протокола, по ссылке:https://yadi.sk/i/ifrEqsR-3QzYD4https://yadi.sk/i/ifrEqsR-3QzYD4https://yadi.sk/i/ifrEqsR-3QzYD4 https://yadi.sk/d/Qkon4cSj3QzYFL ):

1)Если верить описание структуры пакета, который я должен оправлять, чтобы записать параметр :

2 байта -Адрес устройства.

1 байт - Функциаональный код чтение(52Н(82))/запись(43Н(67))

1 байт - Код параметра который будем менять

1 байт - Младший байт

1 байт - Старший байт

2 байта- Контрольная сумма, которая вычесляется по формуле: чтение (Parameter code to be read  ×256+82+ADDR), запись (Parameter code to be written  ×256 + 67+ parameter to be written + ADDR).

Дальше идет структура пакета, которая приходит к нам от устройства:

2 байта -PV (значение датчика температуры)

2 байта -SV (выставленное значение)

1 байт -MV -????

1 байт - как я понимаю данные о таймере и прочем

2 байта -параметры чтения/записи (как я понимаю тут лежат данные которые мы запросили)

2 байта - контрольная сумма (PV+SV+( Alarm status×256+MV)+ parameter read/written + ADDR)

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

Код:

#define DIR 8 // переключатель прием\передача

struct packet_in_reaktor{
  short addr; //int16_t?
  char func_code;//43H(67) - запись
  char param_cod;//00H - SV
  char low_byte;
  char high_byte;
  short check_code;//Parameter code to be written  ×256 + 67+ parameter to be written + ADDR
};

struct answer{
  short pv;//PV ,int16_t??
  short sv;//SV
  char mv;//MV
  char alarm;//??
  short param;//параметр чтения или записи
  short check_code;//PV+SV+( Alarm status×256+MV)+ parameter read/written + ADDR
};

packet_in_reaktor pack={1,67,0,0,0,2};

void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  pinMode(DIR, OUTPUT);
}

void loop() {
  float a=0;
  byte* ptr28 = (byte* )&pack;// приводим структуру к массиву из байт чтобы передать в Serial
  digitalWrite(DIR, HIGH); // включаем передачу
  Serial2.write(ptr28, sizeof(packet_in_reaktor));// отправляем
  digitalWrite(DIR, LOW); // включаем прием
  a = Serial2.read();//читаем
  Serial.println(a);//выводим в консоль
}

Ну и вопросы:

1) Как передавать данные к режими записи и как читать данные которые пришли. В случае с записью я так понимаю это как то связано с младшим и старшим битами? В случае приходящего пакета как то с "2 байта -параметры чтения/записи (как я понимаю тут лежат данные которые мы запросили)".

2)Как считать контрольную сумму?

3)В описание везде говорится про 16 битный формат запроса. Как его реализовать ?

Заранее спасибо!

 

Maximus
Offline
Зарегистрирован: 24.07.2015

Забыл сказать что все происходит через китайский модуль- преобразователь сигнала RS485.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

В строке 35 вы читаете из Serial, а там, ВНЕЗАПНО, может ничего ещё не быть. Ждите перед чтением в цикле 

while(!Serial.available());

 

Maximus
Offline
Зарегистрирован: 24.07.2015

Спасибо за совет) Но мне бы в самом протоколе разобраться )

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Maximus пишет:

Спасибо за совет) Но мне бы в самом протоколе разобраться )

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

Maximus
Offline
Зарегистрирован: 24.07.2015

Ну вдруг найдется альтруист))) Да я в поисках человека, если что , кому интересно пишите на почту leonoffmaxim@gmail.com , договоримся...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Maximus пишет:

Ну вдруг найдется альтруист))) Да я в поисках человека, если что , кому интересно пишите на почту leonoffmaxim@gmail.com , договоримся...

Вы можете открыть тему в разделе "Ищу исполнителя" ;)