Контроллер температуры и Ардуино Мега
- Войдите на сайт для отправки комментариев
Доброе утро коллеги!
Нужно снимать данные с китайского контроллера температуры 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 битный формат запроса. Как его реализовать ?
Заранее спасибо!
Забыл сказать что все происходит через китайский модуль- преобразователь сигнала RS485.
В строке 35 вы читаете из Serial, а там, ВНЕЗАПНО, может ничего ещё не быть. Ждите перед чтением в цикле
Спасибо за совет) Но мне бы в самом протоколе разобраться )
Спасибо за совет) Но мне бы в самом протоколе разобраться )
Так разбирайтесь ;) Ну или ждите того, кто уже с ним работал. Думаю, за вас разбираться в протоколе - мало кому интересно будет. Ну или наймите человека, который вам сделает (или найдёт готовую) реализацию протокола. Решений, как всегда - несколько, как видите.
Ну вдруг найдется альтруист))) Да я в поисках человека, если что , кому интересно пишите на почту leonoffmaxim@gmail.com , договоримся...
Ну вдруг найдется альтруист))) Да я в поисках человека, если что , кому интересно пишите на почту leonoffmaxim@gmail.com , договоримся...
Вы можете открыть тему в разделе "Ищу исполнителя" ;)