Hi,
ich bin nicht sicher ob ich verstanden habe was du willst aber ich
versuchs mal:
>Sollte als Anfänger eher eine andere Bibilothek/ andereren Weg genommen
>werden?
Das passt schon. :-)
Was ich dir noch mitgeben kann, such dir einen MB-Monitor, damit kannst
du die Kommunikation testen. Es gibt viele freie im Netz.
z.B.: http://www.chipkin.com hat einen. (es gibt mehrere Versionen, such
die neuste)
>Bei dem eigentlichen auslesen als Master komme ich leider nicht weiter.
Master stellt nur Daten zur Verfügung!
Also der Janitza UMG104 ist der Master, du (dein PC) ist der Slave, der
muß arbeiten und die Daten abholen!(abfragen)
>Wie muss das auslesen mit dem Aufruf modbus_mapping_new() korrekt
>entstehen? Ich komme mit der Dokumentation nicht weiter- Als Beispiel
>würde ich gerne das Register 19000 auslesen (das ist die Spannung -
>müsste also um die 230 liegen)
modbus_mapping_new ist für die Erstellung eines Masters!
Hier generierst du den Platzhalter für die Register(Informationen) die
von Außen gelesen werden können(auch write möglich).
1 | mb_mapping = modbus_mapping_new(
|
2 | 0, // keine Bits (Coils (RW))
|
3 | 0, // keine Input-Coils (nur Read-Only)
|
4 | 0, // keine Holding-Register (RW)
|
5 | 0 // keine Inputregister (nur Read-Only)
|
6 | );
|
7 | // irgendwas mußte aber erstellen
|
8 | mb_mapping = modbus_mapping_new(
|
9 | 0, // keine Bits (Coils (RW))
|
10 | 0, // keine Input-Coils (nur Read-Only)
|
11 | REGISTERS_ADDRESS + 100, // 100 Holding-Register (RW)
|
12 | 0 // keine Inputregister (nur Read-Only)
|
13 | );
|
Im 2 Fall könnte jetzt einer deine 100 H-Register lesen.
Schau bitte im Code nach was der Wert für REGISTERS_ADDRESS ist, den
konnte ich nicht in der Doku finden.
Dieser Satz in der Doku ist für MB wichtig:
1 | /* The fist value of each array is accessible from the 0 address. */
|
leider konnte ich in der Doku zum UMG104 nichts finden!!!
Also im Zweifel die Registeradressen um +- 1 verändern!
Eigentlich willst du doch deinen UMG104 auslesen, oder?
Dazu kannst du das aus der Doku verwenden:
1 | modbus_t *ctx;
|
2 | uint16_t tab_reg[64]; // <- hier die Registerwerte reinschreiben
|
3 | int rc;
|
4 | int i;
|
5 | int MyMBStartAdr= 19000;
|
6 | int MyMBAdrLen= 6; // alle Spannungen von L1 L2 L3
|
7 |
|
8 | rc = modbus_read_registers(ctx, MyMBStartAdr, MyMBAdrLen, tab_reg);
|
9 | if (rc == -1) {
|
10 | fprintf(stderr, "%s\n", modbus_strerror(errno));
|
11 | return -1;
|
12 | }
|
13 |
|
14 | for (i=0; i < rc; i++) {
|
15 | printf("reg[%d]=%d (0x%X)\n", i, tab_reg[i], tab_reg[i]);
|
16 | }
|
Zum Anfang mehr als 1 Register lesen, wegen den Offset von 1!!!
Hat mir immer sehr geholfen :-)