"FbPublishMQTT_2.aData" richtig "beschalten"

marsmännchen

Level-2
Beiträge
103
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich wollte versuchen von der WagoAppCloud den FbPublishMQTT zu verwenden. Der FbStatus_NativeMQTT_2 ist mir gelungen, und im WBM sehe ich auch das ich verbunden bin.

Meine Frage ist:
Kann mir jemand bitte zeigen wie ich den InOut FbPublishMQTT_2.aData richtig beschalte?

Mit meinen lächerlichen Versuchen mit Pointer und dergleichen um zu gehen seh ich leider alt aus..
Code:
PROGRAM mqttclient
VAR
    uiPort:UINT:=1883;
    sHostname:STRING(255):='192.xxx.xxx.xxx';
    MQTTClient_0: MQTT.MQTTClient;
    xEnable: BOOL;
    MQTTPublish_0: MQTT.MQTTPublish;
    wsTopicName:WSTRING(1024):="xxx";
    rsPub1Done: RS; // Helper to publisher state
    xExecute:BOOL;
    sSubscribeMessage : STRING(4096);
    wsSubcribeTopicFilter : WSTRING(1024) := "testtopic";
    Stringchange_0: Stringchange;
    MQTTSubscribe_0: MQTT.MQTTSubscribe;
    msgint: REAL;
    FbStatus_NativeMQTT_2_0: FbStatus_NativeMQTT_2(eConnection := eConnectionId.Connection1) := (xEnabled := TRUE);
    xTrigger: BOOL;
    FbPublishMQTT_2_0: FbPublishMQTT_2(eConnection := eConnectionId.Connection1) := (sTopic := 'testfrom');
    pointer_aData:POINTER TO BYTE;
    
END_VAR

VAR_INPUT
    sPublishMessage : STRING(1024) := '';
END_VAR

VAR_IN_OUT
    aDatax:ARRAY[*] OF BYTE;
END_VAR
mqtt1.PNG

Welcher Pointer muss da auf welches Array (oder wie auch immer) zeigen? Ich stehe mit solchen dingen echt ewig am Schlauch.
MfG
Patrick
 
Steht doch eigentlich klar in der Doko drin. Am Eingang aData muss die Adresse zu der Variablen oder dem Array angegeben werden, das die Daten enthält, die Übertragen werden sollen. Der Typ der Variablen oder des Array ist dabei erstmal eigentlich unerheblich, die Daten werden letzten Endes als Bytestrom übertragen, egal was sie darstellen. Über den Eingang dwSize gibt's Du dann die Größe/Anzahl der Daten in Bytes an, die übertragen werden sollen. Die Größe kannst Du, soweit immer nur eine Variable oder aber ein ganzes Array übertragen wird mit SIZEOF ermitteln. Ansonsten kannst Du Deine Daten auch in ein Array of Bytes kopieren, bei aData die Adresse (z.B. mit ADR) angeben und dann bei dwSize die tatsächlich zu übertragene Bytezahl angeben, fertig. Aber es geht, wie bereits erwähnt, auch mit Arrays jeden anderen Typs.
Und der Rest ist auch nicht schwer. Ich kenne jetzt weder WAGO noch speziell die MQTT Funktionalität, aber an dem Baustein muss nur ein Pointer, bzw. eine Adresse, was ja das Selbe ist, angelegt werden und das ist an aData. Der Rest sind "normale" Variablen.
An sTopic wird ein String übergeben mit einer, frei übersetzt, Überschrift, die die übertragenen Daten beschreibt. Der Eingang eQualityOfService wird mit dem Wert eines ENUMS beschickt. Der Eingang xRetain wird direkt mit einem BOOL oder einer Variablen von dem Typ gefüttert, damit die Nachricht Retain wird, was das in dem Zusammenhang auch immer bedeutet. Die beiden nächsten Eingänge habe ich schon beschrieben. Und xTrigger löst die Übertragung aus. Da das ein Ein-/Ausgangsparameter ist muss hier zwingend eine Variable verwendet werden, in dem Fall vom Typ Bool.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort,
so wie ich das verstanden habe ist es offensichtlich falsch:


Code:
PROGRAM mqttclient
VAR
    uiPort:UINT:=1883;
    sHostname:STRING(255):='...';
    MQTTClient_0: MQTT.MQTTClient;
    xEnable: BOOL;
    MQTTPublish_0: MQTT.MQTTPublish;
    wsTopicName:WSTRING(1024):="test";
    rsPub1Done: RS; // Helper to publisher state
    xExecute:BOOL;
    sSubscribeMessage : STRING(4096);
    wsSubcribeTopicFilter : WSTRING(1024) := "testtopic";
    Stringchange_0: Stringchange;
    MQTTSubscribe_0: MQTT.MQTTSubscribe;
    msgint: REAL;
    FbStatus_NativeMQTT_2_0: FbStatus_NativeMQTT_2(eConnection := eConnectionId.Connection1) := (xEnabled := TRUE);
    xTrigger: BOOL;
    FbPublishMQTT_2_0: FbPublishMQTT_2(eConnection := eConnectionId.Connection1) := (sTopic := 'testfrom');
END_VAR

VAR_INPUT
    sPublishMessage : STRING(1024) := '';
    //aData: ARRAY[*] OF BYTE;
END_VAR

VAR_IN_OUT
    aData: ARRAY[*] OF BYTE;
END_VAR
mqtt1.PNG
Kommen die Fehler:
C0039: VAR_IN_OUT 'aData' muss in Aufruf von 'mqttclient' zugewiesen werden
C0385: Arrays mit variablen Längen sind nur zulässig als VAR_IN_OUT von Funktionsbausteinen oder als VAR_IN_OUT und VAR_INPUT von Methoden und Funktionen
C0032: Typ 'POINTER TO REFERENCE TO ARRAY[*] OF BYTE' kann nicht in Typ 'ARRAY[*] OF BYTE' konvertiert werden
C0041: VAR_IN_OUT'- beziehungsweise REFERENCE-Parameter 'aData' von 'FbPublishMQTT_2' benötigt eine Variable mit Schreibzugriff als Eingang

Wenn ich aData: POINTER TO BYTE;
daraus mache ist es ebenso falsch.
 
Hallo,

das ist der kleine Fallstrick bei Arrays, wie auch in C. Arrays sind schon Pointer, Du mußt also nur aData dort übergeben.

Gruß
 
Hallo,

das ist der kleine Fallstrick bei Arrays, wie auch in C. Arrays sind schon Pointer, Du mußt also nur aData dort übergeben.

Gruß
Da muss ich leider widersprechen, dem ist im Codesys Universum und bei Siemens denke ich mal auch nachweislich nicht so. Wäre die Behauptung richtig würde der folgende Code funktionieren:
Code:
VAR
    abTest01                    : ARRAY[1..100] OF BYTE;
    abTest02                    : ARRAY[1..10] OF BYTE;
END_VAR

MEMCPY(abTest01, abTest02, SIZEOF(abTest02));
Tut er aber nicht, weil Arrays in dem Bereich nicht pauschal Pointer sind.
Der folgende Code funktioniert hingegen, weil hier die Adresse des Arrays übergeben wird, wären Arrays pauschal schon Pointer wäre ADR nicht nötig:
Code:
VAR
    abTest01                    : ARRAY[1..100] OF BYTE;
    abTest02                    : ARRAY[1..10] OF BYTE;
END_VAR

MEMCPY(ADR(abTest01), ADR(abTest02), SIZEOF(abTest02));
 
Zuviel Werbung?
-> Hier kostenlos registrieren
C0041: VAR_IN_OUT'- beziehungsweise REFERENCE-Parameter 'aData' von 'FbPublishMQTT_2' benötigt eine Variable mit Schreibzugriff als Eingang

Wenn ich aData: POINTER TO BYTE;
daraus mache ist es ebenso falsch.
Eventuell ist hier die Doku falsch/missverständlich, versuch bitte einmal anstatt eines Pointers ein Array zu übergeben, also ADR wegzulassen.
 
Ja, also ganz simpel ein ARRAY ganz normal in VAR deklariert.
Was ich aber überhaupt nicht in Erwägung gezogen habe,
da es ja beim Eingang aData beim drüberfahren mit der Maus "ARRAY[*] OF BYTE" heißt.


Code:
PROGRAM mqttclient
VAR
    uiPort:UINT:=1883;
    sHostname:STRING(255):='xxx.xxx.xxx.xxx';
    MQTTClient_0: MQTT.MQTTClient;
    xEnable: BOOL;
    MQTTPublish_0: MQTT.MQTTPublish;
    wsTopicName:WSTRING(1024):="test";
    rsPub1Done: RS; // Helper to publisher state
    xExecute:BOOL;
    sSubscribeMessage : STRING(4096);
    wsSubcribeTopicFilter : WSTRING(1024) := "testtopic";
    Stringchange_0: Stringchange;
    MQTTSubscribe_0: MQTT.MQTTSubscribe;
    msgint: REAL;
    FbStatus_NativeMQTT_2_0: FbStatus_NativeMQTT_2(eConnection := eConnectionId.Connection1) := (xEnabled := TRUE);
    xTrigger: BOOL;
    FbPublishMQTT_2_0: FbPublishMQTT_2(eConnection := eConnectionId.Connection1) := (sTopic := 'testfrom');
    
    test2:ARRAY[0..3] OF BYTE; //So scheint es zu funktionieren
END_VAR

VAR_INPUT
    sPublishMessage : STRING(1024) := '';
    
END_VAR

mqtt3.PNG


Der Rest ist dann wohl ein anderes Problem/Thema. Das muss ich mir noch ansehen.

ABER die Verbindung steht.
Danke mal wieder für die perfekte Hilfe!
Gruß
Patrick
 
Ja, also ganz simpel ein ARRAY ganz normal in VAR deklariert.
Was ich aber überhaupt nicht in Erwägung gezogen habe,
da es ja beim Eingang aData beim drüberfahren mit der Maus "ARRAY[*] OF BYTE" heißt.
Da ist die Doku dann aber tatsächlich falsch. Das "ARRAY[*] OF BYTE" bedeutet, dass an dem Eingang ein Byte Array beliebiger Größe übergeben werden muss, dass hat aber nichts mit Pointern zu tun. Bei meiner Antwort in #2 habe ich mich davon auch ins Bockshorn jagen lassen. Ich dachte, aufgrund der Doku, dass an dem Eingang ein Pointer auf ein Array übergeben werden muss, wobei es dann aber eigentlich egal wäre, ob es ein Byte Array oder ein Array eines anderen Typs ist, da ja nur eine Adresse übergeben wird aus der der Typ des Array nicht hervorgeht.
Was verwirrend noch dazukommt ist die Tatsache, dass es im Codesys Universum auch dynamische Arrays gibt, die mit ARRAY[*] OF ... deklariert werden.
 
Zuletzt bearbeitet:
Zurück
Oben