1

Тема: Подмена 1 байта в конкретном пакете

Помучаю еще, если позволите:
Задача:
в конкретном пакете ID222  Data: 00 11 22 33 44 55 66 77 заменить D4 на "0х41" (на константу)
Все остальные пакеты от этого ID передать без изменений.

Получилось как то так.... но что то мне подсказывает что это не совсем оптимальный вариант...  хотя он и работает.
Может подскажете как сделать через маску/замену?

Вложений в сообщении

Иконка вложения test_c_1.cfd 4.23 кб, скачивался 128 раз, последний раз 2017-11-20 

2

Re: Подмена 1 байта в конкретном пакете

Вариант решения во вложении: при получении сообщения заданного содержания (все байты равны указанным значениям), заменить байт D4.
Маска+Замена: блок №11 "Побитовое И" с константой 0xFF00 выделяет из регистра D5:D4 байт D5; блок №12 "Побитовое ИЛИ" устанавливает на место байта D4 нужную константу.
Если бы в сообщении с ID=0x222 нужно было постоянно менять значение байта D4 на одну и туже константу, вне зависимости от содержания всего сообщения, то это можно было бы легко сделать через настройки отбора драйвера шлюза (маска отбора/замена отбора).

Вложений в сообщении

Иконка вложения test_c_1a.cfd 4.82 кб, скачивался 142 раз, последний раз 2017-11-20 

3 (20-11-2017 20:00:09 отредактировано ladan)

Re: Подмена 1 байта в конкретном пакете

Угу, блок 7 в моей конкретике лишний, т.к.  отсутствие данных D7:D6 контролируется в D0 (там по протоколу транспорта длинна значащих байт) потому  я его и не учитываю в сравнении

Побитовые И+ИЛИ быстрее чем сдвиги + сложение, оптимальнее, правильно понял? Или разница в 1 такт за счет отсутствия 1 операции?
вариант начала передачи через буфер - нормально?

4

Re: Подмена 1 байта в конкретном пакете

ladan пишет:

Побитовые И+ИЛИ быстрее чем сдвиги + сложение, оптимальнее, правильно понял? Или разница в 1 такт за счет отсутствия 1 операции?

Побитовые операции оптимальнее арифметических. К тому же они используются в соответствии с логикой алгоритма: выделить то что оставить и добавить то чего не хватает. Разница в 1 функциональный блок экономит машинное время сокращая длительность цикла выполнения диаграммы.

ladan пишет:

вариант начала передачи через буфер - нормально?

UPD: Буфер использовать нет необходимости (зачем откладывать отправку на целый цикл выполнения диаграммы?) и это, в данном случае, даже неправильно. Актуальность данных в регистрах приема сообщения CAN гарантируется только при наличии "1" в регистре наличия нового сообщения, т.е. на данном цикле выполнения диаграммы. Если значения регистров принятого сообщения не сохраняются с помощью триггеров для дальнейшей обработки, а перегружаются в регистры отправки напрямую, то следует отправлять сообщение в этом же цикле.
Откорректированный вариант диаграммы во вложении.

Вложений в сообщении

Иконка вложения test_c_1b.cfd 4.44 кб, скачивался 147 раз, последний раз 2017-11-21