Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Kommunikation zwischen Matlab und TwinCAT

  1. #1
    Registriert seit
    04.07.2009
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    weiß jemand, ob eine Möglichkeit besteht, mit der man aus Matlab heraus auf Variablen in TwinCAT zuzugreifen kann?

    z.B. Ich schliesse Beckhoff E-Bus Klemmen an einen PC an und möchte diese I/Os in Matlab für eine Reglerentwicklung nutzen.


    mfg
    Stefan Moser
    Zitieren Zitieren Kommunikation zwischen Matlab und TwinCAT  

  2. #2
    Registriert seit
    17.10.2010
    Beiträge
    22
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Stefan

    Ob du die Werte dirket in Matlab einfügen kannst weiss ich nicht. Ich habe das mit dem TwinCat Scope gemacht. Mit diesem Programm kannst du die Variablen für eine bestimmte Zeit aufzeichnen und dann als *.dat Datei speichern. Das dat-File wird dann einfach in Matlab eingefügt und weiterverarbeitet.

    Gruss
    Simon

  3. #3
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    Hast du schon versucht die TcAdsDll in Matlab einzubinden?

    Code:
    addpath 'C:\TwinCAT\ADS Api\TcAdsDll\Include'
    addpath 'C:\TwinCAT\ADS Api\TcAdsDll'
    loadlibrary 'TcAdsDll.dll' 'TcAdsAPI.h' addheader 'TcAdsDef.h'
    calllib('TcAdsDll', 'AdsPortOpen')
    Weiter müsste man den C-Quellcode aus den Beispielen ins m-Code portieren. Das könnte funktionieren.

    Gruß
    witkatz

  4. #4
    stefanm80 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.07.2009
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    an die TcAdsDll habe ich auch gedacht. HAbe damit aber bisher noch nicht gearbeitet, so dass ich mich da erst einmal einlesen muss. Wenn ich nächste Woche mal Zeit habe, werde ich mal einen Versuch starten.

    Gruß
    Stefan

  5. #5
    Registriert seit
    08.12.2012
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    hi witkatz:
    do you have demo m file about communication with the Twincat using ADS. if have, can you send it to me? thanks, my mail is luguojun007@gmail.com,
    i call the dll, use the read value function, always back the error 1793, i don't know where is the problem.

    Best regards,
    guojun

  6. #6
    Registriert seit
    21.06.2012
    Beiträge
    115
    Danke
    29
    Erhielt 6 Danke für 5 Beiträge

    Standard

    Also ich würd das ganze über MEX-Files (siehe z.B. http://cnx.org/content/m12348/latest/) für Matlab lösen.
    Dort kannst du den Zugriff auf die C++ ADS Library kapseln ...

    Ich hab das mal so für den Zugriff von Matlab aus auf eine unserer Bildverarbeitungseinheiten per CAN gemacht.
    Somit konnte ich von Matlab aus bequem auf die Bildverarbeitungseinheiten zugreifen.

  7. #7
    Registriert seit
    08.12.2012
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    hello witkatz:
    my code:
    Code:
    nLocalDllVersion=calllib('TcAdsDll','AdsGetDllVersion');nPort=calllib('TcAdsDll','AdsPortOpen')
    i call the upper function in MATLAB, back the right Build,Revision and Version number, the nPort number also back OK; but when i used the function of 'AdsSyncReadReq', also back Error number 1793, i guess i write the wrong AMSNETID and port number;
    if my AMSNETID is '169.254.158.205.1.1' and port number is '801' could you which is the right way to write the M file;
    follow is the code my wrote for NETID
    Code:
    nPort=calllib('TcAdsDll','AdsPortOpen');
    
    NetId=[169,254,158,205,1,1];
    pNetId=Libpointer('voidPtr',NetId);
    
    
    port=801;
    AMSNetID=[pNetId,port]
    pAMSNetId=Libpointer('voidPtr',AMSNetID);

    Really thanks for your coming support!

  8. #8
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Beitrag

    Error Code 1793 means "Service is not supported by server". The ADS Service is selected by the AdsIndexGroup, so I suppose that a wrong IndexGroup is passed to AdsSyncReadReq. You can lookup the return codes in infosys: "http://infosys.beckhoff.com/content/1033/tcadscommon/html/ads_returncodes.htm?id=11763"
    I don't have any Matlab, so I cannot check your code, sorry...
    But I have recently compiled a Win32 Dll to access TwinCAT from Scilab by ADS. Here is the Code, maybe also useful for Matlab users:
    Code:
    #include <windows.h>
    #include <string.h>
    #include <tcAdsDef.h>
    #include <TcAdsApi.h>
    
    extern "C" _declspec(dllexport) void sciAdsReadDouble(const char* PlcVariableName, double* Value, long* TcErr);
    extern "C" _declspec(dllexport) void sciAdsWriteDouble(const char* PlcVariableName, double* Value, long* TcErr);
    
    void sciAdsReadDouble(const char* PlcVariableName, double* Value, long* TcErr)
    {
        AmsAddr            TcAddr;
        PAmsAddr        pTcAddr = &TcAddr;
        unsigned long    TcHdl;
    
        *TcErr = AdsGetLocalAddress(pTcAddr);
        if(*TcErr = 1864)  //Ads Port not opened
        {
            AdsPortOpen();
            *TcErr = AdsGetLocalAddress(pTcAddr);
            if(*TcErr) return;
        }
        else return;
        pTcAddr->port = AMSPORT_R0_PLC_RTS1;
    
        *TcErr = AdsSyncReadWriteReq(pTcAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(TcHdl), &TcHdl, strlen(PlcVariableName), (void *)PlcVariableName);
        if(*TcErr) return;
    
        *TcErr = AdsSyncReadReq(pTcAddr, ADSIGRP_SYM_VALBYHND, TcHdl, sizeof(*Value), Value);
        if(*TcErr) return; 
    
        *TcErr = AdsSyncWriteReq(pTcAddr, ADSIGRP_SYM_RELEASEHND, 0, sizeof(TcHdl), &TcHdl); 
        if(*TcErr) return;
    
    }
    
    void sciAdsWriteDouble(const char* PlcVariableName, double* Value, long* TcErr)
    {
        AmsAddr            TcAddr;
        PAmsAddr        pTcAddr = &TcAddr;
        unsigned long    TcHdl;
    
        *TcErr = AdsGetLocalAddress(pTcAddr);
        if(*TcErr = 1864)  //Ads Port not opened
        {
            AdsPortOpen();
            *TcErr = AdsGetLocalAddress(pTcAddr);
            if(*TcErr) return;
        }
        else return;
        pTcAddr->port = AMSPORT_R0_PLC_RTS1;
    
        *TcErr = AdsSyncReadWriteReq(pTcAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(TcHdl), &TcHdl, strlen(PlcVariableName), (void *)PlcVariableName);
        if(*TcErr) return;
    
        *TcErr = AdsSyncWriteReq(pTcAddr, ADSIGRP_SYM_VALBYHND, TcHdl, sizeof(*Value), Value);
        if(*TcErr) return; 
    
        *TcErr = AdsSyncWriteReq(pTcAddr, ADSIGRP_SYM_RELEASEHND, 0, sizeof(TcHdl), &TcHdl); 
        if(*TcErr) return;
    
    }
    In scilab you can wrap the Dll-Calls i simpel scilab functions:
    Code:
    link("your_dll_path\TcScilabBridge.dll", "sciAdsReadDouble", "c"); 
    link("your_dll_path\TcScilabBridge.dll", "sciAdsWriteDouble", "c"); 
    function [PlcVal, TcErr]=AdsReadDouble(PlcVarName)     
        [PlcVal, TcErr] = fort("sciAdsReadDouble", PlcVarName, 1, "c", "out", [1,1], 2, "d", [1,1], 3, "i"); 
    endfunction  
    function TcErr=AdsWriteDouble(PlcVarName, PlcVal)     
        TcErr = fort("sciAdsWriteDouble", PlcVarName, 1, "c", PlcVal, 2, "d", "out", [1,1], 3, "i"); 
    endfunction
    Cheers
    witkatz
    Geändert von witkatz (23.02.2013 um 10:30 Uhr)
    Zitieren Zitieren Kommunikation zwischen Matlab/Scilab und TwinCAT  

  9. Folgender Benutzer sagt Danke zu witkatz für den nützlichen Beitrag:

    Thomas_v2.1 (23.02.2013)

  10. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    witzkatz, hast du schonmal versucht das in einen grafischen Xcos Block zu packen?
    Ich habe mir das mal angesehen, das scheint leider nicht ganz so einfach zu sein. Auch weil die Dokumentation etwas mau ist.

  11. #10
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja, ja, ein grafischer Block oder ein Ads-Modul in ATOMS wäre cool! Vielleicht mach ich dass auch irgendwann wenn ich mehr Zeit habe und vor allem, wenn ich eine brauchbare Anleitung finde...
    Momentan mach ich's mir auf die Schnelle recht einfach. Hab in TwinCAT LREAL-ARRAYs als Schnittstellenvariablen deklariet:
    Code:
    VAR_GLOBAL
        SciToTCat: ARRAY[0..7] OF LREAL;
        TCatToSci: ARRAY[0..7] OF LREAL;
    END_VAR
    Dann deklariere ich in Scilab Funktionen mit einem Double-Wert und dem Array-Index als Parameter. Die Functions werden aus Xcos mit dem scifunc_block_m aufgerufen.

    Code:
    link("your_dll_path\TcScilabBridge.dll", "sciAdsReadDouble", "c"); 
    link("your_dll_path\TcScilabBridge.dll", "sciAdsWriteDouble", "c");  
    function [PlcVal, TcErr] = AdsReadDouble(PlcVarName)
        [PlcVal, TcErr] = fort("sciAdsReadDouble", PlcVarName, 1, "c", "out", [1,1], 2, "d", [1,1], 3, "i");
    endfunction
    
    function TcErr = AdsWriteDouble(PlcVarName, PlcVal)
        TcErr = fort("sciAdsWriteDouble", PlcVarName, 1, "c", PlcVal, 2, "d", "out", [1,1], 3, "i");
    endfunction
    
    function y = ReadTCatToSci(idx)
        if idx < 0 or idx > 7 then
            y = 0;
        else
            PlcVarName = strcat([".TCatToSci[", string(floor(idx)), "]"]);
            [y, TcErr] = AdsReadDouble(PlcVarName);
        end
    endfunction
    function TcErr = WriteSciToTCat(idx, x)
        if idx < 0 or idx > 7 then
            TcErr = -1;
        else
            PlcVarName = strcat([".SciToTCat[", string(floor(idx)), "]"]);
            [TcErr] = AdsWriteDouble(PlcVarName, x);
        end
    endfunction
    

    In Xcos wähle ich dann scifunc_block_m. Der Block muss richtig parametriert werden, s. Bild.

    XcosToTCat_Sample01.jpg

    Wichtig ist noch die "Echt-Zeit" Skalierung = 1 in den Xcos Simulationsparametern für ein brauchbares Echtzeitverhalten und los geht's

    Das ist sicherlich keine komfortable Lösung, doch hoffentlich ein brauchbares Provisorium.
    Gruß witkatz
    Geändert von witkatz (23.02.2013 um 16:51 Uhr)

  12. Folgende 2 Benutzer sagen Danke zu witkatz für den nützlichen Beitrag:

    Thomas_v2.1 (23.02.2013),WeberEngineering (02.04.2014)

Ähnliche Themen

  1. Kommunikation zwischen 2 S7 315-2PN/DP
    Von Tommy1981 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 30.11.2009, 18:33
  2. TCP Kommunikation zwischen S7 SPS und PC
    Von SWI im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 29.04.2009, 08:00
  3. Antworten: 2
    Letzter Beitrag: 19.03.2007, 15:02
  4. OPC Kommunikation mit Matlab/Simulink
    Von farforward im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.01.2006, 21:13
  5. Antworten: 0
    Letzter Beitrag: 23.01.2006, 16:52

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •