(erledigt!!) verstehe modbus nicht ganz
-
Guten Abend,
Ich habe in einem Code (der eine I/O platine ausliest)
eine Zeile die lautet:
Modbus mb("123.123.123.123", "502")wenn ich das bislang richtig verstehe dem Bus mb die IP-Adresse 123.123.123.123 und Port 502 ? zugeordnet.
Könnte man den Bus mb auch mehrer IP´s zuordnen ?
Mfg
Michael
-
Dieser Thread wurde von Moderator/in Marc++us aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
a) Wovon redest du bitte?
b) C++ kennt keine Busse
-
Hier mal kleine Auschnitte, gibt es denn Modbus in c ?
#include <bwctmb/bwctmb.h>
Modbus mbja("192.168.55.24", "502"); // Jalousie
inputsja = mbja.read_discrete_inputs(255, 0, 16);
outputsja_tmp = outputsja = mbja.read_coils(255, 0, 16);
-
Brusko schrieb:
Hier mal kleine Auschnitte, gibt es denn Modbus in c ?
^^nee, das ist irgendso'n protokol für SPSn. musst mal in deine doku gucken, wie die ansteuerung geht.
btw, dein code sieht nicht nach C aus (bis auf das #inlcude).
-
Doku ist gut
ich suche gerade noch den original code :-).
also kommt das Modbus so aus dem header ?
-
schau mal hier: http://www.lammertbies.nl/comm/info/modbus.html
-
die links hatte ich glaube ich schon gefunden aber da englisch nicht so mein Fach war stehe ich da etwas aufen Schlauch *g*
Hab nu mal in die bwctmb geschaut und da steht unteranderm als funktionbool
Modbus::read_discrete_input(uint8_t address, uint16_t num) {
bool ret;mtx_bus.lock();
try {
packet[0] = address;
packet[1] = READ_DISCRETE_INPUTS;
packet[2] = num >> 8;
packet[3] = num & 0xff;
packet[4] = 0x00;
packet[5] = 0x01;
packetlen = 6;
do_packet();
} catch (...) {
mtx_bus.unlock();
throw;
}
ret = packet[3];
mtx_bus.unlock();
return ret;
}und ich gehe dann mal von aus das ich nur eine IP als unit adress angeben kann .
jemand evtl eine Idee (hinweis) wie ich 8 platinen im gleiche bus bekomme ?
-
Brusko schrieb:
jemand evtl eine Idee (hinweis) wie ich 8 platinen im gleiche bus bekomme ?
Vermutlich garnicht. Aber wieso solltest du das wollen? Mach doch für die 8 Platinen einfach 8 Modbus Instanzen, und steuer die getrennt an.
Falls es Probleme mit Delays gibt (vermutlich werden blocking sockets verwendet), kannst du mehrere Threads verwenden. Wobei... dann begibst du dich natürlich ins Reich der Schmerzen (tm).
-
hustbaer schrieb:
Brusko schrieb:
jemand evtl eine Idee (hinweis) wie ich 8 platinen im gleiche bus bekomme ?
Vermutlich garnicht.
und wieso heisst der modbus modbus?
brusko: wie's aussieht nimmste tcp als transportprotokoll? dann muss wahrscheinlich jedes modul eine andere ip-adresse haben.
-
Basher schrieb:
hustbaer schrieb:
Brusko schrieb:
jemand evtl eine Idee (hinweis) wie ich 8 platinen im gleiche bus bekomme ?
Vermutlich garnicht.
und wieso heisst der modbus modbus?
Vermutlich weil auf der Platine dann ein Bus ist, an dem mehrere Geräte hängen können?
Deswegen lassen sich aber noch lange nicht mehrere Platinen zu einem "Über-Bus" zusammenschalten.
-
stimmt jede Platine hat seine eigene IP adresse und mus extra aufgerufen werden,
nun sitze ich mehr oder weniger dadrüber wie ich die einzelnen SArrys zusammen füge, ich möchte gerne ein Array haben z.b input [128].int main (int argc, char *argv[]);
/*** offene Variabeln ***/
SArray<bool> input , output , output_tmp;
SArray<bool> input01 , input02 , input03 , input04 ,
input05 , input06 , input07 , input08;
SArray<bool> output01 , output02 , output03 , output04 ,
output05 , output06 , output07 , output08;
SArray<bool> output_tmp01 , output_tmp02 , output_tmp03 , output_tmp04 ,
output_tmp05 , output_tmp06 , output_tmp07 , output_tmp08;/*** Bus (Netzwerk) IP der jeweligen Netzwerkkarte ***/
Modbus mb01("192.168.55.110", "502"); // Mac 00:0E:42:02:00:E1
Modbus mb02("192.168.55.107", "502"); // Mac 00:0E:42:02:00:E2
Modbus mb03("192.168.55.112", "502"); // Mac 00:0E:42:02:00:E3
Modbus mb04("192.168.55.109", "502"); // Mac 00:0E:42:02:00:E4
Modbus mb05("192.168.55.103", "502"); // Mac 00:0E:42:02:00:E5
Modbus mb06("192.168.55.108", "502"); // Mac 00:0E:42:02:00:E6
Modbus mb07("192.168.55.111", "502"); // Mac 00:0E:42:02:00:E7
Modbus mb08("192.168.55.105", "502"); // Mac 00:0E:42:02:00:18/*****************************************************************************
* Funktionen zum Auslesen der Aus-&Eingaenge und schreiben der Eingänge *
*****************************************************************************/
void inputsread ()
{
input01 = mb01.read_discrete_inputs(255, 0, 16);
input01 = mb01.read_discrete_inputs(255, 0, 16);
input02 = mb02.read_discrete_inputs(255, 0, 16);
input03 = mb03.read_discrete_inputs(255, 0, 16);
input04 = mb04.read_discrete_inputs(255, 0, 16);
input05 = mb05.read_discrete_inputs(255, 0, 16);
input06 = mb06.read_discrete_inputs(255, 0, 16);
input07 = mb07.read_discrete_inputs(255, 0, 16);
input08 = mb08.read_discrete_inputs(255, 0, 16);}
void outputsread ()
{
output_tmp01 = output01 = mb01.read_coils(255, 0, 16);
output_tmp02 = output02 = mb02.read_coils(255, 0, 16);
output_tmp03 = output03 = mb03.read_coils(255, 0, 16);
output_tmp04 = output04 = mb04.read_coils(255, 0, 16);
output_tmp05 = output05 = mb05.read_coils(255, 0, 16);
output_tmp06 = output06 = mb06.read_coils(255, 0, 16);
output_tmp07 = output07 = mb07.read_coils(255, 0, 16);
output_tmp08 = output08 = mb08.read_coils(255, 0, 16);
}/*****************************************************************************
* MAIN menu *
*****************************************************************************/
int main(int argc, char *argv[])
{
inputsread();
cout << input01[1];
}Die offen Variabln will ich noch zum großen Teil in den funktionen einfügen.
ich weis nu nicht wie ich die zusammen füge das die reihe nach hinten dran gesetzt werden
-
Solange du nicht dazuschreibst, was SArray ist (wo kommt das her? Sourcen?), wird dir vermutlich keiner helfen können.
-
Die platinen sind mit 16 I/O aufgebaut die den wert 1 oder 0 haben
bzw true oder false.
mit z.b. "input01 = mb01.read_discrete_inputs(255, 0, 16)" lese ich mir ja nun von der ersten Platine die Eingänge aus in input01[0]=1 input01[1]=0 usw.Num möchte ich gerne diese einzelnen Array in einem zusammen fügen z.b
input01[0]=0 .......bis input01[15]=0
zusammen mit
input02[0]=0 .......bis input02[15]=0
ergibt
inputgesamt[32]das heist wenn ich nu inputgesamt[16] aufrufe das ich darin den inhalt von
input02[0] findemfg Michael