Step 7 Laser MD-X1000C von Keyence mit Profinet

trabajador73

Level-2
Beiträge
112
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

verwendet wird ein Laser MD-X1000C von Keyence und der Datenaustausch erfolgt mit Profinet und einer CPU 317-2 PN/DP.

Wenn ein Datentransfer mit dem Ausgang A205.2 „String_Change_Request“ angeregt wird, dann sollte nach einer Datenübernahme die Bestätigung vom Laser erfolgen mittels dem Eingang E212.2 „String_Change_Complete“. Jedoch dieser kommt nicht. Was könnte die Bestätigung verhindern bzw. was ist an der FB-Programmierung zu ändern?
Die Clearbits wurde auch in verschiedener Variation aktiviert, jedoch die gewünschte Rückmeldung blieb aus.
Eine Programmwahländerung hat funktioniert. Angehängt sind die wesentlichen NW und eine Keyence-Erläuterung.
Danke für Euere Unterstützung und jeden Beitrag.
 

Anhänge

  • MD-X1000_1500_Prof_UM_420DE_252006_G_1095-3a_Profinet.pdf
    1,5 MB · Aufrufe: 119
  • FB_Laser_MD_X1000C.pdf
    1,9 MB · Aufrufe: 93
Ich habe das komplett anders in Erinnerung - ich muss mal schauen, ob ich die Unterlagen dazu noch habe.
Der Ablauf ist eine State-Machine mit ein paar mehr Schritten - die Doku von Keyence zu dem Thema ist allerdings sehr dürftig.

Was willst du denn genau machen ? Einen String an der Laser senden oder einen vom Laser einlesen ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
danke für den Austausch. Also es sollen für alle Blöcke nacheinander die zu druckenden Daten an den Laser gesendet werden, was mit dem Befehl "String Change Request" praktiziert wird.
Zuerst wird ein Programm ausgewählt, dann die Blocknummer in AD220 und in die Datenlänge des Strings in AW224 und die Daten ab AB226 an den Laser gesendet.
Zudem sind noch spezifische Clearbits zu aktivieren für den Datentransfer von SPS zu Laser.
Eine Anforderung an den Laser mittels den Kommando "Command Send Request" ist zwar auch erforderlich, jedoch erst einmal soll mittels einer FUB bzw. KOP-Struktur der normale Datentransfer vor einer Markierung erfolgen.
 
Ich werde mal schauen ob ich das MD-X-Projekt noch greifen kann ...
Generell habe ich das aber so in Erinnerung :
- Laser in der "richtigen" Betriebszustand dafür bringen
- String aus der SPS in den richtigen Speicherbereich für den Datenaustausch zum Laser schreiben. Ggf. den String noch mit Chr(0) terminieren (weiß ich nicht mehr).
- Send-Bit setzen
- Bestätigung für abfragen
- Sende-Bit löschen (und ggf. sogar einen Clear für den Befehl setzen)
- Bestätigung dafür abfragen

Ich meine mich erinnern zu können, dass die String zum Laser in einen der Blöcke deines Layout's geschrieben wurden. Du mußt also auf alle Fälle auch noch die richtige Blocknummer mit übergeben.
Allerdings - das, was ich suche habe ich in der von dir verlinkten Anleitung nicht gefunden ... ich hatte aber damals nur Anfangsprobleme damit - es muss u.U. also noch eine weitere Anleitung mit mehr Informationen zu dem Datenaustausch mit dem Laser geben ...

Gruß
Larry
 
Nachtrag :
Ich habe kein Programm-Beispiel für den MD-X mehr greifbar - sorry.
Ich bleibe aber dabei, dass du ggf. noch nicht die so ganz richtige Anleitung für dein Vorhaben hast. Ggf. solltest du Keyence dazu noch einmal kontaktieren ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kommando zurück - ich habe den FB dann doch gefunden ... (ist in SCL vom Step7-Classic - läßt sich aber auch in TIA in einem nicht-optimierten FB genauso umsetzen)
Ich schlage vor, du schaust dir das Ding mal an und Frage beantworte ich dann dazu ...

Code:
FUNCTION_BLOCK FB313 
TITLE   = 'UP Steuern Keyence-Laser MDX'        // UP Keyence MDX-Laser steuern (PN-Interface)
AUTHOR  : 'Larry'
VERSION : '0.3'   //   17.12.2015
KNOW_HOW_PROTECT
VAR_INPUT
   Steuer_Befehle          : BOOL ; 
   _CMD_Laser_beschriften  : BOOL ;       // CMD : Laser Start Beschriftung
   _CMD_Set_Layout         : BOOL ;       // CMD : Layout-Anwahl an den Laser übergeben
   _CMD_Set_Beschriftung   : BOOL ;       // CMD : Beschriftungstext in den Beschriftungsblock des Lasers übergeben
   _CMD_Set_DateTime       : BOOL ;       // CMD : Datum und Uhrzeit der SPS an den Laser übergeben  
   _CMD_Quit               : BOOL ;       // CMD : Quittierung Fehler etc.
   Daten                   : BOOL ;
   _Layout_Index           : INT := 0   ; // Index-Nummer der Layout-Datei
   _Beschriftungs_Text     : STRING[100] := 'Test RM' ; // Inhalt der Beschriftung (falls verwendet)
   _Beschriftungs_Block    : INT := -1  ; // Block-Nummer für den Beschriftungs-Text  (-1 : keinen Text übetragen)
   _SPS_Datum              : DATE ;       // System-Datum der SPS
   _SPS_Uhrzeit            : TOD ;        // System-Uhrzeit der SPS
   Koppeladressen_E        : BOOL ;
   _PerE_MachineStatus     : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Machine Status"
   _PerE_FunctionStatus    : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Function Status"
   _PerE_CompletionStatus  : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Completion Status"
   _PerE_Operate_Parameter : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Operate Parameters"
   Koppeladressen_A        : BOOL ;
   _PerA_Generel_Req       : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Generel Request"
   _PerA_Function_Req      : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Function Request"
   _PerA_CompletionClr_Req : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Completion Clear Request"
   _PerA_Req_Parameter     : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Request Parameter"
   _PerA_Req_Data          : INT ;        // 1. Perepherie-Adresse des Laser-Koppelbereichs "Request Data"
   Laser_RM                : BOOL ;      
   _RM_PN_Slave_OK         : BOOL ;       // der ProfiNet-Slave des Lasers ist OK
