Raspberry PI Modbus TCP/IP Server

Hallo

Irgendwie bekomme ich das nicht gebacken.

Ich habe alles laut Anleitung auf den Raspberry installiert.
Von Bit 2 bis 7 Habe ich die Heizungspumpen auf dem Raspberry hängen, das funktioniert einwandfrei.

Aber das auslesen der 1-Wire temp sensoren funktioniert bei mir nicht.

mfg
Manni

Hallo Manni,

das sollte auf keinen Fall ein Problem darstellen.

Als erstes solltest Du mit dieser Anleitung, wie auf Seite 1 auch schon verlinkt, http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/ die Sensoren einrichten. Dann solltest Du die Temperaturen auch auf dem Raspberry per Putty sehen:
„…Two lines of text will be printed. On the second line, the section starting „t=“ is the temperature in degrees Celsius. A decimal point goes after the first two digits, so the example value of „t=22250“ is in fact „t=22.250“ degrees Celsius:…“

Wenn das funktioniert, stell bitte noch einmal eine Frage zu der „Modbus - IP-Symcon - Anbindung“, falls mein Beispiel bei Dir noch Probleme bereitet.

Frohe Ostern !

Hallo Herbert.

Ich habe bereits schon alle Temperatur-Sensoren eingebunden.
Zur zeit werden diese per SSH abgefragt.
Aufgrund der langen Skriptlaufzeit würde ich lieber die Temperaturen über Modbus abfragen.

Und genau dort habe ich das problem ich weis icht welche Schreib bzw. Leseadresse ich auswählen muss.

Danke schon mal für deine Antwort.

Lg
und Frohe Ostern

Manni

Sehr gut.

Hi Manni,

Du solltest als erstes eine „normale“ Integer-Zahl per Modbus zum IPS übertragen.
Mach doch in dem mb.c Code eine Variable auf 250 (die Division durch 10 um auf 25°C zu kommen mach ich im IPS).

Im Beitrag 12 dieses Threads ist ein Snapshot für die Adresse 16.

Im mb.c File (siehe Beitrag 9 dieses Threads) müsste m.E. folgendes stehen:

  mb_mapping = modbus_mapping_new(0, 0, 0, 32); // würde bedeuten 32 Adressen für Input Register (die 16 wäre in der Mitte)
  /*  Aufbau:
      mb_mapping = modbus_mapping_new(
        UT_BITS_ADDRESS + UT_BITS_NB,
        UT_INPUT_BITS_ADDRESS + UT_INPUT_BITS_NB,
        UT_REGISTERS_ADDRESS + UT_REGISTERS_NB,
        UT_INPUT_REGISTERS_ADDRESS + UT_INPUT_REGISTERS_NB);
  */

Auf den Modbus sendest Du mit:

mb_mapping->tab_input_registers[n]=temp;

Also zum Beispiel (dies sollte eine 250 auf die Adresse 16 senden (bzw. zur Abholung (5sek) bereitstellen):

mb_mapping->tab_input_registers[16]=250;   //würde nach meiner mb.c die "feste" Temperatur 25°C senden (als 250) 

Viel Erfolg

herbertf

Hallo Herbert

Ich habe jetzt die mb.c File angepasst aber ich bekommen in ips immer noch keinen wert aktualisiert.

mb_mapping = modbus_mapping_new(8, 16, 0, 32);
  /*  Aufbau:
      mb_mapping = modbus_mapping_new(
        UT_BITS_ADDRESS + UT_BITS_NB,
        UT_INPUT_BITS_ADDRESS + UT_INPUT_BITS_NB,
        UT_REGISTERS_ADDRESS + UT_REGISTERS_NB,
        UT_INPUT_REGISTERS_ADDRESS + UT_INPUT_REGISTERS_NB);
  if (rc != -1) 
  {
	for(n=8;n<=16;n++)								//Input-Ports abfragen
	{
		mb_mapping->tab_input_bits[n]=digitalRead(n);
	} 
	time_t t;
	t = time(NULL); 
	int sek=t%10;				//durch 10=alle10Sek
	if (sek == 0)   {      		//durch 10=alle10Sek
		for(n=16;n<18;n++)		//Anzahl Sensoren-jedes Verzeichnis einzeln auslesen	16-da ModbusAdr=16 für ersten Sensor
		{																				// jeder Sensor 16bit Word in IPS
			switch (n)	{
				case 16:	strcpy(tempsensor,"28-0000055004ed");	//jeweiliger DS18B20 Sensor
						break;
				case 17:	strcpy(tempsensor,"0815");				//jeweiliger DS18B20 Sensor
						break;
				default: break;
			}	
			temp=temp_onewire(tempsensor);
			if(temp!=3333) mb_mapping->tab_input_registers[n]=temp;			
		}		
	} 	
	modbus_reply(ctx, query, rc, mb_mapping);
	for(n=0;n<8;n++) digitalWrite(gpio[n], mb_mapping->tab_bits[n]);	
    return 1;
  } 
  else 
  {
    /* Connection closed by the client or error */
    return -1;
  }
}

