RS485 отправка сообщения с ардуино UNO.

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

 Дошла до частотников,

помогите решить проблему, что то торможу.

В инструкции  к частотнику сказано:

Вот вопрос как мне отправит сообщение "01 06 20 01 F4 D3 DD"

как отправить 16-ное число и пробелы? 

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

Serial.write(arrayOfBytes, sizeof(arrayOfBytes))

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck пишет:

 Вот вопрос как мне отправит сообщение "01 06 20 01 F4 D3 DD"

как отправить 16-ное число и пробелы? 

с чего вы взяли, что команда отправляется в виде строки, да еще с пробелами? судя по описанию - 01 06 20 01 F4 D3 DD - это массив байт

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Может для начала почитать про протокол modbus ?

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Спасибо, почитаю. 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Никто примеры не подскажет,? 

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

И что выводит Serial.print(id) ?

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck - вы вроде тут уже давно... и такой код :(

По пунктам самые вопиющие ошибки:

1. Пины 0 и 1 для СофтСериала использоывать нельзя

2. что такое "2001h" ???

3. если число 2001 - не важно, десятичное или шестнадцатиричное - оно уже никак не может быть байтом

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

И что выводит Serial.print(id) ?

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

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

"2001h" Адрес регистра запуска пуска ниже подробнее. 

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

Может пока частотник не трогать, а то или током ударит или руки оторвёт...

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x⸮x

вот это выводит

b707
Offline
Зарегистрирован: 26.05.2017

и дальше что? к чему, простите. этот бред?

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

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck - почитайте соседнюю тему, только сегодня обсуждали

http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/ne-poluchaetsya-skonnektit-dve-uno-po-rs485

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

модет и бред но мне не ясно как отправить этот тект в RS458.....

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck пишет:

модет и бред но мне не ясно как отправить этот тект в RS458.....

это не текст, это байты. Байтами и отправляйте.

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

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019
#include <SoftwareSerial.h>

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

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

void setup(){
  Serial.begin(4800); 
  RS485.begin(9600); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
 
}

void loop(){
      digitalWrite(DIR, HIGH); // включаем передачу             
        RS485.println(01);// отправляем 
        RS485.println(06);// отправляем 
        RS485.println(20);// отправляем 
        RS485.println(00);// отправляем 
        RS485.println(00);// отправляем 
        RS485.println(02);// отправляем  
        RS485.println(03);// отправляем 
        RS485.println(313, HEX);// отправляем 
      digitalWrite(DIR, LOW); // включаем прием
      Serial.print(DIR);
      delay(1000);
}

 

Хочу отправить  01 06 20 00 00 02 03 CB

b707
Offline
Зарегистрирован: 26.05.2017

Уже лучше. Хотя смысл печати DIR в сериал (строка 27) мне абсолютно непонятен :)

А на тему отправки своих байт - почитайте все же ссылку, которую я давал в #14

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Я правильно понимаю что "СВ" нужно в 16-речной отправлять? а между отправками задержка нужна? 

 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019




#include <SoftwareSerial.h>

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

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

void setup(){
  Serial.begin(4800); 
  RS485.begin(9600); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
  
 digitalWrite(DIR, HIGH); // включаем передачу             
        RS485.write(01);// отправляем 
        RS485.write(06);// отправляем 
        RS485.write(20);// отправляем 
        RS485.write(00);// отправляем 
        RS485.write(00);// отправляем 
        RS485.write(02);// отправляем  
        RS485.write(03);// отправляем 
        RS485.write(313, HEX);// отправляем 
      digitalWrite(DIR, LOW); // включаем прием
      Serial.print(DIR);
      delay(1000);
}

void loop(){
      
}

 

Я исправила ошибку нашу RS485.write(

теперь ошибка на 00 показывает 
exit status 1
call of overloaded 'write(int)' is ambiguous

 

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck пишет:

Я правильно понимаю что "СВ" нужно в 16-речной отправлять?

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

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck пишет:

Я исправила ошибку нашу RS485.write(

теперь ошибка на 00 показывает 
exit status 1
call of overloaded 'write(int)' is ambiguous

 

потому что нет такого числа "00", и нет числа "06" - есть просто 0 и 6

Слушайте, девушка, вы правда надеетесь написать поэму, не зная букв? Учебник кто за вас читать будет? - я уже читал, мне не надо

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

А почему тогда в инструкции 00 просят а не просто 0? 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019
#include <SoftwareSerial.h>

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

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

void setup(){
  Serial.begin(4800); 
  RS485.begin(9600); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
  
 digitalWrite(DIR, HIGH); // включаем передачу             
        RS485.write(1);// отправляем
                delay(1); 
        RS485.write(6);// отправляем 
                delay(1);
        RS485.write(20);// отправляем 
        delay(1);
        RS485.write(0);// отправляем 
        delay(1);
        RS485.write(0);// отправляем
        delay(1); 
        RS485.write(2);// отправляем
                delay(1);  
        RS485.write(3);// отправляем 
                delay(1);
        RS485.write(313, HEX);// отправляем 
                delay(1);
      digitalWrite(DIR, LOW); // включаем прием
      Serial.print(DIR);
      delay(1000);
}

void loop(){
      
}

Кажется проблема не в этом. хм. 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019
#include <SoftwareSerial.h>

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

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

void setup(){
  Serial.begin(4800); 
  RS485.begin(9600); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
  
 digitalWrite(DIR, HIGH); // включаем передачу             
        RS485.write(01, BIN);// отправляем
                delay(1); 
        RS485.write(06, BIN);// отправляем 
                delay(1);
        RS485.write(20, BIN);// отправляем 
        delay(1);
        RS485.write(00, BIN);// отправляем 
        delay(1);
        RS485.write(00, BIN);// отправляем
        delay(1); 
        RS485.write(02, BIN);// отправляем
                delay(1);  
        RS485.write(03, BIN);// отправляем 
                delay(1);
        RS485.write(313, BIN);// отправляем 
         delay(1);
      digitalWrite(DIR, LOW); // включаем прием
      Serial.print(DIR);
      delay(1000);
}

void loop(){
      
}

 

 

Теперь ошибка в         RS485.write(313, BIN);// отправляем 

exit status 1
no matching function for call to 'write(int, int)'

 

b707
Offline
Зарегистрирован: 26.05.2017

еще раз читаем сообщение №21

b707
Offline
Зарегистрирован: 26.05.2017

а что такое 313 ? - это вы так CB перевели в число? :) - неправильно, пробуйте еще

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Gluck-Truck, поправьте меня, если я ошибусь:

1. В примере, как я понимаю, числа представлены в 16-ричной системе счисления, а аргументы функции RS485.write() - в 10-й. Тогда 20H из примера и 20 из кода - это разные числа.

2. Строка 29 в коде RS485.write(313, HEX) как соотносится с синтаксисом функции Serial.write(buf, len) http://arduino.ru/Reference/Serial/Write ?29

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Так "H" нету в 16 речной системе.....

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

Чуть чуть углублю #1 и не благодари. 


byte msg[8] = {0x01, 0x06, 0x20, 0x01, 0x01, 0xF4, 0xD3, 0xDD};
void setup()
{
  Serial.begin(9600);
  Serial.write(msg,8);
}

void loop()
{
 
}
Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019
#include <SoftwareSerial.h>

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

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

void setup(){
  Serial.begin(4800); 
  RS485.begin(9600); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
  
 digitalWrite(DIR, HIGH); // включаем передачу             
        RS485.write(01,HEX);// отправляем
                delay(1); 
        RS485.write(06,HEX);// отправляем 
                delay(1);
        RS485.write(20,HEX);// отправляем 
        delay(1);
        RS485.write(00,HEX);// отправляем 
        delay(1);
        RS485.write(00,HEX);// отправляем
        delay(1); 
        RS485.write(02,HEX);// отправляем
                delay(1);  
        RS485.write(03,HEX);// отправляем
                delay(1);
        RS485.write(CB,HEX);// отправляем 
         delay(1);
      digitalWrite(DIR, LOW); // включаем прием
      Serial.print(DIR);
      delay(1000);
}

void loop(){
      
}

 

Ошибка строка RS485.write(03,HEX);// отправляем

exit status 1

no matching function for call to 'write(int, int)'
b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck - вы вообще читаете, что вам пишут? - функция write не понимает вашего второго параметра "HEX" "BIN" или еще какого. И потом, я вам уже дважды написал. что контроллеру ваши HEX до лампочки!

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Gluck-Truck, попробуйте программку, которую Вам написал nik182 в #30. Внешне, там всё соответствует исходному заданию. Если заработает, будете составлять эквивалент отсылки отдельными байтами. Если не заработает, то надо будет думать, почему. М.б. в задании что-то не так.

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

благодарю. 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019
#include <SoftwareSerial.h>

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

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


byte msg[8] = {0x01, 0x06, 0x20, 0x01, 0x01, 0xF4, 0xD3, 0xDD};
byte msk[8] = {0x01, 0x06, 0x20, 0x00, 0x00, 0x02, 0x03, 0xDD};
void setup(){
  Serial.begin(4800); 
  RS485.begin(9600); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
  
 digitalWrite(DIR, HIGH); // включаем передачу             
        RS485.write(msk,8);
       digitalWrite(DIR, LOW); // включаем прием
      Serial.print(DIR);
      delay(1000);
}

void loop(){
      
}

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

сериал выдает значение 15.

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Схему брала вот тут вместо А И Б подключаю вместо Конвертера -> R+ к А   R- к В

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Gluck-Truck, Вы эмулируете посылку Modbus, а почему Вы не используете собственно библиотеку Modbus? Хотя бы https://www.arduino.cc/en/ArduinoModbus/ArduinoModbus

Я понимаю, что это несколько сложней, чем воспроизвести кусочек задания, но для штатной работы с ПЧ потребуется знание и использование Modbus. Сейчас научитесь, дальше, если планируете продолжать, может сильно пригодиться.

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

 

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck пишет:

#include <SoftwareSerial.h>

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

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


byte msg[8] = {0x01, 0x06, 0x20, 0x01, 0x01, 0xF4, 0xD3, 0xDD};
byte msk[8] = {0x01, 0x06, 0x20, 0x00, 0x00, 0x02, 0x03, 0xDD};
void setup(){
  Serial.begin(4800); 
  RS485.begin(9600); // SoftwareSerial   
   
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, LOW); // включаем прием
  
 digitalWrite(DIR, HIGH); // включаем передачу             
        RS485.write(msk,8);
       digitalWrite(DIR, LOW); // включаем прием
      Serial.print(DIR);
      delay(1000);
}

