ModbusRTU Slave (доработка)

Acuma
Offline
Зарегистрирован: 08.02.2022

Здравствуйте. Имею рабочий скетч: 

01#include <ModbusRtu.h>
02#define ID   100 // указали адрес модбас слейва
03int multi1;
04int multi2;
05 
06#define EN 3
07#define S0 4
08#define S1 5
09#define S2 6
10#define S3 7
11 
12int32_t myTimer;
13Modbus slave(ID, Serial1, 10); // 100 адрес 1 -485  4- пин
14int8_t state = 0;
15unsigned long tempus;
16uint16_t au16data[9]; // массив  регистров
17  word Reg2;
18  word Reg3;
19 
20 
21void setup() {
22  Serial.begin(9600);
23  Serial1.begin(9600); //открываем порт
24  slave.start(); // запуск
25  tempus = millis() + 100;
26  digitalWrite(13, HIGH );
27pinMode(S0, OUTPUT);
28  pinMode(S1, OUTPUT);
29  pinMode(S2, OUTPUT);
30  pinMode(S3, OUTPUT); 
31 
32  digitalWrite(S0, LOW);
33  digitalWrite(S1, LOW);
34  digitalWrite(S2, LOW);
35  digitalWrite(S3, LOW);
36 
37  pinMode(EN, OUTPUT);
38  digitalWrite(EN, LOW);
39  
40  
41}
42 
43void loop() {
44 
45   state = slave.poll( au16data, 9 ); // Параметры: Таблица регистров для обмена информацией
46                                      // Размер таблицы записей
47                                      // Возвращает 0, если нет запроса данных
48                                      // Возвращает от 1 до 4, если произошла ошибка связи
49                                      // Возвращает больше 4, если заказ был обработан правильно
50/*if (state == 0)
51{
52  Serial.println("Нет данных");
53delay(500);
54}
55*/
56if (state <4 && state >0)
57{
58  Serial.println("ERROR");
59}
60if (state > 4) {
61//Si es mayor a 4 = el pedido fué correcto
62      state = 0;
63      io_poll();
64 
65  }
66/*  if (millis() > tempus) digitalWrite(13, LOW );//гасим через 50 сек
67  // Обновляем выводы Arduino с помощью платы Modbus
68 
69  
70*/}
71void io_poll(){
72// Reg2=au16data[2];
73// Reg3=au16data[3];
74  Serial.print("multiplexor1");
75Serial.print("-");
76Serial.println(au16data[2]);
77delay(100);
78SetMuxAddress(au16data[2]);
79  delay(100);
80 
81    Serial.print("multiplexor2");
82Serial.print("-");
83Serial.println(au16data[3]);
84delay(100);
85SetMuxAddress(au16data[3]);
86  delay(100);
87  
88}
89 
90void SetMuxAddress(int address)
91{
92    digitalWrite(S0, (address >> 0) & 0x1);
93    digitalWrite(S1, (address >> 1) & 0x1);
94    digitalWrite(S2, (address >> 2) & 0x1);
95    digitalWrite(S3, (address >> 3) & 0x1);
96}

Пока я только в сериал получаю запросы от мастера, в виде чисел от 0 - 15. 

Мне нужно согласовать работу с мультиплексорами (2 шт.) (пример).

В мониторинг порта будут приходить числа по одной команде в 2 регистра. 

Для второго регистра соответствует мультиплексор, подключенный к Ардуино Мега следующим образом:

EN-D3;

S0-D4;

S1-D4;

S2-D6;

S3-D7;

SIG-Будет выводится на внешнее устройство. Обрабатываться оно будет так-же иным устройством. обработку sig в скетче реализовывать не нужно.

 

Для третьего регистра соответствует мультиплексор, подключенный к Ардуино мега следующим образом:

EN-D8;

S0-D9;

S1-D11;

S2-D12;

S3-D13;

SIG-Будет так-же выводится на внешнее устройство. Обрабатываться оно будет так-же иным устройством. обработку sig в скетче реализовывать не нужно.

