rabin 4 years ago
parent
commit
3f3b3d4e4b
2 changed files with 55 additions and 18 deletions
  1. 26 10
      service/device.py
  2. 29 8
      service/modbus/tcp.py

+ 26 - 10
service/device.py

@@ -48,16 +48,27 @@ class Device(object):
 		if gateway['server_id'] and gateway['product_id']:
 			server = Demeter.service('common').one('setting_server', id=gateway['server_id'])
 			if server['server_type'] == 2 or server['server_type'] == 3:
-				device = Demeter.service('common').list('setting_device', search={'product_id':gateway['product_id']})
-				if device:
-					for v in device:
-						if v['modbus_slave_id']:
-							hardware_type = Demeter.service('core', 'setting').hardware_type(v['oper_type'])
-							self.add({'type_id':v['id']}, v['name'], farm_id, v['id'], hardware_type, gateway_id, v['id'], gateway['server_id'], gateway['product_id'], '')
+				code = Demeter.service('common').list('setting_modbus_code', search={'product_id':gateway['product_id']})
+				if code:
+					for v in code:
+						if v['slave_id']:
+							#hardware_type = Demeter.service('core', 'setting').hardware_type(v['oper_type'])
+							hardware_type = v['hardware_type']
+							device_type_key = v['device_type_key'].split("\r\n")
+							for i in device_type_key:
+								device_type = Demeter.service('common').one('setting_device_type', key=i)
+								if device_type:
+									self.add({'type_id':device_type['id']}, device_type['name'], farm_id, 0, hardware_type, gateway_id, device_type['id'], gateway['server_id'], gateway['product_id'], '')
 	# 添加设备
 	def add(self, where, name, farm_id, hardware_id, hardware_type, gateway_id, type_id, server_id, product_id, value):
 		info = Demeter.service('common').list('device_info', search=where)
 		if not info:
+			if hardware_id < 1:
+				device = Demeter.service('common').list('device_info', limit='0,1')
+				if device:
+					hardware_id = device[0]['hardware_id'] + 1
+				else:
+					hardware_id = 1
 			insert = {}
 			insert['farm_id'] = farm_id
 			insert['name'] = name
@@ -138,7 +149,7 @@ class Device(object):
 			gateway_info = model.select(type='fetchone')
 
 			if info['type_id'] > 0:
-				model = Demeter.model('setting_device')
+				model = Demeter.model('setting_device_type')
 				model.id = info['type_id']
 				type_info = model.select(type='fetchone')
 				if type_info:
@@ -197,7 +208,7 @@ class Device(object):
 
 	def msg(self, type_id, switch):
 		oper = ''
-		type_model = Demeter.model('setting_device')
+		type_model = Demeter.model('setting_device_type')
 		type_model.id = type_id
 		type_info = type_model.select(type='fetchone')
 		if type_info['unit'] == 'button':
@@ -428,13 +439,18 @@ class Device(object):
 			server = Demeter.service('common').one('setting_server', id=info['server_id'])
 			if server['server_type'] == 2:
 				send_modbus_tcp(type_info, gateway_info, info, switch, server)
+			elif server['server_type'] == 3:
+				send_modbus_rtu(type_info, gateway_info, info, switch, server)
 		else:
 			feedback = send_pub(type_info, gateway_info, info, switch)
 
 		return feedback
 
-	def send_modbus_tcp(self, device, gateway_info, info, value, server):
-		Demeter.service('tcp', 'modbus').send(server, device, value)
+	def send_modbus_tcp(self, type_info, gateway_info, info, value, server):
+		Demeter.service('tcp', 'modbus').send(server, type_info, info, value)
+
+	def send_modbus_rtu(self, type_info, gateway_info, info, value, server):
+		Demeter.service('rtu', 'modbus').send(server, type_info, info, value)
 
 	def send_pub(self, type_info, gateway_info, info, value):
 		from demeter.mqtt import Pub

+ 29 - 8
service/modbus/tcp.py

