Arduino spricht mit LOGO / Simatic S7

Begonnen von John, 10 Januar 2015, 23:44:28

Vorheriges Thema - Nächstes Thema

mani

@John so ganz komm ich noch nicht dahinter gibt es da eine Formel oder wie kann ich Rausfinden wie ich in meinem Fall VW50-VW54 und die RTC bits beschreibe?
Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

John

VW50  = VB50  und VB51

Stellt dir den VM Bereich einfach als Array von Bytes vor.
Der Index (hier 50) ist der Start-Index im Array.
Wenn du also VW 50 berschreiben wills muss du 2 Byte ab Array Index 50 schreiben

Willst du auf VW52 schreiben sind 2 Byte ab Array Index 52 zu schreiben.

Achtung VW51 liegt zur Hälfte in VW50 und VW52 mit Index 51 und 52.

Aber fange zuerste mit einem einzelnen Wert an (VW50), wenn das klappt machst du es mit mehreren.

John


CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

mani

@John okey aber wie kommt es zustande das LogoWrite(200,2,&bufferForWrite[0]); // die bytes in VB100  zu VB101 ablegt hängt das mit TSAP zusammen?

Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

John

sorry , mein Fehler
habe Beitrag #29 entsprechend korrigiert.

TSAP hat nur mit der netzwerktechnischen Adressierung zu tun, niemals mit der Adressierung der Speicherbereiche.
John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

mani

#34
@John danke  hab nun meine ersten Werte in die Logo geschrieben  :)...
byte bufferForWrite [sensorWert];
   int rval=sensorWert;
   bufferForWrite[0] = highByte(rval);
   bufferForWrite[1] = lowByte(rval);
   LogoWrite(54,2,&bufferForWrite[0]);


Mfg Mani
RasPi B+,Onkyo_AVR,Luxtronik2,Logo7,Mpd,Arduino Uno mit Ethernet,KNX,Jablotron

smarties

Zitat von: John am 10 Januar 2015, 23:44:28
Anbei noch ein Beispiel, wie ein Treppenlichtschalter realisiert werden kann, dessen Taster von unterschiedlichen Geräten erfasst werden.
I3 und I4 sind Eingänge der Logo. NI1 ist eine Netzwerkeingang der vom Arduino beschrieben wird.
Alle 3 Signale werden über B004 verodert. B003 realisiert die Funktion des Treppenlichtschalter (fertiges Funktionsmodul in Logo).
Dessen Ausgang geht auf einen Netzwerk-Ausgang, der wiederum als Relais im Arduino liegt.
(Arduino muss den zugeordneten Speicherbereiche zyklisch lesen/schreiben)

Hallo John
Ich versuche dein Beispiel nach zu bauen. Verbindung klappt schon mal. Aber wie schalte ich den Eingang 1 (V400) im Arduino?

John

Hallo smarties,

schau dir doch nachfolgende Funktion an, damit kannst du in einem Byte ein einzelnes Bit setzen.

int WriteBit(uint16_t vb, byte bit, bool value);

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

smarties

#37
Hallo John

Die Funktion "WriteBit" ist nicht in Settimino.cpp enthalten.
Ich habe nun eine Lösung mit "LogoWrite" (WriteArea) gefunden:


  //Test1: Eingang an Logo schalten
  byte Wert = 1;
  LogoWrite(400,1,&Wert);


Das funktioniert zwar zum ein und ausschalten. Ich beobachte die Variable 400 im Logo8 Webinterface.

Nun habe ich testhalber versucht REAL-Zahlen zwischen Logo und Arduino auszutauschen:


//Test2: Float Wert an Logo übergeben (wechselnd)
  float Wert2 = 35.27;
  if (booWechsler){
    booWechsler=false;
    Wert2 = -9.81;
  }
  else{
    booWechsler=true;
    }
  LogoWrite(200,4,&Wert2);



In der Variablen-Übersicht auf der Logo sehe ich dann nur -182664960 und 336413184

Ein anderer Test übergibt ein Wert von der Logo zum Arduino:


//Test 3: Wert aus Logo lesen
  int Wert3 = 0;
  LogoRead(300,1,&Wert3);
  Serial.println(Wert3);


Gebe ich in der Variablen Übersicht der Logo bei VM300 (Byte, SIGNED) den Wert 56 ein, dann bekomme ich am Arduino auch 56. Wenn ich aber -56 eingebe, bekomme ich am Arduino 200!

