Advertisement
Guest User

SDM220 Power Meter, MODBUS, Python

a guest
Apr 11th, 2015
3,902
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.96 KB | None | 0 0
  1. #!/usr/bin/python2
  2. import struct
  3. import pymodbus.client.sync
  4. import binascii
  5. import time
  6. import sys
  7.  
  8. def read_float_reg(client, basereg, unit=1) :
  9.     resp = client.read_input_registers(basereg,2, unit=1)
  10.     if resp == None :
  11.         return None
  12.     # according to spec, each pair of registers returned
  13.     # encodes a IEEE754 float where the first register carries
  14.     # the most significant 16 bits, the second register carries the
  15.     # least significant 16 bits.
  16.     return struct.unpack('>f',struct.pack('>HH',*resp.registers))
  17.  
  18. def fmt_or_dummy(regfmt, val) :
  19.     if val is None :
  20.         return '.'*len(regfmt[2]%(0))
  21.     return regfmt[2]%(val)
  22.  
  23. def main() :
  24.     regs = [
  25.         # Symbol    Reg#  Format
  26.         ( 'V',      0x00, '%6.2f' ), # Voltage [V]
  27.         ( 'Curr',   0x06, '%6.2f' ), # Current [A]
  28.         ( 'P[act]', 0x0c, '%6.0f' ), # Active Power ("Wirkleistung") [W]
  29.         ( 'P[app]', 0x12, '%6.0f' ), # Apparent Power ("Scheinl.") [W]
  30.         ( 'P[rea]', 0x18, '%6.0f' ), # Reactive Power ("Blindl.") [W]
  31.         ( 'PF',     0x1e, '%6.3f' ), # Power Factor   [1]
  32.         ( 'Phi',    0x24, '%6.1f' ), # cos(Phi)?      [1]
  33.         ( 'Freq',   0x46, '%6.2f' )  # Line Frequency [Hz]
  34.     ]
  35.  
  36.     # if client is set to odd or even parity, set stopbits to 1
  37.     # if client is set to 'none' parity, set stopbits to 2
  38.  
  39.     cl = pymodbus.client.sync.ModbusSerialClient('rtu',
  40.         port='/dev/ttyUSB0', baudrate=9600, parity='N',stopbits=2,
  41.         timeout=0.125)
  42.  
  43.     N=0
  44.     while True :
  45.         N += 1
  46.         if N % 16 == 1 :
  47.             print('#        '+(' '.join(['%-6s'%(x[0]) for x in regs])))
  48.             print('#        '+(':'.join(['------'        for x in regs])))
  49.  
  50.         values = [ read_float_reg(cl, reg[1], unit=1) for reg in regs ]
  51.         tstr=time.strftime('%H:%M:%S ')
  52.         print(tstr+(' '.join([fmt_or_dummy(*t) for t in zip(regs, values)])))
  53.         sys.stdout.flush()
  54.  
  55.  
  56. if __name__ == '__main__' :
  57.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement