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