I am not new to Ignition but I wanted to explain readAsync vs readBlocking to someone but I could not find any documents to compare readAsync and readBlocking or even any documents to explain each of them in a better way, not in the way currently explained. The manual needs to be updated to better show this.
For example, the picture below shows readAsync information but it says it will return “Nothing”. What does that mean?
1 Like
It means void
haha.
The idea of readAsync it to call a function after a Asynchronous read, while readBlocking return a QualifiedValue and the script actually waits a result from a tag.
2 Likes
So read has been replaced by readAsync, right? read had 3 qualified values that you could address. we can use something like the script below for readAsync, too, right?
system.tag.readAsync([tagPath],tag_value)
system.tag.readAsync([tagPath],tag_quality)
system.tag.readAsync([tagPath],tag_timestamp)
system.tag.read()
translates to system.tag.readBlocking()
. The only difference is now readBlocking()
takes a list of tag paths to read and returns a list of qualified tag values which makes the old readAll
obsolete.
1 Like
I have never used the old read like that, this was the way
qv = system.tag.read(tagPath)
value = qv.value
quality = qv.quality
timeStamp = qv.timestamp
now is better to do
qv = system.tag.readBlocking([tagPath])[0]
value = qv.value
quality =qv.quality
timeStamp = qv.timestamp
2 Likes
No, the old read()
returned a qualified value. No reason to read it 3 times.
qTag = system.tag.read('tagPath')
value = qTag.value
quality =qTag.quality
tstamp = qTag.timestamp
3 Likes
@jespinmartin1 is correct.
Consider the following script:
def my_callback(asyncReturn):
import system
values = "".join([tag.value for tag in asyncReturn])
system.util.getLogger("CALLBACK").info("Values: {0}.".format(values))
tag_paths = ["tagOne", "tagTwo"]
results = system.tag.readAsync([tagPaths], my_callback)
system.util.getLogger("MY_FUNC").info("Results: {0}.".format(results))
Note that results
will always evaluate as None
, and so the MY_FUNC logging will always display Results: .
, whereas the CALLBACK logging will actually contain relevant values. When you see something like “Returns: Nothing”, you can think of it as essentially returning None
.
2 Likes
Sorry, yes you’re right. Just correct it
2 Likes
Ew, no don't do that. That's three reads when you can do it all with one.
tag_qv = system.tag.read([tagPath])[0]
value = tag_qv.value
quality = tag_qv.quality
t_stamp = tqg_qv.timestamp
UPDATE: what @dkhayes117 said. Everyone keeps replying while I'm typing... 
3 Likes
Yes sorry haha, just realized 
Now it makes more sense to me! Thanks for the clarification.
Also why do we always use [0] at the end of readBlocking?To return the first tag in the index?
Yes, that indexing is assuming you just want the singular (first) tag, as if you had supplied a tagPaths list which contained only one entry:
my_tag_value = system.tag.readblocking(["singleTag"])[0].value
1 Like
That’s for the case where you’re reading just one tag.
If you’re reading several tags (readBlocking([tag1, tag2, tag3...])
) you’ll probably want to loop over the returned list:
tags = system.tag.readBlocking(paths)
for tag in tags:
if tag.quality == "Good":
print tag.value
1 Like