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

 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝海拓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值