:Revision=16
:html
<<
128.160
CAN-Objekt|CAN
$NoSort
--
Das IP-Objekt CAN ...
>>

<<
128.160.1
Kodierung eines CAN Frames|CAN Frame
--
<h4>Normaler Frame</h4>
(kein RTR-Frame)
<!STBL>
<!+><b>Index</b><!><b>Inhalt / Wert</b><!>
<!c>1<!>Frame-ID   (0..2<sup>29</sup>-1)<!>
<!c>2<!>Typ 0=normaler Frame<!>
<!c>3<br>..<br>10<!>0 bis 8 Datenbytes<br>soweit vorhanden<br>(0..255)<!>
<!ETBL>

Lnge des Vektors : 2..10, abhngig von der Anzahl der Datenbytes (0..8)

Der Inhalt des <!SW>DLC (DataLengthCode) des Can-Frames ergibt sich aus der Anzahl der Datenbytes und wird automatisch berechnet.

Soll der Frame mit 29-bit ID versendet werden, kann die ID mit $80000000 verodert werden. Dies geschieht bei IDs >2047 automatisch intern.

<h4>RTR-Frame</h4>
<!STBL>
<!+>Index<!+>Inhalt / Wert<!>
<!c>1<!>Frame-ID   (0..2<sup>29</sup>-1)<!>
<!c>2<!>Typ 1=RTR-Frame<!>
<!c>3<!>DLC (0..8)<!>
<!ETBL>

Der Inhalt des <!SW>DLC (DataLengthCode) des Can-Frames muss angegeben werden, da ein RTR-Frame keine Datenbytes enthlt.

Soll der Frame mit 29-bit ID versendet werden, kann die ID mit $80000000 verodert werden. Dies geschieht bei IDs >2047 automatisch intern.

<h4>Error-Frame</h4>
<!STBL>
<!+>Index<!+>Inhalt / Wert<!>
<!c>1<!>Frame-ID   (0..2<sup>29</sup>-1)<!>
<!c>2<!>Typ 2=ErrorFrame<!>
<!c>3<!>Flags<!>
<!c>4<br>..<br>11<!>0 bis 8 Datenbytes<br>soweit vorhanden<br>(0..255)<!>
<!ETBL>

Bekannte Error-Flags, der Dokumentation von Vector entnommen:
<!STBL>
<!>$01<!>Msg is a bus error<!>
<!>$02<!>Msgs following this has been lost<!>
<!>$04<!>NERR active during this msg<!>
<!>$08<!>Msg rcv'd in wakeup mode<!>
<!>$10<!>Msg is a remote frame<br><!REM>wird nicht als ErrorFrame, sondern als RemoteFrame zurckgeliefert<!TXT><!>
<!>$20<!>Reserved for future usage<!>
<!>$40<!>TX acknowledge<!>
<!>$80<!>TX request<!>
<!ETBL>

Ein Error-Frame kann nur empfangen, jedoch nicht geschickt werden.
>>

