SECS/GEM通信

以下只列出主要代码

1.将Secs.dll、secs.h、Secs.lib导入工程中

2.定义服务器和客户端的对象句柄、相关结构体

HSECS secs_Client;
HSECS secs_Server;

SECS_CFG settings;

3.启动服务器(或开启客户端)

        memset(&settings,0,sizeof(settings));
        settings.t3 = 3000; // 45000;
	settings.t5 = 10000;
	settings.t6 = 5000;
	settings.t7 = 10000;
	settings.t8 = 5000;

	settings.pfn_on_connect = OnConnect;
	settings.pfn_on_recv_message = OnRecvMessage;
	settings.pfn_on_close = OnClose;

	settings.device_id = 0;
	settings.mode = HSMS_PASSIVE;
	settings.local_ip = inet_addr("127.0.0.1"); 
	settings.local_port = 5000;
	settings.remote_ip = inet_addr("127.0.0.1")
	settings.remote_port = 5000;

	secs_Server = CreateSecs(&settings);
	if (secs_Server == NULL) 
	{
		return FALSE;
	}
	else
	{
		if(settings.mode = HSMS_PASSIVE)
		{
			BOOL bStartServerOK = FALSE;
			bStartServerOK = SecsStartupServer(secs_Server);
			if (!bStartServerOK)
			{
				DestroySecs(secs_Server);
				return FALSE;
			}
		}
		else
		{
			BOOL bStartServerOK = FALSE;
			bStartServerOK =SecsConnect(secs_Server);
			if(!bStartServerOK)
			{	
				DestroySecs(secs_Server);
				return FALSE;
				}
		}
	}

4.三个响应消息(链接、数据接收、断开链接)
BOOL WINAPI OnConnect(HSECS hServer,HSECS hSecs,USHORT usDevId)
{
	secs_Client = hSecs;
	return TRUE;
}
DWORD WINAPI OnRecvMessage(HSECS session_handle, unsigned long id,unsigned char stream,unsigned char function,SECS_ITEM* ptr_item)
{
	unsigned long proc_result = do_process_msg(id, stream, function, ptr_item);
	return proc_result;
}

VOID WINAPI OnClose(HSECS hSecs)
{
	secs_Client = NULL;
}
5.消息处理

