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

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

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

Набор функций для работы по протоколу Modbus-RTU (master).

Исходники на github: modbus

Зависимости: coreutils-sleep.

Описание класса Modbus

Свойства:

Tasks - массив задач.


Методы:

crc16( data ) - вычисление CRC16 табличным способом для массива байт;
Fill( func, data ) - заполнение массивов с данными (используется в обработчике OnReceive());
Post( task ) - post-запрос к скрипту командного интерпретатора;

ReadCoils( handle, slaveid, address, quantity, updaterate );
ReadDiscreteInputs( handle, slaveid, address, quantity, updaterate );
ReadHoldingRegisters( handle, slaveid, address, quantity, updaterate );
ReadInputRegisters( handle, slaveid, address, quantity, updaterate );
WriteSingleCoil( handle, slaveid, address, value, updaterate );
WriteSingleRegister( handle, slaveid, address, value, updaterate );
WriteMultipleRegisters( handle, slaveid, address, values, updaterate );

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

Register( handle, n ) - возвращает uint16 значение регистра n, запрошенного в задаче handle.


События:

OnReceive( task, data ) - функция-обработчик при приёме данных после post-запроса;
OnFailure( handle, error ) - функция-обработчик ошибки при приёме данных;
OnSuccess( handle ) - функция-обработчик в случае успешного приёма данных;
OnTimer( task ) - функция-обработчик таймера.


Особенности:

1. Функцию с параметрами нужно вписывать в верхнее текстовое окно.
2. Настройки порта выполняются путём изменения свойства modbus.Serial. Если в качестве Name используется ttyATH0, то должна быть отключена функция вывода системных сообщений в этот порт. Они мешают нормальной работе.

Работа скриптов проверялась при помощи симулятора: Modbus Slave.

Документацию на протокол Modbus-RTU можно скачать отсюда:
1. Modbus_Application_Protocol_V1_1b3.pdf
2. Modbus_Rus.Doc

RTU фрейм.

В RTU режиме сообщение начинается с интервала тишины равного времени передачи 3.5 символов при данной скорости передачи в сети. Первым полем затем передается адрес устройства.
Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала.
Фрейм сообщения передается непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство заканчивает прием сообщения и следующий байт будет воспринят как начало следующего сообщения.
Таким образом, если новое сообщение начнется раньше 3.5 интервала, принимающее устройство воспримет его как продолжение предыдущего сообщения. В этом случае устанавливается ошибка, так как будет несовпадение контрольных сумм. Типичный фрейм сообщения показан ниже.
Код:
 +-----------+--------+--------+--------+--------+-----------+
 ¦   старт   ¦  адрес ¦функция ¦ данные ¦   CRC  ¦   конец   ¦
 +-----------+--------+--------+--------+--------+-----------+
 ¦T1-T2-T3-T4¦  8 бит ¦  8 бит ¦n x бит ¦ 16 бит ¦T1-T2-T3-T4¦
 +-----------+--------+--------+--------+--------+-----------+
__________________
Россия навсегда!

Последний раз редактировалось uni; 03.12.2014 в 15:27.
uni вне форума   Ответить с цитированием
Старый 09.06.2014, 07:38   #2
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 44
Сообщений: 573
Вес репутации: 600
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

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

Добавлена установка пакета coreutils-sleep (~13 Кб). Это пока единственный "дешёвый" способ получить задержку меньше секунды.

Также переработан исходный код модуля modbus.js.

Что нужно доделать:

- дописать обработку полученных данных (размещение их по массивам Register[], Long[], LongSwap[] и т.д. )
- добавить в класс Modbus настройки последовательного порта и отобразить их в интерфейсе модуля;
- добавить в shell скрипт обработку данных по настройкам порта и времени таймаута ожидания ответа;
- добавить сохранение и загрузку настроек интерфейса;

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

подскажите пожалуйста,каким образом установить ваши файлы?
Central30 вне форума   Ответить с цитированием
Старый 09.06.2014, 21:49   #4
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 44
Сообщений: 573
Вес репутации: 600
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

Когда я доделаю модуль Admin сделает доступным его через web интерфейс CyberWrt. Для ручной установки нужно скопировать файлы в папку /www в определённой последовательности и изменить атрибуты для исполняемых файлов. Это долго объяснять.