END_VAR
VAR_IN_OUT
  Init                     : BOOL := false ; // Baustein initialisieren
END_VAR
VAR_OUTPUT
   Meldungen               : BOOL ;
   _Einschalten_laeuft     : BOOL ;   // MSG : Einschalten / Hochfahren des Lasers ist gestartet
   _Laser_eingeschaltet    : BOOL ;   // MSG : der Laser ist eingeschaltet
   _Laser_Emission_OK      : BOOL ;   // MSG : die Strahlquelle ist bereit
   _Markieren_laeuft       : BOOL ;   // MSG : Beschriftung läuft
   _Markieren_fertig       : BOOL ;   // MSG : Beschriftung beendet
   
   _Layout_geladen         : BOOL ;   // MSG : Layout-Datei vom Laser geladen
   _Beschriftung_geladen   : BOOL ;   // MSG : Beschriftungs-Text vom Laser geladen
   _DateTime_geladen       : BOOL ;   // MSG : Datum und Uhrzeit vom Laser geladen
   
   _Laser_Fehler           : BOOL ;   // MSG : Laser-Fehler
END_VAR
 
CONST
   // Schrittketten Enum's
   enum_SK_bereit           := 0 ;
   enum_SK_beendet          := 999 ;
   
   enum_Prg_none            := 0 ;
   enum_Prg_setLayout       := 1 ;  
   enum_Prg_setBeschriftung := 2 ;  
   enum_Prg_setDateTime     := 3 ; 
   enum_Prg_Aktivierung     := 10 ; 
   enum_Prg_Beschriftung    := 11 ;
   
END_CONST
 
VAR
  
