Ausschaltverzögerungszeit wird aus HMI nicht in SPS verarbeitet, Hersteller weiß nicht weiter

Zuviel Werbung?
-> Hier kostenlos registrieren
In C erfolgt die Operation im gecasteten Datenformat.
Meinst du, das (DINT) sagt, dass die Operation (1000 * var) in DINT gerechnet werden soll? Oder heißt das (DINT), dass das Ergebnis der Operation nach DINT gecastet werden soll (und die Berechnung selbst könnte ein 1000 * INT gewesen sein)?
Und wieso der Typecast zu DINT? Erwartet TOF.PT nicht den Datentyp TIME?
 
Bei einem (DINT) Cast wird im Variablenraum DINT gerechnet. 32-Bit mit Vorzeichen, die Variablen werden vorher gewandelt.

Der Datentyp Time ist ein vorzeichenbehafteter 32-Bit Datentyp, kann aber nicht gecastet werden sondern wird nur interpretiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei einem (DINT) Cast wird im Variablenraum DINT gerechnet. 32-Bit mit Vorzeichen, die Variablen werden vorher gewandelt.
Also sind folgende 3 Schreibweisen gleichwertig, auch wenn die Eingangsvariable TransportSystem.Conveyor_Outfeed_1_Offdelay nur INT ist?
Code:
TOF_Conveyor_Outfeed_1.PT = (DINT)(1000 * TransportSystem.Conveyor_Outfeed_1_Offdelay);
TOF_Conveyor_Outfeed_1.PT = (DINT)1000 * TransportSystem.Conveyor_Outfeed_1_Offdelay;
TOF_Conveyor_Outfeed_1.PT = 1000 * (DINT)TransportSystem.Conveyor_Outfeed_1_Offdelay;
 
Nein.
Im ersten wird vor der Berechnung beide gewandelt.
Im zweiten wird nur die 1000 gecastet, im dritten nur die Variable "TransportSystem..."
 
Im zweiten wird nur die 1000 gecastet, im dritten nur die Variable.
Der andere Operand sollte da doch implizit in DINT gewandelt werden?

Meine aktive ANSI-C-Programmierzeit ist eine Weile her, ich kann mich nicht erinnern, daß man mit einem Typcast vor einer Operation festlegen kann, in welchem Datentyp die Operation gerechnet werden soll. Ich erinnere mich nur an Typecast von Operanden bzw. Ergebnissen von Ausdrücken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde es jetzt fast mal in ein Programm packen und mir die Compiler Ausgabe anschauen... 😂...vielleicht am Montag wieder.
Aber aufgrund der fehlenden Klammerung würde ich sagen er macht es nicht.
Wenn du eine Konstante verwendest wird er vermutlich diese in den gleichen Typen wandeln wie die Zielvariable.
Denke aber das ist von Compiler zu Compiler unterschiedlich. Ich glaube bei B&R ist es so wenn du eine Ganzzahlkonstante einer REAL Variable zuweist ( RealVariable := 3; ) gibt es ein Warning, Beckhoff ist es egal...
 
Ich würde es jetzt fast mal in ein Programm packen und mir die Compiler Ausgabe anschauen...
Ja, würde ich im Zweifelsfall auch machen. Ich habe aber leider kein B&R Programmiersystem verfügbar.
Solange die Eingangsvariable höchstens 32 ist, sollte es keinen Unterschied machen, aber wenn der Wert >= 33 ist, dann wird es interessant.
 
Ich denke die Eingabe am HMI erfolgt in Sekunden und wird hier für einen Timer in Millisekunden umgerechnet.

Ja die Eingabe der Nachlaufzeit am HMI erfolgt in Sekunden mit einer Nachkommastelle.

Egal welche Zeit hier eingebenn wird, sie wird nicht verarbeitet von dem TOF. Die Maschine bleibt immer nach 20sec stehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja die Eingabe der Nachlaufzeit am HMI erfolgt in Sekunden mit einer Nachkommastelle.

Egal welche Zeit hier eingebenn wird, sie wird nicht verarbeitet von dem TOF. Die Maschine bleibt immer nach 20sec stehen.
Nochmal meine Frage:
Welchen Datentyp hat TransportSystem.Conveyor_Outfeed_1_Offdelay?

Entweder
- der Wert wird falsch konvertiert
- oder woanders überschrieben (vielleicht indirekt adressiert?)
- oder falsch verarbeitet
- oder der TOF arbeitet gar nicht mit dem Eingabewert
?
Der TOF ist ein B&R-Standard-TOF oder was selbstgeschriebenes?
 
Ja, würde ich im Zweifelsfall auch machen. Ich habe aber leider kein B&R Programmiersystem verfügbar.
Solange die Eingangsvariable höchstens 32 ist, sollte es keinen Unterschied machen, aber wenn der Wert >= 33 ist, dann wird es interessant.

DINT ist aber 4 Byte. Da hast du mit 33*1000 noch lange kein Problem
 
Also sind folgende 3 Schreibweisen gleichwertig, auch wenn die Eingangsvariable TransportSystem.Conveyor_Outfeed_1_Offdelay nur INT ist?
Code:
TOF_Conveyor_Outfeed_1.PT = (DINT)(1000 * TransportSystem.Conveyor_Outfeed_1_Offdelay);
TOF_Conveyor_Outfeed_1.PT = (DINT)1000 * TransportSystem.Conveyor_Outfeed_1_Offdelay;
TOF_Conveyor_Outfeed_1.PT = 1000 * (DINT)TransportSystem.Conveyor_Outfeed_1_Offdelay;

