调用dll库遇到,库函数init()之后没有句柄的情况(雷赛控制卡dll)
By
admin
at 2017-12-10 • 0人收藏 • 1943人看过
调用雷赛DMC2410C控制卡的库,主界面上
import DMC2410C;
之后,开启一个新的线程,线程里面调用控制卡库函数
thread.invoke(
function(){
//import win;
import DMC2410C;
import console;
console.log(DMC2410C.get_position(0));
//win.delay(1000)
}
)发现显示出来的一直是0, 这个显然是不对的, 把这个函数放到主界面用定时器循环获取pos,
可以取得正确的值!
后来猜测创建主线程的时候,直接传递一个Fun()函数,这个Fun()函数里面getpos()是不是行的通?
测试结果还是不行...
那么就郁闷了.
判断: 应该是主界面import 的库,和线程里面import的库是独立的,不在一个线程池里....!!
如果真是这样,那么就好操作了,只需要把他们两个联系起来?!!
怎么联系起来呢?
写入共享名称, 代码如下:
dll = ..raw.loadDll($"\res\DMC2410.dll","DMC2410Cshare");
今天才知道这个共享名称是干啥用的,⊙﹏⊙b汗!!

再次,测试线程中读取位置信息,成功!!
特此记录!
8 个回复 | 最后更新于 2018-11-09
关于圆弧插补参数的设置:
第一种方式:
声明:
arc_move= dll.api("d2410_arc_move","int(pointer axis,pointer target_pos,pointer cen_pos, WORD arc_dir)");
rel_arc_move= dll.api("d2410_rel_arc_move","int(pointer axis,pointer rel_pos,pointer rel_cen, WORD arc_dir)");调用:
var axisc = raw.buffer({ WORD b[]={1;0;}});
var tarpos = raw.buffer({ int b[]={2000; 2000;}});
var cenpos = raw.buffer({ int b[]={1000; 1000;}});
var ret = DMC2410C.rel_arc_move(axisc,tarpos,cenpos,0);第二种方式:
var axisc = raw.buffer({ WORD axis1=1;WORD axis2=0;});
var tarpos = raw.buffer({ int targetPos1=2000; int targetPos2=2000;});
var cenpos = raw.buffer({ int cenPos1=1000; int cenPos1=1000;});
var ret = DMC2410C.rel_arc_move(axisc,tarpos,cenpos,0);
库写完了,调用示例如下:
import win.ui;
/*DSG{{*/
mainForm = win.form(text="DMC2410Test";right=791;bottom=611)
mainForm.add(
NEL={cls="plus";left=144;top=155;right=173;bottom=182;forecolor=8421376;z=11};
ORG={cls="plus";left=95;top=155;right=124;bottom=182;forecolor=255;z=10};
PEL={cls="plus";left=48;top=155;right=77;bottom=182;forecolor=8421376;z=9};
axis={cls="combobox";left=49;top=42;right=145;bottom=68;edge=1;items={"0";"1";"2";"3"};mode="dropdown";z=2};
button={cls="button";text="Go_ON";left=450;top=104;right=567;bottom=130;z=14};
dir={cls="combobox";left=186;top=40;right=282;bottom=66;edge=1;items={"0";"1"};mode="dropdown";z=3};
juedui={cls="radiobutton";text="juedui";left=48;top=103;right=142;bottom=125;z=15};
juli={cls="edit";text="5";left=318;top=106;right=421;bottom=132;edge=1;z=12};
lineON={cls="button";text="Line_ON";left=450;top=40;right=567;bottom=66;z=7};
nowpos={cls="edit";text="5";left=198;top=155;right=301;bottom=181;edge=1;z=17};
speed={cls="edit";text="5";left=318;top=42;right=421;bottom=68;edge=1;z=1};
static={cls="static";text="juli";left=323;top=80;right=417;bottom=103;transparent=1;z=13};
static2={cls="static";text="axis";left=49;top=14;right=143;bottom=37;transparent=1;z=4};
static3={cls="static";text="dir";left=187;top=14;right=281;bottom=37;transparent=1;z=5};
static4={cls="static";text="speed";left=319;top=14;right=413;bottom=37;transparent=1;z=6};
stop={cls="button";text="stop";left=666;top=6;right=783;bottom=67;z=8};
xiangdui={cls="radiobutton";text="xiangdui";left=147;top=103;right=241;bottom=125;checked=1;z=16}
)
/*}}*/
import console
console.open()
import UserDmc;
var cardNum = UserDmc.init();
if(cardNum>0){
UserDmc.setPulseMode(2/* 轴0 */,2/* 轴1 */,2/* 轴2 */,2/* 轴3 */);
UserDmc.setEL(2/* 轴0 */,2/* 轴1 */,2/* 轴2 */,2/* 轴3 */);
UserDmc.setAxisUp(0/* 轴号 */,0.72/* 步距角 */,1/* 螺距(mm) */,20/* 细分 */);
UserDmc.setAxisUp(1/* 轴号 */,0.72/* 步距角 */,1/* 螺距(mm) */,20/* 细分 */);
UserDmc.setAxisUp(2/* 轴号 */,0.72/* 步距角 */,1/* 螺距(mm) */,20/* 细分 */);
UserDmc.setAxisUp(3/* 轴号 */,0.72/* 步距角 */,1/* 螺距(mm) */,20/* 细分 */);
var speedTab = UserDmc.setSpeedTab(
0/*轴号*/,
1/*起始速度(mm/s)*/,
5/*运行速度(mm/s)*/,
null/*加速时间(s 默认0.05)*/,
null/*减速时间(s 默认0.05)*/
);
thread.invoke(
function(mainForm){
import win.ui;
import UserDmc;
while(win.delay(20)){
var a,b,c = UserDmc.getELOrg(0);
mainForm.PEL.foreground= a?0xFFC7344A:0xFF008521;
mainForm.ORG.foreground= b?0xFFC7344A:0xFF008521;
mainForm.NEL.foreground= c?0xFFC7344A:0xFF008521;
mainForm.nowpos.text = UserDmc.getPos(0);
}
},mainForm
)
}
mainForm.lineON.oncommand = function(id,event){
speedTab = UserDmc.setSpeedTab(
0/*轴号*/,
1/*起始速度(mm/s)*/,
mainForm.speed.text/*运行速度(mm/s)*/,
null/*加速时间(s 默认0.05)*/,
null/*减速时间(s 默认0.05)*/
);
UserDmc.moveSV(mainForm.axis.text/*轴号*/,mainForm.dir.text/*方向:0=负向 1=正向*/,speedTab/*速度表(可为空但必须至少有一次填写)*/);
}
mainForm.stop.oncommand = function(id,event){
UserDmc.stopMove(mainForm.axis.text);
}
mainForm.button.oncommand = function(id,event){
speedTab = UserDmc.setSpeedTab(
0/*轴号*/,
1/*起始速度(mm/s)*/,
mainForm.speed.text/*运行速度(mm/s)*/,
null/*加速时间(s 默认0.05)*/,
null/*减速时间(s 默认0.05)*/
);
UserDmc.moveSP(
mainForm.axis.text/*轴号*/,
mainForm.juli.text/*距离(mm)*/,
mainForm.juedui.checked?true:null/*模式: null=相对运动 非null=绝对运动*/,
speedTab/*速度表(可为空但必须至少有一次填写)*/
);
}
mainForm.show();
return win.loopMessage();
登录后方可回帖


smc6048
检测G代码是否正规。
import console; console.open() var dll = ..raw.loadDll("\res\smc6x.dll","smc"); SMCCheckProgramSyntax = dll.api("SMCCheckProgramSyntax","int(string sin,string& err)") var str = "N0 G00" winform.button.oncommand = function(id,event){ var ret = raw.buffer(1024); console.dump( SMCCheckProgramSyntax(str,ret)) }没有N0就不对。