Hier noch ein Beispiel dazu, wie ich es löse.
Routinen für die einzelnen Inputtypen mit Fehlerprüfung:
Code
-- Get integer TPE input parameter
routine getTPEInt(iIP:integer):integer var iValue, iType:integer; rValue:real; sValue:string[1]
begin; GET_TPE_PRM(iIP, iType, iValue, rValue, sValue, iStatus); if (iType <> 1) or (iStatus <> 0) then nova_err(11,iIP); abort; endif; return(iValue); end getTPEInt
-- Get real TPE input parameter
routine getTPEReal(iIP:integer):real var iValue, iType:integer; rValue:real; sValue:string[1]
begin; GET_TPE_PRM(iIP, iType, iValue, rValue, sValue, iStatus); if (iType <> 2) or (iStatus <> 0) then nova_err(12,iIP); abort; endif; return(rValue); end getTPEReal
-- Get string TPE input parameter
routine getTPEStr(iIP:integer):string var iValue, iType:integer; rValue:real; sValue:string[127]
begin; GET_TPE_PRM(iIP, iType, iValue, rValue, sValue, iStatus); if (iType <> 3) or (iStatus <> 0) then nova_err(13,iIP); abort; endif; return(sValue); end getTPEStr
Display More
Die Routine wird jeweils mit Indexwert (für das jeweilige Eingangsargument) aufgerufen. Nachdem ich die Daten gelesen habe, Prüfe ich nach, ob der gelesene Typ dem erwarteten Typ. Entspricht. Andernfalls wird ein Fehler ausgelöst.
Und hier noch der jeweilige Call aus der Hauptroutine:
Code
iTempSocket = getTPEInt(2); -- Get Socketnumber
if (iTempSocket < 1) or (iTempSocket > 8) then nova_err(6,2); endif
iTempUALM = getTPEInt(3); -- Get User alarm number
if (iTempUALM < 1) or (iTempUALM > 10) then nova_err(6,3); endif
Der Call aus dem TP Programm sieht dann so aus wie bei dir.