ACCON-AGLink 5.6 und Alarme

Joline

Level-1
Beiträge
42
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich versuche gerade mittels C# die neuen Funktionen zu den Alarmen zu testen. Dabei scheitere ich schon an der ersten: Symbolic_ReadOpenMsg()

Dabei verwende ich den Code aus dem API Guide:
Code:
public Int32 doReadOpenMsg(Int32 connnr, Int32 timeout){
    Int32 msgtype = AGL4.S7_MSG_TYPE_SYMB;
    Int32 num = 100;
    AGL4.S7_OPEN_MSG_STATE[] states = new AGL4.S7_OPEN_MSG_STATE[num];
    for(Int32 i = 0; i < num; i++)
    {
        states[i] = new AGL4.S7_OPEN_MSG_STATE();
    }
    Int32 result = AGL4.ReadOpenMsg(connnr, ref states, ref num, msgtype, timeout);
    if (result != AGL4.AGL40_SUCCESS)
    {
        // Error happened
        String errormsg = "";
        AGL4.GetErrorMsg(result, out errormsg);
    }
    return result;
}

Nachdem erfolgreich eine Verbindung zu einer S7-1500 (PLCSim Adv. FW 2.1 oder S7-1515 FW 2.5, TIA 14 SP1) aufgebaut wurde, wird obige Funktion aufgerufen. Diese erzeugt aber ein result = -1048566 (-> Funktion wird nicht unterstuetzt).

Geht das nur mit neueren FW-Versionen oder muss man vorher noch eine andere Funktion (z.B. zum Ermitteln der Anzahl der offenen Meldungen) ausführen? Und wie ermittelt man die Anzahl der offenen Meldungen?

Joline

P.S. Ich habe es gerade selbst gesehen: Man muss natürlich AGL4.Symbolic_ReadOpenMsg statt AGL4.ReadOpenMsg benutzen...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein. Die Funktion wird ausgeführt und kommt mit einem result=4 zurück. Aber obwohl ein Eventhandler definiert ist ( m_aglink.OnSymbolicReadOpenMsgCompleted += AglinkReadOpenMsgCompleted), wird der nie aufgerufen.

Der aktuelle Code ist jetzt so:
Code:
Int32 initialAlarmCount = 1;
Int32 needeAlarmCount = 1;

AGL4.S7_ALARM_TIA[] alarmData = new AGL4.S7_ALARM_TIA[initialAlarmCount];

for (Int32 i = 0; i < initialAlarmCount; i++)
{
    alarmData[i] = new AGL4.S7_ALARM_TIA();
}

Int32 result = AGL4.Symbolic_ReadOpenMsg(m_aglink.ConnNr, initialAlarmCount, out alarmData, out needeAlarmCount, 30000);
if (result < AGL4.AGL40_SUCCESS)
{
    // Error happened
    ShowError(result, "AGL_Symbolic_ReadOpenMsg");
    return;
}
 
Für die Events das IAGLink4Tia-Interface verwenden. Also statt
Code:
[FONT=&quot]Int32 result = [B]AGL4[/B].Symbolic_ReadOpenMsg(m_aglink.ConnNr, initialAlarmCount, out alarmData, out needeAlarmCount, 30000);[/FONT]
einfach
Code:
Int32 result = [B]m_aglink[/B].Symbolic_ReadOpenMsg(m_aglink.ConnNr, initialAlarmCount, out alarmData, out needeAlarmCount, 30000);
Zusätzlich kann die Initialierung von alarmData am Anfang entfallen. Es genügt einfach:
Code:
AGL4.S7_ALARM_TIA[] alarmData;

Viele Grüße, ein schönes Weihnachtsfest und einen guten Rutsch ins neue Jahr
 
Der Hinweis mit m_aglink war passend. Danke. Allerdings sind dann andere Parameter (als auch in der Doku beschrieben) notwendig:

Code:
Int32 result = m_aglink.Symbolic_ReadOpenMsg(initialAlarmCount, TIMEOUT);

Seltsamerweise wird diese Funktion ohne die ConnNr aufgerufen.

Außerdem wird die Funktion vom Eventhandler (OnSymbolicReadOpenMsgCompleted) nur aufgerufen, wenn der TIMEOUT <= 0 ist. ???
Gleiches habe ich übrigens auch bei OnReadMLFBExCompleted bemerkt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die ConnNr ist im Interface enthalten, sie noch einmal zu übergeben wäre redundant.
Grundsätzlich gilt, dass Eventhandler nur aufgerufen werden, wenn die ACCON-AGLink-Funktion asynchron, d.h. mit einem Timeoutwert <= 0, aufgerufen wird. Dies gilt natürlich für alle ACCON-AGLink-Funktionen.
 
Zurück
Oben