树莓派采集Modbus网关数据,通过wifi传送给sql数据库

需求:因MES系统设备管理需求,需要在现有设备上采集电量、开关机等数据,尽量少布线。

方式:通过树莓派+Modbus网关的方式,将设备数据实时传送到sqlserver中去。

接线:Modbus/TCP网线直插到树莓派的网口,modbusTCP网关要匹配树莓派的有限网卡IP地址,不能反过来匹配,树莓派无线网卡与sql数据库连接,不用再单独拉网线。

设备:raspberry,树莓派4,modbus/TCP(本例是带DI和AI的网关,牌子不说了)。

功能:实现环境温度的采集,并将数据传送给sqlserver,设备数据要到现场施工。

难点:raspberry与数据库的连接,看我上一篇:https://blog.csdn.net/qq_23815725/article/details/106720024

界面:用到了PyQt库,相关的库直接安装吧,缺少什么就安装什么好了,安装失败的多安装几次,界面做的也比较简单:
在这里插入图片描述
代码:实现以上功能的代码,比较简单,先将ui界面转成.py文件(自动的),再新建一个自己的类,类代码如下:

# coding=utf-8
import pyodbc
##与UI窗体类对应的业务逻辑类
import sys
from PyQt5.QtWidgets import  QApplication, QDialog
from ui_dialog import Ui_Dialog
from PyQt5.QtCore import QThread ,  pyqtSignal,  QDateTime , QObject
from PyQt5.QtGui import  QPalette
from PyQt5.QtCore import Qt, pyqtSlot

import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md

from PyQt5.QtCore import QTimer
from PyQt5 import QtGui,QtCore,QtWidgets
from PyQt5.QtSql import QSqlDatabase, QSqlQueryModel, QSqlQuery
import PyQt5.QtSql as sql
import time


class QmyDialog(QDialog):
   a = 1                   #python不熟悉,应该可以用序列循环
   b = 2
   c = 3
   d = 4
   e = 5
   def __init__(self, parent=None):
      super().__init__(parent)    #调用父类构造函数,创建窗体
      self.ui=Ui_Dialog()         #创建UI对象
      self.ui.setupUi(self)       #构造UI

      self.myFunction()
      # 初始化一个定时器
      self.timer = QTimer(self)
      self.timer.timeout.connect(self.myFunction) #到达设定的时间后,执行槽函数代码
      self.timer.start(1000) # 5000 单位是毫秒, 即 5 秒


      # 初始化二个定时器
      self.timer1 = QTimer(self)
      self.timer1.timeout.connect(self.myFunction1) #到达设定的时间后,执行槽函数代码

      self.timer1.start(500) # 5000 单位是毫秒, 即 5 秒

   def myFunction(self):
      try:
         master = mt.TcpMaster("169.254.251.254", 502)
         master.set_timeout(1.0)
         Hold_value = master.execute(slave=255, function_code=md.READ_HOLDING_REGISTERS, starting_address=40700, quantity_of_x=5, output_value=5)
         # print(Hold_value)
         t1=0.002289*Hold_value[0]-70
         t2=0.001907*Hold_value[1]-25
         t3=0.019073*Hold_value[2]-250
         t4=0.019073*Hold_value[3]-250
         t5=0.001717*Hold_value[4]+7.5
         
         t1=format(t1,'.1f')#显示精度
         t2=format(t2,'.1f')
         t3=format(t3,'.1f')
         t4=format(t4,'.1f')
         t5=format(t5,'.1f')
         self.a = t1
         self.b = t2
         self.c = t3
         self.d = t4
         self.e = t5

         self.ui.temperature.setText(t1)
         self.ui.humidiy.setText(t2)
         self.ui.PM100.setText(t3)
         self.ui.PM25.setText(t4)
         self.ui.noise.setText(t5)
      except Exception as e:
         self.a = 0
         self.b = 0
         self.c = 0
         self.d = 0
         self.e = 0
         print("Modbus连接失败")

   def myFunction1(self):
         data = QDateTime.currentDateTime()
         currTime = data.toString("yyyy-MM-dd hh:mm:ss")
         self.ui.timeanddate.setText(currTime)
         try:
             conn = pyodbc.connect(r'DRIVER={/usr/local/freetds/lib/libtdsodbc.so};SERVER=192.168.1.67,1433;DATABASE=数据库;UID=sa;PWD=密码')
             cursor = conn.cursor()

             sql1 = "INSERT INTO Environment(Temperature, Humidness, PM25, Noise) VALUES('%f', '%f', '%f', '%f')"

             aa = float(self.a)
             bb = float(self.b)
             cc = float(self.c)
             dd = float(self.d)
             ee = float(self.e)
             data = (aa, bb, dd, ee)
             cursor.execute(sql1 % data)
             conn.commit()
             conn.close()

         except Exception as e:
             print("数据库连接失败")
         
   def on_pushButton_clicked(self):
      print('查询')
   def on_pushButton_3_clicked(self):
      print("增加")                     
   def on_pushButton_2_clicked(self):
      print("修改")
   def on_pushButton_4_clicked(self):
      print("删除")
   def on_pushButton_5_clicked(self):
      print("创建")

if  __name__ == "__main__":       #用于当前窗体测试
   app = QApplication(sys.argv)   #创建GUI应用程序
   form=QmyDialog()               #创建窗体
   form.show()
   sys.exit(app.exec_())


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值