Meine Frage ist: uebertraegt der FB auch richtig die negative Zahl? wie soll der Empfaenger aus empfangenen WORD negative und position Zahl unterscheiden? Denn WORD kann nur positiv Zahl
Der FB_MBWriteRegs überträgt die Zahlen automatisch richtig, weil er gar nicht weiß was er da überträgt und auch nicht versucht das zu interpretieren. Er weiß nur daß das ein langer Bitstring ist, dessen 16 Bit große Teilstücken (WORDs) bei Bedarf einzeln adressiert werden können.
Die Aussage, daß in einem WORD nur positive Zahlen enthalten sein können, ist falsch. Wie ich in #4 schon schrieb, enthalten WORDs keine Zahlen sondern Bitmuster. Den WORDs ist es egal wo die Bitmuster herkommen und was sie bedeuten. Ob da auch ein Bit dabei ist, was bei irgendeinem Datentyp das Vorzeichenbit ist und ob das 1 oder 0 ist, ist dem WORD herzlich egal. Es wird erst interessant wenn jemand versucht, das Bitmuster in dem WORD als Zahl zu interpretieren, um z.B. damit zu rechnen, was eigentlich nicht zulässig sein sollte, in
Codesys aber dummerweise erlaubt wurde unter der Bedingung, daß das Bitmuster in WORDs beim Rechnen als unsigned INT interpretiert wird. Der saubere Weg wäre, das WORD in eine INT- oder UINT-Variable zu kopieren und dann mit der INT-/UINT-Variable zu rechnen. So können auch negative Zahlen über WORD-Speicherplätze transportiert werden.
Erstelle einfach ein STRUCT (oder ARRAY), so wie der Empfänger die Daten haben möchte (im Idealfall nur 1 zusammenhängender Bereich):
Code:
SendData : STRUCT
rVar_1 : REAL;
aWerte : ARRAY [0..9] OF DINT;
rVar_2 : REAL;
END_STRUCT;
In die Variablen dieser STRUCT kopiere Deine positiven und negativen und skalierten und sonstigen Werte.
Dann übergib die Anfangsadresse des STRUCT an den FB_MBWriteRegs:
nMBAddr := xxx
nQuantity := 24
cbLength := 48
pSrcAddr := ADR(SendData)
FB_MBWriteRegs kopiert den Speicherbereich des STRUCT SendData in die WORD-Register des Modbus-Servers.
Wenn der Empfänger sich einen genau so strukturierten STRUCT RecvData anlegt und z.B. mit FB_MBReadRegs mit
nMBAddr := xxx
nQuantity := 24
cbLength := 48
pDestAddr := ADR(RecvData)
die 24 WORDs in seine STRUCT holt, dann hat er wunderbarerweise genau Deine Werte in seiner STRUCT - auch negative Werte! ganz ohne Konvertieren und Zerlegen und Zusammenbasteln.
Harald