-> Hier kostenlos registrieren
Guten Morgen,
Habe hier eine AWL Quelle von einem FB10 der in einem anderen FBx aufgerufen wird und die ganze Zeit ohne Probleme lief.
Dieser Baustein sorgt dafür das eine Kamera Bilder von Objekten macht.
Jetzt haben wir die gleiche Kamera nochmal bekommen und haben sie genauso mit eingebunden wie die andere.
Mein Problem ist jetzt das die 1. Kamera immer noch funktioniert aber die 2. nicht. Hänge ich den FB10 für die 1. Kamera ab funktioniert die 2.
Im FB10 wird mit SFC14 und 15 gearbeitet. Und soviel ich weiß liegt es daran das der SFC15 beim 2. FB10 Aufruf die Ausgangsdaten falsch beschreibt.
Hat jemand von Euch Erfahrung mit SFC14 und 15 wenn mehrere Instanzen aufgerufen werden.
Was muss jetzt an dem FB10 geändert werden für die neue Situation.
Die richtige Adresse aus der Hardwarekonfiguration wird jedem FB10 Aufruf als Integer Wert übergeben.
Angeblich spielt das AR2 eine große Rolle wenn man Eingänge auf den IDB lädt und vom IDB wieder die Ausgänge beschreibt.
Es wäre toll wenn mir einer von Euch helfen könnte. Mit Adressregister zu Arbeiten ist nicht meine Stärke.
Vielen Dank
Mfg Tommylik
Habe hier eine AWL Quelle von einem FB10 der in einem anderen FBx aufgerufen wird und die ganze Zeit ohne Probleme lief.
Code:
FUNCTION_BLOCK FB 10
TITLE =Schnittstelle Kamera
{ S7_pdiag := 'true'; S7_language := '9(2) English (United Kingdom) 10.07.2013 10:03:04' }
VERSION : 0.0
VAR_INPUT
Address : INT ; //Start Addresse von Kamera
Praegecode : ANY ; //Prägecode, Bauteilzuordnung
Job_Nummer : BYTE ; //Job-Nummer die verwendet werden soll
Frg_Job_Num_wechseln : BOOL ; //Freigabe Job-Nummer wechseln
Hand : BOOL ; //Manual Mode
Acknowledge : BOOL ; //Acknowledge
Dry_Run : BOOL ; //bauteilloser Betrieb angewählt
Dry_Run_Sim_Time : TIME ; //Simulationszeit für bauteillosen Betrieb
Start_Aufnahme : BOOL ; //Start Aufnahme
END_VAR
VAR_OUTPUT
Aufnahme_OK : BOOL ; //Aufnahme ohne Fehler beendet
Aufnahme_nOK : BOOL ; //Aufnahme mit Fehler beendet
Fehler : BOOL ; //Fehler aktiv
Warnung : BOOL ; //Warnung aktiv
END_VAR
VAR_IN_OUT
Typ_Daten_Bit : BOOL ; //Bit wird gesetzt, wenn Aufnahme n.O.K. ist
END_VAR
VAR
Out_Kamera : STRUCT
Status : STRUCT
Ready : BOOL ; //Bereit zur nächsten Auswertung
Res_0_2 : BOOL ; //Reserve
Trigger_ack : BOOL ; //Trigger-Signal ausgeführt
Ch_Job_ack : BOOL ; //Change-Job-Signal erkannt
Sw_Run_ack : BOOL ; //Switch to Run-Signal erkannt
Res_0_5 : BOOL ; //Reserve
Res_0_6 : BOOL ; //Reserve
Res_0_7 : BOOL ; //Reserve
Res_1 : BYTE ; //Reserve
_12_RDBU : BOOL ; //Gesamtergebnis iO
_09_RD : BOOL ;
_05_PK : BOOL ;
_06_YE : BOOL ;
_07_BK : BOOL ;
_08_GY : BOOL ;
Res_2_6 : BOOL ;
Res_2_7 : BOOL ;
aktiver_Job : BYTE ; //aktueller Job
Image_ID : BYTE ;
Error_Bit0 : BOOL ; //Fehler Bit 0 Wert 1
Error_Bit1 : BOOL ; //Fehler Bit 1 Wert 2
Error_Bit2 : BOOL ; //Fehler Bit 2 Wert 4
Error_Bit3 : BOOL ; //Fehler Bit 3 Wert 8
Trigger_Mode : BOOL ; //0=Trigger / 1=Freilauf
Res_5_5 : BOOL ; //Reserve
OP_Mode : BOOL ; //0=Config / 1= Run
Res_5_7 : BOOL ; //aktueller Job Bit 7 Wert 128
END_STRUCT ;
Data : STRUCT
Image_ID : BYTE ; //(0-255) wird nach jeder Job-Ausführung um Eins erhöht
ResultDataOverrun : BOOL ; //Ergebnisdaten wurden abgeschnitten
Res_1_1 : BOOL ; //Reserve
Res_1_2 : BOOL ; //Reserve
Res_1_3 : BOOL ; //Reserve
Res_1_4 : BOOL ; //Reserve
Res_1_5 : BOOL ; //Reserve
Res_1_6 : BOOL ; //Reserve
Res_1_7 : BOOL ; //Reserve
ResultData : ARRAY [1 .. 8 ] OF BYTE ;
END_STRUCT ;
Response : STRUCT
Key : BYTE ; //Key-Response (gespiegelter Wert von Req.nach Job-Ausführung)
ResultDataOverrun : BOOL ; //Response-Daten wurden abgeschnitten
Res_1_1 : BOOL ; //Reserve
Res_1_2 : BOOL ; //Reserve
Res_1_3 : BOOL ; //Reserve
Res_1_4 : BOOL ; //Reserve
Res_1_5 : BOOL ; //Reserve
Res_1_6 : BOOL ; //Reserve
Res_1_7 : BOOL ; //Reserve
Res_02 : BYTE ; //Reserve
Res_03 : BYTE ; //Reserve
Data : STRUCT
TG_Laenge : DWORD ; //Telegrammlänge
Erw_Trigger : BYTE ; //Erweiterter Trigger
Fehlercode1 : BYTE ; //Fehlercode
Fehlercode2 : BYTE ; //Fehlercode
Daten_Laenge : BYTE ; //Datenlänge (Anzahl Zeichen)
Jahr3 : BYTE ; //Produktions Jahr 3.Stelle
Jahr4 : BYTE ; //Produktions Jahr 4.Stelle
Monat1 : BYTE ; //Produktions Monat 1.Stelle
Monat2 : BYTE ; //Produktions Monat 2.Stelle
Tag1 : BYTE ; //Produktions Tag 1.Stelle
Tag2 : BYTE ; //Produktions Tag 2.Stelle
Stunde1 : BYTE ; //Produktions Stunde 1.Stelle
Stunde2 : BYTE ; //Produktions Stunde 2.Stelle
Minute1 : BYTE ; //Produktions Minute 1.Stelle
Minute2 : BYTE ; //Produktions Minute 2.Stelle
Sekunde1 : BYTE ; //Produktions Sekunde 1.Stelle
Res_19 : BYTE ; //Reserve
Reserve : ARRAY [20 .. 31 ] OF //Reserve
BYTE ;
END_STRUCT ;
END_STRUCT ;
END_STRUCT ;
IN_Kamera : STRUCT
Control : STRUCT
Reset_Error : BOOL ; //Fehler quittieren / löschen
Dis_HW_Trig : BOOL ; //Hardware-Trigger deaktivieren
Trigger : BOOL ; //Trigger (Aufnahme starten)
Change_Job : BOOL ; //aktiviere Job xxx
Switch_Run : BOOL ; //Switch to Run
Res_0_5 : BOOL ; //Reserve
Res_0_6 : BOOL ; //Reserve
Res_0_7 : BOOL ; //Reserve
Res_1 : BOOL ; //Reserve
Job_Nr : BYTE ; //Job-Nummer
END_STRUCT ;
Request : STRUCT
Key : BYTE ; //Key-Request (Request counter)
Res_01 : BYTE ; //Reserve
Res_02 : BYTE ; //Reserve
Res_03 : BYTE ; //Reserve
Data : STRUCT
TG_Laenge : DWORD ; //Telegrammlänge
Erw_Trigger : BYTE ; //Erweiterter Trigger
Daten_Laenge : BYTE ; //Datenlänge (Anzahl Zeichen)
Jahr3 : BYTE ; //Produktions Jahr 3.Stelle
Jahr4 : BYTE ; //Produktions Jahr 4.Stelle
Monat1 : BYTE ; //Produktions Monat 1.Stelle
Monat2 : BYTE ; //Produktions Monat 2.Stelle
Tag1 : BYTE ; //Produktions Tag 1.Stelle
Tag2 : BYTE ; //Produktions Tag 2.Stelle
Stunde1 : BYTE ; //Produktions Stunde 1.Stelle
Stunde2 : BYTE ; //Produktions Stunde 2.Stelle
Minute1 : BYTE ; //Produktions Minute 1.Stelle
Minute2 : BYTE ; //Produktions Minute 2.Stelle
Sekunde1 : BYTE ; //Produktions Sekunde 1.Stelle
Res_17 : BYTE ; //Reserve
Reserve : ARRAY [18 .. 31 ] OF //Reserve
BYTE ;
END_STRUCT ;
END_STRUCT ;
END_STRUCT ;
HMI : STRUCT
Button_Fehler_Quitt : BOOL ; //Button Fehler quittieren
Button_Reset : BOOL ; //Button Reset Baustein
Button_Pruefung_wh : BOOL ; //Button Prüfung wiederholen
Button_Quitt_niO_iO : BOOL ; //Button Quittierung "Prüfung niO" mit in Ordnung
Button_Quitt_niO_niO : BOOL ; //Button Quittierung "Prüfung niO" mit nicht in Ordnung
Button_Anwahl_Hand : BOOL ; //Button Anwahl Hand
Button_Start_Pruefung : BOOL ; //Button Start Prüfung
Res_07 : BOOL ;
Anz_Fehler : BOOL ; //Anzeige Fehler
Anz_Frg_Hand : BOOL ; //Anzeige Freigabe Handbetrieb
Anz_Pruefung_iO : BOOL ; //Anzeige Prüfung in Ordnung
Anz_Pruefung_niO : BOOL ; //Anzeige Prüfung nicht in Ordnung
Res_14 : BOOL ;
Res_15 : BOOL ;
Res_16 : BOOL ;
Res_17 : BOOL ;
Job_Nr_Auto : BYTE ; //Job-Nummer durch Automatikbetrieb
Job_Nr_Eingabe : BYTE ; //Job-Nummer Eingabefeld Visu
Job_Nr_aktiv : BYTE ; //Job-Nummer Rückmeldung aktive Nummer von Kamera
END_STRUCT ;
Dry_Run_Timer : "TON";
Timer_Job_niO : "TON";
Fehlernummer : INT ;
Response_Key_alt : INT ;
Bereit : BOOL ;
Job_Nummer_nio : BOOL ;
Aufnahme_gestartet : BOOL ;
kein_Fehler : BOOL ;
Ergebnis_nOK : BOOL ;
END_VAR
VAR_TEMP
Save_AR1 : DWORD ;
Temp_DWord_1 : DWORD ;
Temp_DWord_2 : DWORD ;
E_Adr_Status : WORD ;
E_Adr_Data : WORD ;
E_Adr_Response : WORD ;
A_Adr_Control : WORD ;
A_Adr_Request : WORD ;
t_RetVal : INT ;
T_ANY_Anzahl_DBB : WORD ;
T_DB_Nr_PraegeCode : WORD ;
T_DB_A_Adr_PraegeCode : DWORD ;
FLA_Start_Aufnahme : BOOL ;
Auftrag_fertig : BOOL ;
Dry_Run_iO : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =Save AR1
TAR1 ;
T #Save_AR1;
NETWORK
TITLE =Visu-Button zurücksetzen, wenn keine Freigabe
ON #Hand;
ON #HMI.Button_Anwahl_Hand;
R #HMI.Button_Anwahl_Hand;
R #HMI.Button_Start_Pruefung;
NETWORK
TITLE =Eingänge auf Instanz-DB schreiben
L #Address;
T #E_Adr_Status;
L 6;
+I ;
T #E_Adr_Data;
L 10;
+I ;
T #E_Adr_Response;
// ===============================
L #Address;
SLW 3;
LAR1 ;
// Fehlerbits laden und dekodieren
L EB [AR1,P#5.0];
L B#16#F;
UW ;
T #Fehlernummer;
NETWORK
TITLE =Status-Signale in Instanz-DB kopieren
CALL "DPRD_DAT" (
LADDR := #E_Adr_Status,
RET_VAL := #t_RetVal,
RECORD := #Out_Kamera.Status);
NOP 0;
NETWORK
TITLE =Data-Signale in Instanz-DB kopieren
CALL "DPRD_DAT" (
LADDR := #E_Adr_Data,
RET_VAL := #t_RetVal,
RECORD := #Out_Kamera.Data);
NOP 0;
NETWORK
TITLE =Response-Signale in Instanz-DB kopieren
CALL "DPRD_DAT" (
LADDR := #E_Adr_Response,
RET_VAL := #t_RetVal,
RECORD := #Out_Kamera.Response);
NOP 0;
NETWORK
TITLE =Poniter für Prägecode schreiben
L P##Praegecode;
TAR2 ;
UD DW#16#FFFFFF;
+D ;
LAR1 ;
L W [AR1,P#2.0];
T #T_ANY_Anzahl_DBB;
L W [AR1,P#4.0];
T #T_DB_Nr_PraegeCode;
L D [AR1,P#6.0];
T #T_DB_A_Adr_PraegeCode;
NETWORK
TITLE =Prägecode für Kamera schreiben
U #Start_Aufnahme;
UN #Aufnahme_gestartet;
SPBN PrCE;
// Telegrammlänge
L DW#16#11;
T #IN_Kamera.Request.Data.TG_Laenge;
// Erweiterter Trigger
L B#16#13;
T #IN_Kamera.Request.Data.Erw_Trigger;
// Anzahlzeichen
L B#16#B;
T #IN_Kamera.Request.Data.Daten_Laenge;
// Prägecode aus Typverwaltung an Kamera senden
AUF DB [#T_DB_Nr_PraegeCode];
LAR1 #T_DB_A_Adr_PraegeCode;
L B [AR1,P#0.0];
T #IN_Kamera.Request.Data.Jahr3;
L B [AR1,P#1.0];
T #IN_Kamera.Request.Data.Jahr4;
L B [AR1,P#2.0];
T #IN_Kamera.Request.Data.Monat1;
L B [AR1,P#3.0];
T #IN_Kamera.Request.Data.Monat2;
L B [AR1,P#4.0];
T #IN_Kamera.Request.Data.Tag1;
L B [AR1,P#5.0];
T #IN_Kamera.Request.Data.Tag2;
L B [AR1,P#6.0];
T #IN_Kamera.Request.Data.Stunde1;
L B [AR1,P#7.0];
T #IN_Kamera.Request.Data.Stunde2;
L B [AR1,P#8.0];
T #IN_Kamera.Request.Data.Minute1;
L B [AR1,P#9.0];
T #IN_Kamera.Request.Data.Minute2;
L B [AR1,P#10.0];
T #IN_Kamera.Request.Data.Sekunde1;
PrCE: NOP 0;
NETWORK
TITLE =kein Fehler
L #Fehlernummer;
L 0;
==I ;
= #kein_Fehler;
NETWORK
TITLE =Fehler quittieren
O #Acknowledge;
O #HMI.Button_Fehler_Quitt;
O #HMI.Button_Reset;
= #IN_Kamera.Control.Reset_Error;
NETWORK
TITLE =Hardware-Trigger deaktivieren
U "VKE_0";
= #IN_Kamera.Control.Dis_HW_Trig;
NETWORK
TITLE =Auftrag fertig, wenn Request+Response-Key identisch
U( ;
L #IN_Kamera.Request.Key;
L #Out_Kamera.Response.Key;
==I ;
) ;
U( ;
L #Out_Kamera.Response.Key;
L #Response_Key_alt;
<>I ;
) ;
U #Aufnahme_gestartet;
= #Auftrag_fertig;
U #Auftrag_fertig;
NOT ;
SPBNB _001;
L #Out_Kamera.Response.Key;
T #Response_Key_alt;
_001: NOP 0;
NETWORK
TITLE =Job-Nummer nio
U( ;
L #IN_Kamera.Control.Job_Nr;
L #Out_Kamera.Status.aktiver_Job;
<>I ;
) ;
U #Frg_Job_Num_wechseln;
UN #IN_Kamera.Control.Reset_Error;
UN #Dry_Run;
= L 34.0;
BLD 103;
CALL #Timer_Job_niO (
IN := L 34.0,
PT := T#5S,
Q := #Job_Nummer_nio);
NOP 0;
NETWORK
TITLE =Kamera bereit für neue Aufgabe
U #Out_Kamera.Status.Ready;
U #Out_Kamera.Status.OP_Mode;
U #kein_Fehler;
UN #Out_Kamera.Status.Trigger_ack;
UN #Out_Kamera.Status.Ch_Job_ack;
UN #Out_Kamera.Status.Sw_Run_ack;
UN #Aufnahme_gestartet;
= #Bereit;
NETWORK
TITLE =Job in Kamera ändern
U( ;
U #Frg_Job_Num_wechseln;
SPBNB _002;
L #Job_Nummer;
T #IN_Kamera.Control.Job_Nr;
SET ;
SAVE ;
CLR ;
_002: U BIE;
) ;
U( ;
L #IN_Kamera.Control.Job_Nr;
L #Out_Kamera.Status.aktiver_Job;
<>I ;
) ;
U #Bereit;
UN #Job_Nummer_nio;
UN #Dry_Run;
= #IN_Kamera.Control.Change_Job;
NETWORK
TITLE =Kamera-Aufnahme starten
U( ;
U #Start_Aufnahme;
UN #HMI.Button_Pruefung_wh;
O ;
U #HMI.Button_Anwahl_Hand;
U #HMI.Button_Start_Pruefung;
) ;
U( ;
L #IN_Kamera.Control.Job_Nr;
L #Out_Kamera.Status.aktiver_Job;
==I ;
) ;
U #Bereit;
UN #HMI.Button_Reset;
UN #Dry_Run;
UN #Aufnahme_gestartet;
= #FLA_Start_Aufnahme;
U #FLA_Start_Aufnahme;
S #Aufnahme_gestartet;
U( ;
UN #Start_Aufnahme;
UN #HMI.Button_Anwahl_Hand;
O ;
U #HMI.Button_Anwahl_Hand;
UN #HMI.Button_Start_Pruefung;
O #HMI.Button_Reset;
O #HMI.Button_Pruefung_wh;
) ;
R #Aufnahme_gestartet;
NOP 0;
NETWORK
TITLE =Kamera-Aufnahme starten durch erhöhen von Key-Request
U #FLA_Start_Aufnahme;
SPBNB _003;
L #IN_Kamera.Request.Key;
L 1;
+I ;
T #IN_Kamera.Request.Key;
_003: NOP 0;
NETWORK
TITLE =Simulation für bauteilloses Fahren
U #Start_Aufnahme;
U #Dry_Run;
= L 34.0;
BLD 103;
CALL #Dry_Run_Timer (
IN := L 34.0,
PT := #Dry_Run_Sim_Time,
Q := #Dry_Run_iO);
NOP 0;
NETWORK
TITLE =Aufnahme iO/niO
U #Aufnahme_gestartet;
U #Auftrag_fertig;
= L 33.0;
U L 33.0;
U #Out_Kamera.Status._12_RDBU;
O #Dry_Run_iO;
= #Aufnahme_OK;
U L 33.0;
UN #Out_Kamera.Status._12_RDBU;
S #Ergebnis_nOK;
UN #Aufnahme_gestartet;
R #Ergebnis_nOK;
U #Ergebnis_nOK;
= #Aufnahme_nOK;
NETWORK
TITLE =NIO-Kennung in Typfachschreiben
U #HMI.Button_Quitt_niO_niO;
U #Ergebnis_nOK;
S #Typ_Daten_Bit;
NETWORK
TITLE =Generate errors
// Errors
O #Job_Nummer_nio;
ON #Out_Kamera.Status.Ready;
ON #Out_Kamera.Status.OP_Mode;
ON #kein_Fehler;
= #Fehler;
// Warninngs
O #Aufnahme_nOK;
= #Warnung;
NETWORK
TITLE =Write Data to Outputs
L #Address;
T #A_Adr_Control;
L 16;
+I ;
T #A_Adr_Request;
NETWORK
TITLE =Control-Signale zur Kamera-Kamera
CALL "DPWR_DAT" (
LADDR := #A_Adr_Control,
RECORD := #IN_Kamera.Control,
RET_VAL := #t_RetVal);
NOP 0;
NETWORK
TITLE =Request-Signale zur Kamera-Kamera
CALL "DPWR_DAT" (
LADDR := #A_Adr_Request,
RECORD := #IN_Kamera.Request,
RET_VAL := #t_RetVal);
NOP 0;
NETWORK
TITLE =Restore AR1
L #Save_AR1;
LAR1 ;
END_FUNCTION_BLOCK
Dieser Baustein sorgt dafür das eine Kamera Bilder von Objekten macht.
Jetzt haben wir die gleiche Kamera nochmal bekommen und haben sie genauso mit eingebunden wie die andere.
Mein Problem ist jetzt das die 1. Kamera immer noch funktioniert aber die 2. nicht. Hänge ich den FB10 für die 1. Kamera ab funktioniert die 2.
Im FB10 wird mit SFC14 und 15 gearbeitet. Und soviel ich weiß liegt es daran das der SFC15 beim 2. FB10 Aufruf die Ausgangsdaten falsch beschreibt.
Hat jemand von Euch Erfahrung mit SFC14 und 15 wenn mehrere Instanzen aufgerufen werden.
Was muss jetzt an dem FB10 geändert werden für die neue Situation.
Die richtige Adresse aus der Hardwarekonfiguration wird jedem FB10 Aufruf als Integer Wert übergeben.
Angeblich spielt das AR2 eine große Rolle wenn man Eingänge auf den IDB lädt und vom IDB wieder die Ausgänge beschreibt.
Es wäre toll wenn mir einer von Euch helfen könnte. Mit Adressregister zu Arbeiten ist nicht meine Stärke.
Vielen Dank
Mfg Tommylik
Zuletzt bearbeitet: