Здравствуйте. Имею рабочий скетч:
02 | #define ID 100 // указали адрес модбас слейва |
13 | Modbus slave(ID, Serial1, 10); |
25 | tempus = millis() + 100; |
26 | digitalWrite(13, HIGH ); |
32 | digitalWrite(S0, LOW); |
33 | digitalWrite(S1, LOW); |
34 | digitalWrite(S2, LOW); |
35 | digitalWrite(S3, LOW); |
38 | digitalWrite(EN, LOW); |
45 | state = slave.poll( au16data, 9 ); |
56 | if (state <4 && state >0) |
58 | Serial .println( "ERROR" ); |
74 | Serial .print( "multiplexor1" ); |
76 | Serial .println(au16data[2]); |
78 | SetMuxAddress(au16data[2]); |
81 | Serial .print( "multiplexor2" ); |
83 | Serial .println(au16data[3]); |
85 | SetMuxAddress(au16data[3]); |
90 | void SetMuxAddress( int address) |
92 | digitalWrite(S0, (address >> 0) & 0x1); |
93 | digitalWrite(S1, (address >> 1) & 0x1); |
94 | digitalWrite(S2, (address >> 2) & 0x1); |
95 | digitalWrite(S3, (address >> 3) & 0x1); |
Пока я только в сериал получаю запросы от мастера, в виде чисел от 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 раз.
Предлагайте стоимость и сроки.
Ваша постановка задачи сворачивает мосх набок..... Наличие готового кода увеличивает стоимость от полутора до двух раз.
Опишите задачу русским языком, забудьте про имеющийся кусок кода. Возможно тогда найдется исполнитель за вменяемые деньги.
На данный момент я понимаю, что только на уточнение задания потребуются переговоры с вами порядка нескольких часов, а это уже от 5 тысяч.
Ваша постановка задачи сворачивает мосх набок..... Наличие готового кода увеличивает стоимость от полутора до двух раз.
Опишите задачу русским языком, забудьте про имеющийся кусок кода. Возможно тогда найдется исполнитель за вменяемые деньги.
На данный момент я понимаю, что только на уточнение задания потребуются переговоры с вами порядка нескольких часов, а это уже от 5 тысяч.
В прошлом скетче было много лишнего. Вот рабочий код:
01
#include <ModbusRtu.h>
02
#define ID 100
03
Modbus slave(ID, Serial1, 10);
04
int8_t state = 0;
05
uint16_t au16data[9];
// массив регистров
06
07
void
setup
() {
08
Serial
.begin(9600);
09
Serial1.begin(9600);
10
slave.start();
11
}
12
13
void
loop
() {
14
15
state = slave.poll( au16data, 9 );
// Параметры: Таблица регистров для обмена информацией
16
// Размер таблицы записей
17
// Возвращает 0, если нет запроса данных
18
// Возвращает от 1 до 4, если произошла ошибка связи
19
// Возвращает больше 4, если заказ был обработан правильно
20
21
if
(state <4 && state >0)
22
{
23
Serial
.println(
"ERROR"
);
24
}
25
if
(state > 4) {
26
state = 0;
27
io_poll();
28
29
}
30
}
31
32
void
io_poll(){
33
Serial
.print(
"multiplexor1"
);
34
Serial
.print(
"-"
);
35
Serial
.println(au16data[2]);
36
delay(100);
37
38
Serial
.print(
"multiplexor2"
);
39
Serial
.print(
"-"
);
40
Serial
.println(au16data[3]);
41
delay(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 Я отдавал одному мастеру эту задачу - он сказал что возьмется - предоплат не брал, но так ничего и не сделал. Потом оказалось что он сам плохо разбирается в задаче, так что, по возможности ищу толкового человека. Спасибо большое заранее. Форум замечательный!
Мне не понято :(
В модбас RTU НЕТ ПОНЯТИЕ "ОТВЕТ СЛЕЙВА" !!!!!!!!!!!!!!!!!!!!!
Мне не понято :(
В модбас RTU НЕТ ПОНЯТИЕ "ОТВЕТ СЛЕЙВА" !!!!!!!!!!!!!!!!!!!!!
Ну если ответ не реализовать, то ничего страшного. Все остальное понятно?
Ну если ответ не реализовать, то ничего страшного. Все остальное понятно?
Ничего не понятно. Я туповат, что бы исполнить ваш заказ. Извините.
Ну если ответ не реализовать, то ничего страшного. Все остальное понятно?
Ничего не понятно. Я туповат, что бы исполнить ваш заказ. Извините.
Скорее это я балбес - объяснять не умею. Простите за потраченное время!
Если брукли не возьмется, могу повтыкать... Хотя, соглашусь с ним - пока что смысл понятен только в общих чертах.
wrk.sadman@gmail.com
ermolaychuk2001@gmail.com Напишите мне на почту, если интересно - можем обсудить. Если появились вопросы - отвечу с радостью. Вообще расчитывал на 5000 рублей.
Написал вам.
Не возьмусь. Тут нужно общаться с заказчиком, боюсь очень растянется все это :( Кроме того не понятно , если это слейв, то что с мастером ... В общем есть туманные перспективы зарыться :(
Acuma, если Садман не возьмется - сделаю, но с учетом того что ваш "готовый код" написан частично с моей подачи - будет дороже
Спасибо. Уважаемый sadman41 сделал все буквально за вечер. Тестировать буду сегодня.
Всем спасибо!
Никто и не сомневался.