Frage zu FB Programmierung

spqr76

Level-2
Beiträge
128
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum ,
ich sitze seit einiger Zeit an einem FB. Bei der Erstellung des Bausteins sind mir einige Dinge aufgefallen die ich noch nicht richtig verstanden habe .
Kurze Erklärung des Bausteins:
Bei uns in der Firma werden an den Montagelinien Kameras über Ethernet angesteuert. Ich bin dafür zuständig diese Systeme in die Montagelinien ein zu bauen. Da sich verschiedene Programmteile wiederholen , kam mir der Einfall einen FB dafür zu schreiben. Im FB verwende ich je nach Steuerungstyp oder CP AG_Send/AG_Receive Bausteine. Einige In Parameter und Out Parameter.

Nun meine Frage :
An meinem FB gibt es einen In Parameter den ich für einen Anypointer verwende.
1.Frage warum kann ich nicht direkt meinen In Parameter im Anypointer verwenden . Sondern muss das DBW aus meinem Instanz DB nehmen ? Anstatt direkt meinen In Parameter in den Any Pointer ein zu setzen. Unten DIW 6 .....

LAR2 P##EMPFANGSBEREICH_2

L W#16#1002 //SYNTAX ID UND DATENTYP BYTE
T LW [AR2,P#0.0]


L DIW 6 // DB NUMMER GELESEN AUS INSTANZ_DB
T LW [AR2,P#4.0]

L 74 //LÄNGE COPY-BEREICH
T LW [AR2,P#2.0]

L 74 //ANFANG ZIELDATENBEREICH
SLD 3
OD DW#16#85000000 //SPEICHERBEREICH 85hex -> DI FESTLEGEN
T LD [AR2,P#6.0]


2.Frage wann kann ich direkt in den Stat Bereich meines FB Programmieren und wann muss ich den Instanz DB nehmen .
Z.B.
u M0.0
= DIX10.0

u M0.0
= #Kamera IO

Das ist mir noch nicht so ganz klar geworden . Gibt es Regeln dafür ? Habe schon versucht bei Siemens Erklärungen dafür zu finden. Ist mir aber nicht gelungen.
Beispiel In Parameter Programmnummer von Kamera muss ich aus DIW6 entnehmen anstatt aus dem In Parameter. Sonst funktioniert mein Baustein nicht.
Andererseits habe ich Verbindungs ID und Laddr auch als In Parameter definiert. Diese muss ich am AG_Send FC direkt parametrieren da kann ich nicht DIW nehmen.
Das würde ich gern wissen warum dies so ist. Ich hoffe das es mir gelungen ist mein Problem verständlich zu beschreiben.
 
Um mal eins klarzustellen: Alle Variablen aus dem STAT-Bereich, sowie auch alle IN, OUT und IN-OUT liegen liegen im Instanz-DB. Somit verstehe ich die 2. Frage nicht. Was du dann als Code hingezaubert hast hat ist doch faktisch das selbe wenn DIX 10.0 das Symbol "Kamera iO" hat. Ich möchte aber dringend von Absoluten Zugriffen im Programm abraten.

Die 1. Frage hab ich leider nicht verstanden.
 
"Was du dann als Code hingezaubert hast hat ist doch faktisch das selbe wenn DIX 10.0 das Symbol "Kamera iO" hat"

Das dachte ich auch .

CALL FC 706
ID :=#ID_VERBINDUNG
LADDR :=#LADR_VERBINDUNG
RECV :=#EMPFANGSBEREICH_2
NDR :=#COGNEX_STATUS.DATEN_EMPFANGEN_NDR
ERROR :=#COGNEX_STATUS.DATEN_EMPFANG_ERROR
STATUS:=#COGNEX_STATUS.DATEN_EMPFANG_STATUS
LEN :=#COGNEX_STATUS.DATEN_EMPFANG_LAENGE
NOP 0


Anderes Beispiel wenn ich den FC Ag Send aufrufe in meinem FB .
Dann muss ich den In_Parameter : #ID_VERBINDUNG an den FC Parametrieren. Ich kann nicht sagen DIW 7.
Das hat mich etwas verwirrt.
Entweder programmiere ich in meinem FB alles auf die Stat's . Oder alles direkt in den Instanz DB. Aber es ist für mich nicht ganz eindeutig wann ich sage DIX und wann #tmp....
Wenn ich versuche am oben aufgeführten FC 706 ID:= DIW12 zu parametrieren ist das nicht zulässig. Und damit habe ich mein verständniss Problem.
Ich habe für meinen Ablauf im FB auch einen In Parameter Start ( Trigger für Ablauf ) . Den muss ich auch als DIX0.0 verwenden und kann nicht direkt #Start im Programm einsetzen. Das ist die Ecke die mir schwierigkeiten macht zu verstehen. Einmal so einmal so.......
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe für meinen Ablauf im FB auch einen In Parameter Start ( Trigger für Ablauf ) . Den muss ich auch als DIX0.0 verwenden und kann nicht direkt #Start im Programm einsetzen.
Bei mir geht so was ohne Probleme symbolisch. Ich habe den Verdacht, dass da etwas anderes nicht passt, versuchtst Du vielleicht einen IN-Parameter als IN/OUT weiter zu verwenden?
Außerdem solltest Du Dir mal in der Online-Hilfe zum KOP/FUP/AWL-Editor ansehen, was beim "Durchreichen" von Formal-Parametern als Aktual-Parameter geht und was nicht, es geht nämlich nicht alles(Stichwort: "Parameterübergabe bei Bausteinen").
Gruß
Erich
 
Hallo Erich,
nein es ist kein In/Out Parameter . Ich schildere mal wie ich zu diesem Punkt gekommen bin :

clip_image001.png


In meinem FB sieht man den In Parameter Programmnummer . Diese Nummer gilt für das Prüfprogramm der Kamera.
Damit ging der Spaß los:

Erst habe ich versucht :
L #Programmnummer // INSTANZ_DB IN_PARAMETER
T #tmpProgramNr



//CHANGE FORMAT INT --> CHAR

L #tmpProgramNr
ITD
DTB
T #tmpProgNrDble
SLD 28
SRD 28
L 48
+I
T #tmpProgramNr1 //1er Programnumber


L #tmpProgNrDble
SLD 24
SRD 28
L 48
+I
T #tmpProgramNr10 //10er Programnumber

Dies hat aber nicht funktioniert. Erst als ich mein Netzwerk auf geändert habe :

L DIW 8
T #tmpProgramNr

L #tmpProgramNr
ITD
DTB
T #tmpProgNrDble
SLD 28
SRD 28
L 48
+I
T #tmpProgramNr1

L #tmpProgNrDble
SLD 24
SRD 28
L 48
+I
T #tmpProgramNr10

Und wie gesagt davon gab es noch mehrere Ecken wo ich anstatt #tmp... dirket den Instanz DB ansprechen muss. Ich will nicht ausschliessen das ich etwas falsch verstanden oder auch falsch programmiert habe.
 
Code:
FUNCTION_BLOCK FB 9
TITLE =
VERSION : 0.1


VAR_INPUT
  ProgrammNummer : INT ;    
END_VAR
VAR_TEMP
  TmpPrgNr : INT ;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     #ProgrammNummer; 
      T     #TmpPrgNr; 


END_FUNCTION_BLOCK
Das ist jetzt ein FB der keine Fehler meldet (direkt als Quelle exportiert)
Lässt sich dieser FB bei Dir fehlerfrei übersetzen?
Gruß
Erich
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Erich ,
danke für deine mühe aber das ist nicht wirklich mein Problem. Denn das habe ich vielleicht vergessen zu erwähnen. Mein SendeString den ich im FB erzeuge ist in Byte aufgeteilt . D.h. ich habe für die Programmnummer ein Byte für 1er Stelle und ein Byte für 10er Stelle. Deshalb die Netzwerke die ich im vorherigen Beitrag eingestellt habe. Dieses Thema ist hier im Forum schwierig zu beschreiben. Wir haben nächse Woche einen Siemens Lehrgang da versuche ich meine offenen Fragen zu klären. Aber trotzdem vielen dank......
 
Hallo Forum,
ich wollte noch mal eine kleine Rückmeldung geben.
( dank eines Kollegen .... was würde ich nur ohne den Harry machen ) konnte ich den Fehler beheben.
Mein Fehler war schlicht weg das ich anstatt Adressregister 1 das Adressregister 2 geladen habe. Dies hat zu komischen Signalen im Baustein geführt. Anypointer auf AR1 geändert alles gut""
 
Zurück
Oben