Hallo Frank,
hatte Dir gerade schon geschrieben.
Demo kenne ich auch keines. Aber die Info von Gunter ist dabei "Gold" wert.
Damit habe ich mein System komplett aufgesetzt, hier mal ein paar Infos von meinem Projekt, wie es aktuell aufgebaut ist:
Code
from System import Processes, Tasks, ....
....
SysTick = 10; // msec
StackSize = 256, iData; // Wichtig wird vom Main Process benutzt
FrameSize = 512, iData; // Wichtig wird vom Main Process benutzt
Scheduler = iData;
TaskStack = 256, iData;
TaskFrame = 256;
....
Wenn Du Prozesse benutzt immer am Ende "Schedule" benutzen, damit die restliche Zeit direkt von einen anderen Process benutzt werden kann.
Beispiel, hier lese die 4 möglichen Ausweisleser an unserer Steuerung:
Code
process ControlJobZKS(128, 180 : iData; 1, suspended);
begin
// V1.1965 wenn Basic, dann keine Ausweisleserabfrage keine RS485 vorhanden
if not IO.IN_BASIC then
// wenn ein Leser aktiv ist dann Go
//
if (isSysTimerZero(ZKSTimerStart)) and (CfgLeser[1].bAdr <> 0) or (CfgLeser[2].bAdr <> 0) or (CfgLeser[3].bAdr <> 0) or (CfgLeser[4].bAdr <> 0) then
ReadZKSProcess;// Wenn Ausweisleser vorhanden
endif;
endif;
// Process ControllZähler
inc(iTask_ZKSCount);
Schedule; // Nichts mehr zu tun... dann sofort Rechenleistung freigeben.
end;
Mein Display habe ich in 2 Teile geteilt, da nicht immer alles ständig refresht werden muss:
Code
//--------------------------------------------------------------
// Display Process oberers Menue und Statusbereich;
//--------------------------------------------------------------
process LCD_Displ(256, 384 : iData; 5); {Stacksize = 256 bytes, Framesize = 384 bytes, 5 Systicks}
begin
WDTrig;// WatchDog Trriggern wenn eingeschaltet
...
DispMenu2; // Menue im LCD-Unit aufrufen
// Process ControllZähler
inc(iLCD_DisplCount);
Schedule; // Rechenzeit freigeben V1.1966
end LCD_Displ;
In meiner Steuerung habe ich ein Status eingebaut um auch zu erkennen, wenn ein FRAME oder STACK kritisch ist oder es einen Überlauf gab.
Einfach einen Task erzeugen, der alle x Ticks aufgerufen wird und die Daten zieht, diese Daten dann in eine PIPE. Im Main Process dann einfach die Pipe abfragen und evtl. Daten holen.
Ahand der Systicks kannst Du sehr genau steuern wie oft der Task gesteuert wird. ABER WICHTIG, ein TASK darf NUR max. einen SysTick brauchen, sonst gibt es Probleme. Also nur Daten checken, in die Pipe und fertig. Keine Schleifen oder sowas machen.
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.