我无法让“Velleman 零件编号 VM116”与我的 DMX 灯通话

Posted

技术标签:

【中文标题】我无法让“Velleman 零件编号 VM116”与我的 DMX 灯通话【英文标题】:I cannot get a 'Velleman part No. VM116' to talk to my DMX lights 【发布时间】:2012-01-20 15:04:15 【问题描述】:

大家好。

首先,我使用的是 Delphi 7,计算机通过 USB 端口连接到“Velleman part No. VM116”,并且我有两个 DMX LED 灯连接到控制器的 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

安德鲁

【问题讨论】:

灯具是否输出任何东西,或者它只是在顶端停止变亮?有些灯具不输出任何超过一定水平的东西......我这里有一个便宜的 LED 可以做 60% 以上的有趣事情 不,罐子可以工作到 255,但在这种情况下根本没有变化。这些罐子可以很好地与我的照明台配合使用,它通过 MIDI 使用 Show Control 连接到 PC,没问题。 好的,我从 Velleman 那里得到了答案,您还必须将 K8062e.exe 和 FASTTime32.dll 以及 K8062D.dll 包含在与您的应用程序相同的文件夹中。安德鲁 【参考方案1】:

    您应该使用Destroy; override; 而不是demolish(以便能够调用can.Free)。

    您是否尝试使用cdecl 而不是stdcall

    我怀疑调用 dmx_class.finish = StopDevice 会停止设备 - 因此您需要等待某些事情发生后再退出应用程序:也许设备关闭得太快以至于您看不到它工作。

【讨论】:

出于我忘记的原因,我避免重写析构函数,但将其重命名为拆除并在最后使用继承,可以。我仍然可以释放任何对象,它会被调用。我没有使用stdcall,但是在制造商给出的示例代码中,如果我使用cdecl会有什么不同?无论发生什么,无论何种类被释放,StopDevice 仍然被调用。无论如何,问题不是关闭设备,而是让它工作。【参考方案2】:

好的,我从 Velleman 那里得到了答案,您还必须将 K8062e.exe 和 FASTTime32.dll 以及 K8062D.dll 包含在与您的应用程序相同的文件夹中。安德鲁

【讨论】:

以上是关于我无法让“Velleman 零件编号 VM116”与我的 DMX 灯通话的主要内容,如果未能解决你的问题,请参考以下文章

我无法让 Netbeans C++ 工作,我做错了啥?

我无法让 Pulsar 集群正确重启

我无法让 UITableViewController 显示任何数据

我无法让 div 水平居中 [重复]

无法让 playInputClick 工作

iOS UIScrollView,我误会了啥?我无法让滚动视图滚动