// Koppelbereiche Laser
   Read_Data : STRUCT    
      MachineStatus : STRUCT
         Ready                       : BOOL ;    // - 
         Error                       : BOOL ;    // -    
         Warning                     : BOOL ;    // -    
         Notice                      : BOOL ;    // -    
         Shutter                     : BOOL ;    // -
         Start_Up                    : BOOL ;    // -
         x06                         : BOOL ;    // -
         x07                         : BOOL ;    // - 
                             
         Laser_Emit                  : BOOL ;    // -
         Shutter_Control             : BOOL ;    // -                      
         Remote_Interlock            : BOOL ;    // -                      
         Contacter                   : BOOL ;    // -   
         x14                         : BOOL ;    // -
         x15                         : BOOL ;    // - 
         x16                         : BOOL ;    // -
         x17                         : BOOL ;    // - 
                    
         Busy                        : BOOL ;    // -                      
         Print_Busy                  : BOOL ;    // -                      
         Guide_Print_Busy            : BOOL ;    // -                      
         Change_Busy                 : BOOL ;    // -                      
         Lock_Busy                   : BOOL ;    // -                      
         Edit_Busy                   : BOOL ;    // -                      
         Code_Reader_Busy            : BOOL ;    // -                      
         x27                         : BOOL ;    // -
        
         x30                         : BOOL ;    // - 
         x31                         : BOOL ;    // - 
         x32                         : BOOL ;    // - 
         x33                         : BOOL ;    // - 
         x34                         : BOOL ;    // - 
         x35                         : BOOL ;    // - 
         x36                         : BOOL ;    // - 
         x37                         : BOOL ;    // - 
      END_STRUCT ;
    
      FunctionStatus : STRUCT
         Trigger_Lock_iState         : BOOL ;    // - 
         OperationMode_iState        : BOOL ;    // -    
         Laser_Control_iState        : BOOL ;    // -    
         Date_hold_iState            : BOOL ;    // -    
         x04                         : BOOL ;    // -
         x05                         : BOOL ;    // -
         x06                         : BOOL ;    // -
         x07                         : BOOL ;    // - 
                             
         Date_hold_attached          : BOOL ;    // -
         Counter_End1                : BOOL ;    // -                      
         Counter_End2                : BOOL ;    // -                      
         Counter_End3                : BOOL ;    // -                      
         Counter_End4                : BOOL ;    // -                      
         DMC_CodeResult_IO           : BOOL ;    // -                      
         DMC_CodeResult_NIO          : BOOL ;    // -                      
         x17                         : BOOL ;    // - 
        
         x20                         : BOOL ;    // - 
         x21                         : BOOL ;    // - 
         x22                         : BOOL ;    // - 
         x23                         : BOOL ;    // - 
         x24                         : BOOL ;    // - 
         x25                         : BOOL ;    // - 
         x26                         : BOOL ;    // - 
         x27                         : BOOL ;    // - 
        
         x30                         : BOOL ;    // - 
         x31                         : BOOL ;    // - 
         x32                         : BOOL ;    // - 
         x33                         : BOOL ;    // - 
         x34                         : BOOL ;    // - 
         x35                         : BOOL ;    // - 
         x36                         : BOOL ;    // - 
         x37                         : BOOL ;    // - 
      END_STRUCT ;
    
      CompletionStatus : STRUCT
         Print_Complete              : BOOL ;    // - 
         Guide_Print_Complete        : BOOL ;    // -    
         Print_Stop_Complete         : BOOL ;    // -    
         Error_Clear_Complete        : BOOL ;    // -    
         Code_Read_Complete          : BOOL ;    // -
         x05                         : BOOL ;    // -
         x06                         : BOOL ;    // -
         x07                         : BOOL ;    // - 
                             
         Edit_Complete               : BOOL ;    // -
         x11                         : BOOL ;    // -
         x12                         : BOOL ;    // -
         x13                         : BOOL ;    // - 
         x14                         : BOOL ;    // -
         x15                         : BOOL ;    // -
         x16                         : BOOL ;    // - 
         x17                         : BOOL ;    // - 
        
         Prg_Chg_Complete            : BOOL ;    // -                      
         Rank_Chg_Complete           : BOOL ;    // -                      
         CounterNr_Chg_Complete      : BOOL ;    // -                      
         CounterVal_Chg_Complete     : BOOL ;    // -                      
         Count_Up_Complete           : BOOL ;    // -                      
         Count_Dn_Complete           : BOOL ;    // -                      
         Counter_Reset_Complete      : BOOL ;    // -                      
         x27                         : BOOL ;    // - 
        
         x30                         : BOOL ;    // -
         x31                         : BOOL ;    // -
         x32                         : BOOL ;    // -
         x33                         : BOOL ;    // - 
         x34                         : BOOL ;    // -
         x35                         : BOOL ;    // -
         x36                         : BOOL ;    // - 
         x37                         : BOOL ;    // - 
         CharStr_ReadReq_Complete    : BOOL ;    // -                      
         CharStr_Print_Complete      : BOOL ;    // -                      
         CharStr_Change_Complete     : BOOL ;    // -                      
         x43                         : BOOL ;    // - 
         x44                         : BOOL ;    // -
         x45                         : BOOL ;    // -
         x46                         : BOOL ;    // - 
         x47                         : BOOL ;    // - 
        
         x50                         : BOOL ;    // -
         x51                         : BOOL ;    // -
         x52                         : BOOL ;    // -
         x53                         : BOOL ;    // - 
         x54                         : BOOL ;    // -
         x55                         : BOOL ;    // -
         x56                         : BOOL ;    // - 
         x57                         : BOOL ;    // - 
        
         x60                         : BOOL ;    // -
         x61                         : BOOL ;    // -
         x62                         : BOOL ;    // -
         x63                         : BOOL ;    // - 
         x64                         : BOOL ;    // -
         x65                         : BOOL ;    // -
         x66                         : BOOL ;    // - 
         x67                         : BOOL ;    // - 
         Command_Req_Complete        : BOOL ;    // -
         x71                         : BOOL ;    // -
         x72                         : BOOL ;    // -
         x73                         : BOOL ;    // - 
         x74                         : BOOL ;    // -
         x75                         : BOOL ;    // -
         x76                         : BOOL ;    // - 
         x77                         : BOOL ;    // - 
      END_STRUCT ;
      Operate_Parameters : STRUCT
         akt_Programm_Nr             : INT ;    // -    
         Zaehler_Nr                  : INT ;    // -  
         Zahlerwert                  : INT ;    // -  
         Rank_Nr                     : INT ;    // -  
      END_STRUCT ;
   END_STRUCT ;
    
   at_Read_Data AT Read_Data : STRUCT    
      MachineStatus       : DWORD ; 
      FunctionStatus      : DWORD ; 
      CompletionStatus    : ARRAY [1..2] OF DWORD ;  
      Operate_Parameters  : ARRAY [1..2] OF DWORD ;   
   END_STRUCT ;
    
   Write_Data : STRUCT     
      Generel_Request : STRUCT
         Print                       : BOOL ;    // - 
         Guide_Print                 : BOOL ;    // -    
         Print_Stop                  : BOOL ;    // -    
         Error_Clear                 : BOOL ;    // -    
         Code_Read                   : BOOL ;    // -
         x05                         : BOOL ;    // -
         x06                         : BOOL ;    // -
         x07                         : BOOL ;    // - 
        
         x10                         : BOOL ;    // -
         x11                         : BOOL ;    // -
         x12                         : BOOL ;    // -
         x13                         : BOOL ;    // - 
         x14                         : BOOL ;    // -
         x15                         : BOOL ;    // -
         x16                         : BOOL ;    // - 
         x17                         : BOOL ;    // - 
                             
         Prg_ChangeReq               : BOOL ;    // -
         Rank_ChangeReq              : BOOL ;    // -                      
         Counter_Nr_ChangeReq        : BOOL ;    // -                      
         Counter_Val_ChangeReq       : BOOL ;    // -                      
         Count_Up_Req                : BOOL ;    // -                      
         Count_Dn_Req                : BOOL ;    // -                      
         Counter_Reset_Req           : BOOL ;    // -                      
         x27                         : BOOL ;    // - 
        
         x30                         : BOOL ;    // -
         x31                         : BOOL ;    // -
         x32                         : BOOL ;    // -
         x33                         : BOOL ;    // - 
         x34                         : BOOL ;    // -
         x35                         : BOOL ;    // -
         x36                         : BOOL ;    // - 
         x37                         : BOOL ;    // - 
        
         x40                         : BOOL ;    // -
         x41                         : BOOL ;    // -
         x42                         : BOOL ;    // -
         x43                         : BOOL ;    // - 
         x44                         : BOOL ;    // -
         x45                         : BOOL ;    // -
         x46                         : BOOL ;    // - 
         x47                         : BOOL ;    // - 
        
         CharString_Read_Req         : BOOL ;    // -                      
         CharString_Print_Req        : BOOL ;    // -                      
         CharString_Change_Req       : BOOL ;    // -                      
         x53                         : BOOL ;    // - 
         x54                         : BOOL ;    // -
         x55                         : BOOL ;    // -
         x56                         : BOOL ;    // - 
         x57                         : BOOL ;    // - 
        
         x60                         : BOOL ;    // -
         x61                         : BOOL ;    // -
         x62                         : BOOL ;    // -
         x63                         : BOOL ;    // - 
         x64                         : BOOL ;    // -
         x65                         : BOOL ;    // -
         x66                         : BOOL ;    // - 
         x67                         : BOOL ;    // - 
        
         Command_Req                 : BOOL ;    // -                      
         x71                         : BOOL ;    // -                      
         x72                         : BOOL ;    // -                      
         x73                         : BOOL ;    // - 
         x74                         : BOOL ;    // -
         x75                         : BOOL ;    // -
         x76                         : BOOL ;    // - 
         x77                         : BOOL ;    // - 
      END_STRUCT ;
    
      Function_Request : STRUCT
         Trigger_Lock_Req            : BOOL ;    // - 
         Machine_Dis_Req             : BOOL ;    // -    
         Laser_Control_Req           : BOOL ;    // -    
         Date_hold_Req               : BOOL ;    // -    
         x04                         : BOOL ;    // -
         x05                         : BOOL ;    // -
         x06                         : BOOL ;    // -
         x07                         : BOOL ;    // - 
                             
         x10                         : BOOL ;    // -
         x11                         : BOOL ;    // -                      
         x12                         : BOOL ;    // -                      
         x13                         : BOOL ;    // -                      
         x14                         : BOOL ;    // -                      
         x15                         : BOOL ;    // -                      
         x16                         : BOOL ;    // -                      
         x17                         : BOOL ;    // - 
        
         x20                         : BOOL ;    // - 
         x21                         : BOOL ;    // - 
         x22                         : BOOL ;    // - 
         x23                         : BOOL ;    // - 
         x24                         : BOOL ;    // - 
         x25                         : BOOL ;    // - 
         x26                         : BOOL ;    // - 
         x27                         : BOOL ;    // - 
        
         x30                         : BOOL ;    // - 
         x31                         : BOOL ;    // - 
         x32                         : BOOL ;    // - 
         x33                         : BOOL ;    // - 
         x34                         : BOOL ;    // - 
         x35                         : BOOL ;    // - 
         x36                         : BOOL ;    // - 
         x37                         : BOOL ;    // - 
      END_STRUCT ;
    
      CompletionClr_Request : STRUCT
         Print_Complete              : BOOL ;    // - 
         Guide_Print_Complete        : BOOL ;    // -    
         Print_Stop_Complete         : BOOL ;    // -    
         Error_Clear_Complete        : BOOL ;    // -    
         Code_Read_Complete          : BOOL ;    // -
         x05                         : BOOL ;    // -
         x06                         : BOOL ;    // -
         x07                         : BOOL ;    // - 
                             
         Edit_Complete               : BOOL ;    // -
         Time_Update                 : BOOL ;    // -
         x12                         : BOOL ;    // -
         x13                         : BOOL ;    // - 
         x14                         : BOOL ;    // -
         x15                         : BOOL ;    // -
         x16                         : BOOL ;    // - 
         x17                         : BOOL ;    // - 
        
         Prg_Chg_Complete            : BOOL ;    // -                      
         Rank_Chg_Complete           : BOOL ;    // -                      
         CounterNr_Chg_Complete      : BOOL ;    // -                      
         CounterVal_Chg_Complete     : BOOL ;    // -                      
         Count_Up_Complete           : BOOL ;    // -                      
         Count_Dn_Complete           : BOOL ;    // -                      
         Counter_Reset_Complete      : BOOL ;    // -                      
         x27                         : BOOL ;    // - 
        
         x30                         : BOOL ;    // -
         x31                         : BOOL ;    // -
         x32                         : BOOL ;    // -
         x33                         : BOOL ;    // - 
         x34                         : BOOL ;    // -
         x35                         : BOOL ;    // -
         x36                         : BOOL ;    // - 
         x37                         : BOOL ;    // - 
         CharStr_ReadReq_Complete    : BOOL ;    // -                      
         CharStr_PrintReq_Complet    : BOOL ;    // -                      
         CharStr_ChgReq_Complete     : BOOL ;    // -                      
         x43                         : BOOL ;    // - 
         x44                         : BOOL ;    // -
         x45                         : BOOL ;    // -
         x46                         : BOOL ;    // - 
         x47                         : BOOL ;    // - 
        
         x50                         : BOOL ;    // -
         x51                         : BOOL ;    // -
         x52                         : BOOL ;    // -
         x53                         : BOOL ;    // - 
         x54                         : BOOL ;    // -
         x55                         : BOOL ;    // -
         x56                         : BOOL ;    // - 
         x57                         : BOOL ;    // - 
        
         x60                         : BOOL ;    // -
         x61                         : BOOL ;    // -
         x62                         : BOOL ;    // -
         x63                         : BOOL ;    // - 
         x64                         : BOOL ;    // -
         x65                         : BOOL ;    // -
         x66                         : BOOL ;    // - 
         x67                         : BOOL ;    // - 
         Command_Req_Complete        : BOOL ;    // -
         x71                         : BOOL ;    // -
         x72                         : BOOL ;    // -
         x73                         : BOOL ;    // - 
         x74                         : BOOL ;    // -
         x75                         : BOOL ;    // -
         x76                         : BOOL ;    // - 
         x77                         : BOOL ;    // - 
      END_STRUCT ;
 
      Parameter_Nr : DINT ; 
      
      Parameter_Data : STRUCT
         Size                        : INT ;    
         Inhalt                      : ARRAY [0..127] OF BYTE ;   
      END_STRUCT ;
   END_STRUCT ;
    
   at_Write_Data AT Write_Data : STRUCT     
      Generel_Request        : ARRAY [1..2] OF DWORD ;  
      Function_Request       : DWORD ; 
      CompletionClr_Request  : ARRAY [1..2] OF DWORD ;  
      Parameter_Nr           : DWORD ;    
      Parameter_Data         : ARRAY [0..64] OF WORD ;   
   END_STRUCT ;

   LaserStatus  : STRUCT 
      Init_OK                : BOOL ;   // der Baustein ist initialisiert
       
      Markieren_aktiv        : BOOL ;   // Beschriftung läuft
      Markieren_fertig       : BOOL ;   // Beschriftung beendet
       
      Layout_geaendert       : BOOL ;   // die Layout-Datei hat sich geändert
      Layout_geladen         : BOOL ;   // Layout  geladen
      Beschriftung_geaendert : BOOL ;   // der Beschriftungs-Text hat sich geändert
      Beschriftung_geladen   : BOOL ;   // Beschriftung geladen
       
      deaktivieren           : BOOL ;   // Anwahl : Laser de-aktivieren
      aktivieren             : BOOL ;   // Anwahl : Laser aktivieren
       
      Laser_Ein              : BOOL ;   // Laser eingeschaltet
      Laser_Trigger          : BOOL ;   // RM Laser getriggert
      Shutter_Open           : BOOL ;   // RM Shutter öffnen
      Emission               : BOOL ;   // RM Laser-Emission möglich
      Fehler                 : BOOL ;   // RM Störung / Fehler beim Laser
   END_STRUCT ;
    
   Save_Daten : STRUCT       
      Layout_Index  : INT := 0 ;
      Beschriftung  : STRING [100] := '' ; 
   END_STRUCT ;
   
   at_Save_Daten AT Save_Daten : STRUCT       
      Layout_Index : INT ;
      
      Beschriftung  : STRUCT 
         Total  : BYTE ;
         Length : BYTE ;
         Chars  : ARRAY [1..100] OF BYTE ;
      END_STRUCT ;
   END_STRUCT ;
   
   AblaufPrg : STRUCT
      aktiv           : INT := enum_Prg_none ;   // Index des gewählten aktiven Programm-Teils
      
      setLayout       : INT := enum_SK_bereit ;  // Programmteil um das Layout im Laser umzuwählen
      setBeschriftung : INT := enum_SK_bereit ;  // Programmteil um einen benutzer-definierten Beschriftungstext an den Laser zu übertragen
      setDateTime     : INT := enum_SK_bereit ;  // Programmteil um das Datum/die Uhrzeit der SPS an den Laser zu übertragen
      
      Beschriftung    : INT := enum_SK_bereit ;  // Ablauf Beschriftung
   END_STRUCT ;
    
   erster_Start : STRUCT            // der Baustein wird das erste Mal (nach Neustart oder Init) benutzt
      setLayout       : BOOL := true ;  // Programmteil um das Layout im Laser umzuwählen
      setBeschriftung : BOOL := true ;  // Programmteil um einen benutzer-definierten Beschriftungstext an den Laser zu übertragen
      setDateTime     : BOOL := true ;  // Programmteil um das Datum/die Uhrzeit der SPS an den Laser zu übertragen
   END_STRUCT ;
     
   Impuls_Timer : SFB4 ;
   