<<
128.160.2
Funktionen des CAN-Objekts|Funktionen
--
>>
<<
128.160.2.1
CAN.Error|Error
!128.160.4
--
<!DEF>
function <!TW>CAN.Error (sName : string) : real;
<!TXT>
Liefert das Ergebnis der letzten Aktion auf dem CAN-Channel <!PW>sName.
>>
<<
128.160.2.2
CAN.Received|Received
--
<!DEF>
function <!TW>CAN.Received (sName : string [; rID : real [; var rTimeStamp : real]) : vector;
<!TXT>
Versucht, einen Frame aus dem Empfangspuffer des CAN-Channels <!PW>sName zu holen.

Ist <!PW>rID nicht angegeben oder -1, so wird der nchsten Frame, ungeachtet desen ID geholt.

Wenn <!PW>rID angegeben ist, dann wird der nchste Frames mit dieser ID geholt, andere Frames bleiben aber im Puffer. Wenn kein (passender) Frame vorhanden ist, dann ist der Vektor leer.

Ist <!PW>rTimeStamp angegeben, so wird in dieser Variable der Zeitstempel des Empfanges des Frames zurckgegeben.
>>
<<
128.160.2.3
CAN.IsActive|IsActive
--
<!DEF>
function <!TW>CAN.IsActive : real;
<!TXT>
Liefert <!RW>TRUE, wenn CAN global aktiviert ist.

<!DEF>
function <!TW>CAN.IsActive (sName : string) : real;
<!TXT>
Liefert <!RW>TRUE, wenn CAN global aktiviert und der CAN-Channel <!PW>sName auch aktiv ist.
>>
<<
128.160.2.4
CAN.IsOpen|IsOpen
--
<!DEF>
function <!TW>CAN.IsOpen (sName : string) : real;
<!TXT>
Liefert <!RW>TRUE, wenn der CAN-Channel <!PW>sName geffnet ist.
>>
<<
128.160.2.5
CAN.Check|Check
!128.160.1
--
<!DEF>
function <!TW>CAN.Check (vFrame, vTest : vector [; rMode : real]) : real;
<!TXT>
Vergleicht den Frame im Vektor <!PW>vFrame mit dem Frame im Vektor <!PW>vTest.

 <!PW>vFrame darf nur Werte 0..255 enthalten (die Bytes des Frames), Ausnahme bildet die ID, sie darf Werte 0..2<sup>29</sup>-1 enthalten.

 <!PW>vTest darf Werte im Bereich -1..255 enthalten, Ausnahme bildet die ID, sie darf Werte -1..2<sup>29</sup>-1 enthalten. -1=Don't care

 <!PW>rMode legt das Verhalten bei bezglich der Lngen fest,
<!STBL>
<!+>rMode<!+>Verhalten<!>
<!c>0<!>Lnge muss identisch sein (default)<!>
<!c>1<!><!PW>vFrame darf krzer als <!PW>vTest sein<!>
<!c>2<!><!PW>vFrame darf lnger als <!PW>vTest sein,<br>kein Test der 'berstehenden' Bytes<!>
<!c>3<!><!PW>vFrame darf lnger oder krzer sein<!>
<!ETBL>

Rckgabe: 0 = alles okay, sonst die Position in <!PW>vFrame, die von <!PW>vTest abweicht.
>>
<<
128.160.2.6
CAN.FrameAvailable|FrameAvailable
--
<!DEF>
function <!TW>CAN.FrameAvailable (sName : string [; rID : real]) : real;
<!TXT>
Liefert die Anzahl der Frames, die im Empfangspuffer des CAN-Channels <!PW>sName stehen. 

Wenn <!PW>rID angegeben ist, dann werden nur solche Frames gezhlt, welche diesen Identifier haben.
>>
<<
128.160.2.7
CAN.HexToFrame|HexToFrame
!128.160.2.9
--
<!DEF>
function <!TW>CAN.HexToFrame (sHexFrame : string) : vector;
<!TXT>
Wandelt den im String <!PW>sHexFrame kodierten CAN-Frame in einen Vector um, der z.B. mit <!RW>CAN.Send abgeschickt werden kann. <!RW>CAN.HexToFrame arbeitet hnlich wie die interne Funktion <!RW>HexToBVect, jedoch wird als erster Wert in <!PW>sHexFrame ein Can-Identifier angenommen, der 4 Byte gro sein darf, whrend <!RW>HexToBVect immer nur 1-Byte Werte erwartet. D.h. sind die ersten 8 Zeichen in <!PW>sHexFrame gltige Hex-Ziffern, so werden sie komplett in einen Wert (den spteren Identifier) umgewandelt. Soll der Identifier mit weniger Zeichen dargestellt werden, so muss ein Trennzeichen (' ', ',' ...) zwischen Identifier und RTR-Flag eingesetzt werden.

Beispiele:
<!CODE>
sHexFrame           ergibt  vFrame
'1FFFFFFF 0 0A 0B 0C' ->    [536870912, 0, 10, 11, 12]
'1FF 0 0A0B0C'        ->    [511, 0, 10, 11, 12]
'01FF 00 0A 0B 0C'    ->    [511, 0, 10, 11, 12]
'01FF000A0B0C'        ->    [511, 0, 10, 11, 12]
'1FF00A0B0C'          ->    [535824907, 12]     !! Fehler in RTR und keine Daten !!
<!TXT>

Anwendung:
<!CODE>
PARAMETER  
  psTriggerFrame : (10, string, 'CAN-Triggerframe (HEX)', '');
:
STEP
:
  Can.Send ('CAN-B', Can.HexToFrame (psTriggerFrame));
:
END.
<!TXT>

Vorschlag zur Notation eines CAN-Frames im Parameterfeld der Datenbank:
<!CODE>
'III R 1122334455667788'
 ||| | ||            ++-Datenbyte 8
 ||| | ++-Datenbyte 1
 ||| +-RTR-Bit
 +++-Identifier
<!TXT>

Ein Frame maximaler Lnge (8 Datenbyte) passt so in 23 Zeichen und kann mit <!RW>CAN.HexToFrame gewandelt werden.
>>
<<
128.160.2.8
CAN.Cyclic.Get|Cyclic.Get
--
<!DEF>
function <!TW>CAN.Cyclic.Get (sName : string; rID :real [; var rInterval : real]) : vector;
<!TXT>
Liefert den Frame, der auf der CAN-Schnittstelle <!PW>sName unter der ID <!PW>rID zyklisch gesendet wird, bzw. [], wenn kein solcher Frame existiert.

Wird <!PW>rInterval angegeben, so wird das Intervall in ms dort abgelegt.  Existiert kein Frame, so wird der Wert der Variablen nicht gendert.
>>
<<
128.160.2.9
CAN.FrameToHex|FrameToHex
!128.160.2.7
--
<!DEF>
function <!TW>CAN.FrameToHex (vVectorDecimalFrame : vector) : string;
<!TXT>
Wandelt den CAN kodierten Frame (Zahlen Vector) <!PW>vVectorDecimalFrame in einen Hex-String um. Wobei ein leerer String oder ein '!' im String einen Fehler im CAN-Frame anzeigt.
<!TXT>

Siehe Funktion <!PW>HexToFrame.
>>
<<
128.160.3
Prozeduren des CAN-Objekts|Prozeduren
--
>>
<<
128.160.3.1
CAN.Open|Open
--
<!DEF>
procedure <!TW>CAN.Open (sName : string);
<!TXT>
ffnet den CAN-Channel <!PW>sName.
>>
<<
128.160.3.2
CAN.Close|Close
--
<!DEF>
procedure <!TW>CAN.Close (sName : string);
<!TXT>
Schliet den CAN-Channel <!PW>sName.
>>
<<
128.160.3.3
CAN.Filter|Filter
--
<!DEF>
procedure <!TW>CAN.Filter (sName : string; rCode, rMask : real [; rAs29Bit : real]);
<!TXT>
Setzt den Empfangsfilter des CAN-Channels <!PW>sName auf den Acceptance-Code <!PW>rCode und die Acceptance-Mask <!PW>rMask. (beide 0..2<sup>29</sup>-1)

Ist <!PW>rAs29Bit nicht angegeben oder <!RW>FALSE, so wird anhand der Lnge der Maske und des Codes entschieden, ob der Filter fr die 11Bit Nachrichten oder die 29Bit Nachrichten gesetzt wird.

Ist <!PW>rAs29Bit mit <!RW>TRUE angegeben, so wird der Filter fr die 29Bit Nachrichten gesetzt wird.
>>
<<
128.160.3.4
CAN.Send|Send
!128.160.1
--
<!DEF>
procedure <!TW>CAN.Send (sName : string; vFrame : vector);
<!TXT>
Sendet den Frame im Vektor <!PW>vFrame auf den CAN-Channel <!PW>sName. 
>>
<<
128.160.3.5
CAN.Cyclic.Send|Cyclic.Send
--
<!DEF>
procedure <!TW>CAN.Cyclic.Send (sName : string; vFrame : vector; rInterval : real);
<!TXT>
Trgt den Frame im Vektor <!PW>vFrame in die Liste der zyklisch verschickten Frames des CAN-Channels <!PW>sName ein.

Pro Identifier wird immer nur ein Frame in die Liste eingetragen. Ein neuen Frame mit demselben Identifier ersetzt den alten.
>>
<<
128.160.3.6
CAN.Cyclic.Off|Cyclic.Off
--
<!DEF>
procedure <!TW>CAN.Cyclic.Off;
<!TXT>
Lscht alle zyklisch verschickten Frames aus den Listen aller CAN-Channels.

<!DEF>
procedure <!TW>CAN.Cyclic.Off (sName : string);
<!TXT>
Lscht alle zyklisch verschickten Frames aus der Listen des CAN-Channels <!PW>sName.

<!DEF>
procedure <!TW>CAN.Cyclic.Off (sName : string; rID : real);
<!TXT>
Lscht den Frame mit dem Identifier <!PW>rID aus der Liste der zyklisch verschickten Frames auf dem CAN-Channel <!PW>sName.
>>
<<
128.160.3.7
CAN.ClearInBuffer|ClearInBuffer
--
<!DEF>
procedure <!TW>CAN.ClearInBuffer (sName : string);
<!TXT>
Lscht alle Frames im Empfangspuffer des CAN-Channels <!PW>sName.
>>
<<
128.160.3.8
CAN.Reset|Reset
--
<!DEF>
procedure <!TW>CAN.Reset [(rUnloadDLL : real)];
<!TXT>
Wirkt auf das CAN-System etwa so, als ob der Reset-Knopf im Hauptfenster gedrckt wurde.

Es werden nicht nur der (die) CAN-Controller zurckgesetzt, sondern alle internen Datenstrukturen, die mit den CAN-Schnittstellen in Verbindung stehen, werden abgebaut, gelscht und mit den Werten aus der Grundeinstellung neu initialisiert.

Insbesondere sind:
<ol inden=18>
<li>alle CAN-Channel geschlossen</li>
<li>Sende-/Empfangspuffer gelscht</li>
<li>die Listen der zyklischen Frames gelscht</li>
<li>die Werte der Grundeinstellungen gesetzt</li>
</ol>

Wird <!PW>rUnloadDLL mit TRUE angegeben, so wird auch die Treiber DLL entladen und neu geladen.
CAN.Reset ohne Parameter hat dieselbe Wirkung wie <!PW>rUnloadDLL = FALSE.
>>

<<
128.160.3.9
CAN.Transceiver|Transceiver
--
<!DEF>
procedure <!TW>CAN.Transceiver (sName : string; rTransceiver, rLineMode, rResNet : real);
<!TXT>
Whlt den Transceiver und den Modus fr den CAN-Channel <!PW>sName.

Die folgenden Werte stammen aus der Treiberbibliothek der CanCardX

<!STBL>
<tr bgcolor=#e0e0e0><td colspan=3><b>rTransceiver : Transceivertyp</b><!>
<tr bgcolor=#e0e0e0 align=center><td><b>Wert</b><!><b>Transceiver</b><!><b>Anmerkung</b><!>
<!c>0<!>TRANSCEIVER_TYPE_NONE</td><td rowspan=5><pre> </pre><!>
<!c>1<!>TRANSCEIVER_TYPE_251<!>
<!c>2<!>TRANSCEIVER_TYPE_252<!>
<!c>3<!>TRANSCEIVER_TYPE_DNOPTO<!>
<!c>4<!>TRANSCEIVER_TYPE_W210<!>
<!c>5<!>TRANSCEIVER_TYPE_SWC_PROTO<!>Prototype. Driver may latch-up.<!>
<!c>6<!>TRANSCEIVER_TYPE_SWC</td><td rowspan=5><pre> </pre><!>
<!c>7<!>TRANSCEIVER_TYPE_EVA<!>
<!c>8<!>TRANSCEIVER_TYPE_FIBER<!>
<!c>9<!>TRANSCEIVER_TYPE_K251<!>
<!c>10<!>TRANSCEIVER_TYPE_K<!>
<!c>11<!>TRANSCEIVER_TYPE_1054_OPTO<!>1054 with optical isolation<!>
<!c>12<!>TRANSCEIVER_TYPE_SWC_OPTO<!>SWC with optical isolation<!>
<!c>13<!>TRANSCEIVER_TYPE_B10011S<!>B10011S truck-and-trailer<!>
<!c>14<!>TRANSCEIVER_TYPE_1050<!>1050<!>
<!c>15<!>TRANSCEIVER_TYPE_1050_OPTO<!>1050 with optical isolation<!>
<!ETBL>

<!STBL>
<tr bgcolor=#e0e0e0><td colspan=3><b>rLineMode</b><!>
<tr bgcolor=#e0e0e0 align=center><td><b>Wert</b><!><b>Line-Mode</b><!><b>Anmerkung</b><!>
<!c>0<!>TRANSCEIVER_TYPE_NONE</td><td rowspan=5><pre> </pre><!>
<!c>0<!>TRANSCEIVER_LINEMODE_NA<!>
<!c>1<!>TRANSCEIVER_LINEMODE_TWO_LINE<!>
<!c>2<!>TRANSCEIVER_LINEMODE_CAN_H<!>
<!c>3<!>TRANSCEIVER_LINEMODE_CAN_L<!>
<!c>4<!>TRANSCEIVER_LINEMODE_SWC_SLEEP<!>SWC Sleep Mode.<!>
<!c>5<!>TRANSCEIVER_LINEMODE_SWC_NORMAL<!>SWC Normal Mode.<!>
<!c>6<!>TRANSCEIVER_LINEMODE_SWC_FAST<!>SWC High-Speed Mode.<!>
<!c>7<!>TRANSCEIVER_LINEMODE_SWC_WAKEUP<!>SWC Wakeup Mode.<!>
<!c>8<!>TRANSCEIVER_LINEMODE_SLEEP</td><td rowspan=2><pre> </pre><!>
<!c>9<!>TRANSCEIVER_LINEMODE_NORMAL<!>
<!c>10<!>TRANSCEIVER_LINEMODE_STDBY<!>Standby for those who support it<!>
<!c>11<!>TRANSCEIVER_LINEMODE_TT_CAN_H<!>truck & trailer: operating mode single wire using CAN high<!>
<!c>12<!>TRANSCEIVER_LINEMODE_TT_CAN_L<!>truck & trailer: operating mode single wire using CAN low<!>
<!ETBL>


<!STBL>
<tr bgcolor=#e0e0e0><td colspan=3><b>rResNet</b><!>
<tr bgcolor=#e0e0e0 align=center><td><b>Wert</b><!><b>?</b><!>
<!c>0<!>TRANSCEIVER_RESNET_NA<!>
<!c>1<!>TRANSCEIVER_RESNET_MASTER<!>
<!c>2<!>TRANSCEIVER_RESNET_MASTER_STBY<!>
<!c>3<!>TRANSCEIVER_RESNET_SLAVE<!>
<!ETBL>

Der Wert fr <!PW>rTransceiver sollte mit dem installierten Transceiver-CAB bereinstimmen!
Nicht alle Kommbinationen von Transceiver, LineMode und ResNet sind gltig!
>>

<<
128.160.3.10
CAN.Setup|Setup
--
<!DEF>
procedure <!TW>CAN.Setup (sName : string; rBaudRate, rSJW, rTSeg1, rTSeg2, rSAM : real);
<!TXT>
Setzt die Parameter der CAN Verbindung

 <!PW>rBaudRate : Baudrate (1..1000000 Bd)

 <!PW>rSJW : Synchronisation Jump Width (1..4)

 <!PW>rTSeg1 : Lnge Timing Segment 1 (1..16)

 <!PW>rTSeg2 : Lnge Timing Segment 2 (1..8)

 <!PW>rSAM : Anzahl Sampling Punkte (1 oder 3)

Fr alle Parameter knnen folgende Sonderwerte angegeben werden:
-1 : belsst den Wert auf seinem derzeitigen Zustand
-2 : nimmt den Wert aus der Grundeinstellung

<!REM>
Achtung:
nicht jede Kobination von Baudrate und Timing kann auch eingestellt werden. Zur Sicherheit CAN-Bit-Rechner (Grundeinstellung) benutzen.
<!TXT>

<!CODE>
// nur Baudrate ndern
CAN.Setup (sName, 83333, -1, -1, -1, -1);

// Grundeinstellunegn reaktivieren
CAN.Setup (sName, -2, -2, -2, -2, -2);
<!TXT>
>>

<<
128.160.4
Fehlercodes des CAN-Objekts|Fehlercodes
--
<!STBL>
<!+>Code<!+>Bedeutung<!>
<!c>1<!>Frame-ID   (0..2<sup>29</sup>-1)<!>
<!c>0<!>Okay, kein Fehler<!>
<!c>1<!>Channel ist nicht offen<!>
<!c>2<!>Ausnahmefehler (Exception)<!>
<!c>3<!>Timeout<!>
<!c>4<!>Event kann nicht erzeugt werden<!>
<!c>5<!>Event kann nicht gesetzt werden<!>
<!c>6<!>Thread kann nicht erzeugt werden<!>
<!c>7<!>Channel kann nicht geffnet werden<!>
<!c>8<!>Channel kann nicht aktiviert werden<!>
<!c>9<!>Parameter knnen nicht gesetzt werden<!>
<!c>10<!>Filter kann nicht gesetzt werden<!>
<!c>11<!>Modus kann nicht gesetzt werden<!>
<!c>12<!>Sendefehler<!>
<!c>13<!>Empfangspuffer leer<!>
<!c>14<!>Port kann nicht geffnet werden<!>
<!c>15<!>Port ist nicht offen<!>
<!c>16<!>Fehler beim Laden der DLL<!>
<!c>17<!>DLL nicht geladen (CAN inaktiv?)<!>
<!ETBL>
>>
