Ho provato la tua macro, e anzi l’ho riscritta in base a quanto credo ti serva ottenere, ecco la mia versione
macro_command main()
bool Pulse //One shot memory
bool Alarm=0 //Alarm flag
int APage=0 //Alarm page
//GetData(AL, "CODESYS V3 (Ethernet)", "Application.GVL.Allarme_Attivo", 1)
GetData(Alarm, "Local HMI", LB, 0, 1)
if (Alarm <> Pulse) then
Pulse=Alarm //One shot memory
if not(Alarm) then
APage=10 //Alarm page
end if
if (Alarm) then
APage=20 //Alarm page
end if
SetData(APage, "Local HMI", LW, 2000, 1)
end if
end macro_command
Naturalmente per poterla testare ho gestito il set della condizione di allarme tramite una variabile pannello LB 0 anzichè dal PLC. Quando è presente un allarme LB0 set viene forzata la visualizzazione della pagina 20. Quando l’allarme si resetta si ritorna alla pagina 10.
Da notare che la variabile Pulse deve mantenere il suo stato su esecuzioni successive della macro, quindi non è possibile inizializzarla e questo genera una warning in compilazione. Per evitare la warning occorrebbe eseguire un GetData ed un SetData di appoggio su variabile LB.