self.debug(_msg)
if private in self.data2attrs[dataId][ config ][ param ] and self.data2attrs[dataId][ config ][ param ][ private ] first_point :
if type(_msg) tuple:
return _msg
else:
return ()
except Exception as e:
self.debug( error e)
驱动解析 编写环境为python2(python3也可以 首先需要导入modbus_tk和paho.mqtt等、数据解析和modbus通讯的相关包
# encoding: utf-8
# python 3.6
import random
import time
import threading
from paho.mqtt import client as mqtt_client
import serial
from serial import Serial
import modbus_tk.modbus_rtu as modbus_rtu
利用modbus_tk里面的modbus_rtu打开服务器的串口并向其发送指令 其中serialObjTmp serial.Serial(port com11 , baudrate 9600, timeout 0.5)中port表示串口号 baudrate表示波特率 timeout表示超时时间。打开串口后利用ser.write(b xEAx01x01xEAx01x81x00x82xEF )向串口发送数据 需要发送十六进制的bytes类型。读取数据后进行数据的处理
class com_get_info():
def master(self):
try:
ser serial.Serial( com3 , 9600, timeout 0.5)
ser.write(b xEAx01x01xEAx01x81x00x82xEF )
pre_data ser.readline()
print pre_data
data .join([hex(ord(c)) for c in pre_data])
data1 data.split( 0x )
data2
for i in data1:
if len(i) 1:
data2 0
data2 i
U101 int(data2[12: 16]) * 0.1
U102 int(data2[16: 20]) * 0.1
U103 int(data2[20: 24]) * 0.1
U104 int(data2[24: 28]) * 0.1
U105 int(data2[28: 32]) * 0.1
U106 int(data2[32: 36]) * 0.1
U107 int(data2[36: 40]) * 0.1
U108 int(data2[40: 44]) * 0.1
U109 int(data2[44: 48]) * 0.1
U110 int(data2[48: 52]) * 0.1
U111 int(data2[52: 56]) * 0.1
U112 int(data2[56: 60]) * 0.1
# 输出R相视在功率
A int(data2[84: 87])
if int(data2[87]) 0:
U113 A 1
# 输出S相视在功率
B int(data2[88: 91])
if int(data2[91]) 0:
U114 B 1
# 输出T相视在功率
C int(data2[92: 95])
if int(data2[94]) 0:
U115 C 1
# 1号电池组电压
U116 int(data2[60: 64]) * 0.1
# 2号电池组电压
U117 int(data2[64: 68]) * 0.1
# 逆变输出频率
U120 int(data2[76: 80]) * 0.1
# 主输入状态
if U101 150:
U123 1
else:
U123 0
# 逆变状态
if U104 150:
U124 1
else:
U124 0
# 旁路输入状态
if U107 150:
U125 1
else:
U125 0
# 电池供电状态
if U101 100:
U126 1
else:
U126 0
# 整流器状态
if U125 1 and U126 0:
U127 1
else:
U127 0
# 旁路供电状态
if U125 1 and U110 0.1 and U124 0:
U128 1
else:
U128 0
# 输入C相过压
if U103 250:
U0113 1
else:
U0113 0
# 输入C相欠压
if U103 180:
U0114 1
else:
U0114 0
# 输入B相过压
if U102 250:
U0115 1
else:
U0115 0
# 输入B相欠压
if U102 180:
U0116 1
else:
U0116 0
# 输入A相过压
if U101 250:
U0117 1
else:
U0117 0
# 输入A相欠压
if U101 180:
U0118 1
else:
U0118 0
# 旁路C相过压
if U109 250:
U0123 1
else:
U0123 0
# 旁路C相欠压
if U109 180:
U0124 1
else:
U0124 0
# 旁路B相过压
if U108 250:
U0125 1
else:
U0125 0
# 旁路B相欠压
if U108 180:
U0126 1
else:
U0126 0
# 旁路A相过压
if U107 250:
U0127 1
else:
U0127 0
# 旁路A相欠压
if U107 180:
U0128 1
else:
U0128 0
# 逆变C相过压
if U106 250:
U0133 1
else:
U0133 0
# 逆变C相欠压
if U106 180:
U0134 1
else:
U0134 0
# 逆变B相过压
if U105 250:
U0135 1
else:
U0135 0
# 逆变B相过压
if U105 180:
U0136 1
else:
U0136 0
# 逆变A相过压
if U104 250:
U0137 1
else:
U0137 0
# 逆变A相欠压
if U104 180:
U0138 1
else:
U0138 0
data_code_false (U101, U102, U103, U104, U105, U106, U107, U108, U109, U110, U111, U112, A, B, C, U116, U117, U120, U123, U124, U125, U126, U127, U128, U0113, U0114, U0115, U0116, U0117, U0118, U0123, U0124, U0125, U0126, U0127, U0128, U0133, U0134, U0135, U0136, U0137, U0138,)
print len(data_code_false)
return data_code_false
except Exception,e:
pass
读取数据并处理后返回 利用mqtt将其发布到对应的topic
class info():
def __init__(self):
self.broker ***.***.***.*** #mqtt服务器地址,需要自行填写
self.port *** #mqtt的端口 需要自行填写
self.topic_airc /python/mqtt/ups #准备发布到mqtt的topic
# generate client ID with pub prefix randomly
self.client_id admin123