Страница 1 из 1

Таблица состояний Byte

Добавлено: 18 июн 2022, 20:31
ggen4ik
Не силён в программировании, поэтому прошу помощи тут.
Нужен блок по типу таблица состояний, только с типом данных byte.
Опишу для понимания.
Есть блок чтения can-шины, на выходе которого выдаются значения типа byte.
Хочется, чтобы в блоке можно было задать количество выходов и к каждому выходу условие на срабатывание.
Т.е. если пришло сообщение в can-шине b1=55 b2=4 b3=6 ... b7=1, то выод Q1 ативен на один цикл программы.
Или может кто подскажет, как это реализовать проще?
Сейчас делаю через кучу блоков сравнений + блок AND.

Таблица состояний Byte

Добавлено: 18 июн 2022, 23:43
ecoins
ggen4ik писал(а): 18 июн 2022, 20:31 Есть блок чтения can-шины, на выходе которого выдаются значения типа byte.
Может выложите пример с используемым блоком? Тогда проще будет Вам помочь.
Возможно это окажется полезным для широкого практического использования.

Таблица состояний Byte

Добавлено: 19 июн 2022, 09:07
Aviacode
Если делать блоками, то можно вот так:

Входящие байты конвертировать блоком в char, а затем, записывать в стек массива.
Блоком "Сумма элементов массива" считывать значение этого массива, на выходе будет строка.
Строки сравнивать с уже известными значениями (которые заранее конечно перевести в char) .
Итого без сравнения всего три блока.

Таблица состояний Byte

Добавлено: 19 июн 2022, 11:13
ggen4ik
CAN.JPG.jpg
Сейчас вот так. Грубо говоря, есть несколько устройств, которе общаются по can-шине. С помощью логического анализатора посмотрел, какие сообщения они отправляют, например, в случае нажатия кнопки ПЛЕЙ/СТОП.
Т.е. в моём примере:
Нажали на стороннем устройстве ПЛЕЙ, в кан-шину прилетело сообщение 100_5_56_4_1_0_0_0_0_0 (Code_Size_d0_d1_d2_d3_d4_d5_d6_d7)
Я сравниваю важную для меня часть сообщения (Code и d0 d1 d2) и если совпадает, то включаю выход Д3 (хотя вообще то нужно сравнивать всё сообщение, мало ли что может приететь в кан шине, но это просто для примера).
Если прилетает сообщение 100_5_56_4_0_0_0_0_0_0 (при нажатии СТОП), то выход Д3 отключается.

Конкретно в моём случае выход Code можно не сравнивать, так как это адрес устройства, на котором нажали кнопку ПЛЕЙ, нужно лишь знать что ПЛЕЙ был нажат.

Отправлено спустя 20 минут 1 секунду:
Aviacode писал(а): 19 июн 2022, 09:07 Если делать блоками, то можно вот так:

Входящие байты конвертировать блоком в char, а затем, записывать в стек массива.
Блоком "Сумма элементов массива" считывать значение этого массива, на выходе будет строка.
Строки сравнивать с уже известными значениями (которые заранее конечно перевести в char) .
Итого без сравнения всего три блока.
На самом деле тут будет ещё больше блоков. К каждому выходу блок конвертации (9 блоков), потом к каждому блоку конвертации блок добавления в стек (Кстати насколько они правильно будут записываться в стек, сообщение же прилетает всё разом?). И потом всё равно куча блоков сравнения строк.
В моём примере 2 сообщения анализируются, а если их будет 20 или значительно больше...
Но как вариант обязательно попробоую сделать с массивом, может это будет удобнее.

Таблица состояний Byte

Добавлено: 19 июн 2022, 11:18
ecoins
ggen4ik писал(а): 19 июн 2022, 11:13 Сейчас вот так. Грубо говоря, есть несколько устройств, которе общаются по can-шине. С помощью логического анализатора посмотрел, какие сообщения они отправляют, например, в случае нажатия кнопки ПЛЕЙ/СТОП.
Спасибо за пример.
Нужно будет развернуть стенд под CAN и попробовать. Возможно что-то предложим.
Но это попозже, сейчас запланированы другие задачи.

Таблица состояний Byte

Добавлено: 19 июн 2022, 19:17
Aviacode
Вот так я это видел:

Таблица состояний Byte

Добавлено: 20 июн 2022, 16:12
Dryundel
ggen4ik писал(а): 18 июн 2022, 20:31 Нужен блок по типу таблица состояний, только с типом данных byte.
[ref]ggen4ik[/ref], вот попробуй.
Слепил на скорую руку CAN компаратор. Может не слишком логичное название, ну уж не обессудь.
Шилда чтения CAN шины у меня нет. Так что не тестировал, но должно работать.
В пакете два блока, один основной - подключается к блоку "Чтение шины CAN" (использовать один раз)
И блоки сравнения присылаемых пакетов. Каждый из них настраивается на свой пакет и выдает импульс в один цикл при совпадении принятого пакета. Количество этих блоков по потребности.
Байт размера пакета (Size) не используется.
1.jpg
CAN компаратор ТЕСТ.flp
Тестируй.

Таблица состояний Byte

Добавлено: 20 июн 2022, 20:26
ggen4ik
Dryundel писал(а): 20 июн 2022, 16:12
ggen4ik писал(а): 18 июн 2022, 20:31 Нужен блок по типу таблица состояний, только с типом данных byte.
[ref]ggen4ik[/ref], вот попробуй.
Слепил на скорую руку CAN компаратор. Может не слишком логичное название, ну уж не обессудь.
Шилда чтения CAN шины у меня нет. Так что не тестировал, но должно работать.
В пакете два блока, один основной - подключается к блоку "Чтение шины CAN" (использовать один раз)
И блоки сравнения присылаемых пакетов. Каждый из них настраивается на свой пакет и выдает импульс в один цикл при совпадении принятого пакета. Количество этих блоков по потребности.
Байт размера пакета (Size) не используется.
1.jpg
CAN компаратор ТЕСТ.flp
Тестируй.
Супер, то что нужно. Всё работает :smile9: