Control Solutions is your source for Modbus I/O and BACnet I/O.
Free Source Level
Debugging Tool
for AddMe Series
Control Solutions BACnet products include 32-point I/O

PL/i Program Simulator
and Debugger Tool

Compile programs
Step line by line
Run to break point
Run until paused
Inspect or change variables
Inspect or change registers
Inspect/change while running

Control Solutions’ i.CanDoIt® PL/i control programming language is found in both our web based products and our low cost Modbus, BACnet and LonWorks programmable I/O nodes. Program capacity varies by model based on resources occupied by other features such as protocol stack.

Once compiled and running in simulation, you upload your compiled code to the non-web device using the configuration tool applicable to that device type. Those tools are also free, and available on our Downloads page.

You simply use your browser to upload your program to any of the web based products. You can load compiled code, and also load your source code and recompile resident on the device.

About PL/i

The PL/i programming language is a descendant of PL/1 at the source code level. At the execution level, AddMe III runs on byte code similar to Java. The goal of PI/i was to create a compact compiler with a reasonably safe execution environment and a syntax with some of the power of C while being simpler than C.

The AddMe III architecture is register based. Therefore a carefully written program will be portable to systems running on Modbus, LonWorks or BACnet networks with equivalent results.

A complete summary of PL/i syntax and grammer can be found in the help pages in the device's internal web site under the Advanced->PL/i Programming tabs.

A series of tutorials on the PL/i language may be found starting here. Take a closer look at the debugger here.

Download the Simulator Here (v0.4)

Video Library (flash player required)
3-Minute Intro Video
Looking at Variables
More videos coming soon
What does PL/i look like?

Most of any given program will look a lot like Basic. Referring to subroutines as "procedures" is borrowed from older languages like Pascal. The block structure is common to many languages, and setting the blocks apart with "begin..end" instead of {} is also borrowed from Pascal. In fact, if you are a Pascal programmer, you may recognize several similarities. We hope you won't miss ":=".

The simple test program shown here will ramp an analog output on AddMe III up and down from zero to near full scale. It got named "dimmer" because if we connect an LED across the output, we have an LED dimmer. This makes a good "my first program" exercise.

program dimmer

declare
myVar: int;

procedure turnon (setting: int)
declare
level: int;
begin
level = setting * 10;
seti (19, level);
delay (5);
end;

begin
while TRUE do
begin
for myVar = 0 to 20 turnon(myVar);
for myVar = 20 down to 0 turnon(myVar);
end;
end

What's the catch?

The only catch is that we want you to use our products. The only string attached is that this tool only supports Control Solutions hardware. Some say if it's free, it can't be worth anything. That is not always the case. We licensed the same technology utilized by some very large companies, and enlisted the help of a top scholar in the German National Research Center for Information Technolgy. This is simply our unorthodox idea of how to begin a marketing campaign.