SECS/GEM开发:软件使用流程,支持VC6

本文档详细介绍了基于SECS通讯规范的Demo程序操作流程,包括软件清单、运行环境要求、设备端配置、软件特点及交互流程。主要内容涉及DLL元件、Transaction通讯、多线程处理、VC++和C#的支持,以及SDK初始化和设备间交互的代码示例。此外,还展示了C++对话框类CVariableView的交互细节,如设置和刷新变量值的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1简介
该手册讲述
Demo 程序操作流程
官网 www.secsgem.cn

2软件
2.1软件清单
软件清单如下图
在这里插入图片描述
支持VC6
在这里插入图片描述

2.2
运行环境
硬件要求
CPU:双核2GHz及以上
内存:4GB及以上
系统:Window XP、Window 7、Window 10、Window Server 2008、WindowServer2012、WindowServer 2016

3.1设备端
1 将设备端运行起来
在这里插入图片描述
导入金南瓜科技接口

  1. 软件特点:

  2. 符合SEMI E5、E30、E37 的 SECS 通讯规范

  3. 提供高速 Transaction 的通讯能力,高性能多线程并发处理Transaction

  4. 提供 DLL 元件供程式设计者使用

  5. 快速 Encode 与 Decode Big Message

  6. 提供VC++、C#等程式语言,提供程式的.Sample Code让程式设计师参考

  7. 开发使用
    2.1 添加模块
    将项目中secs文件拷贝至自己的项目中,同时引入项目
    \EquipViewApp\EquipViewApp\secs
    |- Group.h
    |- SecsBase.cpp
    |- SecsBase.h
    |- SecsEquip.cpp
    |- SecsEquip.h
    |- SecsPortExport.h
    |- SecsPort.lib (x86/x64) 该lib放置在demo对应的版本中

2.2 运行环境
Demo对应版本的所有文件都需要拷贝到运行目录下

  1. JngServer文件夹

  2. SecsSystemConfig文件夹

  3. ClientConnect.dll

  4. ErrInfo.dll

  5. SecsPort.dll

  6. Common.dll

  7. 更新内容
    a. 选择demo对应的版本,除了JngServer/SecsConfig文件夹不更新,其他内容全部需要替换
    b.替换以下代码模块
    \EquipViewApp\EquipViewApp\secs
    |- Group.h
    |- Group.cpp
    |- SecsBase.cpp
    |- SecsBase.h
    |- SecsEquip.cpp
    |- SecsEquip.h
    |- SecsPortExport.h
    |- SecsPort.lib (x86/x64) 该lib放置在demo对应的版本中

  8. SECS初始化顺序
    a. 调用Start进行初始化SDK
    b. 设置IP、端口、LoadDataByCsvFile、加载各类配置等
    c. CommEnable进行使能通讯

软件交互流程
6 软件交互流程
6.1 初始化SDK模块

在这里插入图片描述

初始化流程
6.2 SDK与设备之间交互
在这里插入图片描述
代码资料

在这里插入图片描述

变量示例界面

#pragma once
#include "afxcmn.h"
#include "afxwin.h"


// CVariableView 对话框

class CVariableView : public CMyDialogEx
{
	DECLARE_DYNAMIC(CVariableView)

public:
	CVariableView(CWnd* pParent = NULL);   // 标准构造函数
	virtual ~CVariableView();

// 对话框数据
	enum { IDD = IDD_VARIABLE_VIEW };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	virtual BOOL OnInitDialog();
	DECLARE_MESSAGE_MAP()

	// 初始化界面
	virtual void OnInitView();

public:
	afx_msg void OnBtnSetValue();
	afx_msg void OnBtnRefresh();
	afx_msg void OnLvnItemchangedListVariable(NMHDR *pNMHDR, LRESULT *pResult);

public:
	
	// 更新列表
	void UpdateVariableList();
	void DeleteAllItem();
	void AddItemToCtrl(VARIABLE_DATA& var);
	void InitCtrl();
	void HandleResult(RcResult rc);
	void SelVID(int ID);
	void SortObject(vector<VARIABLE_DATA>& veVar);

private:
	CMyListCtrlEx m_ctrlVariable;

	int m_nSelID;
	int m_nCurSel;
	
	CMyEdit m_editID;
	CMyEdit m_editName;
	CMyEdit m_editValue;
	CMyStatic m_static[16];

	

};

// ChildView/VariableView.cpp : 实现文件
//

#include "stdafx.h"
#include "ChildView/VariableView.h"
#include "afxdialogex.h"
#include "CallbackHandle/CallbackHandle.h"

// CVariableView 对话框

IMPLEMENT_DYNAMIC(CVariableView, CMyDialogEx)

CVariableView::CVariableView(CWnd* pParent /*=NULL*/)
	: CMyDialogEx(CVariableView::IDD, pParent)
{
	SetTitle("变量");
	m_nSelID = 0;
	m_nCurSel = -1;
}

CVariableView::~CVariableView()
{
}

void CVariableView::DoDataExchange(CDataExchange* pDX)
{
	CMyDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST_VARIABLE, m_ctrlVariable);
	DDX_Control(pDX, IDC_EDIT_ID, m_editID);
	DDX_Control(pDX, IDC_EDIT_NAME, m_editName);
	DDX_Control(pDX, IDC_EDIT_VALUE, m_editValue);

	DDX_Control(pDX, IDC_STATIC_10, m_static[0]);
	DDX_Control(pDX, IDC_STATIC_11, m_static[1]);
	DDX_Control(pDX, IDC_STATIC_12, m_static[2]);

	
}


