创作背景:突然想起来去年做了一个关于调用基恩士打标机的项目,据我的了解,大多数客户与基恩士设备的通讯都是TCP/IP模式,但是我们这个项目的甲方特意要求使用串口模式进行通讯,二者的指令都是一样的。下面将这个项目的关键处理点分享给大家。
想要精准控制一个设备,我们首先要了解设备的工作原理,以及控制顺序等信息。这里原理就不做过多介绍(因为我也不懂😂),先给朋友们分享一下我所了解的打标机的指令:
1、设备准备指令:RX,Ready
2、开始打标指令:WX,StartMarking
3、修改参数指令:WX,JOB={0},BLK={1},CharacterString={2}
4、变更任务号指令:WX,JobNo={0}
5、查询任务号指令:RX,JobNo
我把串口通讯需要调用的指令封装在一个类中,方便使用。这里踩过一个雷,就是没有增加通用的尾部标识,导致打标机每次都仅执行我程序启动后的第一个指令,后来发现,需要给尾部增加固定的标识。
/// <summary>
/// 打标指令类
/// </summary>
public static class MarkingInstruct
{
/// <summary>
/// 通用尾部标识
/// </summary>
private static readonly string strTailMark = "\r\n";
/// <summary>
/// 仪器准备
/// </summary>
public static readonly string StrReady = "RX,Ready" + strTailMark;
/// <summary>
/// 开始打标
/// </summary>
public static readonly string StrStartMarking = "WX,StartMarking" + strTailMark;
/// <summary>
/// 修改参数值,{0}程序号,{1}参数号,{2}参数值
/// </summary>
public static readonly string StrCharacterString = "WX,JOB={0},BLK={1},CharacterString={2}" + strTailMark;
/// <summary>
/// 变更运行中的任务编号。{0}即将执行的任务编号
/// </summary>
public static readonly string StrWriteJobNo = "WX,JobNo={0}" + strTailMark;
/// <summary>
/// 查询运行中的任务编号
/// </summary>
public static readonly string StrReadJobNo = "RX,JobNo" + strTailMark;
}
正常打开串口进行指令的发送和消息的接收即可。因为功能以及屏蔽,所以我提供的代码是注释掉了的。代码如下:
/// <summary>
/// 打标串口
/// </summary>
//public Serial serial = new Serial("COM1", 9600, Parity.None, 8, StopBits.One);
打开串口
//serial.Open();
建立接收事件
//serial.Thread_ReadMsg += new Serial.OnReadRS232Data(this.ReceivedSerial);
开始接收
//serial.StartReadMsg(15);
/// <summary>
/// 接收打标数据
/// </summary>
/// <param name="buff">接收的数组</param>
private void ReceivedSerial(byte[] buff)
{
try
{
iRisingEdge = 1;
strMarkReciveMsg = Encoding.Default.GetString(buff, 0, buff.Length);
ListStationChanged("", "接收", strMarkReciveMsg, 3);
}
catch
{
}
}
/// <summary>
/// 打标通用发送指令方法
/// </summary>
/// <param name="strInstruct">指令</param>
/// <param name="strCheck">校验字符</param>
/// <param name="strErrorMsg">错误提示信息</param>
/// <returns></returns>
//private void MarkCommonSendMsg(string strInstruct, string strCheck, string strErrorMsg)
//{
// iRisingEdge = 0;
// serial.SendMsg(strInstruct);
// ListStationChanged("", "发送", strInstruct.TrimEnd(' ').TrimEnd('\n').TrimEnd('\r'), 3);
// Thread.Sleep(50);
//}
有些方法和属性是我项目中使用的,可以酌情删除。本次就分享到这里,欢迎各路英雄好汉给出建议。