Essayez l'accès au registre PLC en Python

Essayez de lire / d'écrire des registres PLC avec SLMP. J'ai écrit sur l'accès aux bits en code binaire dans cet article.

Lien

Commencez par établir une connexion avec l'automate.

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)

Paramètres de base

Il s'agit du paramètre de base à définir dans le message de requête SLMP.

Accéder au paramètre de destination

Lisez le registre de l'UC de l'API directement connecté au PC hôte via Ethernet. Dans ce cas, définissez la destination d'accès à l'automate comme suit conformément aux réglementations SLMP.

Article Valeur
Numéro de réseau demandé 00h
Demander l'indicatif régional de destination FFh
Numéro d'E / S d'unité demandé 3FFh
Demander l'indicatif régional de destination 0

Minuterie de surveillance

La minuterie de surveillance est réglée par unités de 250 ms. Cette fois, réglez-le sur 4 (1 seconde).

Code de l'appareil

Cette fois, nous utiliserons le registre de données. Accès Word. Le code ASCII est "D *" et le code binaire est A8h.

Conduire

Assemblez le message de demande et envoyez le cadre. Utilisez l'accès par mot de la commande Lire (0401h).

Au moment du code binaire, il est nécessaire de stocker la valeur en petit andien sauf pour le sous-en-tête. Soyez prudent car seul le sous-titre est un gros boutiste pour une raison quelconque.

Lit les valeurs des trois registres D0001 à D0003.

# '5000 00 FF 03FF 00 0018 0020 0401 0000 D* 000001 0003'

data = [
    0x50,0x00,      #Sous-titre
    0x00,           #Numéro de réseau demandé
    0xFF,           #Demander l'indicatif régional de destination
    0xFF,0x03,      #Unité demandée I/Numéro O
    0x00,           #Demander l'indicatif régional de destination
    0x0C,0x00,      #Demander la longueur des données(Régler après)
    0x20,0x00,      #Minuterie de surveillance
    0x01,0x04,      #commander
    0x00,0x00,      #Sous-commande
    0x01,0x00,0x00, #Numéro du premier appareil
    0xA8,           #Code de l'appareil
    0x03,0x00       #Score de l'appareil
]

#Définir la longueur des données de la demande
data[7] = len(data[9:]) & 0xFF
data[8] = (len(data[9:]) >> 16) & 0xFF

#Envoyer une demande
sock.send(bytes(data))

#Recevoir une réponse
res = sock.recv(BUFSIZE)
print (*[format(i,'02X') for i in res])

Les données reçues sont les suivantes. Les valeurs de registre actuelles étaient toutes 0.

D0 00 00 FF FF 03 00 08 00 00 00 00 00 00 00 00 00

Lumière

Assemblez le message de demande et envoyez le cadre. Accès Word pour la commande d'écriture (1401h).

Ecrivez des valeurs dans les cinq registres D0000 à D0004.

# '5000 00 FF 03FF 00 0018 0020 0401 0000 D* 000000 0005 1122 3344 5566 7788 99AA'

data = [
    0x50,0x00,      #Sous-titre
    0x00,           #Numéro de réseau demandé
    0xFF,           #Demander l'indicatif régional de destination
    0xFF,0x03,      #Unité demandée I/Numéro O
    0x00,           # 
    0x00,0x00,      #Demander la longueur des données(Régler après)
    0x04,0x00,      #Minuterie de surveillance
    0x01,0x14,      #commander(1401H)
    0x00,0x00,      #Sous-commande
    0x00,0x00,0x00, #Numéro du premier appareil
    0xA8,           #Code de l'appareil
    0x05,0x00,      #Score de l'appareil
    0x11,0x22,      # D0000
    0x33,0x44,      # D0001
    0x55,0x66,      # D0002
    0x77,0x88,      # D0003
    0x99,0xAA,      # D0004
]

#Définir la longueur des données de la demande
data[7] = len(data[9:]) & 0xFF
data[8] = (len(data[9:]) >> 16) & 0xFF

#Envoyer une demande
sock.send(bytes(data))

#Recevoir une réponse
res = sock.recv(BUFSIZE)

Une fois l'écriture terminée, si vous exécutez à nouveau la commande Read, le résultat de l'exécution sera le suivant.

D0 00 00 FF FF 03 00 08 00 00 00 33 44 55 66 77 88

Vous pouvez voir que l'écriture et la lecture se font correctement.

Débranché

sock.close()

Recommended Posts

Essayez l'accès au registre PLC en Python
[Suite] Essayez l'accès au registre PLC avec Python
Essayez gRPC en Python
Essayez 9 tranches en Python
Essayez LINE Notify avec Python
Implémentons Yuma dans Python 3
Essayez Python
Essayez d'utiliser LevelDB avec Python (plyvel)
Accéder à l'API Twitter avec Python
Essayez d'utiliser LeapMotion avec Python
Essayez de vous connecter à qiita avec Python
Essayez d'utiliser l'API Wunderlist en Python
Essayez d'utiliser l'API Kraken avec Python
Essayez de travailler avec des données binaires en Python
Essayez d'envoyer un paquet SYN en Python
Relancé de "pas d'accès Internet" en Python
Essayez de dessiner une animation simple en Python
Accès exclusif aux fichiers entre les processus en Python
Essayez rapidement l'API Face de Microsoft en Python
Accéder aux ressources S3 via Cognito en Python
Essayez de fouiller votre journal avec Python
Essayez un tube de programmation fonctionnel en Python
Essayez quelque chose comme Python for-else dans Ruby
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
SendKeys en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
Python> essayez: / sauf:
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python