Welche Beziehungen gibt es dazwischen? Ist es so, dass eine Methode von
meheren Modbus-Funktionen verwendet wird?
2. Im File AVR/demo.c befinden sich drei Methoden
Hi
mit den Macros bestimmst du deinen Befehlsumfang von Modbus und
"aktivierst" auch deren Aufruf-Funktionen.
was dies macht:
1
#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED ( 1 )
weiß ich leider nicht, steht aber bestimmt in der Doku.
Könnte FC 0x08 sein, bin aber nicht sicher.
Die Aufruf-Funktionen sind deine "Register-Händler" und müssen von dir
mit Code gefüllt werden!
Hier wird der Modbus halt mit leben gefüllt, wenn man das so sagen kann.
z.B.: Nehme den Wert des zu beschreibende Register und setze die
Ausgänge oder so....
mfg
Stephan
wird FC 0x11 gemeint.
Soweit ich verstehe sind alle Modbus-Funktionen bereits standardiert.
Warum wieder mit Code erfüllen? Diese 10 Methoden für Modbus-Funktionen
werden auch implementiert. Soweit ich sehe werden diese 4 Methoden
jeweils von den 10 Methoden aufgerufen, da diese 4 Methoden sich auf der
niedrigeren Ebene befinden.
MfG
Senmeis
Hi
>Diese 10 Methoden für Modbus-Funktionen>werden auch implementiert. Soweit ich sehe werden diese 4 Methoden>jeweils von den 10 Methoden aufgerufen, da diese 4 Methoden sich auf der>niedrigeren Ebene befinden.
ja, genau! :-)
Das ist deine Schnittstelle, von deinem Programm zu Modbus.
In der Demo zum AVR ist ja nur eine Funktion mit Code gefüllt, der nur
das lesen von InputReg erlaubt. (siehe oben 1. Funktion)
Des weiteren bezieht sich die Demo auf ein Array
"usRegInputBuf[REG_INPUT_NREGS]" mit der Anzahl von "REG_INPUT_NREGS"
Registern. Das alles ist ja nur eine Demo und in deinem Programm kann
das alles sich ändern.
Wenn du Register auch beschreiben willst musst du auch die entsprechende
Funktion mit Code befüllen.
Dafür brauchst du wieder ein Array und die Funktion:
// lese von "pucRegBuffer" mit der Anzahl von "usNRegs" Registern
8
// und schreibe diese ab Registeradresse "usAddress" in mein
9
// "RegHoldingArray"
10
// fertig!
11
break;
12
// Register schreiben
13
caseMB_REG_WRITE:
14
// lese von meinem "RegHoldingArray" mit der Anzahl von "usNRegs"
15
// Registern und schreibe diese in den Buffer "pucRegBuffer"
16
// fertig!
17
break;
18
}
19
20
returneStatus;
21
}
ja, so könnte das aussehen. Wenn man es geschickt anstellt kann man das
mit dem neuen Arrays auch umgehen. (Stichwort:
Registereigenschaften(R/W))
mfg
Stephan
Vielen Dank. D.h. diese 4 Methoden sind applikationspezifisch!
Noch eine Frage zur main() Methode:
1
intmain(void)
2
{
3
constUCHARucSlaveID[]={0xAA,0xBB,0xCC};
4
eMBErrorCodeeStatus;
5
6
eStatus=eMBInit(MB_RTU,0x0A,0,38400,MB_PAR_EVEN);
7
8
eStatus=eMBSetSlaveID(0x34,TRUE,ucSlaveID,3);
9
sei();
10
11
/* Enable the Modbus Protocol Stack. */
12
eStatus=eMBEnable();
13
14
for(;;)
15
{
16
(void)eMBPoll();
17
18
/* Here we simply count the number of poll cycles. */
19
usRegInputBuf[0]++;
20
}
21
}
Was macht „eMBSetSlaveID( 0x34, TRUE, ucSlaveID, 3 )”?
Nach der Anleitung: "Configure the slave ID of the device"
Ich glaube, es macht keinen Sinn, den Slave ID zu ändern, da der Master
nicht fähig ist, den Slave ID zu konfigurieren.
Wo habe ich falsch verstanden?
MfG
Senmeis
Die Daten sind fest und werden nur einmal eingestellt.
Wenn du diese Sachen nicht brauchst, dann schmeiß sie raus, ich hab
diese Funktion noch nicht in der freien Wildbahn genutzt. Es reicht
normalerweise die Slave-Adresse und die Seriennummer im Gerät.
Was du machen könntest ist, dass du dort den Namen des Gerätes
hinterlegst oder so.
mfg
Stephan
Vielen Dank.
Der Modbus-Slave soll den ID von 0x0A haben. Warum wieder mit 0x34
konfiguriert? Hat das Array "ucSlaveID[]" mit dem Slave-ID zu tun? Das
ist bisschen irreführend.
MfG
Senmeis
Hi
hat was länger gedauert, aber bin wieder da. ;-)
>Der Modbus-Slave soll den ID von 0x0A haben.
Ok, warum nicht. Ist dir überlassen.
>Warum wieder mit 0x34 konfiguriert?
Das war aus dem Beispiel. Was da drin steht ist egal.
>Hat das Array "ucSlaveID[]" mit dem Slave-ID zu tun? Das>ist bisschen irreführend.
Du hast noch die Möglichkeit weiter Infos dran zuhängen und das
geschieht wenn du den 2. Parameter auf True setzt und das Array mit der
entsprechenden Länge übergibst.
hier mal ein Beispiel: (ungetested!)
1
u08*ucSlaveID="ich bin der Master!";
2
eMBSetSlaveID(0x07,TRUE,ucSlaveID,19)
Als Antwort erhälst du dann:
ID: 0x07
Zusatz Info: ich bin der Master!
mfg
Stephan