TIA Auswertung einer TCP-Message

kami

Level-1
Beiträge
103
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich sende von meinem PC per TCP Telegramme an meine S7. Diese werden auch aktuell über Chars to String und COMPARE ausgwertet und verglichen.
Ich möchte nun gerne folgendes mit einer Nachricht tun:

Der Aufbau ist folgender: M12384ON
Das soll bedeuten: Der Merker 12384 soll gesetzt werden.

Oder genauso: M12384OFF
Das soll bedeuten: Der Merker 12384 soll zurückgesetzt werden.

Wie mache ich das in FUP am einfachsten?
Ich möchte natürlich, dass die SPS immer nachguckt ob es diesen Merker mit der Nummer überhaupt in der PLC-Tabelle gibt und den dann setzt. Ich möchte das ganze natürlich variabel mit den Nummern halten.


Vielen Dank für Tipps.

Gruß kami
 
Sowas destruktives würde ich auf gar keinen Fall implementieren :sm14:
Und dann auch noch in FUP... :ROFLMAO: kaum Ahnung vom Programmieren, aber von außen wild im SPS-Speicher rumschmieren wollen... :roll:

Sowas gibt es übrigens schon fertig, wo man in der CPU nichtmal was programmieren muß, das nennt sich "unspezifizierte S7-Verbindung".
Welche CPU willst Du programmieren?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sowas destruktives würde ich auf gar keinen Fall implementieren :sm14:
Und dann auch noch in FUP... :ROFLMAO: kaum Ahnung vom Programmieren, aber von außen wild im SPS-Speicher rumschmieren wollen... :roll:

Im Gegenteil hat er über die TCP-Verbindung und Auswertung der Telegramme in der SPS die volle Kontrolle darüber welche Werte wo in den Speicher geschrieben werden können. Bei einer S7-Verbindung kann dir jeder wie er will im Speicher "rumschmieren".

Möglich ist das durchaus auch in FUP.
Ich würde aber das Format zwecks einfacherer Verarbeitung etwas umstellen.
1. Zeichen fix: 1 Char Speicherbereich (z.B. M)
2./3./4./5. Zeichen: 4 Chars für die Adresse mit führenden Nullen (z.B. 0012)
6. Zeichen fix =
7. Zeichen für den Wert der geschrieben werden soll. Wenn nur Bool-Werte geschrieben werden dann nur 0 und 1 erlaubt.

Dann setzt "M0012=1" Merker 12 (welches Bit musst du wissen) auf 1.

Dadurch, dass alle Positionen fest sind muss nichts durchsucht werden, sondern nur die Werte auf Gültigkeit geprüft werden.
 
Naja ... um aber bei der Frage zu bleiben ...
Das, was du da sendest, ist ein String. Du mußt dir also den String zerlegen um dann via String-Vergleich die gewünschten Aktionen ausführen.
Und an der Stelle wird es dann auch ganz schnell unpraktikabel. Wenn es sich hier nämlich um viele Variablen handelt, die es zu zerlegen gilt dann nimmt dein Vergleichs-Programm sehr schnell astronomische Dimensionen an.

Gruß
Larry
 
Wenn die Länge einer Anweisung fix ist, benötigt er überhaupt keine Stringfunktionen, wahrscheinlich weil er vom PC aus auch keinen S7-String sondern einen nullterminierten String sendet. Er kann in der SPS jedes Zeichen einzeln durchgehen, auf Gültigkeit prüfen und auswerten. In FUP muss dazu die Typüberprüfung am Operanden abgeschaltet werden, damit man mit den Vergleichsfunktionen für Integer auch Chars / Bytes vergleichen kann.

Das Zerlegen so eines Telegrammes ist auch in FUP möglich. Für die indirekte Adressierung kommt er aber wohl um AWL nicht herum, das sind aber nur noch wenige Zeilen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK ... das geht natürlich auch. Ist im Grunde nicht sehr viel anders als wenn man mit ANY-Pointern arbeitet.
Klar - den Empfangsstring zerlegen in Speicherbereich (Char) und die Adresse (z.B. Integer), eventuell noch irgend was mit der Bitnummer machen und am Ende die Aktion.
Du hast Recht - das ist dann gar nicht mehr so ein schrecklicher Aufwand ...

Gruß
Larry
 
Hi,

