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.
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)
Il s'agit du paramètre de base à définir dans le message de requête SLMP.
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 |
La minuterie de surveillance est réglée par unités de 250 ms. Cette fois, réglez-le sur 4 (1 seconde).
Cette fois, nous utiliserons le registre de données. Accès Word. Le code ASCII est "D *" et le code binaire est A8h.
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
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.
sock.close()
Recommended Posts