120 lines
3.3 KiB
Python
120 lines
3.3 KiB
Python
from pycomm.ab_comm.clx import Driver as plcDriver
|
|
import sys
|
|
|
|
|
|
def readMicroTag(addr, tag):
|
|
addr = str(addr)
|
|
tag = str(tag)
|
|
c = plcDriver()
|
|
if c.open(addr, True):
|
|
try:
|
|
v = c.read_tag(tag)
|
|
# print(v)
|
|
return v
|
|
except Exception:
|
|
err = c.get_status()
|
|
c.close()
|
|
print "{} on reading {} from {}".format(err, tag, addr)
|
|
pass
|
|
c.close()
|
|
|
|
|
|
def getTagType(addr, tag):
|
|
addr = str(addr)
|
|
tag = str(tag)
|
|
c = plcDriver()
|
|
if c.open(addr, True):
|
|
try:
|
|
return c.read_tag(tag)[1]
|
|
except Exception:
|
|
err = c.get_status()
|
|
c.close()
|
|
print err
|
|
pass
|
|
c.close()
|
|
|
|
|
|
def write(addr, tag, val, t):
|
|
addr = str(addr)
|
|
tag = str(tag)
|
|
c = plcDriver()
|
|
if c.open(addr, True):
|
|
try:
|
|
wt = c.write_tag(tag, val, t)
|
|
return wt
|
|
except Exception:
|
|
err = c.get_status()
|
|
c.close()
|
|
print("Write Error: {} setting {} at {} to {} type {}".format(err, tag, addr, val, t))
|
|
return False
|
|
c.close()
|
|
|
|
|
|
def closeEnough(a, b):
|
|
return abs(a - b) <= 0.001
|
|
|
|
|
|
def writeMicroTag(addr, tag, val, handshake=None, handshake_val=None):
|
|
addr = str(addr)
|
|
tag = str(tag)
|
|
print("handshake: {}, handshake_val: {}".format(handshake, handshake_val))
|
|
chk_tag = tag
|
|
if not(handshake is None) and not(handshake == "None"):
|
|
chk_tag = str(handshake)
|
|
print("Handshake tag passed, using {}".format(chk_tag))
|
|
chk_val = val
|
|
if not (handshake_val is None) and not(handshake_val == "None"):
|
|
chk_val = handshake_val
|
|
print("Handshake value passed, using {}".format(chk_val))
|
|
attempts_allowed = 5
|
|
attempts = 1
|
|
|
|
while attempts <= attempts_allowed:
|
|
try:
|
|
attempts = attempts + 1
|
|
cv = readMicroTag(addr, tag)
|
|
print("Val Before Write: {}".format(cv))
|
|
if cv:
|
|
if cv[1] == "REAL":
|
|
val = float(val)
|
|
chk_val = float(chk_val)
|
|
else:
|
|
val = int(val)
|
|
chk_val = int(chk_val)
|
|
wt = write(addr, tag, val, cv[1])
|
|
if wt:
|
|
print("write: {}".format(wt))
|
|
chk = readMicroTag(addr, chk_tag)
|
|
if chk:
|
|
print("chk: {}, chk_val: {}".format(chk, chk_val))
|
|
if closeEnough(chk[0], chk_val):
|
|
return True
|
|
except Exception as e:
|
|
print e
|
|
return False
|
|
|
|
|
|
def readMicroTagList(addr, tList):
|
|
addr = str(addr)
|
|
c = plcDriver()
|
|
if c.open(addr, True):
|
|
vals = []
|
|
try:
|
|
for t in tList:
|
|
v = c.read_tag(t)
|
|
vals.append({"tag": t, "val": v[0], "type": v[1]})
|
|
# print(v)
|
|
# print("{0} - {1}".format(t, v))
|
|
except Exception:
|
|
err = c.get_status()
|
|
c.close()
|
|
print err
|
|
pass
|
|
c.close()
|
|
return vals
|
|
if __name__ == '__main__':
|
|
if len(sys.argv) > 2:
|
|
print(readMicroTag(sys.argv[1], sys.argv[2]))
|
|
else:
|
|
print ("Did not pass a target and tag name.")
|