On paper it's a one-to-one conversion. It never is.

I moved a 1990s Mitsubishi FX ladder program into ABB 800xA function blocks. It was sold as a like-for-like swap. Here is where that broke and how I actually did the job.

Published 2026-06-05 5 min read

Migrations like this get sold as one-to-one. Take the old system, do the same thing in new hardware and software, hand it back behaving exactly the same. On the cover page it reads like a copy-paste with a budget attached.

This one was an old Mitsubishi FX PLC with a ladder program from the 1990s. The job was to move it into ABB 800xA, rebuilt as a control module in Function Block Diagram. Same behavior, new platform.

Two PLCs side by side on a panel backplate: on the left an aged, yellowed 1990s brick-style controller with screw terminals under hinged covers and a round programming port, on the right a clean modern modular controller with a processor module and a row of slim I/O modules on DIN rail

“One-to-one” is a sales sentence

I don’t think anyone is lying when they call it 1:1. From the customer’s chair it’s true: same buttons, same sequence, same outputs, the line runs like it always did. That’s what they pay for. From the engineer’s chair almost nothing carries over as-is. Here’s what I ran into.

The software is older than me

The original project wouldn’t open in GX Developer. It opened in GX IEC Developer, the European IEC 61131-3 branch of Mitsubishi’s tools, which grew out of the old MEDOC software from the 1990s. The project was probably written in that line from the start.

The first surprise was the hardware configuration. It’s not a separate screen. It’s written as code into blocks in the program itself, usually at the very end so you don’t have to dig through everything to change it. I found that harder to read than anything I’ve worked with. The graphical hardware editors in newer ABB and Siemens tools are just better.

Ladder and FBD don’t think the same way

Ladder is contacts and coils, current flowing left to right, a picture of a relay panel. FBD is signals flowing through blocks. One obvious rung in ladder can turn into an awkward cluster of blocks, and something clean in FBD would be a mess of rungs going back. You get the outputs to match while the structure underneath ends up nothing like the original. To prove it behaves the same you have to understand the old program much deeper than reading it top to bottom.

The parts with no equivalent

Some of what these programs lean on has no twin in 800xA. You find each piece by reading carefully and rebuild it by hand.

The DECO block. Ladder decodes a number into one of many outputs in a single instruction. 800xA has nothing like it. I ended up with MOD and DIV to split ones and tens, and ten EQ blocks against the outputs.

Jump instructions. Conditional jumps, CJ, skip whole sections of logic.

Physical adjustments in the logic. Some timer presets were tuned on the machine through potentiometers. On the FX they land in special data registers, D8030 and D8031, and the program scales them into a preset. In the new module they become parameters.

Special auxiliary relays. M8000-series system relays shape parts of the logic. M8028 switches the timebase on a block of timers.

Octal addressing. Inputs and outputs on the FX are numbered in base 8, not base 10. Inputs X000 to X007 turned out to be wired to 20 valves, and the program reads them to decide how many valves should open. A valve count of “19” means 20, it’s zero-indexed. Getting that right took a full day of reading up on BCD, on how bits and bytes are stored in these older controllers, and on signed versus unsigned values. Before that the rungs didn’t make sense.

What didn’t work: asking AI to do the whole thing

The first thing I did when I got the job, mostly for fun, was hand the ladder program to an AI and ask it to produce a complete 800xA control module from it, laid out as an HTML document with the FBD blocks drawn out. It didn’t work. The result wasn’t correct by any measure. Worth ten minutes to know for sure: you can’t hand this kind of task to a model and expect a miracle.

What did work

I’m 21 and, as of writing this, about two years into this trade. A 1990s ladder program was completely foreign to me.

Instead of asking for a translation I exported the ladder to PDF and asked the AI to turn it into a document that explains the program part by part, step by step. Do this on a company on-prem platform and only after it’s cleared with your company and the customer. I read that document and it’s where I first learned about BCD, octal addressing and how memory is laid out on these controllers. It turned something nobody had touched in decades into something I could reason about. The AI is wrong sometimes, and guesses with confidence, sometimes a lot of confidence, so always double check anything that doesn’t quite make sense.

Then paper. I printed the whole ladder program on A3 and went through it line by line with a pencil, notes and lines connecting the dots, until I understood what happened where. That’s when it actually clicked.

Then I started writing the FBD. This part is not linear. You don’t start top left and write to the end. I’d get to a point where I didn’t know how to connect something, leave it, move on, and further down find the logic that let me go back and finish it.

When the FBD was done I printed it on A3 too, put it next to the ladder, and went through both with a green marker, highlighting every section that did the same thing logically. A simulation in my head, on paper. When everything was green I moved on.

Then a real simulation. I built a simulation control module in Control Builder M with a window where I could set every input and watch every output, and ran it on the soft controller on my laptop. I couldn’t simulate the old program. I didn’t know if GX Developer even could, and the original PLC was running a live site an hour from the office that could not be stopped for me. So the comparison stayed on paper.

Last, hardware. The new ABB cabinets arrived and it took two proper days just to get them running: a missing terminating resistor on the redundant system, firmware updates, station names, all the setup that just takes time. Once it ran I downloaded the program and could watch cycle times and memory load for real. AC 800M is a DCS controller, not a fast PLC, but this program needed to be fast, and I got the task time down to 30 milliseconds, with processor power and memory to spare.

The takeaway

One-to-one is true from the customer’s chair and fiction from the engineer’s. When a job is sold that way, go hunting early for the three places it can’t be: where the two systems think differently, the functions and blocks with no equivalent, and the hardware and signals around it.


Newsletter

New articles, courses, and news — straight to your inbox

No spam, unsubscribe in one click.