Monday, February 29, 2016

Raspberry Pi - Python Snap7 - Mapping and Reading Datablocks


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();

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

(sortable)

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