|
@@ -11,27 +11,163 @@ class Tcp(object):
|
|
|
|
|
|
def server(self):
|
|
|
# 启动服务
|
|
|
- server = modbus_tcp.TcpServer(port=Demeter.config['modbus']['port'])
|
|
|
+ server = modbus_tcp.TcpServer(port=1152)
|
|
|
server.start()
|
|
|
slave_1 = server.add_slave(1)
|
|
|
- slave_1.add_block('block1', modbus_tk.defines.ANALOG_INPUTS, 0, 2)
|
|
|
+ slave_1.add_block('block1', modbus_tk.defines.HOLDING_REGISTERS, 0, 16)
|
|
|
|
|
|
while 1:
|
|
|
- bb = random.random()
|
|
|
- aa = struct.unpack('>HH', struct.pack('>f', bb))
|
|
|
- Demeter.echo('bb:' + str(bb))
|
|
|
- Demeter.echo('aa:' + str(aa))
|
|
|
- slave_1.set_values('block1', 0, aa)
|
|
|
+ tempr = round(((random.random()*1000)+10000), 2)
|
|
|
+ value = struct.unpack('>HH', struct.pack('>f', tempr))
|
|
|
+ Demeter.echo('tempr:' + str(tempr))
|
|
|
+ Demeter.echo('value:' + str(value))
|
|
|
+ slave_1.set_values('block1', 0, value)
|
|
|
Demeter.echo('=========')
|
|
|
time.sleep(3)
|
|
|
|
|
|
+ def server_s(self):
|
|
|
+ server = modbus_tk.modbus_tcp.TcpServer(port=1152, address='0.0.0.0', timeout_in_sec=3)
|
|
|
+ server.start()
|
|
|
+ slave_1 = server.add_slave(1)
|
|
|
+ slave_3 = server.add_slave(3)
|
|
|
+ slave_2 = server.add_slave(2)
|
|
|
+ slave_5 = server.add_slave(5)
|
|
|
+ # 创建寄存器,寄存器的别名为block1,寄存器为保持寄存器(Holding_Register),寄存器起始地址为0,寄存器个数为...
|
|
|
+
|
|
|
+ slave_1.add_block('block1', modbus_tk.defines.HOLDING_REGISTERS, 0, 10)
|
|
|
+ slave_3.add_block('block1', modbus_tk.defines.HOLDING_REGISTERS, 0, 2)
|
|
|
+ slave_2.add_block('block1', modbus_tk.defines.READ_INPUT_REGISTERS, 0, 44)
|
|
|
+ slave_5.add_block('block1', modbus_tk.defines.READ_INPUT_REGISTERS, 0, 28)
|
|
|
+
|
|
|
+ #给slave_1添加一个模块(模块名,只读,地址,长度)
|
|
|
+ valueAll_1 = slave_1.get_values('block1', 0, 10)
|
|
|
+ print('valueAll--1: ', valueAll_1)
|
|
|
+
|
|
|
+ valueAll_3 = slave_3.get_values('block1', 0, 2)
|
|
|
+ print('valueAll--3: ', valueAll_3)
|
|
|
+
|
|
|
+ valueAll_2 = slave_2.get_values('block1', 0, 44)
|
|
|
+ print('valueAll--2: ', valueAll_2)
|
|
|
+
|
|
|
+ valueAll_5 = slave_5.get_values('block1', 0, 28)
|
|
|
+ print('valueAll--5: ', valueAll_5)
|
|
|
+
|
|
|
+ # value0 = slave_1.get_values('block1', 0, 1) # 寄存器0000 -- 状态位初始值为全0
|
|
|
+ # print 'value0: ', value0
|
|
|
+
|
|
|
+ while True:
|
|
|
+ # slave只set数据,不再读取数据,以防端口被占用,master读不上来
|
|
|
+ #value_all = slave_1.get_values('block1', 0, 10)
|
|
|
+ #sys.stdout.write('done: values read: %s\r\n' % (str(value_all)))
|
|
|
+
|
|
|
+ # 室内温度
|
|
|
+ # 小数点后保留2位
|
|
|
+ tempr = round(((random.random()*1000)+10000), 2)
|
|
|
+
|
|
|
+ # 室内湿度
|
|
|
+ humid = round(((random.random()*1000)+10000), 2)
|
|
|
+
|
|
|
+ # 光照
|
|
|
+ sunlight = round(((random.random()*900)+10000), 2)
|
|
|
+
|
|
|
+ # CO2
|
|
|
+ co2 = round(((random.random()*1000)+10000), 2)
|
|
|
+
|
|
|
+ # 营养液温度
|
|
|
+ nuTempr = round(((random.random()*1000)+10000), 2)
|
|
|
+
|
|
|
+ # 含氧量
|
|
|
+ oxyg = round((random.uniform(200, 600)), 2)
|
|
|
+
|
|
|
+ # 室内温度1
|
|
|
+ tempr1 = round(random.uniform(10000, 20000), 2)
|
|
|
+
|
|
|
+ # 室内湿度1
|
|
|
+ humid1 = round(random.uniform(10000, 12000), 2)
|
|
|
+
|
|
|
+ # CO2_1
|
|
|
+ co2_1 = round(random.uniform(10000, 15000), 2)
|
|
|
+
|
|
|
+ # 瓶内温度1
|
|
|
+ bo_tempr1 = round(random.uniform(10000, 20000), 2)
|
|
|
+
|
|
|
+ # 室内温度2
|
|
|
+ tempr2 = round(random.uniform(10000, 20000), 2)
|
|
|
+
|
|
|
+ # 室内湿度2
|
|
|
+ humid2 = round(random.uniform(10000, 13000), 2)
|
|
|
+
|
|
|
+ # CO2
|
|
|
+ co2_2 = round(random.uniform(10000, 20000), 2)
|
|
|
+
|
|
|
+ # 瓶内温度2
|
|
|
+ bo_tempr2 = round(random.uniform(10000, 14000), 2)
|
|
|
+
|
|
|
+ # slave_1
|
|
|
+ slave_1.set_values('block1', 1, tempr)
|
|
|
+ slave_1.set_values('block1', 3, humid)
|
|
|
+ slave_1.set_values('block1', 5, sunlight)
|
|
|
+ slave_1.set_values('block1', 7, co2)
|
|
|
+ slave_1.set_values('block1', 9, nuTempr)
|
|
|
+
|
|
|
+ #slave_3
|
|
|
+ slave_3.set_values('block1', 1, oxyg)
|
|
|
+
|
|
|
+ # slave_2
|
|
|
+ slave_2.set_values('block1', 0, tempr1)
|
|
|
+ slave_2.set_values('block1', 1, humid1)
|
|
|
+ slave_2.set_values('block1', 2, co2_1)
|
|
|
+ slave_2.set_values('block1', 3, bo_tempr1)
|
|
|
+ slave_2.set_values('block1', 8, tempr2)
|
|
|
+ slave_2.set_values('block1', 9, humid2)
|
|
|
+ slave_2.set_values('block1', 10, co2_2)
|
|
|
+ slave_2.set_values('block1', 11, bo_tempr2)
|
|
|
+ slave_2.set_values('block1', 16, tempr1)
|
|
|
+ slave_2.set_values('block1', 17, humid1)
|
|
|
+ slave_2.set_values('block1', 18, co2_1)
|
|
|
+ slave_2.set_values('block1', 19, bo_tempr1)
|
|
|
+ slave_2.set_values('block1', 24, tempr2)
|
|
|
+ slave_2.set_values('block1', 25, humid2)
|
|
|
+ slave_2.set_values('block1', 26, co2_2)
|
|
|
+ slave_2.set_values('block1', 27, bo_tempr2)
|
|
|
+ slave_2.set_values('block1', 32, tempr1)
|
|
|
+ slave_2.set_values('block1', 33, humid1)
|
|
|
+ slave_2.set_values('block1', 34, co2_1)
|
|
|
+ slave_2.set_values('block1', 35, bo_tempr1)
|
|
|
+ slave_2.set_values('block1', 40, tempr2)
|
|
|
+ slave_2.set_values('block1', 41, humid2)
|
|
|
+ slave_2.set_values('block1', 42, co2_2)
|
|
|
+ slave_2.set_values('block1', 43, bo_tempr2)
|
|
|
+
|
|
|
+ # slave_5
|
|
|
+ slave_5.set_values('block1', 0, tempr1)
|
|
|
+ slave_5.set_values('block1', 1, humid1)
|
|
|
+ slave_5.set_values('block1', 2, co2_1)
|
|
|
+ slave_5.set_values('block1', 3, bo_tempr1)
|
|
|
+ slave_5.set_values('block1', 8, tempr2)
|
|
|
+ slave_5.set_values('block1', 9, humid2)
|
|
|
+ slave_5.set_values('block1', 10, co2_2)
|
|
|
+ slave_5.set_values('block1', 11, bo_tempr2)
|
|
|
+ slave_5.set_values('block1', 16, tempr1)
|
|
|
+ slave_5.set_values('block1', 17, humid1)
|
|
|
+ slave_5.set_values('block1', 18, co2_1)
|
|
|
+ slave_5.set_values('block1', 19, bo_tempr1)
|
|
|
+ slave_5.set_values('block1', 24, tempr2)
|
|
|
+ slave_5.set_values('block1', 25, humid2)
|
|
|
+ slave_5.set_values('block1', 26, co2_2)
|
|
|
+ slave_5.set_values('block1', 27, bo_tempr2)
|
|
|
+
|
|
|
+
|
|
|
+ print('======================')
|
|
|
+ time.sleep(1)
|
|
|
+
|
|
|
def master(self, master, id):
|
|
|
- info = Demeter.service('common').list('device_info', search={server_id:id})
|
|
|
+ info = Demeter.service('common').list('device_info', search={'server_id':id})
|
|
|
if info:
|
|
|
for v in info:
|
|
|
if v['type_id']:
|
|
|
device = Demeter.service('common').one('setting_device', id=v['type_id'])
|
|
|
- if device.oper_type == 1:
|
|
|
+ if device['oper_type'] == 1:
|
|
|
self.setValue(device, master, v)
|
|
|
|
|
|
def setValue(self, device, master, info):
|
|
@@ -43,7 +179,7 @@ class Tcp(object):
|
|
|
config['child'] = info['hardware_id']
|
|
|
value = self.getValue(device, master, info)
|
|
|
name = info['name']
|
|
|
- device_type = device['id']
|
|
|
+ device_type = device
|
|
|
Demeter.service('device').save(config,value, name, device_type)
|
|
|
|
|
|
def getValue(self, device, master, info):
|
|
@@ -57,7 +193,13 @@ class Tcp(object):
|
|
|
elif device['modbus_register_type'] == 4:
|
|
|
modbus_register_type = mdef.READ_INPUT_REGISTERS
|
|
|
|
|
|
- value = master.execute(device['modbus_slave_id'], modbus_register_type, device['modbus_register_address'], device['modbus_register_length'])
|
|
|
+ temp = master.execute(int(device['modbus_slave_id']), modbus_register_type, int(device['modbus_register_address']), int(device['modbus_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)
|
|
|
+
|
|
|
|
|
|
if 'exp' in device:
|
|
|
value = Demeter.exp(device['exp'], value)
|
|
@@ -66,7 +208,7 @@ class Tcp(object):
|
|
|
return value
|
|
|
|
|
|
def send(self, server, device, info, value):
|
|
|
- master = modbus_tcp.TcpMaster(host=server['host'], port=server['port'])
|
|
|
+ master = modbus_tcp.TcpMaster(host=server['host'], port=int(server['port']))
|
|
|
master.set_timeout(30) #timeout表示若超过3秒没有连接上slave就会自动断开
|
|
|
if 'exp' in device:
|
|
|
value = Demeter.exp(device['exp'], value)
|
|
@@ -92,15 +234,34 @@ class Tcp(object):
|
|
|
result = master.execute(device['modbus_slave_id'], modbus_register_type, device['modbus_register_address'], len(value))
|
|
|
return result
|
|
|
|
|
|
- def client(self):
|
|
|
- server = Demeter.service('common').list('setting_server', search={server_type:2})
|
|
|
+ def start(self):
|
|
|
+ server = Demeter.service('common').list('setting_server', search={'server_type':2})
|
|
|
if server:
|
|
|
+ modbus = Demeter.path + 'modbus.py'
|
|
|
for v in server:
|
|
|
- master = modbus_tcp.TcpMaster(host=v['host'], port=v['port'])
|
|
|
- master.set_timeout(300) #timeout表示若超过3秒没有连接上slave就会自动断开
|
|
|
- self.master(master, v['id'])
|
|
|
+ Shell.popen('python3 ' + modbus + ' -m client -i ' + v['id'])
|
|
|
+
|
|
|
+ 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就会自动断开
|
|
|
+ while(True):
|
|
|
+ self.master(master, server['id'])
|
|
|
|
|
|
def test(self):
|
|
|
+ master = modbus_tcp.TcpMaster(host="192.168.33.10", port=1152)
|
|
|
+ master.set_timeout(3) #timeout表示若超过3秒没有连接上slave就会自动断开
|
|
|
+ tempr = master.execute(1, modbus_tk.defines.READ_HOLDING_REGISTERS, 0, 2)
|
|
|
+ #(slave id,只读,block地址,长度:即字节乘个数)
|
|
|
+ Demeter.echo('tempr:' + str(tempr) + 'size:' + str(len(tempr)))
|
|
|
+ value = struct.unpack('>f', struct.pack('>HH', tempr[0], tempr[1]))
|
|
|
+ #在slave中,是先打包成'>f'在以'>HH'解包的,在master中刚好相反
|
|
|
+ #struct.unpack里解出来的是一个元组,可以用bb, = 或者输出bb[0]
|
|
|
+ print(value)
|
|
|
+ Demeter.echo('value:' + str(round(value[0], 2)))
|
|
|
+ time.sleep(3)
|
|
|
+
|
|
|
+ def test1(self):
|
|
|
master = modbus_tcp.TcpMaster(host="192.168.33.10", port=1152)
|
|
|
master.set_timeout(3) #timeout表示若超过3秒没有连接上slave就会自动断开
|
|
|
aa = master.execute(1, modbus_tk.defines.ANALOG_INPUTS, 0, 2)
|