====== SMI Telegramme ======
[[https://www.mikrocontroller.net/topic/273846?goto=4406802#3252156|Mikrokontroller.net Beitrag]]\\
Die Telegramme können unterschiedlich lang sein und haben folgenden Aufbau
==== Adresse: ====
^ Bit ^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 ^
^ Bemerk. | Typ ||| Adressetyp | ID ||||
^ Wert | 22 | 21 | 20 | 20 | 23 | 22 | 21 | 20 | \\
* **Typ**
* 1: Diagnose \\
* 2: Fahrbefehl\\
* 3: Positionsabfrage\\
* **Adresstyp**
* 0: Hersteller ID
* 1: Motor ID \\
^ ID ^ Hersteller ^
^ 0 | Alle |
^ 1 | Alcatel |
^ 2 | Becker |
^ 3 | ELERO |
^ 4 | SELVE |
^ 5 | Stele |
^ 6 | Vestamatic | \\
==== Adresserweiterung ====
* Wenn nur bestimmte Hersteller oder mehrere Motoren gleichzeitig angesprochen werden sollen. Das erste Byte wird dann der Hersteller gesendet\\
^ Bit ^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 ^
^ Byte1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
^ Byte2: Motor ID | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 |
^ Byte3: Motor ID | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |\\
* **Beispiel:** Motor 16,5 und 2:\\
* 0xC0 0x80 0x12
==== ID setzen ====
* Motoren werden immmer mit ID=0 ausgeliefert. Nach der Motorsuche werden die IDs von 15 herunter bis 1 vergeben Über Diese ID können die Motoren am SMI-Bus angesprochen werden. Wenn schon alle IDs bis 1 vergeben wurden behält der letzte Motor die ID 0. Über diese ID können an jedem SMI-Bus also 16 Motoren angesprochen werden.\\
^ Bit ^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 ^
^ Byte1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
^ Byte2: Motor ID | | | | | 23 | 22 | 21 | 20 |
* **Beispiel:** ID zurücksetzen \\
* 0x3C 0x00
==== Befehl: ====
^ Bit ^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ^ 1 ^ 0 ^
^ Bemerk. | Erweiterung | Datenbytes || ??? | ??? | Befehl |||
^ Wert | 20 | 21 | 20 | | | 22 | 21 | 20 | \\
* ** Erweiterung **
* 0: keine weiteren Daten
* 1: weitere Daten (Tuchstraffung 6°: 0x22 0x06???)
* **Befehl**
* 0: Stop
* 1: Hoch
* 2: Runter
* 3: Positon1
* 4: Position2
* 5: Position anfahren
* **Datenbytes**
* 1: Relative Position (0x00-0xff | 0-512° )
* Winkel Hoch (8Bit Winkel [°])\\
* Winkel Runter (8Bit Winkel [°])\\
* 2: Genaue Positionen (0x0000-0xffff | 0-100%)
* Position1 speichern (16Bit Position [%])\\
* Position2 speichern (16Bit Position [%])\\
* Position anfahren (16Bit Position [%])\\
==== Prüfsumme: ====
Es werden alle Bytes addiert. Aus der Summe wird das Zweierkomplement gebildet (Negieren und +1)\\
**Beispiel:** Motor 12 Hoch (0x5C 0x01):
**Addition:**\\
0x5C + 0x01 = 0x5D \\
**1er Komplement:**\\
! 0x5D = 0A2 \\
0xA2 + 1 = 0xA3 \\
**Ergebnis:**\\
0x5C 0x01 0xA3
==== Antwort: ====
* Die **Antwort** besteht aus mindestens einem bis fünf Byte(s) (Diagnose mit Motor ID)
* Bestätigung | ACK (0xff)
* Negative Bestätigung | NACK (0xE0?)
==== Beispiele ====
Motor 12 Hoch: > 5C 01 A3 < FF
Motor 12 100° Hoch: > 5C 21 64 1F < FF
Motor 12 Pos 50%: > 5C 45 7F FF E1 < FF
Diagnose alle Herst: > 20 00 < E0
Diagnose Motor 1: > 31 00 CF < FF FF FF E0 FF (alle stehen)
Diagnose Motor 1: > 31 00 CF < FF E0 FF FF FF (mind. 1 Motor läuft (ja, 1 nach AUF)
Diagnose Motor 1: > 31 00 CF < FF FF E0 FF FF (mind. 1 Motor läuft (ja, 1 nach AB)
Motor Suchlauf:
Suchlauf 1: > 24 7D ID ID ID ID XX < FE FE FE C0 C0 (mind. 1 Seriennummer passt, Motor mit ID vorhanden)
Suchlauf 1: > 24 7D ID ID ID ID XX < FE FE FE C0 FF (mind. 1 Seriennummer passt. kein Motor mit ID vorhanden)
Suchlauf 1: > 24 7D ID ID ID ID XX < FF E0 FF FF FF (mind. 1 Seriennummer ist kleiner)
Suchlauf 1: > 24 7D ID ID ID ID XX < FF FF E0 FF FF (mind. 1 Seriennummer ist größer)
Motor blockieren?
Motor 9 Hoch: > 59 00 A7 < 7F 56 80 FA (Motor blockiert?)
Motor 12 Hoch: > 5C 00 A4 < FF AE 00 A4 (Motor blockiert?)
Motor 13 Runter: > 5D 02 A1 < FF 57 81 E8 (Motor blockiert?)