Wo muss ich hier ansetzen um mein Ziel zu erreichen? Es müssen sich schlussendlich Zahlen beliebiger Grösse beidseitig übertragen lassen.

Zur Info: bin auf der Logo, sowie auf dem Arduino Anfänger, aber mit bereits einigen Erfahrungen.
Meine Zielanwendung ist eine Solarsteuerung. Die Temperaturen werden mit Onewire auf dem Arduino erfasst.
Dann speichere ich sie in einer mysql DB und werte diese mittels PHP auf einer Website aus.

lg smarties

John

#38
Hallo smarties,

ZitatDie Funktion "WriteBit" ist nicht in Settimino.cpp enthalten.
Ich habe nun eine Lösung mit "LogoWrite" (WriteArea) gefunden:
Wenn du Settimino-Variante aus dem Projekt verwendest das im ersten Beitrag betreitsteht, wirst du diese Funktion finden.
Ich habe Settimino entsprechend erweitert.

ZitatNun habe ich testhalber versucht REAL-Zahlen zwischen Logo und Arduino auszutauschen:
Das ist ziemlich sinnfrei, da Logo ohnehin keine Real-Zahlen verarbeiten kann.

Ich rate dir dringend mit Festpunktzahlen zu arbeiten. Das ist in der Logo der Standard.
Beispiel: du legts 123 in VW120 ab, was 12.3 Grad Celsius bedeuten soll.
Die gedachte Einheit ist also 1/10 Grad. Die Nachkommstallen sind also eine Konvention die du mit dir selber vereinbarst.
(Der Arduino Programmierer muss das wissen und der Logo-Programmierer ebenso).



  int Wert3 = 0;
  LogoRead(300,1,&Wert3);

Du liest hier 1 Byte in auf einen int (2 Byte ). Das kann nicht gut gehen.

Grundsätzlich solltest du dich noch mit dem Thema "Endianess" beschäftigen.


John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

smarties

Hallo John

Das mit den Festpunktzahlen leuchet mir ein. Habe auch versucht mich mit dem Thema Endianess auseinanderzusetzen.  Verstehe das noch nicht so richtig.
Was mir schon mal helfen würde, ist ein Beispiel, wie ich int-Zahlen (positive wie negative vom Arduino aufs Logo-Display bringe.

lg smarties

John

Die Logo ist ein Big-Endian Maschine, der Arduino hingegen eine Little-Endian.

Damit muss bei der Logo bei aufsteigernder Adresszählung das höherwertige Byte des Integer zuerst erscheinen, danach das niederwrtige Byte.

Das wird auch beim Zurücklesen der Daten von der Logo deutlich via Settimino
Zitatword S7Helper::WordAt(void *Buffer, int index)
{
    word hi=(*(pbyte(Buffer) + index))<<8;
    return hi+*(pbyte(Buffer) + index+1);
}

Hier wird das höherwertige Byte by index und niederwertibge bei index + 1 erwartet.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

smarties

Langsam verstehe ich das. Habe folgendes versucht:


//Test2: Wert an Logo übergeben (wechselnd)
  int Wert2 = 3527;
  if (booWechsler){
    booWechsler=false;
    Wert2 = -981;
  }
  else{
    booWechsler=true;
    }
  LogoWrite(200,2,&Wert2);


Den Wert 3527 kann ich nun in der Logo Variablen-Ansicht entschlüsseln, in dem ich die beiden Byte vertausche.
Mit -981 krieg ich das nicht hin. Negative Zahlen werden anders behandelt?

Wie kann ich den Wert 3527 im Logo Display anzeigen?

Danke für deine Geduld.

lg smarties

John

Du musst natürlich im Logo-Browser den korrekten Datentyp wählen.

Folgender Wert im Anhang ist im Arduino als int definiert und wird auch bei negativem Wert korrekt dargestellt.
(Arduino erfasst über 1-Wire-Sensor die Raumtemperatur, diese ist in 10-tel Grad zu verstehen)

Ein Arduino-int muss im Logo-Datenbrowser als WORD/Signed dargestellt werden.

Negative Zahlen werden bei Arduino und Logo im 2-er Komplement repräsentiert.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

smarties

Danke, das hilft mir ein wenig weiter.

Hast du mir noch einen Tipp, wie ich den Inhalt der Variablen aufs Logo-Display bringe?

lg smarties

John

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP