Использование Modbus TCP на Arduino

У меня есть датчик scd30, подключенный к arduino uno. SCD30 работает по протоколу I2c. Я могу читать данные в реальном времени на последовательном мониторе в Arduino IDE. У меня на Arduino есть Ethernet-экран. Я хотел бы, чтобы 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()));

}

person user401708    schedule 10.09.2018    source источник
comment
Вы можете спросить у людей с Arduino.   -  person Johnny Mopp    schedule 10.09.2018
comment
Благодарю. отправлю там   -  person user401708    schedule 10.09.2018
comment
@ user401708 Если да, удалите этот вопрос здесь, поскольку вам не разрешено делать перекрестные сообщения.   -  person gre_gor    schedule 10.09.2018
comment
почему byte ip[] = { 000 , 00,0, 00 };, а не byte ip[] = {0, 0, 0, 0};? 000 - восьмеричная константа.   -  person bigwillydos    schedule 10.09.2018
comment
Я вынул IP-адрес для поста   -  person user401708    schedule 10.09.2018
comment
@ user401708, но вы оставили в MAC-адресе, чувак ...   -  person bigwillydos    schedule 10.09.2018
comment
это выдуманный вариант, который уже был в моем коде. Не повлиял ни на что. IP-адрес был тем, который я использовал   -  person user401708    schedule 10.09.2018
comment
пожалуйста, прочтите комментарий от @gre_gor.   -  person jsotola    schedule 10.09.2018
comment
Я не могу удалить вопрос или сообщение   -  person user401708    schedule 10.09.2018


Ответы (2)


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

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

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

person shubham kumar    schedule 10.09.2018
comment
библиотека запускает локальный сервер Modbus TCP для публикации значений датчиков для клиентов Modbus TCP. это другая концепция, чем публикация в облаке, как рекомендует этот ответ, поэтому этот ответ не отвечает на этот вопрос - person Juraj; 14.09.2018

Библиотека ModbusIP ожидает от вас, что вы предоставите значение регистра. Библиотека AirSensor дает вам эту ценность.

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

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

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

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

person Juraj    schedule 12.09.2018