END_VAR     

VAR_TEMP
  i , L , Error : INT ;
  
  TT, MM , JJ , WT , JT , KW , SJ : INT ;
  H, M , S , MS                   : INT ;
  
  xf : BOOL ;
END_VAR
 
Fortsetzung vom Code :
Code:
BEGIN 
//    Perepherie-Daten laden  
at_Read_Data.MachineStatus         := PED[_PerE_MachineStatus] ;
at_Read_Data.FunctionStatus        := PEW[_PerE_FunctionStatus] ;
at_Read_Data.CompletionStatus[1]   := PED[_PerE_CompletionStatus +0] ;
at_Read_Data.CompletionStatus[2]   := PED[_PerE_CompletionStatus +4] ;
at_Read_Data.Operate_Parameters[1] := PED[_PerE_Operate_Parameter +0] ;
at_Read_Data.Operate_Parameters[2] := PED[_PerE_Operate_Parameter +4] ;LaserStatus.Shutter_Open  := Read_Data.MachineStatus.Shutter ;
LaserStatus.Fehler        := Read_Data.MachineStatus.Error ;
LaserStatus.Laser_Trigger := Read_Data.MachineStatus.Print_Busy ;

//    Baustein initialisieren  
IF Init THEN
   AblaufPrg.aktiv           := enum_Prg_none ;  
       
   AblaufPrg.setLayout       := enum_SK_bereit ;  
   AblaufPrg.setBeschriftung := enum_SK_bereit ;  
   AblaufPrg.setDateTime     := enum_SK_bereit ; 
      
   AblaufPrg.Beschriftung    := enum_SK_bereit ;
   
   LaserStatus.Init_OK       := true ;
   
   erster_Start.setLayout       := true ;
   erster_Start.setBeschriftung := true ;
   erster_Start.setDateTime     := true ;
   
   at_Write_Data.Generel_Request[1] := 0 ;
   at_Write_Data.Generel_Request[2] := 0 ;
   
   at_Write_Data.CompletionClr_Request[1] := 0 ;
   at_Write_Data.CompletionClr_Request[2] := 0 ;
   
   Init := false ;