void loop(){
      
}

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

сериал выдает значение 15.

Gluck-Truck - вы так и не ответили, зачем вы отправляете DIR в Сериал (строка 20)? - какой в этом смысл? DIR  у вас равен 13 (строка 3) и ничего другого в нем не появится, зачем его печатать?

И что там у вас выдается в сериал за "15" - неизвестно, в этом коде ничего похожего нет. Может все-таки 13?

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

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

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

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

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck пишет:
работает без ошибки, вот только сам частотник не реагирует на пуск... хм.

а где вы в своем коде увидели команду "Пуск" ? - вы ее на частотник не отправляете

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck пишет:

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

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

надо только

1. не делать ошибок при записи

2. отправить обе команды

А у вас в обоих пунктах - ошибки. И команды переписали неправильно, и отправляете только первую.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Gluck-Truck пишет:

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

https://yandex.ru/search/?text=arduino%20modbus%20video&lr=213

Видео с примерами хоть... Выберите подходящий. Вам нужен вариант Модбас-Мастер.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

Kakmyc
Offline
Зарегистрирован: 15.01.2018

И да, начать стоит с того, что установлено в настройках ПЧ. Есть вероятность, что номер устройства и скорость передачи не соответствуют, а так же не разрешено управление через rs-485

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

 Все настройки настроены, "не разрешено управление через rs-485" в инструкции это не указано..

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

uint8_t CMD1[8] = {0x01, 0x06, 0x20, 0x01, 0x01, 0xF4, 0xD3, 0xDD};
uint8_t Start[8] = {0x01, 0x06, 0x20, 0x00, 0x00, 0x02, 0x03, 0xCB};
uint8_t Stop[8] = {0x01, 0x06, 0x20, 0x00, 0x00, 0x01, 0x43, 0xCA};
void setup(){
  Serial.begin(9600); // SoftwareSerial   
  pinMode(DIR, OUTPUT); 

}

void loop(){
delay(10000);
 digitalWrite(DIR, HIGH); // включаем передачу
 delay(100);             
for (int i=0; i<8; i++) Serial.write(Start[i]);
digitalWrite(DIR, LOW);
delay(5000);
digitalWrite(DIR, HIGH);  
for (int i=0; i<8; i++) Serial.write(Stop[i]);
digitalWrite(DIR, LOW); 
delay(5000);   
}

Код сейчас выглядит так, пытаюсь запустить и остановить, но ЧП ноль внимания на команды.. 

 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Подскажите какой R1 ставить? может в нем дело?  

А+ подключаю к R- ПЧ. B+ к R- ПЧ. 

 

Gluck-Truck
Gluck-Truck аватар
Offline
Зарегистрирован: 17.06.2019

Подскажите какой R1 ставить? может в нем дело?  

А+ подключаю к R- ПЧ. B+ к R- ПЧ. 

 

b707
Offline
Зарегистрирован: 26.05.2017

Gluck-Truck пишет:

 Код сейчас выглядит так, пытаюсь запустить и остановить, но ЧП ноль внимания на команды.. 

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