Wenn die Programme erst geladen werden müssen, mache ich mir ein Modul mit einer Hauptschleife, die immer läuft und in der die übergeordnete Logik steckt, auch die zur Kommunikation mit der SPS. Anschließend werden mit "später Bindung" die benötigten Module geladen und deren Bearbeitungsroutine aufgerufen.
if (prg_intern > 0) then
Load "HOME:P"+programmname{prg_intern}+".MOD";
Load "HOME:D"+programmname{prg_intern}+".MOD";
Load "HOME:F"+programmname{prg_intern}+".MOD";
else
TPwrite"Achtung! Kein Programm angewaehlt!";
endif
Ein bisschen knifflig ist die (sichere) Entfernung geladener Module, insbesondere, wenn man nicht ganz sicher ist, was jetzt eigentl. geladen ist. Vielleicht gibts da inzwischen was, ich hab es damals mal so gemacht:
!!####################################################################################
!!-->Alle Programme entladen
!!####################################################################################
proc rUnloadAll()
var byte iii;
var num fk;
iii:=1;
while (iii<=20) do
unload \save, "HOME:P"+programmname{iii}+".MOD";
unload \save, "HOME:F"+programmname{iii}+".MOD";
unload \save, "HOME:D"+programmname{iii}+".MOD";
incr iii;
ENDwhile
Error
test ERRNO
case ERR_MOD_NOT_LOADED:
!Im Falle, dass das Modul nicht geladen ist (in 19 von 20 faellen das normale)
TryNext;
case ERR_NOTSAVED:
!Sollte eigentlich nicht vorkommen, zumal die Option nicht gewaehlt ist
TryNext;
case ERR_UNLOAD:
!Problematisch!
if (programmname{iii} = programmname{Prg_old}) fehler "Kann nicht entladen", "Das Modul "+programmname{iii}+" konnte nicht vollstaendig entladen werden.";
trynext;
default:
fehler "Unbekannter Entladefehler", "Beim Entladen der Module entstand ein unbekannter Fehler.";
trynext;
endtest
endproc
Alles anzeigen
.
Wenn die Module im Speicher bleiben können, ist es eh egal, und man kann die benötigten Programme einfach aufrufen, auch wieder mit %"string_selbstgestrickter_Routinenname%;
Grüße,
Michael