# Best Way to Develop While Disconnected from Device

**URL:** <https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759>\
**Category:** Ignition\
**Created:** [December 23, 2020, 4:21pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759 "2020-12-23T16:21:02Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![rrebro](https://avatars.discourse-cdn.com/v4/letter/r/3da27b/32.png) [@rrebro](https://forum.inductiveautomation.com/u/rrebro)\
**Post date:** [December 23, 2020, 4:21pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/1 "2020-12-23T16:21:02Z")

</div>

I am working on creating a standard for our HMIs using Ignition Vision. One of the biggest obstacles is trying to develop while away from the actual live PLC. I know there must be an easy way that I am missing.

---

<div class="post-metadata">

**Author:** ![JordanCClark](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jordancclark/32/83362_2.png) [@JordanCClark](https://forum.inductiveautomation.com/u/JordanCClark)\
**Post date:** [December 23, 2020, 4:41pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/2 "2020-12-23T16:41:27Z")

</div>

Have you looked into the simulator?

[https://docs.inductiveautomation.com/display/DOC80/Programmable+Device+Simulator](https://docs.inductiveautomation.com/display/DOC80/Programmable+Device+Simulator)

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 23, 2020, 5:12pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/3 "2020-12-23T17:12:41Z")

</div>

What driver will the real PLC use? If modern Logix, you could load a copy of the PLC code into my Ethernet/IP driver, which will simulate the tags. You could use a 2nd server with the target PLC's real IP address for even more confidence:

> [@Allen-bradely tags](http://forum.inductiveautomation.com/t/allen-bradely-tags/27815/9):
>
> Ask that customer to provide an export of that processor in “L5X” format (xml). Install my [Ethernet/IP Class 1 Communications](https://inductiveautomation.com/moduleshowcase/module/automation-professionals-llc-ethernetip-class-1-communications) module and create a virtual PLC device (Host Device) with it. Import the L5X into the “Configuration” section of that virtual PLC device. There are only a handful of datatypes that won’t import, like MESSAGE tags. Even AOI types and tags import as long as they aren’t protected. At this point, the tags and datatypes from the real PLC will be accessible as if you were …

Step by step instructions here (and read the whole topic):

> [@AB PLC tag import/export](http://forum.inductiveautomation.com/t/ab-plc-tag-import-export/33050/4):
>
> Start in your gateway’s configuration section, under the OPC Server’s “Device Connections” and click on “Create new Device…”: Select the Ethernet/IP Class1 Host Device: Give it a name and serial number… … and a slot number and listening address (required for external access) then “Create”: Then, in the list of devices, pick the new device’s “More” button, and select “Co…

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 23, 2020, 5:14pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/4 "2020-12-23T17:14:27Z")

</div>

Also, if the target PLC or device will use Modbus (TCP or RTU), you can use my beta Advanced Modbus Driver in a v7.9 server. Again, giving that server the IP address of the real PLC.

> [@Automation Professionals' Advanced Modbus Driver](http://forum.inductiveautomation.com/t/automation-professionals-advanced-modbus-driver/41312):
>
> Automation Professionals is pleased to announce the first beta for its Advanced Modbus Driver, for Ignition version 7.9. Key features: Server mode, emulating one or more slave [devices](https://www.automation-pros.com/modbus/UserManual.pdf), using any of the three typical connection types, including simultaneous connections of multiple types. Client mode, incorporating all three connection modes in one driver. Support for Modbus Function Codes 20 and 21, File Records. Configure protocol tweaks for troublesome devices per slave unit, enabling suppor…

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [December 23, 2020, 8:15pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/5 "2020-12-23T20:15:56Z")

</div>

I find it easiest just to convert the tags from OPC to memory tags. No information in the tag config is lost in doing so (all of your OPC property config remains in v8, this was not the same back in v7!! ).

~~I use the python3 script in here to do this. Note it's python3 and therefore incompatible to run inside igntion.~~ It will convert back and forth between opc and memory, and will only convert back tags that are actually opc tags, as opposed to converting _all_ memory tags to opc, which would be bad..

> [@Reading PLC tags offline](http://forum.inductiveautomation.com/t/reading-plc-tags-offline/40596/3):
>
> If I don’t have a PLC but I have the project, most of our tags are within UDTs which are already developed, so these are fairly easy to create manually or using a tool that takes in a list of instance names and parameters and creates the udt instances for me. Without a PLC, in v8, you can convert tags between opc and memory without any information being removed (this wasn’t in the case in v7). I use this script, just copied into the script console, to convert tag json copied into the clipboard…

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [December 23, 2020, 8:19pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/6 "2020-12-23T20:19:32Z")

</div>

> [@nminchin](#):
>
> I find it easiest just to convert the tags from OPC to memory tags.

Meh. Letting Ignition talk to what it thinks is a real device is way simpler, in my book.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [December 23, 2020, 8:20pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/7 "2020-12-23T20:20:58Z")

</div>

That’s assuming though that there are simulation modules for each plc type you’re reading from though, and that the plc code is actually written yet

---

<div class="post-metadata">

**Author:** ![maidamar](https://avatars.discourse-cdn.com/v4/letter/m/0ea827/32.png) [@maidamar](https://forum.inductiveautomation.com/u/maidamar)\
**Post date:** [January 26, 2021, 4:32pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/8 "2021-01-26T16:32:43Z")

</div>

@nminchin I like your approach.  
I tried your code but it did not update the UDT instances. And it makes sense, since copying the UDT instances as JSON does not recover the `opcItemPath` or `valueSource` properties.  
You mentioned it worked for instances as well. Was it a different code?

Also, it does not work if I copy a single tag, only for multiple tags, but it’s not that hard to adapt that part.

---

<div class="post-metadata">

**Author:** ![nminchin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/nminchin/32/6911_2.png) [@nminchin](https://forum.inductiveautomation.com/u/nminchin)\
**Post date:** [January 26, 2021, 8:46pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/9 "2021-01-26T20:46:34Z")

</div>

As you discovered, you need to use the script on the UDT definition itself, not the instances. If you wanted to just affect some instances, you’d need to modify the script to add the value source property in order to override the definition.  
I’ve actually rejigged thmy code a bit as I have other functions now that act in the clipboard so I wanted to make it more reusable, and I did end up fixing the single tag issue in that.

---

<div class="post-metadata">

**Author:** ![rrebro](https://avatars.discourse-cdn.com/v4/letter/r/3da27b/32.png) [@rrebro](https://forum.inductiveautomation.com/u/rrebro)\
**Post date:** [February 18, 2021, 8:56pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/10 "2021-02-18T20:56:46Z")

</div>

I’m circling back to this, I tried it out, uploaded a .L5X and it seems to work pretty well, except I can’t seem to find any tags that were aliases of another tag. Any thoughts on that?

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [February 18, 2021, 9:31pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/11 "2021-02-18T21:31:16Z")

</div>

Aliases aren’t supported. Mainly because I don’t know how to represent them when an external client connects and browses my virtual controller. It isn’t documented in Rockwell’s Data Access manual and I haven’t tried to reverse-engineer it.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [February 18, 2021, 9:52pm UTC](https://forum.inductiveautomation.com/t/best-way-to-develop-while-disconnected-from-device/41759/12 "2021-02-18T21:52:32Z")

</div>

Just took another look at the relevant AB docs.... there's a mention in the Design Considerations manual ([RM094](http://literature.rockwellautomation.com/idc/groups/literature/documents/rm/1756-rm094_-en-p.pdf)) discouraging external access to aliases, for performance reasons:

> Because an alias tag appears as a standalone tag to Linx-based software, an alias tag that references a compound array or structure can require additional communication time. When you reference tags from Linx-based software or other HMI, it can be fastest to reference base tags directly.

FWIW, I've avoided aliases in my projects for ages.