END_IF ;

//    Layout setzen / Programm-Nummer umwählen  
IF (AblaufPrg.aktiv = enum_Prg_none) OR (AblaufPrg.aktiv = enum_Prg_setLayout) THEN // Verriegelung gegen andere Abläufe
    CASE AblaufPrg.setLayout OF
        enum_SK_bereit :
            IF _CMD_Set_Layout THEN 
               AblaufPrg.aktiv := enum_Prg_setLayout ;
               AblaufPrg.setLayout := 1 ;
            END_IF ;
        1 : // neue Layout-Nummer schreiben
            Save_Daten.Layout_Index := _Layout_Index ;
            Write_Data.Parameter_Nr := INT_TO_DINT(_Layout_Index) ;
               PAD[_PerA_Req_Parameter] := at_Write_Data.Parameter_Nr ; 
            AblaufPrg.setLayout := 2 ;  
        2 : // Steuerbit für Daten-Übernahme an Laser setzen
            Write_Data.Generel_Request.Prg_ChangeReq := true ;
            AblaufPrg.setLayout := 3 ;
        3 : // Feedback abfragen und auswerten - Daten-Übernahme quittieren
            IF Read_Data.CompletionStatus.Prg_Chg_Complete THEN 
               Write_Data.Generel_Request.Prg_ChangeReq := false ;
               at_Read_Data.Operate_Parameters[1] := PED[_PerE_Operate_Parameter] ;
               IF Read_Data.Operate_Parameters.akt_Programm_Nr = _Layout_Index THEN
                  Write_Data.Generel_Request.Prg_ChangeReq := false ;
                  Write_Data.CompletionClr_Request.Prg_Chg_Complete := true ;
                  AblaufPrg.setLayout := 4 ;
               END_IF ;   
            END_IF ; 
        4 : // Feedback abfragen
            IF NOT Read_Data.CompletionStatus.Prg_Chg_Complete THEN 
               Write_Data.CompletionClr_Request.Prg_Chg_Complete := false ;
               erster_Start.setLayout := false ;
               AblaufPrg.setLayout := enum_SK_beendet ;
            END_IF ; 
        enum_SK_beendet : // fertig
            IF NOT _CMD_Set_Layout THEN 
               AblaufPrg.aktiv := enum_Prg_none ;
               AblaufPrg.setLayout := enum_SK_bereit ;
            END_IF ;
    END_CASE ;
