LWPM Comfort Module/Tworzenie akcji: Różnice pomiędzy wersjami
Linia 225: | Linia 225: | ||
:<code>b[0..7] = minuty</code> | :<code>b[0..7] = minuty</code> | ||
:<code>b[8..15] = godziny</code> | :<code>b[8..15] = godziny</code> | ||
+ | |} | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code>23 <lan> <tx> <rx> <sts> <id> <byte></code> | ||
+ | | | ||
+ | <pre>a = b | ||
+ | b = ReadModuleStatus(<id>)</pre> | ||
+ | | | ||
+ | ;ReadModuleStatus: przepisz zawartość rejestru <code>b</code> do rejestru <code>a</code> oraz | ||
+ | :wpisz do rejestru <code>b</code> wybrane 4 bajty z rejestru statusu modułu do <code>b</code> | ||
+ | Parametry: | ||
+ | {| class="wikitable" | ||
+ | ! parametr | ||
+ | ! znaczenie | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code><lan></code> | ||
+ | | | ||
+ | ;szyna CAN na której znajduje się moduł | ||
+ | :<code>00</code> - LSCAN | ||
+ | :<code>01</code> - MSCAN | ||
+ | :<code>02</code> - HSCAN | ||
+ | :<code>03</code> - CHCAN | ||
+ | |||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code><tx></code> | ||
+ | | | ||
+ | ;adres na którym moduł nasłuchuje na CAN | ||
+ | :<code><xxxx></code>, np dla sterownika silnika: <code>07E0</code> | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code><rs></code> | ||
+ | | | ||
+ | ;adres na którym moduł odpowiada na CAN | ||
+ | :<code><xxxx></code>, np dla sterownika silnika: <code>07E8</code> | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code><srs></code> | ||
+ | | | ||
+ | ;adres na którym moduł wysyła statusy na CAN | ||
+ | :<code><xxxx></code>, np dla sterownika silnika: <code>05E8</code> | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code><id></code> | ||
+ | | | ||
+ | ;identyfikator statusu do odczytania | ||
+ | :<code><xx></code>, np <code>03</code> | ||
+ | |- | ||
+ | |style="white-space: nowrap;"|<code><byte></code> | ||
+ | | | ||
+ | ;bajt od którego zostanie wczytana wartość | ||
+ | :<code><xx></code>, np dla odczytanego statusu <code>01 02 03 04 05 06 07</code> wartość <code>02</code> spowoduje wpisanie do <code>a</code> wartości <code>0x03040506</code>. Korzystając z pozostałych instrukcji można dotrzeć do dowolnego bajtu/bitu ze statusu. | ||
|} | |} | ||
|- | |- |
Wersja z 00:11, 16 gru 2020
Moduł daje możliwość wykonania dowolnej akcji.
W tym miejscu opisany jest format akcji oraz możliwości i polecenia jakie mogą być zawarte w akcji.
Wszystkie liczby i wartości są podane w formacie szesnastkowym (HEX).
Spis treści
Format akcji
Ogólny format akcji przedstawia się następująco:
Z tego wynika, że najprostsza akcja, która nic nie robi wygląda następująco:
00 00 00 00 00
Informacje o akcji
Informacje o akcji zawierają bardziej szczegółowe informacje na temat akcji opisujące przede wszystkim sposób wykonania akcji. Przykładowo można tutaj określić szczegółowo warunki uruchomienia akcji, a także w tym miejscu możesz zdefiniować jak mają wykonywać się poszczególne etapy pętli.
Format danych
<informacje o akcji> = <długość informacji> <informacje>*
<długość informacji>
- określa długość wszystkich informacji w bajtach
<informacje>
- to szczegółowy opis zachowania akcji. Takich informacji może być kilka dla każdej akcji, przy czym każda musi być innego typu.
Każda informacja jest zapisana w ten sam sposób:
<informacje> = <typ informacji> <długość danych> <dane>
Pierwszym polem jest <typ informacji>
(1 bajt) następnie podana jest <długość danych>
w bajtach (1 bajt) oraz <dane>
, których format zależy od typu danych.
Informacje o etapach wykonania pętli
<typ informacji> == 01
TODO:
Informacje o warunkach wykonania akcji
<typ informacji> == 02
Ten typ informacji określa szczegółowo, jakie muszą zajść warunki by akcja została uruchomiona.
Format informacji
<dane> = <index> <flagi> <start> <stop> <instrukcja>*
<index>
- miejsce zapisu o aktualnym stanie akcji.
- Dostępne są 4 takie miejsca (
00
-03
). - Każda akcja warunkowa powinna być wykonywana we własnym miejscu (każda powinna mieć inną wartość
<index>
) aby akcje ze sobą nie interferowały. Oczywiście akcje będą działały na tym samym indeksie, jednak może być trudno zapanować nad poprawności warunków. - Możliwe jest także wpisanie wartości
FF
która spowoduje, że wynik obliczeń nie będzie nigdzie zapisywany. - Wartość (
00
-03
) powinna być użyta dla akcji działających jako akcje w tle, natomiast wartośćFF
dla pozostałych akcji.
<flagi>
- flagi zmieniające zachowanie kalkulatora wyliczającego warunek.
- Domyślna wartość to
00
. - Dostępne są następujące flagi:
01
- w przypadku jakiegokolwiek błędu odczytu któregokolwiek parametru pracy modułu, obliczenia zostaną uznane za poprawne - wynik obliczeń będzie prawidłowo, a wiec może dojść do uruchomienia akcji. Domyślnie jakikolwiek błąd w obliczeniach powoduje, że akcja zostanie przerwana lub się nie uruchomi.
<start>
- określa ilość prawidłowych obliczeń jaka jest wymagana by akcja się uruchomiła. W przypadku gdy wartość jest równa
00
- akcja wykona się zawsze (wartość ta w zasadzie nie ma większego sensu)
<stop>
- określa ilość prawidłowych obliczeń jaka jest wymagana by akcja się zakończyła. W przypadku gdy wartość jest równa
00
- akcja zakończy się zawsze (wartość ta w zasadzie nie ma większego sensu)
<instrukcja>*
- ciąg instrukcji dla kalkulatora
Zasada działania kalkulatora
Obliczenia warunku są wykonywane na zasadzie zbliżonej do kalkulatora działającego na zasadzie RPN (odwrócona polska notacja). Tj: najpierw podajemy argumenty instrukcji, następnie operacje jaką chcemy na tych argumentach wykonać. Wynikiem kalkulatora jest wartość 0
jeśli warunek jest niespełniony, lub wartość różna od 0
jeśli warunek jest prawdziwy i kalkulator możesz przejść do uruchomienia akcji (po określonej ilości poprawnych obliczeń).
Kalkulator posiada następujące rejestry:
a
- rejestr 32-bitowy (liczba ze znakiem)b
- rejestr 32-bitowy (liczba ze znakiem)save[x]
- 4 elementowa tablica 32-bitowych liczb ze znakiem. Do tymczasowego przechowywania danych. Na tych liczbach nie można wykonywać bezpośrednio operacji - należy je najpierw przenieść do rejestrówa
lubb
.
Dostępne instrukcje
W kalkulatorze dostępnych jest szereg instrukcji które są wykorzystywane do wykonywania obliczeń. W poniższej tabeli jest zestawienie tych instrukcji.
Instrukcja | Operacja | Opis | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operacje ładowania stałych wartości (liczb) | ||||||||||||||||
00
|
a = b b = 0 |
| ||||||||||||||
01
|
a = b b = 1 |
| ||||||||||||||
02
|
a = b b = -1 |
| ||||||||||||||
03 <xx>
|
a = b b = <xx> |
| ||||||||||||||
04 <xx>
|
a = b b = <xx> |
| ||||||||||||||
05 <xxxx>
|
a = b b = <xxxx> |
| ||||||||||||||
06 <xxxx>
|
a = b b = <xxxx> |
| ||||||||||||||
07 <xxxxxxxx>
|
a = b b = <xxxxxxxx> |
| ||||||||||||||
10 <nn>
|
save[<nn>] = a |
| ||||||||||||||
11 <nn>
|
save[<nn>] = b |
| ||||||||||||||
14 <nn>
|
a = save[<nn>] |
| ||||||||||||||
15 <nn>
|
b = save[<nn>] |
| ||||||||||||||
operacje ładowania parametru pracy silnika (modułu) | ||||||||||||||||
20 <nn>
|
a = b b = ReadSTD(<nn>) |
Dostępne wartości to:
| ||||||||||||||
21 <nn>
|
a = b b = ReadOBD2(<nn>) |
Dostępne wartości to:
| ||||||||||||||
22 <nn>
|
a = b b = ReadECUInfo(<nn>) |
Dostępne wartości to:
| ||||||||||||||
23 <lan> <tx> <rx> <sts> <id> <byte>
|
a = b b = ReadModuleStatus(<id>) |
Parametry:
| ||||||||||||||
operacje konwersji danych | ||||||||||||||||
30
|
b = SignExtend8(b) |
| ||||||||||||||
31
|
b = ZeroExtend8(b) |
| ||||||||||||||
32
|
b = SignExtend16(b) |
| ||||||||||||||
33
|
b = ZeroExtend16(b) |
| ||||||||||||||
34
|
b = SignExtend1(b) |
| ||||||||||||||
operacje arytmetyczne | ||||||||||||||||
40
|
<tmp> = a a = b b = <tmp> |
| ||||||||||||||
41
|
b = b + a |
| ||||||||||||||
42
|
b = b - a |
| ||||||||||||||
43
|
b = b * a |
| ||||||||||||||
44
|
b = b / a |
| ||||||||||||||
45
|
b = b % a |
| ||||||||||||||
46
|
b = -b |
| ||||||||||||||
47
|
b = b << a |
| ||||||||||||||
48
|
b = b >> a |
| ||||||||||||||
operacje bitowe | ||||||||||||||||
50
|
b = b & a |
| ||||||||||||||
51
|
b = b | a |
| ||||||||||||||
52
|
b = b ^ a |
| ||||||||||||||
53
|
b = ~b |
| ||||||||||||||
operacje logiczne | ||||||||||||||||
60
|
if a <> 0 and b <> 0: b = 1 else: b = 0 |
| ||||||||||||||
61
|
if a <> 0 or b <> 0: b = 1 else: b = 0 |
| ||||||||||||||
62
|
if a <> 0 xor b <> 0: b = 1 else: b = 0 |
| ||||||||||||||
63
|
if b <> 0: b = 1 else: b = 0 |
| ||||||||||||||
instrukcje porównujące dane | ||||||||||||||||
F0
|
if b == 0: b = 1 else: b = 0 |
| ||||||||||||||
F1
|
if b <> 0: b = 1 else: b = 0 |
| ||||||||||||||
F2
|
if b < 0: b = 1 else: b = 0 |
| ||||||||||||||
F3
|
if b <= 0: b = 1 else: b = 0 |
| ||||||||||||||
F4
|
if b > 0: b = 1 else: b = 0 |
| ||||||||||||||
F5
|
if b >= 0: b = 1 else: b = 0 |
| ||||||||||||||
koniec obliczeń | ||||||||||||||||
FD
|
if b <> 0: return 1 |
| ||||||||||||||
FE
|
if b == 0: return 0 |
| ||||||||||||||
FF
|
return b |
|