TIA Technologieobjekt Datenaustausch Geber Datenbaustein Weidmüller UR20-1SSI

mbi

Level-2
Beiträge
84
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Wer kann mir etwas helfen beim umsetzten der Positionieraufgabe mit einem UR20-1SSI Modul?
Leider kann man die UR20-1SSI nicht so wie die TM Module von Siemens direkt im Technologie Objekt verknüpfen. (hab dann ein absolut SSI Geber anschlossen)
Gaube eine Möglichkeit wäre per Datenbaustein. Nur weiss ich nicht wie genau das aussehen soll.
Hat das vielleicht schon jemand gemacht und ist bereit den Code zu teilen?
Hab da was vom MC-PreServo gelesen in welchem man das Telegramm zusammen bauen kann.
Nur bin ich mir da total unsicher und weil das Material so spät kommt ist die Inbetriebnahme sehr kurz.
Wenn jemand etwas bewährtes hat, wär natürlich super er würde es teilen

Vielen Dank
 
Ganz so einfach ist es nicht, aber es geht.

Das über den Datenbaustein ist der richtige Weg.

Im MC-PostServo die Lebensbit's hantieren wenn es eine Achse mit DSC ist.
Im MC-PreServo den Geberistwert laden ggf. anpassen. Hatte da eine Hydraulikachse mit Analoggeber und Propventil.

Wenn's ein Drehgeber ist dann auch den Nist versorgen...

MC-PostServo:
Code:
// ===============================================================================================================
// Lebensbit nachführen für DSC
// ===============================================================================================================
REGION Live_cnt Drehteller
    
    "Servo_DB".Drehteller_Live_cnt += 1;
    "Servo_DB".Drehteller.Output.STW2.MasterSignOfLifeBit0 := "Servo_DB".Drehteller_Live_cnt.%X0;
    "Servo_DB".Drehteller.Output.STW2.MasterSignOfLifeBit1 := "Servo_DB".Drehteller_Live_cnt.%X1;
    "Servo_DB".Drehteller.Output.STW2.MasterSignOfLifeBit2 := "Servo_DB".Drehteller_Live_cnt.%X2;
    "Servo_DB".Drehteller.Output.STW2.MasterSignOfLifeBit3 := "Servo_DB".Drehteller_Live_cnt.%X3;
    
    IF "Servo_DB".Drehteller_Live_cnt = 15 THEN
        "Servo_DB".Drehteller_Live_cnt := 0;
    END_IF;
END_REGION

"TO_Drehteller_Actor_Interface_AddressOut" := "Servo_DB".Drehteller.Output;


MC-PreServo
Code:
// ===============================================================================================================
// Presse als Servoachse verkaufen
// ===============================================================================================================

"Servo_DB".Presse.Input := "TO_Presse_Sensor1_Interface_AddressIn";

