Как я могу использовать протокол Modbus с Arduino Mega
Я новичок в StackExchange. Я пытаюсь связать ПЛК Siemens с Arduino Mega, используя модуль Ethernet ENC38J60 через библиотеки Modbus TCP/IP. Несмотря на то, что я все еще не могу получить доступ к ПЛК, все работает, когда я использую Arduino Nano, но когда я перехожу на Arduino Mega, код застревает в файле "mb.config" линия. Он может получить функцию петли, только если я отключу все провода от модуля Ethernet. Вы можете прочитать код ниже. Я не знаю, что происходит не так. Я также пытался редактировать библиотеки, чтобы изменить объявления выводов, но ничего не изменилось.
#include <EtherCard.h>
#include <Modbus.h>
#include <ModbusIP_ENC28J60.h>
#include <SPI.h>
//Смещения регистров Modbus (0-9999)
const int reg1_HREG = 0;
const int reg2_HREG = 1;
const int reg3_HREG = 2;
const int reg4_HREG = 2;
const int reg5_HREG = 5;
const int reg6_HREG = 6;
const int reg7_HREG = 7;
const int reg8_HREG = 8;
const int reg9_HREG = 9;
const int reg10_HREG = 10;
const int reg11_HREG = 11;
const int reg12_HREG = 12;
/*const int reg13_HREG = 13;
const int reg14_HREG = 14;
const int reg15_HREG = 15;
const int reg16_HREG = 16;
const int reg17_HREG = 17;
const int reg18_HREG = 18;
const int reg19_HREG = 19;
const int reg20_HREG = 20;
const int reg21_HREG = 21;
const int reg22_HREG = 22;
const int reg23_HREG = 23;
const int reg24_HREG = 24;*/
const int reg25_HREG = 25;
volatile int NumPulsos; //переменная для количества полученных импульсов
int PinSensor = 2; // Датчик подключен к контакту 2
float factor_conversion=7.5; //для преобразования частоты в скорость потока
//---Функция выполняется по прерыванию---------------
void ContarPulsos ()
{
NumPulsos++; //увеличиваем переменную pulse
}
//---Функция получения частоты импульсов--------
int ObtenerFrecuencia()
{
int frecuencia;
NumPulsos = 0; // Устанавливаем количество импульсов равным 0
interrupts(); // Разрешить прерывания
delay(1000); // выборка 1 секунда
noInterrupts(); // Отключить прерывания
frecuencia=NumPulsos; // Гц (импульсов в секунду)
return frecuencia;
}
//ModbusIP-объект
ModbusIP mb;
void setup() {
Serial.begin(9600);
//Адрес управления доступом к среде (аппаратное обеспечение Ethernet) для шилда
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//IP, с которым мы настраиваем порт Ethernet
byte ip[] = { 192, 168, 142, 130 };
// IP-конфигурация Modbus
Serial.println("Im into config");
mb.config(mac, ip); //Линия, где он застревает
//Записываем начальные значения в регистры после их создания с указанием места в памяти и значения
mb.addHreg(reg1_HREG, 1);
mb.addHreg(reg2_HREG, 1);
mb.addHreg(reg3_HREG, 1);
mb.addHreg(reg4_HREG, 1);
mb.addHreg(reg5_HREG, 1);
mb.addHreg(reg6_HREG, 1);
mb.addHreg(reg7_HREG, 1);
mb.addHreg(reg8_HREG, 1);
mb.addHreg(reg9_HREG, 1);
mb.addHreg(reg10_HREG, 1);
mb.addHreg(reg11_HREG, 1);
mb.addHreg(reg12_HREG, 1);
/*mb.addHreg(reg13_HREG, 1);
mb.addHreg(reg14_HREG, 1);
mb.addHreg(reg15_HREG, 1);
mb.addHreg(reg16_HREG, 1);
mb.addHreg(reg17_HREG, 1);
mb.addHreg(reg18_HREG, 1);
mb.addHreg(reg19_HREG, 1);
mb.addHreg(reg20_HREG, 1);
mb.addHreg(reg21_HREG, 1);
mb.addHreg(reg22_HREG, 1);
mb.addHreg(reg23_HREG, 1);
mb.addHreg(reg24_HREG, 1);*/
mb.addHreg(reg25_HREG ,1);
//Для расходомера
pinMode(PinSensor, INPUT);
attachInterrupt(0,ContarPulsos,RISING); //(Прерывание 0(Pin2),функция,нарастающий фронт)
}
void loop() {
mb.task();
float frecuencia=ObtenerFrecuencia(); // получаем частоту импульсов в Гц
float caudal_L_m=frecuencia/factor_conversion; //рассчитываем расход в л/м
float caudal_L_h=caudal_L_m*60; //рассчитываем расход в л/ч
mb.Hreg(reg25_HREG, caudal_L_h);
Serial.println("Fine");
}
1 ответ
В конце концов, я решил использовать Arduino Nano в качестве шлюза между ENC28J60 и Arduino Mega, потому что я думаю, что код готов к использованию для конфигураций контактов Arduino nano и mega.
enc28j60 отлично работает с Mega или любой другой платой. При чем тут Нано?, @Juraj
- Расчет CRC16 для MODBUS RTU
- Проблема со связью по Modbus между двумя Arduino при записи более 27 регистров.
- Как использовать библиотеку Modbus RTU функционального кода 6
- ARDUINO MODBUS TCP СОЕДИНЕНИЕ
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
а базовый пример EtherCard работает?, @Juraj
Да, все работает, пока я не использую объект ModbusIP и функцию mb.config., @guillermo Belda García
установите контакт 53 как выход и высокий уровень. это вывод SS SPI, и когда он плавает, SPI может переключиться в подчиненный режим., @Juraj