END_IF ; 
_Layout_geladen := (Save_Daten.Layout_Index = _Layout_Index) AND ((AblaufPrg.setLayout = enum_SK_bereit) or (AblaufPrg.setLayout = enum_SK_beendet)) ;
LaserStatus.Layout_geladen := _Layout_geladen ;

//    Beschriftungstext übertragen  
IF (AblaufPrg.aktiv = enum_Prg_none) OR (AblaufPrg.aktiv = enum_Prg_setBeschriftung) THEN  // Verriegelung gegen andere Abläufe
    CASE AblaufPrg.setBeschriftung OF
        enum_SK_bereit :
            IF _CMD_Set_Beschriftung THEN 
               AblaufPrg.aktiv := enum_Prg_setBeschriftung ;
               AblaufPrg.setBeschriftung := 1 ;
            END_IF ;
        1 :
            Save_Daten.Beschriftung := _Beschriftungs_Text ;
      //      Save_Daten.Beschriftung := 'dies ist ein Test' ;
            IF _Beschriftungs_Block < 0 THEN  // keinen Text setzen
               AblaufPrg.setBeschriftung := enum_SK_beendet ;
            ELSE
               // Block-Nr. wählen
               Write_Data.Parameter_Nr := INT_TO_DINT(_Beschriftungs_Block) ;
                  PAD[_PerA_Req_Parameter] := at_Write_Data.Parameter_Nr ; 
               // Beschriftungs-Text übergeben
               L := BYTE_TO_INT(at_Save_Daten.Beschriftung.Length) ;
               FOR i := 1 TO L BY 1 do
                  Write_Data.Parameter_Data.Inhalt[i-1] := at_Save_Daten.Beschriftung.Chars[i] ;
               END_FOR ;
               Write_Data.Parameter_Data.Size := L ;
               FOR i := L TO 127 BY 1 do
                  Write_Data.Parameter_Data.Inhalt[i] := 0 ;
               END_FOR ;
               FOR i := 0 TO 64 BY 1 DO
                  PAW[i*2 + _PerA_Req_Data] := at_Write_Data.Parameter_Data[i] ; 
               END_FOR ;
 
               AblaufPrg.setBeschriftung := 2 ;
            END_IF ;   
        2 : // Steuerbit für Daten-Übernahme an Laser setzen
            Write_Data.Generel_Request.CharString_Change_Req := true ;
            AblaufPrg.setBeschriftung := 3 ;
        3 : // Feedback abfragen und auswerten - Daten-Übernahme quittieren
            IF Read_Data.CompletionStatus.CharStr_Change_Complete THEN 
               Write_Data.Generel_Request.CharString_Change_Req := false ;  
               Write_Data.CompletionClr_Request.CharStr_ChgReq_Complete := true ;
               AblaufPrg.setBeschriftung := 4 ;
            END_IF ; 
        4 : // Feedback abfragen
            IF NOT Read_Data.CompletionStatus.CharStr_Change_Complete THEN 
               Write_Data.CompletionClr_Request.CharStr_ChgReq_Complete := false ;
               erster_Start.setDateTime := false ;
               AblaufPrg.setBeschriftung := enum_SK_beendet ;
            END_IF ; 
       enum_SK_beendet :
            IF NOT _CMD_Set_Beschriftung THEN 
               AblaufPrg.aktiv := enum_Prg_none ;
               AblaufPrg.setBeschriftung := enum_SK_bereit ;
            END_IF ;
    END_CASE ;
