TIA TIA V13 Word to Bool

ElJupo

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich hab ein mittleschweres Problem mit dem TIA Portal.
Und zwar möchte ich eine Word Variable wieder in Bool's zerlegen.
Zur genaueren Erklärung handelt es sich dabei um Steuer- /Statuswörter, jedes Bit hat seine eigene Funktion. Im FC wird dieses Wort dann in den Lokaldatenbereich kopiert wo es als Bool vorliegt.
Zu 300er Zeiten war es recht einfach:

L DBxy.DBWxy
T LW x

fertig aus Word mach Bool.
Im TIA alles ein wenig komplizierter, ich weiß ich könnte per Slice drauf zugreifen dann geht aber die Symbolik der einzelnen Bits verloren.
Ich könnte auch Strukturen/UDTs anlegen und die kopieren dann kommt aber wieder die HMI dazwischen wo ich dann für jedes BIT ein Powertag verbrauchen müsste.
Es sei erwähnt, dass sich das Problem nur auf den "optimierten Bausteinzugriff" bezieht.
Diesen würde ich aber schon gerne nutzen weil ich denke, dass diese "Reise" in Zukunft in diese Richtung geht und der Perfomrancevorteil ja auch vorhanden ist.
 
Moin,

kannst du nicht die AT Sicht machen? Ich hab mir dazu ein Baustein in SCL gemacht.

Code:
FUNCTION_BLOCK "Word_to_bool_AT"
VERSION : 0.1
   VAR_INPUT 
      "IN_WORD" : Word;
   END_VAR

   VAR_OUTPUT 
      Einschaltbereit { S7_HMI_Visible := 'False'} : Bool;
      Betriebsbereit { S7_HMI_Visible := 'False'} : Bool;
      "Betrieb freigegeben" { S7_HMI_Visible := 'False'} : Bool;
      "Störung wirksam" { S7_HMI_Visible := 'False'} : Bool;
      "OFF2 aktiv" { S7_HMI_Visible := 'False'} : Bool;
      "OFF3 aktiv" { S7_HMI_Visible := 'False'} : Bool;
      "Einschaltsperre aktiv" { S7_HMI_Visible := 'False'} : Bool;
      "Warnung aktiv" { S7_HMI_Visible := 'False'} : Bool;
      Drehzahlabweichung { S7_HMI_Visible := 'False'} : Bool;
      "Führung gefordert" { S7_HMI_Visible := 'False'} : Bool;
      "Vergleichsdrehzahl erreicht oder überschritten" { S7_HMI_Visible := 'False'} : Bool;
      "I, M oder P erreicht" { S7_HMI_Visible := 'False'} : Bool;
      "Haltebremse offen" { S7_HMI_Visible := 'False'} : Bool;
      "Warnung Übertemperatur Motor" { S7_HMI_Visible := 'False'} : Bool;
      "0= Motor dreht rückwärts, 1= Motor dreht vorwärts" { S7_HMI_Visible := 'False'} : Bool;
      "thermische Überlast Leistungsteil" { S7_HMI_Visible := 'False'} : Bool;
   END_VAR

   VAR_TEMP 
      temp_Word : Word;
      AT_of_Bool AT temp_Word : Array [0..15] of Bool;
   END_VAR


BEGIN
    //AT von IN_WORD zu Temp
    #temp_Word:=#IN_WORD;
    
    //Von Temp Bit zum Out Bit
    #Einschaltbereit:=#AT_of_Bool[8];
    #Betriebsbereit:=#AT_of_Bool[9];
    #"Betrieb freigegeben":=#AT_of_Bool[10];
    #"Störung wirksam":=#AT_of_Bool[11];
    #"OFF2 aktiv":=#AT_of_Bool[12];
    #"OFF3 aktiv":=#AT_of_Bool[13];
    #"Einschaltsperre aktiv":=#AT_of_Bool[14];
    #"Warnung aktiv":=#AT_of_Bool[15];
    #Drehzahlabweichung:=#AT_of_Bool[0];
    #"Führung gefordert":=#AT_of_Bool[1];
    #"Vergleichsdrehzahl erreicht oder überschritten":=#AT_of_Bool[2];
    #"I, M oder P erreicht":=#AT_of_Bool[3];
    #"Haltebremse offen":=#AT_of_Bool[4];
    #"Warnung Übertemperatur Motor":=#AT_of_Bool[5];
    #"0= Motor dreht rückwärts, 1= Motor dreht vorwärts":=#AT_of_Bool[6];
    #"thermische Überlast Leistungsteil":=#AT_of_Bool[7];
    
END_FUNCTION_BLOCK

Hier zB um die Status Bits eines FUs zu haben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke das würde gehen aber nur für "standard Bausteine" ich würde aber gerne die optimierten benutzen.