Что нужно доработать?:

1. Если пришло что то по Modbus(if (state > 4)) --> определить в какой регистр пришла команда;

2. Если команда пришла в 2 регистр (au16data[2]) --> Если пришло число от 0 - 15 --> Необходимо открыть вывод аналогового входа, соответствующий числу, пришедшему в регистр и не закрывать до тех пор, пока не придет другое число в этот-же регистр --> отправить ответ мастеру: "1n" где n - это номер записанного числа.

--> Если пришло число >15 - отправить мастеру, "01n" - где n - пришедшее число.

Тоже самое и с 3 регистром:

2. Если команда пришла в 3 регистр (au16data[3]) --> Если пришло число от 0 - 15 --> Необходимо открыть вывод аналогового входа, соответствующий числу, пришедшему в регистр и не закрывать до тех пор, пока не придет другое число в этот-же регистр --> отправить ответ мастеру: "2n" где n - это номер записанного числа.

--> Если пришло число >15 - отправить мастеру, "02n" - где n - пришедшее число.

Важно чтобы каждый запрос обрабатывался программой 1 раз. 

 

Предлагайте стоимость и сроки. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ваша постановка задачи сворачивает мосх набок..... Наличие готового кода увеличивает стоимость от полутора до двух раз. 

Опишите задачу русским языком, забудьте про имеющийся кусок кода. Возможно тогда найдется исполнитель за вменяемые деньги.

На данный момент я понимаю, что только на уточнение задания потребуются переговоры с вами порядка нескольких часов, а это уже от 5 тысяч.

Acuma
Offline
Зарегистрирован: 08.02.2022

brokly пишет:

Ваша постановка задачи сворачивает мосх набок..... Наличие готового кода увеличивает стоимость от полутора до двух раз. 

Опишите задачу русским языком, забудьте про имеющийся кусок кода. Возможно тогда найдется исполнитель за вменяемые деньги.

На данный момент я понимаю, что только на уточнение задания потребуются переговоры с вами порядка нескольких часов, а это уже от 5 тысяч.

 

В прошлом скетче было много лишнего. Вот рабочий код:

01#include <ModbusRtu.h>
02#define ID   100
03Modbus slave(ID, Serial1, 10);
04int8_t state = 0;
05uint16_t au16data[9]; // массив  регистров
06 
07void setup() {
08  Serial.begin(9600);
09  Serial1.begin(9600);
10  slave.start();
11}
12 
13void loop() {
14 
15   state = slave.poll( au16data, 9 ); // Параметры: Таблица регистров для обмена информацией
16                                      // Размер таблицы записей
17                                      // Возвращает 0, если нет запроса данных
18                                      // Возвращает от 1 до 4, если произошла ошибка связи
19                                      // Возвращает больше 4, если заказ был обработан правильно
20 
21if (state <4 && state >0)
22{
23  Serial.println("ERROR");
24}
25if (state > 4) {
26      state = 0;
27      io_poll();
28 
29  }
30}
31 
32void io_poll(){
33  Serial.print("multiplexor1");
34Serial.print("-");
35Serial.println(au16data[2]);
36delay(100);
37 
38    Serial.print("multiplexor2");
39Serial.print("-");
40Serial.println(au16data[3]);
41delay(100);
42 
43}

Его суть в том чтобы принимать запросы от Master по ModbusRTU.

Интересует запись запросов в 2 регистра au16data[2] и au16data[3]; Данная часть кода работает успешно, без ошибок. Запросы приходят, и значение записанных в регистр чисел выводится в терминал.

Все Супер!

Теперь есть 3 задачи:

 

1. Нужно подключить 2 16 канальных мультиплексора CD74HC4067. У каждого из них есть 16 аналоговых входов (0-15); Имеется один выход SIG - с него будут сниматься показания каждого из 16 входов. Этот пин мы не задействуем - он будет подключен к отдельному устройству - нас оно не касается.