BEGIN_MESSAGE_MAP(CVariableView, CMyDialogEx)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_VARIABLE, OnLvnItemchangedListVariable)
	ON_BN_CLICKED(IDC_BTN_SET_VALUE, OnBtnSetValue)
	ON_BN_CLICKED(IDC_BTN_UPDATE, OnBtnRefresh)
END_MESSAGE_MAP()


// CVariableView 消息处理程序


BOOL CVariableView::OnInitDialog()
{
	CMyDialogEx::OnInitDialog();

	InitCtrl();

	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

void CVariableView::InitCtrl()
{
	m_ctrlVariable.InsertColumn(0, "variable ID", 0, 120);
	m_ctrlVariable.InsertColumn(1, "name", 0, 250);	
	m_ctrlVariable.InsertColumn(2, "value", 0, 330);
	m_ctrlVariable.InsertColumn(3, "value type", 0, 50);	
	


}


// 初始化界面
void CVariableView::OnInitView()
{
	RcResult rc;
	rc = m_pSecs->VariableAdd(1601, "ONE_TEST", "test one", "U4", "1", "um");						 SHOW_MSG_RC(rc);
	rc = m_pSecs->VariableAdd(1602, "ONE_TEST_L", "test one", "L", "L {A 3} {A 5} {U4 1}", "um");	 SHOW_MSG_RC(rc);
	
	UpdateVariableList();
	
}


void CVariableView::OnBtnSetValue()
{
	CString tmp;
	m_editValue.GetWindowText(tmp);
	RcResult rc = m_pSecs->VariableSet(m_nSelID, (LPCSTR)tmp);	
	SHOW_MSG_RC(rc);

	if(rc.rc == 0)
	{
		// set list value
		m_ctrlVariable.SetItemText(m_nCurSel, 2, tmp);
	}
}


void CVariableView::OnBtnRefresh()
{
	int nCount = m_ctrlVariable.GetItemCount();
	int nID;
	string pValue;

	for (int i = 0; i < nCount; i++)
	{
		CString pText = m_ctrlVariable.GetItemText(i, 0);
		nID = ::atoi(pText);

		RcResult rc = m_pSecs->VariableGet(nID, pValue);
		m_ctrlVariable.SetItemText(i, 2, pValue.c_str());

	}
}

// 选中ID
void CVariableView::SelVID(int ID)
{
	CString tmp;
	string pValue;
	RcResult rc = m_pSecs->VariableGet(ID, pValue);
	SHOW_MSG_RC(rc);

	if(rc.rc == 0)
	{
		// set list value
		m_ctrlVariable.SetItemText(m_nCurSel, 2, pValue.c_str());

		// ID
		tmp = m_ctrlVariable.GetItemText(m_nCurSel, 0);
		m_editID.SetWindowText(tmp);
		
		// name
		tmp = m_ctrlVariable.GetItemText(m_nCurSel, 1);
		m_editName.SetWindowText(tmp);

		// value
		m_editValue.SetWindowText(pValue.c_str());
	}
}


// 更新列表
void CVariableView::UpdateVariableList()
{
	vector<VARIABLE_DATA> vvs;
	RcResult rc = m_pSecs->VariableListGet(vvs);
	SHOW_MSG_RC(rc);

	if(rc.rc == 0)
	{
		SortObject(vvs);	// 排序

		DeleteAllItem();
		for(unsigned int i = 0; i < vvs.size(); i++)
		{
			AddItemToCtrl(vvs[i]);
		}
	}
}

// 排序
void CVariableView::SortObject(vector<VARIABLE_DATA>& veVar)
{	
	list<SORT_OBJECT> listSort;
	list<SORT_OBJECT>::iterator listIte;
	vector<VARIABLE_DATA> veTmp = veVar;

	// 排序
	for (unsigned int i = 0; i < veTmp.size(); i++)
	{
		SORT_OBJECT pObject;
		pObject.nNum = ::atoi(veTmp[i].VID.c_str());
		pObject.pObject = &veTmp[i];

		for (listIte = listSort.begin(); listIte != listSort.end(); listIte++)
		{
			if (listIte->nNum > pObject.nNum)
			{
				break;
			}
		}
		listSort.insert(listIte, pObject);
	}

	// 复制到原来的对象
	veVar.clear();
	for (listIte = listSort.begin(); listIte != listSort.end(); listIte++)
	{
		veVar.push_back(*(VARIABLE_DATA*)(listIte->pObject));
	}
}


void CVariableView::DeleteAllItem()
{
	m_ctrlVariable.DeleteAllItems();
}

void CVariableView::AddItemToCtrl(VARIABLE_DATA& var)
{	
	int nCount = m_ctrlVariable.GetItemCount();

	m_ctrlVariable.InsertItem(nCount, var.VID.c_str());
	m_ctrlVariable.SetItemText(nCount, 1, var.VarName.c_str());
	m_ctrlVariable.SetItemText(nCount, 2, var.Value.c_str());
	m_ctrlVariable.SetItemText(nCount, 3, var.Type.c_str());
	
}


void CVariableView::OnLvnItemchangedListVariable(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	
	*pResult = 0;
		

	if(pNMLV->uOldState != 0  //旧状态
		&& pNMLV->uNewState == 0)
	{

	}
	else  //新状态 和 选择同样
	{	
		m_nCurSel = pNMLV->iItem;
		CString pText = m_ctrlVariable.GetItemText(m_nCurSel, 0);
		m_nSelID = ::atol(pText);	
		SelVID(m_nSelID);
	}
}



void CVariableView::HandleResult(RcResult rc)
{
	if(rc.rc != 0)
	{
		MessageBox(rc.ToString().c_str());
	}
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/361faf18c3a84bc4b21743e2d2eaeb1f.bmp?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Y2K5a-85L2T6ICB5rK55p2h,size_13,color_FFFFFF,t_70,g_se,x_16)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值