Перейти к содержанию

Навигация

Modbus-client/en: различия между версиями

Новая страница: «More detailed description of the request and response data structure can be found on the Modbus Protocol page.»
(Новая страница: «An example of '''improper''' use: <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a0x00 -t0x06 -r0x80</syntaxhighlight> It does…»)
(Новая страница: «More detailed description of the request and response data structure can be found on the Modbus Protocol page.»)
 
(не показано 14 промежуточных версий этого же участника)
Строка 90: Строка 90:


----
----
2. Проверка: читаем содержимое регистра 0x80 (теперь уже с устройства с адресом 0x02) с помощью функции 0x03 (Read Holding Registers). Заметим, что в устройствах Wiren Board функции 0x03 и 0x04 взаимозаменяемы и приводят к одному и тому же результату.
2. Check: read the contents of the register 0x80 (now from the device with the address 0x02) using the function 0x03 (Read Holding Registers). Note that in Wiren Board devices, the functions 0x03 and 0x04 are interchangeable and lead to the same result.


  <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a2 -t0x03 -r0x80</syntaxhighlight>     
  <syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a2 -t0x03 -r0x80</syntaxhighlight>     
Строка 102: Строка 102:


----
----
3. Прочтем регистры релейного модуля WB-MR14 с адресом 0x01, содержащие сигнатуру устройства, WBMR14. Известно, что сигнатура хранится по адресу 200 и занимает 6 регистров.
3. Read the registers of the relay module WB-MR14 with address 0x01, containing the signature of the device, WBMR14. It is known that the signature is stored at 200 and occupies 6 registers.


<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x03 -r200 -c 6</syntaxhighlight>
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x03 -r200 -c 6</syntaxhighlight>
Строка 113: Строка 113:
         Data: 0x0057 0x0042 0x004d 0x0052 0x0031 0x0034 </syntaxhighlight>
         Data: 0x0057 0x0042 0x004d 0x0052 0x0031 0x0034 </syntaxhighlight>


В ответе мы получили 6 16-битных значений, в каждом из которых содержится код одного ASCII-символа. Преобразуем их, заменив начальные '''0x00''' на '''/x''' и удалив пробелы, к виду \x57 и т.д., который понятен команде echo, и выведем на экран получившееся:
In the answer we received 6 16-bit values, each of which contains the code of one ASCII-character. Convert them, replacing the initial '''0x00''' with '''/x''' and removing spaces, to the form \x57, etc, which is understandable to the echo command, and display the resulting:
<syntaxhighlight lang="bash">echo  -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 \
<syntaxhighlight lang="bash">echo  -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 \
-a1 -t0x03 -r200 -c 6 | \
-a1 -t0x03 -r200 -c 6 | \
grep Data | sed -e 's/0x00/\\\x/g' -e 's/Data://' -e 's/\s//g'`| xxd -r -p </syntaxhighlight>
grep Data | sed -e 's/0x00/\\\x/g' -e 's/Data://' -e 's/\s//g'`| xxd -r -p </syntaxhighlight>
Ответ:
Answer:
<syntaxhighlight lang="bash">WBMR14</syntaxhighlight>
<syntaxhighlight lang="bash">WBMR14</syntaxhighlight>


В старых версиях прошивки <syntaxhighlight lang="bash">| xxd -r -p</syntaxhighlight> не было нужно.
In older firmware versions <syntaxhighlight lang="bash">| xxd -r -p</syntaxhighlight> wasn't necessary




----
----
4. Определим текущий адрес устройства, подключенного к Wiren Board. Адрес нам неизвестен и мы не хотим его менять.
4. Determine the current address of the device connected to the Wiren Board. The address is unknown to us and we do not want to change it. To do this, at the command line, run a cyclic command to poll the register of 0x80 devices with addresses from 1 to 247:
Для этого в командной строке выполним циклическую команду опроса регистра 0x80 устройств с адресами с 1 по 247:
<syntaxhighlight lang="bash">root@wirenboard:~# for i in {1..247}; do modbus_client -mrtu /dev/ttyAPP1 --debug -a$i -t3 -r0x80 -s2 -pnone; done 2>/dev/null | grep Data: </syntaxhighlight>
<syntaxhighlight lang="bash">root@wirenboard:~# for i in {1..247}; do modbus_client -mrtu /dev/ttyAPP1 --debug -a$i -t3 -r0x80 -s2 -pnone; done 2>/dev/null | grep Data: </syntaxhighlight>
Ответ:      
Answer      
<syntaxhighlight lang="bash">        Data: 0x0072</syntaxhighlight>
<syntaxhighlight lang="bash">        Data: 0x0072</syntaxhighlight>
Результат: адрес подключенного устройства — 0x0072, то есть 114. Перебор всех адресов от 1 до 247 занимает чуть больше 2 минут.
Result: the address of the connected device is 0x0072, i.e. 114. It takes a little more than 2 minutes to search all addresses from 1 to 247.


