介绍
优微视视觉传感器,可以使用javascript作为脚本语言,对传感器进行控制。除了javascript的基本函数外。还提供了针对传感器的控制函数。
本教程详细介绍了这些控制函数。方便使用优微视视觉传感器的用户进行高级编程。
基本模块
模块变量: _applet
main
传感器被触发的时候运行的主函数。
如果在脚本中没有定义main函数,而且也没有用_applet.main()来指定主函数,传感器会顺序运行计算任务。
如果有定义main函数,则优先执行定义的主函数。
_applet.main(func)
func:处理函数
返回值:运行成功返回0,失败返回-1
/* 显式定义主函数*/
main(){
/* do some thing here. */
}
/* 隐式定义主函数*/
function dotask(){
/* do some thing here. */
}
_applet.main(dotask);
once
单次运行的函数。和main不同的地方,被此函数调用的函数只运行一次。
_applet.once(func)
func:处理函数
返回值:运行成功返回0,失败返回-1
/* 隐式定义主函数*/
function dotask(){
/* do some thing here. */
}
_applet.once(dotask);
create
创建计算任务函数
_applet.create(task_class_name,task_name)
task_class_name:计算任务类名,如locate_circle,locate_blobs,find_line,find_circle
task_name:计算任务名,如locate_circle_1,locate_blobs_1,find_line_1,find_circle_2
返回值:创建成功返回 0;创建失败返回:-1
var ret = _applet.create('locate_circle','locate_circle_1');
assert(ret == 0);
destory
删除计算任务函数
_applet.destory(task_name)
task_name:计算任务名,如locate_circle_1
返回值:创建成功返回 0;创建失败返回:-1
var ret = _applet.destory('locate_circle_1');
assert(ret == 0);
order
计算任务执行顺序调整函数
_applet.order(task_name,id)
task_name:计算任务名,如locate_circle_1
id:调整到的位置
返回值:创建成功返回 0;创建失败返回:-1
var ret = _applet.order('locate_circle_1',3);
assert(ret == 0);
sync
同步计算任务结果函数,将参数保存到运行环境
_applet.sync(task_name)
task_name:计算任务名,如locate_circle_1
返回值:创建成功返回 0;创建失败返回:-1
var ret = _applet.sync('locate_circle_1');
assert(ret == 0);
set
设置计算任务参数任务
_applet.set(name,value)
name: 参数名称
value:参数值
返回值:运行成功返回0;运行失败返回 -1;
ret = _applet.set('locate_circle_1.pass',1);
assert(ret == 1);
get
设置计算任务参数任务
_applet.get(name)
name: 参数名称
返回值:运行成功返回 对应值;运行失败返回 -1;
ret = _applet.get('locate_circle_1.pass');
assert(ret == 1);
任务模块
使用传感器的编程IDE添加运算任务后,(默认添加acquire_image),如增加圆定位计算任务,locate_circle_1,在javascript运行环境中会自动添加全局变量 var locate_circle_1。
locate_circle_1的属性中包含三个成员函数:parse() 用来对参数进行分析; restore() 用来对参数进行保存;run() 用来运行运算函数
parse
分析运算参数
parse(options)
options:运行任务的配置参数。 返回值:运行成功返回0;运行失败返回 -1;
var param = {pass:0,pass_count:1,fail:0,fail_count:1,Enable:1};
locate_circle_1.parse(param);
restore
保存计算参数
restore()
返回值:运行成功返回0;运行失败返回 -1;
locate_circle_1.restore();
run
运行计算任务
run()
返回值:运行成功返回0;运行失败返回 -1;
locate_circle_1.run();
sync
同步计算任务结果函数,将参数保存到运行环境
sync()
返回值:创建成功返回 0;创建失败返回:-1
var ret = locate_circle_1.sync();
assert(ret == 0);
网络模块
模块变量 _http
get
设置get接口
_http.get(url,func)
url:接口名称
func:响应函数
function motor_get(opt){
/* opt get parameter.
* http://ip/usr/motor?x=1.0&y=2.0&z=3.0
* opt = {
* x:1.0,
* y:2.0,
* z:3.0
* }
*/
/* do some thing here. */
}
ret = _http.get('/usr/motor',motor_get);
assert(ret == 1);
post
设置post接口
_http.post(url,func)
url:接口名称
func:响应函数
function motor_port(){
/* opt: post message as json.
* sendRequeset(JSON.stringify({x:1.0,y:2.0,z:3.0}));
* opt = {
* x:1.0,
* y:2.0,
* z:3.0
* }
*/
/* do some thing here. */
}
ret = _http.post('/usr/motor',motor_post);
assert(ret == 1);
put
设置put接口
_http.put(url,func)
url:接口名称
func:响应函数
function motor_put(opt){
/* do some thing here. */
}
ret = _http.post('/usr/motor',motor_put);
assert(ret == 1);
del
设置del接口
_http.del(url,func)
url:接口名称
func:响应函数
ret = _http.post('/usr/motor',function(opt){
/* do some thing here. */
});
assert(ret == 1);
response
请求返回函数
_http.response(message)
message:返回的消息
ret = _http.response('ok');
assert(ret == 1);
broadcast
广播函数
_http.broadcast(message)
message:广播的消息
ret = _http.broadcast('proccess ok');
assert(ret == 1);
图像模块
模块变量:_image
load
读取图像,支持图像类型JPEG(.jpg),BMP(.bmp),YUV(.yuv),load函数通过 文件扩展名判断图像的类型,yuv图像,通过widthXheight_formt的形式判断图像的宽度高度和类型。
load(path)
path:图像路径和名称
返回值:成功返回0;失败返回 -1
_image.load('./test.jpg');
save
保存图像,将当前正在处理的图像保存,支持图像类型JPEG(.jpg),BMP(.bmp),YUV(.yuv),load函数通过 文件扩展名判断图像的类型,yuv图像,通过widthXheight_formt的形式判断图像的宽度高度和类型。
save(path)
path:图像路径和名称
返回值:成功返回0;失败返回 -1
_image.load('./test.jpg');
capture
从传感器实时图像中抓取一帧图像,图像的宽度和高度,由传感器决定。
capture()
返回值:成功返回0;失败返回-1
_image.capture();
rotate
图像旋转
rotate(x,y,angle)
x:旋转中心x坐标
y:旋转中心y坐标
angle:旋转角度
返回值:成功返回0;失败返回-1
_image.rotate(100,100,30);
串口模块
模块变量 _serial
open
打开串口函数
_serial.open(options)
options:串口参数,buad rate,priaty,data bit,stop bit
var serial2 = _serial.open({speed:115200,priaty:0,data_bit:8,stop_bit:0});
read
读串口函数
read(count,timeout)
count:读取数量
timeout:读取超时时间,以毫秒为单位
返回值:读取的数据,类型为字符串或数组
var ret = serial2.read(10,1000);
print(ret);
write
读串口函数
write(buffer,count)
buffer:写内容
count:写取数量
返回值:写入的字节数
var ret = serial2.write('test',4);
assert(ret == 4);
close
关闭串口函数
close()
返回值:关闭成功返回0;失败返回-1
var ret = serial2.close();
assert(ret == 1);
Modbus模块
模块变量:_modbus
open
打开函数
open(mode,options);
mode:模式,‘rtu‘,’tcp‘
options:参数,如果式rtu模式则为串口参数{baud,praity,data_bit,stop_bit} 如果式tcp模式则是网口参数{ip,port}
返回值:成功返回modbus对象,失败返回-1
var md = _modbus.open('rtu',{buad:115200,praity:0,data_bit:8,stop_bit:0});
var md = _modbus.open('tcp',{ip:'192.168.0.38':8080});
check
检查函数,检查modbus是否已经打开,如果没有打开则打开,如果已经打开,检查参数是否相同,如果不相同,则关闭原来的句柄,并用新参数打开
check(mode,options)
mode:模式,‘rtu‘,’tcp‘
options:参数,如果式rtu模式则为串口参数{baud,praity,data_bit,stop_bit} 如果式tcp模式则是网口参数{ip,port}
返回值:成功返回0,失败返回-1
var md = _modbus.check('rtu',{buad:115200,praity:0,data_bit:8,stop_bit:0});
var md = _modbus.check('tcp',{ip:'192.168.0.38':8080});
slave
设置slave的id
slave(id)
id:slave的id
返回值:成功返回0;错误返回-1
var ret = md.slave(1);
assert(ret == 1);
read_bits
读取触点函数
read_bits(address,count)
address:触点地址
count:触点个数
返回值:触点值BOOL型,错误返回-1
var val = md.read_bits(10,1);
read_inputbits
读取输入寄存器函数
read_inputbits(address,count)
address:触点地址
count:触点个数
返回值:触点值BOOL型,错误返回-1
var val = md.read_inputbits(10,1);
read_registers
读取寄存器函数
read_registers(address,count)
address:地址
count:数量
返回值:寄存器值,错误返回-1
var val = md.read_registers(10,1);
read_inputregisters
读取输入寄存器函数
read_inputregisters(address,count)
address:地址
count:数量
返回值:寄存器值,错误返回-1
var ret = md.read_inputregisters(10,1);
assert(ret == 1);
write_bit
写触点
write_bit(address,value)
address:触点地址
value:触点值
返回值:写成功返回0,错误返回-1
var ret = md.write_bit(10,1);
assert(ret == 1);
write_bits
写多个触点
write_bits(address,value)
address:触点地址
value:触点值,类型为数组
返回值:写成功返回0,错误返回-1
var ret = md.write_bits(10,[1,0]);
assert(ret == 1);
write_register
写寄存器
write_register(address,value)
address:地址
value:寄存器值
返回值:写成功返回0,错误返回-1
var ret = md.write_register(10,10]);
assert(ret == 1);
write_registers
写多个寄存器
write_registers(address,value)
address:地址
value:寄存器值,类型数组
返回值:写成功返回0,错误返回-1
var ret = md.write_registers(10,[10,20]);
assert(ret == 1);
send_string
发送文本信息函数
send_string(message)
message:待发送信息
返回值:发送成功返回0,错误返回-1
var ret = md.send_string('test');
assert(ret == 1);
close
关闭函数
close()
返回值:成功返回0,错误返回-1
var ret = md.close();
assert(ret == 1);
Plc模块
模块变量:_plc
PLC相关函数支持的PLC类型有 西门子,松下,欧姆龙和霍尼韦尔
相关的PLC的地址命名如下
西门子PLC的寄存器地址
-
DBBxx、DBWxx、DBDxx(DIBxx+、DIWxx、DIDxxx 字节,字,双字
-
DBX+.+(或DIXx.x) 二进制地址
-
DB 数据块
-
M 内部标志存储区
-
I 输入输出映像寄存器
-
Q 输出继电器
松下PLC寄存器地址
-
X Y 外部输入输出继电器
-
WX WY 外部输入输出继电器字
-
R 内部继电器
-
DT 数据寄存器
欧姆龙PLC地址
-
输入输出寄存器
-
IR 内部辅助继电器
-
SR 特殊继电器
-
HR 保持继电器
-
TR 暂存继电器
open
打开plc函数
open(name,options)
name:PLC名,目前支持siemens, panasonic,omron,ab
options:打开参数,如果是串口类型的,如panasonic,则是串口参数 {baud,praity,data_bit,stop_bit} 如果是tcp或udp类型的则是网络参数 {ip,port}
var plc0 = _plc.open('panasonic',{buad:115200,priaty:0,data_bit:8,stop_bit:0});
read_bit
读取触点函数
read_bit(address)
adress:地址
返回值:触点值,类型微BOOL,失败返回-1
var ret = plc0.read_bit('X10');
read_byte
按字节读取寄存器函数
read_byte(address)
address:地址
返回值:成功则返回寄存器值;失败返回-1
var val = plc0.read_byte('DT10');
read_bytes
按字节读取寄存器函数
read_bytes(address,count)
address:起始地址
count:数量
返回值:成功返回寄存器值,类型为数组;失败返回-1
var val = plc0.read_bytes('DT10',2);
read_u16
按16bit无符号数读取寄存器
read_u16(address)
address:地址
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.read_u16('DT10');
read_s16
按16bit有符号数读取寄存器
read_s16(address)
address:地址
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.read_s16('DT10');
read_u32
按32bit无符号数读取寄存器
read_u32(address)
address:地址
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.read_u32('DT10');
read_s32
按32bit有符号数读取寄存器函数
read_s32(address)
address:地址
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.read_u32('DT10');
read_float
按浮点数读取寄存器
read_float(address)
address:地址
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.read_float('DT10');
read_string
读取字符串函数
read_string(address,length)
address:地址
length:读取字符串长度
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.read_string('DT10');
write_bit
写触点函数
write_bit(address,value)
address:地址
value:写入值
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_bit('X10',1);
write_byte
按字节写寄存器函数
write_byte(address,value)
address:地址
value:写入值
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_byte('DT10',1);
write_bytes
按字节写寄存器函数
write_bytes(address,value,length)
address:地址
value:写入值,类型为数组
length:数据长度,此参数可选
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_byte('DT10',[1,2],2);
write_u16
按16bit无符号数写寄存器
write_u16(address,value)
address:地址
value:写入值
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_u16('DT10',1);
write_s16
按16bit有符号数写寄存器
write_s16(address,value)
address:地址
value:写入值
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_s16('DT10',1);
write_u32
按32bit无符号数写寄存器
write_u32(address,value)
address:地址
value:写入值
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_u32('DT10',1);
write_s32
按32bit有符号数写寄存器
write_s32(address,value)
address:地址
value:写入值
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_s32('DT10',1);
wriet_float
按浮点数写寄存器
write_float(address,value)
address:地址
value:写入值
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_float('DT10',1);
write_string
写字符串函数
write_string(address,value,length)
address:地址
value:写入值
lenght:字符串长度,此参数可选
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.write_string('DT10','test');
close
关闭函数
close()
返回值:成功则返回寄存器值,失败返回-1
var val = plc0.close();
光源控制模块
模块变量:_light
on
开关控制函数
_light.on(val)
val:光源开关标志 打开1;关闭0
返回值:成功返回0,失败返回-1
var ret = _light.on(0); /* 关闭光源 */
var ret = _light.on(1); /* 打开光源 */
flash
频闪控制函数
_light.flash(val)
val:光源开关标志 打开1;关闭0
返回值:成功返回0,失败返回-1
var ret = _light.flash(0); /* 关闭光源 */
var ret = _light.flash(1); /* 打开光源 */
bright
亮度控制函数
_light.bright(val)
val:光源亮度值,最小0,最大1.0
返回值:成功返回0,失败返回-1
var ret = _light.bright(0.2); /* 光源亮度20% */
mode
模式控制函数
_light.mode(val)
val:模式值,常开0,频闪1
返回值:成功返回0,失败返回-1
var ret = _light.mode(0); /* 常开模式 */
IO控制模块
模块变量:_gpio
open
打开IO函数
_gpio.open(id)
id:IO参数
var gpio2 = _gpio.open(0);
read
读IO函数
read()
返回值:读取的数据,类型为bool类型
var ret = gpio2.read();
print(ret);
write
读IO函数
write(id,value)
id:IO的id
value:值
返回值:写入成功返回0,失败返回-1
var ret = gpio2.write(0,1);
assert(ret == 0);
关闭IO函数
close()
返回值:关闭成功返回0;失败返回-1
var ret = gpio2.close();
assert(ret == 1);
TCP模块
模块变量:_tcp
open
打开TCP函数
_tcp.open(ip,port)
ip:IP参数
port:端口
返回值:tcp对象
var tcp1 = _tcp.open('192.168.0.38',8080);
read
读TCP函数
read(count,timeout)
count:读取数量
timeout:读取超时时间,以毫秒为单位
返回值:读取的数据,类型为字符串或数组
var ret = tcp1.read(10,1000);
print(ret);
write
读TCP函数
write(buffer,count)
buffer:写内容
count:写取数量
返回值:写入的字节数
var ret = tcp1.write('test',4);
assert(ret == 4);
close
关闭TCP函数
close()
返回值:关闭成功返回0;失败返回-1
var ret = tcp1.close();
assert(ret == 1);
UDP模块
模块变量:_udp
open
打开UDP函数
_gpio.open(id)
ip:IP参数
port:端口
返回值:udp对象
var udp1 = _udp.open('192.168.0.38',8080);
read
读UDP函数
read(count,timeout)
count:读取数量
timeout:读取超时时间,以毫秒为单位
返回值:读取的数据,类型为字符串或数组
var ret = udp1.read(10,1000);
print(ret);
write
读UDP函数
write(buffer,count)
buffer:写内容
count:写取数量
返回值:写入的字节数
var ret = udp1.write('data',4);
assert(ret == 4);
close
关闭UDP函数
close()
返回值:关闭成功返回0;失败返回-1
var ret = udp1.close();
assert(ret == 1);
标定模块
模块变量:_calib
nine
九点标定
nine(from,to)
from:mark点
to:参考点
返回值:标定成功返回标定参数coeffs,标定失败返回-1
var from = [
{x:0, y:0},
{x:1, y:1},
{x:2, y:2},
{x:3, y:3},
{x:4, y:4},
{x:5, y:5},
{x:6, y:6},
{x:7, y:7},
{x:8, y:8}
];
var to = [
{x:0, y:10},
{x:1, y:11},
{x:2, y:12},
{x:3, y:13},
{x:4, y:14},
{x:5, y:15},
{x:6, y:16},
{x:7, y:17},
{x:8, y:18}
];
var coeffs = _calib.nine(from,to);
two
两点标定
two(from,to)
from:mark点
to:参考点
返回值:标定成功返回标定参数coeffs,标定失败返回-1
var from = [ {x:0, y:0},
{x:1, y:1} ];
var to = [ {x:0, y:10},
{x:1, y:11} ];
var coeffs = _calib.two(from,to);
coeffs
标定参数设置
coeffs(coeffs)
coeffs:标定参数,大于9个数值的数组
返回值:标定成功返回0,标定失败返回-1
var coeffs = [1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0];
var ret = _calib.coeffs(coeffs);
correct
校正函数
correct(points,coeffs)
points:需要矫正的点
coeffs:矫正参数
返回值:矫正成功返回矫正后的点信息,失败返回-1
var to = [ {x:0, y:10},
{x:1, y:11},
{x:2, y:12},
{x:3, y:13},
{x:4, y:14},
{x:5, y:15},
{x:6, y:16},
{x:7, y:17},
{x:8, y:18} ];
var coeffs = [1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0];
var results = _calib.correct(points,coeffs);