SPS ist ein mechanisches Gerät, mit dem eine große Maschine wie eine Fabrik betrieben wird. Dieses Gerät wird hauptsächlich von Keyence und Mitsubishi hergestellt. Beim Erstellen eines Programms wird es in einem grafischen Diagramm wie einem elektrischen Schaltplan anstelle der auf einem PC verwendeten englischsprachigen Sprache ausgedrückt.
Erstellt bei der Arbeit auf die Frage "Kann ich mit einem Computerprogramm mit der SPS kommunizieren?" Ich habe die SPS von 1 überprüft, weil ich eine Person im IT-Bereich bin, die mit der SPS nicht vertraut ist.
Es scheint, dass Kommunikation möglich ist, aber da es nur wenige Beispielcodes gibt, die mit Python erstellt wurden, verstehe ich den Mechanismus aus anderen Sprachen. -Soket-Kommunikation wird verwendet, um den Wert zu senden. -Es ist notwendig, den ASCII-Code bei der Kommunikation zu codieren. -Der beim Senden einzugebende Wert wird von hexadezimal nach dezimal konvertiert. Sie müssen den ASCII-Code in eine Dezimalzahl konvertieren. Es fiel mir schwer, weil ich mit Mathematik nicht vertraut war.
In dieser Umgebung erfolgt die Kommunikation über einen Switching Hub. PC-Switching Hub-SPS Es ist wie es ist.
ip = '10.50.100.32' #IP-Adresse auf der SPS-Seite.
port = 8501 #Portnummer für die Kommunikation auf der oberen Verbindung auf der SPS-Seite
#Der Gerätename lautet EM9000 usw.
#Die Anzahl der Geräte wird verwendet, wenn die Anzahl der Geräte kontinuierlich und in Ordnung ist.
#EM9000,Wird beim Anordnen von Geräten wie EM9001 verwendet.
#Der einzugebende Wert / die einzugebende Nachricht
#Dezimalzahlen können unverändert verwendet werden.
#Sechseckige Zahlen können mit der vierfachen Anzahl von Zeichen gesendet werden. 4 Zeichen, 8 Zeichen,12 Zeichen
#Daher erhöht sich auch die Anzahl der Geräte auf 1 bis 3.
#ASCII kann nur 2 Zeichen pro Gerät haben.
#Die Anzahl der Geräte erhöht sich entsprechend.
to_EM9000 = Send_to_PLC(ip,port,"EM9000","3","ABCDEF")
to_EM9002 = Send_to_PLC(ip,port,"EM9002","2","00200616")
to_EM9004 = Send_to_PLC(ip,port,"EM9004","1","1")
to_EM9000.send_ascii_message() #Senden Sie den ASCII-Code als Dezimalzahl an die SPS
to_EM9002.send_16decimal_message() #Senden Sie hexadezimal zu dezimal an die SPS
to_EM9004.send_10decimal_message() #Senden Sie die Dezimalzahl unverändert an die SPS
Send_to_PLC
import socket
#Klasse, die den Wert des SPS-Geräts ändern kann
class Send_to_PLC(object):
def __init__(self,ip_address,port_num,device_name,data_length,message):
self.ip_address =ip_address
self.port_num = int(port_num)
self.device_name = device_name
self.data_length = data_length
self.message = message
#Konvertieren Sie den ASCII-Code in eine Dezimalzahl
def ascii_to_10decimal(self):
#Wenn die Anzahl der Zeichen in der Nachricht kleiner als die angegebene Datenlänge ist
read_device_length = int(self.data_length)
message_length = len(self.message)
if read_device_length >= message_length:
data_lng_int = message_length
else:
data_lng_int = read_device_length
#Fügen Sie die Nachricht in eine 2-Byte-Liste ein.
separate_msg_list =[]
for i in range(data_lng_int):
if i == 0:
separate_msg = self.message[0:2]
separate_msg_list.append(separate_msg)
else:
separate_msg = self.message[2*i:2*(i+1)]
separate_msg_list.append(separate_msg)
#Wenn die Anzahl der Zeichen ungerade ist, ist das letzte Zeichen linksbündig.
if len(separate_msg_list[-1]) == 1:
separate_msg_list[-1] = separate_msg_list[-1]+ " "
#Konvertieren Sie den ASCII-Code in eine Dezimalzahl.(ascii → binär hexadezimal → dezimal)
digit_mesage_list = []
for msg in separate_msg_list:
ascii_data = msg.encode(encoding="ascii")
hex_bina_data = binascii.hexlify(ascii_data)
digi10_int = int(hex_bina_data,16)
digi10_str = str(digi10_int)
digit_mesage_list.append(digi10_str)
trans_message = " ".join(digit_mesage_list)
return trans_message
#Wandeln Sie hexadezimal in dezimal um
def digit16_to_degit10(self):
read_device_length = int(self.data_length)
message_length = len(self.message)
if read_device_length >= message_length:
data_lng_int = message_length
else:
data_lng_int = read_device_length
#Teilen Sie die Nachricht in 4 Bytes und fügen Sie sie in die Liste ein.
#Wandeln Sie die Hexadezimalzahl nach der Eingabe in eine Dezimalzahl um
separate_msg_list =[]
for i in range(data_lng_int):
if i == 0:
separate_msg = self.message[0:4]
digi10_int = int(separate_msg,16)
digi10_str = str(digi10_int)
separate_msg_list.append(digi10_str)
else:
separate_msg = self.message[4*i:4*(i+1)]
digi10_int = int(separate_msg,16)
digi10_str = str(digi10_int)
separate_msg_list.append(digi10_str)
trans_message = " ".join(separate_msg_list)
return trans_message
#An SPS senden
def send_message(self,command_list):
command_sentence = "".join(command_list)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((self.ip_address,self.port_num))
s.send(command_sentence.encode('ascii'))
#Nach der Konvertierung von ASCII-Code in eine Dezimalzahl,An SPS senden
#Die Anzahl der Zeichen in der Nachricht ist ein Vielfaches von vier.
def send_ascii_message(self):
tranformed_digi_message = self.ascii_to_10decimal()
command_list = ['WRS ',self.device_name,".S ",self.data_length," ",tranformed_digi_message,'\r']
self.send_message(command_list)
#Nach der Konvertierung von Hexadezimal in Dezimal,An SPS senden
def send_16decimal_message(self):
tranformed_digi_message = self.digit16_to_degit10()
command_list = ['WRS ',self.device_name,".S ",self.data_length," ",tranformed_digi_message,'\r']
self.send_message(command_list)
#Nach der Konvertierung von Hexadezimal in Dezimal,An SPS senden
#Unterstützt nur ein Gerät
def send_10decimal_message(self):
command_list = ['WR ',self.device_name,".S ",self.message,'\r']
self.send_message(command_list)
if __name__ == '__main__':
ip = '10.50.100.32'
port = 8501
#IP-Adresse beim Erstellen einer Instanz,Port-Nummer,Vorname des Geräts, Anzahl der Geräte,Geben Sie den einzugebenden Wert / die einzugebende Nachricht ein.
to_EM9000 = Send_to_PLC(ip,port,"EM9000","3","ABCDEF")
to_EM9002 = Send_to_PLC(ip,port,"EM9002","2","00200616")
to_EM9004 = Send_to_PLC(ip,port,"EM9004","1","1")
to_EM9000.send_ascii_message() #Senden Sie den ASCII-Code als Dezimalzahl an die SPS
to_EM9002.send_16decimal_message() #Senden Sie hexadezimal zu dezimal an die SPS
to_EM9004.send_10decimal_message() #Senden Sie die Dezimalzahl unverändert an die SPS
Ich finde, dass die Erklärung nicht gut ist, aber ich werde sie vorerst veröffentlichen.
Recommended Posts