Ich hab mal dein Programm mit dem Timer_P4 auf TwinCat umgerubelt und es scheint tatsächlich ein Problem mit dem TIMER_P4 zu geben. Wenn man mehrere Ereignisse pro Kanal definiert, ist nur das letzte relevant. Wenn ich mir die Programmierung des Bausteins anschaue, ist das auch logisch, da beim Durchlauf des Arrays der jeweilige Kanal immer wieder überschrieben wird. Für den jeweiligen Kanal müsste eine ODER-Verknüpfung mit sich selbst programmiert werden, um den vorherigen Zustand zu berücksichtigen.
Lösung wäre z.B. vor der Schleife alle Ausgänge rücksetzen
ELSIF dtime <> last_execute THEN
(* prepare the logical input mask to be used later *)
qn[0] := FALSE;
qn[1] := FALSE;
qn[2] := FALSE;
qn[3] := FALSE;
mask := 255;
mask.0 := L0;
mask.1 := L1;
mask.2 := L2;
und dann
43: (* event on workdays Mo-FR and no holiday *)
qn[channel] := qn[channel] OR (DT_TO_TOD(dtime) >= event.START) AND (DT_TO_TOD(dtime) < event.START + event.DURATION) AND (NOT Holy) AND (DAY_OF_WEEK(DT_TO_DATE(dtime)) < 6);
prog[pos].LAST := current_day;
Muss natürlich für jeden Event-Typ gemacht werden.