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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.06.2014, 16:38   #11
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

Между прочим, по аналогии можно попробовать реализовать 1-Wire таким же способом: FT232: Как подружить 1-wire с компом.
Будет время, попробую реализовать аналогичный модуль для 1-Wire.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 10.06.2014, 18:10   #12
lvovitch
Senior Member
 
Регистрация: 14.04.2010
Сообщений: 239
Вес репутации: 0
lvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond reputelvovitch has a reputation beyond repute
По умолчанию Re: CyberWrt модуль "Modbus"

Цитата:
Сообщение от uni Посмотреть сообщение
Обновлён. Версия 0.1.5273.17016.

Добавлена установка пакета coreutils-sleep (~13 Кб). Это пока единственный "дешёвый" способ получить задержку меньше секунды.
а я вот решил поступить не совсем честно, и использую `seq 3000` вместо sleep. Не знаю, насколько это неправильно...
lvovitch вне форума   Ответить с цитированием
Старый 10.06.2014, 22:43   #13
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

Да, я хотел цикл использовать, но такое решение будет зависеть от частоты CPU. У меня в js таймаут задаётся в мсек, поэтому захотелось настоящих мсек.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 11.06.2014, 02:53   #14
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

Обновлён. Версия 0.1.5275.8192.

Класс Modbus немного изменён для поддержки задач. Теперь можно по аналогии с компонентом MBAXP делать несколько запросов одновременно.



Скрипт:
Код:
modbus.OnFailure = function( handle, error ) { 

 $('#console').val( $( '#console').val() + '\nОшибка: ' + error ); 
}

modbus.OnSuccess = function( handle ) {

 $('#console').val( $( '#console').val() + '\nRegister( ' + handle + ', 0 ): ' + modbus.Register( handle, 0 ) );
}

modbus.Serial = {

 Name: '/dev/ttyATH0',
 BaudRate: EnModbusBaudRate.mbBaudRate115200,
 DataBits: EnModbusDataBits.mbDataBits8Bits,
 Parity: EnModbusParity.mbParityNone,
 StopBits: EnModbusStopBits.mbStopBitsOne,
 Timeout: 100
};

// ReadHoldingRegisters( handle, slaveid, address, quantity, updaterate )
// Starting Address: 0x0000 to 0xFFFF.
// Quantity of Inputs: 1 to 125 (0x7D).
modbus.ReadHoldingRegisters( 1, 0, 0, 1, 2000 );
modbus.ReadHoldingRegisters( 2, 0, 1, 1, 1700 );

modbus.UpdateEnable(1);
modbus.UpdateEnable(2);
Добавлены методы:

UpdateEnable( handle );
UpdateDisable( handle );
UpdateOnce( handle );

Изменился формат вызова функций - добавилось два параметра:

ReadHoldingRegisters( handle, slaveid, address, quantity, updaterate );

handle - это номер задачи (не используйте 0, мы его зарезервируем).
updaterate - это период запуска задачи;

Задача - это какой-то запрос, т.е. теперь, чтобы сделать запрос, нужно "оформить" задачу и выполнить одну из функций: UpdateEnable( handle ) или UpdateOnce( handle ).

UpdateOnce( handle ) - выполняет задачу один раз, т.е. запрос посылается устройству 1 раз.

UpdateEnable( handle ) - запускает периодическое выполнение задачи с периодом updaterate. UpdateDisable( handle ) - приостанавливает периодическое выполнение.

Описание работы с этими функциями можно найти в справке к ActiveX компоненту MBAXP. Я сделал интерфейс работы с modbus по аналогии.

Изменился и способ получения данных. Теперь это не свойство Register, а функция Modbus.Register( handle, n ). Т.е. чтобы получить элемент n, нужно указать номер задачи, с которой он связан.

Также добавился параметр handle в обработчики OnSuccess() и OnFailure(), чтобы в теле функции можно было отличать какой запрос обрабатывается.

Проблемы.

На снимке видно, что я указал разные интервалы для задач 1 и 2: 2000 мсек и 1700 мсек. Это сделано для того, чтобы запросы не пересекались по времени. К сожалению, я пока не сделал синхронизации и, если указать одно время, то работа с запросами будет сопровождаться ошибками (наложение запросов друг на друга).

Думаю над этим.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 11.06.2014, 10:54   #15
Central30
Junior Member
 
Регистрация: 16.05.2014
Адрес: Баку
Сообщений: 18
Вес репутации: 0
Central30 is an unknown quantity at this point
По умолчанию Re: CyberWrt модуль "Modbus"

