SCL Binär Wert in INT ausgeben / Problem

Bollek

Member
Beiträge
9
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen,

vllt. kann mir jmd. von euch weiterhelfen... bin am verzweifeln.

Folgendes:
Ich hab als Projekt ein Rolllageranlge im miniformat was die fächer zwischen 1-54 anfahren soll und sich jedesmal wenn sie dort was eingeladen oder ausgeladen hat in einem Datenbaustein notieren soll (Über BOOL (fachxy /true/false)).

Über ein MOVE Baustein in FUP wird über ein EB ein Wert eingestellt und auf ein MW was als Datentyp INT deklariert "geschoben".
Jetzt habe ich vor mir mit diesen MW erstmal die Bitadresse auszurechnen auf dem theoretisch das Fach liegt (von 0.0 bis 6.5 BOOL´s)
Habe dazu folgenden SCL Baustein geschrieben:

Var_Input
Sollwert :INT; // Dort kommt das MW rein
END_VAR

VAR_OUTPUT
Fachbesetzt : BOOL;
END_VAR

VAR
i : INT;
j : INT;
END_VAR

i := Sollwert / 8;
j := (Sollwert - ( 8 * i))-1; //da das erste fach auf 0.0 liegt
Fachbesetzt := DB10.DX[i,j]; //so stands in der hilfe

Das funktioniert erstmal nicht. Als ich die einzelnen Variablen ausgeben wollte als OUTPUT INT um zu schauen was für i und j für werte rauskommen,kommt da nur blödsinn raus.

Als ich dann versucht hab i := Sollwert; kommt da 5120 raus... ???

Ich schätze mal es ist irgend ein DatenTypfehler ??? Wäre für jede Hilfe dankbar !!

Nachtrag: ohne DB10.D[i,j] das X kommt zumindestens kein sammelfehler und er compiliert das programm...

MFg Bollek
 
OP
B

Bollek

Member
Beiträge
9
Punkte Reaktionen
0
Danke für die schnellen Antworten. Das Hauptproblem besteht leider weiterhin... er schmeißt mir hinten trotzdem 5120 raus... :/
 

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
[...]
Jetzt habe ich vor mir mit diesen MW erstmal die Bitadresse auszurechnen auf dem theoretisch das Fach liegt (von 0.0 bis 6.5)
[...]
MFg Bollek

Da es in diesem Fall kein Fach 0 gibt, musst du noch bei der Bitberechnung den Sollwert um eins verringern, damit du auf die richtige Bitadresse kommst!

Fach 1 = DBX 0.0
Fach 2 = DBX 0.1
...
Fach 54 = DBX 6.5

mfg

EDIT: Dann zeig doch bitte mal, wie du deinen Sollwert von außen beschreibst!
 
Zuletzt bearbeitet:

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
Zuviel Werbung?
->Hier kostenlos registrieren
Das habe ich nicht gelesen - sorry ...
Du hast ja auch geschrieben, dass du "nur" ein Byte übergeben bekommst. Dann solltest du auch nur das Byte an deinen SCL-Baustein übergeben und damit arbeiten.
Alternativ könntest du den Sollwert zunächst durch 256 teilen (um an das vorne stehende Low-Byte heran zu kommen) und mit dem neuen Wert dann weiter arbeiten ...

Ist die wirkliche Eingangsgröße zu deinen 5120 ggf. 20 ?

Gruß
Larry
 

Ralle

Supermoderator
Teammitglied
Beiträge
15.103
Punkte Reaktionen
3.820
Mich würde dann mal interessieren, was in Sollwert wirklich eingetragen ist!
 
OP
B

Bollek

Member
Beiträge
9
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Das problem ist gelöst nachdem ich urgelöscht hab und und alles neu aufgespielt. Der sollwert wird jezzt richtig uebergeben. Der wird nicht berechnet. Hab das EB einfach per movebaustin direkt auf ein merkerwort gesetzt. das EB kann ich ja per schalter selbst festlegen. das merkwuerdige war das bei 0 und ab 60ca 0 rauskam bei 50 die haelfte 2560... ?! Es funktioniert jezzt jedenfalls wie vorgesehen. jedoch bleibt immernoch das problem das fachbesetzt := d10.DX[i,j] nicht auf 1 gesetzt wird obwohl im db10 die angesprochene adresse (i und j) auf true gesetzt ist. Woran kann das liegen. es ist ein globaler baustein falls die info was bringen sollte! danke jedenfalls fuer die superschnelle hilfe :)
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
... das mit deinen Zahlen mußt du bitte noch einmal (und diesmal bitte vernünftig) erklären. Dann kann man dir ganz sicher auch richtig helfen.
Das :
das merkwuerdige war das bei 0 und ab 60ca 0 rauskam bei 50 die haelfte 2560... ?!
kann ich nicht interpretieren - Sorry ... :cool:
 
OP
B

Bollek

Member
Beiträge
9
Punkte Reaktionen
0
das merkwuerdige war das bei 0 und ab 60ca 0 rauskam bei 50 die haelfte 2560... ?!

Ja, nach erneutem lesen kann ich dich verstehen ;).

Ok, da ich ja eure Hilfe benötige werde ich es diesmal "vernünftig" machen.

Folgendes.
Im Anhang ist ein Bild mit dem Datenbaustein und dem SCL Baustein von aussen mit folgendem relevanten Code:

VAR_OUTPUT

Fachbesetzt : BOOL;
k : INT;
p : INT;
Test : INT;

VAR_END

VAR_INPUT
Sollwert : INT;
Auslagern : BOOL;
Einlagern : BOOL;
VAR_END;

BEGIN

Fachbesetzt := false;

Test := Sollwert;
k := Sollwert DIV 8 ;
p := Sollwert MOD 8;

Fachbesetzt := DB10.DX[k,p];

IF Fachbesetzt=0 AND Einlagern=1 THEN
DB10.DX[k,p] := true ;
END_IF ;

IF Fachbesetzt = 1 AND Auslagern =1 THEN
DB10.DX[k,p] := true;
END_IF;


Sooo..
Die IF schleifen sollen einfach den den Inhalt des DatenBausteins beschreibe oder löschen je nachdem ob aus dem Regal ein- oder ausgelagert wird.
Das Problem:
Er setzt wie im Bild erkennbar den Ausgang Fachbesetzt nicht auf 1 obwohl in dem Datenbaustein 1.7 auf true ist.
Wieso funktioniert das nicht?
 

Anhänge

  • test.JPG
    test.JPG
    79,4 KB · Aufrufe: 22
OP
B

Bollek

Member
Beiträge
9
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Wenn das Programm von oben nach unten arbeitet ist das doch irrelevant oder ? Ich nehme es mal raus und probier es.

Edit: Steht immernoch auf 0 :(
 
Zuletzt bearbeitet:

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
Ah tut mir leid ich hab die eine Zeile überlesen! Wann wird denn im DB das Bit wieder zurück gesetzt?? Oder ist das nur ein Flüchtigkeitsfehler von dir? Weil du schreibst, wenn Auslagern gleich 1 dann ist das Bit ebenfalls TRUE ???
Wird der Baustein nur an dieser Stelle aufgerufen?? Wird der Merker noch irgendwo im Programm verwendet??? Suche mal nach überlappenden Speicherzugriffen.
 
OP
B

Bollek

Member
Beiträge
9
Punkte Reaktionen
0
Oh ja, danke. Hab ich gerade verbessert, jedoch setzt er das Bit auch nicht wenn die ganzen IF-Schleifen rauskommentiert sind.
Hab verschiedene Merker probiert die unbenutzt sind. Will er auch nicht...:|
 

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
Zuviel Werbung?
->Hier kostenlos registrieren
Hmm bei Einlagern und Auslagern wird an der Schnittstelle auch nichts übergeben. Probier doch bitte mal testweise bei Einlagern "true" ranzuschreiben. Bei Auslagern "false". Ev. gibt es hier ein Problem (das hatte ich nämlich auch schon mal ... war zwar im IN/OUT Bereich und alles war auch richtig programmiert, aber von außen wurde nichts übergeben).
 
OP
B

Bollek

Member
Beiträge
9
Punkte Reaktionen
0
Ja, ich denke, dass das funktionieren wird, wenn ich herausgefunden hab wieso er nicht "fachbesetzt" den Wert des DBs übergibt.
Wie gesagt habe ich die IF-Schleifen die mit den "Auslagern" und "Einlagern" Variablen arbeiten herauskommentiert.
Momentan steht in dem Program einfach nur:

Fachbesetzt := DB10.DX[k,p];

und hinten kommt 0 raus obwohl wie im bild sichtbar Im DB der Wert in der Adresse auf "True" steht.
Ich glaube wenn das erstmal gelöst ist kann das restliche auch funktionieren.

Mach ich evtl einen Fehler bei dem Indizierten Zugriff auf den DB ?
 

nutellahase

Well-known member
Beiträge
180
Punkte Reaktionen
28
Ok dann probier mal k und p in den Stat-bereich zu verschieben! Und als Output dann halt zwei andere Variablen nehmen ;)
 
Oben