Question

Hello everybody.

First of all, I am using Delphi 7, the computer is connected to a 'Velleman part No. VM116' via a USB port and I have two DMX led lights connected to the DMX output of the controller.

I have placed the K8062d.dll library in the same folder as the executable, but I am not getting close to making the lights respond. The difficulty is that it should be as easy as pie, considering the trouble I had to get my 24 channel lighting desk to control my lights this controller should be just as easy as dropping a shape onto a form.

Anyway, here is the sample code...

unit chaser_control;

interface

type
  rgb=(
    c_red,
    c_green,
    c_blue);

  dmx_offset:array[rgb] of integer=(
    1,
    2,
    3);

  dmx_class=class(tobject)

    constructor create;
    destructor demolish;

    procedure initialise;
    procedure finish;

    procedure set_channel(
      can_dmx:integer;
      channel:rgb;
      c:integer);

  end;

var
  can:dmx_class;

implementation

// these four external procedures are all that is necessary to address and
// write to any of the 512 DMX channels in the chain

procedure StartDevice; stdcall; external 'K8062d.dll';
procedure SetData(Channel: Longint ; Data: Longint); stdcall; external 'K8062d.dll';
procedure SetChannelCount(Count: Longint); stdcall; external 'K8062d.dll';
procedure StopDevice; stdcall; external 'K8062d.dll';

  //
  // dmx control
  //

constructor dmx_class.create;
begin
  inherited;

  // the dmx controller is started once when this class is instantiated
  initialise;
end;

destructor dmx_class.demolish;
begin
  // the dmx controller is closed down when this class is destroyed
  finish;

  inherited;
end;

procedure dmx_class.initialise;
begin
  // call the device DLL
  StartDevice;

  // allocate 5 channels for led can [two channels are not used]
  SetChannelCount(5);

  // make sure that channel 1 is set to zero [i never use this channel, 
  // on the lighting desk it is set to zero]
  SetData(1,0);
end;

procedure dmx_class.finish;
begin
  // this procedure is called once

  StopDevice;
end;

  //
  // can control
  //

procedure dmx_class.set_channel(
  can_dmx:integer;
  channel:rgb;
  c:integer);
var
  l1,l2:longint;
begin
  // l1 and l2 are longint variables as the arguments passed to the 
  // DLL are longint even though the data is actually 8 bit

  l1:=can_dmx+dmx_offset[channel];
  l2:=c;
  SetData(l1,l2);
end;

begin
  // example call to change the green channel on a can with dmx address 1
  // simply assume that 'can' is not created automatically at startup
  can:=dmx_class.create;
  can.set_channel(1,c_green,240);
  // and so on
  can.free;
end.

When the green channel is set to 240, nothing happens, the lights are fine as they can be controlled from the lighting desk and like I said also by other software that I have written using MIDI show control. However the problem with show control is it is limited to 7 bits, which is why I need this new device to work.

TIA

Andrew

Was it helpful?

Solution 2

OK, I got the answer from Velleman, you also have to include both K8062e.exe and FASTTime32.dll as well as K8062D.dll in the same folder as your application. Andrew

OTHER TIPS

  1. You should use Destroy; override; instead of demolish (to be able to call can.Free).

  2. Did you try with cdecl instead of stdcall?

  3. I suspect calling dmx_class.finish = StopDevice will stop the device - so you need to wait for something to happen before quitting the application: perhaps the device is closed so quickly that you do not see it working.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top