需求:因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_())