Vorarlberger
Level-1
- Beiträge
- 5
- Reaktionspunkte
- 0
-> Hier kostenlos registrieren
Sehr geehrte Damen und Herren,
Ich arbeite gerade an einem Projekt und habe folgendes Problem "Maximum program cycle time exceeded - Time error, OB80 start requested".
in meinem Projekt geht es darum, geschickte Byte-Arrays aus einem Plugin auf die SPS zu übertragen und verarbeiten. Die geschickten Byte-Arrays sollen auf der SPS in den jeweilige Datentyp umgewandelt werden. Jedoch habe ich feststellen können, dass meine SPS (Software SPS 1507S) die Byte-Arrays in einem Zyklus nicht abarbeiten kann. Darum wollte ich fragen, ob es eine Möglichkeit gibt die Abarbeitung so zu gestallten, dass die Byte-Arrays in mehreren Zyklen abgearbeitet werden können.
Hinweis: Programm ist in SCL geschrieben!
Hier ist auch ein Ausschnitt aus meinem Programm:
Noch ein paar Worte zum Code. Die geschickten Byte-Arrays sind Daten für einen Roboter. Hier werden die geschickten Byte-Arrays in den jeweiligen Datentyp umgewandelt. Da es keine direkte Umwandlung von BYTE_TO_REAL und BYTE_TO_DINT gibt, wurde eine Lösung mit einer For-Schleife ausgedacht. Ich gebe im Programm immer an, an welcher Stelle die gewünschten Informationen sind/stehen.
Ich arbeite gerade an einem Projekt und habe folgendes Problem "Maximum program cycle time exceeded - Time error, OB80 start requested".
in meinem Projekt geht es darum, geschickte Byte-Arrays aus einem Plugin auf die SPS zu übertragen und verarbeiten. Die geschickten Byte-Arrays sollen auf der SPS in den jeweilige Datentyp umgewandelt werden. Jedoch habe ich feststellen können, dass meine SPS (Software SPS 1507S) die Byte-Arrays in einem Zyklus nicht abarbeiten kann. Darum wollte ich fragen, ob es eine Möglichkeit gibt die Abarbeitung so zu gestallten, dass die Byte-Arrays in mehreren Zyklen abgearbeitet werden können.
Hinweis: Programm ist in SCL geschrieben!
Hier ist auch ein Ausschnitt aus meinem Programm:
Code:
#InternalPosition := 1;
#NumberOfSteps := BYTE_TO_SINT(#Command[#CommandIndex].Out.Data[#InternalPosition]);
FOR #Index_I := 0 TO #NumberOfSteps DO
#LengthOfStep := BYTE_TO_INT(#Command[#CommandIndex].Out.Data[#InternalPosition]);
#Bewegung[#Index_I].ID := BYTE_TO_USINT(#Command[#CommandIndex].Out.Data[#InternalPosition + 1]);
#StringMaxLength := BYTE_TO_SINT(#Command[#CommandIndex].Out.Data[#InternalPosition + 2]);
#StringActuallLength := BYTE_TO_SINT(#Command[#CommandIndex].Out.Data[#InternalPosition + 3]);
FOR #TempIndex := 0 TO #StringActuallLength DO
#InternalString := BYTE_TO_CHAR(#Command[#CommandIndex].Out.Data[#TempIndex]);
#Bewegung[#Index_I].Name := CONCAT_STRING(IN1 := #Step[#Index_I].Name, IN2 := #InternalString);
END_FOR;
#Bewegung[#Index_I].MoveLinear := BYTE_TO_BOOL(#Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 2]);
FOR #IndexOfPositionNumber := 0 TO 3 DO
#Temp_DWORD_Variable_1.%B3 := #Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 3];
#Temp_DWORD_Variable_1.%B2 := #Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 4];
#Temp_DWORD_Variable_1.%B1 := #Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 5];
#Temp_DWORD_Variable_1.%B0 := #Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 6];
#Bewegung[#Index_I].PositionNumber := DWORD_TO_DINT(#Temp_DWORD_Variable_1);
END_FOR;
FOR #IndexOfSpeed := 0 TO 3 DO
#Temp_DWORD_Variable_2.%B3 := #Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 7];
#Temp_DWORD_Variable_2.%B2 := #Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 8];
#Temp_DWORD_Variable_2.%B1 := #Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 9];
#Temp_DWORD_Variable_2.%B0 := #Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 10];
#Bewegung[#Index_I].Speed := DWORD_TO_REAL(#Temp_DWORD_Variable_2);
END_FOR;
#Bewegung[#Index_I].Acceleration := BYTE_TO_SINT(#Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 11]);
#Bewegung[#Index_I].Deceleration := BYTE_TO_SINT(#Command[#CommandIndex].Out.Data[#InternalPosition + #StringActuallLength + 12]);
#Count := #LengthOfStep;
#InternalPosition += #Count;
END_FOR;
Noch ein paar Worte zum Code. Die geschickten Byte-Arrays sind Daten für einen Roboter. Hier werden die geschickten Byte-Arrays in den jeweiligen Datentyp umgewandelt. Da es keine direkte Umwandlung von BYTE_TO_REAL und BYTE_TO_DINT gibt, wurde eine Lösung mit einer For-Schleife ausgedacht. Ich gebe im Programm immer an, an welcher Stelle die gewünschten Informationen sind/stehen.
Zuletzt bearbeitet: