Codesys V3.5 SP20 -- AlarmManager 4.6.0.0 Bibliothek (intern)

fertanov

Level-1
Beiträge
2
Reaktionspunkte
0
Hey Leute,

ich kämpfe seit mehreren Tagen mit einem Problem und könnte echt eure Hilfe gebrauchen.
Ich habe ein Wago PFC200 750-8212 in der Applikation.

Hier ist, was ich erreichen möchte:

Ich will eine Nachricht aus der Alarmtabelle in WebVisu (zum Beispiel „Einheit 001: Modbus-Kommunikationsfehler“) auslesen und in einer String-Variablen speichern. Mein Ziel ist es, diese Meldung anzupassen und sie erneut für einen anderen Fehler in der Alarmtabelle anzuzeigen. Die Meldung sollte abhängig von der Benutzereingabe.
Ich habe herausgefunden, dass das mit der "AlarmManager 4.6.0.0 Bibliothek (intern)" möglich ist.

Ich habe den folgenden Code in ST geschrieben:

//declaration
arritfAlarmsFromAll : ARRAY [0 … 20] OF IAlarm2;

sMessage:STRING;
parritfAlarms:POINTER TO ARRAY[0…15] OF IAlarm;
itfAlarmGroup : IAlarmGroup;
//code
parritfAlarms:= ADR(arritfAlarmsFromAll);
IF parritfAlarms <> 0 THEN
psMessage := parritfAlarms.GetMessage(stringType := __SYSTEM.TYPE_CLASS.TYPE_STRING);
sMessage := psMessage^;
END_IF


Allerdings bekomme ich einen Ausnahmefehler (Zugriffsverletzung) auf der SPS. Wenn ich auf den Fehler klicke, werde ich zu der Zeile weitergeleitet, in der der Zeiger verwendet wird (psMessage := parritfAlarms.GetMessage(stringType := __SYSTEM.TYPE_CLASS.TYPE_STRING);). Ich weiß nicht, was schief läuft.

Jede Hilfe wäre super. Danke2025-03-12_11h19_49.png2025-03-12_12h23_35.png!2025-03-12_11h25_22.png
 
Für mich fehlen in deinem Code ein paar Details.

psMessage ist nicht deklariert. Zudem ist arritfAlarmsFromAll ein Array vom Typ IAlarm2. Der Pointer parritfAlarms ist jedoch als Pointer To Array vom Typ IAlarm deklariert.
Ausserdem versuchst du mit GetMessage auf das ganze Array zuzugreifen, dort benötigst du einen Index:
Code:
(parritfAlarms^[i].GetMessage)
 
ich habe nochmal mit dem Code versucht, aber wie auch immer bekomme ich den Ausnahmefehler(Access violation)

Code:
//Deklaration
    psMessage:POINTER TO STRING;
    sMessage:STRING;
    arritfAlarmsFromAll    : ARRAY [0 .. 20] OF IAlarm2;
    parritfAlarms:POINTER TO ARRAY[0..15] OF IAlarm;
    i:UINT;

/////////////////////////////

    parritfAlarms:= ADR(arritfAlarmsFromAll);
    IF parritfAlarms <> 0 THEN
        FOR i := 0 TO usi_NoOfErrosAktiv DO
        psMessage := parritfAlarms^[i].GetMessage(stringType := __SYSTEM.TYPE_CLASS.TYPE_STRING);
        sMessage:= psMessage^;
        END_FOR
    END_IF

2025-03-14_09h06_25.png2025-03-14_09h05_02.png
 
Code:
VAR
    psMessage                : POINTER TO STRING(255);
    sMessage                : STRING(255);
    arritfAlarmsFromAll        : ARRAY [0 .. 20] OF IAlarm2;
    parritfAlarms            : POINTER TO ARRAY[0..20] OF IAlarm2;
    i                        : UINT;
END_VAR

parritfAlarms := ADR(arritfAlarmsFromAll);

IF parritfAlarms <> 0 THEN
    FOR i := 0 TO 20 DO
        IF parritfAlarms^[i] <> 0 THEN
            psMessage := parritfAlarms^[i].GetMessage(stringType := __SYSTEM.TYPE_CLASS.TYPE_STRING);
              IF psMessage <> 0 THEN
                sMessage:= psMessage^;
            END_IF
        END_IF
    END_FOR
END_IF

Ohne zu testen würde ich mal diesen Ansatz versuchen.
 
Zuletzt bearbeitet:
Ich würde mal sagen bei Deiner Deklaratio passt schon was nicht.
Du deklariest einen Pointer auf ein Array mit 16 Elementen (0-15) vom Typ iAlarm und weißt diesem dann die Adresse eines Arrays mit 21?(0-20) Elementen vom Typ iAlsrm2 zu, das passt doch vorne und hinten nicht.
 
Zuletzt bearbeitet:
Zurück
Oben