[PYTHON] Eine Klasse, die den SPS-Wert durch Socket-Kommunikation frei ändert

Was ist SPS überhaupt?

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.

Auslösen

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.

Schwer zu kommunizieren

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.

SPS- und PC-Umgebung

In dieser Umgebung erfolgt die Kommunikation über einen Switching Hub. PC-Switching Hub-SPS Es ist wie es ist.

Verwendung dieser Klasse


    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

Klassenquellcode

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

Eine Klasse, die den SPS-Wert durch Socket-Kommunikation frei ändert
Klasse, die die API von DMM trifft
Ein Memo, das das Rucksackproblem mit der gierigen Methode löste
Beim Inkrementieren des Werts eines Schlüssels, der nicht vorhanden ist
[Python] Ein Programm, das ein Paar findet, das durch einen bestimmten Wert geteilt werden kann
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Pandas mit subtilen Veränderungen in der Anzahl und wie man damit umgeht
Ermitteln Sie den Mindestwert der Funktion mithilfe der Partikelgruppenoptimierungsmethode (PSO).