TIA SCL Bit's in DB setzen mit indirekter Programmierung

frankuc45

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

ich bin am verzweifeln :confused:. Mein Ziel ist in einem DB der aus 1000 Bits besteht über SCL ein bestimmtes Bit setzen.

Der DB "Schritt" ist wie folgt aufgebaut:
Name Datentyp
----------------------------
Schritt_0 Bool
Schritt_1 Bool
Schritt_2 Bool
usw.

Jetzt möchte ich in SCL folgendes erreichen

Code:
Schritt_Nr:= 2;
#Zahl_mit_vorzeichen := INT_TO_STRING(Schritt_Nr:);// aktuellen Schritt in String wandeln
#Zahl_ohne_vorzeichen := RIGHT(IN := #Zahl_mit_vorzeichen, L := LEN(#Zahl_mit_vorzeichen)-1);// von der Zeichenkette das Vorzeichen entfernen

 #Schritt_Nr_String:= CONCAT_STRING(IN1:= 'Schritt_',IN2 := #Zahl_ohne_vorzeichen);

Schritt_Nr_String:= 
"Schritt".Schritt_Nr_String := true;

Leider kommt bei der Zuweisung -->"Schritt".Schritt_Nr_String := true <-- ein Fehler

Vielen Dank für Eure Hilfe
Gruß frankuc45
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es wäre auch nützlich wenn Du angibst welche CPU Du programmierst. Es wäre ja schade um unsere verschwendete Lebenszeit, wenn wir uns über Dein Problem Gedanken machen und Tipps geben, die dann auf Deiner CPU gar nicht funktionieren...

Harald
 
Code:
[COLOR="#FF0000"]Schritt_Nr_String:=[/COLOR] 
"Schritt".Schritt_Nr_String := true;

Leider kommt bei der Zuweisung -->"Schritt".Schritt_Nr_String := true <-- ein Fehler
Meine Glaskugel kann leider die Frage nicht beantworten, weil sie nicht wie Du sehen kann, wie die Fehlermeldung lautet. Außerdem weiß sie nicht, ob Dein Programm wirklich so geschrieben ist mit der "unvollendeten" Zuweisung eine Zele vorher oder ob das nur ein Fehler von Dir beim Posten ist...

Harald
 
Ja mit Array of Bool, wie von DeltaMikeAir vorgeschlagen würde ich auch arbeiten. Der Index gibt dir dann direkt deine Schrittnummer.

Kleine Anmerkung zum Vorzeichen entfernen, würde empfehlen das nicht per String zu machen, da du erheblich mehr Speicher und langsamer in der Verarbeitung bist.
Mit einer IF Zahl < 0 könntest du prüfen ob die Zahl im minus ist und dann machen was du willst (*-1 um die Zahl positiv darzustellen).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meine Glaskugel kann leider die Frage nicht beantworten, weil sie nicht wie Du sehen kann, wie die Fehlermeldung lautet. Außerdem weiß sie nicht, ob Dein Programm wirklich so geschrieben ist mit der "unvollendeten" Zuweisung eine Zele vorher oder ob das nur ein Fehler von Dir beim Posten ist...

Harald

Mehrfachzuweisungen gehen, dazu müssen die Datentypen aber gleich sein :ROFLMAO:.

Aka.

Code:
Bool_1 := 
Bool_2 :=
Bool_3 := 1;
 
Meine Glaskugel kann leider die Frage nicht beantworten, weil sie nicht wie Du sehen kann, wie die Fehlermeldung lautet. Außerdem weiß sie nicht, ob Dein Programm wirklich so geschrieben ist mit der "unvollendeten" Zuweisung eine Zele vorher oder ob das nur ein Fehler von Dir beim Posten ist...

Harald

Hallo Zusammen,
super damit ihr euch so schnell um mein Problem kümmert.
1. Zur CPU --> ich habe ne 1200er
2. Die Idee mit dem Array hört sich gut an aber in diesem Fall ist mir auch nicht klar wie die Syntax hier aussehen muss
3. In der Zeile --> Schritt".Schritt_Nr_String := true; <-- ist unter Schritt_NR_String eine rote Linie und der ToolTip sagt --> Unbekannte Anweisung
4. Meine Idee war: Je nach Zahlenwert der int variablen "Schritt_nr" ein Bit in dem DB zu setzen.

Ich hoffe mein Anliegen ist so etwas verständlicher
Danke für Eure Hilfe

Gruß frankuc45
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich wüsste nicht das du dir so symbolisch eine Variable zusammenbauen kannst.

Code:
#Schritt_Nr_String:= CONCAT_STRING(IN1:= 'Schritt_',IN2 := #Zahl_ohne_vorzeichen);

Schritt_Nr_String:= 
"Schritt".Schritt_Nr_String := true;
Du versuchst damit doch zu erreichen, dass die SPS aus dem String "Schritt_Nr_String" in dem dann z.B. "Schritt_5" steht, dynamisch die Variable zusammenbaut in etwa so:

"Schritt".Schritt_Nr_String >> "Schritt".Schritt_5

Das wird so nicht gehen.



-chris
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Dein DB "Schritt" wie folgt aufgebaut wäre:
Code:
Schritte : Array[0..999] OF BOOL;
dann ginge es einfach
Code:
#Schritt_Nr := 2;
"Schritt".Schritte[#Schritt_Nr] := true;

Harald

Bleibt ihm dann nicht das Problem, dass bei einem Wertwechsel von Schritt_Nr das Bit das vorher gesetzt wurde, nicht rückgesetzt wird.
Soll immer nur ein Bit gesetzt sein? Oder eines nach dem anderen gesetzt werden und irgendwann irgendwo alle wieder rückgesetzt werden.

Wenn immer nur ein Bit TRUE sein soll, dann müsstest du vor der Zuweisung pauschal einmal alle ablöschen:


Code:
Schritte : Array[0..999] OF BOOL;
i : INT;

FOR #i := 0 TO 999 BY 1 DO
    "Schritt".Schritte[#i] := FALSE;
END_FOR;

#Schritt_Nr := 2;
"Schritt".Schritte[#Schritt_Nr] := true;
 
Zurück
Oben