123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- # -*- coding: utf-8 -*-
- from demeter.core import *
- import modbus_tk
- import modbus_tk.modbus_tcp as modbus_tcp
- import modbus_tk.defines as mdef
- import time
- import random
- import struct
- import serial
- class Old(object):
- def server(self):
- # 启动服务
- server = modbus_tcp.TcpServer(port=8010)
- server.start()
- slave_1 = server.add_slave(1)
- slave_1.add_block('block1', modbus_tk.defines.HOLDING_REGISTERS, 0, 16)
- while 1:
- tempr = round(((random.random()*1000)), 2)
- value = struct.unpack('>HH', struct.pack('>f', tempr))
- #value = tempr
- Demeter.echo('tempr:' + str(tempr))
- Demeter.echo('value:' + str(value))
- slave_1.set_values('block1', 0, value)
- shidu = round(((random.random()*1000)), 2)
- value = struct.unpack('>HH', struct.pack('>f', shidu))
- #value = shidu
- Demeter.echo('shidu:' + str(shidu))
- Demeter.echo('value:' + str(value))
- slave_1.set_values('block1', 2, value)
- famen = random.randint(1,2)
- value = struct.unpack('>HH', struct.pack('>f', famen))
- #Demeter.echo('famen:' + str(famen))
- #Demeter.echo('value:' + str(value))
- #slave_1.set_values('block1', 4, 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.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)
- # 获取数据
- def getData(self, type, slave_id):
- pass
- 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})
- if info:
- for v in info:
- if v['product_id']:
- code = Demeter.service('common').one('setting_modbus_code', id=v['product_id'])
- if code['oper_type'] == 1:
- self.setValue(code, master, v)
- def setValue(self, code, master, info):
- config = {}
- gateway = Demeter.service('common').one('device_gateway', id=info['gateway_id'])
- hardware = Demeter.service('common').one('hardware_type', id=info['hardware_type'])
- config['parent'] = gateway['hardware_id']
- config['method'] = hardware['key']
- config['child'] = info['hardware_id']
- 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 = device_type_key[j]
- device_type = Demeter.service('common').one('setting_device_type', key=device_type)
- config['type'] = device_type['key']
-
- j = j + 1
- Demeter.service('device').save(config, value, name, device_type)
- def getValue(self, code, master, info):
- if code['register_type'] == 1:
- # 线圈
- modbus_register_type = mdef.READ_COILS
- elif code['register_type'] == 2:
- modbus_register_type = mdef.READ_DISCRETE_INPUTS
- elif code['register_type'] == 3:
- modbus_register_type = mdef.READ_HOLDING_REGISTERS
- elif code['register_type'] == 4:
- modbus_register_type = mdef.READ_INPUT_REGISTERS
- 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))
-
- if 'exp' in code:
- value = Demeter.exp(code['exp'], value)
- if 'exp' in info:
- value = Demeter.exp(info['exp'], value)
- return 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)
- if 'exp' in device:
- value = Demeter.exp(device['exp'], value)
- if 'exp' in info:
- value = Demeter.exp(info['exp'], value)
- if ',' in value:
- value = value.split(',')
- modbus_register_type = ''
- if device['modbus_register_type'] == 1:
- modbus_register_type = mdef.WRITE_SINGLE_COIL
- elif device['modbus_register_type'] == 2:
- modbus_register_type = mdef.WRITE_MULTIPLE_COILS
- elif device['modbus_register_type'] == 3:
- modbus_register_type = mdef.WRITE_SINGLE_REGISTER
- elif device['modbus_register_type'] == 4:
- modbus_register_type = mdef.WRITE_MULTIPLE_REGISTERS
- result = ''
- if modbus_register_type:
- master.execute(device['modbus_slave_id'], modbus_register_type, device['modbus_register_address'], output_value=value)
- result = master.execute(device['modbus_slave_id'], modbus_register_type, device['modbus_register_address'], len(value))
- return result
- 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:
- 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(6.0)
- while(True):
- self.master(master, server['id'])
- def test2(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)
- #(slave id,只读,block地址,长度:即字节乘个数)
- Demeter.echo('aa:' + str(aa) + 'size:' + str(len(aa)))
- bb = struct.unpack('>f', struct.pack('>HH', aa[0], aa[1]))
- #在slave中,是先打包成'>f'在以'>HH'解包的,在master中刚好相反
- #struct.unpack里解出来的是一个元组,可以用bb, = 或者输出bb[0]
- Demeter.echo('bb:' + str(bb[0]))
- time.sleep(3)
- slave = 1
- # 读线圈寄存器
- master.execute(slave, mdef.READ_COILS, 0, 16)
- # 读离散输入寄存器
- master.execute(slave, mdef.READ_DISCRETE_INPUTS, 0, 16)
- # 读保持寄存器
- master.execute(slave, mdef.READ_HOLDING_REGISTERS, 0, 16)
- # 读输入寄存器
- master.execute(slave, mdef.READ_INPUT_REGISTERS, 0, 16)
- # 单个读写寄存器操作
- # 写单个线圈 写寄存器地址为0的线圈寄存器,写入内容为0(位操作)
- master.execute(slave, mdef.WRITE_SINGLE_COIL, 0, output_value=0)
- master.execute(slave, mdef.READ_COILS, 0, 1)
- # 写单个保持寄存器 写寄存器地址为0的保持寄存器
- master.execute(slave, mdef.WRITE_SINGLE_REGISTER, 0, output_value=21)
- master.execute(slave, mdef.READ_HOLDING_REGISTERS, 0, 1)
- # 多个寄存器读写操作
- # 写多个保持寄存器 写寄存器起始地址为0的保持寄存器,操作寄存器个数为4
- master.execute(slave, mdef.WRITE_MULTIPLE_REGISTERS, 0, output_value=[20,21,22,23])
- master.execute(slave, mdef.READ_HOLDING_REGISTERS, 0, 4)
- # 写寄存器起始地址为0的线圈寄存器
- master.execute(slave, mdef.WRITE_MULTIPLE_COILS, 0, output_value=[0,0,0,0])
- master.execute(slave, mdef.READ_COILS, 0, 4)
- # slave_id,类型,地址,长度(或者值)、读取还是写入、计算公式
|