找回密码
 会员注册
查看: 32|回复: 0

汇川EASY300实验——python作为上位机,PLC与传感器相连,实时显示传感器值并绘制曲线,保存到MYSQL数据库

[复制链接]

3

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2024-9-12 16:43:02 | 显示全部楼层 |阅读模式
目录引言一、产品特点二、应用场景三、产品系列四、市场评价实验要求PLC配置确定PLC的网络配置确定PLC的通信协议IO端口映射GL20-4AD模块配置和参数设置PYTHON上位机数值转换MYSQL数据库创建数据表QT主程序引言汇川EASY系列PLC是一款全场景紧凑型小型PLC,其设计理念来源于真实的使用场景和用户“痛点”,旨在为用户提供易用、高效、可靠的自动化解决方案。以下是对汇川EASY系列PLC的详细介绍:一、产品特点易实现运动控制和过程控制:四核处理器带来卓越性能,实现纳秒级指令处理速度。32轴高速总线控制,支持同步运动,实现复杂工艺。集成免调试自整定PID算法,快速响应、精准调节,轻松控制温度、压力、流量。易选型、易扩展:全系列8个机型,满足严苛体积、多轴运控、温度控制、通信组网等中小型自动化设备需求。支持扩展卡和模块扩展,特定场景支持2个扩展卡槽,适配通信/模拟量/数字量等。本地扩展GL20系列刀片式IO,采用Push-in端子,免工具接线,节省空间和时间。易互联、易组网:本地集成多种工业网络通信协议,轻松对接数据采集系统和周边设备。支持扩IP模块,实现设备内外网隔离,无需修改设备内部网络配置即可接轨上位系统。双网口设计,省网线省交换机,便捷组网可级联。易编程、模块化:完全自主化的编程软件,持续迭代易用性功能,符合工程师应用习惯。支持ST语言编程,工程师可轻松编写复杂算法和逻辑。支持功能块封装,工艺算法复用;支持离线调试和联合离线仿真,提高编程效率,缩短项目调试周期。二、应用场景汇川EASY系列PLC适用于多种应用场景,包括但不限于:严苛体积要求的自动化设备多轴运动控制场景温度、压力、流量等过程控制场景通信组网需求高的场景三、产品系列汇川EASY系列PLC包括多个子系列,如EASY300系列和EASY500系列等,每个系列都有其特定的应用场景和优势:EASY300系列:适用于离散单机,设备相对简单,工艺不复杂,追求易用、便宜和快速交易。EASY500系列:适用于快速交付需求市场,交期很紧,点位控制居多,追求快速交付和现场零调试。四、市场评价汇川EASY系列PLC在市场上受到了广泛的关注和好评。其卓越的性能、易用的特性和广泛的应用场景使得它成为中小型自动化设备领域的热门选择。同时,汇川技术作为国产PLC的领军企业之一,其产品的质量和售后服务也备受用户信赖。综上所述,汇川EASY系列PLC是一款功能强大、易于使用、灵活扩展、高效互联的全场景紧凑型小型PLC。它能够满足用户对中小型自动化设备的各种需求,为自动化行业的发展贡献自己的力量。实验要求实验需要分别测量输入端和输出端压力流量温度,上位机实时显示传感器值,每个量的波形曲线显示,数据保存到MYSQL数据库编程软件AutoShop是汇川小型PLC的专用上位机软件,它提供了友好的编程和调试环境,支持多种编程语言,并具备丰富、强大的通讯和控制功能。PLC配置确定PLC的网络配置确认PLC的IP地址:确保PLC已经配置了有效的IP地址,以便它可以通过以太网与你的网络中的其他设备通信。检查网络设置:验证PLC的网络设置(如子网掩码、网关等)是否正确,并确保它与你的网络兼容。确定PLC的通信协议确定PLC使用的通信协议,如ModbusTCP、Ethernet/IP、Profinet等。选择使用Python作为上位机进行通信。例如,对于ModbusTCP,使用pymodbus库。IO端口映射对于直接连接到PLC的IO模块或远程IO模块,需要在PLC程序中设置IO映射,以便将特定的物理IO端口映射到PLC内部的逻辑地址或寄存器上GL20-4AD模块配置和参数设置对于4-20mA的输入,需要设置相应的输入通道为电流输入模式,使能通道以接收4-20mA(对应0-20000)的模拟量输入,可根据具体需求修改PYTHON上位机数值转换根据购买的传感器量程转换,将PLC返回的数据解析为实际值,这里转换有些误差,有更好的转换方法欢迎指出#压力转换defconvert_value(raw_value):return(raw_value/20000)*4#流量转换defconvert_value_2(raw_value):return(raw_value/20000)*120#温度转换defconvert_value_3(return_value):return-50+(return_value/20000)*(200-(-50))MYSQL数据库创建数据表#MySQL数据库conn=pymysql.connect(user='root',password='123456',host='localhost',database='plc')cursor=conn.cursor()cursor.execute("DROPTABLEIFEXISTSsensor_data")CREATETABLEsensor1_data(idINTEGERPRIMARYKEYAUTO_INCREMENT,time_stampTIMESTAMPDEFAULTCURRENT_TIMESTAMP,input_pressureFLOAT,input_flowFLOAT,input_temperatureFLOAT,output_pressureFLOAT,output_flowFLOAT,output_temperatureFLOAT)cursor.execute(createTab)QT主程序使用PYQT显示六个传感器实际值到界面,绘制实时曲线并保存到MYSQL数据库classPlotWindow(QMainWindow):def__init__(self):super().__init__()#连接PLCself.plc_ip='192.168.1.2'self.plc_port=502self.client=ModbusTcpClient(self.plc_ip,port=self.plc_port)#设置主窗口self.setWindowTitle('波形曲线据显示')self.setGeometry(800,300,1200,1000)#创建绘图部件self.central_widget=QWidget()self.setCentralWidget(self.central_widget)self.canvas=FigureCanvas(Figure())layout=QVBoxLayout(self.central_widget)layout.addWidget(self.canvas)#初始化图表self.fig=self.canvas.figureself.axs=self.fig.subplots(3,2)self.lines=[]self.labels=['InputPressure','OutputPressure','InputFlow','OutputFlow','InputTemperature','OutputTemperature']self.x=np.arange(100)self.y=np.zeros((6,100))self.values=np.zeros(6)foriinrange(3):forjinrange(2):ax=self.axs[i,j]ax.set_xlim(0,100)ax.grid(True)ax.set_ylabel(self.labels[i*2+j])ax.set_xlabel("Time")line,=ax.plot(self.x,self.y[i*2+j])self.lines.append(line)self.axs[0,0].set_ylim(0,4000)self.axs[0,1].set_ylim(0,4000)self.axs[2,0].set_ylim(-50,200)self.axs[2,1].set_ylim(-50,200)self.axs[1,1].set_ylim(10,120)self.axs[1,0].set_ylim(10,120)#启动一个线程用于读取PLC数据self.plc_thread=threading.Thread(target=self.read_plc_data)self.plc_thread.start()#定时器更新图表self.timer=self.fig.canvas.new_timer(interval=100)self.timer.add_callback(self.update_plot)self.timer.start()#传感器数据界面self.data_window=QWidget()self.data_window.setWindowTitle('传感器值')self.data_window.setGeometry(400,300,400,1000)layout=QVBoxLayout(self.data_window)self.labels=[]foriinrange(6):label=QLabel()self.labels.append(label)layout.addWidget(label)self.data_window.show()defupdate_plot(self):foriinrange(6):data=self.y[i]data[:-1]=data[1:]data[-1]=self.values1[i]line=self.lines[i]line.set_data(self.x,data)self.axs[i//2,i%2].relim()self.axs[i//2,i%2].autoscale_view(True,True,True)line.set_color('r')line.set_linewidth(2.0)self.fig.canvas.draw()defread_plc_data(self):whileTrue:ifself.client.connect():addresses=[100,101,102,103,104,105]count=1new_values=[]foraddressinaddresses:response=self.client.read_holding_registers(address,count,unit=1)ifresponse.isError():print(f"读取寄存器数据时发生错误:{response}")else:new_values.append(response.registers[0])self.values=new_valuesvalue0_raw=self.values[0]print(value0_raw)print(self.values[2])#print(self.values[1])ifvalue0_raw
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 01:58 , Processed in 0.393299 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表