Редактирование ИК-сигнала в оперативной памяти

Здравствуйте. Подскажите, пожалуйста, как можно редактировать сигнал в оперативной памяти для ИК приемопередатчика WB-MIR. Вот здесь описано редактирование сигнала в постоянной памяти:

http://contactless.ru/wiki/index.php/WB-MSx_Consumer_IR_Manual

Редактирование сигнала в оперативной памяти описано не очень подробно и сходу изменить сигнал просто изменением регистров хранения 2000 не получилось. Как именно можно произвести редактирование сигнала в оперативной памяти ИК-приемопередатчика?

Добрый день!

На первый взгляд, вы всё делаете правильно. Напишите, пожалуйста, подробнее, что значит

v-chist, добрый день!

Алгоритм вы, как я догадываюсь, поняли. Временный буфер начинается с регистра 2000, а регистры имеют тип HOLDIND – это вы учли? как я полагаю.
wb-mqtt-serial – остановлен?
service wb-mqtt-serial stop

Для начала редактирования нужна команда modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a2 -t0x05 -r 5001 1 (подразумеваем modbus-адрес 2 у устройства -a2)

Затем направляем пульт в отверстие ИК-приемника модуля, нажимаем кнопку.

В целях тестирования я написал небольшую программку, которая выводит содержимое оперативно буфера WB-MIR (при отключенном wb-mqtt-serial ):

#!/usr/bin/perl
 use 5.010;

 $port = '/dev/ttyAPP1';
 $modbusaddr = 2;

  foreach $i (2000, 2125, 2250, 2375) {
 $command = qq (echo `modbus_client --debug -mrtu -pnone -s2 $port -a $modbusaddr -t0x03 -r$i -c 125 |      grep Data | sed -e 's/Data://' -e 's/s//g'`);
 $a.=`$command`;
}
$command2 = qq (echo `modbus_client --debug -mrtu -pnone -s2 $port -a $modbusaddr -t0x03 -r2500 -c 9 | grep Data | sed -e 's/Data://' -e 's/s//g'`);
 $a.=`$command2`;

 $a=~s/\n/ /g;
 @a=split(' ',$a);
 @dec = map hex, @a;
 $b= join (' ',@dec);

 say  $b;

Может, с ней вам будет легче разобраться в проблеме?

А версия прошивки какая?
echo -e `modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a2 -t0x03 -r250 -c 19 | grep Data | sed -e 's/0x00/\x/g' -e 's/Data://' -e 's/s//g'`| xxd -r -p && echo ''

Да, есть один нюанс, не отраженный в документации (как раз переписываю ее):
до тех пор пока вы не запишете 0 после всех манипуляций с оперативным буфером в регистр 5001
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a2 -t0x05 -r 5001 0,
то, как и в случае с редактированием ROM-команд, воспроизведение из ROM будет невозможно.

Спасибо большое за ответ! Вопрос был немного не в этом. Хочется сделать вот что: записать сигнал в оперативную память не путем считывания сигнала с пульта, а путем редактирования сигнала в оперативной памяти.

Вот что написано на wiki по поводу редактирования сигнала:

Чтобы отредактировать сигнал под номером i или записать его по Modbus (без пульта ДУ), запишите 1 в регистр флага по адресу 5200 + i. После этого сигнал в виде последовательности натуральных чисел (смотрите #Технические детали) будет записан в подряд идущие регистры хранения, начиная с регистра 2000. В конце последовательности будут два подряд идущих регистра хранения, содержащих 0. Если сигнал под номером i не был записан ранее, в регистрах хранения 2000 и 2001 будут находиться 0. Для внесения изменений в последовательность (в том числе для записи команды по Modbus) нужно записать правильную последовательность в данные регистры хранения с помощью команд WRITE_SINGLE_REGISTER и WRITE_MULTI_REGISTERS. В конце изменённой последовательности всё также должен быть маркер конца последовательности - два подряд идущих регистра хранения, содержащих 0. Чтобы удалить сигнал, запишите в первые два регистра хранения (2000 и 2001) 0. После окончания редактирования запишите 0 в регистр флагов по адресу 5200 + i. До тех пор, пока в регистре флагов по адресу 5200 + i не будет стоять 0, не будут доступны никакие другие операции, в том числе и над другими сигналами.

Но мне нужно не совсем это. Мне не нужно редактировать сигнал из постоянной памяти - нужно редактировать непосредственно сигнал в оперативной памяти. Верно ли, что это можно сделать выполнив только вот эту часть операций (без записи 0, 1 по адресу 5200+i):

Для внесения изменений в последовательность (в том числе для записи команды по Modbus) нужно записать правильную последовательность в данные регистры хранения с помощью команд WRITE_SINGLE_REGISTER и WRITE_MULTI_REGISTERS. В конце изменённой последовательности всё также должен быть маркер конца последовательности - два подряд идущих регистра хранения, содержащих 0. Чтобы удалить сигнал, запишите в первые два регистра хранения (2000 и 2001) 0

?

P.S. Версию прошивки могу чуть позже написать, если это важно

Добрый день!

Я понимаю, что вы хотите: просто редактировать оперативный буфер.
Так редактируйте же его скорее! :slight_smile: :

(Для начала останавливаем wb-mqtt-serial)

Запишем, например, в первую ячейку (холдинг-регистр 2000) буфера значение 0x310:
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a 2 -t0x06 -r2000 0x310

Data to write: 0x310
Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[02][06][07][D0][03][10][88][48]
Waiting for a confirmation...
<02><06><07><D0><03><10><88><48>
SUCCESS: written 1 elements!

Сразу после этого прочтем, 0x310 на месте:
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a 2 -t0x03 -r2000

И вот оно, на месте:

Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[02][03][07][D0][00][01][84][B4]
Waiting for a confirmation...
<02><03><02><03><10><FD><78>
SUCCESS: read 1 of elements:
        Data: 0x0310 

Если нужно записать несколько регистров подряд, то:
modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a 2 -t0x10 -r2000 -c 10 0x310 0x311 0x312 0x313 0x314 0x315 0x316 0x317 0x318 0x319

Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[02][10][07][D0][00][0A][14][03][10][03][11][03][12][03][13][03][14][03][15][03][16][03][17][03][18][03][19][C0][40]
Waiting for a confirmation...
<02><10><07><D0><00><0A><40><B0>
SUCCESS: written 10 elements!

Прочтем:

modbus_client --debug -mrtu -pnone -s2 /dev/ttyAPP1 -a 2 -t0x03 -r2000 -c 10

Opening /dev/ttyAPP1 at 9600 bauds (N, 8, 2)
[02][03][07][D0][00][0A][C5][73]
Waiting for a confirmation...
<02><03><14><03><10><03><11><03><12><03><13><03><14><03><15><03><16><03><17><03><18><03><19><74><39>
SUCCESS: read 10 of elements:
        Data: 0x0310 0x0311 0x0312 0x0313 0x0314 0x0315 0x0316 0x0317 0x0318 0x0319 

А у вас что-то не получается?

А если не секрет, для чего вы хотите редактировать оперативный буфер просто так?

Спасибо большое за подробный ответ! Проверю, если что-то не получится - задам более конкретный вопрос. Редактирование необходимо для воспроизведения сигнала из базы данных ИК команд. Сигнал из базы нужно записать в оперативную память и воспроизвести.