PT ist TIME definiert und wird gleich wie DINT behandelt. Zeit in ms.

Ich interpretiere die Zeilen so
TOF_Conveyor_Outfeed_1.PT = (DINT)(1000 * TransportSystem.Conveyor_Outfeed_1_Offdelay);
Da Offdelay eine REAL ist wird 1000 vor der multiplikation auf REAL gecastet . Das Ergebnis ist somit REAL und wird mit (DINT) auf DINT gewandelt
Verhindert ein Warning beim Compiler

TOF_Conveyor_Outfeed_1.PT = (DINT)1000 * TransportSystem.Conveyor_Outfeed_1_Offdelay;
1000 wird in sicher in DINT gewandelt aber danach gleich in ein REAL. Ergebnis ist somit ein REAL und wird durch die Zuweisung in ein DINT gewandelt. Hier sollte eine Warnung erfolgen

TOF_Conveyor_Outfeed_1.PT = 1000 * (DINT)TransportSystem.Conveyor_Outfeed_1_Offdelay;
Offdelay wird in DINT gewandelt und mit 1000 Multipliziert. Ergebnis ist ein DINT.

Also kann das Ergebnis stark von den Klammern beeinflusst werdne.
 
Ja, würde ich im Zweifelsfall auch machen. Ich habe aber leider kein B&R Programmiersystem verfügbar.
Solange die Eingangsvariable höchstens 32 ist, sollte es keinen Unterschied machen, aber wenn der Wert >= 33 ist, dann wird es interessant.

DINT ist aber 4 Byte. Da hast du mit 33*1000 noch lange kein Problem
In welchen Datentyp das Ergebnis gewandelt wird, spielt keine Rolle für die Berechnung. Wenn die Eingangsvariable ein 16 Bit INT ist, dann kann es aber ein Problem sein. Deshalb ja zweimal meine Nachfrage nach dem Datentyp der Variable.

Wenn der Datentyp aber REAL ist, dann gehört das (DINT) tatsächlich vor die Klammer um die Berechnung - ist also richtig so. Da finde ich es aber suboptimal, dass die "1000" da als Ganzzahl steht und anscheinend vom Compiler kommentarlos akzeptiert wird. Wenn da "1000.0" stehen würde, dann wäre auf einen Blick der Sinn des (DINT) und die Richtigkeit des ganzen Ausdrucks verständlich und müsste nicht erst hinterfragt werden.
 
TIME ist ebenfalls 4 byte mit einen Werte Bereich von -24d_20h_31m_23s_648ms ... T#24d_20h_31m_23s_647ms
TIME = 1s oder DINT = 1000 ist auf der Speicherstelle das gleiche

Ob jetzt ein Warning kommt da es sich um unterschiedliche Datentypen handelt, kann ich nicht sagen.


 
Der Wert der Variable ist da mit 2.0 angegeben. Wie soll da eine Ausschaltverzögerung von 20s zustande kommen?
So wie ich es verstehe, wird die Änderung von der Visu hier nicht übernommen. In der Visu glaube wird von 20 sec. gesprochen.
Hier müsste man nur die Änderung im Watch auf der Steuerung mit der Visu überprüfen.

Das sind momentan Vermutungen. Man müsste den Vorgange tracen und zu sehen wie die Schrittkette arbeitet.
 
"egal was eingegeben wird" könnte darauf hinweisen, dass in der HMI auf eine falsche Variable eingegeben wird.
Genau.
Vielleicht wurde genau diese Variable bei der Inbetriebnahme entfernt. Die die Zeit aus anderen Gründen nicht eingehalten werden kann.
Das Zuweisen der Variable kann ja nicht das Problem sein welches man in Monaten nicht findet, das wurde ja in diesem Projekt öfter gemacht.
 
Genau.
Vielleicht wurde genau diese Variable bei der Inbetriebnahme entfernt. Die die Zeit aus anderen Gründen nicht eingehalten werden kann.
Das Zuweisen der Variable kann ja nicht das Problem sein welches man in Monaten nicht findet, das wurde ja in diesem Projekt öfter gemacht.
Hallo,

wenn ich mit STRG+UMSCHALTEN+F nach "TransportSystem.Conveyor_Outfeed_1_OffDelay" kommt nur dieser eine Treffer. Der Name müsste doch in einem Datenbaustein auftauchen, in die die VISU Ihre Werte schreibt?

Bei dem Maschinentyp, den wir haben ist es der 550. In den Zeilen die hier besprochen werden heißt es:

// Conveyor outfeed 1.
TP_Backup_Outfeed_1.IN=(TransportSystem.Outfeed_1_Backup_Cnt>1);
TP(&TP_Backup_Outfeed_1);
if (GlobalState.MachineType==540) {
TOF_Conveyor_Outfeed_1.PT=(DINT)(1000*TransportSystem.Conveyor_Outfeed_1_OffDelay);
TOF_Conveyor_Outfeed_1.IN=SplitStarwheelDrive.DO_Enable_Bottom;
TOF(&TOF_Conveyor_Outfeed_1);
DO_Conveyor_Outfeed_1_Enable=TOF_Conveyor_Outfeed_1.Q;
AO_Conveyor_Outfeed_1_Velocity=GetRegisterValueFromRelativeVelocity(MIN(1.0,TransportSystem.MachineTargetVelocity*TransportSystem.Conveyor_Outfeed_1_GearFactor));
}
 
Zurück
Oben