Erik_U писал(а): ↑13 дек 2024, 12:00
У меня на первом же контроллере больше десятка регистров длиной 4 байта.
Какой тип данных? Проверю тип ошибки, хотя бы, будет ясно, поддерживается функция чтения/записи или нет. Передача данных, думаю, будет по аналогии с известными командами, по одному байту целочисленное через разделитель, шестнадцатеричное слитно.
Erik_U писал(а): ↑13 дек 2024, 12:00
нашел 215 сообщений. Самое старшее - 2006 года. И среди них категорически мало "историй успеха".
Мы будем первые. Покажем дорогу остальным. Я люблю такое делать.
Erik_U писал(а): ↑13 дек 2024, 12:00
подкиньте ему несколько модбас устройств для тестов.
У самого, раз-два и обчёлся, но хорошие, есть на кого пальцем ткнуть, чтобы окно зимой открыть)

Ардуинку собрать помогу.
В Arduino IDE ставим библиотеку ModbusRTUSlave
https://github.com/CMB27/ModbusRTUSlave
MAX485 подсоединял так, пин контроля D2. Ардуину можно брать любую из списка поддерживаемых библиотекой, TX, RX, 5V и GND на всех подключается одинаково, пин контроля подбирается по разному, старайтесь найти D2, чтоб с тестами не заморачиваться
Из примера идущего с библиотекой убрал код для кнопок и диодов, оставил только модбас протокол, с этого можно начинать тестирование самого протокола на Микротике
Код: Выделить всё
#include <ModbusRTUSlave.h>
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) || defined(ARDUINO_SAM_DUE)
#define MODBUS_SERIAL Serial
#elif defined(ARDUINO_NANO_ESP32)
#define MODBUS_SERIAL Serial0
#else
#define MODBUS_SERIAL Serial1
#endif
#define MODBUS_BAUD 9600
#define MODBUS_CONFIG SERIAL_8N1
#define MODBUS_UNIT_ID 1
#if (defined(ARDUINO_NANO_RP2040_CONNECT) && !defined(ARDUINO_ARCH_MBED)) || defined(ARDUINO_NANO_ESP32)
const int8_t dePin = D2;
#else
const int8_t dePin = 2;
#endif
ModbusRTUSlave modbus(MODBUS_SERIAL, dePin);
const uint8_t numCoils = 16;
const uint8_t numDiscreteInputs = 16;
const uint8_t numHoldingRegisters = 32;
const uint8_t numInputRegisters = 32;
bool coils[numCoils];
bool discreteInputs[numDiscreteInputs];
uint16_t holdingRegisters[numHoldingRegisters];
uint16_t inputRegisters[numInputRegisters];
void setup() {
modbus.configureCoils(coils, numCoils);
modbus.configureDiscreteInputs(discreteInputs, numDiscreteInputs);
modbus.configureHoldingRegisters(holdingRegisters, numHoldingRegisters);
modbus.configureInputRegisters(inputRegisters, numInputRegisters);
MODBUS_SERIAL.begin(MODBUS_BAUD, MODBUS_CONFIG);
modbus.begin(MODBUS_UNIT_ID, MODBUS_BAUD, MODBUS_CONFIG);
}
void loop() {
modbus.poll();
}
Если будете использовать другой пин контроля, поменяйте в коде
Код: Выделить всё
const int8_t dePin = D2;
const int8_t dePin = 2;
на номер используемого пина.
Настраиваем порт на Микротике как в коде: Baud Rate 9600, Data Bits 8, Parity none, Stop Bits 1, Flow Control none
В таком виде на хабе адаптеры с Алиэкспресс работают на MIPS
Провод для линии модбас лучше брать потолще витой пары, "сигнальный" поискать, но для тестов сойдёт короткой длины витая.