Die Fragezeichen sind auch normal. Im Gegensatz zu einem FB, wird einem FC bei jedem Aufruf für die lokalen Variablen ein neuer Speicherbereich zugewiesen. Aus diesem Grund müssen Outputvariablen auch direkt beim Aufruf eines FCs verarbeitet werden. Ein Konstrukt wie
bWert01 := fbTest01.Wert01;
funktioniert bei einem FC nicht. Da die Variablen nach der Ausführung nichts Sinnvolles mehr enthalten zeigt
Codesys ??? an. Möchtest Du die Werte sehen, müsstest Du einen Breakpoint setzen.
Du versuchst in einem FC eine Schrittkette und Timer zu nutzen, was im Normalfall nicht funktioniert, da, soweit die Variable für die Schritte im FC deklariert wurden, diese beim nächsten Aufruf des FC undefinierte Werte oder ihren Initialwert haben, das Selbe gilt auch für Timer-FBs, diese fangen bei jedem Start bei 0 wieder an.
Außerdem rufst Du, soweit dies nicht durch eine Bedingung verhindert wird, den FC in Deinem Programm mehrfach auf. Hätten die Variablen tatsächlich Ihre Werte behalten, würde der zweite Aufruf da weitermachen, wo der erste aufgehört hat.
Ein FC existiert nur einmal, möchtest Du mehrere Instanzen nutzen musst Du einen FB nutzen.
Alles in allem glaube ich, Du musst Dich nochmals mit den Unterschieden von FCs und FBs auseinandersetzen.