Python cpppo won't display string data type from PLC
up vote
2
down vote
favorite
I have the cpppo Python package installed and I have an ABLogix IO Server with 192.168.1.100
IP that I typically connect to it with different software (not python) as 192.168.1.100,1,0
.
My problem is I cannot get it to bring back the value of a tag on an accessible PLC when that tag's data type is set to String
in the PLC RSLogix 5000 code. The string value I'm testing with is a 12 character alphanumeric string if that matters so U123HTS76312
My question is to know if someone can see maybe something I'm overlooking that will allow me to get the value from a tag where the PLC has it defined as a String
data type?
Note: According to the README.org in the
client.connector.get_attribute_single and .get_attributes_all
section, it states "To access Get Attribute data with CIP type conversion, usecpppo.server.enip.get_attribute
’sproxy
classes, instead."
- I think using
for message in source.read([(TagName, "SSTRING")], portLink)
in the non-working example "c." below is specifying the CIP
type but it doesn't work
Potential Related Issue: Problem reading/writing STRING data types
I get this same error if I try to write a value so that's why I think it may be related.
python -m cpppo.server.enip.client -a 192.168.1.100 "UL1_LOTCODE_STR_X=(STRING)123HFGR45678"
11-08 10:51:47.692 MainThread enip.cli WARNING validate Client Single Write Tag UL1_LOTCODE_STR_X returned non-zero status: Status 255 [8455]
UL1_LOTCODE_STR_X <= ['123HFGR45678']: 'Status 255 [8455]'
The Context Begins. . .
1. It Works. . .
I have a tag named UL1_TICKETWEIGHT_X
which is set as a DINT
in the PLC logic that I get the correct sensor data value back from as expected using the below logic.
Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_TICKETWEIGHT_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output
UL1_TICKETWEIGHT_X == 55000
['2018-11-07 19:59:24.853017', [55000]]
2. It Doesn't Work. . .
I have a tag named UL1_LOTCODE_STR_X
which is set as a String
in the PLC logic that does not get back the correct data from the sensor with the various things I've tried below to show a few.
I did many other things and read over slews of the code in the files hoping I could figure out which class or method to use or what arguments to pass to what, and so forth.
I have also set the value of UL1_LOTCODE_STR_X
to a DINT
type value (it is still String
type though at PLC level) such as 15
and it still has the same problem
a. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
Traceback (most recent call last):
File "DesktopTest.py", line 11, in <module>
for message in source.read(TagName, portLink):
File "PythonPython36-32libsite-packagescppposerverenipget_attribute.py", line 431, in read
for val,(sts,(att,typ,uni)) in reader:
File "PythonPython36-32libsite-packagescppposerverenipget_attribute.py", line 606, in read_details
depth=self.depth, multiple=self.multiple, timeout=self.timeout )):
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1393, in operate
for idx,dsc,req,rpy,sts,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1258, in pipeline
col = next( harvester )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1190, in harvest
issued, self.collect( timeout=timeout )): # must be "lazy" zip!
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1115, in collect
response,elapsed = await( self, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 872, in await
for response in cli: # if StopIteration raised immediately, defaults to signalling completion
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 546, in __next__
for mch,sta in engine:
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1291, in delegate
raise NonTerminal( "%s sub-machine terminated in a non-terminal state" % ( self ))
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
b. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read_details(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
Traceback (most recent call last):
File "DesktopTest.py", line 12, in <module>
for message in source.read_details(TagName, portLink):
TypeError: read_details() takes 2 positional arguments but 3 were given
c. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read([(TagName, "SSTRING")], portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
UL1_LOTCODE_STR_X == None
['2018-11-08 00:05:48.424095', None]
d. Non-Working Python Logic
Note: This works if I put a tag in as the argument with is not a String
type within the PLC logic.
python -m cpppo.server.enip.client -a 192.168.1.100 "UL1_LOTCODE_STR_X"
Output (error)
Traceback (most recent call last):
File "PythonPython36-32librunpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "PythonPython36-32librunpy.py", line 85, in _run_code
exec(code, run_globals)
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1649, in <module>
sys.exit( main() )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1630, in main
fragment=fragment, printing=printing, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1406, in process
transactions = list( self.results( operations=operations, **kwds ))
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1398, in results
for idx,dsc,req,rpy,sts,val in self.operate( operations, **kwds ):
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1393, in operate
for idx,dsc,req,rpy,sts,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1283, in validate
for index,descr,request,reply,status,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1258, in pipeline
col = next( harvester )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1190, in harvest
issued, self.collect( timeout=timeout )): # must be "lazy" zip!
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1115, in collect
response,elapsed = await( self, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 872, in await
for response in cli: # if StopIteration raised immediately, defaults to signalling completion
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 546, in __next__
for mch,sta in engine:
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1291, in delegate
raise NonTerminal( "%s sub-machine terminated in a non-terminal state" % ( self ))
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
Other Specs
Python:3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)]
OS: Windows 10
python python-3.x
add a comment |
up vote
2
down vote
favorite
I have the cpppo Python package installed and I have an ABLogix IO Server with 192.168.1.100
IP that I typically connect to it with different software (not python) as 192.168.1.100,1,0
.
My problem is I cannot get it to bring back the value of a tag on an accessible PLC when that tag's data type is set to String
in the PLC RSLogix 5000 code. The string value I'm testing with is a 12 character alphanumeric string if that matters so U123HTS76312
My question is to know if someone can see maybe something I'm overlooking that will allow me to get the value from a tag where the PLC has it defined as a String
data type?
Note: According to the README.org in the
client.connector.get_attribute_single and .get_attributes_all
section, it states "To access Get Attribute data with CIP type conversion, usecpppo.server.enip.get_attribute
’sproxy
classes, instead."
- I think using
for message in source.read([(TagName, "SSTRING")], portLink)
in the non-working example "c." below is specifying the CIP
type but it doesn't work
Potential Related Issue: Problem reading/writing STRING data types
I get this same error if I try to write a value so that's why I think it may be related.
python -m cpppo.server.enip.client -a 192.168.1.100 "UL1_LOTCODE_STR_X=(STRING)123HFGR45678"
11-08 10:51:47.692 MainThread enip.cli WARNING validate Client Single Write Tag UL1_LOTCODE_STR_X returned non-zero status: Status 255 [8455]
UL1_LOTCODE_STR_X <= ['123HFGR45678']: 'Status 255 [8455]'
The Context Begins. . .
1. It Works. . .
I have a tag named UL1_TICKETWEIGHT_X
which is set as a DINT
in the PLC logic that I get the correct sensor data value back from as expected using the below logic.
Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_TICKETWEIGHT_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output
UL1_TICKETWEIGHT_X == 55000
['2018-11-07 19:59:24.853017', [55000]]
2. It Doesn't Work. . .
I have a tag named UL1_LOTCODE_STR_X
which is set as a String
in the PLC logic that does not get back the correct data from the sensor with the various things I've tried below to show a few.
I did many other things and read over slews of the code in the files hoping I could figure out which class or method to use or what arguments to pass to what, and so forth.
I have also set the value of UL1_LOTCODE_STR_X
to a DINT
type value (it is still String
type though at PLC level) such as 15
and it still has the same problem
a. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
Traceback (most recent call last):
File "DesktopTest.py", line 11, in <module>
for message in source.read(TagName, portLink):
File "PythonPython36-32libsite-packagescppposerverenipget_attribute.py", line 431, in read
for val,(sts,(att,typ,uni)) in reader:
File "PythonPython36-32libsite-packagescppposerverenipget_attribute.py", line 606, in read_details
depth=self.depth, multiple=self.multiple, timeout=self.timeout )):
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1393, in operate
for idx,dsc,req,rpy,sts,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1258, in pipeline
col = next( harvester )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1190, in harvest
issued, self.collect( timeout=timeout )): # must be "lazy" zip!
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1115, in collect
response,elapsed = await( self, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 872, in await
for response in cli: # if StopIteration raised immediately, defaults to signalling completion
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 546, in __next__
for mch,sta in engine:
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1291, in delegate
raise NonTerminal( "%s sub-machine terminated in a non-terminal state" % ( self ))
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
b. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read_details(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
Traceback (most recent call last):
File "DesktopTest.py", line 12, in <module>
for message in source.read_details(TagName, portLink):
TypeError: read_details() takes 2 positional arguments but 3 were given
c. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read([(TagName, "SSTRING")], portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
UL1_LOTCODE_STR_X == None
['2018-11-08 00:05:48.424095', None]
d. Non-Working Python Logic
Note: This works if I put a tag in as the argument with is not a String
type within the PLC logic.
python -m cpppo.server.enip.client -a 192.168.1.100 "UL1_LOTCODE_STR_X"
Output (error)
Traceback (most recent call last):
File "PythonPython36-32librunpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "PythonPython36-32librunpy.py", line 85, in _run_code
exec(code, run_globals)
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1649, in <module>
sys.exit( main() )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1630, in main
fragment=fragment, printing=printing, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1406, in process
transactions = list( self.results( operations=operations, **kwds ))
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1398, in results
for idx,dsc,req,rpy,sts,val in self.operate( operations, **kwds ):
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1393, in operate
for idx,dsc,req,rpy,sts,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1283, in validate
for index,descr,request,reply,status,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1258, in pipeline
col = next( harvester )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1190, in harvest
issued, self.collect( timeout=timeout )): # must be "lazy" zip!
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1115, in collect
response,elapsed = await( self, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 872, in await
for response in cli: # if StopIteration raised immediately, defaults to signalling completion
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 546, in __next__
for mch,sta in engine:
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1291, in delegate
raise NonTerminal( "%s sub-machine terminated in a non-terminal state" % ( self ))
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
Other Specs
Python:3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)]
OS: Windows 10
python python-3.x
Let me know what I can add to help if I did something wrong please. My goal is to provide everything that's needed so please just tell me if I left something obvious or required out to make this a better question.
– Bitcoin Murderous Maniac
Nov 8 at 5:20
The error ofcpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
seems to pop up a lot so not sure if that'd be a helpful pointer for the automata.py file to see if it needs something updated to have the string type for the tag value or what.
– Bitcoin Murderous Maniac
Nov 8 at 21:58
add a comment |
up vote
2
down vote
favorite
up vote
2
down vote
favorite
I have the cpppo Python package installed and I have an ABLogix IO Server with 192.168.1.100
IP that I typically connect to it with different software (not python) as 192.168.1.100,1,0
.
My problem is I cannot get it to bring back the value of a tag on an accessible PLC when that tag's data type is set to String
in the PLC RSLogix 5000 code. The string value I'm testing with is a 12 character alphanumeric string if that matters so U123HTS76312
My question is to know if someone can see maybe something I'm overlooking that will allow me to get the value from a tag where the PLC has it defined as a String
data type?
Note: According to the README.org in the
client.connector.get_attribute_single and .get_attributes_all
section, it states "To access Get Attribute data with CIP type conversion, usecpppo.server.enip.get_attribute
’sproxy
classes, instead."
- I think using
for message in source.read([(TagName, "SSTRING")], portLink)
in the non-working example "c." below is specifying the CIP
type but it doesn't work
Potential Related Issue: Problem reading/writing STRING data types
I get this same error if I try to write a value so that's why I think it may be related.
python -m cpppo.server.enip.client -a 192.168.1.100 "UL1_LOTCODE_STR_X=(STRING)123HFGR45678"
11-08 10:51:47.692 MainThread enip.cli WARNING validate Client Single Write Tag UL1_LOTCODE_STR_X returned non-zero status: Status 255 [8455]
UL1_LOTCODE_STR_X <= ['123HFGR45678']: 'Status 255 [8455]'
The Context Begins. . .
1. It Works. . .
I have a tag named UL1_TICKETWEIGHT_X
which is set as a DINT
in the PLC logic that I get the correct sensor data value back from as expected using the below logic.
Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_TICKETWEIGHT_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output
UL1_TICKETWEIGHT_X == 55000
['2018-11-07 19:59:24.853017', [55000]]
2. It Doesn't Work. . .
I have a tag named UL1_LOTCODE_STR_X
which is set as a String
in the PLC logic that does not get back the correct data from the sensor with the various things I've tried below to show a few.
I did many other things and read over slews of the code in the files hoping I could figure out which class or method to use or what arguments to pass to what, and so forth.
I have also set the value of UL1_LOTCODE_STR_X
to a DINT
type value (it is still String
type though at PLC level) such as 15
and it still has the same problem
a. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
Traceback (most recent call last):
File "DesktopTest.py", line 11, in <module>
for message in source.read(TagName, portLink):
File "PythonPython36-32libsite-packagescppposerverenipget_attribute.py", line 431, in read
for val,(sts,(att,typ,uni)) in reader:
File "PythonPython36-32libsite-packagescppposerverenipget_attribute.py", line 606, in read_details
depth=self.depth, multiple=self.multiple, timeout=self.timeout )):
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1393, in operate
for idx,dsc,req,rpy,sts,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1258, in pipeline
col = next( harvester )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1190, in harvest
issued, self.collect( timeout=timeout )): # must be "lazy" zip!
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1115, in collect
response,elapsed = await( self, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 872, in await
for response in cli: # if StopIteration raised immediately, defaults to signalling completion
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 546, in __next__
for mch,sta in engine:
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1291, in delegate
raise NonTerminal( "%s sub-machine terminated in a non-terminal state" % ( self ))
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
b. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read_details(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
Traceback (most recent call last):
File "DesktopTest.py", line 12, in <module>
for message in source.read_details(TagName, portLink):
TypeError: read_details() takes 2 positional arguments but 3 were given
c. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read([(TagName, "SSTRING")], portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
UL1_LOTCODE_STR_X == None
['2018-11-08 00:05:48.424095', None]
d. Non-Working Python Logic
Note: This works if I put a tag in as the argument with is not a String
type within the PLC logic.
python -m cpppo.server.enip.client -a 192.168.1.100 "UL1_LOTCODE_STR_X"
Output (error)
Traceback (most recent call last):
File "PythonPython36-32librunpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "PythonPython36-32librunpy.py", line 85, in _run_code
exec(code, run_globals)
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1649, in <module>
sys.exit( main() )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1630, in main
fragment=fragment, printing=printing, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1406, in process
transactions = list( self.results( operations=operations, **kwds ))
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1398, in results
for idx,dsc,req,rpy,sts,val in self.operate( operations, **kwds ):
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1393, in operate
for idx,dsc,req,rpy,sts,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1283, in validate
for index,descr,request,reply,status,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1258, in pipeline
col = next( harvester )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1190, in harvest
issued, self.collect( timeout=timeout )): # must be "lazy" zip!
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1115, in collect
response,elapsed = await( self, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 872, in await
for response in cli: # if StopIteration raised immediately, defaults to signalling completion
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 546, in __next__
for mch,sta in engine:
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1291, in delegate
raise NonTerminal( "%s sub-machine terminated in a non-terminal state" % ( self ))
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
Other Specs
Python:3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)]
OS: Windows 10
python python-3.x
I have the cpppo Python package installed and I have an ABLogix IO Server with 192.168.1.100
IP that I typically connect to it with different software (not python) as 192.168.1.100,1,0
.
My problem is I cannot get it to bring back the value of a tag on an accessible PLC when that tag's data type is set to String
in the PLC RSLogix 5000 code. The string value I'm testing with is a 12 character alphanumeric string if that matters so U123HTS76312
My question is to know if someone can see maybe something I'm overlooking that will allow me to get the value from a tag where the PLC has it defined as a String
data type?
Note: According to the README.org in the
client.connector.get_attribute_single and .get_attributes_all
section, it states "To access Get Attribute data with CIP type conversion, usecpppo.server.enip.get_attribute
’sproxy
classes, instead."
- I think using
for message in source.read([(TagName, "SSTRING")], portLink)
in the non-working example "c." below is specifying the CIP
type but it doesn't work
Potential Related Issue: Problem reading/writing STRING data types
I get this same error if I try to write a value so that's why I think it may be related.
python -m cpppo.server.enip.client -a 192.168.1.100 "UL1_LOTCODE_STR_X=(STRING)123HFGR45678"
11-08 10:51:47.692 MainThread enip.cli WARNING validate Client Single Write Tag UL1_LOTCODE_STR_X returned non-zero status: Status 255 [8455]
UL1_LOTCODE_STR_X <= ['123HFGR45678']: 'Status 255 [8455]'
The Context Begins. . .
1. It Works. . .
I have a tag named UL1_TICKETWEIGHT_X
which is set as a DINT
in the PLC logic that I get the correct sensor data value back from as expected using the below logic.
Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_TICKETWEIGHT_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output
UL1_TICKETWEIGHT_X == 55000
['2018-11-07 19:59:24.853017', [55000]]
2. It Doesn't Work. . .
I have a tag named UL1_LOTCODE_STR_X
which is set as a String
in the PLC logic that does not get back the correct data from the sensor with the various things I've tried below to show a few.
I did many other things and read over slews of the code in the files hoping I could figure out which class or method to use or what arguments to pass to what, and so forth.
I have also set the value of UL1_LOTCODE_STR_X
to a DINT
type value (it is still String
type though at PLC level) such as 15
and it still has the same problem
a. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
Traceback (most recent call last):
File "DesktopTest.py", line 11, in <module>
for message in source.read(TagName, portLink):
File "PythonPython36-32libsite-packagescppposerverenipget_attribute.py", line 431, in read
for val,(sts,(att,typ,uni)) in reader:
File "PythonPython36-32libsite-packagescppposerverenipget_attribute.py", line 606, in read_details
depth=self.depth, multiple=self.multiple, timeout=self.timeout )):
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1393, in operate
for idx,dsc,req,rpy,sts,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1258, in pipeline
col = next( harvester )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1190, in harvest
issued, self.collect( timeout=timeout )): # must be "lazy" zip!
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1115, in collect
response,elapsed = await( self, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 872, in await
for response in cli: # if StopIteration raised immediately, defaults to signalling completion
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 546, in __next__
for mch,sta in engine:
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1291, in delegate
raise NonTerminal( "%s sub-machine terminated in a non-terminal state" % ( self ))
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
b. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read_details(TagName, portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
Traceback (most recent call last):
File "DesktopTest.py", line 12, in <module>
for message in source.read_details(TagName, portLink):
TypeError: read_details() takes 2 positional arguments but 3 were given
c. Non-Working Python Logic
from cpppo.server.enip.get_attribute import proxy_simple, proxy
from datetime import datetime
import time
TagName = "UL1_LOTCODE_STR_X"
host = "192.168.1.100"
portLink = "route_path = ['link':1,'port':0]"
source = proxy(host)
for message in source.read([(TagName, "SSTRING")], portLink):
val = message
timestr = str(datetime.now())
print([timestr, val])
Output (error)
UL1_LOTCODE_STR_X == None
['2018-11-08 00:05:48.424095', None]
d. Non-Working Python Logic
Note: This works if I put a tag in as the argument with is not a String
type within the PLC logic.
python -m cpppo.server.enip.client -a 192.168.1.100 "UL1_LOTCODE_STR_X"
Output (error)
Traceback (most recent call last):
File "PythonPython36-32librunpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "PythonPython36-32librunpy.py", line 85, in _run_code
exec(code, run_globals)
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1649, in <module>
sys.exit( main() )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1630, in main
fragment=fragment, printing=printing, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1406, in process
transactions = list( self.results( operations=operations, **kwds ))
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1398, in results
for idx,dsc,req,rpy,sts,val in self.operate( operations, **kwds ):
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1393, in operate
for idx,dsc,req,rpy,sts,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1283, in validate
for index,descr,request,reply,status,val in harvested:
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1258, in pipeline
col = next( harvester )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1190, in harvest
issued, self.collect( timeout=timeout )): # must be "lazy" zip!
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 1115, in collect
response,elapsed = await( self, timeout=timeout )
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 872, in await
for response in cli: # if StopIteration raised immediately, defaults to signalling completion
File "PythonPython36-32libsite-packagescppposerverenipclient.py", line 546, in __next__
for mch,sta in engine:
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1226, in delegate
for which,target in submach: # 75% of runtime is spent inside 'run'
File "PythonPython36-32libsite-packagescpppoautomata.py", line 645, in run
source=source, machine=machine, path=path, data=data, ending=ending ):
File "PythonPython36-32libsite-packagescpppoautomata.py", line 1291, in delegate
raise NonTerminal( "%s sub-machine terminated in a non-terminal state" % ( self ))
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
Other Specs
Python:3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)]
OS: Windows 10
python python-3.x
python python-3.x
edited Nov 8 at 21:53
asked Nov 8 at 5:19
Bitcoin Murderous Maniac
4731516
4731516
Let me know what I can add to help if I did something wrong please. My goal is to provide everything that's needed so please just tell me if I left something obvious or required out to make this a better question.
– Bitcoin Murderous Maniac
Nov 8 at 5:20
The error ofcpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
seems to pop up a lot so not sure if that'd be a helpful pointer for the automata.py file to see if it needs something updated to have the string type for the tag value or what.
– Bitcoin Murderous Maniac
Nov 8 at 21:58
add a comment |
Let me know what I can add to help if I did something wrong please. My goal is to provide everything that's needed so please just tell me if I left something obvious or required out to make this a better question.
– Bitcoin Murderous Maniac
Nov 8 at 5:20
The error ofcpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
seems to pop up a lot so not sure if that'd be a helpful pointer for the automata.py file to see if it needs something updated to have the string type for the tag value or what.
– Bitcoin Murderous Maniac
Nov 8 at 21:58
Let me know what I can add to help if I did something wrong please. My goal is to provide everything that's needed so please just tell me if I left something obvious or required out to make this a better question.
– Bitcoin Murderous Maniac
Nov 8 at 5:20
Let me know what I can add to help if I did something wrong please. My goal is to provide everything that's needed so please just tell me if I left something obvious or required out to make this a better question.
– Bitcoin Murderous Maniac
Nov 8 at 5:20
The error of
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
seems to pop up a lot so not sure if that'd be a helpful pointer for the automata.py file to see if it needs something updated to have the string type for the tag value or what.– Bitcoin Murderous Maniac
Nov 8 at 21:58
The error of
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
seems to pop up a lot so not sure if that'd be a helpful pointer for the automata.py file to see if it needs something updated to have the string type for the tag value or what.– Bitcoin Murderous Maniac
Nov 8 at 21:58
add a comment |
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53201953%2fpython-cpppo-wont-display-string-data-type-from-plc%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Let me know what I can add to help if I did something wrong please. My goal is to provide everything that's needed so please just tell me if I left something obvious or required out to make this a better question.
– Bitcoin Murderous Maniac
Nov 8 at 5:20
The error of
cpppo.automata.NonTerminal: ( data.( select.((noop)) ) ) sub-machine terminated in a non-terminal state
seems to pop up a lot so not sure if that'd be a helpful pointer for the automata.py file to see if it needs something updated to have the string type for the tag value or what.– Bitcoin Murderous Maniac
Nov 8 at 21:58