----
----
5. На модуле WB-MR14 включим реле с номером 6 (адреса регистрв флагов начинаются с нуля, помним об этом!). Используем для этого команду 0x05 (Write Single Coil):
5.5. Let's turn on relay 6 on WB-MR14 relay module(addresses of flags registers start from zero, remember that!). Use the command 0x05 (Write Single Coil):
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x05 -r0x05 0x01</syntaxhighlight>
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x05 -r0x05 0x01</syntaxhighlight>
Ответ:
Answer:
<syntaxhighlight lang="bash">Data to write: 0x1
<syntaxhighlight lang="bash">Data to write: 0x1
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
Строка 142: Строка 141:
SUCCESS: written 1 elements!</syntaxhighlight>
SUCCESS: written 1 elements!</syntaxhighlight>


Обратите внимание, утилита modbus_client при записи заменила 1 на 0x00FF, поскольку именно это значение служит для включения реле. Любое ненулевое значение будет заменено на 0x00FF, поэкспериментируйте.
Note that the modbus_client utility replaced 1 with 0x00FF when recording, because this value is used to turn on the relay. Any nonzero value is changed to 0x00FF, give it a try.


----
----
6. Включим все нечетные реле и выключим все четные. Для этого используем функцию 15 (Write Multiple Coils). В модуле всего 14 реле, так что мы должны передать значения для 14 регистров с 0 по 13.
6. Turn on all the odd relays and turn off all the even ones. To do this, use the function 15 (Write Multiple Coils). There are only 14 relays in the module, so we have to pass values for 14 registers from 0 to 13.


<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x0f -r0x00 -c 14 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000</syntaxhighlight>
<syntaxhighlight lang="bash">modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a1 -t0x0f -r0x00 -c 14 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000 0x00FF 0x0000</syntaxhighlight>
Ответ:
Answer:
<syntaxhighlight lang="bash">Data to write: 0xff 0x00 0xff 0x00 0xff 0x00 0xff 0x00 0xff 0x00 0xff 0x00 0xff 0x00  
<syntaxhighlight lang="bash">Data to write: 0xff 0x00 0xff 0x00 0xff 0x00 0xff 0x00 0xff 0x00 0xff 0x00 0xff 0x00  
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
Строка 157: Строка 156:




Обратите внимание на структуру данных запроса:
Note the structure of the query data:


*[01] — адрес
*[01] — address
*[0F] — код функции Write Multiple Coils
*[0F] — write Multiple Coils function code
*[00][00] — адрес первого регистра флагов для записи
*[00][00] — address of the first flag register to be recorded
*[00][0E] — количество элементов для записи (14)
*[00][0E] — number of items to record (14)
*[02] — количество байт данных (14 бит помещаются в 2 байтах)
*[02] — number of data bytes (14 bits are placed in 2 bytes)
*[55][15] — 01010101 00010101 (первое реле — младший бит первого байта, 8 реле — старший бит первого байта, 9 реле — младший бит второго байта)
*[55][15] — 01010101 00010101 (the first relay is the lowest bit of the first byte, 8th relay is the highest bit of the first byte, 9th relay is the lowest bit of the second byte)
*[1A][97] — CRC16
*[1A][97] — CRC16


А так же на структуру ответа:
As well as note the structure of the answer:


*<01> — адрес
*<01> — address
*<0F> — код функции Write Multiple Coils
*<0F> — write Multiple Coils function code
*<00><00> — адрес первого регистра флагов для записи
*<00><00> — address of the first flag register to be recorded
*<00><0E> — количество записанных регистров флагов
*<00><0E> — number of recorded flag registers
*<D4><0F> — CRC16
*<D4><0F> — CRC16


Подробнее описание структуры данных запросов и ответов можно найти на странице [[Special:MyLanguage/Протокол Modbus|Протокол Modbus]].
More detailed description of the request and response data structure can be found on the [[Протокол Modbus/en|Modbus Protocol]] page.
12 063

правки