import snap7.client
from snap7.snap7types import *
from snap7.util import *
class DBObject(object):
    pass
offsets = { "Bool":2,"Int": 2,"Real":4,"DInt":6,"String":256}
db=\
"""
Temperature Real 0.0
Cold Bool 4.0
RPis_to_Buy Int 6.0
Db_test_String String 8.0
"""
def DBRead(plc,db_num,length,dbitems):
    data = plc.read_area(areas['DB'],db_num,0,length)
    obj = DBObject()
    for item in dbitems:
        value = None
        offset = int(item['bytebit'].split('.')[0])
        if item['datatype']=='Real':
            value = get_real(data,offset)
        if item['datatype']=='Bool':
            bit =int(item['bytebit'].split('.')[1])
            value = get_bool(data,offset,bit)
        if item['datatype']=='Int':
            value = get_int(data, offset)
        if item['datatype']=='String':
            value = get_string(data, offset)
        obj.__setattr__(item['name'], value)
    return obj
def get_db_size(array,bytekey,datatypekey):
    seq,length = [x[bytekey] for x in array],[x[datatypekey] for x in array]
    idx = seq.index(max(seq))
    lastByte = int(max(seq).split('.')[0])+(offsets[length[idx]])
    return lastByte
if __name__ == "__main__":
    plc = snap7.client.Client()
    plc.connect('10.10.55.109',0,0)
    itemlist = filter(lambda a: a!='',db.split('\n'))
    deliminator='\t'
    items = [
        {
            "name":x.split(deliminator)[0],
            "datatype":x.split(deliminator)[1],
            "bytebit":x.split(deliminator)[2]
         } for x in itemlist
    ]
    #get length of datablock
    length = get_db_size(items,'bytebit','datatype')
    meh = DBRead(plc,10,length,items)
    print """
    Cold:\t\t\t{}
    Tempeature:\t\t{}
    RPis_to_Buy:\t{}
    Db_test_String:\t{}
    """.format(meh.Cold,meh.Temperature,meh.RPis_to_Buy,meh.Db_test_String)
    plc.disconnect();
Monday, February 29, 2016
Raspberry Pi - Python Snap7 - Mapping and Reading Datablocks
Wednesday, February 3, 2016
Python Snap7 S7-1200 Simple Reading/Writing Memory Example
import snap7.client as c
from snap7.util import *
from snap7.snap7types import *
def ReadMemory(plc,byte,bit,datatype):
    result = plc.read_area(areas['MK'],0,byte,datatype)
    if datatype==S7WLBit:
        return get_bool(result,0,bit)
    elif datatype==S7WLByte or datatype==S7WLWord:
        return get_int(result,0)
    elif datatype==S7WLReal:
        return get_real(result,0)
    elif datatype==S7WLDWord:
        return get_dword(result,0)
    else:
        return None
def WriteMemory(plc,byte,bit,datatype,value):
    result = plc.read_area(areas['MK'],0,byte,datatype)
    if datatype==S7WLBit:
        set_bool(result,0,bit,value)
    elif datatype==S7WLByte or datatype==S7WLWord:
        set_int(result,0,value)
    elif datatype==S7WLReal:
        set_real(result,0,value)
    elif datatype==S7WLDWord:
        set_dword(result,0,value)
    plc.write_area(areas["MK"],0,byte,result)
if __name__=="__main__":
    plc = c.Client()
    plc.connect('10.10.54.2',0,1)
    print ReadMemory(plc,420,0,S7WLReal)
    WriteMemory(plc,420,0,S7WLReal,3.141592)
    print ReadMemory(plc,420,0,S7WLReal)
    #DONE!!
Tuesday, February 2, 2016
25+ Raspberry Compatible 1-Wire Host Boards/Hats
| Image | Name / Link | Channels (Buses) | Extras | Price | Price per channel | 
|---|---|---|---|---|---|
| 1-Wire Driver DS2482-800 | 8 ch. | --- | £21.05 | £2.63 / ch | |
| 1-Wire Interface Module | 1 ch. | --- | £5.93 | £5.93 / ch | |
| R-Pi i2c 1-Wire OWFS Expansion Module | 1 ch. | --- | £17.99 | £17.99 / ch | |
| I2C counter / 1-wire board | 8 ch. | 6x 16 bit Counter inputs | £69.99 | £8.75 / ch | |
| Com Pi | 1 ch. | RS232 Port | £12.99 | £12.99 / ch | |
|  | 1 Wire Pi Plus | 1 ch. | --- | £12 | £12 / ch | 
| RP1 1-Wire GPIO Host Adapter | 1 ch. | --- | £7.95 | £7.95 / ch | |
| RPI2 1-Wire Host Adapter | 1 ch. | --- | £14 | £13.95 / ch | |
| RPI3 v1 1-Wire Host Adapter | 8 ch. | RTC | £33 | £4.12 / ch | |
| RPI3 v2 1-Wire Host Adapter | 8 ch. | RTC | £33 | £4.12 / ch | |
|  | AbioWire+ | 17 ch. | --- | £42 | £5.25 / ch | 
|  | 1-Wire Mini Host | 8 ch. | --- | £15.26 | £1.90 / ch | 
|  | 1-Wire Automation System | 8 ch. | expansion slot | £114 | £14.25 / ch | 
| Raspberry Pi -9 Channel 1-Wire Board | 9 ch. | RTC | £33 | £3.66 / ch | |
| IoT-1Wire-1 module Board | 8 ch. | --- | £34 | £4.25 / ch | |
| IoT-1Wire-1 module Board | 1 ch. (5 ports) | --- | £24 | £24 / ch | |
| 4 USB Hub & I2C AD/DA - 1-Wire Board | 1 ch. | RTC, 10bit ADC, 8bit DAC, 4 USB Hub | £52 | £52 / ch | |
| 7 USB Hub & I2C AD/DA - 1-Wire Board | 1 ch. | 10bit ADC / 8bit DAC, 7 USB Hub | £58 | £58 / ch | |
| Step Motor & I2C 1-Wire Board | 1 ch. | 8 ch output / step motor output | £21 | £21 / ch | |
| One-Wire 17 Channels | 17 ch. | --- | £46.99 | £2.76 / ch | |
| USB to One Wire converter | 1 ch. | --- | $24.60 | $24.60 / ch | |
| S4: USB / 1-Wire Interface Card | 1 ch. | --- | €39 | €39 / ch | |
| USB to 1-Wire RJ11 | 1 ch. | --- | £26 | £26 / ch | |
| I2C 1 Wire Click | 8 ch. | --- | £19.45 | £2.43 / ch | |
|  | UART to 1 Wire Adapter (Retired) | 1 ch. | --- | --- | --- | 
| UniPi Expansion Board | 1 ch. | Relays, Inputs, Outputs, Analog In/Out 0-10v | $134 | $134 / ch | |
| PIGATOR Onewire | 1 ch. | RTC, uplink header for expansion | £60 | £60 / ch | |
Subscribe to:
Comments (Atom)
 
 