unsigned long do_process_msg( DWORD msgid, UCHAR stream,UCHAR function,SECS_ITEM* ptr_item)
{
	// normal process
	int ret_code = SECS_SYS_SUCCESS;
	switch (stream)
	{
	case 1: // ========= S1
		switch (function)
		{
		case 1:  ret_code = on_s1_f1(ptr_item, msgid);	break;	// S1,F1
		default: ret_code = SECS_SYS_ERROR_UFN;		    break;
		}
		break;

	case 2: // ========= S2
		switch(function)
		{
			// 		case 33: ret_code = on_s2_f33(ptr_item, msgid);	break;	// S2,F33
			// 		case 35: ret_code = on_s2_f35(ptr_item, msgid);	break;	// S2,F35
			// 		case 37: ret_code = on_s2_f37(ptr_item, msgid);	break;	// S2,F37
		case 41: ret_code = on_s2_f41(ptr_item, msgid);	break;	// S2,F41
		default: ret_code = SECS_SYS_ERROR_UFN;         break;
		}
		break;

	default:
		ret_code = SECS_SYS_ERROR_USN;
		break;
	}

	return ret_code;
}
int on_s1_f1(SECS_ITEM* ptr_item, DWORD msgid)
{
	// reply S1,F2
	SECS_ITEM* item_s1f2 = SecsCreateItemList(2);
	SECS_ITEM* item_mdln = SecsCreateItemAscii(EQ_MDLN);
	SECS_ITEM* item_softrev = SecsCreateItemAscii(EQ_SOFTREV);
	SecsListItemAppend(item_s1f2, item_mdln);
	SecsListItemAppend(item_s1f2, item_softrev);
	::SecsReplyMessageItem(g_secs_Client,1, 2,item_s1f2, 0, msgid);
	SecsDeleteItem(item_s1f2);
	return SECS_SYS_SUCCESS;
}
int on_s2_f41(SECS_ITEM* ptr_item, DWORD msgid)
{
	// reply S1,F2
	SECS_ITEM* item_s1f2 = SecsCreateItemList(2);
	SECS_ITEM* item_mdln = SecsCreateItemAscii(EQ_MDLN);
	SECS_ITEM* item_softrev = SecsCreateItemAscii(EQ_SOFTREV);
	SecsListItemAppend(item_s1f2, item_mdln);
	SecsListItemAppend(item_s1f2, item_softrev);
	::SecsReplyMessageItem(g_secs_Client,1, 2,item_s1f2, 0, msgid);
	SecsDeleteItem(item_s1f2);
	return SECS_SYS_SUCCESS;
}
6.发送消息
SECS_ITEM* ptr_item_First = SecsCreateItemList(2);
	SECS_ITEM* ptr_item_First_1 = SecsCreateItemList(1);
	SECS_ITEM* ptr_item_First_1_1 = SecsCreateItemList(2);
	SECS_ITEM* ptr_item_First_1_1_1 = SecsCreateItemAscii("BIBStrip_1234567890");
	SECS_ITEM* ptr_item_First_1_1_2 = SecsCreateItemList(1);
	SECS_ITEM* ptr_item_First_1_1_2_1 = SecsCreateItemList(2);
	SECS_ITEM* ptr_item_First_1_1_2_1_1 = SecsCreateItemAscii("MapData");
	SECS_ITEM* ptr_item_First_1_1_2_1_2 = SecsCreateItemAscii("");
	SECS_ITEM* ptr_item_First_2 = SecsCreateItemList(2);
	SECS_ITEM* ptr_item_First_2_1 = SecsCreateItemU1(0);
	SECS_ITEM* ptr_item_First_2_2 = SecsCreateItemList(0);

	SecsListItemAppend(ptr_item_First,ptr_item_First_1);

	SecsListItemAppend(ptr_item_First_1,ptr_item_First_1_1);
	SecsListItemAppend(ptr_item_First_1_1,ptr_item_First_1_1_1);

	SecsListItemAppend(ptr_item_First_1_1,ptr_item_First_1_1_2);

	SecsListItemAppend(ptr_item_First_1_1_2,ptr_item_First_1_1_2_1);

	SecsListItemAppend(ptr_item_First_1_1_2_1,ptr_item_First_1_1_2_1_1);
	SecsListItemAppend(ptr_item_First_1_1_2_1,ptr_item_First_1_1_2_1_2);

	SecsListItemAppend(ptr_item_First,ptr_item_First_2);
	SecsListItemAppend(ptr_item_First_2,ptr_item_First_2_1);
	SecsListItemAppend(ptr_item_First_2,ptr_item_First_2_2);

	unsigned long msg_id = SecsSendMessageItem(g_secs_Client, 14, 1, ptr_item_First, SECS_FLAGS_NEED_REPLY);//发送消息主要函数
所发消息如下图

7.断开链接

if(settings.mode = HSMS_PASSIVE)
	{
	   SecsCloseServer(g_secs_Server);
	   DestroySecs(g_secs_Server);
	   g_secs_Server = NULL;
	}
	else
	{
	  SecsDisconnect(g_secs_Server);
	  DestroySecs(g_secs_Server);
	  g_secs_Server = NULL;
	}

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Python SECS/GEM是一种用Python编程语言实现的SECS/GEM通信协议。SECS/GEM(Semi Equipment Communications Standard/General Equipment Model)是半导体设备与工厂主机之间进行通信的标准协议。 Python SECS/GEM提供了一套方便的API和工具,使开发人员能够轻松地在Python中实现SECS/GEM通信功能。使用Python SECS/GEM,可以方便地与半导体设备进行通信,发送和接收SECS消息。开发人员可以使用Python SECS/GEM来编写工厂主机程序,实现与设备之间的数据交换和控制。 Python SECS/GEM具有以下优点: 1. 简单易用:Python是一种简洁而易于理解的编程语言,使用Python SECS/GEM可以简化通信协议的开发和实现过程。 2. 强大的功能:Python拥有强大的标准库和第三方库支持,可以轻松地扩展和定制SECS/GEM协议的功能。 3. 跨平台性:Python是一种跨平台的编程语言,可以在多个操作系统上运行,方便开发人员在不同的环境中使用Python SECS/GEM。 4. 社区支持:Python拥有庞大的开发者社区,提供了大量的文档、教程和示例代码,开发人员可以从中获取帮助和支持。 Python SECS/GEM在半导体制造行业中得到了广泛的应用,对于提高工厂主机与设备之间的通信效率和稳定性具有重要意义。通过使用Python SECS/GEM,开发人员可以更加容易地实现设备的数据采集、监控和控制,并实现工厂自动化的目标。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值