Bibliothek SysLibCom.lib (XSoft)

Anonymous
2006-02-23
2006-04-18
  • Anonymous - 2006-02-23

    Originally created by: S-12

    Hallo,

    ich versuche gerade die serielle Kommunikation mit einer XC-SPS von Moeller auszuprobieren.

    Als hoffentlich passende Bib habe ich die SysLibCom.lib eingebunden.

    Mein Problem dabei ist nun die sehr mangelhafte Dokumentation der Bibliothek.

    Der Rückgabewert der Funktionen SysComOpen und SysComClose ist jeweils ein Handle. Wie muss ich das deklarieren?

    SysComRead und SysComClose nutzen jeweils das Handle von SysComOpen und ich werde ja schlecht eine Anbindung wie diese machen können, da dann SysComOpen bei SysComClose wieder ausgeführt würde, oder?

    Bsp.: ST

     SysComOpen(Port);
    (*Port PORTS; spezifiziert die zu öffnende Schnittstelle (COM1,..); Port-
       Nummer, siehe unten: Enumeration PORTS*)
       
    SysComRead( SysComOpen( Port ), &Buffer, 8, t);
    (*dwHandle DWORD aus SysOpenCom erhaltener Handle des Ports
      dwBufferAddress DWORD Adresse, auf die die gelesenen Bytes kopiert 
      werden sollen, nachdem sie vom Port gelesen wurden; kann mit Hilfe 
      des Operators ADR ermittelt werden
      dwBytesToRead DWORD Anzahl der Bytes, die gelesen werden sollen
      dwTimeout DWORD Zeit in [ms], nach der die Funktion spätestens 
      zurückkehrt*)
    SysComClose( SysComOpen(Port))
    (*DwHandle DWORD aus SysComOpen erhaltenes Handle für den Port*)
    

    MfG

     
  • Anonymous - 2006-03-01

    Originally created by: -AB-

    Hi,

    ich hatte auch schon mal mit der Bibliothek gearbeitet. Von Moeller hatte ich damals unteranderem das folgende Beispielprogramm bekommen.

    Hast du die Beschreibung "SysLibCOM.pdf"? Die ist normalerweise unter

    "\Moeller Software\XSoft V2.3\Dok\Deutsch\XSoftSysLibs\SysLibCom.pdf"

    Falls nicht melde dich oder ruf bei Moeller im Support an.

    PROGRAM PLC_PRG

    VAR

    uiState: UINT;
    
    dwHandle_COM2: DWORD;
    
    uiErrorState: UINT;
    
    strAusgabeString1: STRING;
    
    uiCounter: UINT;
    
    dwBytesGeschrieben_COM2: DWORD;
    
    xCloseResult_COM2: BOOL;
    
    Bremse: TON;
    
    dwBytesGelesen_COM2: DWORD;
    
    dwHandle_COM3: DWORD;
    
    strEingabeString1: STRING(8);
    
    strAusgabeAnzeige: STRING;
    

    END_VAR

    CASE uiState OF

    0: ( Open COM2: )

    IF dwHandle_COM2 = 0 THEN
    
        dwHandle_COM2:=xSysComOpen(Port:=COM2);
    
    
    
        IF dwHandle_COM2 > 0 THEN
    
            uiState:=uiState+1;
    
        ELSE
    
            uiErrorState := uiState;
    
            uiState:=99;
    
        END_IF;
    
    END_IF
    

    1: ( Write COM2 )

    strAusgabeString1 := CONCAT (strAusgabeString1, '$R$N');
    
    dwBytesGeschrieben_COM2 := xSysComWrite(    dwHandle:= dwHandle_COM2,
    
                                                        dwBufferAddress := ADR(strAusgabeString1),
    
                                                        dwBytesToWrite := LEN(strAusgabeString1)+ 1, (* + 1 Zeichen 0-Terminierung *)
    
                                                        0);
    
    
    
    IF dwBytesGeschrieben_COM2 = LEN(strAusgabeString1)+1 THEN
    
        uiCounter := uiCounter + 1;
    
        uiState := uiState + 1;
    
    END_IF
    

    2: ( Read COM2 )

    dwBytesGelesen_COM2     :=  xSysComRead(    dwHandle := dwHandle_COM2,
    
                                                        dwBufferAddress     := ADR(strEingabeString1),
    
                                                        dwBytesToRead   := 8,
    
                                                        dwTimeout := 0);
    
        IF (dwBytesGelesen_COM2 > 0 ) THEN
    
            uiState:=uiState+1;
    
            strAusgabeAnzeige := strEingabeString1;
    
        END_IF
    

    3: ( Close COM2 )

    xCloseResult_COM2 := xSysComClose(dwHandle := dwHandle_COM2);
    
    IF( xCloseResult_COM2 = TRUE ) THEN
    
        dwHandle_COM2 := 0;
    
        uiState := 0;
    
        ELSE
    
        ;
    
    END_IF
    

    END_CASE

     
  • Anonymous - 2006-03-05

    Originally created by: tb

    hallo

    gibt es eine Möglichkeit Ereignisgesteuert von der der COM Schnittstelle zu lesen ?

    z.B. wenn daten anstehen, dann sollte irgend ein ereignis ausgelöst werden und man kann mit einer funktion lesen, bis nichts mehr kommt, . .

    mfg. thomas

     
  • Anonymous - 2006-04-17

    Originally created by: S-12

    Hallo,

    wieder ich zu der seriellen Kommunikation.

    Also ich möchte auf der zweiten seriellen Schnittstelle lesen. Sowie scheint es auch zu funktionieren. Allerdings möchte ich für die Schnittstelle einige Voreinstellungen machen. Dazu gibt es ja die Funktion SysComSettings.

    Da ich immer noch Probleme mit der CoDeSys-Hilfe habe, frage ich mal in die Runde wie ich denn die SysComSettings-Funktion bediene.

    Wenn ich bisher richtig gelesen habe, muss ich meine Einstellungen irgendwo hin schreiben und dann per Adressoperator an die Funktion übergeben.

    Muss ich dafür nun eine neue Typdeklaration, welche äquivalent zu der in der Bibliothek ist, aufmachen?

    (PS: falls jem. von 3S-Soft das hier mal liest: Niemand reißt euch den Kopf für ein simples Beispiel ab, auch dürft ihr die Hilfe ruhig ausführlich gestalten.

    Ein Auszug aus der Hilfe zur SysLibCom: "der Operator ADR kann dabei zu Hilfe genommen werden (siehe unten, Beispiel)" Ein Beispiel ist allerdings nirgends zu sehen...)

    MfG

     
  • Otmar Fössing - 2006-04-18

    Hallo,

    Im Handbuch zur XC100 (Seite 67) finden Sie ein Beispiel zum Aufruf und zur Parametrierung der seriellen Schnittstelle:

    Das Handbuch finden Sie unter

    Start/Programme/Moeller Software/XSoft V2.3.3/Dokumenation/index.htm

    und dann weiter mit

    DEUTSCH/HARDWARE/XC100/index.html

    oder auf dem Moeller ftp-Server:

    ftp://ftp.moeller.net/AUTOMATION/DOWNLO ... index.html

    Viel Erfolg

     
  • Anonymous - 2006-04-18

    Originally created by: S-12

    Hallo Herr Fössing,

    danke für die Antwort. In dem PDF ist alles gut beschrieben. So sollte es auch in der Hilfe zur SysComLib stehen.

    U.U. können Sie mir auch die folgende Frage beantworten, bevor ich die sia-Hotline bemühe.

    Ich möchte an der seriellen Schnitstelle (COM2) bis zu 200 Bytes lesen. Diese werden im 1s-Takt mit 4800Baud von einem weiteren Gerät gesendet. Ich erhalte jedoch maximal 3Bytes pro SPS-Zyklus (20ms).

    Probehalber habe ich mal "dwBytesToRead" auf 2 gesetzt und lege den Pufferinhalt in ein Array fotlaufend ab. Bei Zyklen von 20ms erhalte ich tatsächlich nur zwei Bytes. Da ich die gesendeten Daten kenne, kann ich das sehr schön überprüfen.

    Gut, nun kann man argumentieren, dass bei 4800Bit/s nur 12 Byte in 20ms versendet werden. Allerdings sind die zwei Bytes dann doch etwas wenig, selbst bei synchroner Abfrage des COM Ports.

    Erhöhe ich auf 50ms Zykluszeit erhalte ich nur noch ein Byte.

    Online erhalte ich mit dem Befehl cycle eine aktuelle Zeit von 2ms. Entweder macht die SPS mit den ser. Daten was sie will oder die Welt dreht sich nicht mehr...

    Gruß

    M. Rehfeldt

     

Log in to post a comment.