Теперь что нам нужно. Объясняю на пальцах. Допустим в au16data[2] нам записалось число 0. Это значит что на 1-м мультиплексоре нужно сделать на вывод в SIG аналоговый сигнал 0 входа.

2. Определить в какой регистр записались данные. Нам нужно выполнять какие то действия с мультиплексором только если записались какие то данные в определенный регистр. На пальцах:

Допустим в au16data[2] и в au16data[3] пришли 2 числа 0,0 соответственно. Это означает что нужно вывести из мультиплексора значения аналоговых входов 0 на первом мультиплексоре и 0 на втором. Но если допустим пришел запрос только в au16data[2], со значением 0, то вывод нужно сделать только с аналогового входа ноль на 1 мультиплексоре. 

 

3. В зависимости от того что пришло нужно отвечать мастеру. 

-Если пришло число больше 15, то ответ мастер будет такой: "0xn" - где x - номер мультиплексоре (1 или 2), а n - число больше 15 которое пришло.

-Если пришло число от 0-15, ответ будет такой: "xn" Где x - номер мультиплексора (1 или 2), а n - число от 0-15 которое пришло.

 

Так понятно?

 

ps Я отдавал одному мастеру эту задачу - он сказал что возьмется - предоплат не брал, но так ничего и не сделал. Потом оказалось что он сам плохо разбирается в задаче, так что, по возможности ищу толкового человека. Спасибо большое заранее. Форум замечательный!

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Мне не понято :( 

В модбас RTU НЕТ ПОНЯТИЕ "ОТВЕТ СЛЕЙВА" !!!!!!!!!!!!!!!!!!!!! 

Acuma
Offline
Зарегистрирован: 08.02.2022

brokly пишет:

Мне не понято :( 

В модбас RTU НЕТ ПОНЯТИЕ "ОТВЕТ СЛЕЙВА" !!!!!!!!!!!!!!!!!!!!! 

Ну если ответ не реализовать, то ничего страшного. Все остальное понятно?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Acuma пишет:

Ну если ответ не реализовать, то ничего страшного. Все остальное понятно?

Ничего не понятно. Я туповат, что бы исполнить ваш заказ. Извините.

Acuma
Offline
Зарегистрирован: 08.02.2022

brokly пишет:

Acuma пишет:

Ну если ответ не реализовать, то ничего страшного. Все остальное понятно?

Ничего не понятно. Я туповат, что бы исполнить ваш заказ. Извините.

 

Скорее это я балбес - объяснять не умею. Простите за потраченное время!

sadman41
Offline
Зарегистрирован: 19.10.2016

Если брукли не возьмется, могу повтыкать... Хотя, соглашусь с ним - пока что смысл понятен только в общих чертах.

wrk.sadman@gmail.com

Acuma
Offline
Зарегистрирован: 08.02.2022

sadman41 пишет:
Если брукли не возьмется, могу повтыкать... Хотя, соглашусь с ним - пока что смысл понятен только в общих чертах.

ermolaychuk2001@gmail.com Напишите мне на почту, если интересно - можем обсудить. Если появились вопросы - отвечу с радостью. Вообще расчитывал на 5000 рублей. 

 

Написал вам.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

sadman41 пишет:
Если брукли не возьмется, могу повтыкать... Хотя, соглашусь с ним - пока что смысл понятен только в общих чертах. wrk.sadman@gmail.com

Не возьмусь. Тут нужно общаться с заказчиком, боюсь очень растянется все это :( Кроме того не понятно , если это слейв, то что с мастером ... В общем есть туманные перспективы зарыться :(

b707
Offline
Зарегистрирован: 26.05.2017

Acuma, если Садман не возьмется - сделаю, но с учетом того что ваш "готовый код" написан частично с моей подачи - будет дороже

Acuma
Offline
Зарегистрирован: 08.02.2022

Спасибо. Уважаемый sadman41 сделал все буквально за вечер. Тестировать буду сегодня.

Всем спасибо!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Acuma пишет:
Уважаемый sadman41 сделал все буквально за вечер.

Никто и не сомневался.