"Servo_DB".Presse.Input.G1_XIST1 := DINT_TO_DWORD(REAL_TO_DINT("AI_Pos_Hydraulik" * real#512.0));
 
Zuletzt bearbeitet:
Dieser Beitrag beschreibt das gleiche Thema, aber mit einem analogen Messsystem. Die Datenbaustein-Anbindung des Encoders ist da drin aber beschrieben.

 
Hallo
Vielen Dank für eure Antworten.
Dann hoffe ich die Teile kommen etwas früher damit ich genug Zeit zum testen hab.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Hab es mal so gelöst. Erster Test scheint es zu Funktionieren

HW Config SSI ist ein SEW AK8Y
1686769785706.png

Aufruf im MC-PreServo
Code:
"SimpleEnc_DB"(position:="Rohwert_Drehgeber",
               init:=#Initial_Call,
               isAbsolute:=TRUE,
               hasOverflows:=true,
               numberOfBits:=24,
               ea_tel81:="Drehgeber".Hochfoerderer);


Code vom FB_SimpleEnc
C-ähnlich:
REGION Livebit
    
    #s_iLive_cnt += 1;
    
    IF #s_iLive_cnt > 15 THEN
        #s_iLive_cnt := 0;
    END_IF;
    
    #ea_tel81.Input.ZSW2_ENC.SlaveLifeSignBit0 := #s_iLive_cnt.%X0;
    #ea_tel81.Output.STW2_ENC.MasterSignOfLifeBit0 := #s_iLive_cnt.%X0;
    
    
    #ea_tel81.Input.ZSW2_ENC.SlaveLifeSignBit1 := #s_iLive_cnt.%X1;
    #ea_tel81.Output.STW2_ENC.MasterSignOfLifeBit1 := #s_iLive_cnt.%X1;
    
    #ea_tel81.Input.ZSW2_ENC.SlaveLifeSignBit2 := #s_iLive_cnt.%X2;
    #ea_tel81.Output.STW2_ENC.MasterSignOfLifeBit2 := #s_iLive_cnt.%X2;
    
    #ea_tel81.Input.ZSW2_ENC.SlaveLifeSignBit3 := #s_iLive_cnt.%X3;
    #ea_tel81.Output.STW2_ENC.MasterSignOfLifeBit3 := #s_iLive_cnt.%X3;
    
END_REGION



// init overflow calculation
IF #init THEN
    IF #hasOverflows = FALSE OR #numberOfBits >= 31 OR #numberOfBits < 2 THEN
        #s_xConsiderOverflows := FALSE;
    ELSE
        #s_xConsiderOverflows := TRUE;
        #s_iPosRange := 1;
        #s_iPosRange := SHL(IN := #s_iPosRange, N := #numberOfBits);
        #s_iPosRange2 := #s_iPosRange / 2;
    END_IF;
    
    #s_iOldPos := #position;
    #ea_tel81.Input.G1_XIST1 := 0;
END_IF;

//  Calculate the position difference
#_DPos := #position - #s_iOldPos;

IF #s_xConsiderOverflows THEN
    IF #_DPos > #s_iPosRange2 THEN
        #_DPos := #_DPos - #s_iPosRange;
    ELSIF #_DPos < - #s_iPosRange2 THEN
        #_DPos := #_DPos + #s_iPosRange;
    END_IF;
END_IF;

// incremental position has no overflows within 32 bits
// only consider the changes
#ea_tel81.Input.G1_XIST1 := #ea_tel81.Input.G1_XIST1 + DINT_TO_DWORD(#_DPos);
#s_iOldPos := #position;

// Error acknowledgement
IF #s_xError THEN
    IF #ea_tel81.Output.G1_STW.AcknowledgeError THEN        // Acknowledge
        #s_xError := FALSE;
        #ea_tel81.Input.G1_XIST2 := 0;
        #ea_tel81.Input.G1_ZSW.SensorError := FALSE;
    END_IF;
END_IF;

// interprete the encoder control word  G1_STW
#_ReqCmd := #ea_tel81.Output.G1_STW.Command0Request OR #ea_tel81.Output.G1_STW.Command1Request
OR #ea_tel81.Output.G1_STW.Command2Request OR #ea_tel81.Output.G1_STW.RequestParkingEncoder;

IF #isAbsolute = FALSE THEN
    #_ReqCmd := #_ReqCmd OR #ea_tel81.Output.G1_STW.AbsoluteValueCyclically;
END_IF;

IF #_ReqCmd THEN                    // any unsupported comands requested? ==> Error
    #ea_tel81.Input.G1_ZSW.SensorError := TRUE;
    #ea_tel81.Input.G1_XIST2 := 16#0F01;
    #s_xError := TRUE;
ELSE
    
    IF #ea_tel81.Output.G1_STW.AbsoluteValueCyclically THEN        // request absolute value
        #ea_tel81.Input.G1_XIST2 := DINT_TO_DWORD(#position);
        #ea_tel81.Input.G1_ZSW.AbsoluteValueCyclicallyExecuted := TRUE;
    ELSE
        #ea_tel81.Input.G1_ZSW.AbsoluteValueCyclicallyExecuted := FALSE;
        #ea_tel81.Input.G1_XIST2 := 0;
    END_IF;
    
END_IF;

Technologie Objekt
1686769923044.png
1686769951195.png


Vielleicht hilft es ja mal jemand. Oder einer der wirklich was davon versteht sieht ein Fehler.
Viele Einstellungen waren nähmlich probieren bei mir.
 
Nachtrag:

Da ja das Technologieobjekt nun über den Datenbaustein die Geberdaten bekommt.
Muss die Drehgeber Klemme manuell in der Hardware Config mit dem Prozessabbild MC_Servo synchronisiert werden.
Hab ich erst später mit komischen Positionierungsfehler gemerkt. 🙈
 
Zurück
Oben