battery/plc.py

854 lines
25 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# coding=utf-8
import socket
import time
from loguru import logger
def write_jxb(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
send_data_list = jxb_num_to_send_data(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(send_data_list)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
print(response,"response")
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def read_button():
# 读取 D301 -- D350
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
read_list = ['50 00 00 FF FF 03 00 ',
'0C 00 ',
'10 00 01 04 00 00 ',
'2D 01 00 A8 ',
'64 00 ']
relist = []
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
# print("成功连接到PLC")
data = ''.join(read_list)
command = bytearray.fromhex(data)
# print(command)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
# 处理响应数据,提取寄存器的值
# 需要根据协议格式解析响应,这里假设响应包含一个D100寄存器的值
for i in range(11, len(response) - 1, 2):
relist.append(int.from_bytes(response[i: i + 2], byteorder='little'))
# print(relist)
# print(len(relist))
# 读取301 - 320的值
# print(relist)
except socket.error as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
# print("连接已关闭")
return relist
def write_button():
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = ['50 00 00 FF FF 03 00 ',
'30 00 ',
'10 00 01 14 00 00 ',
'5E 01 00 A8 ',
'12 00 ',
'01 00 01 00 ',
'01 00 01 00 ',
'01 00 01 00 ',
'01 00 01 00 ',
'01 00 01 00 ',
'00 00 01 00 ',
'01 00 01 00 ',
'01 00 01 00 ',
'00 00 01 00 ', ] # 350 - 367 所有
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
print("成功连接到PLC")
data = ''.join(bon_data)
# data = '50 00 00 FF FF 03 00 0C 00 10 00 01 04 00 00 64 00 00 A8 14 00'
# data = '50 00 00 FF FF 03 00 12 00 10 00 01 14 00 00 64 00 00 A8 03 00 0C 00 0D 00 0E 00'
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
print(command)
# command = b'\x50\x00\x00\xFF\xFF\x03\x00\x0C\x00\x10\x00\x01\x04\x01\x00\x00\xA8\x00\x00\x00' # 示例请求报文
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
print(response[11:])
print(len(response))
# 处理响应数据,提取寄存器的值
# 需要根据协议格式解析响应,这里假设响应包含一个D100寄存器的值
d100_value = int.from_bytes(response[11:13], byteorder='little')
d101_value = int.from_bytes(response[13:15], byteorder='little')
d102_value = int.from_bytes(response[15:17], byteorder='little')
d104_value = int.from_bytes(response[21:23], byteorder='little')
print(f"D100的值: {d100_value}, {d101_value}, {d102_value}, {d104_value}")
except socket.error as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_agv(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = agv_num_to_send_data(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def num_to_hex(value):
# 将值限制在16位有符号整型范围内
if value < -32768:
value = -32768
if value > 32767:
value = 32767
# 将负数转换为补码形式
if value < 0:
value = (1 << 16) + value
# 转为16进制,去掉'0x'前缀,并且保证长度为4位,不足则补齐
hex_value = format(value, '04X')
hex_str = hex_value[-4:] # 返回最后四位
return f"{hex_str[2:]} {hex_str[:2]} "
def jxb_num_to_send_data(datas):
head = ['50 00 00 FF FF 03 00 ',
'4A 00 ',
'10 00 01 14 00 00 ',
'C8 00 00 A8 ',
'1F 00 ']
send_data = head + [num_to_hex(data) for data in datas]
return send_data
def agv_num_to_send_data(datas):
head = ['50 00 00 FF FF 03 00 ',
'22 00 ',
'10 00 01 14 00 00 ',
'64 00 00 A8 ',
'0B 00 ']
send_data = head + [num_to_hex(data) for data in datas]
return send_data
def write_stop_agv(status):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_stop_agv_status(status)
# print(bon_data)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
logger.error(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
# print("连接已关闭")
def write_stop_jxb(status):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_stop_jxb_status(status)
# print(bon_data)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
logger.error(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
def write_stop_robot(status):
"""传输机械臂异常"""
# PLC的IP地址和端口号
print("连接成功")
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_stop_robot_status(status)
# print(bon_data)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
def write_once_status(status):
"""传输指示灯异常"""
print("连接成功")
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_once_status_send(status)
# print(bon_data)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("")
def write_once_status_send(status):
if status:
rss = '01 00 00 00'
else:
rss = '00 00 01 00'
head = ['50 00 00 FF FF 03 00 ',
'10 00 ',
'10 00 01 14 00 00 ',
'6d 01 00 A8 ',
'02 00 ',
rss]
return head
def write_stop_agv_status(status):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'64 00 00 A8 ',
'01 00 ',
num_to_hex(status)]
return head
def write_stop_jxb_status(status):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'E5 00 00 A8 ',
'01 00 ',
num_to_hex(status)]
return head
def write_stop_robot_status(status):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'54 01 00 A8 ',
'01 00 ',
num_to_hex(status)]
return head
def write_network_status(status):
""" 向plc传递 网络异常警报"""
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_status_send(status)
# print(bon_data)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
def write_scram_button_status(status):
""" 向plc传递 网络异常警报"""
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_scram_button_status_send(status)
# print(bon_data)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
def write_network_status_send(status):
head = ['50 00 00 FF FF 03 00 ',
'14 00 ',
'10 00 01 14 00 00 ',
'F1 00 00 A8 ',
'04 00 ',
status]
return head
def write_scram_button_status_send(status):
head = ['50 00 00 FF FF 03 00 ',
'14 00 ',
'10 00 01 14 00 00 ',
'E7 00 00 A8 ',
'04 00 ',
status]
return head
def write_network_status_run_time_total(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'08 00 00 A8 ',
'01 00 ',
]
send_data = head + [num_to_hex(data) for data in run_time]
print(send_data)
return send_data
def write_run_time_zongshijian(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_status_run_time_total(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_network_status_run_time_line1(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'0C 00 00 A8 ',
'01 00 ',
]
send_data = head + [num_to_hex(data) for data in run_time]
return send_data
def write_run_time_line1(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_status_run_time_line1(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
logger.error("写入成功")
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_network_status_run_time_line2(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'0E 00 00 A8 ',
'01 00 ']
send_data = head + [num_to_hex(data) for data in run_time]
return send_data
def write_run_time_line2(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_status_run_time_line2(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_network_status_run_time_line3(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'10 00 00 A8 ',
'01 00 ']
send_data = head + [num_to_hex(data) for data in run_time]
return send_data
def write_run_time_line3(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_status_run_time_line3(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_network_total_count(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'14 00 00 A8 ',
'01 00 ']
send_data = head + [num_to_hex(data) for data in run_time]
return send_data
def write_total_count(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_total_count(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_network_ok_count(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'16 00 00 A8 ',
'01 00 ']
send_data = head + [num_to_hex(data) for data in run_time]
return send_data
def write_ok_count(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_ok_count(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_network_NG_count(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'18 00 00 A8 ',
'01 00 ']
send_data = head + [num_to_hex(data) for data in run_time]
return send_data
def write_NG_count(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_NG_count(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_network_photo_count(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'1C 00 00 A8 ',
'01 00 ']
send_data = head + [num_to_hex(data) for data in run_time]
return send_data
def write_photo_count(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_photo_count(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
def write_network_engine_number_count(run_time):
head = ['50 00 00 FF FF 03 00 ',
'0E 00 ',
'10 00 01 14 00 00 ',
'D5 00 00 A8 ',
'01 00 ']
send_data = head + [num_to_hex(data) for data in run_time]
return send_data
def write_engine_number_count(datas):
# PLC的IP地址和端口号
PLC_IP = '192.168.2.1' # 替换为你的PLC的实际IP地址
PLC_PORT = 4096 # 通常是MC协议的默认端口,也可能是SLMP的默认端口
# 创建一个TCP/IP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bon_data = write_network_engine_number_count(datas)
try:
# 连接到PLC
client_socket.connect((PLC_IP, PLC_PORT))
data = ''.join(bon_data)
# command = bytes.fromhex(data)
command = bytearray.fromhex(data)
# 发送请求
client_socket.sendall(command)
# 接收PLC的响应
response = client_socket.recv(1024)
except Exception as e:
print(f"通信时发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
print("连接已关闭")
if __name__ == '__main__':
write_scram_button_status('00 00 01 00 00 00 00 00')
# write_run_time_zongshijian([1000])
# time.sleep(0.1)
# write_run_time_line1([40])
# time.sleep(0.1)
# write_run_time_line2([50])
# time.sleep(0.1)
# write_run_time_line3([90])
# write_stop_jxb(1)
# write_NG_count([50])
# write_engine_number_count([412151512])
# time.sleep(0.1)
# write_ok_count([60])
# time.sleep(0.1)
# write_photo_count([90])
# time.sleep(0.1)
# write_total_count([100])
# write_stop_jxb(1)
# write_agv([2] *11)
# write_agv()
# write_jxb()
# print(num_to_hex(4369))
# while True:
# data = read_button()
# if len(data)==100:
# print(data[13])
# # print(data[20])
# # 自动启动 绿色按钮
# if len(data) == 20:
# start_button = data[14]
# line_button = data[19]
# print(start_button, ' ', line_button)
# print(len(data))
# """
# agv 充电中 准备中 工作中 关闭 故障中
# jxb 准备中 启动中 关闭 故障
# """
# write_jxb()
# read_bou()
# while True:
# read_bou()
# time.sleep(0.5)