@@ -23,15 +23,26 @@ class Tcp(object):
 			Demeter.echo('tempr:' + str(tempr))
 			Demeter.echo('value:' + str(value))
 			slave_1.set_values('block1', 0, value)
+
+			shidu = round(((random.random()*1000)+10000), 2)
+			value = struct.unpack('>HH', struct.pack('>f', shidu))
+			Demeter.echo('shidu:' + str(shidu))
+			Demeter.echo('value:' + str(value))
+			slave_1.set_values('block1', 2, value)
+			
 			Demeter.echo('=========')
 			time.sleep(3)
 
 	def test(self):
 		port = 'COM3'
 		#master = modbus_rtu.RtuMaster(serial.Serial(port=port, baudrate=38400, bytesize=8, parity='O', stopbits=1, xonxoff=0))
-		master = modbus_tcp.TcpMaster(host='192.168.2.16', port=int(502))
+		master = modbus_tcp.TcpMaster(host='192.168.33.10', port=int(1152))
 		master.set_timeout(30)  #timeout表示若超过3秒没有连接上slave就会自动断开
 
+		value = master.execute(1, modbus_tk.defines.READ_HOLDING_REGISTERS, 0, 2)
+
+		print(value)
+
 		value = master.execute(1, modbus_tk.defines.READ_HOLDING_REGISTERS, 2, 2)
 
 		print(value)
@@ -188,17 +199,26 @@ class Tcp(object):
 	def setValue(self, code, master, info):
 		config = {}
 		gateway = Demeter.service('common').one('device_gateway', id=info['gateway_id'])
-		config['type'] = code['key']
+		
 		config['parent'] = gateway['hardware_id']
 		config['method'] = 'sensor'
 		config['child'] = info['hardware_id']
-		address = code['address'].split("\n")
+		address = code['register_address'].split("\r\n")
+		device_type_key = code['device_type_key'].split("\r\n")
+		exp = code['exp'].split("\r\n")
 		name = info['name']
+		j = 0
 		for i in address:
 			(code['register_address'],code['register_length']) = i.split(',')
+			code['exp'] = exp[j]
 			value = self.getValue(code, master, info)
-			device_type = code
-			Demeter.service('device').save(config,value, name, device_type)
+			device_type = device_type_key[j]
+			device_type = Demeter.service('common').one('setting_device_type', key=device_type)
+			config['type'] = device_type['key']
+			
+			j = j + 1
+			print(config)
+			Demeter.service('device').save(config, value, name, device_type)
 
 	def getValue(self, code, master, info):
 		if code['register_type'] == 1:
@@ -211,12 +231,13 @@ class Tcp(object):
 		elif code['register_type'] == 4:
 			modbus_register_type = mdef.READ_INPUT_REGISTERS
 
+		print(code)
 		temp = master.execute(int(code['slave_id']), modbus_register_type, int(code['register_address']), int(code['register_length']))
 
 		#Demeter.echo('temp:' + str(temp) + 'size:' + str(len(temp)))
 		value = struct.unpack('>f', struct.pack('>HH', temp[0], temp[1]))
 		value = str(round(value[0], 2))
-		#print(value)
+		print(value)
 
 		
 		if 'exp' in code:
@@ -225,7 +246,7 @@ class Tcp(object):
 			value = Demeter.exp(info['exp'], value)
 		return value
 
-	def send(self, server, device, info, value):
+	def send(self, server, type_info, info, value):
 		master = modbus_tcp.TcpMaster(host=server['host'], port=int(server['port']))
 		master.set_timeout(6.0)
 		master.set_verbose(True)
@@ -263,7 +284,7 @@ class Tcp(object):
 	def client(self, id):
 		server = Demeter.service('common').one('setting_server', id=id)
 		master = modbus_tcp.TcpMaster(host=server['server_host'], port=int(server['server_port']))
-		master.set_timeout(300)  #timeout表示若超过300秒没有连接上slave就会自动断开
+		master.set_timeout(6.0)
 		while(True):
 			self.master(master, server['id'])