Versuchen Sie, SPS-Register mit [SLMP] zu lesen / schreiben (https://www.cc-link.org/ja/cclink/slmp/index.html). Ich habe in diesem Artikel über den Bitzugriff im Binärcode geschrieben.
Stellen Sie zunächst eine Verbindung mit der SPS her.
HOST = '192.168.1.1'
PORT = 1026
BUFSIZE = 4096
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.settimeout(3)
Dies ist der grundlegende Parameter, der in der SLMP-Anforderungsnachricht festgelegt werden muss.
Lesen Sie das CPU-Einheitenregister der SPS, die über Ethernet direkt mit dem Host-PC verbunden ist. Stellen Sie in diesem Fall das SPS-Zugriffsziel gemäß den SLMP-Bestimmungen wie folgt ein.
Item | Value |
---|---|
Angeforderte Netzwerknummer | 00h |
Zielvorwahl anfordern | FFh |
Angeforderte Einheiten-E / A-Nummer | 3FFh |
Anfordern der Ziel-Multi-Drop-Vorwahl | 0 |
Der Überwachungstimer wird in Einheiten von 250 ms eingestellt. Diesmal auf 4 (1 Sekunde) einstellen.
Dieses Mal werden wir das Datenregister verwenden. Wortzugriff. Der ASCII-Code ist "D *" und der Binärcode ist A8h.
Stellen Sie die Anforderungsnachricht zusammen und senden Sie den Rahmen. Verwenden Sie den Wortzugriff des Befehls Lesen (0401h).
Zum Zeitpunkt des Binärcodes ist es erforderlich, den Wert mit Ausnahme des Subheaders in Little Andian zu speichern. Seien Sie vorsichtig, denn nur der Subheader ist aus irgendeinem Grund ein Big Endian.
Liest die Werte der drei Register D0001 bis D0003.
# '5000 00 FF 03FF 00 0018 0020 0401 0000 D* 000001 0003'
data = [
0x50,0x00, #Subheader
0x00, #Angeforderte Netzwerknummer
0xFF, #Zielvorwahl anfordern
0xFF,0x03, #Angeforderte Einheit I./O-Nummer
0x00, #Fordern Sie die Multi-Drop-Vorwahl für das Ziel an
0x0C,0x00, #Datenlänge anfordern(Später eingestellt)
0x20,0x00, #Timer überwachen
0x01,0x04, #Befehl
0x00,0x00, #Unterbefehl
0x01,0x00,0x00, #Erste Gerätenummer
0xA8, #Gerätecode
0x03,0x00 #Gerätebewertung
]
#Legen Sie die Länge der Anforderungsdaten fest
data[7] = len(data[9:]) & 0xFF
data[8] = (len(data[9:]) >> 16) & 0xFF
#Anfrage senden
sock.send(bytes(data))
#Antwort erhalten
res = sock.recv(BUFSIZE)
print (*[format(i,'02X') for i in res])
Die empfangenen Daten sind wie folgt. Die aktuellen Registerwerte waren alle 0.
D0 00 00 FF FF 03 00 08 00 00 00 00 00 00 00 00 00
Stellen Sie die Anforderungsnachricht zusammen und senden Sie den Rahmen. Wortzugriff für den Befehl Schreiben (1401h).
Schreiben Sie Werte in die fünf Register D0000 bis D0004.
# '5000 00 FF 03FF 00 0018 0020 0401 0000 D* 000000 0005 1122 3344 5566 7788 99AA'
data = [
0x50,0x00, #Subheader
0x00, #Angeforderte Netzwerknummer
0xFF, #Zielvorwahl anfordern
0xFF,0x03, #Angeforderte Einheit I./O-Nummer
0x00, #
0x00,0x00, #Datenlänge anfordern(Später eingestellt)
0x04,0x00, #Timer überwachen
0x01,0x14, #Befehl(1401H)
0x00,0x00, #Unterbefehl
0x00,0x00,0x00, #Erste Gerätenummer
0xA8, #Gerätecode
0x05,0x00, #Gerätebewertung
0x11,0x22, # D0000
0x33,0x44, # D0001
0x55,0x66, # D0002
0x77,0x88, # D0003
0x99,0xAA, # D0004
]
#Legen Sie die Länge der Anforderungsdaten fest
data[7] = len(data[9:]) & 0xFF
data[8] = (len(data[9:]) >> 16) & 0xFF
#Anfrage senden
sock.send(bytes(data))
#Antwort erhalten
res = sock.recv(BUFSIZE)
Wenn Sie nach Abschluss des Schreibvorgangs den Befehl Lesen erneut ausführen, lautet das Ausführungsergebnis wie folgt.
D0 00 00 FF FF 03 00 08 00 00 00 33 44 55 66 77 88
Sie können sehen, dass das Schreiben und Lesen korrekt ausgeführt wird.
sock.close()
Recommended Posts