Modbus IP с Simply Modbus TCP

include SPI.h
include Ethernet.h
include Modbus.h
include ModbusIP.h

//Смещения регистров Modbus (0-9999)
const int SENSOR_IREG = 100;
//Использованные пины
const int sensorPin = A0;

//Объект ModbusIP
ModbusIP mb;

long ts;


// Установите порт на 502
EthernetServer server = EthernetServer(502);

void setup() {
  //Назначаем идентификатор устройства Modbus.
  regBank.setId(1);

    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  

    byte ip[] = { 192, 168, 1, 177 };  

    mb.config(mac, ip);

    // Добавляем регистр SENSOR_IREG — используйте addIreg() для аналоговых входов
    mb.addIreg(SENSOR_IREG);

    ts = millis();

}

void loop() {

   //Вызов один раз внутри цикла() — здесь вся магия
   mb.task();


   if (millis() > ts + 2000) {  
       ts = millis();

       mb.Ireg(SENSOR_IREG, analogRead(sensorPin));
   }
}

Я пытаюсь прочитать данные с первого аналогового контакта через ModbusTCP, используя SimplyModbusTCP, но продолжаю получать ошибки при опросе Arduino. Я использую Arduino UNO с Ethernet Shield W5100 и библиотекой Modbus. Я запрашиваю данные с IP-адреса 192.168.1.177. Порт: 502 Ведомое устройство: 1 и код функции: 03. Я получаю сообщение об ошибке: «Произошла ошибка 66 при чтении TCP в SMT8.0.vi. LabVIEW: сетевое соединение было закрыто узлом».

, 👍0

Обсуждение

Вы тестировали экран Ethernet на каком-нибудь базовом примере библиотеки Ethernet?, @Juraj

Да, я сделал, и все работало нормально. Я даже могу пропинговать устройство через cmd., @Michael H.

вы установили адрес регистра 100? попробуйте 101 в клиенте тоже, @Juraj

Пробовал оба, результат одинаковый, @Michael H.

Удалил это, и я все еще получаю тот же результат, @Michael H.

все еще ошибка 66?, @Juraj

входные регистры — это функция 04, @Juraj

Я получаю то же самое, @Michael H.


2 ответа


Лучший ответ:

0

Похоже, проблема была в SimplyModbus, он использовал опрос Modbus и смог прочитать данные.

,

0

Не следует создавать сервер Ethernet. Библиотека создает сервер, и ваш сервер первым использует порт.

Код функции Modbus для чтения входных регистров — 04.

,

Я удалил эту строку и все равно получаю те же результаты, @Michael H.

Попробовал код функции 4 и получил тот же результат, @Michael H.

попробуй еще раз зарегистрируй 101, @Juraj