Китайский MODBUS релейный модуль
- Войдите на сайт для отправки комментариев
Ребят, здрасте, давно меня тут не было)
Нужна помощь с модбасом. Как то особо не попадалось с ним работать, опыта с этим протоколом практически нет. Сейчас стоит задача с такого модуля считать входы и щёлкать релюхами.
Есть вот такое описалово на странице товара, у продавана более выудить ничего не смог. т.к. толком с модбасом не сталкивался + это описание...затуп.
Modbus RTU инструкция Скорость передачи данных: 96008 нет 1 Шестнадцатеричный передачи Шестнадцатеричный приема Управление шаги: 1. Настройка программного обеспечения скорость передачи данных 2. Адрес настройки (адрес устройства для связи, адрес по умолчанию 01) /*********************************************************************************************************************************/ Примечание: подключено только одно устройство, иначе будет установлен адрес. Установите Адрес: 01 00 100 00 00 01 02 00 01 6 A 00/изменить 01 Установите Адрес: 02 00 100 00 00 01 02 00 02 2A 01/изменить 02 Установите Адрес: 03 00 100 00 00 01 02 00 03 EB C1/изменить 03 Прочитайте адрес 00 03 00 00 01 85 дБ Возврат: 00 03 02 00 01 44 44/01 как адрес /*********************************************************************************************************************************/ /*********************************************************************************************************************************/ Значение каждого байта: [1] /------------------------------------------------------------------------------------------------------------------------------------------------ № 1 реле: 01 05 00 01 00 9D 9A Байт 1: адрес Байт 2: функция? Байт 34: адрес регистрации Байт 56: данные регистрации Байт 7 8: проверка CRC /============================================================== [1] /------------------------------------------------------------------------------------------------------------------------------------------------ №0 реле: 01 05 00 FF 00 8C 3A №0 реле Закрыто: 01 05 00 00 00 00 компакт-дисков CA /------------------------------------------------------------------------------------------------------------------------------------------------ № 1 реле: 01 05 00 01 FF 00 DD FA № 1 реле Выключите: 01 05 00 01 00 9C 0A /------------------------------------------------------------------------------------------------------------------------------------------------ № 2 реле: 01 05 00 02 FF 00 2D фа № 2 реле Выключите: 01 05 00 02 00 06C 0A /------------------------------------------------------------------------------------------------------------------------------------------------ № 3 реле: 01 05 00 03 FF 00 7C 3A № 3 реле Выключите: 01 05 00 03 00 3D CA /------------------------------------------------------------------------------------------------------------------------------------------------ № 4 реле: 01 05 00 04 FF 00 CD FB № 4 реле отключения: 01 05 00 04 00 8C 0B /------------------------------------------------------------------------------------------------------------------------------------------------ № 5 реле: 01 05 00 05 FF 00 9C 3B № 5 реле Закрыто: 01 05 00 05 00 00 DD сертификатом от сертификационной /------------------------------------------------------------------------------------------------------------------------------------------------ № 6 реле: 01 05 00 06 FF 00 6C 3B Реле № 6 Выключите: 01 05 00 06 00 2D сертификатом от сертификационной /------------------------------------------------------------------------------------------------------------------------------------------------ № 7 реле: 01 05 00 07 FF 00 3D FB Реле № 7 Выключите: 01 05 00 07 00 07 C 0B /------------------------------------------------------------------------------------------------------------------------------------------------ /********************************************************************************************************************************/ Чтение № 0 статус реле: 01 01 00 00 01 FD CA Прочитайте № 1 реле статуса: 01 01 00 01 01 AC 0A Прочитайте 2 реле статуса: 01 01 00 02 00 01 5C 0A Прочитайте 3 реле статуса: 01 01 00 03 00 01 0D CA Читайте о статусе № 4 реле: 01 01 00 04 00 01 BC 0B Прочитайте № 5 реле статуса: 01 01 00 05 00 01 ED сертификатом от сертификационной Прочитайте № 6 реле статуса: 01 01 00 06 00 01 1D сертификатом от сертификационной Прочитайте 7 реле статуса: 01 01 00 07 00 01 4C 0B Прочитали все реле статуса: 01 01 00 00 08 3D CC /*********************************************************************************************************************************/ Чехол-книжка с инструкции: Описание: закройте сразу после открытия. 100 мс является единицей [1 стенда для 100 мс] Адрес № 1: №0 реле перегрева: 01 05 02 00 07 00 CE 42/700 MS = 7*100 MS = 700 мс № 1 реле перегрева: 01 05 01 02 08 00 9A 72/800 MS Возврат: то же, что и инструкции по отправке Адрес (строка 2): №0 реле перегрева: 02 05 02 00 05 00/CF/11/500 MS № 1 реле перегрева: 02 05 01 02 06 00 9E 21/600 MS /====================================================================== Полного исчезновения: 01 0F 00 00 00 08 01 00 FE 95 Полный яркий: 01 0F 00 00 08 01 FF быть D5 /********************************************************************************************************************************/ Один Чехол-книжка Инструкция: №0 реле флип: 01 05 00 55 00 F2 9A № 1 реле флип: 01 05 00 01 55 00 A3 5A № 2 реле опрокидывания: 01 05 00 02 55 00 53 5A № 3 реле опрокидывания: 01 05 00 03 55 00 02 9A № 4 реле флип: 01 05 00 04 55 00 B 3 5B № 5 реле опрокидывания: 01 05 00 05 55 00 E2 9B № 6 реле опрокидывания: 01 05 00 06 55 00 129B № 7 реле флип: 01 05 00 07 55 00 43 5B Все флип инструкции по уходу за изделием 01 05 00 5A 00 F7 6A /***********************************************************************************************************************************/ Считывайте Все входные состояния интерфейса Отправка: 01 02 00 00 00 08 79 CC/чтения 8 входных сигналов государства Возврат: 01 02 01 00 A1 88
с одной стороны у меня мега(controllino), с другой эта штуковина.
Так понимаю у меня мега будет мастером и должна опрашивать регистры входов и писать в регистры реле?
Мастер адрес 0, а слэйв 1.
Я так понимаю я записываю один байт в конкретный регистр этот байт в бинарном виде будет устанавливать состояния реле и при считывании наоборот, считываю байт из определённого регистра и состояние бит в байте мне показывают состояние входа?
На сайте cotrollino есть такой пример для modbus master, что то я совсем подвис как описалово от модуля применить к этому примеру.
Где в этом примере задаются адреса регистров для считывания\записи?
#include <Controllino.h> /* Usage of CONTROLLINO library allows you to use CONTROLLINO_xx aliases in your sketch. */ #include "ModbusRtu.h" /* Usage of ModBusRtu library allows you to implement the Modbus RTU protocol in your sketch. */ // This MACRO defines Modbus master address. // For any Modbus slave devices are reserved addresses in the range from 1 to 247. // Important note only address 0 is reserved for a Modbus master device! #define MasterModbusAdd 0 #define SlaveModbusAdd 1 // This MACRO defines number of the comport that is used for RS 485 interface. // For MAXI and MEGA RS485 is reserved UART Serial3. #define RS485Serial 3 // The object ControllinoModbuSlave of the class Modbus is initialized with three parameters. // The first parametr specifies the address of the Modbus slave device. // The second parameter specifies type of the interface used for communication between devices - in this sketch - RS485. // The third parameter can be any number. During the initialization of the object this parameter has no effect. Modbus ControllinoModbusMaster(MasterModbusAdd, RS485Serial, 0); // This uint16 array specified internal registers in the Modbus slave device. // Each Modbus device has particular internal registers that are available for the Modbus master. // In this example sketch internal registers are defined as follows: // (ModbusSlaveRegisters 0 - 3 read only and ModbusSlaveRegisters 4 - 7 write only from the Master perspective): // ModbusSlaveRegisters[0] - Read an analog value from the CONTROLLINO_A0 - returns value in the range from 0 to 1023. // ModbusSlaveRegisters[1] - Read an digital value from the CONTROLLINO_D0 - returns only the value 0 or 1. // ModbusSlaveRegisters[2] - Read the number of incoming messages - Communication diagnostic. // ModbusSlaveRegisters[3] - Read the number of number of outcoming messages - Communication diagnostic. // ModbusSlaveRegisters[4] - Sets the Relay output CONTROLLINO_R0 - only the value 0 or 1 is accepted. // ModbusSlaveRegisters[5] - Sets the Relay output CONTROLLINO_R1 - only the value 0 or 1 is accepted. // ModbusSlaveRegisters[6] - Sets the Relay output CONTROLLINO_R2 - only the value 0 or 1 is accepted. // ModbusSlaveRegisters[7] - Sets the Relay output CONTROLLINO_R3 - only the value 0 or 1 is accepted. uint16_t ModbusSlaveRegisters[8]; // This is an structe which contains a query to an slave device modbus_t ModbusQuery[2]; uint8_t myState; // machine state uint8_t currentQuery; // pointer to message query unsigned long WaitingTime; void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); Serial.println("-----------------------------------------"); Serial.println("CONTROLLINO Modbus RTU Master Test Sketch"); Serial.println("-----------------------------------------"); Serial.println(""); // ModbusQuery 0: read registers ModbusQuery[0].u8id = SlaveModbusAdd; // slave address ModbusQuery[0].u8fct = 3; // function code (this one is registers read) ModbusQuery[0].u16RegAdd = 0; // start address in slave ModbusQuery[0].u16CoilsNo = 4; // number of elements (coils or registers) to read ModbusQuery[0].au16reg = ModbusSlaveRegisters; // pointer to a memory array in the CONTROLLINO // ModbusQuery 1: write a single register ModbusQuery[1].u8id = SlaveModbusAdd; // slave address ModbusQuery[1].u8fct = 6; // function code (this one is write a single register) ModbusQuery[1].u16RegAdd = 4; // start address in slave ModbusQuery[1].u16CoilsNo = 1; // number of elements (coils or registers) to write ModbusQuery[1].au16reg = ModbusSlaveRegisters+4; // pointer to a memory array in the CONTROLLINO ModbusSlaveRegisters[4] = 1; // initial value for the relays ControllinoModbusMaster.begin( 19200 ); // baud-rate at 19200 ControllinoModbusMaster.setTimeOut( 5000 ); // if there is no answer in 5000 ms, roll over WaitingTime = millis() + 1000; myState = 0; currentQuery = 0; } void loop() { switch( myState ) { case 0: if (millis() > WaitingTime) myState++; // wait state break; case 1: Serial.print("---- Sending query "); Serial.print(currentQuery); Serial.println(" -------------"); ControllinoModbusMaster.query( ModbusQuery[currentQuery] ); // send query (only once) myState++; currentQuery++; if (currentQuery == 2) { currentQuery = 0; } break; case 2: ControllinoModbusMaster.poll(); // check incoming messages if (ControllinoModbusMaster.getState() == COM_IDLE) { // response from the slave was received myState = 0; WaitingTime = millis() + 1000; // debug printout if (currentQuery == 0) { // registers write was proceed Serial.println("---------- WRITE RESPONSE RECEIVED ----"); Serial.println(""); } if (currentQuery == 1) { // registers read was proceed Serial.println("---------- READ RESPONSE RECEIVED ----"); Serial.print("Slave "); Serial.print(SlaveModbusAdd, DEC); Serial.print(" ADC0: 0x"); Serial.print(ModbusSlaveRegisters[0], HEX); Serial.print(" , Digital0: "); Serial.print(ModbusSlaveRegisters[1], BIN); Serial.print(" , ModbusCounterIn: "); Serial.print(ModbusSlaveRegisters[2], DEC); Serial.print(" , ModbusCounterOut: "); Serial.println(ModbusSlaveRegisters[3], DEC); Serial.println("-------------------------------------"); Serial.println(""); // toggle with the relays ModbusQuery[1].u16RegAdd++; if (ModbusQuery[1].u16RegAdd == 8) { ModbusQuery[1].u16RegAdd = 4; if (ModbusSlaveRegisters[4]) { ModbusSlaveRegisters[4] = 0; } else { ModbusSlaveRegisters[4] = 1; } } } } break; } }
ModbusQuery[0].u8id = SlaveModbusAdd; // тут понятно адрес модуля "1" ModbusQuery[0].u8fct = 3; // функция читаем остаётся та же "3" ModbusQuery[0].u16RegAdd = 0; // Какой адрес регистра мне считывать???? ModbusQuery[0].u16CoilsNo = 4; // количество регистров "1"? ModbusQuery[0].au16reg = ModbusSlaveRegisters; // массив считанных байт или регистров(совсем запутался)
Помогите разобраться?!
судя по картинке, этим модулем кроме модбаса можно управлять пинами ардуины, как в самом обычном реле. Так что если вам самому не нужен модбас - не парьтесь
судя по картинке, этим модулем кроме модбаса можно управлять пинами ардуины, как в самом обычном реле. Так что если вам самому не нужен модбас - не парьтесь
не, это дискретные входы, т.е. в модбас...
И у меня на меге всё занято, для этого мне и нужно прикрутить этот модуль...
Чтобы начать изучать Modbus, необходимо иметь, как минимум: https://www.modbusdriver.com/modpoll.html (есть и покруче утилиты) и
А иначе это будет битва добра со злом.
usb rs конвертер где то валяется...ну всё равно вопрос открытый остаётся, с какими регистрами мне работать...из описания к железке ничего не понятно...
usb rs конвертер где то валяется...ну всё равно вопрос открытый остаётся, с какими регистрами мне работать...из описания к железке ничего не понятно...
так вам даже пример вроде дали - там все адреса и регистры прописаны. Вы для начала на железе с этим кодом попробуйте - глядишь все и прояснится
usb rs конвертер где то валяется...ну всё равно вопрос открытый остаётся, с какими регистрами мне работать...из описания к железке ничего не понятно...
так вам даже пример вроде дали - там все адреса и регистры прописаны. Вы для начала на железе с этим кодом попробуйте - глядишь все и прояснится
этот пример от библиотеки он к модулю не имеет отношения, эту библиотеку производитель controllino рекомендует, с этой библиотекой идёт этот пример. Хотя на этом ПЛК все библиотеки заводятся лишь бы по пинам сросталось. по крайней мере MQTT с полпинка завелось.
я не совсем понимаю, в чем вопрос
Вот кусок из китайского описания:
вот кусок из примера либы
соответствия не замечаете?
я не совсем понимаю, в чем вопрос
Вот кусок из китайского описания:
вот кусок из примера либы
соответствия не замечаете?
похоже на правду, только мне больше эта шпора помогла )
надо до железок добраться.
Любит у нас народ всякую гадость по помойкам собирать :)
https://ru.wikipedia.org/wiki/Modbus
Реле щёлкать получилось, но чуствую делаю это неправильно:
Этот ModbusSlaveRegisters массив собирает в себя данные с регистров слейва. ControllinoModbusMaster.poll() я так понял проверяет полученные пакеты.
С 26й по 30ю строку, что то не то...как мне теперь считать входы?
Никак не выходит малахитовый цветок (
Подключил модуль к usb конвертеру, регистры читаются
Подключаю к CONTROLLINO глухо...
Согласно даташиту RS конвертер на CONTROLLINO сидит на Serial3
При этом до этого получалось дёргать реле...
Что я делаю не так?
Что не так ?
Все не так.
Вам же дали ссылку на описание протокола, изучайте.
Сам долго бился, пока не въехал.
Потом все стало ясно и прозрачно.
Что я делаю не так?
Как правило - без моделирования ситуации на схожем железе никто не возьмется давать ответ. А у кого это контроллино и девайс ваш есть?
У меня вот был китайский счётчик, который тоже не отвечал в определённых условиях. Условия эти были - слишком большое, по мнению счётчика, кол-во запрошенных регистров. Нашёл только методом тыка.
Там на борту та же мега и IDE определяет её как мегу. По поводу RE,DE они обязательно должны подключены? По даташиту они на 68 и 69 пинах, да и микросхема преобразователя скорее всего max485. Пробовал в лоб отсылать, что то типа этого:
В ответ тишина, ни мусора ничего...(
Может что то с CRC или с таймингами, или я какую то мелочь упускаю, глаза уже замылились...(
Вам надо воткнуть в винду свисток, запустить терминал. Свисток по 485 соединить с контролиной. Проверить простой коннект на read/write.
Затем - найти ModBus сервер. Запустить его и натравить на свисток, который по 485 будет продолжен быть соединен с контролиной. Контролину сделать клиентом и дёргать ею виндовый Modbus, да смотреть ему в логи.
Так будет понятно хотя бы - работает какой-либо компонент или нет. Сейчас же локализовать проблему вы не можете, поэтому и мечетесь.
Я же это сделал 4 поста выше, вы да же не смотрите...(
Аааа...пробовать наоборот, как вариант....
Я вижу "Подключил модуль к usb конвертеру, регистры читаются" - контролино тут никак не проверено.
Свисток подключил к rs контроллино, залил это:
с термита отправляю "типа" запрос на считывание 01 02 00 00 00 08, буфер Serial3 пустой...так ведь не должно быть?
Ну да, нездоровая ситуация. Хоть что-то должно вылезать.
Свисток, как видим, работоспособный, провода проверили, полагаю, несколько раз. Значит на стороне контролины фигня. DE/RE проверяйте - действительно ли на тех ли пинах, которыми вы в скетче манипулируете.
Залил в контроллино пример слейва который должен быть рабочим, который предлагает производитель, запустил ModbusLook, ModbusLook пишет что нет связи...
написано тут...
в библиотеке так...
Без железяки сложно разобраться. Она может быть нескольких ревизий, где соединено всё по-разному.
Вот я вижу в https://github.com/CONTROLLINO-PLC/CONTROLLINO_Library/blob/master/Controllino.h
Т.е. какбутто DE/RE на 75/76 ноге чипа висят. Ведь у платы Arduino Mega2560 нет 75 и 76 пина. Но при этом, в камменте читаем: Set of macros mapping CONTROLLINO aliases to Arduino pin numbers.
Вобщем, расследование проводить нужно по полной программе.
Связался с представителем, возможно они прояснят...вроде ребята отзывчивые...
Видимо, DE/RE (по вашей схеме висят) на PJ5/PJ6. У Ардуино IDE, похоже, прямого выхода нет на эти пины - я на картинках пиноута меги не вижу эти PJ. То есть остаётся попробовать прямую манипуляцию через DDRJ/PORTJ.
В спешке в примере для слейва не изменил скорость...
с этим примером
Значит где то в коде напортачил...
Третий элемент в инициализации это нога re de. Эти ноги надо соединить и соединить с ногой платы, которая прописана в инициализации. Для 485 ноль не может быть. У Вас ноль.
Тут не получится соединить, в том то и вопрос какие пины нужно прописать...этот пример рекомендует производитель...
тут он приводит пример
пишет что третий параметр ни на что не влияет
Ну тогда считайте, что мой комментарий к посту #11. С контролино дел не имел. Modbusrtu работает без проблем
В Controllino.h есть функции:
Причём у них же в примере:
Вот только функции
нету, если поковырять библиотеку есть
и за что отвечает CONTROLLINO_RS485_RX ???
Добрый вечер.
Удалось запустить релейный модуль?
Я купил модуль с одним реле.
https://www.cicig.co/product/yid1aujvx#
Начинаю разбираться.