很久没有在CSDN上写点东西了,一方面是感觉自己实力不咋地,代码搬运工,写出来怕出丑,不过更多的原因是自己懒得写。现在想写点自己擅长的,想了好久才觉得原来这个可以写写,也算是总结下自己所会的吧。
本文从下面几个方面来介绍如何在Samlight上做简单的二次开发:
Samlight软件是什么?我想已经不需要我来再做过多的介绍了,以我浅显的理解是:德国Scaps的激光控制软件,和Samlight打标卡配套的软件,主要作用是连接Samlight打标卡,软件控制打标卡,打标卡控制激光器出光,打标,完成基本的激光打标功能。
Scaps官网是:http://www.scaps.com
中国Samlight卡代理方北京海目:http://www.hmlaser.com
北京海目提供的二次开发文档:http://www.hmlaser.com/cn/index.php/archives/tag/samlight_development
好多都是蛮实用蛮高效的例子,棒棒的,看过才知道没想到Samlight还可以这么玩。
拿到开发软件不看说明文档真的好吗?
不看说明文档,直接在百度上搜碰运气,这样的事情我没少做过,总觉得现在互联网都这么方便了,什么东西搜不到。可在搜了无数次之后才发现,自己想要用的东西怎么都搜不到。也罢,最终还是投入了官方文档的怀抱。
Samlight软件的开发文档还是很给力的,比起一些国内的设备提供的开发接口纰漏不全还算是很良心的,只不过是英文文档,大家啃一啃还是很有嚼头的。
查看Samlight帮助文档
Samlight->Help->Contents
在左侧树形结构下面找到External Control->Client Control Interface然后就是我们需要的接口说明文档
有了这个,大家就可以直接去耍了。
如果大家仔细看文档的话会发现,Samlight提供两种调用方式,一种是ActiveX控件的方式,另一种是TCP/IP的方式。根据大家的需要自己去选择使用。而文档中已经给出了哪些函数是ActiveX的方式可以调,哪些是TCP/IP可以调用的。Samlight大多数函数成功就是返回1,失败返回0。
Function:是指ActiveX调用时的函数名。
ASCII:是指TCP/IP调用时需要发送的字符串。
而下面的一段英文是该函数的功能解释,仔细读读还是可以知道这个函数是干什么用的。
ActiveX调用方式
安装了Samlight之后,会默认安装ActiveX控件,只需要导入到工程就可以了,通过ActiveX来调用即可,下面一步一步开发会介绍如何使用。
TCP/IP方式调用
原理就是Samlight软件端做服务器,我们当做客户端来连接,之后发字符串命令,接受返回值即可。初始化的时候给服务器端发送"SAM CCI Plain\n"
然后就可以正常通讯了。TCP/IP方式需要自己来写函数,需要花时间,不过写好了就比较方便了。Samlight提供了一个字符串头文件,可以引用,用的时候当做字符串格式化赋相应的值就可以了,还是比较方便的。
如果用这种方式,需要在菜单**Samlight->Setting[设置]->System[系统]->Remote[远程]**选项卡中选择TCP选项,然后设置本机IP和端口就可以了。
ScChangeTextByName
原型:long ScChangeTextByName(BSTR EntityName, BSTR Text)
解释:根据实体名EntityName
修改其内容为Text
,如果有多个同名实体,则全部修改。但好像只有两种种类型的实体可以修改内容,ScBarCode12Chars2D和ScWinTextChars2D类型的,即条码类型和文字类型的。
ScMarkEntityByName
原型:long ScMarkEntityByName(BSTR EntityName, long WaitForMarkEnd)
解释:打标函数。根据实体名EntityName
来打标,EntityName
为空时表示整个图档全部打标,WaitForMarkEnd
表示是阻塞还是非阻塞,为1时表示等到打标完成后返回,为0时表示执行打标后马上返回,不管打标是否完成。
ScLoadJob
原型:long ScLoadJob(BSTR FileName, long LoadEntities, long OverwriteEntities, long LoadMaterials)
解释:导入Samlight图档FileName
(sjf文件),后面三个参数的一般都是1。如果不想覆盖当前图档,可以将OverwriteEntities
传0。
ScSetMarkFlags
原型:long ScSetMarkFlags(long Flags)
解释:这个函数功能需要配合ScMarkEntityByName
使用,一般去掉Samlight打标时Output框,就要把Flags
赋值为4,然后调用ScMarkEntityByName
就没有讨厌的Output框了。其他的几个功能可以看文档了解下。
ScGetLongValue
原型:long ScGetLongValue(long Type)
解释:根据对于的Type
值可以获取相应的Samlight软件信息,如常用的Samlight卡信号就是用这个函数获取的。Type
为4的时候,就可以获取Samlight卡输入端的信号了。而返回的信号,需要自己解析。
我用的是VS2008,其实不管什么工具都一样,只需要导入ActiveX控件,然后通过该控件就可以操作Samlight软件了。
一、新建MFC工程,创建简单的MFC对话框程序(这很简单,就不上图了)。
二、在资源窗口空白处右击,选择Insert ActiveX Control[插入ActiveX控件]
在弹出的Insert ActiveX Control对话框中找到SCAPS.ScSamlightClientCtrl,选中后确认OK。电脑上安装了Samlight软件都可以找到这个控件的。
三、对着窗口里多出来的ActiveX控件右键选择Add Variable,在弹出的对话中给控件绑定变量就可以了。
四、工程中自动添加了scsamlightclientctrl1.h
和scsamlightclientctrl1.cpp
两个文件,我们就可以通过m_SamCtrl
变量来操作Samlight软件了。
五、如果你什么都不想设置的话,建议你在**Samlight->Setting[设置]->System[系统]->Remote[远程]**选项卡中选择功能调入的模式,直接用m_SamCtrl
调用函数就可以了。
官方调用接口VC6.0的例子,可以参考参考。
感谢你的耐心读到这里,哈哈。有机会大家一起讨论学习学习。
在Samlight的基础上开发,问题不少。有些问题感觉陷入了无限死循环中。真是可怕,这里记录下,希望有朝一日我能够通过其他渠道或者方式得到答案,以下我遇到的情况,也只是偶尔发生,但这也足够折磨我了。
- 调用ScMarkEntityByName打标,阻塞模式,打标时间过长,打标到一半的时候,函数就返回了。改成非阻塞方式,再用ScIsMarking来判断打标完成情况会好点,无法根本解决这个问题。
- ScChangeTextByName,这个函数,修改实体的速度太慢了,有大量数据,或者非常多的实体刷新内容,速度就会变得异常慢。这个函数,修改实体内容的同时,也会刷新界面导致速度慢了。后来我改成ScSetEntityStringData修改实体不刷新界面+ScExecCommand最后全部刷新。速度快了很多,但是这个不稳定,非常不稳定,时间长了,会出现发送了修改命令但实体内容没变的情况,简直是我的噩梦。
- 使用Samlight,会有很小的几率会出现漏打的情况。情况非常特殊,我遇到的情况是,Samlight自身软件打标怎么样都没有问题。使用二次开发接口调用就出现漏打的情况,最开始发现的是字体非常细小,调激光参数什么的可能会解决。如果实体对应激光笔号不一样,会出现不同的实体有的打标,有的没有打标。漏打一种激光笔号,漏字符,这些都是调用接口才会出现的,我目前无法解释也没办法解决这个问题。
支持正版!远离盗版!如果是深度二次开发,建议换其他打标卡。