Danke nochmals

Manni

Schreib mal dies:

mb_mapping->tab_input_registers[16]=250; 

vor die Zeile:

modbus_reply(ctx, query, rc, mb_mapping);

Muss gehen! (Bitte prüf vorher ob Du mb beendet hast (im Putty: „sudo killall mb“) - danach Start „sudo ./mb“)

Gute Nacht. Bis Morgen.

herbert

Ok habe ich jetzt gemacht.

 int mb_poll(void)
{
  uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
  int rc;
  int n;
  rc = modbus_receive(ctx, query); 
  if (rc != -1) 
  {
	for(n=8;n<=16;n++)								//Input-Ports abfragen
	{
		mb_mapping->tab_input_bits[n]=digitalRead(n);
	} 
	time_t t;
	t = time(NULL); 
	int sek=t%10;				//durch 10=alle10Sek
	if (sek == 0)   {      		//durch 10=alle10Sek
		for(n=16;n<18;n++)		//Anzahl Sensoren-jedes Verzeichnis einzeln auslesen	16-da ModbusAdr=16 für ersten Sensor
		{																				// jeder Sensor 16bit Word in IPS
			switch (n)	{
				case 16:	strcpy(tempsensor,"28-0000055004ed");	//jeweiliger DS18B20 Sensor
						break;
				case 17:	strcpy(tempsensor,"0815");				//jeweiliger DS18B20 Sensor
						break;
				default: break;
			}	
			temp=temp_onewire(tempsensor);
			if(temp!=3333) mb_mapping->tab_input_registers[n]=temp;			
		}		
	} 	
	mb_mapping->tab_input_registers[16]=250;  
	modbus_reply(ctx, query, rc, mb_mapping);
	for(n=0;n<8;n++) digitalWrite(gpio[n], mb_mapping->tab_bits[n]);	
    return 1;
  } 
  else 
  {
    /* Connection closed by the client or error */
    return -1;
  }
}

Wert 250 wird übertragen.
aber wie bekomme ich das jetzt mit den sensoren hin habe 10 Temp fühler.

Danke nochmals

Manni

Hi,

okay, dann die Zeile mit den 250 wieder raus löschen, Dein IPS funkt jetzt.

Dann in dieser Zeile Deinen korrekten Verzeichnisnamen (anstelle: „28-0000055004ed“) des DS18B20 eintragen.

case 16:    strcpy(tempsensor,"28-0000055004ed");    //jeweiliger DS18B20 Sensor

Wenn Du die Kommentare (//) vor

//printf("%s",buf);

entfernst. müsstest Du m.E. im Putty den ermittelten Wert sehen.

herbert

Hallo Herbert,

Du bist der beste danke für deine Mühen hat super geklappt.

LG

Manni

Gern. Viel Spaß mit Raspberry und IPS.

Hallo,
erstmal vielen Dank für diese tolle Lösung zum Anbinden des Raspberry an IPS! Es hat alles geklappt und läuft problemlos. Wenn ich jedoch den Raspberry neu starte, wird der Modbusserver anscheinend nicht mit gestartet. Ich muss diesen dann erneut mit „sudo ./mb“ starten, damit die 1-wire Temperaturen wieder ankommen.
Gibt es eine Möglichkeit dies automatisch beim booten des Raspberry zu starten (Autostart)?
Gruß
Thorsten

Hallo todorb,

schön, dass es Dir gefällt. Ich habe mittlerweile 5 PI mit dieser Lösung im Einsatz, zwei davon als Türsprechstellen mit PJSIP als VoIP-Client.
Entgegen anderer Meinungen im Web, habe ich auch ca. 7 I²C-Schnittstellen direkt am Raspberry PI (kleiner 30cm) ohne jede Pegelwandlung, über 9 Monate ohne jeglichen Ausfall (i2c von Horter und Kalb).
Zusätzlich zum IPS Watchdog sende ich mir allerdings vom PI minütlich ein LifeBit und starte bei Problemen (z.B. Windows Updates = Downzeiten) mittels Batch den PI neu:

c:\batch\plink -ssh -v -batch pi@<ip-adresse> -pw <passwort> sudo init 6

Wichtig hierfür ist, dass das Konto des IPS-Dienstes (sollte ein USER-Konto sein) muss auch das Konto für den Putty bzw. Plink Befehl sein.

Mittlerweile habe ich auch meine C-Codes optimiert und rufe die meisten Threads mit folgenden Aufruf auf:

  if(pthread_create(&t2, NULL, (void *)&i2c_eingaenge2,NULL) != 0)
    {
      fprintf(stderr, "Fehler bei Thread 2 Eingaenge 2.....
");
      exit(0);
    }    

Hier kann aber sicher jeder, der sich an die Thematik Raspberry Modbus wagt, selber „Optimierungen“ vornehmen.

Nun zu Deiner Frage:
Start mittels:
/Setting it to be run
To launch the script at start-up edit the “rc.local” file needs to be edited.
sudo nano /etc/rc.local
Add the following line:
/

/home/pi/bin/script_auto_run

Inhalt script_auto_run:

#!/bin/bash
# Script to start our application
echo "Doing autorun script..."
sudo modprobe w1-gpio
sudo modprobe w1-therm
sudo /home/pi/mb/mb &

Viele Grüße
HerbertF

Hallo Herbert,

vielen Dank für Deine Anleitung! Ich bin gerade erst dazugekommen das unzusetzen und es klappt.

Gruß
Thorsten

Hallo und erstmal vielen Dank für die Skripte :slight_smile:

hab mich mit Hilfe der Anleitung hier nun auch mal mit dem Pi und Modbus beschäftigt.
Modbusverbindung ist da und Ausgänge schalten funktioniert auch.
Nur stimmt bei mir etwas mit der Zuordnung nicht so ganz.

IPS Bit 0 spricht WPI 7 an
IPS Bit 1 spricht WPI 0 an
IPS Bit 2 spricht WPI 1 an
IPS Bit 3 spricht WPI 2 an
IPS Bit 4 spricht WPI 3 an
IPS Bit 5 spricht WPI 4 an
IPS Bit 6 spricht WPI 5 an
IPS Bit 7 spricht WPI 6 an

an was kann das liegen?

Grüße Thomas

Hallo zusammen,

vielen Dank für das script und die wunderbaren Erklärungen.
Es funktioniert alles bestens bis auf ein kleines Thema was die letzten Tage vermehrt aufkam.
Socket Error 10054 nach jedem verbinden.

Könntet ihr mir hier weiterhelfen

Grüße Andreas

Hallo Zusammen, könnte mir bitte jemand erklären wie das mit dem modbus mapping funktioniert?

/*  Aufbau:
      mb_mapping = modbus_mapping_new(
        UT_BITS_ADDRESS + UT_BITS_NB,
        UT_INPUT_BITS_ADDRESS + UT_INPUT_BITS_NB,
        UT_REGISTERS_ADDRESS + UT_REGISTERS_NB,
        UT_INPUT_REGISTERS_ADDRESS + UT_INPUT_REGISTERS_NB);
  */

Ich brauche GPIO14 (pin8), GPIO23 (pin16) und GPIO8 (pin24) als Ausgänge und müsste einen Temperatursensor auslesen.
GPIO23 (Schreibadresse 5) funktioniert einwandfrei, sobald ich aber über Schreibadresse 7 gehe, erhalte ich den Fehler ILLEGAL_DATA_ADDRESS.
Ich möchte nicht einfach an den mb_mapping parametern herumspielen, ich möchte gerne verstehen was die Parameter bedeuten :confused: Habe leider nichts gefunden was mir weitergeholfen hätte.
Vielen Dank für eure Hilfe
Gruss Roland

Hallo,

irgendwie stehe ich total im Wald… :confused:

Das C-Script (aus #13) ist auf meinem Pi am laufen (und mit IPS verbunden. Pi sagt „connceted“).

Ich will erstmal ganz trivial (oder für mich auch nicht :confused:) einen GPIO (bei mir GPIO26 (=wPi26, BCM 12)) als digitalen Eingang (mit einem Taster geschaltet) nutzen bzw. aus IPS abfragen. Der Schalter geht (kann ich mit „gpio readall“ kontrollieren. Aber in IPS bekomme ich keine Antwort (?).
Welche Adresse muss ich in der IPS-Modbus-Instanz eingeben? Bzw. muss ich in dem c-Script was anpassen? Ich steige durch das c-script leider nicht durch.

Gruß
hardlog

Hi,

dies (IP-Symcon auf Raspberry mit Nutzung der GPIOs) ist „NEUER“ und leichter …

Ciao
HerbertF

Hallo,

es ist Sommer und der Rasensprenger Raspberry Pi läuft wieder.
Leider bekomme ich nun nachdem Update auf die neue Version im Winter folgende Meldungen angezeigt.

An für sich funktioniert alles, nur spamt es mit die das Fenster mit den Meldungen zu

Hat hier jemand Abhilfe.

IPS läuft auf einem Windows Server im Keller und der Pi hängt im Gartenhaus und wird per Modbus angesprochen.

Liebe Grüße

Kommen die Werte überhaupt? Wenn ja, fragst du ggf. zu oft ab und der Pi ist überfordert?

paresy