Arduino и Trace Mode 6

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Никто не пробовал связать Trace Mode 6 по ком порту с ардуино??? Может у кого есть подробная информация??? или ето невозможно?

maksim
Offline
Зарегистрирован: 12.02.2012
ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Спасибо))) буду разбираться!

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

В Trace Mode разобрался а вот как организовать ModBus на Arduino не могу((( Помогите.

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

НАшол вот ету библиотеку ... http://www.arduino.cc/playground/Code/ModbusMaster Попробую

maksim
Offline
Зарегистрирован: 12.02.2012

Я не понимаю, в чем проблема? Качаете архив по ссылке которую я дал выше, кладете папки SimpleModbusMaster и SimpleModbusSlave в папку \arduino-1.0\libraries, запускаете ИДЕ, выбираете пример наверное SimpleModbusSlave, а там всего две функции: 

modbus_configure(9600, 1, 2, TOTAL_REGS_SIZE);
modbus_update(holdingRegs); 

с modbus_configure я думаю все ясно, 9600 - это скорость, чо такое 1, 2 не знаю почитайте и TOTAL_REGS_SIZE - количество элементов массива, который будет передаваться/приниматься.
Ну а modbus_update собственно и обновляет (передает/принимает) тот самый массив, а в ответ еще и ошибку вовзвращает, если таковая имеется.

В этом стандартном примере передаются по modbus данные с 6 аналоговых выводов с А0 по А5, с одного цифрового вывода 7 и принимаются данные для светодиода на 13 выводе.

maksim
Offline
Зарегистрирован: 12.02.2012

ramon_sobaka пишет:

НАшол вот ету библиотеку ... http://www.arduino.cc/playground/Code/ModbusMaster Попробую

Зачем искать, если я вам ссылку дал, та библиотека не рабочая? Да и мне кажтся, что датчику логичнее быть Slave'ом, а не Master'ом.

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Когда компилирую пример выдает ошибку((( Помогите с ModBus на Arduino

maksim
Offline
Зарегистрирован: 12.02.2012

У меня все замечательно компилится. 

SimpleModbus has been updated to support Arduino V1.0.

скачайте Arduino IDE 1.0

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

У меня 1.0.1

maksim
Offline
Зарегистрирован: 12.02.2012

Я за вас рад )

maksim пишет:

скачайте Arduino IDE 1.0

или редактируйте библиотеку под 1.0.1

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Версия 1.0.1 а плата Leonardo ...в 1.0 нет Leonardo((((

maksim
Offline
Зарегистрирован: 12.02.2012

Тогда только редактировать или искать другую, но мне кажется с поиском будут проблемы...

maksim
Offline
Зарегистрирован: 12.02.2012

ошибки покажите

maksim
Offline
Зарегистрирован: 12.02.2012

и еще а попробуйте выбрать например Уну и просто скомпилировать

А сейчас сам гляну, у меня ж есть 1.0.1

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Выбрал Уно. Скомпилировало без ошибок. 

Компиляция на 1.0.1 Leonardo Ошибка:

 
 
'HardwareSerial' requested
C:\arduino-1.0.1\libraries\ModbusMaster\ModbusMaster.cpp: In member function 'void ModbusMaster::begin(uint16_t)':
C:\arduino-1.0.1\libraries\ModbusMaster\ModbusMaster.cpp:139: error: no match for 'operator=' in 'MBSerial = Serial'
C:\arduino-1.0.1\hardware\arduino\cores\arduino/HardwareSerial.h:32: note: candidates are: HardwareSerial& HardwareSerial::operator=(const HardwareSerial&)

 

maksim
Offline
Зарегистрирован: 12.02.2012

Не знаю в чем у вас проблема у меня компилится без проблем в 1.0.1 с леонардо.

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

На 1.0.1 выбрал плату не Leonardo а UNO и все скомпилило без ошибок! Проблема в плате Leonardo(((( ???

maksim
Offline
Зарегистрирован: 12.02.2012

а попробуйте так modbus_configure(9600, 1, 1, TOTAL_REGS_SIZE);

maksim
Offline
Зарегистрирован: 12.02.2012

Так стоп, я компилю Slave, а вы Master, хотя и мастер у меня компилится с Леонардой, так я так и не понял, вы зачем пытаетесь мастер запустить? Или так и должно быть?

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

на 1.0.2 тоже самое. Добавил в сетап modbus_configure(9600, 1, 1, TOTAL_REGS_SIZE); 

Ошибки

Basic.pde: In function 'void setup()':

Basic:39: error: 'TOTAL_REGS_SIZE' was not declared in this scope
Basic:39: error: 'modbus_configure' was not declared in this scope
maksim
Offline
Зарегистрирован: 12.02.2012

Куда добавили? в Мастер? так естественно не заработает. Еще раз откройте пример SimpleModbusSlave и попробуйте скомпилировать.

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

По ссылке http://www.adastra.ru/products/drivers/modbus/ первое видео Подключение оборудования через посследовательный порт RS 232/485 по протоколу MODBUS RTU а на ардуино потенциометр передает значение через аналог в трейсмод через ModBus  но для начала пытаюсь розобратся в ModBus Arduino но даже пример не компилит(

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

У меня только два примера Basic и PhoenixContact_nanoLC

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

maksim пишет:

Я не понимаю, в чем проблема? Качаете архив по ссылке которую я дал выше, кладете папки SimpleModbusMaster и SimpleModbusSlave в папку \arduino-1.0\libraries, запускаете ИДЕ, выбираете пример наверное SimpleModbusSlave, а там всего две функции: 

modbus_configure(9600, 1, 2, TOTAL_REGS_SIZE);
modbus_update(holdingRegs); 

с modbus_configure я думаю все ясно, 9600 - это скорость, чо такое 1, 2 не знаю почитайте и TOTAL_REGS_SIZE - количество элементов массива, который будет передаваться/приниматься.
Ну а modbus_update собственно и обновляет (передает/принимает) тот самый массив, а в ответ еще и ошибку вовзвращает, если таковая имеется.

В этом стандартном примере передаются по modbus данные с 6 аналоговых выводов с А0 по А5, с одного цифрового вывода 7 и принимаются данные для светодиода на 13 выводе.

Скомпилил. Гдето выпало ето сообщение! Я мучался с той библиотекой что я скинул. Извините!

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

По ссылке http://www.adastra.ru/products/drivers/modbus/ первое видео Подключение оборудования через посследовательный порт RS 232/485 по протоколу MODBUS RTU а на ардуино потенциометр передает значение через аналог в трейсмод через ModBus. 

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Помогите. Я с Modbus никогда не работал.

maksim
Offline
Зарегистрирован: 12.02.2012

Я тоже, ну так чем вам помоч? в чем проблема то? На видео же все показано и там как раз Trace Mode выстапает как Мастер.

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Откомпилировал скеч с примера на Ардуино. Подключил потенциометр на А0. В трейсмод зделал как на видео. В результате запускаю программу в трейсмод на ардуино мигает RX (чтото оправляэт) но окне графика 0. Может както нужно настроить адрес и канал соответственно с ардуино?

xpokc
Offline
Зарегистрирован: 16.12.2012

Добрый вечер, скажите так удалось трей связать с ардуинкой, я тоже столько инфы перелопатил и скетчей  и все глухо

 

nmi
Offline
Зарегистрирован: 17.12.2012

Все просто: 1,2  Это один стартовый бит, 2-стоповых бита.

Это формат передачи данных байта через последовательный порт... самый распространенный...

2 стоповых бита нужно чтобы понять что передача байта закончилась. Ну а стортовый, для внутренней синхронизации UART под начало ее приема....

Не заморачивайся, просто ставь и все

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Не удалось... дуина отправляет данные... но трейс не может понять что ето((( Нужно настроить сам Трейсмод. Делал на Visual C#  даные получает с дуины только по запросу... в реал тайм когда дуина всегда шльот данные программа просто виснет(((

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Пока не будет нормальной роботы ModBus RTU  о любих SCADA можно забыть(((

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

 

nmi ...наведите пример будьте добры

leshak
Offline
Зарегистрирован: 29.09.2011

ramon_sobaka пишет:

Не удалось... дуина отправляет данные... но трейс не может понять что ето((( Нужно настроить сам Трейсмод. Делал на Visual C#  даные получает с дуины только по запросу... в реал тайм когда дуина всегда шльот данные программа просто виснет(((

Частенько так бывает если пытаетесь обновлять визуальные элементы не из UI-шного потока.

Если в обработчике событий Serial напрямую попытатся вывести что-то в TextBox и ему подобных. Сделать что-то TextBox1.Text=recivedData;

То, скорее всего, закончится "горем". Так как обработчик - запускается в отдельном потоке. Как это корректно сделать - зависит от того на чем у вас Морда построена на WinForms или WPF. Ищите что-то типа "update ui thread" и добавляете на чем вы построили интерфейс.

Если с потоками уже корректно, то возможно просто "не успевает отображать". Данные приходят быстрее чем обновляется интерфейс (вот он и уходит в "вечное обновление"). Попробуйте снизить частоту и слать, к примеру от ардуины данные раз в секунду.

Vitaly
Offline
Зарегистрирован: 12.09.2011

С помощью библиотеки http://code.google.com/p/simple-modbus/ и функции READ_HOLDING_REGISTERS удалось опросить терморегулятор с определённым адресом. Правда в режиме RTU, но проблема в другом. Где теперь в скетче (SimpleModbusMaster), найти ответ? Я так понимаю, в скетче должна быть переменная дл хранения ответа с опрошенных регистров, но как она называется, ничего похожего не нашёл. Вот есть переменная, regs[5], в ней хранится количество ошибок (неотвеченных запросов).  При нарушеннии в цепи RS485, regs[5] увеличивается на единцу после каждого запроса.

Куда копать дальше? Где найти данные ответа?

 

xpokc
Offline
Зарегистрирован: 16.12.2012

Всем доброго времени суток!  И все таки они  они общаются  Trace Mode 6 и Ардуино по протоколу ModBus RTU  )))  И довольно таки неплохо цифровые вх/вых работают отлично  и псевдо - аналоговый  выход PWM тоже пашет норм,  на аналоговых  входах наблюдаются шумы так что фильтры делать прийдется. А вообще  желательно на все вх/вых поставить что б потом тараканов не ловить в схеме )))) Единственное что у меня пока неполучилось так это  отобразить температуру на ТМ-6 я использовал термистор, но так как Ардуино работает в режиме модуля I/O лишний код пихать туда нестал просто сделал трансфер в тм значений, а там написал блоками  формулу перевода значений в реальную температуру. В итоге поймал огромного таракана! После выходных куплю далас и аналоговый термометр LM  )))  буду пробывать.   Но вернемся к насущьному вопросу Скетч  Мод баса брал  здесь, но немного доработал.

/*
Modbus RTU - Arduino
Для простоты и уменьшения потребления памяти
поддерживается только две следующие функции Modbus:
- read holding registers   (0x03)
- write multiple registers (0x10)
*/
 
#include <SoftwareSerial.h>
#include <Modbusino.h>
const int in1 = A0; // Задаем аналоговый вход
const int in2 = A1; 
const int in3 = A2; 
const int in4 = A3; 
const int in5 = 3; // задаем  цифровой вход
const int in6 = 5; 
const int in7 = 6; 
 
const int analogOutPin = 9; // Задаем аналоговый PWM выход.
const int analogOutPin1 = 11; // Задаем аналоговый PWM выход.
const int RL0 = 2;// Задаем цифровой выход.
const int RL1 = 4;
const int RL2 = 7;
const int RL3 = 8;
const int RL4 = 12;
const int RL5 = 13;
const int rl_arr[] = {RL0,RL1,RL2,RL3,RL4,RL5,};
const int regs = 20; // количество регистров
const int ID_slave = 1;
 
uint16_t tab_reg[regs]; //задаем массив регистров
 
// Инициализация SLAVE, индификатор в сети ID = 1
ModbusinoSlave modbusino_slave(ID_slave);
 
// на цифр. выходы сразу записываем значение регистров
// любое значение > 0 это HIGH, 0 - LOW  
 
void SetRelay() {
int i;
for (i = 0; i < 6; i++) {
 digitalWrite(rl_arr[i], tab_reg[i]);
 analogWrite(analogOutPin, tab_reg[7]); // запись аналогового значения в регистр
 analogWrite(analogOutPin1, tab_reg[8]);}
}
void setup() {
 modbusino_slave.setup(38400);
 pinMode(RL0, OUTPUT); // установка цифровых вх/вых в режим выхода  
 pinMode(RL1, OUTPUT);
 pinMode(RL2, OUTPUT);
 pinMode(RL3, OUTPUT);
 pinMode(RL4, OUTPUT);
 pinMode(RL5, OUTPUT);
 pinMode(analogOutPin, OUTPUT); // установка вых PWM  в режим аналогового выхода
 pinMode(analogOutPin1, OUTPUT);  
}
void loop() {
 modbusino_slave.loop(tab_reg, regs);
 SetRelay();
tab_reg[9] = analogRead(A0); //запись аналогового значения в 9-ый регистр
tab_reg[10] = analogRead(A1); //запись аналогового значения
tab_reg[11] = analogRead(A2); //запись аналогового значения 
tab_reg[12] = analogRead(A3); //запись аналогового значения 
tab_reg[13] = digitalRead(3); //запись значения цифрового входа  в 13-ый регистр
tab_reg[14] = digitalRead(5); //запись значения цифрового входа
tab_reg[15] = digitalRead(6); //запись значения цифрового входа
}
В Trace Mode 6 заходим в канал источники/приемники создаем группу ModBus в ней создаем компонент  Rout_Word(3)   это соответсвует нашему регистру  read holding registers   (0x03)   здесь мы читаем взодные данные и цифры и аналога )))  этот компонент  W_Float(16) соответствует - write multiple registers (0x10) сюда мы передаем  и цифру и аналог на выход
Настройка пораметров компонента:
Номер порта  для сом1  в hex формате 0х0
Адрес  - это адрес ардуинки   в hex ставим 0х1  так как у нас адрес 1
Канал это адрес регистра с которого читаем или в который пишим )))
Тип протокола ModBus
Направление  вход или выход смотря что будете делать 
формат аналог/цифра тоже на выше усмотрение )))
Да чуть не забыл  в настройках ком порта в Trace Mode 6  установите номер порта  к которому подключилась ардуинка и поставьте бит рейд  тот который вы зашиваете в Скетче в ардуинку в моем случае это 38400 
 Если что непонятно пишите  подскажу ))) 
Так что пользуйтесь наздоровье!
ilya_turlo
Offline
Зарегистрирован: 14.10.2013

напишите ваш имейл, пожалуйста.

xpokc
Offline
Зарегистрирован: 16.12.2012
Didal
Offline
Зарегистрирован: 16.04.2014

 

xpokc пишет:

#include <Modbusino.h>

Библиотека "Modbusino" может работать с МАХ485? Если да то как прописать управляющий пин?

 

Diemon
Offline
Зарегистрирован: 18.11.2011

Есть еще библиотека для Arduino OPC. А через OPC сервер уже можно связываться с любыми скадами.

http://www.st4makers.com/

demon0550
Offline
Зарегистрирован: 17.05.2014

Для связи с Trace Mode использую библиотеку SimpleModBusSlave, не получается разобраться в трейс моде, точнее с приемом данных я разобрался, а с отправкой нет. Подскажите пожалуйста, как мне отправить данные с трейс моде в ардуину?

В  "источники/приемники" создал группу Modbus и компонент  W_Float(16) (input), далее перетащил этот компонент во вкладку каналы, что делать дальше не знаю. Может кто-нибудь опишет пошагово что к чему привязать и как настроить что бы передавать данные (в моем случае число 100)?