CAN - BUS über CancardX ansprechen



  • Hallo!

    Ich habe folgendes Problem:

    Ich möchte mit der "CanCardX" von "Vector" auf einen CanBus zugreifen. Dafür muss ich aber die VCan32.dll in mein Projekt einbinden.
    Um dies zu tun, soll man die "loadlib.cpp" in sein Projekt einfügen.

    Ich bekomme aber beim Übersetzen des Programms folgende Fehlermeldung:
    .... loadlib.cpp(23):E2141 Fehler in der Deklarationssyntax
    .... loadlib.cpp(24):E2141 Fehler in der Deklarationssyntax
    (25)...

    Hat jemand schon mal mit so einer PCMCIA - Karte von der Firma "Vector" gearbeitet?

    Gruss,
    lautiba.



  • äh ja, leider wissen wir alle nicht was für Zeilen dennd ie Zeilen 23-25 sind, ne?



  • Sorry!

    Im Grunde nur Deklarationen:

    (Datei: "loadlib.cpp")

    //Glaobale Variablen
    NCDGETCHANNELMASK ncdGetChannelMask; //(Zeile 23)
    NCDOPENPORT ncdOpenPort; //(Zeile 24)
    ...

    Diese Datei sollte ich in mein Projekt einbinden, um die dll nutzen zu können.
    Wenn ich jetzt übersetze, dann erhalte ich diese Fehler in der eingebundenen Datei.

    Gruss,
    lautiba!



  • ich arbeite im Geschäft ständig mit der Karte und hatte noch keine grösseren
    Probleme. Ich hab für die Karte eine Klasse geschrieben, die darf ich aber
    leider nicht weiter geben (war für's Geschäft) Daher mal die ganz einfache
    Variante hier:

    - Füg mal zum testen die Datei "vcand32.lib" zu einem neuen Projekt hinzu
    - include VCanD.h

    static Vstatus InitDriver(void)
    {
      VportHandle gPortHandle      = INVALID_PORTHANDLE;
      Vaccess gChannelMask         = 0;
      Vaccess gPermissionMask      = 0;
      unsigned long gBitRate       = 500000; // Baudrate
      unsigned int gHwType         = HWTYPE_CANCARDX; // CAN Karte
      int gHwChannel      = 0; // CAN Kanal, der verwendet wird
      int gHwIndex        = 0; // Hardwareindex der CAN Karte
    
      Vstatus vErr;
      VsetAcceptance acc;
      enableCANCard = true;
    
      // Open the driver
      vErr = ncdOpenDriver ();
      if (vErr) return vErr;
    
      // Select the channel
      gChannelMask = ncdGetChannelMask(gHwType,gHwIndex,gHwChannel);
      if (!gChannelMask) {
        ShowMessage("ERROR: Channel not found !");
        return VERROR;
      }
    
      // Open a port
      vErr = ncdOpenPort(&gPortHandle,"CANSoftware",gChannelMask,gChannelMask,&gPermissionMask,128);
      if (vErr) goto error;
    
      // If permission to initialize
    
      // Open the acceptance filter for standard ids
      acc.mask = 0; // relevant=1
      acc.code = 0;
      vErr = ncdSetChannelAcceptance(gPortHandle,gChannelMask,&acc);
      if (vErr) goto error;
    
      // Reset the clock
      vErr = ncdResetClock(gPortHandle);
      if (vErr) goto error;
    
      return VSUCCESS;
    
    error:
    
      ShowMessage(ncdGetErrorString(vErr));
    
      if (gPortHandle!=INVALID_PORTHANDLE) {
        ncdClosePort(gPortHandle);
        gPortHandle = INVALID_PORTHANDLE;
      }
    
      return vErr;
    }                                                  // end InitDriver ()
    
    // Close the CAN driver interface
    
    static Vstatus CleanUp(void)
    {
      if (gPortHandle!=INVALID_PORTHANDLE) {
        ncdClosePort(gPortHandle);
        gPortHandle = INVALID_PORTHANDLE;
      }
      ncdCloseDriver();
      return VSUCCESS; // No error handling
    }
    

    wenn ich nichts vergessen habe dann kannst du nun mit:

    // Initialize the CAN driver
        vErr = InitDriver();
        if (vErr) return;
    
        // Go on bus
        vErr = ncdActivateChannel(gPortHandle,gChannelMask);
        if (vErr) return;
    

    die Karte starten und mit:

    Vevent event;
        Vstatus vErr;
        event.tagData.msg.dlc = 5;
        event.tagData.msg.data[0] = 'h';
        event.tagData.msg.data[1] = 'a';
        event.tagData.msg.data[2] = 'l';
        event.tagData.msg.data[3] = 'l';
        event.tagData.msg.data[4] = 'o';
        event.tagData.msg.flags = 0; // damit nie die Wakeup Messages kommen
        vErr=ncdTransmit(gPortHandle, gChannelMask, &pEvent);
    
        if (vErr==VERR_WRONG_PARAMETER) {
            // wenn dieser Fehler auftritt, ist die Karte falsch konfiguriert
            // ...
        } else if (vErr == VERR_QUEUE_IS_FULL) {
            // ...
        } else if (vErr == VERR_PORT_IS_OFFLINE) {
            // ...
        }
    

    eine Botschaft versenden.

    Ich würde dir aber raten, dass ganze nochmal zu überarbeiten. Das ist aus einer
    ganz alten Testsoftware von mir rauskopiert und soll dir nur die ersten
    Schritte zeigen. Um eine robuste Anwendung zu schreiben ist noch mehr
    notwendig.



  • Was steht auf Zeile 22?



  • Hallo!

    Habe noch mal von Anfang an nach der Struktur von "Acidmrp angefangen.
    Bekomme jetzt ab dem Aufruf "vErr = ncdOpenDriver()" einen neuen Fehler:

    [Linker Fehler] Unresolved external 'ncdOpenDriver' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJEKTS\Anwendung\UNIT1.OBJ

    Dieser Fehler tritt bei allen Funktionsaufrufen auf, welche mit dem CAN - Bus zu tun haben.

    ???
    (#include "VCanD.h" hat funktioniert)
    Kann mir da jemand weiterhelfen?

    Gruss,
    lautiba



  • Da gehört doch noch ne LIbrary dazu? (*.lib)

    -junix



  • Hallo!

    Hab das Problem gelöst!
    Die Lib - Datei war wohl beschädigt, habe diese neu kopiert.
    Nun geht es!

    Schönen Dank für eure Mühe!!!

    (Gut zu wissen, dass hier Leute Ahnung von CAN - Bus in Verbindung mit Vector - Karten haben!!!)



  • Hallo Ihr!

    Ein Problem habe ich allerdings noch.

    Ich möchte eine Information auslesen, welche von einem Gerät geschickt wird.

    Nachrichtenname: ACC->Fusion(Header)
    ID(HEX): 300
    Länge: 8Byte
    Zykluszeit: 60ms
    Sender: IDIS-Sensor

    Wie kann man denn genau diese Nachricht auslesen?

    Gruss,
    lautiba



  • die Nachricht wird ja alle 60ms vom Sensor gesendet. Am besten machst du einen
    Timer der alle 30ms aufgerufen wird und pollst die Nachrichten vom Bus.
    Dann vergleichst du in einer auswerte Routine ob die Nachricht auf CAN ID 0x300
    geschickt wurde.

    Zum Aufbau des Timers:

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        Timer1->Enabled = false;
    
        // nun die Nachrichten vom Bus lesen
        // ...
    
        Timer1->Enabled = true;
    }
    

    wenn du wirklich nur diese eine Nachricht empfangen willst, dann kannst
    du mit ncdSetChannelAcceptance auch einen Filter auf diese Nachricht setzen.



  • Hallo!

    Ich meinte eigendlich, wie ich eine Nachricht nur von der Adresse 0x300 einlesen kann, da an dem CAN - BUS noch sehr viele weitere Sensoren angeschlossen sind.

    Habe es aber schon herausgefunden:

    vErr = ncdAddAcceptanceRange(gPortHandle, gPermissionMask, 768, 778);

    Mit diesem Befehl sage ich, dass nur von den Adressen 768 - 778 (in HEX: 300 - 30A) die Nachrichten in meinen Lesepuffer epuffert werden sollen.

    Gruss,
    lautiba


Anmelden zum Antworten