Ведомая библиотека Modbus RTU
Я хочу использовать Arduino Genuino Zero в качестве ведомого устройства Modbus. Я попытался выполнить поиск в Google и нашел библиотеку. Когда я пытаюсь использовать библиотеку, я получаю сообщение об ошибке тайм-аута.
Кто-нибудь может сказать мне, как решить эту ошибку? Удалось ли кому-нибудь заставить работать ведомую библиотеку Arduino Modbus RTU?
@Beginner, 👍1
Обсуждение2 ответа
Сейчас я не могу смоделировать и увидеть результат; Я надеюсь, что если библиотека работает правильно, это может быть проблемой связи. Я могу добавить одношаговую отладку, чтобы вы могли проверить и посмотреть, что происходит.
Ваше устройство действует как ведомое устройство Modbus RTU. Возьмите другой Arduino, заставьте его действовать как ведущее устройство и посмотрите, какой ответ приходит от ведомого устройства. Вот фрагмент кода, который я использовал, чтобы сделать Arduino мастером, и увидеть ответ, приходящий в серийный терминал.
#include <SoftwareSerial.h>
#define rxPin 2
#define txPin 3
#define RS485_pin 10
//SoftwareSerial mySerial(rxPin, txPin);
#define mySerial Serial1
byte test_data[8] = {0x01,0x03,0x00,0x64,0x00,0x02,0x85,0xD4};
int data_count = 5;
byte rcvdata[15];
int param_value_int[7];
void setup() {
// put your setup code here, to run once:
//mySerial.begin(19200,SERIAL_8E1);
mySerial.begin(9600);
Serial.begin(9600);
delay(1000);
pinMode(RS485_pin, OUTPUT);
digitalWrite(RS485_pin,LOW);
delay(100);
}
int count = 0;
void loop() {
if(count%10 == 0) {
Serial.println();
send_data();
}
count++;
while(mySerial.available()>0)
{
byte b=mySerial.read();
delay(1);
Serial.print(b,HEX);
Serial.print(" ");
}
//Serial.println(count);
while(Serial.available())
{
digitalWrite(RS485_pin,HIGH);
byte a=Serial.read();
delay(1);
mySerial.print(a);
digitalWrite(RS485_pin,LOW);
// Serial.print(a);
}
delay(1000);
//while(1);
}
void send_data() {
Serial.println("send data");
digitalWrite(RS485_pin,HIGH);
delay(1);
for(char i=0;i<8;i++){
mySerial.write(test_data[i]);
delay(1);
Serial.print(test_data[i],HEX);
Serial.print(" ");
}
Serial.println();
digitalWrite(RS485_pin,LOW);
delay(1);
}
Здесь вы можете использовать Software Serial или обычный Serial1 или Serial2 на таких устройствах, как Mega. Убедитесь, что если он основан на RS485, вам нужно каждый раз переключать контакт RS485 для чтения и записи, чтобы включать и отключать одну функцию за раз, поскольку RS 485 использует полудуплексную связь.
В этом случае test_data[] использует код функции FC03 Чтение регистра хранения. Вы можете сделать свои пользовательские данные. Я предполагаю, что вы знакомы со всеми доступными типами. Тем не менее, есть отличный сайт [ ссылка ], на котором можно найти, если ты не знаешь основы. Последние два байта являются контрольной суммой. И есть онлайн-калькулятор контрольной суммы, если вам нужно также https://www.lammertbies.nl/comm/info/crc-calculation.html < /p>
Таким образом вы сможете хотя бы отладить и поделиться результатом, чтобы мы могли больше помочь.
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackexchange.com/rooms/56581/discussion-on-answer-by-goddland-16-modbus-rtu-slave-library)., @Nick Gammon
Это не форум. Комментарии к вопросу предназначены для уточнения вопроса, а не для экспериментов с различными способами решения проблемы., @Nick Gammon
поэтому я отредактировал ваш код, как показано ниже #define mySerial Serial1
byte test_data[8] = {0x01,0x03,0x00,0x64,0x00,0x02,0x85,0xD4};
int data_count = 5;
void setup() {
mySerial.begin(9600);
Serial.begin(9600);
delay(1000);
}
int count = 0;
void loop() {
if(count%10 == 0) {
Serial.println();
send_data();
}
count++;
while(mySerial.available()>0)
{
byte b=mySerial.read();
delay(1);
Serial.print(b,HEX);
Serial.print(" ");
}
//Serial.println(count);
while(Serial.available())
{
byte a=Serial.read();
delay(1);
mySerial.print(a);
}
delay(1000);
}
void send_data() {
Serial.println("send data");
delay(1);
for(char i=0;i<8;i++){
mySerial.write(test_data[i]);
delay(1);
Serial.print(test_data[i],HEX);
Serial.print(" ");
}
Serial.println();
delay(1);
рядом с подчиненной библиотекой, которую я загрузил. я заменяю «Serial» на «Serial1», так как я использую подлинный ноль., @Beginner
но до сих пор я не получаю никакого ответа, @Beginner
Эй, у вас есть реальное устройство Modbus?, @goddland_16
вы также можете использовать программное обеспечение modscan32 для получения данных с ведомого устройства. Программное обеспечение действует как ведущее устройство, а у вас есть ведомое устройство., @goddland_16
у меня нет реального устройства Modbus, @Beginner
да, я использовал программное обеспечение Modbus Flow, которое работает как master, @Beginner
но я получаю ошибку тайм-аута. поэтому я задал вопрос, чтобы проверить, правильный ли мой подчиненный код ...!, @Beginner
Тогда вы могли бы сделать такой вывод., @goddland_16
у вас есть работающая ведомая библиотека??, @Beginner
нет, я тестировал свое устройство в качестве мастера Modbus., @goddland_16
Вы можете проверить https://github.com/andresarmento/modbus-arduino/blob/master/README.md, @goddland_16
Он использовал его как ведомое устройство Modbus., @goddland_16
связь работает нормально. я не получаю никакой ошибки. я использовал их пример лампы, чтобы прочитать катушку. в этом примере они устанавливают статус катушки 1. но я получаю ответ "ноль", @Beginner
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Есть ли хорошая рабочая библиотека MODBUS TCP master для Arduino?
- Modbus IP с Simply Modbus TCP
- Сбой защиты от разрушения стека ESP32 с Modbus RTU
- Связь Arduino Uno и ESP32 с использованием RS485
- Использование сервера Modbus TCP на Arduino
- Когда дело доходит до связи UART-RS485, в чем разница между модулем "MAX485" и модулем "HW-0519"?
Пожалуйста, предоставьте дополнительную информацию. Что такое ведущее устройство? Проверьте, правильно ли установлены скорость передачи данных, бит четности, бит данных. И, если возможно, предоставьте репозиторий git библиотеки, которую вы используете., @goddland_16
http://www.electronhacks.com/2014/04/arduino-modbus-plc-rtu/, @Beginner
я нахожу библиотеку из этого, @Beginner
как мастер, я использую симулятор, а имя симулятора - опрос Modbus., @Beginner