08.06.2014, 11:43 | #1 |
Senior Member
|
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. |
09.06.2014, 07:38 | #2 |
Senior Member
|
Re: CyberWrt модуль "Modbus"
Обновлён. Версия 0.1.5273.17016.
Добавлена установка пакета coreutils-sleep (~13 Кб). Это пока единственный "дешёвый" способ получить задержку меньше секунды. Также переработан исходный код модуля modbus.js. Что нужно доделать: - дописать обработку полученных данных (размещение их по массивам Register[], Long[], LongSwap[] и т.д. ) - добавить в класс Modbus настройки последовательного порта и отобразить их в интерфейсе модуля; - добавить в shell скрипт обработку данных по настройкам порта и времени таймаута ожидания ответа; - добавить сохранение и загрузку настроек интерфейса; Также можно подумать о реальном применении модуля modbus.js для работы с конкретным устройством.
__________________
Россия навсегда! |
09.06.2014, 20:58 | #3 |
Junior Member
Регистрация: 16.05.2014
Адрес: Баку
Сообщений: 18
Вес репутации: 0 |
Re: CyberWrt модуль "Modbus"
подскажите пожалуйста,каким образом установить ваши файлы?
|
09.06.2014, 21:49 | #4 |
Senior Member
|
Re: CyberWrt модуль "Modbus"
Когда я доделаю модуль Admin сделает доступным его через web интерфейс CyberWrt. Для ручной установки нужно скопировать файлы в папку /www в определённой последовательности и изменить атрибуты для исполняемых файлов. Это долго объяснять.
П.С. Поскольку появились вопросы о работе по протоколу Modbus-RTU, я добавил ссылку на довольно подробное его описание.
__________________
Россия навсегда! Последний раз редактировалось uni; 09.06.2014 в 22:51. |
09.06.2014, 23:23 | #5 |
Senior Member
|
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 );
__________________
Россия навсегда! |
10.06.2014, 03:20 | #6 |
Senior Member
|
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 );
__________________
Россия навсегда! |
10.06.2014, 11:18 | #7 |
Senior Member
Регистрация: 14.04.2010
Сообщений: 239
Вес репутации: 0 |
Re: CyberWrt модуль "Modbus"
Модуль залил в SmartHome.
Спасибо! Отличный модуль! Большая работа проведена. Пока еще не посмотрел, но есть вопрос: а расчет CRC на sh или js? |
10.06.2014, 12:28 | #8 |
Senior Member
|
Re: CyberWrt модуль "Modbus"
Расчет crc делается на js, так как в shell скрипте нельзя выполнить такой расчёт из-за того, что нулевые байты, насколько я понял, не могут содержаться в переменных скрипта. В сети можно найти crc для строк в bash, но вот для произвольных бинарных данных я не нашёл.
Я пока думаю ещё как по проще реализовать перестановку байт, чтобы правильно интерпретировать принимаемые данные. Сейчас есть доступ только к 16-битным беззнаковым целым через свойство Register.
__________________
Россия навсегда! |
10.06.2014, 12:42 | #9 | |
Senior Member
Регистрация: 14.04.2010
Сообщений: 239
Вес репутации: 0 |
Re: CyberWrt модуль "Modbus"
Цитата:
|
|
10.06.2014, 13:06 | #10 |
Senior Member
|
Re: CyberWrt модуль "Modbus"
Сделал небольшой пост на хабре с описанием идеи: Modbus-RTU на скриптах.
__________________
Россия навсегда! |
Метки |
modbus, modbus-rtu, скрипт, модуль |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|