Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Открытый проект умного дома

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.04.2013, 06:39   #111
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Для отладки устройств модбас удобно использовать прогу modbus poll.
(можно найти с витаминкой)

Проверять поэтапно:
1. само устройство modbus rtu <---> modbus pull
2. устройство + шлюз (rtu - tcp) <---> modbus pull
и уже в последнюю очередь
3. устройство + шлюз (rtu - tcp) + phpModbus <---> web

у modbusgw есть хелп.
modbusgw висит остановить можно ctrl+c

запустив например так:
modbusgw -port /dev/ttyUSB0 -verbose -debug

можно увидеть лог работы шлюза.

для бэкграунда запускать с амперсндом в конце (но это уже после отладки)
modbusgw -port /dev/ttyUSB0 &

Последний раз редактировалось andr128; 15.04.2013 в 06:36.
andr128 вне форума   Ответить с цитированием
Старый 10.04.2013, 21:07   #112
Iron
Junior Member
 
Регистрация: 28.01.2013
Сообщений: 23
Вес репутации: 0
Iron is an unknown quantity at this point
По умолчанию

Да, что-то я заработался, 502 порт ТСР, хоть ОРС сервер цепляй и скаду.
Iron вне форума   Ответить с цитированием
Старый 11.04.2013, 00:25   #113
Iron
Junior Member
 
Регистрация: 28.01.2013
Сообщений: 23
Вес репутации: 0
Iron is an unknown quantity at this point
По умолчанию

Проверил - шлюз работает, рнр скрипт тоже работает на локальном сервере,
получается что проблема в рнр на роутере.
Iron вне форума   Ответить с цитированием
Старый 14.04.2013, 09:57   #114
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию измерение температуры по модбас

программа для ардуины

Код:
//====== SLAVE MODBUS RTU =========
//
//  Температура по ModBus RTU V.2
//	(c) Sh.A.S. 2013
//=================================

#include <MsTimer2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Modbuspin.h>


#define ID_MODBUS  1	// ID address ModBus RTU Device

#define ONE_WIRE_BUS  10	// датчик DS1820 DATA подкл. на pin
#define RES_TEMP      12	// разрешение (точность) темп. датчика в битах
#define LED_T	      13	// индикатор чтения


OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer; // адрес устройства

ModbusinoSlave modbusino_slave(ID_MODBUS);

enum {        
	MB_REST,	/* 0 Резерв   */
	MB_TEMP,	/* 1 Temperature */
	MB_REGS		/* 2 total number of registers on slave */
};

uint16_t tab_reg[MB_REGS];


void setup() 
{
	modbusino_slave.setup(19200, 3);		 // 3й- управляющий пин max485 (0 и 1 - не использ.)
	pinMode(LED_T, OUTPUT);                      // установка вых для св.диода

	sensors.begin();				                 // Start up the library
	sensors.getAddress(Thermometer, 0);			     // получить адрес DS18B20
  	sensors.setResolution(Thermometer, RES_TEMP);	 // установить разрешение (точность)
        sensors.setWaitForConversion(false);             // отключить ожидание


	MsTimer2::set(750, Tizm);	  // установка таймера для изм. температуры 
	MsTimer2::start();

    sensors.requestTemperatures();                 // Команда на измерение температуры
}

void Tizm() //обработка прерывания таймера - изм температуры
{
	digitalWrite(LED_T, HIGH );		// начать изм. температуры - зажечь св.диод

  	float tempC = 100 * sensors.getTempC(Thermometer);	// Получить температуру в градусах * 100 (-10,93 = -1093)
	tab_reg[MB_TEMP] = tempC;					// Записать в регистр

	digitalWrite(LED_T, LOW );      // изм. закончено - погасить св.диод

	sensors.requestTemperatures();	// Команда на измерение температуры до следующего прерывания
}


void loop()
{
 modbusino_slave.loop(tab_reg, MB_REGS); // Обмен с мастером
}

Это более совершенный код в предыдущей версии при обращении к ардуине иногда были сбои, не было ответа от ардуины в момент измерения температуры т.к. требовалась задержка в 750ms.

Буду очень благодарен если кто-то подскажет как делать измерение не постоянно, а через период в 5-10 сек.

Пример динамической страницы index.html периодически опрашивающей ардуину раз в сек.
Код HTML:
<html>  
<head>  
    <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">  
    <script type="text/javascript" src="jquery.js"></script>  
</head>  
      
<body>  
          
        <div id="content"></div>  
          
        <script>  
            function show()  
            {  
                $.ajax({  
                    url: "data.php",  
                    cache: false,  
                    success: function(html){  
                        $("#content").html(html);  
                    }  
                });  
            }  
          
            $(document).ready(function(){  
                show();  
                setInterval('show()',1000);  
            });  
        </script>  
          
</body>  
</html> 
Код data.php который непосредственно общается с ардуиной по Modbus через шлюз Modbus RTU - TCP
modbusgw
PHP код:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>TEST MODBUS</title>
</head>
<body>

<?php

require_once dirname(__FILE__) . '/Phpmodbus/ModbusMaster.php'

$modbus = new ModbusMaster("localhost""TCP"); 


// Read multiple registers Fn 3 (ID, addr, registers read)
try {
    
$recData $modbus->readMultipleRegisters(111); 
}
catch (
Exception $e) {

// Print error information if any
//    echo $modbus;
//    echo $e;
    
exit;
}

  echo 
date("H:i:s"); 
  echo 
"<h2>Температура</h2>\n";
  
$tm PhpType::bytes2signedInt($recData) / 100
  
$tmr round($tm,  1);  
  echo 
"<h2> $tmr ºC</h2>";

?>

</body>
</html>
в архивах все необходимое
Вложения
Тип файла: zip modbus_temperature2.zip (74.2 Кб, 396 просмотров)
Тип файла: zip modbusgw.zip (11.2 Кб, 387 просмотров)
Тип файла: zip web.zip (42.0 Кб, 373 просмотров)

Последний раз редактировалось andr128; 14.04.2013 в 10:32.
andr128 вне форума   Ответить с цитированием
Старый 14.04.2013, 12:11   #115
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Буду очень благодарен если кто-то подскажет как делать измерение не постоянно, а через период в 5-10 сек.
Для изменения частоты опроса датчика нужно изменить 750 на требуемое, например
MsTimer2::set(10000, Tizm); //10 сек
Admin вне форума   Ответить с цитированием
Старый 14.04.2013, 16:37   #116
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Это конечно очень просто но думаю так наверно нельзя. 750мс это время по истечении которого происходит выборка измерения при точности в 12 бит. А что будет если выборка будет происходить через 10с после начала измерения? Хотя конечно попробую.

p.s.
Опробовал все работает! Эдуард спасибо все оказалось гораздо проще чем я думал.

Последний раз редактировалось andr128; 15.04.2013 в 06:30.
andr128 вне форума   Ответить с цитированием
Старый 15.04.2013, 07:15   #117
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

После длительной работы вэб страницы (15-20 мин) по опросу датчика шлюз перестает работать. Помагает перезапуск шлюза. В логе вот такая фигня:

Код:
Apr 15 11:46:07 OpenWrt kern.info kernel: [ 1928.410000] TCP: Possible SYN flooding on port 502. Sending cookies.  Check SNMP counters.
andr128 вне форума   Ответить с цитированием
Старый 15.04.2013, 12:05   #118
dmitry123
Member
 
Регистрация: 03.12.2012
Адрес: Ярославль
Сообщений: 53
Вес репутации: 0
dmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant futuredmitry123 has a brilliant future
По умолчанию

У меня тоже были задержки при работе с датчиком DS18B20, заменил на DS18S20, все стало хорошо. Но данный код учту
dmitry123 вне форума   Ответить с цитированием
Старый 15.04.2013, 14:05   #119
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

С датчиком то все OK.
Проблема другого плана.
При постоянном опросе через 10-15 мин шлюз modbusgw перестает отвечать.
Помогает его перезапуск.
В чем проблема понять не могу. Работаю с железным UARTом - /dev/ttyATH0

вот последний лог работы шлюза запущен с параметрами
modbusgw -port /dev/ttyATH0 -baud 19200 -debug -verbose
Код:
...
Started worker 0x7fb02530
Worker thread 0x7fb02530 processing transaction 10044
SEND(fd=5, 8): 0x01 0x03 0x00 0x01 0x00 0x01 0xD5 0xCA
RECV(fd=5, 7):  0x01 0x03 0x02 0x09 0x21 0x7E 0x0C
write(fd=6, 11)
Worker thread 0x7fb02530 shutting down
Started worker 0x7fdcb530
Worker thread 0x7fdcb530 processing transaction 2266
SEND(fd=5, 8): 0x01 0x03 0x00 0x01 0x00 0x01 0xD5 0xCA
RECV(fd=5, 7):  0x01 0x03 0x02 0x09 0x21 0x7E 0x0C
write(fd=6, 11)
Worker thread 0x7fdcb530 shutting down
Started worker 0x7ffcb530
Worker thread 0x7ffcb530 processing transaction 21898
SEND(fd=5, 8): 0x01 0x03 0x00 0x01 0x00 0x01 0xD5 0xCA
RECV(fd=5, 7):  0x01 0x03 0x02 0x09 0x21 0x7E 0x0C
write(fd=6, 11)
Worker thread 0x7ffcb530 shutting down
Started worker 0x7ffcb530
Started worker 0x7ffcb530
Started worker 0x7ffcb530
Waiting for available worker thread <- здесь остановился и всё
В ожидании доступного рабочего потока ?

Пробовал другой шлюз mbusd http://www.cyber-place.ru/showpost.p...7&postcount=53 с железным портом не хочет работать, с PL2303 тоже не хочет, заработал c FTDI и тоже проработав немного отвалился, повторный перезапуск не помог. Только перезагрузка роутера.

Последний раз редактировалось andr128; 15.04.2013 в 14:15.
andr128 вне форума   Ответить с цитированием
Старый 15.04.2013, 16:08   #120
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Проблема видимо с web php. Каждый очередной вызов php вызывает новый поток.
При работе с modbus poll - все работает гладко. Испытывал в течении 2 часов ни каких сбоев нет!!

Последний раз редактировалось andr128; 15.04.2013 в 19:52.
andr128 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 14:01. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика