Das Problem bei Prozeduren ist, die genaue Übergabe der Parameter passend zum Typ.
Was immer der SQL-Server da macht, i.d.R. ist '001' nicht char(3) sondern varchar(3).
Für SQL-Prozeduren sollte man nach Möglichkeit generischere Typen definieren um etwas allgemeiner zu arbeiten. Innerhalb der Prozedur kann man dann ggf. Prüfungen und/oder casts vornehmen.

exec ( 'call lib.test( cast( ? as char(3)) )', '001') at as400
exec ( 'call lib.test( cast( ? as int) )', 1) at as400

Das Problem ist ggf., dass der SQL-Server die Parameter nicht vom Host abfragt sondern an Hand der übergebenen Werte definiert, was aber nur eine Vermutung ist.
Problematischer sind dann noch Type wie decimal/numeric(n, m), die vom SQL-Server da wohl auch so nicht funktionieren.

Ob die Prozedur korrekt registriert ist, kann dir ein Aufruf per STRSQL bzw. über den OpsNav mit SQL-Befehle ausführen sagen.

Wenn dein SQL.txt entsprechenden "CREATE PROCEDURE ...." enthält sollte es funktionieren.
Bedenke nur im Wiederholungsfall sollte vorher ebenso ein "DROP" enthalten sein oder, falls dein Release das schon zulässt ein "CREATE OR REPLACE ...".

Möchtestet du ein Resultset von einer Prozedur, dann ist wiederum "select * from OpenQuery('Server', 'Call ...') dein Favorit.