Сегодня повторно подключался к контроллеру.Суть такова:на контроллеры ставлю состояние выхода вручную на единицу,пишу в модуле modbus.WriteSingleCoil( 1, 6, 0),контроллер сбрасывает на ноль 6 регистр,повторно пишу modbus.WriteSingleCoil( 1, 6, 1) Контроллер команду не принимает.В модуле пишется ошибка-3.Отчего такая ошибка?
Central30 вне форума   Ответить с цитированием
Старый 11.06.2014, 11:13   #16
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

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

Нужно будет заменить все файлы на те, которые идут в архиве. Я каждый раз заменяю архив в первом посте. Далее нужно будет изменить формат запроса, так как у функций стало больше параметров.

Сейчас бьюсь над проблемой "одновременных" post запросов, если использовать несколько запускаемых задач одновременно. Никак не получается развести их во времени, то есть заставить запускаться квазипараллельно.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 11.06.2014, 20:09   #17
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

Обновлён. Версия 0.1.5275.39464.



Скрипт чтения с помощью метода ReadCoils():
Код:
modbus.OnFailure = function( handle, error ) { 

    $('#console').val( $( '#console').val() + '\nОшибка: ' + error ); 
}

modbus.OnSuccess = function( handle ) {

    $('#console').val( $( '#console').val() + '\Coil( ' + handle + ', 0-8 ): ' +
        modbus.Coil( handle, 0 ) + ' ' +
        modbus.Coil( handle, 1 ) + ' ' +
        modbus.Coil( handle, 2 ) + ' ' +
        modbus.Coil( handle, 3 ) + ' ' +
        modbus.Coil( handle, 4 ) + ' ' +
        modbus.Coil( handle, 5 ) + ' ' +
        modbus.Coil( handle, 6 ) + ' ' +
        modbus.Coil( handle, 7 ) + '\n'
        );
}

modbus.Serial = {

    Name: '/dev/ttyATH0',
    BaudRate: EnModbusBaudRate.mbBaudRate9600,
    DataBits: EnModbusDataBits.mbDataBits8Bits,
    Parity: EnModbusParity.mbParityNone,
    StopBits: EnModbusStopBits.mbStopBitsOne,
    Timeout: 100
};

// ReadCoils( handle, slaveid, address, quantity, updaterate )
modbus.ReadCoils( 1, 0, 0, 8, 500 );

modbus.DelayBetweenPoll = 200;

modbus.UpdateEnable(1);

setTimeout( function() { modbus.UpdateDisable(1); }, 3000 );
Результат можно наблюдать на картинке выше. Я сделал post запросы синхронными и это позволило уйти от проблем с их перемешиванием. Журнал отладки выглядит для скрипта так:
Код:
2014.06.11 22:01:40 [INFO:20045] ( => ) \x00\x01\x00\x00\x00\x08\x3C\x1D
2014.06.11 22:01:41 [INFO:20045] ( <= ) 0x00-0x01-0x01-0x55-0x90-0x4B-
2014.06.11 22:01:41 [INFO:20084] ( => ) \x00\x01\x00\x00\x00\x08\x3C\x1D
2014.06.11 22:01:41 [INFO:20084] ( <= ) 0x00-0x01-0x01-0x55-0x90-0x4B-
2014.06.11 22:01:41 [INFO:20123] ( => ) \x00\x01\x00\x00\x00\x08\x3C\x1D
2014.06.11 22:01:42 [INFO:20123] ( <= ) 0x00-0x01-0x01-0x55-0x90-0x4B-
2014.06.11 22:01:42 [INFO:20162] ( => ) \x00\x01\x00\x00\x00\x08\x3C\x1D
2014.06.11 22:01:42 [INFO:20162] ( <= ) 0x00-0x01-0x01-0x55-0x90-0x4B-
2014.06.11 22:01:42 [INFO:20201] ( => ) \x00\x01\x00\x00\x00\x08\x3C\x1D
2014.06.11 22:01:43 [INFO:20201] ( <= ) 0x00-0x01-0x01-0x55-0x90-0x4B
Цифры после INFO - это номер процесса, в котором работает shell скрипт при его вызове. Видно, что числа эти идут парами. Это означает, что запросы работают синхронно: каждый следующий ждёт завершения предыдущего.

Метод Coil() аналогичен Register(), только работает с Coils. В скрипте сначала идёт описание задания в виде вызова метода ReadCoils(), затем идёт его запуск UpdateEnable() и остановка с задержкой в 3 секунды.
__________________
Россия навсегда!

Последний раз редактировалось uni; 11.06.2014 в 20:14.
uni вне форума   Ответить с цитированием
Старый 11.06.2014, 21:30   #18
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 43
Сообщений: 573
Вес репутации: 599
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

Вот ещё один скрипт, чтобы показать работу в несколько "квазипотоков":
Код:
modbus.OnFailure = function( handle, error ) { 

    $('#console').val( $( '#console').val() + '\nОшибка: ' + error ); 
}

modbus.OnSuccess = function( handle ) {

    $('#console').val( $( '#console').val() + '\nRegister( ' + handle + ', 0 ): ' + modbus.Register( handle, 0 ) );
}

modbus.Serial = {

    Name: '/dev/ttyATH0',
    BaudRate: EnModbusBaudRate.mbBaudRate9600,
    DataBits: EnModbusDataBits.mbDataBits8Bits,
    Parity: EnModbusParity.mbParityNone,
    StopBits: EnModbusStopBits.mbStopBitsOne,
    Timeout: 100
};

// ReadHoldingRegisters( handle, slaveid, address, quantity, updaterate )
// Starting Address: 0x0000 to 0xFFFF.
// Quantity of Inputs: 1 to 125 (0x7D).

modbus.ReadHoldingRegisters( 1, 0, 0, 1, 1000 );
modbus.ReadHoldingRegisters( 2, 0, 1, 1, 950 );
modbus.ReadHoldingRegisters( 3, 0, 2, 1, 750 );

modbus.DelayBetweenPoll = 200;

modbus.UpdateEnable(1);
modbus.UpdateEnable(2);
modbus.UpdateEnable(3);

setTimeout(

    function() {

        modbus.UpdateDisable(1);
        modbus.UpdateDisable(2);
        modbus.UpdateDisable(3);
        
    }, 5000 );
И журнал лога:
Код:
2014.06.11 23:27:46 [INFO:20991] ( => ) \x00\x03\x00\x02\x00\x01\x24\x1B
2014.06.11 23:27:47 [INFO:20991] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:47 [INFO:21030] ( => ) \x00\x03\x00\x01\x00\x01\xD4\x1B
2014.06.11 23:27:47 [INFO:21030] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:47 [INFO:21069] ( => ) \x00\x03\x00\x00\x00\x01\x85\xDB
2014.06.11 23:27:47 [INFO:21069] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:48 [INFO:21108] ( => ) \x00\x03\x00\x02\x00\x01\x24\x1B
2014.06.11 23:27:48 [INFO:21108] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:48 [INFO:21147] ( => ) \x00\x03\x00\x01\x00\x01\xD4\x1B
2014.06.11 23:27:48 [INFO:21147] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:48 [INFO:21186] ( => ) \x00\x03\x00\x00\x00\x01\x85\xDB
2014.06.11 23:27:49 [INFO:21186] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:49 [INFO:21225] ( => ) \x00\x03\x00\x02\x00\x01\x24\x1B
2014.06.11 23:27:49 [INFO:21225] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:49 [INFO:21264] ( => ) \x00\x03\x00\x01\x00\x01\xD4\x1B
2014.06.11 23:27:50 [INFO:21264] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:50 [INFO:21303] ( => ) \x00\x03\x00\x00\x00\x01\x85\xDB
2014.06.11 23:27:50 [INFO:21303] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:50 [INFO:21342] ( => ) \x00\x03\x00\x02\x00\x01\x24\x1B
2014.06.11 23:27:51 [INFO:21342] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
2014.06.11 23:27:51 [INFO:21381] ( => ) \x00\x03\x00\x01\x00\x01\xD4\x1B
2014.06.11 23:27:51 [INFO:21381] ( <= ) 0x00-0x03-0x02-0x00-0x00-0x85-0x84-
Посылка и приём выполняются одновременно, т.е. shell-скрипт всегда выполняется один, а не несколько, как будет в случае асинхронных запросов.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 11.06.2014, 23:27   #19
Central30
Junior Member
 
Регистрация: 16.05.2014
Адрес: Баку
Сообщений: 18
Вес репутации: 0
Central30 is an unknown quantity at this point
По умолчанию Re: CyberWrt модуль "Modbus"

Вячеслав,вы так добьетесь,что с помощью CyberWRT,или обычного TP-LINK можно составлять SCADA через обычный веб браузер,без какого нибудь OPC сервера.Респект вам.Завтра подключусь еще раз к контроллеру, протестирую все с вашим новым модулем
Central30 вне форума   Ответить с цитированием
Старый 11.06.2014, 23:39   #20
Central30
Junior Member
 
Регистрация: 16.05.2014
Адрес: Баку
Сообщений: 18
Вес репутации: 0
Central30 is an unknown quantity at this point
По умолчанию Re: CyberWrt модуль "Modbus"

Да,и еще Вячеслав,вы просили реально испробовать на промышленном контроллере.Хочу добавить следующее:Контроллер используется CAREL PCOxc,программу залили стандартную,для управления приточно-вытяжным оборудованием.Считыв� �ние внутренних регистров на ура,считывание регистров входов тоже.Температуру считал без ошибок.Считывание состояния выходов тоже без проблем.
Central30 вне форума   Ответить с цитированием
Ответ

Метки
modbus, modbus-rtu, скрипт, модуль


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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


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


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