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

Ergebnis 1 bis 5 von 5

Thema: B&R | Serielle Kommunikation mittels IF1020 | RS232-Schnittstelle

  1. #1
    Registriert seit
    14.08.2007
    Beiträge
    8
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Moinsen!

    Zur einfachen Implementierung einer seriellen Schnittstelle an einer B&R X20-SPS habe ich eine X20CP3484 (SG4-CPU) mit einem Modul IF1020 (RS232-Schnittstelle) ausgerüstet. Nun möchte ich zunächst eine serielle Verbindung mit einem PC herstellen, um über dessen Hyperterminal die Funktion der RS232-Schnittstelle der SPS zu testen und auszuprogrammieren.

    Frage: Welche Bibliotheken oder Funktionen muss ich verwenden, um das Modul IF1020 zum Leben zu erwecken?

    Die mitgelieferten Bibliotheken AsPPP und AsSPP habe ich mir angesehen, allerdings führen diese meiner Meinung nach nicht zum Ziel, da eine IP-basierte Kommunikation vorausgesetzt wird, ich aber mit einem Nullmodemkabel arbeiten möchte.

    Programmierumgebung: Automation Studio V3.0.81.32 SP07
    Hardware: X20-System (siehe oben)

    Vielen Dank, DeichKind.
    Every advanced technology cannot be distinguished from magic.
    Zitieren Zitieren B&R | Serielle Kommunikation mittels IF1020 | RS232-Schnittstelle  

  2. #2
    Registriert seit
    03.09.2007
    Ort
    Saarland
    Beiträge
    79
    Danke
    4
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Mahlzeit!

    Serielle Kommunikation ist kein großes Problem.

    Als Bibliothek brauchst du die DVFRAME. Findest du in den mitgelieferten Bibs.


    Die Hilfe ist auch ausführlich beschrieben. Wenn du noch Hilfe brauchst meld dich einfach.
    Geändert von Hardy81 (10.10.2012 um 11:07 Uhr)

  3. Folgender Benutzer sagt Danke zu Hardy81 für den nützlichen Beitrag:

    Deichkind (25.10.2012)

  4. #3
    Registriert seit
    03.09.2007
    Ort
    Saarland
    Beiträge
    79
    Danke
    4
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Grr... hier noch der Quelltext wie ich es schon in mehreren Projekten benutz hab:

    Code:
    PROGRAM _INIT
    
    
    	// Schnittstellenparameter für Waage
    	// BD (Baud) 		= 1200
    	// PA (Parity) 		= O (ODD)
    	// DB (Data Bits) 	= 7
    	// SB (Stop Bit) 	= 1
    	Schnittstelle_Mode := '/BD=1200 /PA=O /DB=7 /SB=1';
    	
    	Schnittstelle_Device := 'IF1'; 
    	
    	Schnittstelle_config.idle := 10; 		// max. Leerzeit zwischen Zeichen 
    	Schnittstelle_config.rx_cnt := 1; 		// Anzahl Empfangspuffer
    	Schnittstelle_config.tx_cnt := 1; 		// Anzahl Sendepuffer
    	Schnittstelle_config.rx_len := 256; 	// Länge (Byte) Empfangspuffer
    	Schnittstelle_config.tx_len := 256; 	// Länge (Byte) Sendepuffer
    	Schnittstelle_config.argc := 0; 		// Anzahl zusätzliche Argumente
    	Schnittstelle_config.argv := 0; 		// Zusätzliche Argumente
    	Schnittstelle_config.delim[0] := 0; 	// Frameendezeichen
    	Schnittstelle_config.delim[1] := 0; 	// Frameendezeichen
    	Schnittstelle_config.delimc := 0; 		// Frameendezeichen aktiv = 0
    	
    	
    	// Schrittketten zurücksetzen 
    	Komm_Schritt := 0;
    	
    	
    	// Puffer löschen 
    	Puffer_Lesen := '';
    	Puffer_Schreiben := '';
    	
    END_PROGRAM
    
    
    
    
    PROGRAM _CYCLIC
    	
    	// Steuerzeichen ESC für Abfrage Waage
    	ESC := 27;
    		
    	PC_enabled := TRUE;
    	
    	// Senden und Empfangen aktivieren, wenn die Option in der Visu eingeschaltet ist. 
    	IF PC_enabled THEN
    		
    		// Lesen und Schreiben über die Schnittstelle aktivieren 
    		Lesen := TRUE;
    	
    		IF ((PC_Komm_OK = FALSE) AND (Komm_Schritt = 0)) THEN 
     			Komm_Schritt := 10;
    		END_IF
    		
    		CASE Komm_Schritt OF
    	 		10 : // Schnittstelle öffnen 
    				FRM_xopen1(enable := TRUE, device := ADR(Schnittstelle_Device), mode := ADR(Schnittstelle_Mode), config := ADR(Schnittstelle_config));		
    			
    				// Status der Schnittstelle abfragen 
    				Status_FRM_xopen := FRM_xopen1.status;
    			
    				Komm_Schritt := 20;
    			
    			20 : // Status der Schnittstelle auswerten 
    				IF Status_FRM_xopen <> 0 THEN 	// Im Fehlerfall in Schritt 40 springen 
       					Komm_Schritt := 40;
    				END_IF
    			
    				IF Status_FRM_xopen = 0 THEN 	// läuft alles glatt, dann in Schritt 30 weitermachen 
    	   				Komm_Schritt := 30;		
    				END_IF
    				
    			30 : // Status aktualisieren "Kommunikation aufgebaut" 
    				IF Status_FRM_xopen = 0 THEN
    					// Bit setzen, dass Kommunikation aufgebaut ist 
    					PC_Komm_OK := 1;
    				
    					Komm_Schritt := 50;			
    				END_IF
    			
    				
    			40 : // Es konnte keine Kommunikation aufgebaut werden 
    				IF Status_FRM_xopen <> 0 THEN
    					// Fehlerbehandlung für Visu
    				END_IF
    				
    				// Alarmmeldung ausgeben 
    				
    			50 : // Schnittstelle initialisiert 
    				Komm_Schritt := 0;
    			
    				FRM_ident := FRM_xopen1.ident;
    			
    		END_CASE	
    	
    	ELSE
    	
    		Lesen := FALSE;
    	 	Schreiben := FALSE;
    		PC_Komm_OK := FALSE;
     	
    		// Schnittstelle deaktivieren 
    		FRM_close1(enable := TRUE, ident := FRM_ident);
    	
    		// Status abfragen 
    		Status_FRM_close := FRM_close1.status;
    	
    		// Fehlermeldung ausgeben, wenn bei Schließen ein Fehler aufgetreten ist. 
    		CASE Status_FRM_close OF
    			8071 : // frmERR_NOBUFFER Kein Puffer in der Sendepuffer-Verwaltung frei. 
    					Fehler_Schliessen := TRUE;
    				
    	   		8072 : // frmERR_INVALIDBUFFER Ungültiger Puffer wird zurückgewiesen 
    					Fehler_Schliessen := TRUE;
    				
    	   		8073 : // frmERR_IOCTL_NOTVALID Ungültiger IO-Control-Code 
    					Fehler_Schliessen := TRUE;
    				
    	   		8078 : // frmERR_TRANSMITOVERRUN Sende-Puffer-Warteschlage voll 
    					Fehler_Schliessen := TRUE;
    				
       			8079 : // frmERR_INPUTERROR Frame-Puffer mit defektem Zeichen 
    					Fehler_Schliessen := TRUE;
    				
    	   		8210 : // 8210 + x; Analyse des fehlerhaften Puffers. x liegt zwischen 1 und 31. 
    					Fehler_Schliessen := TRUE;
    				
    	   		8251 : // frmERR_NOTOPENED Device ist nicht GEöffnet 
    					Fehler_Schliessen := TRUE;
    				
    	   		8252 : // frmERR_DEVICEDESCRIPTION Device nicht gefunden 
    					Fehler_Schliessen := TRUE;
    				
       			8253 : // frmERR_MODEDESCRIPTION Syntaxfehler im Mode-Parameter-STRING, oder Mode-Parameter wird vom spezifischen Device nicht unterstützt. 
    					Fehler_Schliessen := TRUE;
    				
       			8254 : // frmERR_MAXOPEN Zu viele Devices gleichzeitig GEöffnet. 
    					Fehler_Schliessen := TRUE;
    				
    	   		8255 : // ERR_DEV_SPSSW_VERSION Im Zielsystem ist ein Betriebssystem mit einer Version kleiner 2.00 installiert. Es muss eine Version größer oder gleich 2.00 verwendet werden. 
    					Fehler_Schliessen := TRUE;
    				
    	   		8256 : // frmERR_PA_DB_SB /PA, /DB, /SB müssen immer gemeinsam angegeben werden ! 
    					Fehler_Schliessen := TRUE;
    				
    	   		8257 : // frmERR_IOCTL_NOTSUPPORTED Kommando wird vom Treiber (Hardware) nicht unterstützt 
    					Fehler_Schliessen := TRUE;
    				
    	   		8258 : // frmERR_NORESOURCES benötigte Ressourcen nicht verfügbar (Speicher, OS-Objekte, ...) 
    					Fehler_Schliessen := TRUE;
    		END_CASE
    	END_IF
    
    
    
    
    
    
    	// Daten über die serielle Schnittstelle empfangen und auswerten 
    	IF Lesen = TRUE THEN
    
    
    		// Daten von der Schnittstelle einlesen 
    		FRM_read1(enable := TRUE, ident := FRM_ident);
     
    	 	// Adresse und Länge des Lesepuffers einlesen 
    		Lesen_Puffer := FRM_read1.buffer;
    		Lesen_Puffer_Laenge := FRM_read1.buflng;
    	
    		// Status Daten lesen abfragen 
    		Lesen_Status := FRM_read1.status;
    	
    		IF Lesen_Status <> 0 THEN
    			CASE Lesen_Status OF
    				8071 : // frmERR_NOBUFFER Kein Puffer in der Sendepuffer-Verwaltung frei. 
    						Fehler_Lesen := TRUE;
    
    
    				8072 : // frmERR_INVALIDBUFFER Ungültiger Puffer wird zurückgewiesen 
    						Fehler_Lesen := TRUE;
    			
    				8073 : // frmERR_IOCTL_NOTVALID Ungültiger IO-Control-Code 
    						Fehler_Lesen := TRUE;
    					
    				8078 : // frmERR_TRANSMITOVERRUN Sende-Puffer-Warteschlage voll 
    						Fehler_Lesen := TRUE;
    					
    				8079 : // frmERR_INPUTERROR Frame-Puffer mit defektem Zeichen 
    						Fehler_Lesen := TRUE;
    					
    				8210 : // 8210 + x; Analyse des fehlerhaften Puffers. x liegt zwischen 1 und 31. 
    						Fehler_Lesen := TRUE;
    		
    				8251 : // frmERR_NOTOPENED Device ist nicht GEöffnet 
    						Fehler_Lesen := TRUE;
    		
    				8252 : // frmERR_DEVICEDESCRIPTION Device nicht gefunden 
    						Fehler_Lesen := TRUE;
    		
    				8253 : // frmERR_MODEDESCRIPTION Syntaxfehler im Mode-Parameter-STRING, oder Mode-Parameter wird vom spezifischen Device nicht unterstützt. 
    						Fehler_Lesen := TRUE;
    		
    				8254 : // frmERR_MAXOPEN Zu viele Devices gleichzeitig GEöffnet. 
    						Fehler_Lesen := TRUE;
    		
    				8255 : // ERR_DEV_SPSSW_VERSION Im Zielsystem ist ein Betriebssystem mit einer Version kleiner 2.00 installiert. Es muss eine Version größer oder gleich 2.00 verwendet werden. 
    						Fehler_Lesen := TRUE;
    		
    				8256 : // frmERR_PA_DB_SB /PA, /DB, /SB müssen immer gemeinsam angegeben werden ! 
    						Fehler_Lesen := TRUE;
    		
    				8257 : // frmERR_IOCTL_NOTSUPPORTED Kommando wird vom Treiber (Hardware) nicht unterstützt 
    						Fehler_Lesen := TRUE;
    		
    				8258 : // frmERR_NORESOURCES benötigte Ressourcen nicht verfügbar (Speicher, OS-Objekte, ...) 
    						Fehler_Lesen := TRUE;
    			END_CASE
    		END_IF
    	
    	
    	
    		// Wenn Daten empfangen wurden, die umkopieren 
    		IF Lesen_Status = 0 THEN
      	
    			// Empfangspuffer löschen, damit keine alten Daten mehr vorhanden sind 
    			Puffer_Lesen := '';
    		
    			FOR i := 0 TO 255 DO
    				Lesen_Daten[i] := 0;
    			END_FOR
    	
    			// gelesene Daten in Empfangspuffer umkopieren 
    			memcpy(ADR(Lesen_Daten), Lesen_Puffer, Lesen_Puffer_Laenge);
    			memcpy(ADR(Puffer_Lesen), ADR(Lesen_Daten), 256);
    
    
          
    	   		// Lesepuffer freigeben 
    			FRM_rbuf1(enable := TRUE, ident := FRM_ident, buffer := Lesen_Puffer, buflng := Lesen_Puffer_Laenge);
       
    	   		// Lesepuffer freigeben Status abfragen 			
    			Lesen_Freigabe_Puffer_Status := FRM_rbuf1.status;
    			
    	   		Lesen := FALSE;
    			Neue_Daten := TRUE;
       		END_IF	
    	END_IF
    
    
    
    
    	// Daten an PC senden 
    	IF Schreiben = TRUE THEN
    		// Sendepuffer vorbelegen
    		Status_Puffer_Schreiben := strcpy(ADR(Puffer_Schreiben), ADR(ESC));
    		Status_Puffer_Schreiben := strcat(ADR(Puffer_Schreiben), ADR('P'));
    	 	Status_Puffer_Schreiben := strcat(ADR(Puffer_Schreiben), ADR(CRLF));
    	END_IF
    	
    	
    	IF ((Schreiben = TRUE) AND (Puffer_Schreiben <> '')) THEN
    
    
    		// Sendepuffer initialisieren 
    		FRM_gbuf1(enable := TRUE, ident := FRM_ident);
    	
    		// Anforderung zum Senden zurücksetzen 
    		Schreiben := FALSE;
     
     		// Adresse von Sendepuffer herausfinden 
    		pPuffer_Schreiben := FRM_gbuf1.buffer;
    	
    		// Status Sendepuffer ermitteln 
    		Status_FRM_gbuf := FRM_gbuf1.status;
    	
    		// Länge des Sendepuffers bestimmen 
    		Sende_Puffer_Laenge := strlen(ADR(Puffer_Schreiben));
    		
    		
    		// Daten senden, wenn kein Fehler vorliegt 
    		IF Sende_Status = 0 THEN
    
    
    	 		FRM_write_0(enable := TRUE, ident := FRM_ident, buffer := ADR(Puffer_Schreiben), buflng := Sende_Puffer_Laenge);
      
      			// Status abfragen 
    			Sende_Status := FRM_write_0.status;
    		
    			// Wenn die Daten gesendet wurden, den Puffer wieder freigeben 
    			IF Sende_Status <> 0 THEN
    
    
      				FRM_robuf1(enable := TRUE, ident := FRM_ident, buffer := ADR(Puffer_Schreiben), buflng := Sende_Puffer_Laenge);
       	   			Sende_Robuf_Status := FRM_robuf1.status;
    
    
    			END_IF
    		END_IF
    	END_IF
    
    
    
    
    
    
    	// Wenn neue Daten eingelesen wurden, den String auswerten 
    	IF Neue_Daten = TRUE THEN
    
    
    		IF Puffer_Lesen = 'HMALL' THEN
    		
    			Puffer_Lesen := '';
    		
     		END_IF
    	END_IF
    END_PROGRAM

  5. Folgender Benutzer sagt Danke zu Hardy81 für den nützlichen Beitrag:

    Deichkind (25.10.2012)

  6. #4
    Registriert seit
    22.11.2012
    Beiträge
    16
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hardy handelt es sich bei deinem Beispiel um eine Abfrage von einer Sartorius Waage zufällig?

    Ich probiere gerade über die RS232 etwas herauszulesen bekomme aber immer nur komische zeichen zurück.
    Was hast du an der Karte für änderungen vornehmen müssen?

  7. #5
    Registriert seit
    13.09.2010
    Beiträge
    113
    Danke
    0
    Erhielt 18 Danke für 18 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    An der Karte gibt es nichts einzustellen.
    Softwareseitig musst Du sicherstellen, dass Du die Kommunikationsparameter Deiner Gegenstelle triffst.
    Dann kommen auch gültige Zeichen an.

Ähnliche Themen

  1. Serielle Schnittstelle
    Von marcio.bv im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 28.08.2012, 12:56
  2. Antworten: 2
    Letzter Beitrag: 22.09.2010, 08:26
  3. WinCC Flexible & Serielle Schnittstelle
    Von repök im Forum HMI
    Antworten: 0
    Letzter Beitrag: 28.11.2006, 16:13
  4. B & R über serielle Schnittstelle programmieren
    Von Kobold im Forum Sonstige Steuerungen
    Antworten: 12
    Letzter Beitrag: 18.11.2005, 12:49
  5. Serielle Schnittstelle
    Von Anonymous im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 18.06.2004, 11:20

Lesezeichen

Berechtigungen

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