![]() |
|
|
#111 |
|
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1606 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Для отладки устройств модбас удобно использовать прогу 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. |
|
|
|
|
|
#112 |
|
Junior Member
Регистрация: 28.01.2013
Сообщений: 23
Вес репутации: 0 ![]() |
Да, что-то я заработался, 502 порт ТСР, хоть ОРС сервер цепляй и скаду.
|
|
|
|
|
|
#113 |
|
Junior Member
Регистрация: 28.01.2013
Сообщений: 23
Вес репутации: 0 ![]() |
Проверил - шлюз работает, рнр скрипт тоже работает на локальном сервере,
получается что проблема в рнр на роутере. |
|
|
|
|
|
#114 |
|
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1606 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
программа для ардуины
Код:
//====== 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> modbusgw PHP код:
Последний раз редактировалось andr128; 14.04.2013 в 10:32. |
|
|
|
|
|
#115 | |
|
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
MsTimer2::set(10000, Tizm); //10 сек |
|
|
|
|
|
|
#116 |
|
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1606 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Это конечно очень просто но думаю так наверно нельзя. 750мс это время по истечении которого происходит выборка измерения при точности в 12 бит. А что будет если выборка будет происходить через 10с после начала измерения? Хотя конечно попробую.
p.s. Опробовал все работает! Эдуард спасибо все оказалось гораздо проще чем я думал. Последний раз редактировалось andr128; 15.04.2013 в 06:30. |
|
|
|
|
|
#117 |
|
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1606 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
После длительной работы вэб страницы (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. |
|
|
|
|
|
#118 |
|
Member
Регистрация: 03.12.2012
Адрес: Ярославль
Сообщений: 53
Вес репутации: 0 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
У меня тоже были задержки при работе с датчиком DS18B20, заменил на DS18S20, все стало хорошо. Но данный код учту
|
|
|
|
|
|
#119 |
|
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1606 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
С датчиком то все 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. |
|
|
|
|
|
#120 |
|
Senior Member
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1606 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Проблема видимо с web php. Каждый очередной вызов php вызывает новый поток.
При работе с modbus poll - все работает гладко. Испытывал в течении 2 часов ни каких сбоев нет!! Последний раз редактировалось andr128; 15.04.2013 в 19:52. |
|
|
|
![]() |
| Здесь присутствуют: 5 (пользователей: 0 , гостей: 5) | |
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|