python与PLC通信的数据转换

测试代码:

from time import sleep as sleep
import socket
import time
import threading
import struct


# 生成线程
class MakeThreading(threading.Thread):
    def __init__(self, target, set_daemon=True):
        super().__init__()
        self._target = target
        self.setDaemon(set_daemon)
        self.start()


# 连接到服务器
def connect2server(ip, port):
    global srv_link
    disconnected = True

    while True:
        if disconnected:  # 如果无连接
            print(time.asctime()[4:-5], 'Connecting to server...')
            try:
                srv_link.connect((ip, port))
                disconnected = False
                print(time.asctime()[4:-5], 'Server is connected :')
                break
            except Exception as E:
                print(time.asctime()[4:-5], 'Server connection failed. Retry in 5 seconds', E)
                sleep(5)
                continue


# 发送数据
def send_datas(cycle, quantity):    # 发送数据的周期和发送次数
    global srv_link, send_data, srv_ip, srv_port, is_sending
    n = 0
  
    while n < quantity:
        try:
            is_sending = True
            srv_link.sendall(send_data)
            is_sending = False
            sleep(cycle)
            n += 1
        except Exception as E:
            print(time.asctime()[4:-5], 'Failed to send data', E)
            srv_link.close()
            srv_link = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            connect2server(srv_ip, srv_port)
            is_sending = False    
            continue


# 接收数据
def receive_datas(length):
    global rcv_data, srv_link, is_received
    n = 0
    while True:
        try:
            rcv_data = srv_link.recv(length)
            is_received = True
        except Exception as E:
            print(time.asctime()[4:-5], 'Failed to receive data', E)
            is_received = False
            sleep(5)


if __name__ == '__main__':
    srv_link = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    srv_ip = '192.168.14.100'
    srv_port = 2000
    send_data = b''
    rcv_data = b''
    is_sending = False     # 发送中标志
    is_received = False    # 接收到数据标志
    

    connect2server(srv_ip, srv_port)

    MakeThreading(lambda: send_datas(0.5, 100000))
    MakeThreading(lambda: receive_datas(1024))

    while True:
        # 发送的内容
        if not is_sending:
            send_int1 = 1234  # 第一个是整数
            send_float1 = 1280.03  # 第二个是浮点数
            send_float2 = 2668.98  # 第三个是浮点数
            send_data = struct.pack('>h', send_int1)   # 构建发送报文
            send_data += struct.pack('>f', send_float1)
            send_data += struct.pack('>f', send_float2)
            
        if is_received:
            rcv_int1 = struct.unpack('>h', rcv_data[:2])
            rcv_float1 = struct.unpack('>f', rcv_data[2:6])
            rcv_float2 = struct.unpack('>f', rcv_data[6:10])

            print('Datas received:', rcv_int1, rcv_float1, rcv_float2)
            is_received = False
        time.sleep(0.01)




PLCSIM创建仿真PLC

python与PLC通信的数据转换_第1张图片

 PLC程序在这里:https://download.csdn.net/download/xulibo5828/87941287?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168808709516782427442084%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168808709516782427442084&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-87941287-null-null.142^v88^insert_down1,239^v2^insert_chatgpt&utm_term=python与PLC通信的数据转换&spm=1018.2226.3001.4187.2

你可能感兴趣的:(python,数学建模,开发语言,tcp/ip,网络)