前言
本文章是针对金橙子激光打标机,使用C#进行二次开发分享。金橙子的打标机有两种不同的板卡,一般他们在卖打标机的时候如果不特殊说明使用的板卡是不支持二次开发的,如果想进行二次开发需要提前告诉他们购买支持二次开发的板卡,这个也是我血的教训。
此篇文章是由于我之前写的一篇博客C#二次开发金橙子MarkEzd.dll激光打标机_打标机二次开发-CSDN博客,这里面说明了开发过程中可能遇到的问题,并没有实例代码讲解,很多同学就私信我问我要源码,这里我就把源码共享出来供大家参考,因为我二次开发的功能相对简单,这里起到抛砖引玉的作用吧。
源码分析
我们购买开发板的时候,需要问他们要二次开发说明文档,他们会提供一个程序包与二次开发文档说明,如下图:
下面的这个doc文档是金橙子的二次开发指导文件
这个文档大致会给我们讲解如何进行二次开发,因为他们的打标机自带的电脑系统是window xp,我这边采用的是基于.NET 4.0 Winform框架进行开发的,下面我给大家带来我开发过程中的一些经验。
1.对MarkEzd.dll动态库进行引入
public class MarkEzdDll
{
/// <summary>
/// 初始化函数库
/// PathName 是MarkEzd.dll所在的目录
/// </summary>
[DllImport("MarkEzd", EntryPoint = "lmc1_Initial2", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int Initialize(string PathName, bool bTestMode);
/// <summary>
/// 自动弹出设备参数设置对话框,用户可以设置设备参数。
/// </summary>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_SetDevCfg", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int SetDevCfg();
/// <summary>
/// 在程序中退出时必须调用lmc1_Close来关闭lmc1控制卡
/// </summary>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_Close", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int Close();
/// <summary>
/// 在程序中一般用此函数来打开一个用户建立ezd模板文件,这样用户就不需要在程序中设置加工参数,因为模板中的加工参数会自动导入
/// </summary>
/// <param name="FileName"></param>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_LoadEzdFile", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int LoadEzdFile(string FileName);
/// <summary>
/// 保存当前数据库里所有对象到指定ezd文件里
/// </summary>
/// <param name="FileName"></param>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_SaveEntLibToFile", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int SaveEntLibToFile(string FileName);
/// <summary>
/// 在使用lmc1_LoadEzdFile载入ezd文件后即可以使用此函数开始打标加工,此函数一直等待设备加工完毕后才返回
/// </summary>
/// <param name="Fly"></param>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_Mark", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int Mark(bool Fly);
/// <summary>
/// 在使用lmc1_LoadEzdFile载入ezd文件后,在每次加工前即可以使用此函数更改指定对象的内容
/// </summary>
/// <param name="EntName"></param>
/// <param name="NewText"></param>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_ChangeTextByName", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int ChangeTextByName(string EntName, string NewText);
/// <summary>
/// 展示出来图形后删除内存对象
/// </summary>
/// <param name="hObject"></param>
/// <returns></returns>
[DllImport("gdi32.dll")]
internal static extern bool DeleteObject(IntPtr hObject);
/// <summary>
/// 得到当前数据库里的所有对象的预览图像,可以用于更新界面显示
/// </summary>
/// <param name="bmpwidth"></param>
/// <param name="bmpheight"></param>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_GetPrevBitmap2", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr GetCurPrevBitmap(int bmpwidth, int bmpheight);
/// <summary>
/// 得到当前数据库里的所有对象的预览图像,可以用于更新界面显示
/// </summary>
/// <param name="bmpwidth"></param>
/// <param name="bmpheight"></param>
/// <returns></returns>
public static Image GetCurPreviewImage(int bmpwidth, int bmpheight)
{
IntPtr pBmp = GetCurPrevBitmap(bmpwidth, bmpheight);
Image img = Image.FromHbitmap(pBmp);
MarkEzdDll.DeleteObject(pBmp);
return img;
}
/// <summary>
/// 在程序中调用lmc1_AddCurveToLib加入曲线对象到数据库中
/// </summary>
/// <param name="PtBuf"></param>
/// <param name="ptNum"></param>
/// <param name="strEntName"></param>
/// <param name="nPenNo"></param>
/// <param name="bHatch"></param>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_AddCurveToLib", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int AddCurveToLib([MarshalAs(UnmanagedType.LPArray)] double[,] PtBuf, int ptNum, string strEntName, int nPenNo, int bHatch);
/// <summary>
/// 清理对象
/// </summary>
/// <returns></returns>
[DllImport("MarkEzd", EntryPoint = "lmc1_ClearEntLib", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int ClearLibAllEntity();
}
将动态库的引入封装好,以供后续我们程序中方便的引用。
2.系统初始化
在系统初始化的时候,调用金橙子的初始化方法,实现对金橙子控制卡的初始化
/// <summary>
/// 系统初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Main_Load(object sender, EventArgs e)
{
try
{
String dir = Application.StartupPath;
int nErr = MarkEzdDll.Initialize(dir, false);
this.txt_Str.Text = ConfigurationManager.AppSettings["url"];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
this.Close();
}
}
我这里把初始化方法放在窗体的Load方法里面。
3.创建打标模板
打标模板是我们使用打标机自带的程序创建的模板,我们这里只是引入这个模板并修改模板的参数,实现对模板内容的修改以实现我们的打标内容。
/// <summary>
/// 创建二维码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Create_Click(object sender, EventArgs e)
{
if (MarkEzdDll.LoadEzdFile(Application.StartupPath + "//"+ ConfigurationManager.AppSettings["ezd"]) == 0)
{
if (MarkEzdDll.ChangeTextByName("QR", txt_Str.Text.Trim() + txt_No.Text.Trim()) != 0)
{
MessageBox.Show("二维码修改失败!");
}
if (chb_ShowID.Checked)
{
if (MarkEzdDll.ChangeTextByName("ID",txt_No.Text.Trim()) != 0)
{
MessageBox.Show("ID修改失败!");
}
}
}
else
{
MessageBox.Show("二维码模板加载失败!");
}
ShowPreviewBmp();
}
/// <summary>
/// 得到当前数据库里的所有对象的预览图像,可以用于更新界面显示
/// </summary>
public void ShowPreviewBmp()
{
int w = pic_QRCode.Size.Width;
int h = pic_QRCode.Size.Height;
if (w > h)
{
w = h;
}
else
{
h = w;
}
pic_QRCode.Image = MarkEzdDll.GetCurPreviewImage(w, h);
}
我这里的程序做了对修改后的模板内容进行预览的功能。
因为我这边的业务相对简单,就是通过扫码枪扫描条码,然后自动生成对应内容的二维码,打印到产品的外壳上,用到的方法比较少,有兴趣的同学可以将金橙子提供的方法都测试一下。
4.补充说明
因为金橙子打标机自带的系统是运行在xp系统上的,而且自带的控制电脑也是xp系统,xp系统只支持.NET4.0及其以下版本