调用dll库遇到,库函数init()之后没有句柄的情况(雷赛控制卡dll)
By
admin
at 2017-12-10 • 0人收藏 • 1886人看过
调用雷赛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代码是否正规。
没有N0就不对。