Я не могу заставить 'Velleman Part No. VM116' говорить с моими лампами DMX - PullRequest
0 голосов
/ 20 января 2012

Привет всем.

Прежде всего, я использую Delphi 7, компьютер подключен к «Velleman Part No. VM116» через порт USB, и у меня есть два светодиодных индикатора DMX, подключенных к DMXвывод контроллера.

Я поместил библиотеку K8062d.dll в ту же папку, что и исполняемый файл, но я не подхожу к тому, чтобы заставить свет реагировать.Сложность в том, что это должно быть так же просто, как пирог, учитывая то, что мне пришлось заставить свой 24-канальный стол освещения управлять своими источниками света, этот контроллер должен быть таким же простым, как перетаскивание фигуры на форму.Вот пример кода ...

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.

Когда для зеленого канала установлено значение 240, ничего не происходит, освещение работает хорошо, так как им можно управлять со стола освещения, и, как я уже говорил, другимипрограммное обеспечение, которое я написал с использованием MIDI-шоу.Однако проблема с управлением показом состоит в том, что он ограничен 7 битами, поэтому мне нужно, чтобы это новое устройство работало.

TIA

Andrew

Ответы [ 2 ]

3 голосов
/ 20 января 2012
  1. Вы должны использовать Destroy; override; вместо demolish (чтобы иметь возможность звонить can.Free).

  2. Вы пробовали использовать cdecl вместо stdcall?

  3. Я подозреваю, что вызов dmx_class.finish = StopDevice остановит устройство - поэтому вам нужно подождать, пока что-то произойдет, прежде чем выйти из приложения: возможно, устройство закрыто так быстро, что вы его не видитеработает.

0 голосов
/ 24 февраля 2014

ОК, я получил ответ от Velleman, вы также должны включить K8062e.exe и FASTTime32.dll, а также K8062D.dll в ту же папку, что и ваше приложение.Andrew

...