Использование Modbus TCP на Arduino - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть датчик scd30, подключенный к Arduino Uno. Scd30 работает по протоколу I2c. Я могу читать данные в реальном времени на последовательном мониторе в Arduino IDE. У меня есть щит Ethernet на моем Arduino. Я хотел бы, чтобы arduino связался с полевым агентом, который загрузит данные в Интернет.

Я перепробовал множество библиотек modbus tcp и, похоже, никуда не денется. Я могу подключить мое arduino к полевому агенту, но всякий раз, когда он отправляет данные, я получаю код исключения 0x02 - недопустимый адрес данных. Это библиотека, которую я использую https://github.com/andresarmento/modbus-arduino/tree/master/libraries/ModbusIP/examples

Я считаю, что правильный путь для этого - хранение регистров, но я не уверен, как это сделать при использовании i2c. Связь в порядке, проблема в формате. любая помощь приветствуется.

/*
  Reading CO2, humidity and temperature from the SCD30
  This example prints the current CO2 level, relative humidity, and temperature in C.
*/
#include <SPI.h>
#include <Ethernet.h>
#include <Modbus.h>
#include <ModbusIP.h>
#include <Wire.h>
#include <Streaming.h>
#include "SparkFun_SCD30_Arduino_Library.h" 

SCD30 airSensor;
//Modbus Registers Offsets (0-9999)
const int SENSOR_ISTS = 100; 
//ModbusIP object
ModbusIP mb;
long ts;    

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("SCD30 Example");

 // The media access control (ethernet hardware) address for the shield
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
    // The IP address for the shield
    byte ip[] = { 000 , 00,0, 00  }; 
    byte gateway[] = { 0, 0, 0, 0 };  
    byte subnet[] = { 255, 255, 255, 0 }; 
    //Config Modbus IP 
    mb.config(mac, ip,gateway,subnet);
    // Add SWITCH_ISTS register - Use addIsts() for digital inputs 
    mb.addHreg(SENSOR_ISTS);
  airSensor.begin(); //This will cause readings to occur every two seconds

}

void loop()
{

mb.task();
   mb.Hreg(SENSOR_ISTS, digitalRead(airSensor.getTemperature()));

}

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Библиотека ModbusIP ожидает от вас ввода значения регистра. Библиотека AirSensor дает вам это значение.

Установите значение регистра в Hreg:

mb.Hreg(SENSOR_ISTS, airSensor.getTemperature());

Я протестировал ваш эскиз без библиотеки датчиков, и он работает. Клиент был моим тестовым клиентом java, который я использую для проверки доступа к регистрам Modbus TCP моей фотоэлектрической системы.

Убедитесь, что клиент вызывает «0x03 - чтение регистров хранения» и проверяет адреса 100 и 101, поскольку некоторые смещения клиентов Modbus основаны на 1.

0 голосов
/ 10 сентября 2018

Я прочитал вашу проблему. На мой взгляд, сначала вы должны создать локальный сервер, где-то вроде вещного пространства (https://thingspace.verizon.com/) или других локальных онлайн-серверов), оттуда вы можете легко обрабатывать данные, поступающие с датчиков.

Вы используете код из библиотеки, поэтому он должен быть правильным в любом случае. Итак, с моей точки зрения, вы должны проверить данные транзакций.

желаю, чтобы мой анс помог тебе спасибо!

...