# ACCON-AGLink 5.6 und Alarme



## Joline (19 Dezember 2019)

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:

```
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...


----------



## Rainer Hönle (19 Dezember 2019)

Funktioniert es damit jetzt wie erwartet?


----------



## Joline (20 Dezember 2019)

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:

```
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;
}
```


----------



## Rainer Hönle (20 Dezember 2019)

Für die Events das IAGLink4Tia-Interface verwenden. Also statt

```
[FONT=&quot]Int32 result = [B]AGL4[/B].Symbolic_ReadOpenMsg(m_aglink.ConnNr, initialAlarmCount, out alarmData, out needeAlarmCount, 30000);[/FONT]
```
einfach

```
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:

```
AGL4.S7_ALARM_TIA[] alarmData;
```

Viele Grüße, ein schönes Weihnachtsfest und einen guten Rutsch ins neue Jahr


----------



## Joline (20 Dezember 2019)

Der Hinweis mit m_aglink war passend. Danke. Allerdings sind dann andere Parameter (als auch in der Doku beschrieben) notwendig:


```
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.


----------



## Rainer Hönle (20 Dezember 2019)

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.


----------

