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

Deichkind

Level-1
Beiträge
8
Reaktionspunkte
1
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.
 
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.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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?
 
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.
 
Zurück
Oben