П.С. Поскольку появились вопросы о работе по протоколу Modbus-RTU, я добавил ссылку на довольно подробное его описание.
__________________
Россия навсегда!

Последний раз редактировалось uni; 09.06.2014 в 22:51.
uni вне форума   Ответить с цитированием
Старый 09.06.2014, 23:23   #5
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 44
Сообщений: 573
Вес репутации: 600
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

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

Добавлена возможность изменять имя порта, скорость, количество бит данных, таймаут ожидания ответа (мсек): Name, BaudRate, DataBits, Timeout.

Протестировал на симуляторе некоторые скорости. На 115200 полёт нормальный.

Пример скрипта запроса (чтение 10 регистров):
Код:
function Done() {
    $('#console').val( $( '#console').val() + '\nRegister[]: ' + modbus.Register );
}

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

modbus.ReadHoldingRegisters( 0, 0, 10 ).done( Done );
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 10.06.2014, 03:20   #6
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 44
Сообщений: 573
Вес репутации: 600
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

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

Переделан код, реализующий вкладки. До этого он был взят с просторов рунета и выглядел ужасно и малопонятно.

Добавил опцию сохранения запроса. При нажатии на кнопку Сохранить текст запроса сохраняется в файле /www/modules/modbus/func.txt.

Теперь пользователь сам может обрабатывать события в случае успешного приёма данных или в случае ошибки при приёме. Для этого нужно переопределить функции OnSuccess() и OnFailure():
Код:
modbus.OnFailure = function( error ) { 

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

modbus.OnSuccess = function() {

 $('#console').val( $( '#console').val() + '\nRegister[]: ' + modbus.Register );
}

modbus.Serial = {

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

// ReadHoldingRegisters( slaveid, address, quantity )
// Starting Address: 0x0000 to 0xFFFF.
// Quantity of Inputs: 1 to 125 (0x7D).
modbus.ReadHoldingRegisters( 0, 0, 10 );
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 10.06.2014, 11:18   #7
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"

Модуль залил в SmartHome.

Спасибо! Отличный модуль! Большая работа проведена.

Пока еще не посмотрел, но есть вопрос: а расчет CRC на sh или js?
lvovitch вне форума   Ответить с цитированием
Старый 10.06.2014, 12:28   #8
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 44
Сообщений: 573
Вес репутации: 600
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

Расчет crc делается на js, так как в shell скрипте нельзя выполнить такой расчёт из-за того, что нулевые байты, насколько я понял, не могут содержаться в переменных скрипта. В сети можно найти crc для строк в bash, но вот для произвольных бинарных данных я не нашёл.

Я пока думаю ещё как по проще реализовать перестановку байт, чтобы правильно интерпретировать принимаемые данные. Сейчас есть доступ только к 16-битным беззнаковым целым через свойство Register.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Старый 10.06.2014, 12:42   #9
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 Посмотреть сообщение
Расчет crc делается на js, так как в shell скрипте нельзя выполнить такой расчёт из-за того, что нулевые байты, насколько я понял, не могут содержаться в переменных скрипта. В сети можно найти crc для строк в bash, но вот для произвольных бинарных данных я не нашёл.

Я пока думаю ещё как по проще реализовать перестановку байт, чтобы правильно интерпретировать принимаемые данные. Сейчас есть доступ только к 16-битным беззнаковым целым через свойство Register.
на bash я тоже находил расчет, но для более поздних версий. В итоге так же вычисляю crc на java. Но в моем случае команд не много (для опроса счетчика меркурий), поэтому сразу записываю их в файл с crc.
lvovitch вне форума   Ответить с цитированием
Старый 10.06.2014, 13:06   #10
uni
Senior Member
 
Аватар для uni
 
Регистрация: 29.10.2013
Адрес: Екатеринбург, Нижневартовск, Энергодар
Возраст: 44
Сообщений: 573
Вес репутации: 600
uni has a spectacular aura aboutuni has a spectacular aura about
Отправить сообщение для uni с помощью ICQ
По умолчанию Re: CyberWrt модуль "Modbus"

Сделал небольшой пост на хабре с описанием идеи: Modbus-RTU на скриптах.
__________________
Россия навсегда!
uni вне форума   Ответить с цитированием
Ответ

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


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

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

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

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


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


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