END_IF ; 
_Beschriftung_geladen := EQ_STRNG(S1:=Save_Daten.Beschriftung , S2:=_Beschriftungs_Text) AND ((AblaufPrg.setBeschriftung = enum_SK_bereit) or (AblaufPrg.setBeschriftung = enum_SK_beendet)) ;
LaserStatus.Beschriftung_geladen := _Beschriftung_geladen ;

//    Datum und Uhrzeit übertragen  
IF (AblaufPrg.aktiv = enum_Prg_none) OR (AblaufPrg.aktiv = enum_Prg_setDateTime) THEN  // Verriegelung gegen andere Abläufe
    CASE AblaufPrg.setDateTime OF
        enum_SK_bereit :
            IF _CMD_Set_DateTime THEN 
               AblaufPrg.aktiv := enum_Prg_setDateTime ;
               AblaufPrg.setDateTime := 1 ;
            END_IF ;
        1 : // Systemuhr auslesen und Daten in Übertragungspuffer schreiben
            Conv_Date_TTMMJJ (IN_Date := _SPS_Datum
                             ,Jahr  := JJ
                             ,Monat := MM
                             ,Tag   := TT
                             ,Wochentag     := WT
                             ,Schaltjahr    := SJ
                             ,Jahrestag     := JT
                             ,Kalenderwoche := KW
                             ) ; 
            Conv_TOD_HHMMSS  (IN_Uhrzeit := _SPS_Uhrzeit
                             ,Stunden       := H
                             ,Minuten       := M
                             ,Sekunden      := S
                             ,Millisekunden := MS
                             ) ;
 //           JJ := JJ-2 ; TT := TT-2 ; H := H-2 ;
            
            Write_Data.Parameter_Data.Inhalt[00] := CHAR_TO_BYTE('D') ;
            Write_Data.Parameter_Data.Inhalt[01] := CHAR_TO_BYTE('A') ;
            Write_Data.Parameter_Data.Inhalt[02] := CHAR_TO_BYTE(',') ;
            Write_Data.Parameter_Data.Inhalt[03] := INT_TO_BYTE(((JJ / 1000) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[04] := INT_TO_BYTE(((JJ /  100) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[05] := INT_TO_BYTE(((JJ /   10) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[06] := INT_TO_BYTE(((JJ /    1) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[07] := CHAR_TO_BYTE(',') ;
            Write_Data.Parameter_Data.Inhalt[08] := INT_TO_BYTE(((MM /   10) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[09] := INT_TO_BYTE(((MM /    1) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[10] := CHAR_TO_BYTE(',') ;
            Write_Data.Parameter_Data.Inhalt[11] := INT_TO_BYTE(((TT /   10) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[12] := INT_TO_BYTE(((TT /    1) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[13] := CHAR_TO_BYTE(',') ;
            Write_Data.Parameter_Data.Inhalt[14] := INT_TO_BYTE(((H / 10) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[15] := INT_TO_BYTE(((H /  1) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[16] := CHAR_TO_BYTE(',') ;
            Write_Data.Parameter_Data.Inhalt[17] := INT_TO_BYTE(((M / 10) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[18] := INT_TO_BYTE(((M /  1) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[19] := CHAR_TO_BYTE(',') ;
            Write_Data.Parameter_Data.Inhalt[20] := INT_TO_BYTE(((S / 10) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[21] := INT_TO_BYTE(((S /  1) MOD 10) + 48) ;
            Write_Data.Parameter_Data.Inhalt[22] := 0 ;
            
            Write_Data.Parameter_Data.Size := 22 ;
            FOR i := 0 TO 7 BY 1 DO
               PAD[i*4 + _PerA_Req_Data] := at_Write_Data.Parameter_Data[i] ; 
            END_FOR ;
            AblaufPrg.setDateTime := 2 ;
        2 : // Steuerbit für Daten-Übernahme an Laser setzen
            Write_Data.Generel_Request.Command_Req := true ;
            AblaufPrg.setDateTime := 3 ;
        3 : // Feedback abfragen und auswerten - Daten-Übernahme quittieren
            IF Read_Data.CompletionStatus.Command_Req_Complete THEN 
               Write_Data.Generel_Request.Command_Req := false ; 
               at_Read_Data.Operate_Parameters[1] := PED[_PerE_Operate_Parameter] ;
               Write_Data.CompletionClr_Request.Command_Req_Complete := true ;
               AblaufPrg.setDateTime := 4 ;
            END_IF ; 
        4 : // Feedback abfragen
            IF NOT Read_Data.CompletionStatus.Command_Req_Complete THEN 
               Write_Data.CompletionClr_Request.Command_Req_Complete := false ;
               erster_Start.setDateTime := false ;
               AblaufPrg.setDateTime := enum_SK_beendet ;
            END_IF ; 
        enum_SK_beendet :
            IF NOT _CMD_Set_DateTime THEN 
               AblaufPrg.aktiv := enum_Prg_none ;
               AblaufPrg.setDateTime := enum_SK_bereit ;
            END_IF ;
    END_CASE ;
END_IF ; 
_DateTime_geladen := (AblaufPrg.setDateTime >= 4) ;

//    Beschriftung durchführen  
   CASE AblaufPRG.Beschriftung OF
      enum_SK_bereit :
          IF  _CMD_Laser_beschriften 
          AND LaserStatus.Layout_geladen AND LaserStatus.Beschriftung_geladen 
          AND LaserStatus.Laser_Ein AND LaserStatus.Emission THEN 
             AblaufPrg.aktiv := enum_Prg_Beschriftung ;
             AblaufPRG.Beschriftung := 1 ;
          END_IF ;
      1 :
          LaserStatus.Markieren_aktiv := true ;
          IF Read_Data.MachineStatus.Print_Busy OR NOT  _CMD_Laser_beschriften THEN   
             AblaufPRG.Beschriftung := 2 ;
          END_IF ;
      2 :
          IF Read_Data.CompletionStatus.Print_Complete OR NOT Read_Data.MachineStatus.Print_Busy THEN 
             LaserStatus.Markieren_aktiv := false ;
             AblaufPRG.Beschriftung := enum_SK_beendet ;
          END_IF ;
      enum_SK_beendet :
          IF NOT  _CMD_Laser_beschriften THEN 
             AblaufPRG.Beschriftung := enum_SK_bereit ;
             AblaufPrg.aktiv := enum_Prg_none ;
          END_IF ;
   END_CASE ;
END_IF ;
LaserStatus.Markieren_aktiv := (AblaufPRG.Beschriftung = 1) OR (AblaufPRG.Beschriftung = 2) ;
LaserStatus.Markieren_fertig := (AblaufPRG.Beschriftung = 3) ;
Write_Data.Generel_Request.Print := LaserStatus.Markieren_aktiv ;
_Markieren_laeuft := LaserStatus.Markieren_aktiv ;
_Markieren_fertig := LaserStatus.Markieren_fertig ;
 
//    Status-Meldungen ausgeben  
LaserStatus.aktivieren := NOT Read_Data.MachineStatus.Ready AND Read_Data.MachineStatus.Start_Up ;
LaserStatus.Laser_Ein  := Read_Data.MachineStatus.Ready AND Read_Data.MachineStatus.Start_Up ;
LaserStatus.Emission   := LaserStatus.Laser_Ein AND Read_Data.MachineStatus.Laser_Emit ;
_Einschalten_laeuft := LaserStatus.aktivieren ;
_Laser_eingeschaltet := LaserStatus.Laser_Ein ;
_Laser_Emission_OK   := LaserStatus.Emission ;
_Laser_Fehler        := LaserStatus.Fehler ;
   
Write_Data.Generel_Request.Error_Clear := _CMD_Quit ; // or LaserStatus.aktivieren ; 
  
Write_Data.CompletionClr_Request.Error_Clear_Complete := Read_Data.CompletionStatus.Error_Clear_Complete ;
Write_Data.CompletionClr_Request.Edit_Complete        := Read_Data.CompletionStatus.Edit_Complete ;
   
Impuls_Timer (IN := (AblaufPrg.setLayout = 4) OR (AblaufPrg.setBeschriftung = 3) OR (AblaufPrg.setDateTime = 4) OR Write_Data.Generel_Request.Error_Clear
             ,PT := t#500ms
             ) ;    

//    Perepherie-Daten schreiben  
PAD[_PerA_Generel_Req +0]       := at_Write_Data.Generel_Request[1] ;
PAD[_PerA_Generel_Req +4]       := at_Write_Data.Generel_Request[2] ;
PAD[_PerA_CompletionClr_Req +0] := at_Write_Data.CompletionClr_Request[1] ;
PAD[_PerA_CompletionClr_Req +4] := at_Write_Data.CompletionClr_Request[2] ;

END_FUNCTION_BLOCK

Gruß
Larry
 
Hallo Larry,

vielen, vielen Dank für die zahlreichen Beiträge.
Mittlerweile besteht Einsicht in die Kommandos, welche am Laser ankommen, und von mir wurde die Datenlänge fehlerhaft zugesendet.
Die Zusendung de String Change Request kommt jetzt korrekt an am Laser, jedoch mir wird eine Bestätigung gesendet mit dem Fehler S000.
Keyence meint dies könnte am Laserprogramm liegen, da der Requestbefehl jetzt auch erst erfolgt mit der Abfrage Ready und nicht Busy.
Werde nach Klärung des Problemes berichten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... wie auch immer ... der gepostete Code funktioniert jedenfalls - da kannst du dir ja im Zweifel immer noch die passende Passage herausnehmen und schauen ...

Gruß
Larry
 
@Larry

Ich mußte die Convert-Funktionen ausklammern und hatte ein "End_If;" zuviel im Code,
danach ließ sich der Code übersetzen.
 
Danke ich bin gerade auch dabei eine IBN zu machen für einen Keyence - Laser

... wie auch immer ... der gepostete Code funktioniert jedenfalls - da kannst du dir ja im Zweifel immer noch die passende Passage herausnehmen und schauen ...

Gruß
Larry


Muss es hier bei 2 Laser IBN machen einmal noch auf einer älteren Anlage über Profibus mit Buskoppler PB -> PN und einmal
mit was neuerem direkt mit PN. Also Danke, da wie schon erwähnt die DOKU von Keyence etwas spärlich bzw. zu kompliziert ausfällt.

Kann wenn es jemand braucht 2 Datenbausteine zusteuern einmal für Send (Control) und einmal für das lesen vom Laser Read (bzw. Monitor).


Gruß Röhrengertl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo. Ich versuche, die Zeitsynchronisation zwischen SPS und Laser in Betrieb zu nehmen. Im Beispiel von @Larry werden zwei FBs verwendet, um Datum und Uhrzeit in INT zu konvertieren. Was sind FBs? Sie befinden sich nicht in der Initialisierung. Vergib mir mein schlechtes Deutsch
 
Zurück
Oben