*EDIT*
Nach ausführlichen Tests musste ich feststellen, dass der "Slice Zugriff" schwer auf die Performance drückt.
Folgendes Testszenario:

1.
2 Dwords auf In/Out Paramter eines FCs
64 Bit in Temp des FCs
Per Slice Dword auf Bits kopiert und wieder zurück.
Diesen Baustein habe ich 100 aufgerufen (CPU 1515).
-->Zykluszeit 10ms

2.
UDT mit 64 Bit auf In/Out Paramter eines FCs
64 Bit in Temp des FCs
Per Zuweisung von In/Out in Temp und wieder zurück.
Diesen Baustein habe ich 100 aufgerufen (CPU 1515).
-->Zykluszeit 2ms

Alles mit "optimierten Bausteinen".
Faktisch machen beide Versuche genau das selbe nur 1. dauert viel länger 2.
Hat jemand ähnliche Erfahrung?
 
Zuletzt bearbeitet:
Danke für die Antwort,

aber dann müsste ich auf den "optimierten Zugriff" verzichten und wenn ich "standard Zugriff" benutze könnte ich ja auch einfach mit:
L DBxy.DBDx
T LD x
die Dword's kopieren.
Ich hätte dann zwar in dieser Anweisung keine Symbolik für den Tempbereich würde mir aber die AT-Deklaration sparen.
 
I will mir garnicht die Langsamkeit der Steuerung ausmalen müssen, wenn schon so eine Funktion die CPU zu 10ms treibt.
 
Ich hätte nicht gedacht, dass mein Vorhaben so speziell ist. Benutzt denn keiner Words um Powertags in der HMI zu sparen usw. ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstell einen Struct in den Temp's
(Bitdaten)

Im Struct schreib deine 16 Bit's
Bit_1
Bit_2
....

Schieb dein Input mit move auf den Struct und greif auf deine Bits wie nachstehend zu.

U Bitdaten.Bit_1
= was auch immer....
 
Das Byte und die Bits aus dem Eingangswort ausmaskieren per Wortverknüpfung (UW) oder Schieben geht symbolisch, z.B. so:
Code:
L   "Eingangswort [AI]"
T   "DBxx".Struct1.Statusbyte
SLW 1
U   <>0
=   "DBxx".Struct1.Bit7
SLW 1
U   <>0
=   "DBxx".Struct1.Bit6
SLW 1
U   <>0
=   "DBxx".Struct1.Bit5

...

=   "DBxx".Struct1.Bit1
SLW 1
U   <>0
=   "DBxx".Struct1.Bit0

statt "U <>0" geht auch "U >0"
(1234567890)

Harald
 
Erstell einen Struct in den Temp's
(Bitdaten)

Im Struct schreib deine 16 Bit's
Bit_1
Bit_2
....

Schieb dein Input mit move auf den Struct und greif auf deine Bits wie nachstehend zu.

U Bitdaten.Bit_1
= was auch immer....

Im TIA kann man kein WORD in Struct of Bits "moven" (move überprüft die Datentypen von In und Out) zumindest bei optimierten Bausteinen in standard Bausteinen kann man es eh mit L/T machen. Mir geht es aber um optimierte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und zwar möchte ich eine Word Variable wieder in Bool's zerlegen.
Zur genaueren Erklärung handelt es sich dabei um Steuer- /Statuswörter, jedes Bit hat seine eigene Funktion. Im FC wird dieses Wort dann in den Lokaldatenbereich kopiert wo es als Bool vorliegt.
...
Im TIA alles ein wenig komplizierter, ich weiß ich könnte per Slice drauf zugreifen dann geht aber die Symbolik der einzelnen Bits verloren.
:confused:
Wieso geht denn mit Slice die Symbolik der einzelnen Bits verloren? Die liegt doch im Eingangswort des FCs eh' nicht vor, oder?

Und mit AT z.B. kopierst Du doch auch nur in den Temp-Bereich: Du hast als IN das Word und im Temp die einzelnen Bits.
Vom In-WORD weist Du per Slice Deinen einzelnen Bools im Temp die Werte zu. Ist zwar nicht so elegant wie AT, aber halt voll symbolisch.
Und auch nicht aufwendiger als z.B. Haralds Vorschlag.
 
Damit die AT Deklaration im Temporären Bereich funktioniert, muss dort aber auch der "optimierte Bausteinzugriff" deaktiviert sein.
aber dann müsste ich auf den "optimierten Zugriff" verzichten
Es funktioniert auch in optimierten Bausteinen:
TIA-Hilfe zu AT schrieb:
Folgende allgemeine Regeln gelten für das Überlagern von Variablen:
...
In Codebausteinen mit optimiertem Zugriff für Variablen mit der Remanenzeinstellung "Im IDB setzen"
Allerdings müsste man dafür einen FB verwenden, da ja ein FC bekanntlich über keinen IDB verfügt.
 
Zurück
Oben