Как я могу использовать протокол 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

Обсуждение

а базовый пример EtherCard работает?, @Juraj

Да, все работает, пока я не использую объект ModbusIP и функцию mb.config., @guillermo Belda García

установите контакт 53 как выход и высокий уровень. это вывод SS SPI, и когда он плавает, SPI может переключиться в подчиненный режим., @Juraj


1 ответ


-1

В конце концов, я решил использовать Arduino Nano в качестве шлюза между ENC28J60 и Arduino Mega, потому что я думаю, что код готов к использованию для конфигураций контактов Arduino nano и mega.

,

enc28j60 отлично работает с Mega или любой другой платой. При чем тут Нано?, @Juraj