habe ich soweit verstanden. Zur Zeit sieht der ganze Spaß so aus. Klappt auch super, nur soll halt von der ID nun nicht immer nur Merker 4.0 angesprochen werden, sondern der dementsprechend passende.

Gruß kami

Unbenannt1.JPG

Unbenannt2.JPG
Unbenannt3.JPG
 
Bei der 1200 ist so ein Zugriff auf Merker soweit ich weiß nur in SCL möglich. Dort gibt es dazu die "schönen" PEEK und POKE, zum Schreiben wäre dann POKE_BOOL der richtige Befehl.
Wenn du anstatt auf Merker auf einen speziellen Datenbaustein der ein Bool-Array (als Merkerersatz sozusagen) beinhaltet schreibst, ist es auch in FUP möglich. Dann bräuchtest du nichtmal spezielle Funktionen, weil man bei der 1200 auch in FUP ganz einfach per Array-Index darauf zugreifen kann.
 
Im Gegenteil hat er über die TCP-Verbindung und Auswertung der Telegramme in der SPS die volle Kontrolle darüber welche Werte wo in den Speicher geschrieben werden können. Bei einer S7-Verbindung kann dir jeder wie er will im Speicher "rumschmieren".
Klar, ich glaube auch fest daran, daß der TE den zugreifbaren Bereich kontrollieren und begrenzen wird :ROFLMAO: ... das macht doch sooo viel Arbeit extra und erfordert, daß er sich Gedanken machen muß, worauf er zugreifen will und darf. Seine Idee interpretiere ich aber so, daß er später überallhin zugreifen will, ohne jetzt schon zu wissen wohin und warum. (vielleicht eine Not-Rettungsmöglichkeit, um buggy Programme von außen wieder zum Leben zu bringen?) Er drückt sich darum, eine vernünftige Datenaustausch-Schnittstelle festzulegen.

Dann schon lieber die S7-Verbindung. So eine S7-Verbindung kriegt nicht jeder Skript-Kiddy hin. Und Fachleute brauchen so eine Unterstützung im SPS-Programm nicht.

Ich sehe keinen vernünftigen Grund für eine normale Anwendung, absolut adressiert von außen in den Speicher der SPS schreiben zu müssen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

dann bringe ich da doch einfach Licht ins Dunkel. Auf dem PC läuft ein Perlskript ist ein Linuxrechner. Dieser Rechner soll die Lichter in meinem Haus an und ausschalten können. Dazu sendet der Rechner M12345ON und dadurch wird die Lampe, die dem Merker zugeordnet ist angeschaltet.
Mir geht es darum, das ich für alle 65 Ausgänge nicht komplett jede Zahl einzeln auswerten muss, sondern nur die nutze und nicht nur vergleiche? Ist das verständlich beschrieben?

Gruß kami
 
Dann ist das mit den Datenbaustein als eindeutige Schnittstelle doch sogar logischer.
Du nennst den Datenbaustein z.B. "PC_BEFEHLE" mit einer Variable "BEFEHL_LAMPE_NR" Array[1..100] of Bool.
Wenn du die Nummer aus dem Befehl extrahiert hast, kannst du den Befehl per "PC_BEFEHLE".BEFEHL_LAMPE_NR[#Nummer] an die entsprechende Stelle durchgeben.
 
Dann würde ich die Befehlssyntax aber nach der Funktion benennen. Also anstelle von M nimmst du L (für Lampe), dann kannst du es relativ leicht erweitern falls du mal Steckdosen schalten willst. Und wenn du die deutschen Bezeichnungen "EIN" und "AUS" für den Wert nimmst, hast du auch immer 3 Zeichen und muss kein "ONN" verwenden.
 
Die Variable #Nummer muss vom Datentyp Integer sein. Du musst erst aus dem String mit der Nummer eine Integerzahl machen. Da gibt es fertige Funktionen, musst nur prüfen ob die fertigen auch mit führenden Nullen klarkommen.
Dann prüfst du die #Nummer auf gültigen Bereich, und kannst dann in FUP über die Zuweisungsbox ("=") das direkt mit "PC_BEFEHLE".BEFEHL_LAMPE_NR[#Nummer] hinschreiben.
 
Hi,

super Geschichte das hat toll geklappt und ich kann nun per TCP-Message alles ein und aus schalten. :)

Vielen Dank.

Gruß kami
 
Zurück
Oben