10.06.2014, 16:38 | #11 |
Senior Member
|
Re: CyberWrt модуль "Modbus"
Между прочим, по аналогии можно попробовать реализовать 1-Wire таким же способом: FT232: Как подружить 1-wire с компом.
Будет время, попробую реализовать аналогичный модуль для 1-Wire.
__________________
Россия навсегда! |
10.06.2014, 18:10 | #12 |
Senior Member
Регистрация: 14.04.2010
Сообщений: 239
Вес репутации: 0 |
Re: CyberWrt модуль "Modbus"
а я вот решил поступить не совсем честно, и использую `seq 3000` вместо sleep. Не знаю, насколько это неправильно...
|
10.06.2014, 22:43 | #13 |
Senior Member
|
Re: CyberWrt модуль "Modbus"
Да, я хотел цикл использовать, но такое решение будет зависеть от частоты CPU. У меня в js таймаут задаётся в мсек, поэтому захотелось настоящих мсек.
__________________
Россия навсегда! |
11.06.2014, 02:53 | #14 |
Senior Member
|
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 мсек. Это сделано для того, чтобы запросы не пересекались по времени. К сожалению, я пока не сделал синхронизации и, если указать одно время, то работа с запросами будет сопровождаться ошибками (наложение запросов друг на друга). Думаю над этим.
__________________
Россия навсегда! |
11.06.2014, 10:54 | #15 |
Junior Member
Регистрация: 16.05.2014
Адрес: Баку
Сообщений: 18
Вес репутации: 0 |
Re: CyberWrt модуль "Modbus"
Сегодня повторно подключался к контроллеру.Суть такова:на контроллеры ставлю состояние выхода вручную на единицу,пишу в модуле modbus.WriteSingleCoil( 1, 6, 0),контроллер сбрасывает на ноль 6 регистр,повторно пишу modbus.WriteSingleCoil( 1, 6, 1) Контроллер команду не принимает.В модуле пишется ошибка-3.Отчего такая ошибка?
|
11.06.2014, 11:13 | #16 |
Senior Member
|
Re: CyberWrt модуль "Modbus"
Я подправлю и выложу код. Там будет вкладка с логом, где можно будет посмотреть взаимодействие на уровне отправляемых и принимаемых массивов байт.
Нужно будет заменить все файлы на те, которые идут в архиве. Я каждый раз заменяю архив в первом посте. Далее нужно будет изменить формат запроса, так как у функций стало больше параметров. Сейчас бьюсь над проблемой "одновременных" post запросов, если использовать несколько запускаемых задач одновременно. Никак не получается развести их во времени, то есть заставить запускаться квазипараллельно.
__________________
Россия навсегда! |
11.06.2014, 20:09 | #17 |
Senior Member
|
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 ); Код:
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 Метод Coil() аналогичен Register(), только работает с Coils. В скрипте сначала идёт описание задания в виде вызова метода ReadCoils(), затем идёт его запуск UpdateEnable() и остановка с задержкой в 3 секунды.
__________________
Россия навсегда! Последний раз редактировалось uni; 11.06.2014 в 20:14. |
11.06.2014, 21:30 | #18 |
Senior Member
|
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-
__________________
Россия навсегда! |
11.06.2014, 23:27 | #19 |
Junior Member
Регистрация: 16.05.2014
Адрес: Баку
Сообщений: 18
Вес репутации: 0 |
Re: CyberWrt модуль "Modbus"
Вячеслав,вы так добьетесь,что с помощью CyberWRT,или обычного TP-LINK можно составлять SCADA через обычный веб браузер,без какого нибудь OPC сервера.Респект вам.Завтра подключусь еще раз к контроллеру, протестирую все с вашим новым модулем
|
11.06.2014, 23:39 | #20 |
Junior Member
Регистрация: 16.05.2014
Адрес: Баку
Сообщений: 18
Вес репутации: 0 |
Re: CyberWrt модуль "Modbus"
Да,и еще Вячеслав,вы просили реально испробовать на промышленном контроллере.Хочу добавить следующее:Контроллер используется CAREL PCOxc,программу залили стандартную,для управления приточно-вытяжным оборудованием.Считыв� �ние внутренних регистров на ура,считывание регистров входов тоже.Температуру считал без ошибок.Считывание состояния выходов тоже без проблем.
|
Метки |
modbus, modbus-rtu, скрипт, модуль |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|