I have a question concerning the Driver Framework in FluentControl, especially the licenses.
We recently purchased a second-hand Fluent system to replace our EVO200. The EVO200 is equipped with an older Liconic LPT220 carousel that we would like to keep and, if possible (?), integrate with the Fluent.
I can see that support for the LPT220 exists in the Driver Framework. I am able to install the driver, but I then receive an error message from the License Manager stating that I do not have a valid license.
This raises a lot of questions to me. If someone could clarify the following points I would appreciate.
What exactly are these licenses?
Why are they required?
Why is owning the hardware not sufficient?
Who issues these licenses? Tecan or the apparatus manufacturer ?
What is the cost?
And finally, how can I obtain such a license?
Thank you in advance for your help.
Best regards,
P.S. just in case, we are running FC 3.2.8 with DF 3.1.20
This is one of the many reasons we as a community are pushing for open source solutions. If you had something like PyLabRobot controlling all this hardware the licenses would not be an issue. This is not unique to Tecan, and I also don’t blame them for this model. It is a difficult business and this is a way for them to continue to make revenue. It is also very much the downside of purchasing second hand instruments.
With Evoware there was a hardware dongle that contained the license system. As long as your dongle had the correct license structure, you were OK. It’s possible that there are third party vendors that have access to appropriate licenses for FluentControl, but they moved to a file-based approach, AFAIK. Hopefully some Tecan scripting experts can chime in and help you out with the correct license files.
I expected most of these answers, except perhaps the price, which seems extremely high.
From a certain perspective, I understand the need to monetize. However, it feels difficult to justify when you already own both the instrument and the hardware. Compatibility costs should perhaps be borne by the manufacturer wanting integration, but that’s a broader discussion.
Ideally, I would prefer to use an open-source approach to control everything myself. However, from what I’ve gathered, there does not seem to be anything available for Fluent.
For the more technically inclined members here, I have a question regarding the license files themselves.
The file naming format appears to follow this pattern:
When I open the file in a text editor, I essentially see the same information. There doesn’t appear to be any obvious binary content, serialization, or encryption — it looks almost empty.
Naturally, this makes me curious about how the validation mechanism actually works ?
As a smaller company, we try to optimize existing assets whenever possible. Since we already own a functional LPT220, replacing it with a new carousel would be difficult to justify.
I will add this for context. We have an Unchained Labs Stunner plate reader. Just to have a license to access the API of the software is $7k. I was not happy when I learned that you need an additional license to access the API. Even less so when I got a quote for the license.
Licenses are the equivalent of opening up “sockets” in more traditional lab automation. You can absolutely use an instrument without it but you’d have to create an API service layer or create an .exe file. There’s definitely work arounds.
With that said, driver framework just makes the actions more native to the platform. You get drop down items, you can individually test them, etc… plus you get updates and support (to an extent) plus they can do the set up for you since it’s in DF.
Tecan issues them, you can get a quote to obtain a license by simply emailing Tecan’s help desk or reach out to your sales guy.
It depends on the instrument but some are not bad in terms of cost.
You can also setup sila2 versions of drivers but I haven’t set one up yet.
Your contribution to this forum is amazing. It’s impressive how much insight you share.
I’ve given some thought to your suggestion.
Since the carousel communicates via RS232, it would indeed be quite straightforward to build a small wrapper executable and call it from a VB script inside FluentControl.
However, I have other questions following that.
If the carousel is controlled entirely outside of FluentControl (via an external executable), how do you handle labware tracking inside Fluent?
For example, if I fetch a plate from the carousel and place it at the transfer position, how do I make FluentControl aware that this specific plate is now present on the worktable?
Is there a recommended way to synchronize external device actions with Fluent’s internal labware management without using a scheduler ?
I scripted an old project using a Cytomat attached to a fluent - not sure if there’s any relation between the Cytomat and the Liconic carousels (but they look very similar. Maybe check out this link if they are the same)
Anyways, this was like 7 years ago no so hopefully my memory is right, but there is an interface in FluentControl to add a carousel to the worktable which is able to track and store plate information in what are basically arrays. You’d use an On Empty Tip or similar submethod to provide the logic to place labware from deck to transfer station, trigger the shovel to complete transfer, run the carousel loading and fetching, then transfer from transfer station back to worktable and add +1 to your labware index. It was a pretty nice setup to run asynch once it was all tested.
This was in FC 2.3 or something ancient, so interface may have changed, but it could be worth taking a look at to understand how Tecan handled the interface and possibly you could iterate from there?
This is a great thought exercise, the design & implementation really depends on your method.
Remember that you can dynamically add Labware to Fluent Control methods/scripts. You can also dynamically update positions and other details about the labware.
If you have any carousel in FC, you can populate the device at run time (akin to what Evan mentioned above - it’s just an array) and every time you move something, you can have the Fluent do it automatically (aka “smart” way) OR manually you can control positions.
(If you’ve ever used Execute Single Vector, you have to manually update the labware position.)
However since you’re going to control the driver yourself, you may not have “smart” options so I would create a subroutine that manages a) any execution and b) controls the state of the labware (handoffs and updates of positions).
Remember most liquid handlers are very stupid. You have to tell them where things are and even then, they don’t really know even when they are made aware in the software. We’re leaning into the former to exploit the latter.
Set your consumables at runtime (make it dynamic) and control execution & state through a subroutine. If you need async capabilities, add them later. Keep it simple at first.
Edit: There’s a dozen and one ways to create workflows in FC but IMO everything should be in a subroutine, all worktables should set in a dynamic way and not static, comment to the the audit trail any variables you set. Etc…
I wanted to thank you for all the help and share an update on the project.
It works!
I managed to communicate with the carousel over RS-232. That ended up being the hardest part. Even with the manual and the command list, I had to use a serial sniffer and the manufacturer’s terminal utility to capture the actual traffic on the port.
I then used an LLM to help reconstruct the exact handshake and command framing, because the commands as documented and what is truly sent on the wire were not identical.
On top of that, the port configuration was a bit unusual (even parity), which took some time to identify and of course wasn’t clearly mentioned in the manual…
In the end, I built a small C++ wrapper using Qt. The workflow is:
start the EXE to initialize the carousel
call the EXE from FluentControl via VB.NET scripts (per-command)
Example command: Lpt220Wrapper.exe --port COM9 --trace loadbc 1 10
This selects tower 1 / slot 10, scans the barcode (which is returned), and then fetches the plate to the transfer position.
In FluentControl, I defined a transfer station and use AddLabware (which I embarrassingly didn’t know about, sorry. Still got a lot to learn!), and then I can proceed with the rest of the automation script.
I ended up writing several VB.NET scripts depending on the need. For example:
a script that scans all plates in the carousel, verifies their barcodes against the expected list for an experiment, and generates a position map
a script that takes a barcode as input, looks up the plate position in the map, and fetches it
Now, I’d like to “hack” more instruments the same way. We have an old PlateLoc and I’m planning to tackle that next.
If anyone wants to see the codes, either of the C++ wrapper or the VB sripts, feel free to send me a message !