Versuchen Sie den Zugriff auf das SPS-Register in Python

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.

Verbindung

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)

Grundparameter

Dies ist der grundlegende Parameter, der in der SLMP-Anforderungsnachricht festgelegt werden muss.

Zugriffszieleinstellung

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

Timer überwachen

Der Überwachungstimer wird in Einheiten von 250 ms eingestellt. Diesmal auf 4 (1 Sekunde) einstellen.

Gerätecode

Dieses Mal werden wir das Datenregister verwenden. Wortzugriff. Der ASCII-Code ist "D *" und der Binärcode ist A8h.

Führen

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

Licht

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.

Getrennt

sock.close()

Recommended Posts

Versuchen Sie den Zugriff auf das SPS-Register in Python
[Fortsetzung] Versuchen Sie den Zugriff auf das SPS-Register mit Python
Versuchen Sie gRPC in Python
Probieren Sie 9 Slices in Python aus
Versuchen Sie LINE Notify mit Python
Lassen Sie uns Yuma in Python 3 implementieren
Versuchen Sie Python
Versuchen Sie es mit LevelDB mit Python (plyvel)
Greifen Sie mit Python auf die Twitter-API zu
Versuchen Sie es mit LeapMotion mit Python
Versuchen Sie, sich mit Python bei qiita anzumelden
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Versuchen Sie, mit Binärdaten in Python zu arbeiten
Versuchen Sie, ein SYN-Paket in Python zu senden
Wiederbelebt von "kein Internetzugang" in Python
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Exklusiver Dateizugriff zwischen Prozessen in Python
Probieren Sie schnell die Microsoft Face API in Python aus
Greifen Sie über Cognito in Python auf S3-Ressourcen zu
Versuchen Sie, Ihr Tagebuch mit Python zu durchsuchen
Probieren Sie eine funktionale Programmierpipe in Python aus
Versuchen Sie etwas wie Python für-else in Ruby
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
SendKeys in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Python> try: / außer:
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python